[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