忍者ブログ

ぼんぷろぐ

InDesignとかイラレとかのスクリプトよもやま話

新しいブログに引っ越しました。

こちらのブログはもう更新しませんが、コメント欄は生きてますので疑問、ご指摘などありましたらどうぞ。

[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絵文字

プロフィール

kawamoto_α
(あるふぁ(仮))


InDesignで新聞組版のようなことをしています。

ツイッタ

※ブラウザによっては当ブログからDLしたzipファイルが拡張子なしになることがあるようですが、.zipを補って開いてください。



イラレ用トーンカーブスクリプト(¥1500)



クロソイド式角丸長方形スクリプト(¥500)
Illustrator用
InDesign用



イラレスクリプトをキーボードショートカットで実行するやつ(Win用)