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

(DTPtechNote:1455) Re: [AS Indesign CS2] Table Replace 0.4



YUJI@勉強部屋さんからご指摘をいただいてちょっと書き直しました。
unicode非対応アプリでうまくペーストできないのを修正。

#実は前から気がついているんだけど、Indesign CS2のテキストをクリップボードにコピーしてるとき、ペーストに失敗する。おそらくいろんなスタイル情報が付加されすぎてるのと、Indesign CS2上のクリップボードと整合性がとれていないもよう。一度エディタなどに吐き出すと正常になるのだけど、、、これは次回の課題にしよう。osascriptでは逃げられなかった^^


(*
Table Replace 0.4	(c)2003-2006 www.seuzo.jp
2003.6.5	YUJIさんの要請でちょっと書いてみた。
2005.10.11	Indesign CS2用
2006.08.15	unicodeを持つ文字を正しくコピーするようにした。
2006.09.03	unicode非対応アプリケーションの不具合を修正

InDesignの表中の内容を差し替えます。
クリップボードのタブ区切りテキストを表の各セルにペーストします
●使い方
1)タブ(もしくは改行)区切りのテキストをクリップボードにコピーしておきます。
2)差し替えたい表のセルを選択しておきます。
3)このスクリプトを走らせます。
*)

--do shell script "/usr/bin/osascript -e 'clipboard info for string'" --おまじない
set tmp_uni to clipboard info for Unicode text
set tmp_str to clipboard info for string

--クリップボードの確認と取り込み
if tmp_uni is not {} or tmp_str is not {} then --クリップボードのテキストが空でなかったら
	set clip_str to the clipboard as Unicode text --変数にセットしちゃう
	
	if clip_str ends with return then --最後が改行だったら
		set clip_str to Unicode text 1 thru -2 of clip_str --最後の改行文字だけを削除
	end if
else
	my my_error("クリップボードが空です", true) --クリップボードが空なら中止
end if

--リスト処理
set old_dlimit to AppleScript's text item delimiters --現在のデリミタを保存
try
	set AppleScript's text item delimiters to {return} --デリミタを変更
	set tmp_list to every text item of clip_str --デリミタでリストにへんかん
	set AppleScript's text item delimiters to {tab} --デリミタを変更
	set cell_list to {}
	repeat with i in tmp_list
		set contents of i to my my_replace(contents of i, "【改行】", return) --【改行】という文字列を「改行文字」に変換
		set cell_list to cell_list & (every text item of contents of i) --デリミタでリストにへんかん
	end repeat
on error errMsg number errNum
	set AppleScript's text item delimiters to old_dlimit --デリミタをリストア
	my my_error(errMsg & return & errNum, true) --エラーが起こったら中止
end try
set AppleScript's text item delimiters to old_dlimit --デリミタをリストア


tell application "Adobe InDesign CS2_J"
	activate
	
	--確認
	if (not (exists selection)) or ¬
		class of selection is not cell and ¬
		class of selection is not table and ¬
		class of selection is not row and ¬
		class of selection is not column then
		my my_error("セルを選択してください", true) --セル以外を選択しているなら中止
	end if
	set count_cell_list to length of cell_list --クリップボードのセルの数
	set count_table to count cell of selection --テーブルの選択セル
	if count_cell_list is not count_table then --セル数とタブ区切りテキストの数が違うなら
		if count_table > count_cell_list then --セルの数の方が多い
			my my_error("選択しているセルの方が" & (count_table - count_cell_list) & "個多いです。" & return & "それでも処理を続けますか?", false)
		else
			my my_error("選択しているセルの方が" & (count_cell_list - count_table) & "個少ないです。" & return & "それでも処理を続けますか?", false)
		end if
	end if
	
	--実行
	try
		set contents of selection to cell_list
	on error errMsg number errNum
		my my_error(errMsg & return & errNum, true) --エラーが起こったら中止
	end try
	
end tell


----------------------------------●文字列置換
to my_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 Unicode text
	set AppleScript's text item delimiters to oldDelim
	return tmpStr
end my_replace

----------------------------------●エラー処理
on my_error(err_str, my_stop)
	if my_stop then
		set my_stop to {"中止"}
	else
		set my_stop to {"中止", "続行"}
	end if
	tell application "Adobe InDesign CS2_J"
		activate
		set ans to button returned of (display dialog err_str buttons my_stop with icon 0) --警告ダイアログ出してストップ
		if ans is "中止" then error number -128
	end tell
end my_error