[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(DTPtechNote:1083) [AS_InDesign CS]index from character style
ちょっと用あってCS用に書き直しました。
InDesignはASの仕様が結構変わるので、まんどい。
ベータ扱いなので、うまく動作しないことも予想できます。
不具合を発見された方はご一報いただければすぐになおします。
よろしくお願いします。
(*
index from character style
(c)2003-2005 www.seuzo.jp 市川せうぞー
特定の文字スタイルから出現順の索引を作成します
2003.7.25 ver0.91 ドラッグ&ドロップしたときにファイル名でソート。インラインテキストフレームに対応
2005.03.09 ver.1.0 InDesign CS対応版
*)
------------------------------------------★Droplet処理
on open (theFiles)
set my_doc to {}
tell application "Finder"
repeat with i in theFiles
if file type of contents of i = "IDd3" then set end of my_doc to contents of i
end repeat
my control_sub(my_doc) --あとはコントロール部におまかせ
end tell
end open
------------------------------------------★Applet処理
on run
tell application "Finder"
activate
set my_doc to (choose file with prompt "索引テキストを作成するドキュメントを選んでください" of type {"IDd3"}) as list
my control_sub(my_doc) --あとはコントロール部におまかせ
end tell
end run
------------------------------------------★コントロール部
to control_sub(my_doc)
set my_count to 0 --いくつめのファイルを処理しているか?
set index_txt to "" --索引テキスト
tell application "InDesign CS_J"
--activate
set user interaction level to never interact --ユーザー操作を禁止します
repeat with i in my_doc
open i --ドキュメントを開く
--windowを小さく
tell window 1
set properties to {view display setting:optimized, zoom percentage:100, bounds:{22, 0, 124, 150}}
end tell
--表示をプレビューモードに
tell document 1
tell view preferences
set properties to {show master items:false, show rulers:false, show frame edges:false}
end tell
tell CJK grid preferences
set properties to {show all layout grids:false, show all frame grids:false, show character count:false}
end tell
tell grid preferences
set properties to {document grid shown:false, baseline grid shown:false}
end tell
tell guide preferences
set properties to {guides shown:false}
end tell
tell text preferences
set properties to {show invisibles:false, highlight substituted fonts:false, highlight hj violations:false, highlight keeps:false, highlight substituted glyphs:false, highlight custom spacing:false, highlight kinsoku:false}
end tell
end tell
--スクリプト実行前の前処理
set my_count to my_count + 1
if my_count = 1 then
tell application "Finder"
activate
set my_file to (choose file name with prompt "出力ファイルを保存します" default name "index.txt")
set my_chara_styeles to my ShellSort(0, my get_chara_style()) ---ここで1度きりすべてのスタイルをgetしておく
set my_chara_styeles to (choose from list my_chara_styeles with prompt "索引として抽出する文字スタイルを選択してください" OK button name "選択" without multiple selections allowed and empty selection allowed) as Unicode text
end tell
end if
set index_txt to index_txt & my index_extraction(my_chara_styeles) --索引テキストの抽出
close document 1 saving no
end repeat
set user interaction level to interact with all --ユーザー操作の禁止を解除します
my write_file(index_txt, my_file) --ファイルへの書き込み
tell application "InDesign CS_J"
activate
display dialog "索引テキストの書き出しが終了しました" & return & my_count & "ファイルを処理しました" with icon 1 giving up after 10
end tell
end tell
end control_sub
------------------------------------------★すべての文字スタイルのリストを返す
to get_chara_style()
tell application "InDesign CS_J"
set my_chara_styeles to {}
tell document 1
repeat with i from 1 to count (character styles)
tell character style i
if not (name = "[No character style]") then
set end of my_chara_styeles to name as Unicode text
end if
end tell
end repeat
end tell
if my_chara_styeles = {} then
my my_error("文字スタイルがひとつも設定されていません", true)
else
return my_chara_styeles
end if
end tell
end get_chara_style
------------------------------------------★索引テキストを抽出
to index_extraction(my_chara_styeles)
tell application "InDesign CS_J"
set find preferences to nothing -- 既存の検索環境設定を初期化します。
set change preferences to nothing -- 変更環境設定を初期化します。
set buff to ""
tell document 1
repeat with i from 1 to count pages
set my_page to name of page i
tell page i
--ページ中のテキストフレームの抽出
set tmp_obj to all page items
set my_obj to {} --テキストフレームオブジェクトのリストの初期化
repeat with i in tmp_obj
--if class of i = text frame and content type of i = text type then
if class of i = text frame then
set end of my_obj to contents of i
end if
end repeat
--各テキストフレームへのアクセス
repeat with ii in my_obj
set text_contents to contents of ii
set cunt_chara to count character of text_contents
tell ii
if cunt_chara > 1 then --改段などの制御文字を抑制する。じゃないと死ぬ
select every text
set buff to buff & my index_search(my_page, my_chara_styeles)
end if
end tell
end repeat
end tell
end repeat
end tell
end tell
return buff
end index_extraction
------------------------------------------★index_extractionの下請け
to index_search(my_page, my_chara_styeles)
set buff_2 to ""
tell application "InDesign CS_J"
set find preferences to nothing -- 既存の検索環境設定を初期化します。
tell document 1
try
set hit_object to search selection with find attributes {applied character style:my_chara_styeles}
repeat with i in hit_object
set tmp_str to my chomp(contents of i)
set tmp_str to my as_replace(tmp_str, return, (tab & my_page & return))
set buff_2 to buff_2 & tmp_str & tab & my_page & return
end repeat
end try
end tell
end tell
return buff_2
end index_search
to chomp(str)
set str to str as text
if str = return then
return ""
else if str ends with return then
return text 1 thru -2 of str
else
return str
end if
end chomp
to as_replace(theText, orgStr, newStr)
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to orgStr
set tmpList to every text item of theText
set AppleScript's text item delimiters to newStr
set tmpStr to tmpList as text
set AppleScript's text item delimiters to oldDelim
return tmpStr
end as_replace
------------------------------------------★シェルソートルーチン
--(UpDown −> 0:昇順、1:降順)。
on ShellSort(UpDown, BoxList)
set N to length of BoxList
if N > 1 then
set k to 1
set h to 1
repeat until h > N / 9
set k to h
set h to (h * 3 + 1)
end repeat
repeat until k = 0
repeat with i from k + 1 to N
set j to i
if UpDown = 0 then --昇順
repeat while ((j > k) and ((item (j - k) of BoxList) > (item j of BoxList)))
set Temp to item j of BoxList
set item j of BoxList to item (j - k) of BoxList
set item (j - k) of BoxList to Temp
set j to j - k
end repeat
else --降順
repeat while ((j > k) and ((item (j - k) of BoxList) < (item j of BoxList)))
set Temp to item j of BoxList
set item j of BoxList to item (j - k) of BoxList
set item (j - k) of BoxList to Temp
set j to j - k
end repeat
end if
end repeat
set k to ((k / 3) div 1)
end repeat
end if
return BoxList
end ShellSort
--------------------------------------------------------●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
my my_error("ドキュメントが開かれていません", true)
end if
end tell
end doc_exists
------------------------------------------★ファイル書き出し
on write_file(index_txt, my_file)
tell application "Finder"
set FH to open for access my_file with write permission
try
write index_txt to FH
on error errMsg number errNo
close access FH
my my_error("書き込み時のエラーです" & return & errMsg & errNo, true)
end try
close access FH
--update my_file
end tell
end write_file
----------------------------------●エラー処理
on my_error(err_str, my_stop)
if my_stop then
set my_stop to {"中止"}
else
set my_stop to {"中止", "続行"}
end if
tell application "InDesign CS_J"
activate
beep 1
set ans to button returned of (display dialog err_str buttons my_stop with icon stop) --警告ダイアログ出してストップ
if ans is "中止" then error number -128
end tell
end my_error