のヮの@no05071730


五十路男の独り言集。
乱筆乱文はご容赦ください。

今さらながらのInDesignの〓(ゲタ)ルビスクリプト

2022年06月06日 22時49分09秒 | パソコン

はい、またまたルビ作業のお話です。

 

職場でInDesign組版が少しずつ動いていまして、テンプレートデータをつくって、xmlの取り込み書き出しあたりをまとめて、残った懸念点はInDesign上でのルビ振り機能です。

そもそも、日本語IMはInDesignに組み込んであるわけではないので、Word~MSIMEのようにネイティブ動作はしないんですよね。なので、InDesignが出始めた当初から「〓漢字《るび》」に整形してからInDesignに取り込んで、スクリプトを回すことで、一括ルビ振りっぽいことを行ってきた歴史があります。

※唐突ですが、歴戦の勇者(開発者)の皆さま、本当にありがとうございます。あなたたちが積み重ねてきたモノがあるから、ワタクシたちが気軽にコードをカキカキできるのです。

 

で、勉強はした事あるけどまったく触っていなかったjavascriptで、InDesignのスクリプトを文字通り勉強がてら書いてみた結果、ひとまず動作する物ができました。

 

//-------------------------------
//@target "indesign";

var aDoc=app.activeDocument;
var aPgObj = app.activeDocument.pages;
var aTxfr;
var aTxct;
var aObj;
var feature1;
var feature2;
 
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "〓([一-龠々]{1,})(《[ぁ-ん]{1,}》)";

for (var i=0; i
    for (var j=0; j
        aTxfr = aPgObj[i].textFrames[j];
        aTxct = aPgObj[i].textFrames[j].contents; 
        var result = aTxfr.findGrep();
        if (result){
            for(l=0;l
                result[l].select();
                aStr=result[l].contents;
                feature2=rubySlice(aStr);
                var sStr=aStr.substr(1,feature2[1]-2);
                var rubyStr=feature2[0];
                var sNum=feature2[1];
                result[l].select();                       
                aObj = aDoc.selection[0];
                aObj.contents=aObj.contents.replace(aStr,sStr);
                aObj.rubyString = rubyStr;
                if(aObj.length
                    aObj.rubyType = RubyTypes.PER_CHARACTER_RUBY;
                }else{
                    aObj.rubyType = RubyTypes.GROUP_RUBY;
                }
            
                aObj.rubyFlag = true;
            }
        }
    }
}

//-------------------------------
 
function rubySlice(rsltStr){
    for(var x=0; x
        //cutStr = rsltStr.charAt(k);
        if(rsltStr[x] != "《" ) continue;
        var s=x+1;
    }
    var remStr=rsltStr.slice(s,rsltStr.length-1);
    var sliNum=s;
 
    return[remStr,sliNum];
}
 
//--------------------------------   

function rubyCheck(rObj){
    var u=0;
    var v=0;
    var y=0;
    for(var a=0;a
        result[l].characters[a].select();
        aObj = aDoc.selection[0];
        var rFlg=aObj.rubyFlag;
        if(rFlg=true){
            u=u+1;
        }else{
            v=v+1;
            if(v==1){
                y=a;
            }
        }
    }
    return[u,v];
}

//--------------------------------   

 

正規表現で「〓漢字《るび》」を検索して、ヒットしたら選択状態にして、関数でルビと親文字の範囲値を割り出して、検索文字と親文字をさしかえて、ルビを振る、という何の変哲もない流れです。いま見ると消してもいいセンテンスがありますね。なぜか、親文字となる漢字が二文字以上はグループルビにするという、地味な事をしております。

最近はVBAばかりいじっていたので、書き方がVBAになっています(´・ω・`) エラー処理とかよくわからなかったので、現段階では「とりあえず動作するもの」としています。いくつか文字列のパターンを試して、複数ページで試して、エラーもなく動作していました。もしかしたら出るかもしれない不具合はこれから直します、的な立ち位置。

ちなみに一番下の「rubyCheck(rObj)」は、実は途中まで〓(ゲタ)をはかせないまま「漢字《るび》」だけでできないか、とこねくり回していたのですが、その最中にできあがった、rubyFlagの有無チェックです。なんとなく残してあります。上手く動いていなかったような…まあいいや。

たぶん、見る人が見れば「コードが汚い」「セオリー無視してる」「こんな書き方しない」などなど突っ込みどころ満載でしょう。何かありましたら、優しく声をかけて下さいね。というかアドバイス下さい<(_ _)>

 

 

あ、ちなみに開発環境は「InDesign CS6」です(´・ω・`)<会社は2020...

 

 

※仕事で書いたコードなので、問題があれば消しますデス

 

 



最新の画像もっと見る

コメントを投稿