コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

利用者:Frozen-mikan/SummaryLink.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

/* 要約欄にリンクがあった場合、リンクを無効化し、拡張する。
 * その時点での版と最新版へのリンクを表示する。
 */
jQuery(function($) {
	/* IE6を除外。 */
	var prof = $.client.profile();
	if (prof.name == 'msie' && prof.versionBase == '6') return;
	
	var dialogs = {}; // dialog のキャッシュ { pagename:oldid : dialog }
	var ns_special = mw.config.get('wgFormattedNamespaces')["-1"];
	$('.comment') // 要約欄から
	.find('a[href^="/wiki/"]') // 内部リンクのみを抽出
	// 特別ページへのリンクを除外(簡易版)
	.not('a[href^="/wiki/' + mw.util.wikiUrlencode(ns_special + ':') + '"]')
	.each(function(index, elem) {
		// リンク要素から pathname を取り出す
		var pathname = elem.pathname;
		var hash = elem.hash;
		// /wiki/ 以下を取り出す
		// IE では pathname に最初の / が含まれない
		var matches = /^(?:\/)?wiki\/(.*)$/.exec(pathname);
		if (matches === null ||
			matches.length < 2 ||
			matches[1].length == 0
		) return; // マッチしない場合は終了
		var pagename = decodeURI(matches[1]);
		// 要約欄が属する版を特定する
		var parents = 'td.diff-otitle, td.diff-ntitle, ' +
			'ul li';
		var link = $(elem).parents(parents)
			.find('a[href*="oldid="]')
			.get(0);
		if (typeof link === 'undefined') return; // 削除記録など
		var oldid = mw.util.getParamValue('oldid', link.href);
		// var diff = mw.util.getParamValue('diff', link.href);
		// if (/^\d+$/.test(diff) && oldid < diff) {
		//	 oldid = diff;
		// }
		/* リンクの拡張 */
		mw.loader.using(['jquery.ui'], function(){
			$(elem).click(function(e){
				e.preventDefault(); // リンクのクリックを無効化
				
				// キャッシュの検索
				$dialog = dialogs[pagename + ':' + oldid];
				if ($dialog && $dialog.dialog) {
					$dialog.dialog();
					return;
				}
				var url = '/w/api.php';
				var param = {
					'format': 'json',
					'action': 'query',
					'prop': 'revisions',
					'rvdir': 'older',
					'rvlimit': 1,
					'rvprop': 'ids|timestamp',
					'redirects': '',
					'rvstartid': oldid,
					'titles': pagename
				};
				$.getJSON(url, param, function(data) {
					var pages = (data && data.query && data.query.pages) || [];
					for (pid in pages) {
						var page = pages[pid];
						var revisions = page.revisions;
						var header = '';
						var arr = [];
						arr.push('「' + page.title + '」へのリンク');
						var li = [];
						arr.push(li);
						var lastHref = mw.util.getUrl(page.title) + hash;
						var lastRevLink = element('a', {href: lastHref}, '最新版');
						if (typeof revisions === 'undefined') {
							li.push(lastRevLink);
							var text1 = 'その時点の版が見つかりません。' +
								'その時点で存在していないか、' +
								'移動または削除後に再作成された可能性があります。';
							li.push(text1);
						} else {
							var rev = revisions[0];
							var revid = rev.revid;
							var href = '/w/index.php?oldid=' + revid;
							li.push(lastRevLink + '(' +
								element('a', {href: href + '&diff=cur'},
								'差分') + ')');
							li.push(element('a', {href: href + hash},
								rev.timestamp + ' の版'));
							var str = '';
							str += '(' + element('a', {href: href + '&diff=prev'},
								'差分') + ')';
							str += element('a', {href: href +
								'&direction=prev' + hash}, '←前の版') + '|';
							str += element('a', {href: href +
								'&direction=next' + hash}, '次の版→');
							str += '(' + element('a', {href: href + '&diff=next'},
								'差分') + ')';
							li.push(str);
						}
						
						// リダイレクト
						if (data && data.query && data.query.redirects) {
							var redirects = data.query.redirects;
							for (var i = 0; i < redirects.length; ++i) {
								var from = redirects[i].from;
								var to = redirects[i].to;
								if (to == page.title) {
									arr.push('リダイレクト元');
									arr.push([element('a', {href:
										mw.util.wikiScript() + '?title=' +
										mw.util.wikiUrlencode(from) +
										'&redirect=no'
									}, from)]);
								}
							}
						}
					}
					
					var $dialog = $('<div />')
						.attr('title', header)
						.html(simpleUI(arr));
					dialogs[pagename + ':' + oldid] = $dialog;
					$dialog.dialog();
				});
			});
		});
	});
	/* 配列からHTML文字列を生成する。1階層目の配列のみリストとして解釈する。他は段落。 */
	function simpleUI(array) {
		var html = '<div>';
		for (var i = 0; i < array.length; ++i) {
			var item = array[i];
			if ($.isArray(item)) {
				html += '<ul><li>' + item.join('</li><li>') + '</li></ul>';
			} else {
				html += '<p>' + item + '</p>';
			}
		}
		html += '</div>';
		return html;
	}
	/* 要素を生成する。出力は文字列。
	 * name: 文字列。要素名。文字列ではない場合は長さ0の文字列が返る。
	 * attr: オブジェクト。要素の属性。オブジェクトではない場合、属性部は出力無し。
	 * content: 文字列。要素の内容。文字列ではない場合、内容部は出力無し。
	 */
	function element(name, attr, content) {
		var str = '';
		if (typeof name !== 'string') return str;
		str += '<' + name;
		if (typeof attr === 'object') {
			for (var key in attr) {
				str += ' ' + key + '="' + attr[key] + '"';
			}
		}
		str += '>';
		if (typeof content === 'string') {
			str += content;
		}
		str += '</' + name + '>';
		return str
	}
});