読者です 読者をやめる 読者になる 読者になる

正規表現スタイル由来の文字スタイルをリアル文字スタイルとして適用する

 緊デジ対応の電子書籍(データ有)を作成する時、IDML経由にしろ、タグマッピングでXML経由にしろ、InDesign上の正規表現スタイルは全無視されてしまいます。そこで、段落スタイルで設定されている正規表現スタイルを順番に検索置換し、リアル文字スタイルを適用します。
 コードを見ればわかるとおり、段落スタイルの中の正規表現スタイルだけを見ます(段落スタイルに書かれていない正規表現スタイルは無視します)。オーバーライドされた文字スタイルは考慮しません。正規表現スタイルが重複している場合は、最後のスタイルだけを適用します。なお、このスクリプトはドキュメントを破壊的に変更しますので、適用後のドキュメントは保存しないようにしてください。

/*
    Apply_CharStyle_of_RegexStyle_origin.jsx
    段落スタイルに設定されている正規表現スタイル由来の文字スタイルをリアル文字列に適用します。
    段落スタイルに書かれていない正規表現スタイルは無視します(段落スタイルの中の正規表現スタイルだけを見ます)。オーバーライドされた文字スタイルは考慮しません。
    正規表現スタイルが重複している場合は、最後のスタイルだけを適用します。
    いうまでもなく、このスクリプトはドキュメントを破壊的に変更します。
    
   
    2012-06-24  とりあえず
*/

#target "InDesign"

////////////////////////////////////////////エラー処理 
function myerror(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}

////////////////////////////////////////////正規表現検索置換
/*
my_range	検索置換の範囲
my_find	検索オブジェクト ex.) {findWhat:"(わたく?し|私)"}
my_change	置換オブジェクト ex.)  {changeTo:"ぼく"}

my_changeが渡されない時は検索のみ、マッチしたオブジェクトを返す。
my_changeが渡されると置換が実行されて、返値はなし。
*/
function my_RegexFindChange(my_range, my_find, my_change) {
    //検索の初期化
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    //検索オプション
    app.findChangeGrepOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか
    app.findChangeGrepOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか
    app.findChangeGrepOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか
    app.findChangeGrepOptions.includeMasterPages = false;//マスターページを含めるかどうか
    app.findChangeGrepOptions.includeFootnotes = false;//脚注を含めるかどうか
    app.findChangeGrepOptions.kanaSensitive = true;//カナを区別するかどうか
    app.findChangeGrepOptions.widthSensitive = true;//全角半角を区別するかどうか

    app.findGrepPreferences.properties = my_find;//検索の設定
    if (my_change == null) {
        return my_range.findGrep();//検索のみの場合:マッチしたオブジェクトを返す
    } else {
        app.changeGrepPreferences.properties = my_change;//置換の設定
        my_range.changeGrep();//検索と置換の実行
    }
}



/////実行
    var my_attention = confirm("Apply_CharStyle_of_RegexStyle_origin.jsx\r    段落スタイルに設定されている正規表現スタイル由来の文字スタイルをリアル文字列に適用します。\r    段落スタイルに書かれていない正規表現スタイルは無視します(段落スタイルの中の正規表現スタイルだけを見ます)。オーバーライドされた文字スタイルは考慮しません。\r    正規表現スタイルが重複している場合は、最後のスタイルだけを適用します。\r    いうまでもなく、このスクリプトはドキュメントを破壊的に変更します。");
    if (my_attention === false){exit()};//「いいえ」ボタンで終了

if (app.documents.length === 0) {myerror("ドキュメントが開かれていません")}
var my_doc = app.documents[0];

var my_paragraph_styles = my_doc.allParagraphStyles;
for (var i = 1; i< my_paragraph_styles.length; i++) {//0番地は、「[段落スタイルなし]」
    if (my_paragraph_styles[i].nestedGrepStyles.length >0) {
        for (var ii =0; ii < my_paragraph_styles[i].nestedGrepStyles.length; ii++) {
            var my_regex_style = my_paragraph_styles[i].nestedGrepStyles[ii];//正規表現スタイル
            var my_regex = my_regex_style.grepExpression;//正規表現
            var my_char_style = my_regex_style.appliedCharacterStyle//文字スタイル
            my_RegexFindChange(my_doc, {findWhat:my_regex, appliedParagraphStyle:my_paragraph_styles[i]},{appliedCharacterStyle:my_char_style});
        }
    }
}

先頭文字スタイル*1とか、先頭行スタイルとか、どうするんだ... って思いません? ぼくも思います。「繰り返し」がなかったらできると思います*2。思うだけ。

*1:(追記:2012-07-09T11:38:52+0900)先頭文字スタイルについては、スタイルをタグにマップでタグづけできるようす。see also. http://densyodamasii.com/先頭文字/先頭行/正規表現スタイルの処理を考/

*2:あ、先頭文字スタイルは(テキスト検索の)ワイルドカード表現互換だからそれも痛いです