Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2009-05-18

[][][]クエリを使った連続検索置換「run_Queries 0.3」

何をするスクリプトか?

  • 指定した複数のクエリを連続実行します。違うタイプの検索モードを混在できます。
  • 検索(置換)範囲を「選択範囲」「ストーリー」「ドキュメント」から選べます。
  • クエリを使用するので、スタイルグループ内のスタイルも指定可能です。
  • オブジェクト検索については未完全なサポート(検索範囲「ドキュメント」のみサポート)

同梱ファイル2Files

  • Readme.txt このファイルです。とにかく最初によんでください。
  • run_Queries.jsx スクリプト本体です。

使用条件

このスクリプトが正常に動作する環境は以下の通りです。Windows環境でも動作する可能性がありますが未検証です。

  • MacOS X10.5.7
  • InDesign CS4_J(6.0.2)

ダウンロード

http://www.seuzo.jp/st/scripts_InDesignCS4/index.html#run_Queries


インストール

スクリプト本体(run_Queries.jsx)を

~/Library/Preferences/Adobe InDesign/Version 6.0-J/ja_JP/Scripts/Scripts Panel/

にコピーしてください。エイリアスを入れておくだけでもかまいません。

スクリプトパレットから使用します。


設定

0)スクリプトで使用したいクエリを設定します。クエリの保存方法は、http://help.adobe.com/ja_JP/InDesign/6.0/WSB4D7E9CD-F741-40a0-A72A-1DB0E6089630a.htmlを参照してください。

1)スクリプトパレット上で「run_Queries.jsx」を選択し、パレットメニューから「スクリプトを編集」を選びます。

2)もし「スクリプトを実行しますか?」とダイアログが出たら、「いいえ」を選択します。

3)「ExtendScript Toolkit.app」が立ち上がり、コードが表示されます。24行目付近の

var my_Queries = [
["transliterate","半角カナ"],
["glyph","葛飾区"],
["text","カンマ"],
["grep","大見出し"],
["grep","中見出し"],
["grep","小見出し"],
["grep","図太字"],
];

部分を書き換えます。書式は

["モード", "クエリ名"],

となっており、指定モードは「text」がテキスト、「grep」が正規表現、「glyph」が字形、「object」がオブジェクト、「transliterate」が文字種変換になっています。書いた順に上から実行されます。

ただし、objectモードのサポートは不完全で、ドキュメントを対象にした時にだけ有効になります。それ以外の検索範囲をobjectモードで仕様するとエラーになります。

4)書き換えが終了したら、保存して閉じます。


使用方法

0)「ウインドウ」メニューから「スクリプティング」ー「スクリプト」を選択し、スクリプトパレットを出します。

1)「選択範囲」または「ストーリー」から検索置換したい場合は、該当範囲またストーリーの一部をテキストツールで選択しておきます。

2)スクリプトパレットから、スクリプト「run_Queries.jsx」をダブルクリックします。

3)検索範囲を「選択範囲」「ストーリー」「ドキュメント」からひとつ選び、「OK」をクリックします

4)現在の設定がダイアログで表示されるので、この設定でOKであれば「はい」をクリックします。

5)処理が始まります。


既知の不具合、またはToDo

オブジェクト検索については未完全なサポート(検索範囲ドキュメントのみサポート)

grepモードでクエリに詳細形式を保存できないInDesignのバグをどうするか?

http://www2.rocketbbs.com/11/bbs.cgi?id=thats&mode=pickup&no=483


免責事項

  • 本アプリケーションはInDesignにおける作業効率支援なのであって、処理結果を保証するものではありません。かならず確認をされることをおすすめします。
  • このツールを使用する上でデータの破損などのあらゆる不具合・不利益については一切の責任を負いかねますのでご了解ください。
  • このツールはすべてのMacintoshMac OS上で動作をするという確認をとっていませんし、事実上出来ません。したがって、動作を保証するものではありません。

ライセンス

GNU GPLv3

http://sourceforge.jp/projects/opensource/wiki/licenses%252FGNU_General_Public_License_version_3.0


履 歴

2008-07-21 ver.0.1 とりあえず。http://d.hatena.ne.jp/seuzo/20080601/1212331508 の改良版。クエリを利用することで、モード、スタイルグループ、詳細形式を扱えるようにした。

2008-08-05 var.0.2 選択範囲がTextStyleRangeの時も正常に動作するようにした。選択範囲ダイアログで「キャンセル」をクリックした時、スクリプトが終了するようにした。

2009-05-18 ver.0.3 InDesign CS4対応。


ソースコード

/*
run_Queries.jsx
(c)2008-2009 www.seuzo.jp
指定された検索クエリを連続実行します。

●履歴
2008-07-21	ver.0.1	とりあえず。http://d.hatena.ne.jp/seuzo/20080601/1212331508 の改良版。クエリを利用することで、モード、スタイルグループ、詳細形式を扱えるようにした。
2008-08-05	var.0.2	選択範囲がTextStyleRangeの時も正常に動作するようにした。選択範囲ダイアログで「キャンセル」をクリックした時、スクリプトが終了するようにした。
2009-05-18	ver.0.3	InDesign CS4対応。

*/

//ターゲットをInDesignにする
#target "InDesign"

////////////////////////////////////////////★ここでクエリを設定する。書式は["モード", "クエリ名"],
//指定モードは下記の通り
//text	テキスト
//grep	正規表現
//glyph	字形
//object	オブジェクト(不完全)
//transliterate	文字種変換

var my_Queries = [
["transliterate","半角カナ"],
["glyph","葛飾区"],
["text","カンマ"],
["grep","大見出し"],
["grep","中見出し"],
["grep","小見出し"],
["grep","図太字"],
];







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

////////////////////////////////////////////ラジオダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ラジオボタンに展開するリスト

result	選択したリスト番号
*/
function radioDialog(my_title, my_prompt, my_list){
	var my_dialog = app.dialogs.add({name:my_title, canCancel:true});
	with(my_dialog) {
		with(dialogColumns.add()) {
			// プロンプト
			staticTexts.add({staticLabel:my_prompt});
			with (borderPanels.add()) {
				var my_radio_group = radiobuttonGroups.add();
				with (my_radio_group) {
					for (var i = 0; i < my_list.length; i++){
						if (i == 0) {
							radiobuttonControls.add({staticLabel:my_list[i], checkedState:true});
						} else {
						radiobuttonControls.add({staticLabel:my_list[i]});
						}
					}
				}
			}
		}
	}
	if (my_dialog.show() == true) {
		var ans = my_radio_group.selectedButton;
		//正常にダイアログを片付ける
		my_dialog.destroy();
		//選択したアイテムの番号を返す
		return ans;
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		my_dialog.destroy();
	}
}

////////////////////////////////////////////選択テキストのストーリを返す。選択チェックを兼ねる。
function get_story() {
	var mydocument = app.activeDocument;
	if (mydocument.selection.length == 0) {myerror("テキストを選択してください")}
	var myselection = mydocument.selection[0];
	var myclass =myselection.reflect.name;
	myclass = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange".match(myclass);
	if (myclass == null) {myerror("テキストを選択してください")}
	return myselection.parentStory;//ストーリーオブジェクトを返す
}

////////////////////////////////////////////文字列を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;//検索文字の設定
}


////////////////////////////////////////////以下処理
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var mydocument = app.activeDocument;

//検索範囲を指定
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
var my_range = radioDialog("run_Queries", "検索範囲を指定してください", ["選択範囲", "ストーリー", "ドキュメント"]);
if (my_range ==0) {//選択範囲
	get_story();//選択チェックとして使用
	var my_range_obj = mydocument.selection[0];
} else if (my_range == 1) {//ストーリー
	var my_range_obj = get_story();
} else if (my_range == 2) {//"ドキュメント"
	var my_range_obj = mydocument;
} else {
	myerror("処理をキャンセルしました");
}

//現在の設定を表示
var tmp = "現在の設定は下記の通りです\r";
for (var i = 0; i < my_Queries.length; i++){
tmp += my_Queries[i] + "\r";
}
if (! (confirm(tmp))) {myerror("")};//「いいえ」を選んだらエラーで中止


//検索置換
for (var i = 0; i < my_Queries.length; i++){
	try {
		var my_query_name = my_Queries[i][1];
		var my_mode = my_Queries[i][0];
		if (my_mode == "text") {
			my_mode = SearchModes.TEXT_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			my_range_obj.changeText();
		} else if (my_mode == "grep") {
			my_mode = SearchModes.GREP_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			if (parseInt(app.version) == 5) {
				katakana2hex();//カタカナにマッチしないバグ回避
			}
			my_range_obj.changeGrep();
		} else if (my_mode == "glyph") {
			my_mode = SearchModes.GLYPH_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			my_range_obj.changeGlyph ();
		} else if (my_mode == "object") {
			my_mode = SearchModes.OBJECT_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			my_range_obj.changeObject();
		} else if (my_mode == "transliterate") {
			my_mode = SearchModes.TRANSLITERATE_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			my_range_obj.changeTransliterate();
		} else {myerror("モードの記述が不正です:" +my_Queries[i][0] + ":" + my_query_name)}
	} catch(e) {
		myerror("エラーが発生しました:" + my_Queries[i][0] + ":" + my_query_name + "\r" + e);
	}
}

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


画像認証

トラックバック - http://d.hatena.ne.jp/seuzo/20090518/1242630850