Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード Twitter

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2009-07-29

[][][][]簡単な検索置換

簡単な検索置換関数。だれかが必ず書いていそうだけれど、探すのもめんどいのでアップしておきます。こういうぬるい感じが身上なのです。って、みんな知ってるか^^


普通のテキスト検索置換
////////////////////////////////////////////テキスト検索置換
/*
my_range	検索置換の範囲
my_find	検索オブジェクト ex.) {findWhat:"わたし"}
my_change	置換オブジェクト ex.)  {changeTo:"ぼく"}
*/
function my_TextFindChange(my_range, my_find, my_change) {
	//検索の初期化
	app.findTextPreferences = NothingEnum.nothing;
	app.changeTextPreferences = NothingEnum.nothing;
	//検索オプション
	app.findChangeTextOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか
	app.findChangeTextOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか
	app.findChangeTextOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか
	app.findChangeTextOptions.includeMasterPages = false;//マスターページを含めるかどうか
	app.findChangeTextOptions.includeFootnotes = false;//脚注を含めるかどうか
	app.findChangeTextOptions.kanaSensitive = true;//カナを区別するかどうか
	app.findChangeTextOptions.widthSensitive = true;//全角半角を区別するかどうか

	app.findTextPreferences.properties = my_find;//検索の設定
	app.changeTextPreferences.properties = my_change;//置換の設定
	my_range.changeText();//検索と置換の実行
	//return my_range.findText();//検索のみの場合:マッチしたオブジェクトを返す
}

オプションは引数にしない。可読性重視ともいう^^ 使い方は...

var my_doc = app.documents[0];
var my_find_obj = {findWhat:"わたし"};//オブジェクトで渡す
var my_change_obj = {changeTo:"ぼく"};//オブジェクトで渡す
my_TextFindChange(my_doc, my_find_obj, my_change_obj);

何度も呼んでやれば、単純に連続置換になります。簡単なものなら「run_Queries 0.3」を使うまでもないですね。オブジェクトで渡すのは、属性の置換もできるから。こんな感じ。

var my_find_obj = {composer:"Adobe 日本語段落コンポーザ"};
var my_change_obj = {composer:"Adobe 日本語単数行コンポーザ"};
my_TextFindChange(my_doc, my_find_obj, my_change_obj);

簡単な正規表現検索置換

正規表現が使いたい時には、こちらを使う。一応、InDesign CS3にも対応。

////////////////////////////////////////////文字列を16進数にエスケープして、「\x{hex}」という形で返す。
function my_escape(str) {
	tmp_str = escape(str);
	return tmp_str.replace(/\%u([0-9A-F]+)/i, "\\x{$1}")
}
////////////////////////////////////////////正規表現検索でカタカナを16進に変換
function katakana2hex() {
	var find_str = app.findGrepPreferences.findWhat;
	while (/([ァ-ヴ])/.exec(find_str)) {
		find_str = find_str.replace(/([ァ-ヴ])/, my_escape(RegExp.$1));
	}
	app.findGrepPreferences.findWhat = find_str;//検索文字の設定
}

////////////////////////////////////////////正規表現検索置換
/*
my_range	検索置換の範囲
my_find	検索オブジェクト ex.) {findWhat:"(わたく?し|私)"}
my_change	置換オブジェクト ex.)  {changeTo:"ぼく"}
*/
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;//検索の設定
	app.changeGrepPreferences.properties = my_change;//置換の設定
	
	if (parseInt(app.version) === 5) {
		katakana2hex();//InDesign CS3でカタカナにマッチしないバグ回避
	}

	my_range.changeGrep();//検索と置換の実行
	//return my_range.findGrep();//検索のみの場合:マッチしたオブジェクトを返す
}

使い方は同じですね。ちなみに、オブジェクトで渡すと複数の属性を一度にセットできます。

var my_doc = app.documents[0];
var my_find_obj = {findWhat:"(私|わたく?し|ワタク?シ)", composer:"Adobe 日本語段落コンポーザ"};
var my_change_obj = {changeTo:"ぼく", composer:"Adobe 日本語単数行コンポーザ"};
my_RegexFindChange(my_doc, my_find_obj, my_change_obj);

ちなみに、段落スタイルグループに対応しないんじゃないの? と心配性の人もいるかもしれません。たとえば、図のような階層になってるとします。

f:id:seuzo:20090729012303p:image

この「本文A」を「本文B」に変えるには、こんな感じになります。

var my_doc = app.documents[0];
var my_pragraphStyle_A = my_doc.paragraphStyleGroups.itemByName("A").paragraphStyles.itemByName("本文A");
var my_pragraphStyle_B = my_doc.paragraphStyleGroups.itemByName("B").paragraphStyles.itemByName("本文B");
var my_find_obj = {appliedParagraphStyle:my_pragraphStyle_A};
var my_change_obj = {appliedParagraphStyle:my_pragraphStyle_B};
my_TextFindChange(my_doc, my_find_obj, my_change_obj);

サンプルの「FindChangeByList.jsx」なんかも同じ仕組みだから、おそらくダラダラ書くと出来るような気がします。検証していませんが^^

(追記:2009-07-29T02:00:00 JST)InDesign Scriptingフォーラムでは出来るって書いてありますね。どこまでも他力本願^^

Adobe Forums: Style groups in Find/Replace by list

k_ikik_iki 2009/07/29 08:25 いえいえ、ぬるくないです。
文字扱う身にとって、こういうの大好きw

seuzoseuzo 2009/07/29 10:16 豪華なごちそうや珍味にこころ惹かれてしまうのです^^
毎日たべるみそ汁やお新香も、おなじように大事なんですけれどね。

初心者の人が「あ、これならオレにもできそう」って遊んでもらえれば幸甚。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/seuzo/20090729/1248798401
リンク元