[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