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

(DTPtechNote:1262) Re: [AS InDesignCS] Text Esport



ドラッグ&ドロップされたファイルのソートをできるようにしました。

(*
Text_Export
(c)2003-2005 www.seuzo.jp
ドキュメント上のテキストをすべて書き出します。

●history
2005.07.14	ver.0.1	とりあえず
2005.07.17	ver.0.2	テーブルの中も書き出すようにしてみた
2005.07.18	ver.0.3	ドラッグ&ドロップインタフェイスを追加。ページごと(またはストーリーごと)に書き出すかどうかを追加。
2005.12.05	ver.04	Indesign CS2対応
2005.12.06	ver.05	ドラッグ&ドロップされたファイル名をソート
*)

------------------------------------------★Droplet処理
on open (theFiles)
	set my_doc to {}
	tell application "Finder"
		repeat with i in theFiles
			if file type of contents of i = "IDd4" then set end of my_doc to contents of i
		end repeat
		if my_doc = {} then my my_error("処理ファイルがみつかりませんでした", true)
		set my_doc to my my_sort(my_doc)
		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 {"IDd4"}) as list
		my control_sub(my_doc) --あとはコントロール部におまかせ
	end tell
end run


--------------------------------------------------------●コントロールルーチン
to control_sub(my_doc)
	set contents_txt to "" as Unicode text
	set open_files to {}
	--★起動チェック
	my ver()
	
	--★実行
	tell application "Adobe InDesign CS2_J"
		activate
		--書き出し方法と保存場所
		set export_way to button returned of (display dialog ("Page単位で書き出しますか? それともStoryごと?" as Unicode text) buttons {"キャンセル", "Page", "Story"} default button 3)
		set my_file to (choose file name with prompt "出力ファイルを保存します" default name "contents.txt")
		--現在開いているドキュメントのフルパス
		if exists document 1 then set open_files to (full name of every document) as Unicode text
		--ドキュメントごとの処理
		repeat with i in my_doc
			if open_files contains (i as Unicode text) then my my_error("処理ドキュメントはすでに開かれています。いったんドキュメントを閉じてから再実行してください", true)
			open i
			if export_way is "Story" then
				set contents_txt to contents_txt & (i as Unicode text) & return & return & my story_export()
			else
				set contents_txt to contents_txt & (i as Unicode text) & return & return & my page_export()
			end if
			close document 1 saving no --保存せずにドキュメントを閉じる
		end repeat
		
		--テキスト書き込み
		my write_file(contents_txt, my_file)
		
		--★終了ダイアログ
		beep
		display dialog "書き出しおわりました"
	end tell
end control_sub

--------------------------------------------------------●InDesignバージョン確認ルーチン
to ver()
	tell application "Adobe InDesign CS2_J"
		set my_version to (version of script preferences) as number
		if my_version < 4.0 or my_version > 4.9 then
			my my_error("このプログラムはInDesign CS2以外では動作しません", true)
		end if
	end tell
end ver


--------------------------------------------------------●テキスト抜き出し(ストーリーごと)
to story_export()
	set tmp_txt to "" as Unicode text
	tell application "Adobe InDesign CS2_J"
		tell document 1
			convert to text every table of every story --テーブルをテキストに変換
			set every_story to every story
			repeat with i in every_story
				set tmp_i_txt to contents of (object reference of i)
				set tmp_txt to tmp_txt & tmp_i_txt & return & return
			end repeat
		end tell
	end tell
	return tmp_txt
end story_export

--------------------------------------------------------●テキスト抜き出し(ページごと)
to page_export()
	set tmp_txt to "" as Unicode text
	tell application "Adobe InDesign CS2_J"
		tell document 1
			convert to text every table of every story
			repeat with i from 1 to count pages
				tell page i
					set page_name to name
					set tmp_txt to tmp_txt & "-------------------------- Page : " & page_name & return & return
					--ページ中のテキストフレームの抽出
					set tmp_obj to all page items
					set my_obj to {} --テキストフレームオブジェクトのリストの初期化
					repeat with i in tmp_obj
						if class of i = text frame then
							set end of my_obj to object reference of i
						end if
					end repeat
					
					--各テキストフレームへのアクセス
					repeat with ii in my_obj
						set tmp_txt to tmp_txt & return & return & contents of (object reference of ii) & return
					end repeat
				end tell
			end repeat
		end tell
	end tell
	return tmp_txt
end page_export
------------------------------------------★ファイル書き出し
on write_file(contents_txt, my_file)
	tell application "Finder"
		set FH to open for access my_file with write permission
		try
			write contents_txt to FH
		on error errMsg number errNo
			close access FH
			activate
			display dialog "書き込み時のエラーです" & return & errMsg & errNo
			return
		end try
		close access FH
		update my_file
	end tell
end write_file

----------------------------------------------★以下はこまごまとした下請け
----------------------------------------------○リストをソートします
to my_sort(theList)
	set tmp_str to my as_join((ASCII character 10), theList)
	set tmp_str to do shell script "echo " & quoted form of tmp_str & "| sort "
	return my as_split(return, tmp_str)
end my_sort

----------------------------------------------○リストをデリミタで分割
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

----------------------------------------------○リストをデリミタで結合
to as_join(thedelimit, theList)
	set oldDelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to thedelimit
	set tmpstr to theList as text
	set AppleScript's text item delimiters to oldDelim
	return tmpstr
end as_join

------------------------------------------★エラー処理
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 "Adobe InDesign CS2_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 1) --警告ダイアログ出してストップ
		if ANS is "中止" then
			error number -128
		end if
	end tell
end my_error