コンテンツにスキップ

利用者:Aokomoriuta/TitleChecker.js

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

多くの WindowsLinux のブラウザ

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

Mac における Safari

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

Mac における ChromeFirefox

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

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

/////////////////////////////////////////////////////////////////
// 記事名チェッカ 1.0 written by Tietew and Hatukanezumi
/////////////////////////////////////////////////////////////////

/*
 * 無効化のフラグ変数。無効化は、利用者のユーザスクリプトで真に設定することでする。
 */
var disableTitleChecker = false;

/*
 * 記事名チェッカによる処理を適用しない記事名のリスト (除外リスト)。
 */
var TitleChecker_exclude = [// [名前空間番号, 項目名], ...
];

/*
 * 記事名を検査し、結果を返す。
 * 引数:
 *   ns:    名前空間番号 (標準: 0; ノート: 1; ...)。
 *   title: 項目名。
 *   body:  項目本文の内容。
 * 返値:
 *   [処理, [[説明文, [ガイドライン等, ...]], ...], リダイレクトの即時削除対象になりうるかどうか]
 *   ただし、処理が「許可」であるときは false。
 */
function TitleChecker_check(ns, title, body)
{
	var platform; // プラットフォームを識別する名称。
	var is_redirect; // リダイレクトであるかどうか。
	var action = 0; // 処理。0: 許可する; 1: 警告する; 2: 拒否する.
	var reason = [];
	var for_redirect = false;
	
	var do_check = function(pattern, newaction, message, guides)
	{
		var re, m, matched, msgstr;
		re = new RegExp(pattern, "g");
		m = title.match(re);
		if (m && (matched = m.join(" "))) 
		{
			if (newaction > action) 
				action = newaction;
			
			msgstr = message;
			msgstr = msgstr.replace("%s", matched);
			msgstr = msgstr.replace("%%", "%");
			reason.push([msgstr, guides]);
			
			if (guides && is_redirect) 
				for (var i = 0; i < guides.length; i++) 
					if (guides[i] == "Wikipedia:即時削除の方針#リダイレクト") 
					{
						for_redirect = true;
						break;
					}
		}
	};
	
	title = title.replace(/_/g, ' ');
	
	// 記事ごとの無効化。除外リストにあれば検査をしない。
	if (TitleChecker_exclude) 
		for (var i = 0; i < TitleChecker_exclude.length; i++) 
			if (TitleChecker_exclude[i][0] == ns && TitleChecker_exclude[i][1] == title) 
				return false;
	
	// プラットフォームの判別。
	// check for AppleWebKit/416 (Safari/2.0.2) or later
	var safari = navigator.userAgent.match(/\bAppleWebKit\/(\d+)/);
	if (safari && safari[1] < 416) 
		platform = 'Safari/1.x';
	
	// リダイレクトであるかどうかの判定。
	is_redirect = (body && body.match(/^#redirect[[\t\r\n ]/i));
	
	/*
	 * 書式の検査
	 */
	// 記事名の全体を「」または『』などでくくっているもの、ないしは、その後に曖昧さ回避の括弧があるもの。
	if (platform != 'Safari/1.x') 
		do_check("^[「『].*[」』]([ _]+[(][^)]+[)])?$", 1, "記事名が鈎括弧でくくられています。芸術作品のタイトルは鈎括弧でくくるべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#小説・詩・映画・舞台・音楽・絵画など芸術作品のタイトル"]);
	
	// 記事名の末尾の括弧書きに半角の小括弧(丸括弧)を使用する場合に、左括弧の前に半角スペースがないもの。
	// 注: 入れ子は2重まで。
	do_check("[^ ][(]([(][^()]*[)]|[^()])*[)]$", 1, "記事名の最後の左括弧の前に半角スペースがありません: %s。曖昧さ回避の括弧である場合は、括弧の前に半角スペースを入れてください。名称自体に括弧を含んでいる場合はこの限りではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:曖昧さ回避#曖昧さ回避の種類と方法"]);
	
	// 記事名に半角の小括弧(丸括弧)を使用する場合に、括弧の左右が対称でないもの。
	// 注: 入れ子は2重まで。
	if (platform != 'Safari/1.x') 
		do_check("[(]([(][^()()]*[)]|[(][^()()]*[)]|[^()()])*[)]|[(]([(][^()()]*[)]|[(][^()()]*[)]|[^()()])*[)]", 1, "括弧の左右が対称ではありません: %s。両方を、半角括弧か全角括弧に統一してください。", ["Wikipedia:即時削除の方針#リダイレクト"]);
	
	// 記事名に実体参照または数値文字参照を含んでいるもの。
	do_check("([&][#]?[\dA-Za-z]+;)+", 2, "記事名に実体参照を含んでいます: %s。実体参照を記事名に使うべきではありません。", ["Wikipedia:記事名の付け方#特殊記号の使用は慎重にすること"]);
	
	/*
	 * 使用文字種の検査
	 */
	// 技術的な考慮 (拒否)
	
	if (platform != 'Safari/1.x') 
		do_check("[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]", 2, "文字でないものを含んでいます。文字でないものを記事名に使うべきではありません。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\u0080-\u009F\uFFF0-\uFFFD\uDB40-\uDB7F]", 2, "制御文字を含んでいます。制御文字を記事名に使うべきではありません。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\u00A0]", 2, "ノーブレークスペースを含んでいます。通常のスペースを使ってください。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\u00AD]", 2, "ソフトハイフンを含んでいます。ソフトハイフンを記事名に使うべきではありません。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\u2000-\u200A\u200B\u205F]", 2, "特別な幅のスペースを含んでいます。通常のスペースを使ってください。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\u200C\u200D\u2060]", 2, "書式制御文字を含んでいます。一部の言語ではこの文字を使いますが、記事名には日本語を使ってください。", ["Wikipedia:記事名の付け方#日本語を使うこと"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\u2011]", 2, "ノンプレーキングハイフンを含んでいます。ハイフンマイナス (-) を使ってください。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\u2028-\u202E\u2061-\u206F]", 2, "書式制御文字を含んでいます。書式制御文字を記事名に使うべきではありません。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\u202F]", 2, "特別な幅のノーブレークスペースを含んでいます。通常のスペースを使ってください。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\uE000-\uF8FF\uDB80-\uDBFF]", 2, "私用文字を含んでいます。私用文字 (外字) を記事名に使うべきではありません。");
	
	if (platform != 'Safari/1.x') 
		do_check("[\uFEFF]", 2, "不可視な文字を含んでいます。この文字を記事名に使うべきではありません。");
	
	// その他のガイドライン等 (警告)
	
	if (platform != 'Safari/1.x') 
		do_check("[\u2160-\u217F]+", 1, "ローマ数字を含んでいます: %s。これは機種依存文字です。ローマ数字は半角英字 (iやVなど) を並べて表記してください。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#ローマ数字"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\u2460-\u2473\u24EA-\u24FF\u3251-\u325F\u32B1-\u32BF]+", 1, "丸数字を含んでいます: %s。これは機種依存文字です。代わりに (1), (2), (3) を使用してください。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#丸数字"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\u2474-\u24B5\u3200-\u3250\u32C0-\u32CF\u3300-\u33FF]+", 1, "組文字を含んでいます: %s。片仮名や、漢字、英数字で表記してください。これは機種依存文字である場合もあります。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#略記号", "Wikipedia:表記ガイド#文字コード"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\u3000]", 1, "全角空白を含んでいます。全角空白を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\uFB00-\uFEFE\uFFE0-\uFFE7\uFFE8-\uFFEF]+", 1, "機種依存文字を含んでいます: %s。機種依存文字を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#文字コード"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\uFF10-\uFF19]+", 1, "全角数字を含んでいます: %s。全角英数字を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\uFF21-\uFF3A\uFF41-\uFF5A]+", 1, "全角英字を含んでいます: %s。全角英数字を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\uFF00\uFF02\uFF04-\uFF07\uFF0A-\uFF0F\uFF1B\uFF20\uFF3C\uFF3E-\uFF40\uFF5F-\uFF60]+", 1, "全角英記号を含んでいます: %s。全角英記号を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
	
	if (platform != 'Safari/1.x') 
		if (!is_redirect) 
			do_check( // リダイレクトでない場合のみ
"[\uFF5E]+", 1, "全角チルダを含んでいます。この文字は、一部の環境で正しく表示されません。波ダッシュ (〜) か、できればハイフンマイナス (-) を使ってください。波ダッシュを使った記事名へのリダイレクトを作成しようとしている場合は、この限りではありません。", ["Wikipedia:表記ガイド#波ダッシュ"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\uFF61-\uFF9F]+", 1, "半角片仮名を含んでいます: %s。半角片仮名を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
	
	if (platform != 'Safari/1.x') 
		do_check("[\uFFA0-\uFFDF]+", 1, "半角ハングル字母を含んでいます: %s。半角ハングル字母を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
	
	if (action == 0) 
		return false;
	return [action, reason, for_redirect];
}

/*
 * 記事名を検査した結果を表示する。
 * 引数:
 *   mark:   説明文などを挿入する場所のelement。
 *   action: 処理。
 *   reason: [[説明文, [ガイドライン等, ...]], ...]
 *   for_redirect: リダイレクトの即時削除対象でありうるかどうか。
 * 返値:
 *   なし。
 */
function TitleChecker_warn(mark, action, reason, for_redirect)
{
	var esc = function(str)
	{
		var e = document.createElement('div');
		e.appendChild(document.createTextNode(str));
		return e.innerHTML;
	};
	var wl = function(title)
	{
		title = title.replace(/_/g, ' ');
		return '<a href="/wiki/' +
		encodeURIComponent(title.replace(/ /g, '_')).replace(/%2F/g, '/').replace(/%3A/g, ':') +
		'" title="' +
		esc(title) +
		'">' +
		esc(arguments[1] || title) +
		'</a>';
	};
	
	var text = '';
	text = text +
	'<p><strong>警告: このページの記事名の付け方は、' +
	'当ウィキペディアのガイドラインなどにそっていないかもしれません。' +
	'理由は以下のとおりです。</strong></p>';
	if (reason) 
	{
		text = text + '<ul>';
		for (var i = 0; i < reason.length; i++) 
		{
			text = text + '<li>' + esc(reason[i][0]);
			if (reason[i][1]) 
			{
				var rl = [];
				for (var j = 0; j < reason[i][1].length; j++) 
				{
					rl.push(wl(reason[i][1][j]));
				}
				text = text + '詳しくは、' + rl.join('、') + 'を参照してください。';
			}
			text = text + '</li>';
		}
		text = text + '</ul>';
	}
	text = text +
	'<p>ガイドラインにそっていないときは、記事名の変更を検討してみてください。' +
	'なお、記事名を変更したときは、' +
	wl('特別:Whatlinkshere/' + wgPageName, 'このページのリンク元') +
	'を調べて、新しい記事へのリンクに変更するようにしてください。</p>' +
	'<p>記事名チェック機能の詳細は、' +
	wl('Help:記事名のチェック') +
	'をご覧ください。</p>';
	if (for_redirect && wgArticleId) 
		text = text +
		'<p>編集中のページは' +
		wl('Wikipedia:リダイレクト', 'リダイレクト') +
		'ですが、' +
		'即時削除に出せるかもしれません。' +
		'リダイレクトの即時削除に出すことができるのは、以下のすべてが該当する場合です。</p><ul>' +
		'<li>項目名の書き誤りで、それが誰が見ても明らかに誤りだとわかる。</li>' +
		'<li>項目が有益な履歴を持っていない。</li>' +
		'<li>項目がどこからもリンクされていない。</li>' +
		'</ul><p>リダイレクトの即時削除についての詳細は、' +
		wl('Wikipedia:即時削除の方針') +
		'を参照してください。</p>';
	
	var div = document.createElement('div');
	div.innerHTML = text;
	mark.parentNode.insertBefore(div, mark.nextSibling);
	
	return;
}

/*
 * 記事名チェッカの処理を実行する。
 * 引数:
 *   なし。
 * 返値:
 *   なし。
 */
function TitleChecker()
{
	var dis = function()
	{
		for (var i = 0; i < arguments.length; ++i) 
		{
			var e = document.getElementById(arguments[i]);
			if (e) 
				e.disabled = true;
		}
	};
	
	// 利用者ごとの無効化。
	if (disableTitleChecker) 
		return;
	
	// 検査は標準名前空間の記事に対してのみ行う。
	if (wgNamespaceNumber != 0) 
		return;
	// 検査は利用者が新規作成または編集しようとしたときにのみ行う。
	var editform = document.getElementById('editform');
	if (!editform) 
		return;
	
	// 検査して結果を得る。  
	var nc = TitleChecker_check(wgNamespaceNumber, wgTitle, document.getElementById('wpTextbox1').value);
	
	// 検査の結果、次のいずれかの処理を行う。
	// 許可: 「警告」や「拒否」に該当する処理をしない場合は、何もしない。
	if (!nc) 
		return;
	// 拒否: 編集をできなくする。
	if (nc[0] > 1) 
	{
		if (wgArticleId == 0) 
		{
			editform.parentNode.removeChild(editform);
		}
		else 
		{
			dis('wpSummary', 'wpMinoredit', 'wpWatchthis', 'wpSave', 'wpPreview', 'wpDiff');
			document.getElementById('wpTextbox1').readOnly = true;
		}
	}
	// 警告と拒否: 説明文を表示する。
	var mark;
	switch (skin)
	{
		case 'standard':
		case 'cologneblue':
		case 'nostalgia':
			mark = document.getElementById('specialpages') ? document.getElementById('topbar') : getElementsByClassName(document, 'h1', 'pagetitle')[0].nextSibling;
			break;
		default:
			mark = document.getElementById('jump-to-nav') ||
			document.getElementById('contentSub');
	}
	TitleChecker_warn(mark, nc[0], nc[1], nc[2]);
	
	return;
}

/*
 * 以上の処理は、ページ読み込みの際に実行する。
 */
$(TitleChecker);