Jedit X misima AppleScript

Mac OS X のエディタ Jedit X 用の misima 旧字・旧仮名変換対応 AppleScript ができた。

call soap のリターン値において Unicode テキストがエラーになる前回問題への対応として,以下の工夫を行った。

  1. misima で変換結果を "0xFFFF"(UCS 十六進数) 形式で出力するオプションをサポートする。
  2. call soap リターンをパラグラフに分割する。
  3. パラグラフごとに変換結果 Unicode 十六進テキストを print pack("U*", 十六進テキスト); に埋め込んで perl を do shell script で呼び出し,Unicode 文字列に復元する。

つまり,call soap のリターン値をすべて ASCII コードで表現することにより "Unknown Escape" エラーを回避でき,一方,Unicode テキストへの復元は Perl がやってくれると言うわけである。

完成した misima SOAP 変換 Jedit X 対応 AppleScript コードを掲載しておく。"¬" は行の折返しを示しており,前後を 1 行に連結して入力しなければならない。Jedit X のスクリプトウィンドウから登録して実行すれば,選択テキストを私の misima SOAP サーバで変換することができる。いずれ misima パラメータ指定などを整理して misima パッケージにも同梱して公開するつもりでいる。

-- misima パラメータ: 旧字,旧仮名,単純,用字・用語変換,十六進形式 ¬
    -h 新設: misima 変換結果を Unicode 「0x十六進数」形式で返却
property misimaargs : "-kithy -s c"
 
-- 選択テキストを取得
tell application "Jedit X"
    tell front document
        copy selected text to tString
    end tell
    if (count characters of tString) = 0 then
        display dialog "変換したい文字列を選択してください。" buttons {"OK"}
        return
    end if
end tell
 
-- misima 引数をセット
set misimaParm to misimaargs
 
-- misima SOAP Server call
tell application "http://yasuda.homeip.net/axis/services/¬
misimaSoapConnector"
    set rText to (call soap {method name:"misimaConvert", ¬
        parameters:{Params1:misimaParm as string, ¬
        Params2:tString as Unicode text}})
end tell
 
-- 0xFFFF 形式を Unicode 文字列に復元
set the sText to misimacnv(rText)
 
-- 選択テキストを結果で置換
tell application "Jedit X"
    tell front document
        set selected text to sText
    end tell
end tell
 
--  0xFFFF 形式を Perl で文字に変換
on misimacnv(str)
    -- パラグラフ参照を定義
    script list_paragraphs
        property contents : paragraphs of str
    end script
    -- Unicode テキスト処理
    set rt to ""
    repeat with line_item in contents of list_paragraphs
        -- Perl print 文に十六進形式の変換結果を埋め込む。
        set p to "print pack(\"U*\", " & (get contents of line_item) & ");"
        -- 改行 0x000a を "\n\n"(改行 2 個) に置換。¬
            (do shell script が行末改行を削除するため)
        set the p to replace(p, ", 0x000a);", ") . \"\\n\\n\";")
        set rt to rt & (do shell script "perl -e " & quoted form of p)
    end repeat
    return rt
end misimacnv
 
-- テキスト置換ハンドラ
on replace(src, tg, rp)
    -- delimiter をバックアップ
    set delmback to AppleScript's text item delimiters
    -- 変換対象テキストを区切りにして分割
    set AppleScript's text item delimiters to tg
    set tmpList to text items of src
    -- 置換テキストを区切りにして復元
    set AppleScript's text item delimiters to rp
    set cText to tmpList as string
    -- delimitter を復元
    set AppleScript's text item delimiters to delmback
    -- 置換結果を返却
    return cText
end replace

以下に Jedit X での変換の様子を示す。

jedit-pre.png
Jedit X 変換前
 
jedit-post.png
Jedit X 変換後
 

しかしながら do shell script が行末改行を削除する仕様であることに気づくのには時間を要してしまった。Apple のテクニカルノート 2065 が救ってくれた。また O'REILLY の Matt Neuburg 著 "AppleScript, The Definitive Guide, 2nd Edition"(2006) は,Unicode の取り扱いがヘボな AppleScript で,Perl を呼び出すことで <<Unknown Escape>> エラーを回避するというヒントを与えてくれた。まさに Definitive 決定版である。AppleScript における SOAP, XML-RPC サポートに関する技術解説は Introduction to XML-RPC and SOAP Programming Guide を参照。インターネットを探しても,こういう Tips を公開している個人サイト,メーリングアーカイブはまれで,やはり Apple の技術文書や権威あるリファレンスに当たるべきとの思いを強くした。ちょっと特殊な道にそれると日本人の書いた文書は役に立たず,英文の解説に頼らざるをえなくなることが多い。何故か。