2017年1月27日

ちょいスクリプト:ルビを統合する

韓国の人の姓名にカタカナのふりがなをつけていた(姓と名のふりがなは「・」で区切る)。

当初、字音ルビとして1文字ずつのモノルビとしたけれど、連音もあるので名の部分についてはグループルビにとの指示があったので、そのように直した(姓はモノルビのまま)。
ところが、こんどは、字間が開きすぎているから、姓・名全体をグループルビにしてほしいと新たな指示が……

モノルビにせよグループルビにせよ、分けて付けてあるルビを一つにまとめようとすると、手作業ではいま付いているルビをいったん消して、新たにルビを付け直すことになる。これでは入力ミスが起こりかねないので、スクリプトで処理することにした。

//統合したい部分は検索など何らかの方法で選択してあるものとする。
var oyaStr = app.activeDocument.selection[0];
var oyaChars = oyaStr.characters;
var newRuby = "";
var prevcharRuby = "";

//親文字列1文字ずつについてルビを読んでいく。
for ( C = 0; C < oyaChars.length; C++ ) {

//前の親文字のルビと同じだったら何もしない。
//【注意!】同じ読みが連続している場合は一つ消えるので、後で修正が必要。
//そうでなければ、新しいルビ文字列に書き足す。
        if ( oyaChars[C].rubyString !== prevcharRuby ) {
                newRuby = newRuby + oyaChars[C].rubyString;
        }
//現在の親文字のルビを、次の親文字のルビと比較するため、変数prevcharRubyに取っておく。
        prevcharRuby = oyaChars[C].rubyString;

//現在の親文字のルビを消し、前後のアキも「自動」に戻す。
        oyaChars[C].rubyString = "";
        oyaChars[C].rubyFlag = false;
        oyaChars[C].leadingAki = -1;
        oyaChars[C].trailingAki = -1;
}
//以上の操作で収集したルビ文字列を選択部分のルビとする。
oyaStr.rubyString = newRuby.replace(/\u0020|\u3000/g,"");

//以下は組方の設定。
oyaStr.rubyType = RubyTypes.GROUP_RUBY;
oyaStr.rubyAlignment = RubyAlignments.RUBY_JIS;
oyaStr.rubyParentSpacing = RubyParentSpacing.RUBY_PARENT_121_AKI;
oyaStr.rubyFlag = true;
oyaStr.rubyXOffset = 0;

グループルビでは、全体のルビが個々の親文字それぞれのルビ文字列だとされているようなので、ルビ文字列をただ連結していくと、同じルビが繰り返されることになる。それを避けようと、同じルビ文字列は付け足さないようにしている。
ただし、同じ読みを重ねるような姓名の場合、一つ消えてしまうことになるので注意!

〔1月28日修正〕
  • if文のところが冗長だったので整理した。(elseは必須でないのにいまごろ気付いた)
  • 収集したルビ文字列を選択部分のルビとするとき、モノルビの箇所で区切りに使っていた空白文字が残っているのを削除するようにした。

なお、このスクリプトは、たけうちとおるさんの「グループルビをモノルビに、モノルビをグループルビに」を参考にさせていただいた。

0 件のコメント:

コメントを投稿