Thu, 30 Jun 2005
CotEditor用のスクリプトを書いてみる、解決変
前回書いた、CotEditor用のスクリプト(AppleScriptとShell Scriptを混ぜ書きしたもの)が日本語環境じゃないと上手く動かない(日本語が文字化けする)、という話しの解決変いや解決編。夢枕獏か。…結局日本語環境にどうしても慣れなかったので、次のようにしてみました。
do shell script " /bin/sh << EOF
__CF_USER_TEXT_ENCODING=0x1F5:1:14
/usr/bin/open ~/Applications/CotEditor/CotEditor.app
EOF"
これでCotEditorを日本語環境で起動したことになるようで、英語優先の環境下においてもスクリプトの結果が文字化けしなくなりました。んで、このAppleScriptを起動項目に登録して、常にCotEditorを起動しっぱなしにしておく、と。問題点はひとつだけ。バックスラッシュが円マークに化けてしまって、ファイルをセーブ出来なくなります。…大問題。
んでも、バックスラッシュの話しはさておき、これってアプリケーション側で対応してもらえそうな気もしないでもないとも言えるような言えないような。
Wed, 29 Jun 2005
CotEditor用のスクリプトを書いてみる、まとめ
取りあえず、これが最終形。悪い点は、日本語環境でしか動作しないこと。最後にAppleScriptに渡す時点でShift_Jisにしておくために変換をかけています。さらに、ダブルクォートとバックスラッシュをエスケープしています。また、選択範囲が空であっても大丈夫なようになっています。そもそもこんな風に混ぜ書きしなければ、何も問題無いのですが…それにしても醜いねぇ。
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
INPUT=`osascript << EOF
tell application "CotEditor"
if exists front document then
set myContentsOfSelection to (contents of selection of front document)
else
beep
end if
return myContentsOfSelection
end tell
EOF`
TEMP=`echo ${INPUT} | \
/usr/local/bin/lv -Iu8 -Os | \
sed -e 's/\\\/\\\\\\\/g' | \
sed -e 's/\"/\\\"/g'`
OUTPUT="<del datetime=\\\"`/usr/bin/ruby -e \
'print Time.now.strftime("%Y-%m-%dT%H:%M:%S\+09:00")'`\\\">${TEMP}</del>"
osascript << EOF
tell application "CotEditor"
activate
if exists front document then
set {loc, len} to (range of selection of front document)
set (contents of selection of front document) to "${OUTPUT}"
set numOfMove to (count of character of selection)
set (range of selection of front document) to {Loc + numOfMove, 0}
end if
end tell
EOF
Sat, 25 Jun 2005
CotEditor用のスクリプトを書いてみるそのなななななな
昨日のエントリ、CotEditor用に書いたスクリプトの実行時に文字化けが発生して困った、という話しの続き。作者の中の人の方から示唆を頂いたのを参考に、スクリプトの要所で文字コードがどのようになっているのか調べてみました。示唆の内容は次の通り。
シェルスクリプトからアップルスクリプトを呼び出す段階で 「osascript」コマンドが使われてますが、どうやらこれは与えられた文字列をデフォルトCエンコーディング(日本語の場合はShift-JIS)で解釈するようです。化け方も、UTF-8をShift-JISで読み込んだときと同じでした。
変換処理を行なう元ファイルは日本語EUCで改行コードがCR/LFなもの。んで、変換用のシェルスクリプトは次の通り。
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
INPUT=`cat - | tee ~/Desktop/INPUT.txt`
echo "<kbd>${INPUT}</kbd>" | tee ~/Desktop/OUTPUT.txt
変換後にDesktop/INPUT.txt
とDesktop/OUTPUT.txt
を開いてみると…UTF-8でLFになっていました。CotEditorからスクリプトに処理が渡った時点で文字コードと改行コードの変換が行なわれているということでしょうか。逆に、スクリプトからCotEditorに処理が返った時点でもう一度変換が行なわれているのか…この処理の間にAppleScriptが入った場合におかしなことになる、と。
もうちょっと実験。次のように書いて、処理中の文字コードを変えてやると、どうなるでしょう。…/usr/bin/tee
が吐いたファイルの中身は、今度は変換したなりの文字コードのものでした。元ファイルの文字コードとは違うコードへ変換したのですが、文字化けは無し。
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
INPUT=`cat - | /usr/local/bin/lv -Iu8 -Os | tee ~/Desktop/INPUT.txt`
echo "<kbd>${INPUT}</kbd>" | tee ~/Desktop/OUTPUT.txt
さて、AppleScript側にShift-jisで渡せるようになったので、前回のスクリプトを修正して、でわさっそく…やっぱり文字化けしました。うーん…寝るかな。
Thu, 23 Jun 2005
CotEditor用のスクリプトを書いてみるそのろく
これが最終形態ということにしようと思ったら、マーク付けした日本語テキストが文字化けしてしまう…どうも、最後にApplescriptの方に持っていった後の処理に問題があるみたい。${OUTPUT}をそのままechoした場合には文字化けしないので。スーパーハカーの人、誰か教えてくださると嬉しいです…それにしても、今まで日本語文でテストしてなかった自分に腹が立つというか。
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
INPUT=`cat - `
OUTPUT="<em>${INPUT}</em>"
osascript << EOF
tell application "CotEditor"
activate
if exists front document then
set {loc, len} to (range of selection of front document)
set (contents of selection of front document) to "${OUTPUT}"
set numOfMove to (count of character of selection)
set (range of selection of front document) to {Loc + numOfMove, 0}
end if
end tell
EOF
Wed, 22 Jun 2005
CotEditor用のスクリプトを書いてみるそのごぉ
CotEditor用のスクリプトの話しのつづき。添付のシェルスクリプトの例では、最前面のドキュメントにおいて選択範囲が無い場合、何も出力されません。自分としてはそうでないほうが望ましい。ということで、でわさっそく…最初のものは添付のシェルスクリプトです。
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
INPUT=`cat -`
echo "<h1>${INPUT}</h1>"
処理の流れは次のようにしてみました。…何かかっこわる。地の文を書いてそれをマークアップしてゆくわけだし、絶対選択範囲はあるわけで、別に細かいことを考えなくても良いかぁ…そうすれば前半部分はばっさり捨てることが出来るな。
- 最初に、選択範囲の長さを${lengthofSelection}に格納
- ${lengthofSelection}がゼロでない場合とゼロの場合とで処理を分岐する
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
lengthofSelection=`osascript << EOF
tell application "CotEditor"
if exists front document then
set {Loc,len} to (range of selection of front document)
else
beep
end if
return Len
end tell
EOF`
if [ "$lengthofSelection" != 0 ]; then
INPUT=`cat - `
OUTPUT="<blockquote cite=\\\"\\\" title=\\\"\\\">\n${INPUT}\n</blockquote>\n"
else
OUTPUT="<blockquote cite=\\\"\\\" title=\\\"\\\">\n\n</blockquote>\n"
fi
osascript << EOF
tell application "CotEditor"
activate
if exists front document then
set {loc, len} to (range of selection of front document)
set (contents of selection of front document) to "${OUTPUT}"
set numOfMove to (count of character of selection)
set (range of selection of front document) to {Loc + numOfMove, 0}
end if
end tell
EOF
Page 1 of 4 >>