正規表現検索置換スクリプトの選択範囲指定

[9556]正規表現検索置換スクリプトの選択範囲指定 投稿者:ただ 投稿日:2018/12/06 14:49:19
Windows7
InDesignCS5.5です。

以前、HTMLタグの入ったテキストの正規表現検索置換でお世話になりました。
この仕事の派生で、逆に
InDesignで組んだテキストデータをHTMLタグ囲み文字に
直した状態のデータ」を納品してほしい(要はデータベースに組み込むつもりと思われます)、
という依頼が出てしまいました。

実現したいのは「選択しているテキストの内、特定の文字スタイルを< >タグ囲みにして返す」というもので、
動作自体はするのですが、どうしても「ドキュメント全体」が対象となってしまい、思った動作になりません。

正規表現検索置換のスクリプトで「選択しているテキストだけ」を対象に検索置換させる、という方法はないのでしょうか?

一応、拙い構文で見苦しいと思いますが、
以下がスクリプトになります。

//正規検索初期化
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;

//検索オプション
app.findChangeGrepOptions.widthSensitive = false;

//文字スタイル「下付き」を<SUB>囲みに戻し文字スタイル「処理済み」をあてる(重複処理防止)
app.findGrepPreferences.findWhat = ".+";
app.findGrepPreferences.appliedCharacterStyle = "下付き";
app.changeGrepPreferences.changeTo = "<SUB>$0</SUB>";
app.changeGrepPreferences.appliedCharacterStyle = "処理済み";
app.changeGrep();

//選択範囲を対象
var text = app.activeDocument.selection;
for(var i = 0; i < text.length; i++) {
text[i].changeGrep();
}

最後の「選択範囲を対象」の構文が間違っているのだと思うのですが、調べても正解が出てこないのです…。
提示いただいたソースの11行目(空白を除く)の
app.changeGrep();
で、開いでいるドキュメントすべてで置換を実行していますよ。
なので、その後の行は実質何もしていません。

余談ですが。
変数名のtextですが、InDesignのオブジェクトでtextが使用されているので、それと同じ名前の変数名だと、誤作動の可能性があったり、理解できなくなったりするのでお勧めしません。myTextとか、txtなど、オブジェクト名と被らないものを使った方がよいです。
もうひとつ。Document.selectionの数でループを掛けていますが、UIでテキストを選択する場合、複数箇所を同時に選択することはできないのでループする必要はありません。
app.activeDocument.selection[0].changeGrep();
だけでよいです。
[9558]Re: 正規表現検索置換スクリプトの選択範囲指定 投稿者:ただ 投稿日:2018/12/07 08:26:05
お〜まち様

頂いた指摘を元に修正したら見事に動きました!
ありがとうございます。感動しました!

たった一行で選択範囲指定できるんですね〜
大変助かりました。

//正規検索の初期化
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;

//検索オプション
app.findChangeGrepOptions.widthSensitive = false;

//文字スタイル「下付き」を<SUB>囲みに戻し文字スタイル「処理済み」をあてる(重複処理防止)
app.findGrepPreferences.findWhat = ".+";
app.findGrepPreferences.appliedCharacterStyle = "下付き";
app.changeGrepPreferences.changeTo = "<SUB>$0</SUB>";
app.changeGrepPreferences.appliedCharacterStyle = "処理済み";

//正規表現の選択範囲を対象
app.activeDocument.selection[0].changeGrep();
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)

このページをシェア