タグ: TextWrangler.app

TextWrangler.app / BBEdit.appで日本語の文字種変換をやってみる

長い間TextWrangler.appを使い続けていて、機能面で不足を感じていた訳ではないのですが、つい出来心(?)でBBEdit.appにアップデートしてしまいました(次のメジャーアップデートの際に、有料でアップデートするかどうか悩ましいところです…)。
有難いことに、スクリプトは(ほぼ?)完全互換のようで、TextWranglerr.app用に書いたものは全てBBEdit.appで動作します。逆も然り。
AppleScriptではScript内の‘Tell application …’以下の名称をTextWranglerからBBEditに変更するだけです。

現在、mi.appでやれることはほぼBBEdit.appでもやれるようにしていますが、日本語の文字種変換だけ手付かずのままでした。

BB

日本語の文字種変換は、対応していないアプリケーションでも「サービス」に対応していれば、‘CharConvX.app’<http://www5.wind.ne.jp/miko/>を使えば実現できてしまうので、それはそれでいいかな、と放置していたわけです。

で、結局‘sed’を使ってみることにしました。

set vString1 to "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッー・「」。、゚゙"
set vString2 to "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッー・「」。、゜゛"

tell application "BBEdit" --BBEditをTextWranglerに置き換えればTextWrangler.appで動作します
	activate
	if (selection of text window 1 as string) is not "" then
		replace "ヴ" using "ヴ" searching in selection of project window 1
		replace "ガ" using "ガ" searching in selection of project window 1
		replace "ギ" using "ギ" searching in selection of project window 1
		replace "グ" using "グ" searching in selection of project window 1
		replace "ゲ" using "ゲ" searching in selection of project window 1
		replace "ゴ" using "ゴ" searching in selection of project window 1
		replace "ザ" using "ザ" searching in selection of project window 1
		replace "ジ" using "ジ" searching in selection of project window 1
		replace "ズ" using "ズ" searching in selection of project window 1
		replace "ゼ" using "ゼ" searching in selection of project window 1
		replace "ゾ" using "ゾ" searching in selection of project window 1
		replace "ダ" using "ダ" searching in selection of project window 1
		replace "ヂ" using "ヂ" searching in selection of project window 1
		replace "ヅ" using "ヅ" searching in selection of project window 1
		replace "デ" using "デ" searching in selection of project window 1
		replace "ド" using "ド" searching in selection of project window 1
		replace "バ" using "バ" searching in selection of project window 1
		replace "ビ" using "ビ" searching in selection of project window 1
		replace "ブ" using "ブ" searching in selection of project window 1
		replace "ベ" using "ベ" searching in selection of project window 1
		replace "ボ" using "ボ" searching in selection of project window 1
		replace "パ" using "パ" searching in selection of project window 1
		replace "ピ" using "ピ" searching in selection of project window 1
		replace "プ" using "プ" searching in selection of project window 1
		replace "ペ" using "ペ" searching in selection of project window 1
		replace "ポ" using "ポ" searching in selection of project window 1
		set PreString to (selection of text window 1 as string)
		set the clipboard to my Sed_y(PreString, vString1, vString2)
		delay 0.1
		paste
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" subtitle ""
	end if
end tell

to Sed_y(TheString, SString1, SString2)
	do shell script "export LANG=ja_JP.UTF-8; " & "echo " & quoted form of TheString & " | sed -e 'y/" & SString1 & "/" & SString2 & "/'"
end Sed_y

半角カタカナの濁音・半濁音については、半角カタカナが2文字に換算されるので‘sed’のルーチン枠内では変換できないので、無骨に1文字ずつ置換をしています。逆方向の変換は変数を逆にすればOKです。
このやり方をベースにすれば、全角英数字⇄半角英数字の変換も容易です。

広告

mi.appのツールコマンド

TextWrangler.appでいくつかのスクリプトを紹介しましたが、それをmi.appで実現するにはどうするか?
TextWrangler.appの場合は、殆どの機能をAppleScriptから操作可能というところからAppleScriptで書きましたが、mi.appとなると「ツールコマンド」が活躍します。

「ツール」はmi.app独自のもので、よく使う文字列やよく使う処理を、ツールメニューから選択することにより使用できる機能です。
ツールメニューからアクセスできるファイルとして、テキストファイル、AppleScriptコンパイル済みファイル、アプリケーションのエイリアスがあり、「ツールコマンド」を利用するためには、テキストファイル中に「ツールコマンド」を埋め込むような形となります。テキストファイルとして作成されるドキュメントの中の、<<<と>>>の間に囲まれた部分を「ツールコマンド」として認識し、特定の処理を行うことができるという仕組みなのです。

■ツールコマンドのサンプル
・AppleScriptのラインコメントの挿入

選択範囲の段落の先頭を検索して、タブと半角スペースがあればそれも含めて”– “に置換します。

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
^[ \t]*
--

ここでは行頭の半角スペースとタブを外していますが、そのまま残してもいいでしょう。

・AppleScriptのラインコメントの削除

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
^--

同時に、行頭のブレットなどを含めて削除するには、

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
^[ ->・•\t]+[ \t]*

とすればいいでしょう。

・列の反転1<->2

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
^([^\t]+)\t([^\t\r]+)(.*)$
$2\t$1$3

タブ区切りのリストの1列と2列を入れ替えます。

・AppleScriptのブロックコメントの追加

(*
<<<SELECTED>>>*)

なんともシンプルです。

・AppleScriptのブロックコメントの解除

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
\*\)\r

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
\(\*\r

<<<MOVECARET-RIGHT

「ツールコマンド」は、連続して処理できます。

・ダブルクォート間の文字列の選択

<<<FIND-REGEXP-FROMFIRST
(?:["”“])([^"”]*?)(?:["”])

mi.appの場合、検索/置換機能などへのAppleScriptからのアクセスはできません。しかし、それに代わる手段として、「ツールコマンド」を利用した「ツール」を作成し、ツールメニューから実行するという方法がとれます。
また、作者が日本人ということが大きなアドバンテージで、見通しの良いヘルプを日本語で参照できます。

TextWrangler.appのスクリプト—encodeURI.scptとdecodeURI.scpt

TextWrangler.appのドキュメント内の選択範囲の文字列をURIエンコーディングするスクリプトと、その反対でデコードするスクリプトです。
選択された文字列を対象に動作します。

■encodeURI.scpt

tell application "TextWrangler"
	activate
	if (selection of text window 1 as string) is not "" then
		set selection of text window 1 to my encodeURI(selection of text window 1 as Unicode text)
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" -- subtitle "" sound name "Frog"
		(*
		activate
		display dialog "文字列を選択してから実行しましょう。" buttons {"OK"} default button "OK" with icon note giving up after 3
		*)
	end if
end tell

to encodeURI(theString)
	do shell script "echo " & quoted form of theString & " | tr -d '\\n' | perl -pe 's/([^\\w ])/\"%\".unpack(\"H2\", $1)/eg;'"
end encodeURI

■decodeURI.scpt

tell application "TextWrangler"
	activate
	if (selection of text window 1 as string) is not "" then
		set selection of text window 1 to my decodeURI(selection of text window 1 as Unicode text)
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" -- subtitle "" sound name "Frog"
		(*
		activate
		display dialog "文字列を選択してから実行しましょう。" buttons {"OK"} default button "OK" with icon note giving up after 3
		*)
	end if
end tell

to decodeURI(enc_String)
	do shell script "echo " & quoted form of enc_String & " | tr -d '\\n' | perl -pe 's/%([0-9A-Fa-f][0-9A-Fa-f])/pack(\"H2\",$1)/eg;'"
end decodeURI

■補足

OS X 10.9 Mavericksから‘display notification’で通知センターの通知パネルを呼び出せるようになったので、試しに組み込んでいますが、不都合であれば、「(*」と「*)」で囲まれたコメントアウト部分の‘display dialog’と入れ替えて下さい。

TextWrangler.appでAppleScriptのシンタックスカラーリング

TextWrangler.appでは、シンタックスカラーリングをサポートする言語からAppleScriptが外されています。
mi.appでも現在ベータ版の3.0からは対象から外されてしまったようです。
まあ、対象アプリケーションごとにコマンドなどがすっかり変わってしまうような曖昧な言語ですから、整ったカラーリングを行えないというのが現実なのでしょう。
でも、あると便利です。
そこで、TextWrangler.appの親にあたるBBEditで、なんとかならないかと探してみました。

なんとかなるもんです。
ここ<http://bbeditextras.org/wiki/index.php?title=Codeless_Language_Modules>から辿って、ここ<http://www.mail-archive.com/bbedit@googlegroups.com/msg00548.html>で、AppleScript.plistというリンクをオプションキー+クリックでダウンロードします。
(単なるクリックでは、テキストページとして開いてしまいます)
ダウンロード後は、この「AppleScript.plist.txt」をTextWrangler.app開けば、インストール方法が下記のように書かれています。


To install :
( 1 ) You need to open the following folder : ~/Library/Application Support/BBEdit/Language Modules/
( 2 ) Copy the string -&gt; ~/Library/Application Support/BBEdit/Language Modules/
( 3 ) From the Finder menu, select “Go -> Go to Folder…”, paste, and hit return,
it should open the Language Modules folder :
( 4 ) if you get no results in the way of an open window, try the GO menu again with :
( 5 ) Copy the string -&gt; ~/Library/Application Support/BBEdit/

In my case the [Language Modules] folder was missing, so I created one.
You can do the same, so create a new [Language Modules] folder (if required).

Do one of the following :
( 1 ) Download the plist at the top of this document, and put it in the [Language Modules] folder
or
( 1 ) Create an empty document in BBEdit
( 2 ) Paste the contents of this plist, beginning with “<?xml”
( 3 ) Save to the [Language Modules] folder with the name “AppleScript_CLM.plist”
( 4 ) Menu Select “Text -> Zap Gremlins…” to clear up any platform html incompatibilities
( 5 ) Make sure the TYPE AND CREATOR are empty, and restart BBEdit.

要するに、BBEdit.app用のファイルなのですが、上のインストール方法の中のBBEditをTextWranglerに置き換えれば、そのままTextWrangler.appで使えます。
上記を要約すれば、

  • ‘ ~/Library/Application Support/TextWrangler/Language Modules/’を開く(フォルダがなければ作る)
  • ダウンロードした「AppleScript.plist.txt」を「AppleScript_CLM.plist」とりネームして、‘ ~/Library/Application Support/TextWrangler/Language Modules/’フォルダにいれる
  • TextWrangler.Appをリスタートする

以上です。

1

図のように、サポート言語リストにAppleScriptが入っています。
やってみたところ、「AppleScript_CLM.plist」という名前ではなく「AppleScript.plist」でもOKでした。
AppleScript エディタ.appと比べてはいけませんが、それなりの精度でカラーリングしてくれます。

TextWrangler.appのスクリプト—テキストエンコーディングと改行コード変換

テキストファイルのエンコーディング(文字コード)と改行コードは、プラットフォームごとに異なっていて、うっかり異なった組み合わせで手渡すと不要なトラブルになることもあります。
ここでは、代表的な組み合わせをTextWrangler.app上でセットするためのスクリプトを紹介します。

■Shift_JIS/CR+LFの組み合わせ
Windows環境へテキストを渡す場合の最善の方法は、ユニコード(UTF-8)のままWindowsへ転送し、Windows上でユニコード(UTF-8)対応のエディタで開き、変換するというものですが、Mac上で変換をするとすればこの組み合わせの選択となります。
以前、ユニコード(UTF-8)のキャラクタセット指定でWebのサイト構築を依頼され、htmlファイル以下一式を納品したところ、クライアントの担当者から電話が入り、えらく怒鳴られたことがあります。宥めながら理由を聞くと、ノートパッドでindex.htmを開いたところ、たった1行しか画面表示しないとのことで、一体貴殿はどんな仕事をしたのかね、と詰られたことがあります(ブラウザでページを見てくれれば分かったはずなのですが…)。
Web担当者でありながら、テキストエンコーディングと改行コードについての知識がなかったようで、参りました。そりゃあ、数百行のデータが1行しか表示されなければ焦るでしょう。(笑

さて、スクリプト自体はシンプルです。

tell application "TextWrangler"
	activate
	set encoding of text document 1 to "Japanese (Windows, DOS)"
	set line breaks of text document 1 to DOS
end tell

■UTF-8/LFの組み合わせ
OS 9までは、テキスト処理は、通常Shift_JIS/CRの組み合わせでしたが、OS X環境では、これが一般的になりました。
古いMacからのデータを引っ張ってくる時には、この変換が必要となるでしょう。

tell application "TextWrangler"
	activate
	set encoding of text document 1 to "Unicode (UTF-8)"
	set line breaks of text document 1 to Unix
end tell

それぞれ、前面に開いているドキュメントへの処理となります。
TextWrangler.appではScriptsフォルダの中のスクリプトに、パレットメニューからScriptsを選択して表示されるパレットでキーボドショートカットを適用できるので、ショートカットを当てればキー一発で実行できます。
なお、現在のエンコーディングと改行コードをAppleScriptから得るのには、次のようにすれば値を取得できます。

tell application "TextWrangler"
	activate
	get encoding of text document 1
	get line breaks of text document 1
end tell

因に、TextWranglerで‘Japanese’として実装されているエンコーディングは図のように6種類あります。

2013-10-25 5.11.33

■補遺
参考までに、文字コード、Shift_JIS、改行コードについてのWikiページをリストアップしておきます。
<http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89>
<http://ja.wikipedia.org/wiki/Shift_JIS>
<http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89>

TextWrangler.appのスクリプト—Line comment_Remove.scpt

TextWrangler.appのドキュメント上で、AppleScriptのラインコメント”– “を追加するためのスクリプトを紹介しましたが、今度はその削除をするスクリプトです。

2013-10-24 5.37.35

選択範囲の段落の先頭を検索して、”– “だけでなく”>”、”・”、”•”、”タブ”があれば同時に削除してします。
処理はハイライト部分だけですから、削除は追加に比べて随分簡単です。

tell application "TextWrangler"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "^[ ->・•]+[ \\t]*" using "" searching in selection of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
	else
		activate
		display dialog "文字列を選択してから実行しましょう。" buttons {"OK"} default button "OK" with icon note giving up after 3
	end if
end tell

TextWrangler.appのスクリプト—Line comment_Add.scpt

TextWrangler.appのドキュメント上で、AppleScriptのラインコメント”– “(ハイフン2つ)を追加するためのスクリプトです。

2013-10-22 14.57.31

選択範囲の段落の先頭を検索して、タブと半角スペースがあればそれも含めて”– “に置換します。
実に単純なロジックなのですが、選択範囲に段落末の改行が含まれると、TextWrangler.appは次の段落の先頭にも”– “を付加してしまいます。
例えば2行の段落を段落末の改行まで選択して、このハイライトになっている‘replace “^[ \\t]*” ….’以下のステップを実行すると、選択範囲の次の段落(行)の先頭にまで”– “が挿入されるという訳です。

さて、考えました。
TextWrangler.appでキャレットを動かすスクリプトが見当たらなかったので(方法があるのかも知れませんが…)、‘System Events’から‘→’キーを一回打って、その位置から段落頭の”^– “を検索し、選択状態にして、その部分を削除しています。
かなりスマートではない方法です。(汗

置換文字列を”– “から、”・”や”• “に換えれば、ブレットリストが作成できます。また、”> “で引用符にもできます。

tell application "TextWrangler"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "^[ \\t]*" using "-- " searching in selection of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
		tell application "System Events"
			key code 124
			delay 1
		end tell
		find "^-- " searching in text 1 of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false} with selecting match
		set selection of text window 1 to ""
	else
		activate
		display dialog "文字列を選択してから実行しましょう。" buttons {"OK"} default button "OK" with icon note giving up after 3
	end if
end tell

更に、iCloudを経由した環境の同期

e86d7iClouDrive.appを使って、mi.appのツールフォルダをもう一つのマシンと同期させましたが、同じ手法で、スクリプトメニューのユーザスクリプトフォルダ、TextWrangler.appのスクリプトフフォルダを同期させました。

66398

iClouDriveフォルダの本体は、‘~/Library/Mobile\ Documents/iClouDrive’にあり、アクセスしやすいようにシンボリックリンクがホームディレクトリにあります。
スクリプトメニューのユーザスクリプトフォルダの置き場所‘~/Library’にはシンボリックリンクで‘Scripts’フォルダを置き、TextWrangler.appのスクリプトフフォルダは、‘~/Library/Application\ Support/TextWrangler/Scripts’の中に‘TextWrangler_Script’のシンボリックリンクを置きました。

■iClouDriveを使うメリット

  • iCloud経由ですので、Macintoshで扱えるファイル名であれば同期時に制限を受けない
  • 他のクラウドストレージと比べても、小さいファイルでは同期が速い

という点がiClouDrivを使うメリットとしてあげられます。予想以上にレスポンスはいいです。

ユーザスクリプトフォルダの同期では、システム環境変数に関わる系統のスクリプト/アプリケーションでは誤動作が発生しますし、パスワードやユーザ名を保持するタイプのものも誤動作を起こしやすいでしょう。その辺りのスクリプト・アプリケーションは同期対象から外しておいた方が無難です。

来るOS X 10.9 MavericksではKeyChainもiCloud経由で同期できるようになるみたい(少し難産になりそうな気配ですが…)なので、こういった環境の同期はどんどん進むのでしょう。
この次に同期したいのは、ホットキーですね。

TextWrangler.appのスクリプトメニューにショートカット設定

もうあと少しでメインエディタの位置に座ってもおかしくないのですが、日本語の扱いの部分でいまいちメインに座れない残念なエディタがTextWrangler.appです。
残念な部分は、

  • 句読点を文字区切りとして認識しているらしく、ホワイトスペースが混じる段落では、妙な位置で行の折り返しをしてしまう(句読点で挟まれたかな漢字部分を大きな単語として扱っているような感じ)
  • もちろん、禁則処理に対応していない
  • もちろん、かな⇔カナ⇔カナなどの文字種変換機能は持っていない

などでしょうか。
とはいえ、この不満点を補ってあまりある程の便利な面もあります。

  • サイズの大きなファイルを難なく開ける
  • 自動判別では開けないエンコーディングの不明なファイルを、オープンダイアログからエンンコーディングを手探りで指定しながら開くと開けてしまったりする
  • バイナリplistファイルを、XMLplistファイルのように開いて編集できてしまう
  • 豊富なメニューコマンドのほぼ全てにAppleScriptからアクセスでき、ダイアログを介した検索などのコマンドでもレコーディングできてしまう

などが便利な点のいくつかでしょうか。
「Text」メニューの項目を見るだけでも多機能ぶりが分かります。これで無償ですから頭が下がります。
e7821

■スクリプトメニュー
TextWrangler.appのスクリプトメニューはこんな感じです。

ea82e

上記のように、ほぼ全てのメニューコマンドをAppleScriptでコントロールできます。Grepでの検索置換、ソートなどもオプション設定を含めてスクリプトで記述できますので、複数の処理ステップを含んだマクロ処理までスクリプトで実現できます。
サブフォルダの「TextWrangler_Script」は自作のスクリプト集ですが、図のように、サブフォルダのスクリプトでもショートカットを割り当てることができます。

c0728
ショートカットの割当は、「Window」メニューの「Palletes」から「Scripts」を選択すると開くパレットから指定できます。

郵便番号検索(Dashboard Widget)の郵便番号データを加工する

郵便番号検索(Dashboard Widget)は、最初のリリースが2005/10/25となっていますから、かなり古いWidgetです。
郵便番号からでも住所の一部からでも検索でき、検索結果の郵便番号や住所をクリックするとクリップボードにコピーされます。
以前は、郵便局の番号検索サイトを使って自動検索するツールやスクリプトなどを書いたりもしていたのですが、郵便局の番号検索サイトのアドレスが変わったり、仕様が微妙に変化したりで、結局更新が滞ることになってしまい、番号データをローカルで持つ郵便番号検索(Dashboard Widget)に敵わないので、結局更新をやめてしまった記憶があります。
若干入力に対するレスポンスで難があるものの便利な郵便番号検索(Dashboard Widget)ですが、郵便番号データの更新があまり早くないのが残念でした。
そこで、数年前から、郵便番号データの更新に合わせて、郵便番号検索(Dashboard Widget)内のデータ更新を勝手にやってしまうことにしました。個人的な利用に限っては許される範囲の加工だと思います。
郵便番号データは、ここから入手できます。
郵便番号検索(Dashboard Widget)のバンドルパッケージを開いたところが次の図で、赤線で囲んだ2つのファイルが住所データです。今回は、‘AddressData.tsv’(全国版)を新しい郵便番号データに置き換えます。

572eb

‘AddressData.tsv’と郵便番号データ(全国版)のテキストデータ‘KEN_ALL.CSV’を並べてみると構造の違いが分かるでしょう。

899cd

‘KEN_ALL.CSV’はcsvファイルとなっていて、エンコーディングはS-JISです。カンマで区切られたテキストファイルを、例えばエクセルで読み込んでみると、15列(項目)に分かれることが分かります。郵便番号検索(Dashboard Widget)が必要としている(利用している)項目は、3から9列(項目)までの7つの列(項目)だけです。

以下、必要な項目の抜き出しを、TextWrangler.appでやってみます。
先ず、3と4,5,6列、7,8,9列と3グループにタブで区切って、分けて抜き出します。
もう少しスマートに書けるのですが、ここは分かりやすく、

検索:^([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),.+$
置換:\3\t\4\5\6\t\7\8\9

次に、読みにくいので、ダブルクォーテーションを削除します。

検索:”
置換:

次に、読みと住所データの順序を入れ替えます。

検索:^(.+?)\t(.+?)\t(.+?)$
置換:\1\t\3\t\2

次に、郵便番号データの7桁の数字にハイフンを挿入します。

検索:^(\d\d\d)(\d\d\d\d)
置換:\1-\2

これで終わりです。(住所の読みの部分は、気になるようでしたら、半角カタカナから全角カタカナに変換するといいでしょう。mi.appでは文字種変換を編集メニューに持っていますが、TextWrangler.appは当然持っていませんので、自作のReplaceString_ClipDIC_TW.scptを使いましたが、12万行処理できました)

最後に、ドキュメントのエンコーディングをUTF-8、行末コードをLFに設定して、ファイル名を‘AddressData.tsv’として、郵便番号検索(Dashboard Widget)のバンドルパッケージ内の同名のファイルと置き換えます。