339行目: |
339行目: |
| | | |
| ///////////////////////////////////////////////////////////////// | | ///////////////////////////////////////////////////////////////// |
− | // 記事名チェッカ 1.0 written by Tietew and Hatukanezumi | + | // 記事名チェッカ for SRW Wiki |
| + | // Originally written by Tietew and Hatukanezumi |
| + | // Modified by ocha |
| ///////////////////////////////////////////////////////////////// | | ///////////////////////////////////////////////////////////////// |
| | | |
− | /* | + | /*jslint regexp: true, browser: true */ |
− | * 無効化のフラグ変数。無効化は、利用者のユーザスクリプトで真に設定することでする。
| + | /*global $, wgPageName, wgNamespaceNumber, wgTitle, wgArticleId, skin, getElementsByClassName */ |
− | */
| + | |
| + | // 無効化のフラグ変数 |
| + | // 無効化は、利用者のユーザスクリプトで真に設定することでする |
| var disableTitleChecker = false; | | var disableTitleChecker = false; |
| | | |
− | /* | + | var titleChecker = (function () { |
− | * 記事名チェッカによる処理を適用しない記事名のリスト (除外リスト)。 | + | 'use strict'; |
− | */
| + | |
− | var TitleChecker_exclude = [
| + | // 記事名チェッカによる処理を適用しない記事名のリスト(除外リスト) |
− | // [名前空間番号, 項目名], ...
| + | var excludes = [ |
− | ]; | + | // [名前空間番号, 項目名], ... |
| + | ], |
| + | lenExcludes = excludes.length, |
| + | |
| + | /* |
| + | * 記事名を検査し、結果を返す |
| + | * 引数:args { |
| + | * ns: 名前空間番号(標準:0;ノート:1;…) |
| + | * title: 項目名 |
| + | * body: 項目本文の内容 |
| + | * } |
| + | * 返値:{ |
| + | * action: 処理 |
| + | * reasons: 理由。[{message: 説明文, guides: [ガイドライン等, ...]}] |
| + | * for_redirect: リダイレクトの即時削除対象になりうるかどうか |
| + | * } |
| + | * ただし、処理が「許可」であるときは false |
| + | */ |
| + | check = function (args) { |
| + | var ns = args.ns, |
| + | title = args.title, |
| + | body = args.body, |
| + | |
| + | matchesSafari, // 'AppleWebkit' へのマッチ |
| + | |
| + | is_redirect, // リダイレクトであるかどうか |
| + | action = 0, // 処理。0:許可する;1:警告する;2:拒否する |
| + | reasons = [], // 理由。[{message: 説明文, |
| + | // guides: [ガイドライン等, ...]}] |
| + | for_redirect = false, |
| + | |
| + | i, |
| + | |
| + | do_check = function (args) { |
| + | var re, |
| + | m, |
| + | matched, |
| + | reason, |
| + | msgstr; |
| + | |
| + | re = new RegExp(args.pattern, 'g'); |
| + | m = title.match(re); |
| + | if (m && (matched = m.join(' ')) !== '') { |
| + | if (args.newaction > action) { |
| + | action = args.newaction; |
| + | } |
| + | |
| + | msgstr = args.message; |
| + | msgstr = msgstr.replace('%s', matched); |
| + | msgstr = msgstr.replace('%%', '%'); |
| + | reason = { |
| + | message: msgstr, |
| + | guides: args.guides || null |
| + | }; |
| + | reasons.push(reason); |
| + | |
| + | /* |
| + | * if (guides && is_redirect) { |
| + | * lenGuides = guids.length; |
| + | * for (var i = 0; i < lenGuides; i += 1) { |
| + | * if (guides[i] === "Wikipedia:即時削除の方針#リダイレクト") { |
| + | * for_redirect = true; |
| + | * break; |
| + | * } |
| + | * } |
| + | * } |
| + | */ |
| + | } |
| + | }; |
| + | |
| + | title = title.replace(/_/g, ' '); |
| + | |
| + | // 記事ごとの無効化。除外リストにあれば検査をしない。 |
| + | if (lenExcludes > 0) { |
| + | for (i = 0; i < lenExcludes; i += 1) { |
| + | if (excludes[i][0] === ns && excludes[i][1] === title) { |
| + | return false; |
| + | } |
| + | } |
| + | } |
| + | |
| + | // プラットフォームの判別 |
| + | // AppleWebKit/416 (Safari/2.0.2) 以降か? |
| + | matchesSafari = navigator.userAgent.match(/\bAppleWebKit\/(\d+)/); |
| + | if (matchesSafari && matchesSafari[1] < 416) { |
| + | return false; // Safari/1.x ならば検査をしない |
| + | } |
| + | |
| + | // リダイレクトであるかどうかの判定 |
| + | is_redirect = (body && body.match(/^#(?:redirect|転送)\s*\[\[.+?\]\]/i)); |
| + | |
| + | /* |
| + | * 書式の検査 |
| + | */ |
| + | |
| + | // 記事名の全体を「」または『』などでくくっているもの |
| + | // ないしは、その後に曖昧さ回避の括弧があるもの(拒否) |
| + | do_check({ |
| + | pattern: '^[「『].*[」』]([ _]+[(][^)]+[)])?$', |
| + | newaction: 2, |
| + | message: '記事名が鈎括弧でくくられています。' + |
| + | 'タイトルは鈎括弧でくくるべきではありません。' |
| + | }); |
| + | |
| + | // 記事名の末尾の括弧書きに半角の小括弧(丸括弧)を使用する場合に、 |
| + | // 左括弧の前に半角スペースがないもの(警告) |
| + | // 注: 入れ子は2重まで |
| + | do_check({ |
| + | pattern: '[^ ][(]([(][^()]*[)]|[^()])*[)]$', |
| + | newaction: 1, |
| + | message: '記事名の最後の左括弧の前に半角スペースがありません' + |
| + | ': %s。' + |
| + | '曖昧さ回避の括弧である場合は、括弧の前に半角スペースを' + |
| + | '入れてください。' + |
| + | '名称自体に括弧を含んでいる場合はこの限りではありません。', |
| + | guides: ['スーパーロボット大戦Wiki:記事制作のポイント#記事名の表記法'] |
| + | }); |
| + | |
| + | // 記事名に半角の小括弧(丸括弧)を使用する場合に、 |
| + | // 括弧の左右が対称でないもの(警告) |
| + | // 注: 入れ子は2重まで |
| + | do_check({ |
| + | pattern: '[(]([(][^()()]*[)]|[(][^()()]*[)]|[^()()])*[)]|[(]([(][^()()]*[)]|[(][^()()]*[)]|[^()()])*[)]', |
| + | newaction: 1, |
| + | message: '括弧の左右が対称ではありません: %s。' + |
| + | '両方を、半角括弧か全角括弧に統一してください。' |
| + | }); |
| + | |
| + | // 記事名に実体参照または数値文字参照を含んでいるもの(拒否) |
| + | do_check({ |
| + | pattern: '([&][#]?[A-Za-z\\d]+;)+', |
| + | newaction: 2, |
| + | message: '記事名に実体参照を含んでいます: %s。' + |
| + | '実体参照を記事名に使うべきではありません。' |
| + | }); |
| + | |
| + | /* |
| + | * 使用文字種の検査 |
| + | */ |
| + | |
| + | // 技術的な考慮(拒否) |
| + | |
| + | do_check({ |
| + | pattern: '&', |
| + | newaction: 2, |
| + | message: '半角アンパサンド (&) を含んでいます。' + |
| + | '記事が正常に表示されなくなるため、' + |
| + | 'この文字は記事名に使用できません。' + |
| + | '代わりに全角アンパサンド(&)を使用してください。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '\\+', |
| + | newaction: 2, |
| + | message: '半角プラス記号 (+) を含んでいます。' + |
| + | '記事が正常に表示されなくなるため、' + |
| + | 'この文字は記事名に使用できません。' + |
| + | '代わりに全角プラス記号(+)を使用してください。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]', |
| + | newaction: 2, |
| + | message: '文字でないものを含んでいます。' + |
| + | '文字でないものを記事名に使うべきではありません。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '[\u0080-\u009F\uFFF0-\uFFFD\uDB40-\uDB7F]', |
| + | newaction: 2, |
| + | message: '制御文字を含んでいます。' + |
| + | '制御文字を記事名に使うべきではありません。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '[\u00A0]', |
| + | newaction: 2, |
| + | message: 'ノーブレークスペースを含んでいます。' + |
| + | '通常のスペースを使ってください。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '[\u00AD]', |
| + | newaction: 2, |
| + | message: 'ソフトハイフンを含んでいます。' + |
| + | 'ソフトハイフンを記事名に使うべきではありません。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '[\u2000-\u200A\u200B\u205F]', |
| + | newaction: 2, |
| + | message: '特別な幅のスペースを含んでいます。' + |
| + | '通常のスペースを使ってください。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '[\u200C\u200D\u2060]', |
| + | newaction: 2, |
| + | message: '書式制御文字を含んでいます。' + |
| + | '一部の言語ではこの文字を使いますが、' + |
| + | '記事名には日本語を使ってください。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '[\u2011]', |
| + | newaction: 2, |
| + | message: 'ノンプレーキングハイフンを含んでいます。' + |
| + | 'ハイフンマイナス (-) を使ってください。' |
| + | }); |
| + | |
| + | do_check({ |
| + | pattern: '[\u2028-\u202E\u2061-\u206F]', |
| + | newaction: 2, |
| + | message: '書式制御文字を含んでいます。' + |
| + | '書式制御文字を記事名に使うべきではありません。' |
| + | }); |
| | | |
− | /*
| + | do_check({ |
− | * 記事名を検査し、結果を返す。
| + | pattern: '[\u202F]', |
− | * 引数:
| + | newaction: 2, |
− | * ns: 名前空間番号 (標準: 0; ノート: 1; ...)。
| + | message: '特別な幅のノーブレークスペースを含んでいます。' + |
− | * 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) {
| + | do_check({ |
− | var re, m, matched, msgstr;
| + | pattern: '[\uE000-\uF8FF\uDB80-\uDBFF]', |
− | re = new RegExp(pattern, "g");
| + | newaction: 2, |
− | m = title.match(re);
| + | message: '私用文字を含んでいます。' + |
− | if (m && (matched = m.join(" "))) {
| + | '私用文字(外字)を記事名に使うべきではありません。' |
− | if (newaction > action) action = newaction;
| + | }); |
| | | |
− | msgstr = message;
| + | do_check({ |
− | msgstr = msgstr.replace("%s", matched);
| + | pattern: '[\uFEFF]', |
− | msgstr = msgstr.replace("%%", "%");
| + | newaction: 2, |
− | reason.push([msgstr, guides]);
| + | message: '不可視な文字を含んでいます。' + |
| + | 'この文字を記事名に使うべきではありません。' |
| + | }); |
| | | |
− | if (guides && is_redirect)
| + | // その他のガイドライン等(拒否) |
− | for ( var i = 0; i < guides.length; i++)
| |
− | if (guides[i] == "Wikipedia:即時削除の方針#リダイレクト") {
| |
− | for_redirect = true; | |
− | break;
| |
− | }
| |
− | }
| |
− | };
| |
| | | |
− | title = title.replace(/_/g, ' ');
| + | do_check({ |
| + | pattern: '[\uFF65]', |
| + | newaction: 2, |
| + | message: '半角中黒 (・) を含んでいます。' + |
| + | '代わりに全角中黒(・)を使用してください。', |
| + | guides: ['スーパーロボット大戦Wiki:記事制作のポイント#記事名の表記法'] |
| + | }); |
| | | |
− | // 記事ごとの無効化。除外リストにあれば検査をしない。
| + | do_check({ |
− | if (TitleChecker_exclude)
| + | pattern: '[=\u30A0]', |
− | for ( var i = 0; i < TitleChecker_exclude.length; i++)
| + | newaction: 2, |
− | if (TitleChecker_exclude[i][0] == ns && TitleChecker_exclude[i][1] == title)
| + | message: '半角等号 (=) またはダブルハイフン(゠)を含んでいます。' + |
− | return false;
| + | '代わりに全角等号(=)を使用してください。', |
| + | guides: ['スーパーロボット大戦Wiki:記事制作のポイント#記事名の表記法'] |
| + | }); |
| | | |
− | // プラットフォームの判別。
| + | do_check({ |
− | // check for AppleWebKit/416 (Safari/2.0.2) or later
| + | pattern: '[\u2160-\u217F]+', |
− | var safari = navigator.userAgent.match(/\bAppleWebKit\/(\d+)/);
| + | newaction: 2, |
− | if(safari && safari[1] < 416) platform = 'Safari/1.x';
| + | message: 'ローマ数字を含んでいます: %s。' + |
| + | 'これは機種依存文字です。' + |
| + | 'ローマ数字は半角英字(iやVなど)を並べて表記してください。' |
| + | }); |
| | | |
− | // リダイレクトであるかどうかの判定。
| + | do_check({ |
− | is_redirect = (body && body.match(/^#redirect[[\t\r\n ]/i));
| + | pattern: '[\u2460-\u2473\u24EA-\u24FF\u3251-\u325F\u32B1-\u32BF]+', |
− |
| + | newaction: 2, |
− | /*
| + | message: '丸数字を含んでいます: %s。' + |
− | * 書式の検査
| + | 'これは機種依存文字です。' + |
− | */
| + | '代わりに (1)、(2)、(3) などを使用してください。' |
| + | }); |
| | | |
− | // 記事名の全体を「」または『』などでくくっているもの、ないしは、その後に曖昧さ回避の括弧があるもの。
| + | do_check({ |
− | if (platform != 'Safari/1.x') do_check(
| + | pattern: '[\u2474-\u24B5\u3200-\u3250\u32C0-\u32CF\u3300-\u33FF]+', |
− | "^[「『].*[」』]([ _]+[(][^)]+[)])?$",
| + | newaction: 2, |
− | 1, "記事名が鈎括弧でくくられています。芸術作品のタイトルは鈎括弧でくくるべきではありません。",
| + | message: '組文字を含んでいます: %s。' + |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#小説・詩・映画・舞台・音楽・絵画など芸術作品のタイトル"]);
| + | '片仮名や、漢字、英数字で表記してください。' + |
| + | 'これは機種依存文字である場合もあります。' |
| + | }); |
| | | |
− | // 記事名の末尾の括弧書きに半角の小括弧(丸括弧)を使用する場合に、左括弧の前に半角スペースがないもの。
| + | do_check({ |
− | // 注: 入れ子は2重まで。
| + | pattern: '[\u3000]', |
− | do_check(
| + | newaction: 2, |
− | "[^ ][(]([(][^()]*[)]|[^()])*[)]$",
| + | message: '全角空白を含んでいます。' + |
− | 1, "記事名の最後の左括弧の前に半角スペースがありません: %s。曖昧さ回避の括弧である場合は、括弧の前に半角スペースを入れてください。名称自体に括弧を含んでいる場合はこの限りではありません。",
| + | '全角空白を記事名に使うべきではありません。', |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:曖昧さ回避#曖昧さ回避の種類と方法"]);
| + | guides: ['スーパーロボット大戦Wiki:記事制作のポイント#記事名の表記法'] |
| + | }); |
| | | |
− | // 記事名に半角の小括弧(丸括弧)を使用する場合に、括弧の左右が対称でないもの。
| + | do_check({ |
− | // 注: 入れ子は2重まで。
| + | pattern: '[\uFB00-\uFEFE\uFFE0-\uFFE7\uFFE8-\uFFEF]+', |
− | if (platform != 'Safari/1.x') do_check(
| + | newaction: 2, |
− | "[(]([(][^()()]*[)]|[(][^()()]*[)]|[^()()])*[)]|[(]([(][^()()]*[)]|[(][^()()]*[)]|[^()()])*[)]",
| + | message: '機種依存文字を含んでいます: %s。' + |
− | 1, "括弧の左右が対称ではありません: %s。両方を、半角括弧か全角括弧に統一してください。",
| + | '機種依存文字を記事名に使うべきではありません。' |
− | ["Wikipedia:即時削除の方針#リダイレクト"]);
| + | }); |
| | | |
− | // 記事名に実体参照または数値文字参照を含んでいるもの。
| + | do_check({ |
− | do_check(
| + | pattern: '[\uFF10-\uFF19]+', |
− | "([&][#]?[\dA-Za-z]+;)+",
| + | newaction: 2, |
− | 2, "記事名に実体参照を含んでいます: %s。実体参照を記事名に使うべきではありません。",
| + | message: '全角数字を含んでいます: %s。' + |
− | ["Wikipedia:記事名の付け方#特殊記号の使用は慎重にすること"]);
| + | '全角英数字を記事名に使うべきではありません。', |
| + | guides: ['スーパーロボット大戦Wiki:記事制作のポイント#記事名の表記法'] |
| + | }); |
| | | |
− | /*
| + | do_check({ |
− | * 使用文字種の検査
| + | pattern: '[\uFF21-\uFF3A\uFF41-\uFF5A]+', |
− | */
| + | newaction: 2, |
| + | message: '全角英字を含んでいます: %s。' + |
| + | '全角英数字を記事名に使うべきではありません。', |
| + | guides: ['スーパーロボット大戦Wiki:記事制作のポイント#記事名の表記法'] |
| + | }); |
| | | |
− | // 技術的な考慮 (拒否)
| + | /* |
| + | * do_check({ |
| + | * pattern: '[\uFF00\uFF02\uFF04-\uFF07\uFF0A-\uFF0F\uFF1B\uFF20\uFF3C\uFF3E-\uFF40\uFF5F-\uFF60]+', |
| + | * newaction: 1, |
| + | * message: '全角英記号を含んでいます: %s。' + |
| + | * '全角英記号を記事名に使うべきではありません。', |
| + | * guides: ['スーパーロボット大戦Wiki:記事制作のポイント#記事名の表記法'] |
| + | * }); |
| + | */ |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | do_check({ |
− | "[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]",
| + | pattern: '[\uFF61-\uFF64\uFF66-\uFF9F]+', |
− | 2, "文字でないものを含んでいます。文字でないものを記事名に使うべきではありません。");
| + | newaction: 2, |
| + | message: '半角片仮名を含んでいます: %s。' + |
| + | '半角片仮名を記事名に使うべきではありません。' |
| + | }); |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | do_check({ |
− | "[\u0080-\u009F\uFFF0-\uFFFD\uDB40-\uDB7F]",
| + | pattern: '[\uFFA0-\uFFDF]+', |
− | 2, "制御文字を含んでいます。制御文字を記事名に使うべきではありません。");
| + | newaction: 2, |
| + | message: '半角ハングル字母を含んでいます: %s。' + |
| + | '半角ハングル字母を記事名に使うべきではありません。' |
| + | }); |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | // その他のガイドライン等(警告) |
− | "[\u00A0]",
| |
− | 2, "ノーブレークスペースを含んでいます。通常のスペースを使ってください。");
| |
| | | |
− | if (platform != 'Safari/1.x') do_check("[\u00AD]",
| + | if (!is_redirect) { // リダイレクトでない場合のみ |
− | 2, "ソフトハイフンを含んでいます。ソフトハイフンを記事名に使うべきではありません。");
| + | do_check({ |
| + | pattern: '[\uFF5E]+', |
| + | newaction: 1, |
| + | message: '全角チルダを含んでいます。' + |
| + | 'この文字は、一部の環境で正しく表示されません。' + |
| + | '波ダッシュ(〜)か、できればハイフンマイナス (-) を' + |
| + | '使ってください。' + |
| + | '波ダッシュを使った記事名へのリダイレクトを作成しようと' + |
| + | 'している場合は、この限りではありません。' |
| + | }); |
| + | } |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | if (action === 0) { |
− | "[\u2000-\u200A\u200B\u205F]",
| + | return false; // 処理が「許可」であるときは false を返す |
− | 2, "特別な幅のスペースを含んでいます。通常のスペースを使ってください。");
| + | } |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | return { |
− | "[\u200C\u200D\u2060]",
| + | action: action, |
− | 2, "書式制御文字を含んでいます。一部の言語ではこの文字を使いますが、記事名には日本語を使ってください。",
| + | reasons: reasons, |
− | ["Wikipedia:記事名の付け方#日本語を使うこと"]);
| + | for_redirect: for_redirect |
| + | }; |
| + | }, |
| | | |
− | if (platform != 'Safari/1.x') do_check( | + | /* |
− | "[\u2011]",
| + | * 記事名を検査した結果を表示する |
− | 2, "ノンプレーキングハイフンを含んでいます。ハイフンマイナス (-) を使ってください。");
| + | * 引数:args { |
| + | * mark: 説明文などを挿入する場所のelement |
| + | * action: 処理 |
| + | * reasons: 理由。[{message: 説明文, guides: [ガイドライン等, ...]}] |
| + | * for_redirect: リダイレクトの即時削除対象でありうるかどうか |
| + | * } |
| + | * 返値: |
| + | * なし |
| + | */ |
| + | warn = function (args) { |
| + | /* |
| + | * プロトタイプ拡張 |
| + | */ |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | // [関数] |
− | "[\u2028-\u202E\u2061-\u206F]",
| + | // メソッドの追加 |
− | 2, "書式制御文字を含んでいます。書式制御文字を記事名に使うべきではありません。");
| + | Function.prototype.method = function (name, func) { |
| + | if (!this.prototype[name]) { |
| + | this.prototype[name] = func; |
| + | return this; |
| + | } |
| + | }; |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | // [文字列] |
− | "[\u202F]",
| + | // '<'、'>'、'&' の実体参照化 |
− | 2, "特別な幅のノーブレークスペースを含んでいます。通常のスペースを使ってください。");
| + | String.method('entityify', function () { |
| + | return this.replace(/&/g, '&').replace(/</g, '<') |
| + | .replace(/>/g, '>'); |
| + | }); |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | /* |
− | "[\uE000-\uF8FF\uDB80-\uDBFF]",
| + | * 処理 |
− | 2, "私用文字を含んでいます。私用文字 (外字) を記事名に使うべきではありません。");
| + | */ |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | var mark = args.mark, |
− | "[\uFEFF]",
| + | reasons = args.reasons, |
− | 2, "不可視な文字を含んでいます。この文字を記事名に使うべきではありません。");
| + | lenReasons, |
| + | guides = [], |
| + | lenGuides, |
| + | guideLinks = [], |
| | | |
− | // その他のガイドライン等 (警告)
| + | wl = function (pageName, opt_linkName) { |
| + | pageName = pageName.replace(/_/g, ' '); |
| + | var linkName = opt_linkName || pageName; |
| + | return '<a href="' + |
| + | encodeURIComponent(pageName.replace(/ /g, '_')) |
| + | .replace(/%2F/g, '/').replace(/%3A/g, ':') + |
| + | '" title="' + pageName.entityify() + '">' + |
| + | linkName.entityify() + '</a>'; |
| + | }, |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | divWarn, |
− | "[\u2160-\u217F]+",
| + | html = '\n<p><strong>警告: このページの記事名の付け方は、' + |
− | 1, "ローマ数字を含んでいます: %s。これは機種依存文字です。ローマ数字は半角英字 (iやVなど) を並べて表記してください。",
| + | 'スーパーロボット大戦Wikiの方針に沿っていないかもしれません。' + |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#ローマ数字"]);
| + | '理由は以下のとおりです。</strong></p>', |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | i, |
− | "[\u2460-\u2473\u24EA-\u24FF\u3251-\u325F\u32B1-\u32BF]+",
| + | j; |
− | 1, "丸数字を含んでいます: %s。これは機種依存文字です。代わりに (1), (2), (3) を使用してください。",
| |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#丸数字"]);
| |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | if (reasons) { |
− | "[\u2474-\u24B5\u3200-\u3250\u32C0-\u32CF\u3300-\u33FF]+",
| + | html += '\n<ul>'; |
− | 1, "組文字を含んでいます: %s。片仮名や、漢字、英数字で表記してください。これは機種依存文字である場合もあります。",
| |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#略記号", "Wikipedia:表記ガイド#文字コード"]);
| |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | lenReasons = reasons.length; |
− | "[\u3000]",
| + | for (i = 0; i < lenReasons; i += 1) { |
− | 1, "全角空白を含んでいます。全角空白を記事名に使うべきではありません。",
| + | html = html + '\n<li>' + |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
| + | reasons[i].message.entityify(); // 説明文 |
| + | if (reasons[i].guides) { |
| + | guides = reasons[i].guides.concat(); // 配列のコピー |
| + | lenGuides = guides.length; |
| + | guideLinks = []; |
| + | for (j = 0; j < lenGuides; j += 1) { |
| + | guideLinks.push(wl(guides[j])); |
| + | } |
| + | html = html + '詳しくは、' + guideLinks.join('、') + |
| + | 'を参照してください。'; |
| + | } |
| + | html += '</li>'; |
| + | } |
| + | html += '\n</ul>'; |
| + | } |
| + | html = html + |
| + | '\n<p>記事名の変更を検討してみてください。' + |
| + | 'なお、記事名を変更したときは、' + |
| + | wl('特別:Whatlinkshere/' + wgPageName, 'このページのリンク元') + |
| + | 'を調べて、新しい記事へのリンクに変更するようにしてください。</p>\n'; |
| + | /* |
| + | * '<p>記事名チェック機能の詳細は、' + |
| + | * wl('Help:記事名のチェック') + |
| + | * 'をご覧ください。</p>'; |
| + | */ |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | /* |
− | "[\uFB00-\uFEFE\uFFE0-\uFFE7\uFFE8-\uFFEF]+",
| + | * if (for_redirect && wgArticleId) |
− | 1, "機種依存文字を含んでいます: %s。機種依存文字を記事名に使うべきではありません。",
| + | * html = html + |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#文字コード"]);
| + | * '<p>編集中のページは' + wl('Wikipedia:リダイレクト', 'リダイレクト') + 'ですが、' + |
| + | * '即時削除に出せるかもしれません。' + |
| + | * 'リダイレクトの即時削除に出すことができるのは、以下のすべてが該当する場合です。</p><ul>' + |
| + | * '<li>項目名の書き誤りで、それが誰が見ても明らかに誤りだとわかる。</li>' + |
| + | * '<li>項目が有益な履歴を持っていない。</li>' + |
| + | * '<li>項目がどこからもリンクされていない。</li>' + |
| + | * '</ul><p>リダイレクトの即時削除についての詳細は、' + wl('Wikipedia:即時削除の方針')+'を参照してください。</p>'; |
| + | */ |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | divWarn = document.createElement('div'); |
− | "[\uFF10-\uFF19]+",
| + | divWarn.className = 'titleChecker-warn'; |
− | 1, "全角数字を含んでいます: %s。全角英数字を記事名に使うべきではありません。",
| + | divWarn.innerHTML = html; |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
| + | mark.parentNode.insertBefore(divWarn, mark.nextSibling); |
| + | }; |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | /* |
− | "[\uFF21-\uFF3A\uFF41-\uFF5A]+",
| + | * 記事名チェッカの処理を実行する。 |
− | 1, "全角英字を含んでいます: %s。全角英数字を記事名に使うべきではありません。",
| + | * 引数: |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]); | + | * なし。 |
| + | * 返値: |
| + | * 処理を実行したならば true |
| + | * 処理を実行しなかったならば false |
| + | */ |
| + | return function () { |
| | | |
− | if (platform != 'Safari/1.x') do_check( | + | /* |
− | "[\uFF00\uFF02\uFF04-\uFF07\uFF0A-\uFF0F\uFF1B\uFF20\uFF3C\uFF3E-\uFF40\uFF5F-\uFF60]+",
| + | * 要素のdisabled属性をオンにする |
− | 1, "全角英記号を含んでいます: %s。全角英記号を記事名に使うべきではありません。",
| + | * 引数: |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
| + | * elements: 要素の配列 |
| + | * 返値: |
| + | * なし |
| + | */ |
| + | var disableElements = function (elements) { |
| + | var lenElements = elements.length, |
| + | e, |
| + | i; |
| | | |
− | if (platform != 'Safari/1.x') if (!is_redirect) do_check( // リダイレクトでない場合のみ
| + | for (i = 0; i < lenElements; i += 1) { |
− | "[\uFF5E]+",
| + | e = document.getElementById(elements[i]); |
− | 1, "全角チルダを含んでいます。この文字は、一部の環境で正しく表示されません。波ダッシュ (〜) か、できればハイフンマイナス (-) を使ってください。波ダッシュを使った記事名へのリダイレクトを作成しようとしている場合は、この限りではありません。",
| + | if (e) { |
− | ["Wikipedia:表記ガイド#波ダッシュ"]);
| + | e.disabled = true; |
| + | } |
| + | } |
| + | }, |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | editform = document.getElementById('editform'), |
− | "[\uFF61-\uFF9F]+",
| + | checkResult, |
− | 1, "半角片仮名を含んでいます: %s。半角片仮名を記事名に使うべきではありません。",
| + | mark; |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
| |
| | | |
− | if (platform != 'Safari/1.x') do_check(
| + | // 利用者ごとの無効化 |
− | "[\uFFA0-\uFFDF]+",
| + | if (disableTitleChecker) { |
− | 1, "半角ハングル字母を含んでいます: %s。半角ハングル字母を記事名に使うべきではありません。",
| + | return false; |
− | ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]);
| + | } |
− |
| |
− | if (action == 0) return false;
| |
− | return [action, reason, for_redirect];
| |
− | } | |
| | | |
− | /* | + | // 検査は標準名前空間の記事に対してのみ行う |
− | * 記事名を検査した結果を表示する。
| + | if (wgNamespaceNumber !== 0) { |
− | * 引数:
| + | return false; |
− | * 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 +
| + | if (!editform) { |
− | '<p><strong>警告: このページの記事名の付け方は、' +
| + | return false; |
− | '当ウィキペディアのガイドラインなどにそっていないかもしれません。' +
| |
− | '理由は以下のとおりです。</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;
| + | checkResult = check({ |
− | mark.parentNode.insertBefore(div, mark.nextSibling);
| + | ns: wgNamespaceNumber, |
| + | title: wgTitle, |
| + | body: document.getElementById('wpTextbox1').value |
| + | }); |
| | | |
− | return;
| + | // 検査の結果、次のいずれかの処理を行う |
− | }
| |
| | | |
− | /* | + | // 許可:「警告」や「拒否」に該当する処理をしない場合は、何もしない |
− | * 記事名チェッカの処理を実行する。
| + | if (!checkResult) { |
− | * 引数:
| + | return false; |
− | * なし。
| + | } |
− | * 返値:
| |
− | * なし。
| |
− | */
| |
− | 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 (checkResult.action > 1) { |
| + | if (wgArticleId === 0) { |
| + | editform.parentNode.removeChild(editform); |
| + | } else { |
| + | disableElements([ |
| + | 'wpSummary', |
| + | 'wpMinoredit', |
| + | 'wpWatchthis', |
| + | 'wpSave', |
| + | 'wpPreview', |
| + | 'wpDiff' |
| + | ]); |
| + | document.getElementById('wpTextbox1').readOnly = true; |
| + | } |
| + | } |
| | | |
− | // 検査は標準名前空間の記事に対してのみ行う。
| + | // 警告と拒否:説明文を表示する |
− | if (wgNamespaceNumber != 0) return;
| + | if (skin === 'standard' || skin === 'cologneblue' || |
− | // 検査は利用者が新規作成または編集しようとしたときにのみ行う。
| + | skin === 'nostalgia') { |
− | var editform = document.getElementById('editform');
| + | mark = document.getElementById('specialpages') ? |
− | if(!editform) return;
| + | document.getElementById('topbar') : |
− |
| + | getElementsByClassName(document, 'h1', 'pagetitle')[0] |
− | // 検査して結果を得る。
| + | .nextSibling; |
− | var nc = TitleChecker_check(wgNamespaceNumber, wgTitle, document.getElementById('wpTextbox1').value);
| + | } else { |
| + | mark = document.getElementById('jump-to-nav') || |
| + | document.getElementById('contentSub'); |
| + | } |
| | | |
− | // 検査の結果、次のいずれかの処理を行う。
| + | warn({ |
− | // 許可: 「警告」や「拒否」に該当する処理をしない場合は、何もしない。
| + | mark: mark, |
− | if(!nc) return;
| + | action: checkResult.action, |
− | // 拒否: 編集をできなくする。
| + | reasons: checkResult.reasons, |
− | if (nc[0] > 1) {
| + | for_redirect: checkResult.for_redirect |
− | 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;
| + | return true; |
− | } | + | }; |
| + | }()); |
| | | |
| /* | | /* |
− | * 以上の処理は、ページ読み込みの際に実行する。 | + | * 以上の処理は、ページ読み込みの際に実行する |
| */ | | */ |
− | $(TitleChecker); | + | $(titleChecker); |
| | | |
| /* Internet Explorer に対してのみ適用 */ | | /* Internet Explorer に対してのみ適用 */ |