k_ikiの雑記帳

DTPのこと、創作のことなど、思いつくまま

ルビ文字置換

ルビの検索置換 - 名もないテクノ手について、同じくせうぞー師匠んちの「run_Queries」のソースを追加して検索範囲を設定できるようにしました。
ついでに、親文字/ルビ文字/置換後のルビ文字 について、ユーザーが入力できるようにしました。

動作確認環境:WindowsXP sp3/InDesign CS5(7.0.4)
 

var my_find_p = prompt("検索するルビの親文字(列)を入力してください。");
var my_find_ruby = prompt("検索するルビ文字(列)を入力してください。");
var my_change_str =prompt("置換したいルビ文字(列)を入力してください。");

////////////////////////////////////////////エラー処理 
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;//ストーリーオブジェクトを返す
}

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

//検索範囲を指定
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
var my_range = radioDialog("rubystring_replace", "検索範囲を指定してください", ["選択範囲", "ストーリー", "ドキュメント"]);
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("処理をキャンセルしました");
}

function my_RegexFindChange(my_range, my_find) {
	//検索の初期化
	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;//検索の設定

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

var my_doc = app.documents[0];
var my_texts = my_RegexFindChange(my_doc, {findWhat:my_find_p});
for (var i = 0; i < my_texts.length; i++) {
    my_texts[i].rubyString = my_texts[i].rubyString.replace(my_find_ruby, my_change_str);
}