利用者:Frozen-mikan/SummaryLink.js
表示
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ 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
}
});