コンテンツにスキップ

利用者:Frozen-mikan/他言語版カテゴリで日本語版へのリンクを追加する.js

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

多くの WindowsLinux のブラウザ

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

Mac における Safari

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

Mac における ChromeFirefox

  • 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();
}());