misima RESTful Web Service Microsoft Word クライアント

misima RESTful Web Service サーバを書いた。端末から利用する Java / Perl クライアントも書いた。Web ブラウザ用 JavaScript も書いた。で,せっかくの Web Service なので,今日は Microsoft Word クライアントも書いてみた。旧字・旧仮名遣い変換なんて文章作成のための編集ツールなのだから,GNU Emacs や Microsoft Word といった文書編集ソフトウェアから直接呼び出すに如かずである(Emacs Lisp クライアント例についてはすでに「misima RESTful Web Service Perl クライアント」記事に記した)。ブラウザに依らずこういう使い方が簡単にできるところこそ,Web サービスの真骨頂だろう。なお,サーバ側の実装については,弊サイト記事『JAX-RS - misima RESTful Web Service の実装』を参照。

Microsoft Word クライアント実現方式・設計

VBA (Visual Basic for Applications) 言語を用いて,Word マクロ(マクロ名 misimaConvert)を作成する。MSXML2.XMLHTTP オブジェクトを使えばいとも簡単にできてしまう。設計は以下のとおり。

  1. Microsoft Word 編集の選択テキストを変換対象とする。Selection.Text でこれを取得し,misima RESTful サーバ入力となる XML を組み立てる。misima オプション,ユーザ認証コードはハードコーディング。
  2. MSXML2.XMLHTTP オブジェクトにサーバ URI,Content-Type をバインドし,misima RESTful Web Service サーバに POST する。
  3. サーバで旧字・旧仮名遣い変換された結果を responsText で受け取る。ステータスが 200(正常)でなければエラーを表示する。
  4. 変換後テキストで選択テキストを置換する。

Word VBA マクロモジュールの作成

Microsoft Word 2003 で Visual Basic Editor を起動して,misimaConvert マクロモジュールを作成する。

ツール(T) - マクロ(M) - Visual Basic Editor(V) を選択し,Visual Basic Editor を起動する。Microsoft Word 2007 以降ではこの起動の仕方は異なるかも知れない。

プロジェクト・フレームの Normal を右クリックして 挿入(N) - 標準モジュール(M) を選択し,Normal - Module1(コード) の作業画面を開く。これに VBA コードを書いてゆく。モジュールコードが出来上がったら コントロール-S でセーブする。(図 1. を参照)

20140314-vbedit.png
図 1. Visual Basic Editor

misimaConvert の VBA コードは以下のとおり。MSXML2.XMLHTTP オブジェクトを生成して,これにサーバ URI,ヘッダをバインドし,対象 XML データを POST するところが中核の処理である。たったこれだけである。

Sub misimaConvert()
 
    ' XMLHTTPオブジェクトを生成
    Dim xmlHttp As Object
    Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
 
    ' 選択テキスト(Selection.Text)から送信XMLデータを組み立てる
    ' misima変換オプションは "-s c -kyti -q"
    ' = 旧字UCS(s)/旧かな(k)/用語用字(y)/単純補正(t)/繰返符号(i)の各変換
    ' ユーザ識別コードはnoxinsomniae201402(暫定)
    Dim misimaXml As String
    misimaXml = "<?xml version=""1.0"" encoding=""UTF-8""?>" & _
        "<misimaRESTful>" & _
        "<misimaParam>-s c -kyti -q</misimaParam>" & _
        "<misimaTarget>" & Selection.Text & "</misimaTarget>" & _
        "<misimaUsercode>noxinsomniae201402</misimaUsercode>" & _
        "</misimaRESTful>"
 
    ' misima RESTful Web ServiceにXMLデータをPOST(同期POST)
    Dim URI As String
    URI = "http://yasuda.homeip.net:8080/misimaRest/misima/convert"
    xmlHttp.Open "POST", URI, False
    xmlHttp.setRequestHeader "Content-Type", "text/xml;charset=utf-8"
    xmlHttp.send (misimaXml)
 
    ' 通信ステータスを判定し,200(正常)ならresponseTextで選択テキストを置換
    Dim statusCode As String
    statusCode = xmlHttp.Status
    If statusCode <> 200 Then
        MsgBox "misima RESTful Web Service エラー: " & statusCode
    Else
        Selection.Text = xmlHttp.responseText
    End If
    Set xmlHttp = Nothing
 
End Sub

misimaConvert マクロの実行

Microsoft Word の文書編集画面にて,編集中の文章の旧字・旧仮名遣い変換を施したい部分を選択する(マウスをドラッグしてテキストを反転させる)。(図 2.)

20140314-vbconv1.png
図 2. 変換前

ツール(T) - マクロ(M) - マクロ(M)... で表示されるマクロ画面(図 3.)のマクロ名にある misimaConvert を選択し,実行ボタンをクリックすると,旧字・旧仮名遣い変換が実行される。(図 4.)

20140314-vbmac.png
図 3. マクロ選択画面
20140314-vbconv2.png
図 4. 変換後

miscellaneous

使い勝手を考えると,マクロメニューから選択するよりも,ボタンやメニューに misimaConvert マクロを紐づけて,即座に実行できるようにし,Word テンプレートに保存しておくとよい。

私は Microsoft Word 2003 (Windows 7) で試したけれども(手元にはこれしかないの),おそらく 2007,2010 でも同様の作業で(Visual Basic Editor 起動の仕方が若干異なるにせよ),動くマクロが作成できると思う。Excel 用マクロに仕立て直すのも簡単だろう。

企業のプロキシ Web 環境でも,IE のプロキシ設定が適切になされていれば,上記 misimaConvert コードのままでユーザ認証(外部サイトに出るための認証)を経て Web Service にアクセスできるはずである。

参考文献

RESTful Webサービス
Leonard Richardson Sam Ruby
オライリー・ジャパン
Word Hacks―プロが教える文書活用テクニック
アンドリュー・サビカス Andrew Savikas, 日向 あおい[訳]
オライリージャパン (2005/07)

[ 2015/02/02 付記 ]
misima RESTful Web Service は 2014/12 より友人のためだけの限定公開といたしました。上記ユーザ認証コードでは動作しません。