コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

利用者:Frozen-mikan/索引の読み仮名.js

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

多くの WindowsLinux のブラウザ

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

Mac における Safari

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

Mac における ChromeFirefox

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

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

/*
 * 索引の読み仮名を編集するスクリプト。
 * 記事名にある平仮名や片仮名をハイフンマイナス "-" で省略している場合や、
 * カタカナ混じりのまま記述している箇所を修正する。
 * 
 * 各索引ページの編集画面で実行する。
 * 今の段階では、コンソールにコピペして使用されることを想定している。
 * !!! 注意事項 !!!
 * 変更後の差分を必ず確認してから投稿すること。
 * 問題を発見した場合には、使用を直ちに中止し、本スクリプトの作者に連絡して下さい。
 * @author [[w:ja:User:Frozen-mikan]]
 */
(function() {
    var version = "v0.11";
    var textbox = $("#wpTextbox1")[0];

    function getWikitext() {
        if (textbox) {
            return textbox.value;
        }
        return "";
    }

    function setWikitext(text) {
        if (textbox) {
            textbox.value = text;
            return true;
        }
        return false;
    }

    /* 投稿ボタンを有効化/無効化する。true なら無効化し、false なら有効化。 */
    function setSaveButtonDisabled(bool) {
        $("#wpSave").prop("disabled", bool);
    }

    // 要約欄に text を追加する。
    function appendSummary(text) {
        var summary = $("#wpSummary");
        summaryText = summary.val();
        summaryText += text;
        summary.val(summaryText);
    }

    function getLines(text) {
        return text.split('\n');
    }

    /*
     * line をマッチングし、読み仮名を含んだ Matcher をそのまま返す。
     * 読み仮名が無い場合には null を返す。
     * 読み仮名部分にリンクが有る場合にも null を返す。
     * m[1] 読みの開き括弧の前(空白も除く)まで
     * m[2] 内部リンクのリンク部分。
     * m[3] 読み仮名
     * m[4] 読みの閉じ括弧の後ろ以降
     */
    function getYomi(line) {
        var re = /^(.+?\[\[(.+?)(?:\|.*?)?\]\])\s*[((]([^\[\]]+?)[))]\s*(.*)$/;
        var m = re.exec(line);
        if (m && m[3]) {
            // console.log(m[2], m[3]);
            return m;
        }
        return null;
    }

    /* ヴァ行をバ行に変換する。カタカナをひらがなに置き換える。 */
    function filterKataHira(text) {
        return text
        .replace(/(う゛|[ヴゔ])[ァぁ]/g, 'バ')
        .replace(/(う゛|[ヴゔ])[ィぃ]/g, 'ビ')
        .replace(/(う゛|[ヴゔ])[ェぇ]/g, 'ベ')
        .replace(/(う゛|[ヴゔ])[ォぉ]/g, 'ボ')
        .replace(/(う゛|[ヴゔ])/g, 'ブ') /* 順番大事 */
        .replace(/[ァ-ン]/g, function(s) {
            return String.fromCharCode(s.charCodeAt(0) - 0x60);
        });
    }

    // タイトルと読みの後ろから比較し、同じ文字を削って返す
    function removeTail(title, yomi) {
        if (title == yomi) return "";
        var rtitle = title.split("").reverse();
        var ryomi = yomi.split("").reverse();
        for (;rtitle[0] == ryomi[0];) {
            rtitle.shift();
            ryomi.shift();
        }
        return rtitle.reverse().join("");
    }

    function main() {
        // 索引以外のページでは即時終了
        var pagename = mw.config.get("wgPageName");
        if (pagename.indexOf("Wikipedia:索引") != 0) return;

        var text = getWikitext();
        var lines = getLines(text);
        for (var i = 0; i < lines.length; ++i) {
            var line = lines[i];
            var m = getYomi(line);
            if (m == null) continue;
            var yomi = m[3];
            var comments = [];

            // タイトル中にある平仮名や片仮名をハイフンマイナスで省略している場合の置き換え 
            if (yomi.indexOf("-") != -1) {
                var lm = null;
                var title = m[2];
                title = title.replace(/[_ ]\(.+\)$/, ""); // 曖昧さ回避を除去
                title = title.replace(/[=・~〜、。「」 !?=\/\-]/g, ""); // 無視する記号類
                title = removeTail(title, yomi);
                var re = /[ぁ-んァ-ンヴー]+/g;

                // 後ろの - から処理していく。
                // =- のように前方省略の直後に - があると誤動作の危険があるので処理しない。
                var kanas = [];
                while((lm = re.exec(title)) != null) {
                    if (lm) {
                        kanas.push(lm[0]);
                    }
                }
                console.log(">>", kanas, yomi);
                while(0 < kanas.length && yomi.indexOf("-") != -1) {
                    var kana;
                    // 読みの先頭が - の場合、先に処理する。
                    if (yomi[0] == "-") {
                        kana = kanas.shift();
                        yomi = kana + yomi.substring(1);
                        continue;
                    }
                    kana = kanas.pop();
                    yomi = yomi.replace(/^(.*?)[-]([^-]*?)$/, function(g0, g1, g2) {
                        if (g1 == "=" && kana.length != 1) return g0;
                        return g1 + kana + g2;
                    });
                }
                if (0 < kanas.length || yomi.indexOf("-") != -1) {
                    console.log("!!! 要確認 !!!", kanas, yomi);
                    comments.push("!!! 要確認 !!!");
                } else {
                    console.log("<<", yomi)
                }
                // console.log(line);
            }

            // 片仮名を平仮名に置き換え。 
            var yomi2 = filterKataHira(yomi);
            var comment = "";
            if (0 < comments.length) {
                comment = "<!-- " + comments.join(", ") + " -->";
            }
            var line2 = m[1] + "(" + comment + yomi2 + ")" + m[4];
            if (yomi != yomi2) {
                console.log("[カタカナ]", yomi)
                console.log("[ひらがな]", yomi2);
            }
            if (line != line2) {
                lines[i] = line2;
            }
        }
        var text2 = lines.join("\n");
        if (text != text2) {
            if (setWikitext(text2)) {
                appendSummary("[[User:Frozen-mikan/索引の読み仮名.js|スクリプト]]" +
                    " (" + version + ") " +
                    "による読み仮名の編集。[[Wikipedia:索引#凡例]]を参照");
                setSaveButtonDisabled(true); // 投稿ボタンの無効化 
                alert(
                    "編集中のテキストが変更されました。差分を必ず確認して下さい。\n\n" +
                    "問題を発見した場合には、使用を直ちに中止し、本スクリプトの作者に連絡して下さい。"
                    );
            }
        }
    }
    main();
})();