「利用者:Waiesu/CheckErrorCategories.js」の版間の差分

削除された内容 追加された内容
Waiesu (会話 | 投稿記録)
新しいページ: 「(function($, mw) { 'use strict'; →‎対象カテゴリ: var ERROR_CATS = [ 'テンプレート呼び出しで引数が重複しているページ',…」
(相違点なし)

2018年1月23日 (火) 12:19時点における版

(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);
	}
	
	/*
	最新版のカテゴリ取得 - すでに対象カテゴリに含まれるか
	*/
	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;
			if (categories) {
				var json = 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 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(); // 送信を防ぐ
			// 編集内容をパース
			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>'),
					});
				} else {
					// 格納用配列が空の場合はチェックをスキップして再度投稿ボタンをクリックする
					skip = true;
					wpSave.click();
				}
			});
		}
	}
})(jQuery, mediaWiki);