[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(DTPtechNote:1152) Re: replace-words-with-selection β



なんていうか,まだβなんだけど^^;;
CS用に書き換えてみました。
おうち使い用。。。かな。


(*
replace-words-with-selection 0.2
(c)2003-2005 www.seuzo.jp
特定の文字列を、InDesign上で選択しているインライングラフィックス(またはテキスト)に置換する
●ToDo;
問題点:大きなドキュメントまたはストーリーに対して実行すると,極端に速度が下がる。selectする時の描画のせいだと思う。

●history
2003.05.02	ver.0.1	とりあえず版
2005.06.04	ver.0.2	InDesign CSバージョン。あまりに遅いのでプログレスバーを出してみた
*)

property find_text : ""

--------------------------------------------------------●コントロールルーチン
--★警告
my my_error("このスクリプトはInDesignドキュメント上のテキストの連続置換をします。そのために組み版が変わるかもしれません。それでも続行しますか?", false)

--★起動チェック
my ver()
my doc_exists()
my copy_selection()

--★実行
tell application "InDesign CS_J"
	activate
	set ANS to (display dialog "現在選択中のオブジェクトを検索文字列と置き換えます" & return & "検索文字列:" default answer find_text buttons {"キャンセル", "ストーリー", "ドキュメント"} default button 3 with icon 1)
	set find_text to text returned of ANS
	set find_range to button returned of ANS
end tell
set count_hit to my do_it(find_text, find_range)

--★終了ダイアログ
tell application "ShowProgressBar" to quit
tell application "InDesign CS_J"
	activate
	if count_hit > 0 then
		display dialog "とりあえず" & count_hit & "箇所の置換を実行しました"
	else
		display dialog "とりあえず、置換すべき箇所は見あたりませんでした。"
	end if
end tell


--------------------------------------------------------●置換実行ルーチン
to do_it(find_text, find_range)
	tell application "InDesign CS_J"
		set find preferences to nothing -- 既存の検索環境設定を初期化します。
		
		--検索してオブジェクトを拾う
		try
			if find_range is "ストーリー" then
				set hit_object to search (parent story of selection) with find attributes {find text:find_text, kana sensitive:true}
			else
				set hit_object to search document 1 with find attributes {find text:find_text, kana sensitive:true}
			end if
			set count_hit to length of hit_object
		on error
			my my_error("検索中にエラーが発生しました。", false)
		end try
		
		---hit_objectを選択してpaste
		set cnt_obj to count hit_object
		try
			repeat with i from cnt_obj to 1 by -1 --必ずおしりから
				my ShowProgressBar("replace-words-with-selection 実行中", find_text & "を置換中... " & (cnt_obj - i) & "/" & cnt_obj, 0, cnt_obj, (cnt_obj - i))
				select (item i of hit_object)--ここが遅い
				paste
			end repeat
		on error
			my my_error("置換中にエラーが発生しました。", false)
		end try
	end tell
	return count_hit
end do_it


--------------------------------------------------------●InDesignバージョン確認ルーチン
to ver()
	tell application "InDesign CS_J"
		set my_version to version
		if my_version < 3 and my_version > 3.9 then
			my my_error("このプログラムはInDesign CS以外では動作しません", true)
		end if
	end tell
end ver


--------------------------------------------------------●ドキュメントが開かれているかどうか
to doc_exists()
	tell application "InDesign CS_J"
		if not (exists document 1) then
			activate
			beep
			display dialog "ドキュメントが開かれていません" buttons "キャンセル" default button 1
		end if
	end tell
end doc_exists

--------------------------------------------------------●選択範囲がテキスト(インライングラフィックス)かどうか? 成功したらコピーされる
to copy_selection()
	tell application "InDesign CS_J"
		activate
		if (exists selection) and (class of selection is text) then
			try
				copy
			on error errMsg number errNum
				my my_error("オブジェクトコピー中のエラーです" & return & errMsg & return & errNum, true)
			end try
		else
			my my_error("テキスト(文字列)かインライングラフィックスを選択してください", true)
		end if
	end tell
end copy_selection





------------------------------------------★エラー処理
on my_error(err_str, my_stop)
	set err_str to err_str as Unicode text
	if my_stop then
		set my_stop to {"中止"}
	else
		set my_stop to {"中止", "続行"}
	end if
	tell application "InDesign CS_J"
		--set user interaction level to interact with all --ユーザー操作の禁止を解除します
		activate
		beep
		set ANS to button returned of (display dialog err_str buttons my_stop default button 1 with icon stop) --警告ダイアログ出してストップ
		if ANS is "中止" then
			tell application "ShowProgressBar" to quit
			error number -128
		end if
	end tell
end my_error

--------------------------------------------------------●以下プログレスバー用
to ShowProgressBar(title_str, status_str, mini_value, max_value, my_value)
	tell application "ShowProgressBar"
		activate
		tell window 1
			set title to title_str as Unicode text
			set string value of text field 1 to status_str as Unicode text
			set properties of progress indicator 1 to {minimum value:mini_value, maximum value:max_value, contents:my_value}
		end tell
	end tell
end ShowProgressBar