コンテンツにスキップ

利用者:Waiesu/CheckErrorCategories.js

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

多くの WindowsLinux のブラウザ

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

Mac における Safari

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

Mac における ChromeFirefox

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

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

(function($, mw) {
	'use strict';
	/* 対象カテゴリ */
	var ERROR_CATS = [
		'テンプレート呼び出しで引数が重複しているページ',
		'参照エラーのあるページ',
		'テンプレート呼び出しエラーのあるページ/調査中/Cite web (冗長日付)',
		'貼り付け日が正しくないテンプレートのある記事',
		'出典テンプレートの無効なパラメータを使用しているページ',
	];
	
	var action = mw.config.get('wgAction');
	var pagename = mw.config.get('wgPageName');
	
	if (action === 'edit' || action === 'editredlink') {
		// 編集開始時、現在のカテゴリを取得してから、エラーチェック
		mw.loader.using(['mediawiki.api', 'mediawiki.storage', 'oojs-ui-core']).then(getCategories).then(prepareCheck);
	} else if (action === 'submit') {
		// プレビュー時は、エラーチェックのみ
		mw.loader.using(['mediawiki.api', 'oojs-ui-core']).then(prepareCheck);
	} else {
		return;
	}
	
	/*
	最新版のカテゴリ取得 - すでに対象カテゴリに含まれるか
	*/
	function getCategories() {
		var defer = new $.Deferred();
		new mw.Api({
			ajax: {
				header: { 'Api-User-Agent': 'Example/1.0' }
			}
		}).post({
			format: 'json',
			formatversion: 2,
			action: 'query',
			prop: 'categories',
			titles: [pagename],
			clcategories: ERROR_CATS.map(function (c) { return 'Category:' + c; }) // 対象カテゴリ
		}).then(function (data) {
			var categories = data.query.pages[0].categories;
			var json = categories ? categories.map(function (c) { return c.title.replace(/^.*:/, ''); }) : [];
			// すでに分類済みの対象カテゴリはsessionStorageに一時保存
			mw.storage.session.set('userjs-check-error-categories', JSON.stringify(json));
			defer.resolve();
		}, defer.reject);
		return defer.promise();
	}
	
	/*
	エラーチェックの設定
	*/
	function prepareCheck() {
		// すでに分類済みの対象カテゴリは例外とする
		var EXCEPTION_CATS = JSON.parse(mw.storage.session.get('userjs-check-error-categories') || '[]');
		
		var btnCodeMirror = document.getElementById('mw-editbutton-codemirror');
		var wpTextbox1 = document.getElementById('wpTextbox1');
		var wpSave = document.getElementById('wpSave');
		wpSave.addEventListener('click', checkError, false); // 投稿ボタンをクリックで発火
		
		var skip = false; // チェックをスキップしない
		function checkError(e) {
			if (skip) return;
			e.preventDefault(); // 送信を防ぐ
			
			// シンタックスハイライトが有効なとき、クリックして一時的に無効にする
			var syntaxHighlighting = mw.user.options.get('usecodemirror');
			if (syntaxHighlighting == 1 && btnCodeMirror) btnCodeMirror.click();
			
			// 編集内容をパース
			new mw.Api({
				ajax: {
					header: { 'Api-User-Agent': 'Example/1.0' }
				}
			}).post({
				format: 'json',
				formatversion: 2,
				action: 'parse',
				title: pagename,
				text: wpTextbox1.value // 編集内容
			}).then(function (data) {
				var categories = data.parse.categories;
				var matches = []; // 格納用配列
				for (var i = 0, len = categories.length; i < len; i++) {
					var category = categories[i].category;
					if (ERROR_CATS.indexOf(category) !== -1 && EXCEPTION_CATS.indexOf(category) === -1) {
						// 対象カテゴリに含まれて例外でない場合、a要素として格納用配列に追加
						matches.push('<a href="/wiki/Category:' + encodeURIComponent(category) + '" target=_blank title="Category:' + category + '">Category:' + category + '</a>');
					}
				}
				if (matches[0]) {
					// 格納用配列が空でない(対象カテゴリに含まれる)の場合は警告を表示
					OO.ui.alert(null, {
						title: '投稿できません',
						message: $('<p>以下のカテゴリに分類されるため投稿できません。編集内容を確認してください。</p><ul><li>' + matches.join('<li>') + '</ul>'),
					});
					// シンタックスハイライトを元に戻す
					if (syntaxHighlighting == 1 && btnCodeMirror) btnCodeMirror.click();
				} else {
					// 格納用配列が空の場合はチェックをスキップして再度投稿ボタンをクリックする
					skip = true;
					wpSave.click();
				}
			});
		}
	}
})(jQuery, mediaWiki);