忍者ブログ

ぼんぷろぐ

InDesign、イラレ、フォトショ(CS6 Win)の勉強中。。。(旧まとめいみブログ)

[InDesign]
洋数字を漢数字にするスクリプト

InDesign上で範囲テキスト、テキストフレーム、テキストフレームを含むグループ、または表のセルを選択(複数選択可)して実行すると、
選択範囲内にある洋数字が漢数字に変換されます。

ダウンロード

(2015.04.15 ちょっと更新)
・カーソルを置いてる状態では、その親(ストーリー、セル、脚注など)を対象にするようにした。
[洋数字を漢数字にver1.1]

[洋数字を漢数字にver1.0]


1000を一〇〇〇に.jsx
1000を一千に.jsx
1000を千に.jsx
の3点セットになってます。

数字を漢数字に変換する関数は、テキストエディタのキーマクロで使ってた連続正規表現置換をまんまJavaScriptのreplace関数にしただけの
・全角/半角両対応
・兆、京の次の垓まで対応
・小数は非対応
ていう適当仕様ですが、もっといいJavaScriptのコードはググればいっぱい出てくるので、適宜書き換えましょう(書き換え方は後述)。

以下『1000を千に』のソース

ChangeGrepX(
    "\\d+",
    function(s){
        s=s.replace(/[00]/g,"〇");
        s=s.replace(/[11]/g,"一");
        s=s.replace(/[22]/g,"二");
        s=s.replace(/[33]/g,"三");
        s=s.replace(/[44]/g,"四");
        s=s.replace(/[55]/g,"五");
        s=s.replace(/[66]/g,"六");
        s=s.replace(/[77]/g,"七");
        s=s.replace(/[88]/g,"八");
        s=s.replace(/[99]/g,"九");
        s=s.replace(/([〇一二三四五六七八九]+)([〇一二三四五六七八九]{20})/,"$1垓$2");
        s=s.replace(/([〇一二三四五六七八九]+)([〇一二三四五六七八九]{16})/,"$1京$2");
        s=s.replace(/([〇一二三四五六七八九]+)([〇一二三四五六七八九]{12})/,"$1兆$2");
        s=s.replace(/([〇一二三四五六七八九]+)([〇一二三四五六七八九]{8})/,"$1億$2");
        s=s.replace(/([〇一二三四五六七八九]+)([〇一二三四五六七八九]{4})/,"$1万$2");
        s=s.replace(/([〇一二三四五六七八九])([〇一二三四五六七八九]{3})/g,"$1千$2");
        s=s.replace(/([〇一二三四五六七八九])([〇一二三四五六七八九]{2})/g,"$1百$2");
        s=s.replace(/([〇一二三四五六七八九])([〇一二三四五六七八九])/g,"$1十$2");
        s=s.replace(/一([千百十])/g,"$1");//
        s=s.replace(/([千百十])〇([垓京兆億万])/g,"$1$2");
        s=s.replace(/〇[垓京兆億万千百十]/g,"");
        s=s.replace(/〇/g,"");
        return s;
    }
)

function ChangeGrepX(regstr,func) {
    if (app.scriptPreferences.version>=7) {
        app.doScript(ChangeGrepXMain,ScriptLanguage.JAVASCRIPT,[],UndoModes.ENTIRE_SCRIPT);
    } else {
        ChangeGrepXMain();
    }
    function ChangeGrepXMain(){
        var SelTexts=getTextObjs(app.activeDocument.selection);
        app.findGrepPreferences=NothingEnum.nothing;
        app.findGrepPreferences.findWhat =regstr;
        for (var i=0;i<SelTexts.length;i++){
            if (SelTexts[i].contents=="") continue;
            var foundTexts=SelTexts[i].findGrep();
            for (var j=foundTexts.length-1;j>=0;j--){
                foundTexts[j].contents=func(foundTexts[j].contents);
            }
        }
        function getTextObjs(Objs) {
            var TextObjs=[];
            for (var n=0;n<Objs.length;n++){
                if (Objs[n].constructor.name=="Table") {
                    TextObjs=TextObjs.concat(Objs[n].cells.everyItem().texts[0].getElements());
                } else if (Objs[n].hasOwnProperty("texts")) {
                    TextObjs=TextObjs.concat(Objs[n].texts.everyItem().getElements());
                } else if (Objs[n].constructor.name=="Group") {
                    TextObjs=TextObjs.concat(getTextObjs(Objs[n].pageItems.everyItem().getElements()));
                }
            }
            return TextObjs;
        }
    }
}

ご覧のとおり(見にくいけど)、
InDesignオブジェクト上であれこれやる処理は全部ChangeGrepXって関数の中に押し込んであって、
あとはそこに検索に使う正規表現と、
マッチした文字列を受け取って置換後の文字列を返す関数を渡すだけ
って形になってます。

つまりChangeGrepXの引数をちょろっと書き換えれば、
誰でも(InDesignスクリプトを知らない人でもJavaScriptで文字列をいじる関数が書ければ)正規表現置換だけでは対処できないような置換を行うスクリプトが作れるね!というお話。


使用例
・数字に3桁ごとのカンマを入れる(小数点以下は入れない)
ChangeGrepX(
    "(?<![\\.\\d])\\d+",
    function(s){
        return (s.length>3?arguments.callee(s.slice(0,-3))+","+s.slice(-3):s);
    }
)

・数字の間のカンマを消す
ChangeGrepX(
    "\\d+(\\,\\d+)+",
    function(s){
        return s.replace(/\,/g,"");
    }
)

第一引数はJavaScriptのRegExpでなくて、InDesignの『検索と置換』ダイアログで使うのと同等の正規表現(先読み後読みも使える!)を文字列として書きます。\を\\に置き換えなきゃいけないことに注意。
PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

プロフィール

あるふぁ(仮)
InDesignで新聞組版のようなことをしてる人です。

InDesignスクリプトについて

つくったInDesignスクリプトのまとめ

twitter

フリーエリア