
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki1.koushin.ch/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js</id>
	<title>MediaWiki:Common.js - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki1.koushin.ch/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js"/>
	<link rel="alternate" type="text/html" href="https://wiki1.koushin.ch/w/index.php?title=MediaWiki:Common.js&amp;action=history"/>
	<updated>2026-09-27T21:00:43Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki1.koushin.ch/w/index.php?title=MediaWiki:Common.js&amp;diff=5&amp;oldid=prev</id>
		<title>エーデルメーア: ページの作成:「/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */ /**  * MediaWiki 自動リンク（atwiki風）  * SPDX-License-Identifier: 0BSD  *  * 記事本文中に既存ページ名が出現したら、自動で内部リンクに変換する。  * - 適用: CONFIG.runNamespaces の名前空間の閲覧時、およびプレビュー時  * - リンク対象: CONFIG.targetNamespaces で…」</title>
		<link rel="alternate" type="text/html" href="https://wiki1.koushin.ch/w/index.php?title=MediaWiki:Common.js&amp;diff=5&amp;oldid=prev"/>
		<updated>2026-09-27T18:59:20Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「&lt;span class=&quot;autocomment&quot;&gt;ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます: &lt;/span&gt; /**  * MediaWiki 自動リンク（atwiki風）  * SPDX-License-Identifier: 0BSD  *  * 記事本文中に既存ページ名が出現したら、自動で内部リンクに変換する。  * - 適用: CONFIG.runNamespaces の名前空間の閲覧時、およびプレビュー時  * - リンク対象: CONFIG.targetNamespaces で…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */&lt;br /&gt;
/**&lt;br /&gt;
 * MediaWiki 自動リンク（atwiki風）&lt;br /&gt;
 * SPDX-License-Identifier: 0BSD&lt;br /&gt;
 *&lt;br /&gt;
 * 記事本文中に既存ページ名が出現したら、自動で内部リンクに変換する。&lt;br /&gt;
 * - 適用: CONFIG.runNamespaces の名前空間の閲覧時、およびプレビュー時&lt;br /&gt;
 * - リンク対象: CONFIG.targetNamespaces で指定した名前空間のページ&lt;br /&gt;
 *   - 標準名前空間: タイトル全体を表示語にする&lt;br /&gt;
 *   - その他: 名前空間接頭辞を除き、サブページ有効なら最後の「/」以降を表示語にする&lt;br /&gt;
 * - キャッシュ: localStorage（mw.storage）。キーはウィキごと（wgWikiID）に分かれる。&lt;br /&gt;
 *   表示はキャッシュで即時に行い、更新確認は裏で間引いて実行し、&lt;br /&gt;
 *   変化があれば次回表示用に再取得する&lt;br /&gt;
 * - 除外: リンク・コード・見出し・編集リンク・脚注・目次・.noautolink 内、表示中のページ自身&lt;br /&gt;
 * - 英数字のみの語は3文字以上、それ以外は2文字以上。同一語はページ内で最大3回まで&lt;br /&gt;
 *&lt;br /&gt;
 * 設定の上書き:&lt;br /&gt;
 *   このスクリプトより前に window.AutoLinkConfig を定義すると、CONFIG の同名項目を上書きできる。&lt;br /&gt;
 *   例: window.AutoLinkConfig = { targetNamespaces: [0, 4, &amp;#039;ヘルプ&amp;#039;], maxPerWord: 1 };&lt;br /&gt;
 * 部分的に止める:&lt;br /&gt;
 *   自動リンクさせたくない箇所は &amp;lt;div class=&amp;quot;noautolink&amp;quot;&amp;gt;…&amp;lt;/div&amp;gt; などで囲む。&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	var CONFIG = $.extend({&lt;br /&gt;
		// 自動リンクを実行する名前空間（番号）&lt;br /&gt;
		runNamespaces: [0],&lt;br /&gt;
		// リンク対象の名前空間（番号または名前）。並び順が同じ表示語の優先順位になる&lt;br /&gt;
		// 例: [0, 4, &amp;#039;ヘルプ&amp;#039;]（存在しない名前は無視される）&lt;br /&gt;
		targetNamespaces: [0],&lt;br /&gt;
		// 構造を変えたときに上げると、古いキャッシュを使わなくなる&lt;br /&gt;
		cacheVersion: 1,&lt;br /&gt;
		// 以前の版で使っていたキャッシュキー（見つけたら削除する）&lt;br /&gt;
		oldCacheKeys: [],&lt;br /&gt;
		cacheMaxAge: 7 * 24 * 60 * 60, // 秒: 取得からこれを超えたキャッシュは使わない&lt;br /&gt;
		checkInterval: 10 * 60,        // 秒: 更新確認の最短間隔&lt;br /&gt;
		// 取得するページ名の上限。大規模なウィキでAPIとlocalStorageの負担を抑える&lt;br /&gt;
		maxTitles: 20000,&lt;br /&gt;
		maxPerWord: 3,&lt;br /&gt;
		minLengthAscii: 3,&lt;br /&gt;
		minLengthOther: 2,&lt;br /&gt;
		// true にすると、カタカナ語の途中への部分一致（例: 「データベース」内の「データ」）を避ける&lt;br /&gt;
		strictKatakana: false,&lt;br /&gt;
		excludeSelector: [&lt;br /&gt;
			&amp;#039;a&amp;#039;, &amp;#039;pre&amp;#039;, &amp;#039;code&amp;#039;, &amp;#039;kbd&amp;#039;, &amp;#039;samp&amp;#039;, &amp;#039;tt&amp;#039;, &amp;#039;var&amp;#039;, &amp;#039;textarea&amp;#039;, &amp;#039;script&amp;#039;, &amp;#039;style&amp;#039;,&lt;br /&gt;
			&amp;#039;h1&amp;#039;, &amp;#039;h2&amp;#039;, &amp;#039;h3&amp;#039;, &amp;#039;h4&amp;#039;, &amp;#039;h5&amp;#039;, &amp;#039;h6&amp;#039;, &amp;#039;.mw-heading&amp;#039;, &amp;#039;.mw-editsection&amp;#039;,&lt;br /&gt;
			&amp;#039;.reference&amp;#039;, &amp;#039;.references&amp;#039;, &amp;#039;.mw-references-wrap&amp;#039;,&lt;br /&gt;
			&amp;#039;#toc&amp;#039;, &amp;#039;.toc&amp;#039;, &amp;#039;.navbox&amp;#039;, &amp;#039;.mwe-math-element&amp;#039;, &amp;#039;.catlinks&amp;#039;, &amp;#039;.noautolink&amp;#039;&lt;br /&gt;
		],&lt;br /&gt;
		// ウィキ固有の除外対象を足すとき用（excludeSelector を丸ごと書き換えずに済む）&lt;br /&gt;
		extraExcludeSelector: []&lt;br /&gt;
	}, window.AutoLinkConfig || {});&lt;br /&gt;
&lt;br /&gt;
	var action = mw.config.get(&amp;#039;wgAction&amp;#039;);&lt;br /&gt;
	var isView = action === &amp;#039;view&amp;#039;;&lt;br /&gt;
	var isPreview = action === &amp;#039;edit&amp;#039; || action === &amp;#039;submit&amp;#039;;&lt;br /&gt;
	if (CONFIG.runNamespaces.indexOf(mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;)) === -1 ||&lt;br /&gt;
		(!isView &amp;amp;&amp;amp; !isPreview)) {&lt;br /&gt;
		return; // 対象外のページではAPIも叩かない&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var CACHE_KEY = &amp;#039;autolink:&amp;#039; + (mw.config.get(&amp;#039;wgWikiID&amp;#039;) || &amp;#039;wiki&amp;#039;) + &amp;#039;:v&amp;#039; + CONFIG.cacheVersion;&lt;br /&gt;
	var EXCLUDE = CONFIG.excludeSelector.concat(CONFIG.extraExcludeSelector).join(&amp;#039;,&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	var JA_CHARS = /[\u3040-\u30ff\u4e00-\u9fff]/;&lt;br /&gt;
	var ASCII_ONLY = /^[A-Za-z0-9 _\-()]+$/;&lt;br /&gt;
	var ALNUM = /[A-Za-z0-9_]/;&lt;br /&gt;
	var KATAKANA = /[\u30a1-\u30fa\u30fc]/;&lt;br /&gt;
&lt;br /&gt;
	/* ---------- 名前空間・表示語 ---------- */&lt;br /&gt;
&lt;br /&gt;
	function resolveNamespaces() {&lt;br /&gt;
		var ids = mw.config.get(&amp;#039;wgNamespaceIds&amp;#039;) || {};&lt;br /&gt;
		var out = [];&lt;br /&gt;
		CONFIG.targetNamespaces.forEach(function (ns) {&lt;br /&gt;
			var id = typeof ns === &amp;#039;number&amp;#039; ?&lt;br /&gt;
				ns :&lt;br /&gt;
				ids[String(ns).toLowerCase().replace(/ /g, &amp;#039;_&amp;#039;)];&lt;br /&gt;
			if (typeof id === &amp;#039;number&amp;#039; &amp;amp;&amp;amp; id &amp;gt;= 0 &amp;amp;&amp;amp; out.indexOf(id) === -1) {&lt;br /&gt;
				out.push(id);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		return out;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function displayWord(title, ns, hasSubpages) {&lt;br /&gt;
		if (ns === 0) return title;&lt;br /&gt;
		var colon = title.indexOf(&amp;#039;:&amp;#039;);&lt;br /&gt;
		var name = colon !== -1 ? title.substring(colon + 1) : title;&lt;br /&gt;
		if (hasSubpages) {&lt;br /&gt;
			var slash = name.lastIndexOf(&amp;#039;/&amp;#039;);&lt;br /&gt;
			if (slash !== -1) name = name.substring(slash + 1);&lt;br /&gt;
		}&lt;br /&gt;
		return name;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function isLinkable(w) {&lt;br /&gt;
		if (!w || w === &amp;#039;__proto__&amp;#039;) return false; // オブジェクトのキーとして扱えない語は除く&lt;br /&gt;
		if (!JA_CHARS.test(w) &amp;amp;&amp;amp; ASCII_ONLY.test(w)) {&lt;br /&gt;
			return w.length &amp;gt;= CONFIG.minLengthAscii;&lt;br /&gt;
		}&lt;br /&gt;
		return w.length &amp;gt;= CONFIG.minLengthOther;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* ---------- API取得 ---------- */&lt;br /&gt;
&lt;br /&gt;
	// budget.left は全名前空間で共有する残り取得数&lt;br /&gt;
	function fetchNamespace(api, ns, budget) {&lt;br /&gt;
		var titles = [];&lt;br /&gt;
		function step(cont) {&lt;br /&gt;
			if (budget.left &amp;lt;= 0) {&lt;br /&gt;
				return $.Deferred().resolve(titles).promise();&lt;br /&gt;
			}&lt;br /&gt;
			var params = $.extend({&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				list: &amp;#039;allpages&amp;#039;,&lt;br /&gt;
				apnamespace: ns,&lt;br /&gt;
				aplimit: &amp;#039;max&amp;#039;,&lt;br /&gt;
				formatversion: 2&lt;br /&gt;
			}, cont);&lt;br /&gt;
			return api.get(params).then(function (data) {&lt;br /&gt;
				var pages = (data.query &amp;amp;&amp;amp; data.query.allpages) || [];&lt;br /&gt;
				for (var k = 0; k &amp;lt; pages.length &amp;amp;&amp;amp; budget.left &amp;gt; 0; k++) {&lt;br /&gt;
					titles.push(pages[k].title);&lt;br /&gt;
					budget.left--;&lt;br /&gt;
				}&lt;br /&gt;
				if (data[&amp;#039;continue&amp;#039;] &amp;amp;&amp;amp; budget.left &amp;gt; 0) {&lt;br /&gt;
					return step(data[&amp;#039;continue&amp;#039;]);&lt;br /&gt;
				}&lt;br /&gt;
				return titles;&lt;br /&gt;
			}, function () {&lt;br /&gt;
				// 途中で失敗しても取得済み分で続行する&lt;br /&gt;
				return $.Deferred().resolve(titles).promise();&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
		return step({});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildMap(api, nsList) {&lt;br /&gt;
		return api.get({&lt;br /&gt;
			action: &amp;#039;query&amp;#039;,&lt;br /&gt;
			meta: &amp;#039;siteinfo&amp;#039;,&lt;br /&gt;
			siprop: &amp;#039;namespaces&amp;#039;,&lt;br /&gt;
			formatversion: 2&lt;br /&gt;
		}).then(function (info) {&lt;br /&gt;
			var nsInfo = (info.query &amp;amp;&amp;amp; info.query.namespaces) || {};&lt;br /&gt;
			var budget = { left: CONFIG.maxTitles };&lt;br /&gt;
			var results = [];&lt;br /&gt;
			// 優先順位どおりに上限を割り当てるため、名前空間は順番に取得する&lt;br /&gt;
			var chain = $.Deferred().resolve().promise();&lt;br /&gt;
			nsList.forEach(function (ns, i) {&lt;br /&gt;
				chain = chain.then(function () {&lt;br /&gt;
					return fetchNamespace(api, ns, budget).then(function (titles) {&lt;br /&gt;
						results[i] = titles;&lt;br /&gt;
					});&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
			return chain.then(function () {&lt;br /&gt;
				var map = {};&lt;br /&gt;
				nsList.forEach(function (ns, i) {&lt;br /&gt;
					var hasSubpages = !!(nsInfo[ns] &amp;amp;&amp;amp; nsInfo[ns].subpages);&lt;br /&gt;
					(results[i] || []).forEach(function (title) {&lt;br /&gt;
						var w = displayWord(title, ns, hasSubpages);&lt;br /&gt;
						if (!isLinkable(w) || Object.prototype.hasOwnProperty.call(map, w)) {&lt;br /&gt;
							return;&lt;br /&gt;
						}&lt;br /&gt;
						map[w] = title;&lt;br /&gt;
					});&lt;br /&gt;
				});&lt;br /&gt;
				return map;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 対象名前空間での最新の作成・ログ（削除/移動など）のID&lt;br /&gt;
	function latestChangeId(api, nsList) {&lt;br /&gt;
		return api.get({&lt;br /&gt;
			action: &amp;#039;query&amp;#039;,&lt;br /&gt;
			list: &amp;#039;recentchanges&amp;#039;,&lt;br /&gt;
			rctype: [&amp;#039;new&amp;#039;, &amp;#039;log&amp;#039;],&lt;br /&gt;
			rcnamespace: nsList,&lt;br /&gt;
			rcprop: &amp;#039;ids&amp;#039;,&lt;br /&gt;
			rclimit: 1,&lt;br /&gt;
			formatversion: 2&lt;br /&gt;
		}).then(function (data) {&lt;br /&gt;
			var rc = data.query &amp;amp;&amp;amp; data.query.recentchanges;&lt;br /&gt;
			return rc &amp;amp;&amp;amp; rc.length ? rc[0].rcid : 0;&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* ---------- キャッシュ ---------- */&lt;br /&gt;
&lt;br /&gt;
	function saveCache(obj) {&lt;br /&gt;
		return mw.storage.setObject(CACHE_KEY, obj, CONFIG.cacheMaxAge);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// キャッシュの前提になる設定。変わったら取り直す&lt;br /&gt;
	function cacheSignature(nsList) {&lt;br /&gt;
		return [&lt;br /&gt;
			nsList.join(&amp;#039;,&amp;#039;),&lt;br /&gt;
			CONFIG.minLengthAscii,&lt;br /&gt;
			CONFIG.minLengthOther,&lt;br /&gt;
			CONFIG.maxTitles&lt;br /&gt;
		].join(&amp;#039;|&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function refresh(api, nsList, sig, rcid) {&lt;br /&gt;
		return buildMap(api, nsList).then(function (map) {&lt;br /&gt;
			var now = Date.now();&lt;br /&gt;
			if (!saveCache({ sig: sig, map: map, rcid: rcid, fetched: now, checked: now })) {&lt;br /&gt;
				// 保存できない（容量超過など）場合、毎回の全件取得を避けるため&lt;br /&gt;
				// cacheMaxAge の間は自動リンクを止める。今回の表示だけは取得済みの一覧を使う&lt;br /&gt;
				saveCache({ sig: sig, failed: true, fetched: now, checked: now });&lt;br /&gt;
				mw.log.warn(&amp;#039;[AutoLink] ページ名一覧をlocalStorageに保存できませんでした。&amp;#039; +&lt;br /&gt;
					&amp;#039;maxTitles を小さくするか、targetNamespaces を絞ってください。&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
			return map;&lt;br /&gt;
		}, function () {&lt;br /&gt;
			return {}; // 失敗時はキャッシュを作らず、今回はリンク化しない&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getMap(api, nsList) {&lt;br /&gt;
		var sig = cacheSignature(nsList);&lt;br /&gt;
		var now = Date.now();&lt;br /&gt;
		var cached = mw.storage.getObject(CACHE_KEY);&lt;br /&gt;
&lt;br /&gt;
		if (cached &amp;amp;&amp;amp; cached.sig === sig &amp;amp;&amp;amp; now - cached.fetched &amp;lt; CONFIG.cacheMaxAge * 1000) {&lt;br /&gt;
			if (cached.failed) {&lt;br /&gt;
				return $.Deferred().resolve({}).promise();&lt;br /&gt;
			}&lt;br /&gt;
			if (cached.map) {&lt;br /&gt;
				if (now - cached.checked &amp;gt; CONFIG.checkInterval * 1000) {&lt;br /&gt;
					cached.checked = now;&lt;br /&gt;
					saveCache(cached);&lt;br /&gt;
					latestChangeId(api, nsList).then(function (id) {&lt;br /&gt;
						if (id !== cached.rcid) {&lt;br /&gt;
							refresh(api, nsList, sig, id);&lt;br /&gt;
						}&lt;br /&gt;
					});&lt;br /&gt;
				}&lt;br /&gt;
				return $.Deferred().resolve(cached.map).promise();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return latestChangeId(api, nsList).then(null, function () {&lt;br /&gt;
			return null; // 不明扱い。次回の確認で再取得される&lt;br /&gt;
		}).then(function (id) {&lt;br /&gt;
			return refresh(api, nsList, sig, id);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* ---------- 照合 ---------- */&lt;br /&gt;
&lt;br /&gt;
	// 先頭文字ごとに語をまとめ、長い順に並べる（巨大な正規表現を避ける）&lt;br /&gt;
	function buildIndex(map, currentTitle) {&lt;br /&gt;
		var index = {};&lt;br /&gt;
		Object.keys(map).forEach(function (w) {&lt;br /&gt;
			if (map[w] === currentTitle) return; // 自己リンク防止&lt;br /&gt;
			var c = w.charAt(0);&lt;br /&gt;
			(index[c] = index[c] || []).push(w);&lt;br /&gt;
		});&lt;br /&gt;
		Object.keys(index).forEach(function (c) {&lt;br /&gt;
			index[c].sort(function (a, b) { return b.length - a.length; });&lt;br /&gt;
		});&lt;br /&gt;
		return index;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function boundaryOk(text, i, w) {&lt;br /&gt;
		var before = text.charAt(i - 1);&lt;br /&gt;
		var after = text.charAt(i + w.length);&lt;br /&gt;
		var first = w.charAt(0);&lt;br /&gt;
		var lastChar = w.charAt(w.length - 1);&lt;br /&gt;
		if (ALNUM.test(first) &amp;amp;&amp;amp; ALNUM.test(before)) return false;&lt;br /&gt;
		if (ALNUM.test(lastChar) &amp;amp;&amp;amp; ALNUM.test(after)) return false;&lt;br /&gt;
		if (CONFIG.strictKatakana) {&lt;br /&gt;
			if (KATAKANA.test(first) &amp;amp;&amp;amp; KATAKANA.test(before)) return false;&lt;br /&gt;
			if (KATAKANA.test(lastChar) &amp;amp;&amp;amp; KATAKANA.test(after)) return false;&lt;br /&gt;
		}&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function findMatches(text, index, counts) {&lt;br /&gt;
		var out = [];&lt;br /&gt;
		var i = 0;&lt;br /&gt;
		var len = text.length;&lt;br /&gt;
		while (i &amp;lt; len) {&lt;br /&gt;
			var list = index[text.charAt(i)];&lt;br /&gt;
			var hit = null;&lt;br /&gt;
			if (list) {&lt;br /&gt;
				for (var j = 0; j &amp;lt; list.length; j++) {&lt;br /&gt;
					var w = list[j];&lt;br /&gt;
					if (text.slice(i, i + w.length) === w &amp;amp;&amp;amp; boundaryOk(text, i, w)) {&lt;br /&gt;
						hit = w;&lt;br /&gt;
						break;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (hit) {&lt;br /&gt;
				// 上限に達した語は、短い語で部分リンクせずに読み飛ばす&lt;br /&gt;
				if ((counts[hit] || 0) &amp;lt; CONFIG.maxPerWord) {&lt;br /&gt;
					out.push({ index: i, word: hit });&lt;br /&gt;
					counts[hit] = (counts[hit] || 0) + 1;&lt;br /&gt;
				}&lt;br /&gt;
				i += hit.length;&lt;br /&gt;
			} else {&lt;br /&gt;
				i++;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return out;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function linkify(root, ctx) {&lt;br /&gt;
		if (root.closest(&amp;#039;[data-autolink-done]&amp;#039;)) return;&lt;br /&gt;
		root.setAttribute(&amp;#039;data-autolink-done&amp;#039;, &amp;#039;1&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {&lt;br /&gt;
			acceptNode: function (node) {&lt;br /&gt;
				var p = node.parentElement;&lt;br /&gt;
				if (!p || !/\S/.test(node.nodeValue) || p.closest(EXCLUDE)) {&lt;br /&gt;
					return NodeFilter.FILTER_REJECT;&lt;br /&gt;
				}&lt;br /&gt;
				return NodeFilter.FILTER_ACCEPT;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		var nodes = [];&lt;br /&gt;
		while (walker.nextNode()) nodes.push(walker.currentNode);&lt;br /&gt;
&lt;br /&gt;
		var counts = {};&lt;br /&gt;
		nodes.forEach(function (node) {&lt;br /&gt;
			var text = node.nodeValue;&lt;br /&gt;
			var matches = findMatches(text, ctx.index, counts);&lt;br /&gt;
			if (!matches.length) return;&lt;br /&gt;
&lt;br /&gt;
			var frag = document.createDocumentFragment();&lt;br /&gt;
			var last = 0;&lt;br /&gt;
			matches.forEach(function (m) {&lt;br /&gt;
				if (m.index &amp;gt; last) {&lt;br /&gt;
					frag.appendChild(document.createTextNode(text.slice(last, m.index)));&lt;br /&gt;
				}&lt;br /&gt;
				var title = ctx.map[m.word];&lt;br /&gt;
				var a = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
				a.href = mw.util.getUrl(title);&lt;br /&gt;
				a.title = title;&lt;br /&gt;
				a.className = &amp;#039;autolink&amp;#039;;&lt;br /&gt;
				a.textContent = m.word;&lt;br /&gt;
				frag.appendChild(a);&lt;br /&gt;
				last = m.index + m.word.length;&lt;br /&gt;
			});&lt;br /&gt;
			if (last &amp;lt; text.length) {&lt;br /&gt;
				frag.appendChild(document.createTextNode(text.slice(last)));&lt;br /&gt;
			}&lt;br /&gt;
			node.parentNode.replaceChild(frag, node);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* ---------- 起動 ---------- */&lt;br /&gt;
&lt;br /&gt;
	var readyPromise = null;&lt;br /&gt;
	function getReady() {&lt;br /&gt;
		if (!readyPromise) {&lt;br /&gt;
			readyPromise = mw.loader.using([&amp;#039;mediawiki.util&amp;#039;, &amp;#039;mediawiki.api&amp;#039;, &amp;#039;mediawiki.storage&amp;#039;])&lt;br /&gt;
				.then(function () {&lt;br /&gt;
					CONFIG.oldCacheKeys.forEach(function (k) { mw.storage.remove(k); });&lt;br /&gt;
					var nsList = resolveNamespaces();&lt;br /&gt;
					if (!nsList.length) return null;&lt;br /&gt;
					return getMap(new mw.Api(), nsList).then(function (map) {&lt;br /&gt;
						var current = (mw.config.get(&amp;#039;wgPageName&amp;#039;) || &amp;#039;&amp;#039;).replace(/_/g, &amp;#039; &amp;#039;);&lt;br /&gt;
						return { map: map, index: buildIndex(map, current) };&lt;br /&gt;
					});&lt;br /&gt;
				});&lt;br /&gt;
		}&lt;br /&gt;
		return readyPromise;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 閲覧時はDOM readyを待たずに取得を開始する&lt;br /&gt;
	if (isView) getReady();&lt;br /&gt;
&lt;br /&gt;
	mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function ($content) {&lt;br /&gt;
		var $roots = $content.find(&amp;#039;.mw-parser-output&amp;#039;).addBack(&amp;#039;.mw-parser-output&amp;#039;);&lt;br /&gt;
		if (isPreview) {&lt;br /&gt;
			$roots = $roots.filter(function () {&lt;br /&gt;
				return $(this).closest(&amp;#039;#wikiPreview&amp;#039;).length &amp;gt; 0;&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
		if (!$roots.length) return;&lt;br /&gt;
		getReady().then(function (ctx) {&lt;br /&gt;
			if (!ctx) return;&lt;br /&gt;
			$roots.each(function () { linkify(this, ctx); });&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>エーデルメーア</name></author>
	</entry>
</feed>