利用者:Frozen-mikan/他言語版カテゴリで日本語版へのリンクを追加する.js
表示
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ Cmd と ⇧ Shift を押しながら R を押す。
詳細についてはWikipedia:キャッシュを消すをご覧ください。
/**
* 他言語版のカテゴリページで実行し、
* そのカテゴリ画面にあるページの日本語版が存在する場合にリンクを追加する。
* ウィキデータのQ値があれば、ウィキデータにリンクする。
*
* APIの仕様により、ページが優先され、下位カテゴリが無視されることがある。
*
* おまけ仕様
* 日本語版のカテゴリページで実行した場合には英語版へのリンクを追加する。
*/
/* global mw, $ */
/* jshint strict:false, devel:true */
(function() {
var wgDBname = mw.config.get('wgDBname');
var lang = wgDBname === 'jawiki' ? 'en' : 'ja';
// デバッグ用のコンソール出力制御
function print(text, type) {
return $.Deferred(function (dfd) {
type = type || 'log';
if (window.console && console[type]) {
console[type](text);
}
dfd.resolve(text, type);
});
}
function Category(title) {
this.title = title;
}
/* このカテゴリのメンバーを取得。
* スクリプトを実行しているカテゴリページと同じ情報になるように調整。
*/
Category.prototype.fetchMembersG = function() {
var dfd = $.Deferred();
var wgServer = mw.config.get('wgServer');
var title = 'Category:' + this.title;
var from = mw.util.getParamValue('from');
var pagefrom = mw.util.getParamValue('pagefrom');
var options = {
url: wgServer + '/w/api.php',
data: {
format: 'json',
action: 'query',
prop: 'info|revisions|pageprops|langlinks',
inprop: 'protection',
lllang : lang,
lllimit: '500',
generator: 'categorymembers',
gcmlimit: '500',
gcmdir: 'asc',
gcmtitle: title
}
};
if (from !== null) {
options.data.gcmstartsortkey = from;
}
if (pagefrom !== null) {
options.data.gcmstartsortkeyprefix = pagefrom;
}
$.ajax(options).then(function(data) {
console.debug(data);
if(data && data.query) {
var pages = data.query.pages;
for (var pageid in pages) {
// console.debug(pageid, pages[pageid].title);
dfd.notify(pages[pageid]);
}
}
dfd.resolve(data);
});
return dfd.promise();
};
/**
* title へのリンクに text を追加する。
*/
function addText(title, text) {
// title = title.replace(/ /g, '_');
var $a = $('li a[href="/wiki/' + mw.util.wikiUrlencode(title) + '"]');
if ($a.length === 0) {
console.warn(title, text);
return;
}
$a.after(text);
}
function encodeTitle(title) {
title = title.replace(/ /g, '_');
var et = encodeURIComponent(title)
.replace(/%23/g, '#')
.replace(/%2F/g, '/')
.replace(/%3A/g, ':')
;
return et;
}
function genCategoryLink(title) {
var text = ' <b><a href="//' + lang + '.wikipedia.org/wiki/' + encodeTitle(title) + '">[' + lang + ']</a></b>';
return text;
}
function genWikidataLink(title) {
var text = ' <a href="//www.wikidata.org/wiki/' + encodeTitle(title) + '">[d]</a>';
return text;
}
function main() {
var wgTitle = mw.config.get('wgTitle'); // Category: を含まない
var cat = new Category(wgTitle);
cat.fetchMembersG().then(function(data) {
print(data);
print('done?');
}, function() {
}, function(cm) {
var langlinks = cm.langlinks;
if (langlinks !== undefined) {
// print(cm);
for (var i = 0; i < langlinks.length; ++i) {
if (langlinks[i].lang === lang) {
var ja_pagename = langlinks[i]['*'];
addText(cm.title, genCategoryLink(ja_pagename));
console.log(ja_pagename, '<==', cm.title);
}
}
}
if (cm.pageprops && cm.pageprops.wikibase_item) {
var wb_item = cm.pageprops.wikibase_item;
addText(cm.title, genWikidataLink(wb_item));
console.log(wb_item, '<==', cm.title);
}
});
}
main();
}());