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

(DTPtechNote:453) replace-words-with-selection β



InDesignで選択しているテキスト(およびインライングラフィックス)を特定の文字列と置換するスクリプト書きました。
ちょうどQXPのXTention「イージーコンポ」の機能である「検索後属性の一括適用」ってのをイメージしてます。これと違うのは、選択しているのがテキストでもいいのと、ドキュメント単位で置換ができるところかな。。。

まだちょっと挙動がおかしいところもあって^^,
とりあえずβで、うまく成長すれば表にアップしようと思ってます。
レポートはこのスレッドへ返信してくださいませ。


property find_text : ""

--------------------------------------------------------●コントロールルーチン
--★警告
tell application "InDesign 2.0.2J"
	activate
	display dialog "このスクリプトはInDesignドキュメント上のテキストの置換を実行します。そのために組版が変わる可能性があります。それでも続行しますか?"
end tell

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

--★実行
tell application "InDesign 2.0.2J"
	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 "InDesign 2.0.2J"
	activate
	if count_hit > 0 then
		display dialog "とりあえず" & count_hit & "箇所の置換を実行しました"
	else
		display dialog "とりあえず、置換すべき箇所は見あたりませんでした。"
	end if
end tell


--------------------------------------------------------●置換実行ルーチン
to do_it(find_text, find_range)
	set count_hit to 0 --置換成功数
	set hit_object to {} --検索結果オブジェクト
	try
		tell application "InDesign 2.0.2J"
			set find preferences to nothing -- 既存の検索環境設定を初期化します。
			set find text of find preferences to find_text
			
			tell document 1
				--検索してオブジェクトを拾う
				if find_range is "ストーリー" then
					set hit_object to search (parent story of selection)
				else
					repeat with i from 1 to count story
						set hit_object to hit_object & (search story i)
					end repeat
				end if
				try --searchコマンドはなにもヒットしないとなにも返さない。ヴォ〜け!!!
					set count_hit to length of hit_object
				end try
				
				---hit_objectを選択してpaste
				repeat with i in (reverse of hit_object)
					select i
					paste
				end repeat
				
			end tell --document 1
		end tell
	end try
	return count_hit
end do_it


--------------------------------------------------------●InDesignバージョン確認ルーチン
to ver()
	tell application "InDesign 2.0.2J"
		if version is not 2.02 then
			activate
			beep 10
			display dialog "このプログラムはInDesign2.0.2J以外では動作しません" buttons {"キャンセル"} with icon 2
		end if
	end tell
end ver


--------------------------------------------------------●ドキュメントが開かれているかどうか
to doc_exists()
	tell application "InDesign 2.0.2J"
		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 2.0.2J"
		if selection is not {} and class of selection is text then
			copy
		else
			display dialog "テキスト(文字列)かインライングラフィックスを選択してください" buttons "キャンセル" default button 1 with icon 2
		end if
	end tell
end copy_selection



--------------------------------------------------------●story 数を返す
to story_count()
	tell application "InDesign 2.0.2J"
		tell document 1
			set story_cun to count story
			if story_cun = 0 then
				activate
				beep
				display dialog "このドキュメントには文字が含まれていません" buttons "キャンセル" default button 1
			end if
		end tell
	end tell
	return story_cun
end story_count



--------------------------------------------------------★リスト化
to as_split(thedelimit, theText)
	--	set oldDelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to thedelimit
	set tmpList to every text item of theText
	--	set AppleScript's text item delimiters to oldDelim
	return tmpList
end as_split