濁点・半濁音の結合(1文字化)マクロ

  1. どうもお世話になってます
    ずっと欲しかった
    濁点・半濁音の結合(1文字化)マクロ
    今ならAIで作れるのではと思い試すと出来ました
    Mery 3.8.3で問題無く動作してます
    QuickJS
    #language = “quickjs”
    でも動作しました
    動作画像 https://imgur.com/ppaBXoC
    ほんとこの文字厄介でたまにダウンロードしたファイルに含まれますが
    ファイラーやビューアで表示出来ないやエラーが出るし
    たくさん含まれているとリネームも面倒なので大変でした
    間違いがあれば指摘お願いします

    NormalizeDakuten.js

    #title="濁点・半濁音の結合(1文字化)"
    // 選択範囲、またはファイル全体の分離した濁点・半濁点を1文字に結合します
    
    var sel = document.selection;
    var isEmpty = sel.IsEmpty;
    
    // テキストが選択されていない場合はファイル全体を選択
    if (isEmpty) {
        sel.SelectAll();
    }
    
    var text = sel.Text;
    
    if (text !== "") {
        // 半濁音の変換辞書
        var handakuMap = {
            "は":"ぱ", "ひ":"ぴ", "ふ":"ぷ", "へ":"ぺ", "ほ":"ぽ",
            "ハ":"パ", "ヒ":"ピ", "フ":"プ", "ヘ":"ペ", "ホ":"ポ"
        };
    
        // 濁音の変換辞書
        var dakuMap = {
            "か":"が", "き":"ぎ", "く":"ぐ", "け":"げ", "こ":"ご",
            "さ":"ざ", "し":"じ", "す":"ず", "せ":"ぜ", "そ":"ぞ",
            "た":"だ", "ち":"ぢ", "つ":"づ", "て":"で", "と":"ど",
            "は":"ば", "ひ":"び", "ふ":"ぶ", "へ":"べ", "ほ":"ぼ",
            "う":"ゔ", "ゝ":"ゞ",
            "カ":"ガ", "キ":"ギ", "ク":"グ", "ケ":"ゲ", "コ":"ゴ",
            "サ":"ザ", "シ":"ジ", "ス":"ズ", "セ":"ゼ", "ソ":"ゾ",
            "タ":"ダ", "チ":"ヂ", "ツ":"ヅ", "テ":"デ", "ト":"ド",
            "ハ":"バ", "ヒ":"ビ", "フ":"ブ", "ヘ":"ベ", "ホ":"ボ",
            "ウ":"ヴ", "ヽ":"ヾ", "ワ":"ヷ", "ヰ":"ヸ", "ヱ":"ヹ", "ヲ":"ヺ"
        };
    
        // 半濁点(結合文字 U+309A, 独立文字 U+309C, 半角 U+FF9F)の置換
        text = text.replace(/([はひふへほハヒフヘホ])[\u309A\u309C\uFF9F]/g, function(match, p1) {
            return handakuMap[p1];
        });
    
        // 濁点(結合文字 U+3099, 独立文字 U+309B, 半角 U+FF9E)の置換
        text = text.replace(/([かきくけこさしすせそたちつてとはひふへほうゝカキクケコサシスセソタチツテトハヒフヘホウヽワヰヱヲ])[\u3099\u309B\uFF9E]/g, function(match, p1) {
            return dakuMap[p1];
        });
    
        // 置換したテキストを反映
        sel.Text = text;
    }
    
    // もともと非選択状態だった場合は、全体選択を解除してカーソルを先頭に戻す
    if (isEmpty) {
        // meCollapseStart は定数(0)
        sel.Collapse(0); 
    }
    
    
     |  kiyohiro  |  返信
  2. ご投稿ありがとうございます。

    濁点、半濁音の結合については、なかなか悩ましい問題ですよね。

    Unicode の正規化では、たとえば「が」U+304B U+3099 を「が」U+304C に変換するようなケースであれば、ucky さんが MeryWiki に投稿してくださっているマクロで対応可能かと思います。

    【MeryWiki】https://www.haijin-boys.com/wiki/Unicode正規化

    一方で、「か゛」U+304B U+309B や「が」U+304B U+FF9E のような組み合わせについては、Unicode の正規化だけでは対応が難しいため、このようなケースに対応するマクロも実用的で、用途に応じて使い分けができそうですね。

    また、QuickJS でも問題なく動作しているとのことで、動作検証のご協力もありがとうございます。

     |  Kuro  |  返信
  3. Kuroさん回答ありがとうございます
    マクロライブラリ
    に投稿してみました
    間違ってたらスイマセン

     |  kiyohiro  |  返信
  4. MeryWiki へのご投稿ありがとうございます。

    内容も拝見しましたが、問題なさそうです👍

    MeryWiki はウィキペディアと同じ MediaWiki というシステムで動いています。

    最近のマークダウンとはちょっと書き方が違うところもあるので、最初は少し戸惑うかもしれません。

    書式の決まりは特にないので、既存のページを見ながら「こんな感じかな」と思うかたちで編集していくのが自然です。

    もし書き方や内容に間違いがあっても、誰かが直してくれたり、そっと教えてくれる、そんな優しい文化です。(たぶん)

    マクロの保存場所として使ったり、作りかけのマクロを記録しておくなど、気軽に投稿して大丈夫です。

    初めてでも無理せず、楽しみながら使ってみてくださいね。

     |  Kuro  |  返信
  5. 濁音・半濁音に特化していて半角や合成用でない濁点・半濁点にも対応しているので便利そうですね!

    > 間違いがあれば指摘お願いします

    最後の sel.Collapse(0); はたぶん意図した動きにはなっていないと思います。

    // 置換したテキストを反映
    sel.Text = text;
    

    の時点で選択が解除されるので、選択範囲を解除する Collapse メソッドが効いてないです。
    先頭にカーソルを移したい場合は

    // もともと非選択状態だった場合は、カーソルを文書の先頭に移動
    if (isEmpty) {
        sel.StartOfDocument();
    }
    

    とするといいと思います。

    ちなみに、QuickJS で実行する場合は、
    #language = “quickjs” ではなく
    #language = "quickjs" ですね。

     |  ucky  |  返信
  6. Kuroさん回答ありがとうございます
    MeryWikiも使い方がよくわからなかったのでAIに手順とテンプレートを書いてもらいました

    uckyさんアドバイスありがとうございます
    MeryWiki修正しました
    QuickJSはKuroさんの元記事からコピーしたのですが
    貼り付けた時に変換されたみたいです
    MeryWikiの方も変換され修正に困りこれまたAIに助けてもらいました

    #title="濁点・半濁音の結合(1文字化)"
    // 選択範囲、またはファイル全体の分離した濁点・半濁点を1文字に結合します
    
    var sel = document.selection;
    var isEmpty = sel.IsEmpty;
    
    // テキストが選択されていない場合はファイル全体を選択
    if (isEmpty) {
        sel.SelectAll();
    }
    
    var text = sel.Text;
    
    if (text !== "") {
        // 半濁音の変換辞書
        var handakuMap = {
            "は":"ぱ", "ひ":"ぴ", "ふ":"ぷ", "へ":"ぺ", "ほ":"ぽ",
            "ハ":"パ", "ヒ":"ピ", "フ":"プ", "ヘ":"ペ", "ホ":"ポ"
        };
    
        // 濁音の変換辞書
        var dakuMap = {
            "か":"が", "き":"ぎ", "く":"ぐ", "け":"げ", "こ":"ご",
            "さ":"ざ", "し":"じ", "す":"ず", "せ":"ぜ", "そ":"ぞ",
            "た":"だ", "ち":"ぢ", "つ":"づ", "て":"で", "と":"ど",
            "は":"ば", "ひ":"び", "ふ":"ぶ", "へ":"べ", "ほ":"ぼ",
            "う":"ゔ", "ゝ":"ゞ",
            "カ":"ガ", "キ":"ギ", "ク":"グ", "ケ":"ゲ", "コ":"ゴ",
            "サ":"ザ", "シ":"ジ", "ス":"ズ", "セ":"ゼ", "ソ":"ゾ",
            "タ":"ダ", "チ":"ヂ", "ツ":"ヅ", "テ":"デ", "ト":"ド",
            "ハ":"バ", "ヒ":"ビ", "フ":"ブ", "ヘ":"ベ", "ホ":"ボ",
            "ウ":"ヴ", "ヽ":"ヾ", "ワ":"ヷ", "ヰ":"ヸ", "ヱ":"ヹ", "ヲ":"ヺ"
        };
    
        // 半濁点(結合文字 U+309A, 独立文字 U+309C, 半角 U+FF9F)の置換
        text = text.replace(/([はひふへほハヒフヘホ])[\u309A\u309C\uFF9F]/g, function(match, p1) {
            return handakuMap[p1];
        });
    
        // 濁点(結合文字 U+3099, 独立文字 U+309B, 半角 U+FF9E)の置換
        text = text.replace(/([かきくけこさしすせそたちつてとはひふへほうゝカキクケコサシスセソタチツテトハヒフヘホウヽワヰヱヲ])[\u3099\u309B\uFF9E]/g, function(match, p1) {
            return dakuMap[p1];
        });
    
        // 置換したテキストを反映
        sel.Text = text;
    }
    
    // もともと非選択状態だった場合は、カーソルを文書の先頭に移動
    if (isEmpty) {
        sel.StartOfDocument();
    }
    
     |  kiyohiro  |  返信
スポンサーリンク