2012年10月29日月曜日

【AppleScript】ファイル名に使えない文字のみエスケープする(Windowsも含む)

ファイル名にはいろんな制約があります。それらをエスケープするハンドラです。
Macだけならさほどありませんが、Windowsも含めると予約語なんてものもあります。
最近はOSにこだわらないクラウドな世界なので「Windowsとか使ってねーよwww」ってWindowsを無下にした考えは極力なくしたいものです。
なので、それらの文字もまとめてエスケープする仕様です。

perlがわかんなくて複雑になってしまったヽ(;▽;)ノ



そんなに難しいことした覚えはないのに、perlのマッチパターンがうまく使えず、無駄にAppleScriptで分岐するものになってます。
しばらくperl使わなかったら、スッカリ忘れてしまいました・・・

具体的に言うと、予約語と記号を一緒に指定することができませんでした。
さらに、予約語のような複数文字を指定したエスケープがうまくいきません。

対策として、まず記号をエスケープし、そのあと予約語をエスケープします。
きっと、とってもとっても遅いです。
perlを正しく使ってなおして頂ける方、切望しておりますm(_ _)m


(*
ファイル名で禁止された文字のみエスケープする(Windowsも含む)
*)

set filename to "COM1とPRNでNULをAUXしたぃ…///"

--エスケープ
set escape_filename to my filename_escape(filename)
-- return:%43%4f%4d%31と%50%52%4eで%4e%55%4cを%41%55%58したぃ…%2f%2f%2f

set query to "%([0-9A-Fa-f][0-9A-Fa-f])"

--アンエスケープ
set unescape_filename to my unescape(escape_filename, query)
-- return:COM1とPRNでNULをAUXしたぃ…///

on filename_escape(filename)
set yoyakugo to {"CON", "PRN", "AUX", "CLOCK$", "NUL", "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"}
set query1 to "([^?w ])"
set query2 to "([\\\\\\/\\*\\?\\|\"<>:\\%.\\$])"

set filename to my escape(quoted form of filename, query2)

repeat with a in yoyakugo
if filename contains a then
set b to my escape(quoted form of a, query1)
set b to my replace(b, "%0a", "") --%0aの改行処理
set filename to my replace(filename, a, b)
end if
end repeat

return filename

end filename_escape

on escape(atext, query)
set perlscript to "echo " & atext & "| perl -pe '~s/" & query & "/\"%\" . unpack('H2', $1)/eg;'"
do shell script perlscript
end escape

on unescape(atext, query)
set perlscript to "echo " & atext & "| perl -pe '~s/" & query & "/ pack('H2', $1)/eg;'"
do shell script perlscript
end unescape

on replace(src, tg, rp)
set oldDel to AppleScript's text item delimiters
set AppleScript's text item delimiters to tg
set myList to text items of src
set AppleScript's text item delimiters to rp
set myText to myList as string
set AppleScript's text item delimiters to oldDel
return myText
end replace

0 件のコメント:

コメントを投稿