Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2011-05-29

[][][]テキストファイルの文字コードや改行コードを変える。

テキストファイルを扱っている人の多くが文字コードや改行コードを意識していません。こんなこと、今さら言い立てても誰も驚かないでしょう。結果的に、いろんな文字コードのファイルが出入りするので、いつもエディタでちょくちょく直しています。ちょーめんどいです。ファイルがたくさんある時は

nkf -w -Lu --overwrite *.txt

みたいにするといいですよ*1。あ、nkfないですか? この際入れちゃいなさいよ。

nkf Network Kanji Filter プロジェクト日本語トップページ - SourceForge.JP

これでたいていの用は足りるんですけれど、コマンド処理が向かない場合もあります。例えば、処理すべきファイルが細かくフォルダ分けされているとか、フォルダ分けされているとか、フォルダ分けされているとか。いちいちコマンド打ってられっか! ってな気分になります。

(フォルダごと)ドラッグ&ドロップできたら、ちょっとはラクですよね。ということでAppleScriptを書いてみました。

D

文字コードと改行コードだけじゃつまんないので、(字種置換用の)rubyスクリプトも適用できるようにしました。使い方を簡単に説明すると...

  1. ダブルクリック起動で「文字コード」「改行コード」「適用スクリプト」を設定します。*2
  2. 「適用スクリプト」がよくわからなかったら、ファイル選択ダイアログで「キャンセル」をクリックすれば、文字コードと改行コードだけを変えられるようにできます。
  3. あとは処理したいテキストファイル(.txt)をドラッグ&ドロップするだけ。

ダウンロードはこちらです:

Change_text_encoding_and_return_code.zip 直

テキストエディタ「mi」が必要です。nkfは使っていないので、必要ありません。簡単なことしかしてないのに、無意味に長くてクドイですね、すみません。コードはこちら:

(*
Change_text_encoding_and_return_code.app

ドラッグ&ドロップしたテキストファイルのテキストエンコーディングと改行コードを変更して別名保存する。
ラップしたい外部スクリプト(ruby スクリプト)を指定できる。
初期設定はダブルクリックしてダイアログ通りに。
注意事項:処理テキストは拡張子「.txt」が必ず付いていること。

2011-05-28	ver0.1	とりあえず
2011-05-29	ver0.2	テキストであっても「.txt」拡張子を持つものだけを処理するようにした。
2011-05-29	ver0.3	フォルダをドラッグ&ドロップした時、エラーになるのを修正した。
*)

property my_text_encoding : "" --テキストエンコーディング
property my_return_code : "" --改行コード。本来はmiの定数だが、文字列("LF", "CRLF", "CR")で持つようにする。設定の表示のため。
property my_script : "" --rubyスクリプト(置換など)


--------------------------------------------------------●ダブルクリックで設定の変更
on run
	my setting() --セッティングの変更
	display dialog "以下の通りに設定しました" & return & "--" & return & "テキストエンコーディング:" & my_text_encoding & return & "改行コード:" & (my_return_code as Unicode text) & return & "置換スクリプト:" & (my_script as Unicode text)
end run

--------------------------------------------------------●ドラッグ&ドロップされた
on open of theFiles
	--設定
	if my_text_encoding is "" then my setting() --初めて起動された時、セッティング
	
	--設定の表示
	tell application "mi"
		display dialog "ドラッグ&ドロップしたテキストファイルを以下の設定で変換します" & return & "--" & return & "テキストエンコーディング:" & my_text_encoding & return & "改行コード:" & (my_return_code as Unicode text) & return & "置換スクリプト:" & (my_script as Unicode text)
	end tell
	--ファイルのフィルタリング
	set my_files to my file_kind({"txt"}, {""}, theFiles) --拡張子のリスト、ファイルタイプのリスト、処理ファイル	
	--ファイルを開いて、処理
	tell application "mi"
		activate
		repeat with i in my_files
			set tmp_file to my duplicate_rename(content of i) --ファイルの複製とリネーム
			my change_code_and_save(tmp_file) --ファイルを開いて変更し、saveする
			if my_script is not "" then --外部スクリプトが指定されている
				my run_rubyscript(tmp_file) --rubyスクリプトを適用
			end if
		end repeat
		
		display dialog ((length of my_files) as Unicode text) & "ファイルを処理しました"
	end tell
end open


----------------------------------------------●設定
to setting()
	set my_text_encoding to (choose from list {"UTF-8", "UTF-16", "UTF-16LE", "Shift_JIS", "ISO-2022-JP", "EUC-JP", "Shift_JISX0213", "ISO-8859-1", "ISO-8859-2", "ISO-8859-4", "ISO-8859-10", "ISO-8859-13", "ISO-8859-15", "x-mac-roman", "ISO-8859-5", "KOI8-R", "x-mac-cyrillic", "windows-1251", "ISO-8859-7", "x-mac-greek", "windows-1253", "ISO-8859-9", "x-mac-turkish", "windows-1254", "Big5", "GB18030", "GBK"} with prompt "変換したいテキストエンコーディングを指定してください" & return & "(特に意図がなければUTF-8を強く推奨)" default items {"UTF-8"}) as Unicode text
	if my_text_encoding is "false" then error number -128
	
	set my_return_code to (choose from list {"LF", "CR+LF", "CR"} with prompt "変換したい改行コードを指定してください" default items {"LF"}) as Unicode text
	if my_return_code is "false" then error number -128
	try
		set my_script to choose file with prompt "適用するスクリプトを選んでください。" & return & "キャンセルを選ぶと、スクリプトは適用されません。"
	on error errMsg number errNum
		if errNum is -128 then set my_script to ""
	end try
end setting

----------------------------------------------●"LF", "CR+LF", "CR"の文字列をそれぞれmiの定数に変換
to conv_return_code(tmp_return_code)
	tell application "mi"
		if tmp_return_code is "LF" then
			set tmp_return_code to LF
		else if tmp_return_code is "CR+LF" then
			set tmp_return_code to CRLF
		else if tmp_return_code is "CR" then
			set tmp_return_code to CR
		end if
	end tell
	return tmp_return_code
end conv_return_code

----------------------------------------------●必要なファイルだけをフィルタして返します
to file_kind(extention_list, type_list, theFiles)
	set my_files to {}
	
	ignoring case
		tell application "Finder"
			repeat with i in theFiles
				if extention_list contains ((name extension of i) as Unicode text) then
					set end of my_files to contents of i
				else if (kind of i) is "フォルダ" as Unicode text then
					--activate
					--display dialog "フォルダ「" & (name of i) & "」の中の全ファイルを処理します" buttons {"キャンセル", "OK"} default button 2 with icon 0
					set my_files to my_files & my file_kind(extention_list, type_list, every file in folder i)
				else if type_list contains ((file type of i) as Unicode text) then
					set end of my_files to contents of i
				else
					--activate
					--display dialog "ファイル「" & (name of i) & "」は処理ファイルとして不適当です" buttons {"キャンセル", "OK"} default button 2 with icon 0
				end if
			end repeat
		end tell
	end ignoring
	return my_files
end file_kind

----------------------------------●ファイルを複製してリネーム。hoge.txt→hoge_new.txt(miで別名保存ができないための処置)
to duplicate_rename(org_file)
	set org_file to org_file as Unicode text
	set org_file to (quoted form of POSIX path of org_file) --as Unicode text
	set new_filename to do shell script "echo " & org_file & "|sed -e 's/\\.txt$/_new.txt/;'"
	set new_file to do shell script "cp " & org_file & " '" & new_filename & "'"
	return new_filename as POSIX file
end duplicate_rename


----------------------------------●miでドキュメントを開き、テキストエンコーディングと改行コードを変更して保存(別名保存ができないための処置)
to change_code_and_save(tmp_file)
	set tmp_return_code to my conv_return_code(my_return_code)
	try
		tell application "mi"
			open tmp_file
			tell document 1
				set character code to my_text_encoding
				set return code to tmp_return_code
			end tell
			close document 1 saving yes
		end tell
	on error errMsg number errNum
		my my_error("miで処理中にエラーが起きました" & return & errMsg & return & errNum, false)
	end try
end change_code_and_save

----------------------------------●rubyスクリプトを適用
to run_rubyscript(org_file)
	tell application "Finder"
		if not (exists my_script) then my my_error(my_script & "が存在しません", true)
	end tell
	set my_script_posix to quoted form of POSIX path of my_script
	set org_file_posix to quoted form of POSIX path of org_file
	set output_file_posix to quoted form of (do shell script "echo " & org_file_posix & "|sed -e 's/\\.txt$/_new.txt/;'") --出力ファイルパスを生成
	do shell script "ruby " & my_script_posix & " " & org_file_posix & ">" & output_file_posix
	do shell script "rm " & org_file_posix --元ファイルを削除
end run_rubyscript



----------------------------------●エラー処理
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 "mi"
		activate
		beep
		set ANS to button returned of (display dialog err_str buttons my_stop default button 1 with icon 0) --警告ダイアログ出してストップ
		if ANS is "中止" then
			error number -128
		end if
	end tell
end my_error

変換するんじゃなくて、確認するだけしたい人は、ものかのさんの「Whisker」を使うと幸せになれますよ。きっとですよ。

*1:このコマンドは、カレントディレクトリの.txtファイルに対して、文字コードUTF-8、改行コードをLFにしています。ファイルは上書きされます。

*2:設定は最初に1回やれば、あとはアプリケーション内に保持されています。設定を変更したいときは、またダブルクリックで起動してください。

2010-10-01

[][]mi上でコメントをトグルする

miだと標準のツールで「コメントアウト」はありますが、「アンコメント」がなくて、ひとつづつdelキーで削除しておりました。

だんだんムカっ腹が立ってきたので、comment & uncommentをトグルするようにしました。toolフォルダに入れて、ショートカットとか設定すると便利です。

D

set my_coment to "#" --コメント文字

tell application "mi"
	tell document 1
		set p_count to (count paragraphs of selection object 1)
		set start_p to index of paragraph 1 of selection object 1
		set end_p to start_p + p_count - 1
		
		repeat with i from start_p to end_p
			set tmp_str to quoted form of (paragraph i as Unicode text)
			try
				do shell script "echo " & tmp_str & " | grep -E '^[[:space:]]*" & my_coment & "'"
				set paragraph i to (do shell script "echo " & tmp_str & "| sed -e 's/^\\([[:space:]]*\\)" & my_coment & "/\\1/;'") & return
			on error errMsg number errNum
				if errNum is 1 then
					set paragraph i to (do shell script "echo " & tmp_str & "| sed -e 's/^/" & my_coment & "/;'") & return
				else
					activate
					display dialog "Error!"
				end if
			end try
		end repeat
	end tell
end tell

grep -E '^[\\t ]*'」がマッチしなくてちょっと嵌りました。grepで\tは使えません。<「方言に注意」なんて自分で言ってたのにね...orz

逆引きUNIXコマンド/grepでタブを検索する方法 - Linuxと過ごす

@mori_tacsiさんにご指摘いただき、ただただ恐縮^^

2010-05-20

[][][][][]「ESTKのコピー&ペースト&クラッシュ」問題のその後...

もうみなさま忘れていらっしゃるかもしれませんが... この問題について

Snow Leopard & ExtendScript Toolkit CS4(3.0.0.41) - 名もないテクノ手

CS5ではどうなったのでしょうか? わたしの手元にあるのはプレス向け評価版ですので、製品版とは少々違うかもしれませんが、若干の改善が見られます。なんだよ、若干って。。。

少なくともクラッシュはしなくなりました(当社比)。コピー&ペーストもうまくいくことが多くなりました。だが、しかし。たまーに間違えます。たまーにコピーされていません。たまーにへんなところにペーストします。再現性はたまーに不明。*1

これは日本語版だけの不具合です。が、若干でも改善されているのを見るとAdobeは問題を認識していると思います。製品版で確認できたら、再度Adobeにレポートしたいと思います。*2


しかしながら、もし仮にこの問題がCS5ですっきり解決したとしても、旧バージョンであるCS4ではこの問題は放置されるでしょう。どうやらAdobeユーザーには好きなバージョンを使い続ける選択の自由は与えられないみたい。

CS4 + Snow LeopardでJSを書いている人はESTKは使えないってこと。あきらめてください。仕方ないので、miを使って書いたりしています。オブジェクトモデルはESTKを参照しますが、実行だけならAS経由でできます*3ずっと前に書いたものを古道具置き場から拾ってきました。温故知新。


(*
miの「javascript」モード(http://hp.vector.co.jp/authors/VA022023/javascript/index.html)で、ツールとして登録すれば
mi上からカレントドキュメントをInDesign CSのjavascriptとして実行します。
なにか返値があるようなら「javascript」モードの新規ドキュメントとして開きます。
インストールはjavascriptの「tool」フォルダにスクリプト形式で入れておくだけ。command+Rとかのショートカットを推奨

(c)2005 www.seuzo.jp
2005.07.03	とりあえず版
2005.07.04	新規ドキュメントの場合、保存ダイアログで保存させてから実行。拡張子が「.js」でないものは警告(http://www.seuzo.jp/rubbs/search_html/msg01158.html)
2009-12-28	InDesign CS4用
2010-05-20	InDesignの返り値が未定義の時のエラートラップ(あれ、こういう時nullって使えないの?)
*)

tell application "mi"
	if not (exists document 1) then my my_error("ドキュメントが開かれていません")
	tell document 1
		if header = ("ファイル未定義" as Unicode text) then
			set f_path to (choose file name with prompt ("ファイルを保存してください" as Unicode text) default name "hoge.jsx")
			save in f_path
		else if modified then
			display dialog ("このドキュメントは保存されていません。" & return & "保存しますか?") as Unicode text buttons {"キャンセル", "SAVE"} default button 2
			save
		end if
		if not (name ends with ".jsx") then my my_error("拡張子が「.jsx」でないといけません")
		set mi_file_path to file --アクティブドキュメントのパスをget
	end tell
end tell

tell application "Adobe InDesign CS4"
	activate
	set ans to null
	try
		set ans to do script mi_file_path language javascript
	on error
		my my_error("InDesign上でエラーになりました")
	end try
end tell

try
	if ans is not "" then --なにかしら返値があれば、「javascript」モードで開く
		tell application "mi"
			activate
			--try
			make new document at beginning with data (ans as Unicode text) with properties {mode:"javascript"}
			--on error
			--my my_error("返値をうまく受け取れませんでした。すいません orz")--いちいち
			--end try
		end tell
	end if
on error
	--InDesignの返り値が未定義であった
end try

---------------------エラー処理
to my_error(str)
	set str to str as Unicode text
	tell application "mi"
		activate
		display dialog str buttons {"キャンセル"} default button 1
	end tell
end my_error

つかっている風景:

D


(追記:2010-11-03T21:18:11+0900)このバグは、CS5ではESTK3.5.1アップデートで修正されました。

*1:別の言い方をすると、使えない!ってこと。お金を払って、使えないアプリを買うってこと。

*2:ぼくなんかが何を言っても、なんら現状は変わらないでしょうけれど...

*3:...とtwitterでつぶやいたら@milligrammeさんから不具合などをご指摘いただきました。ありがとうございます。

2010-04-07

[][]テキストエディタには何をつかっているか?

ぼくは「mi - Mac OS X 用テキストエディタ」を使っています。テキストがどんな文字エンコーディングで表現されているのか、たいていの人は関心がありません。だから、あちこちからいただくテキストデータの文字コードはバラバラです。文字コードが何なのか、何で編集して、そして何で保存するのか、miならば一目瞭然だからです。

f:id:seuzo:20100407110824j:image

プログラムを書くときも、miには予約語のカラーリング機能があります。モードを設定することで文法やインデント方法を変更できます。エディタ上で実行もできます。

f:id:seuzo:20100407112015p:image



サーバー上のデータをリモートで触りたい時にはviかvimを使います。だってたいていのサーバーにはviが入っているだだろうから。

ローカルでvimやemacsを使いたい人は、ちょっとしたapplescriptを書くといいです。@PsychoCat4さんのおっしゃるとおり。

@hokori Finderから? Finderで選択して TerminalのEmacs を開く? それはスクリプト(AppleScript)を書けばできるんじゃなかな?。書いた事ないけど。

http://twitter.com/PsychoCat4/status/11726594158

おそらく@PsychoCat4さんなら朝飯前なんだろうけれど、書かなかったのは教育的配慮かもしれないですね。わたしは大人げないので書いておきます^^

--ドラッグ&ドロップで開く
on open of theFiles
	tell application "Terminal"
		activate
		repeat with i in theFiles
			set f to (quoted form of POSIX path of contents of i) as Unicode text
			do script "vim " & f
		end repeat
	end tell
end open
--ダブルクリックで開く
tell application "Terminal" to do script "vim"

しかしながらこれですと、文字コード判定とかしていません。1KBくらい読んで、エンコーディングと改行くらい判定させた方がいいかもしれません。nkfを使ってもいいし、その部分だけrubyで書いてもいいかもしれません。

あ、hatenaのシンタックスハイライト記法でAppleScriptがカラーリングされている! まだヘルプには書かれていません。

2009-08-17

[][][]miエディタ「チラシの裏」モード

Mac環境の定番エディタ「mi」には「チラシの裏」モードがある。見よ、この自由な雰囲気を! これこそエディタの「ちょこっと書きたい」欲求を完全に満たしてくれるではないか。これで溜まっていた報告書もスラスラ書き上がる(かもしれない)。

f:id:seuzo:20090814162027p:image

いや、まあ、miの背面に画像を表示する設定を使っているだけなんだけれど^^

チラシ画像はダブルトーンに落とし込むとよりリアルになるぞ。

f:id:seuzo:20090814162028p:image

あとは、ガウスでぼかして、反転させてトーンカーブでシャドウを10%くらいまで落とすと、ウラっぽい感じがしてくるではないの。無駄にPhotoShopを持っている人もこういう使い道があると、高い買い物の甲斐があるってものだ<微妙にちがう。

f:id:seuzo:20090814162029p:image

あとはmiで新規モードを作って、モード設定の「表示」タブで「背面に画像を表示」にチェックして、画像を指定するといい。フォーマットとJPEG低画質で十分だ。だってチラ裏だもん。

f:id:seuzo:20090814162030p:image

PhotoShop持っていない人はこれ使うといいです。chirashi.jpg 直

元はSEIYUさんのチラシですので、SEIYUさんに感謝を込めてSEIYUショッピングウエアとします。これを使う人はSEIYUでお買い物するように。

さあ、キミもチラ裏でじゃんじゃんカイてみないか?