ATOK のプラグインをつくる

ATOK には「ATOK ダイレクト」という機能があり、ユーザが入力した文字列を渡して、任意の Ruby、Python、Perl スクリプトを実行することができます。

開発の方法は上のページに書かれているのですが、結構面倒な手順があるので、atokplugin というツールをつくりました。

このツールを使って、「いま」と入力したら ISO8601 の形式で日付・時刻を出すプラグインを作ってみます。

なお、atokplugin は OSX Mavericks、ATOK 2013、Ruby 2.0+ でのみテストしています。それ以外の環境では動かない可能性が高いです。

ATOK ダイレクト API モジュール のインストール

プラグインの作成には JustSystem が提供している「ATOK ダイレクト API モジュール」が必要です。

下記ページの下の方にある「モジュールダウンロード」ボタンから adsapi26.dmg をダウンロードします。

ダウンロードしたらマウントして適当なディレクトリにコピーします。

ここでは ~/adsapi25 にコピーしたものとします。

atokplugin のインストール

下記コマンドを実行します。

$ gem install bundler
$ git clone https://github.com/labocho/atokplugin.git
$ cd atokplugin
$ rake install

実行には ATOK ダイレクト API モジュール のパスを環境変数で指定する必要があります。~/.profile などに下記の記述を追加しましょう。

export ATOK_TOOLS_ROOT=$HOME/adsapi26

プラグインの作成

ここからプラグインを作成します。

適当なディレクトリで atokplugin new を実行します。使用する言語とプラグインの名前を指定します。プラグインの名前は date、Python で書くことにします。

$ atokplugin new --lang python date
Create plugin directory: date
Copy plugin template: date/date.py
Create: date/LICENSE.TXT
Create: date/atokplugin.yml
Create: date/.gitignore

これから先は、上記コマンドで作成された date ディレクトリ内で作業します。

$ cd date

プラグインの開発

実際の処理は date.py に書きます。まずはできあがりを見てみましょう。

#! /usr/bin/env python
# coding:utf-8

import datetime

def atok_plugin_run_process( a_request_data ):
  result_data = {}
  candidate_array = []

  # datetime
  if a_request_data['composition_string'] == u"いま":
    now = datetime.datetime.now()
    # 現在日時を ISO8601 形式にしたものを候補に追加
    candidate_array.append({'hyoki': unicode(now.strftime("%Y-%m-%dT%H:%M:%S"))})

  result_data[ 'candidate' ] = candidate_array

  return result_data

要点は下記の通りです。

  1. 引数を 1 つとる atok_plugin_run_process 関数を定義する
  2. 引数['composision_string'] にユーザの入力した文字列が入っている
  3. {'candidate': [{'hyoki': u"候補"}, ...]} を返り値とする

サンプルにはコメント入れたり、XHTML 入れたりしている例もあります。

デバッガの実行

デバッガで動作を確認してみましょう。

$ atokplugin debug
Create temporary directory: /var/folders/q0/ync5c_c56nndjtzzg3cgth_c0000gn/T/d20140223-24845-evjeeb
Launch debugger

"表記" に「いま」と入力して "実行" をクリックしてみます。

"標準出力結果" に候補が表示されました。デバッガを起動したままでソースを書き換えることもできますので、期待する動作になるまで、いろいろ試してみてください。

プラグインのインストール

デバッガでうまく動作することを確認したら、インストールしましょう。

$ atokplugin install
Remove directory: pkg
Create directory: pkg
Build succeeded
Launch installer

インストーラが起動するので、指示に従って操作していけばインストールできます。

ログアウトを要求されるので、ログアウト / ログインし、「いま」と入力して ⌥T を押します。

いい感じですね!

プラグインの配布

atokplugin build を実行すると、pkg ディレクトリに、インストーラを含む配布用のファイルを作成できます (atokplugin install 時にも作成されます)。

$ atokplugin build
Remove directory: pkg
Create directory: pkg
Build succeeded
$ tree pkg
pkg
├── DATA
│   ├── date.py
│   └── date.xml
├── LICENSE.TXT
├── SETUPINFO.XML
└── atok_plugin_installer.app
...

ATOK ダイレクト API モジュール のライセンス表示をみると、インストーラの再配布も大丈夫そうではあるんだけど、バイナリをプラグインの作者に配布させるのは、ちょっとどうかなとも思います。

トラブルシューティング

作成中 2 つの問題に突き当たりました。

Ruby で書けない

ATOK ダイレクト API モジュール に同梱されている Ruby 版のサンプルをデバッガで実行すると次のようなエラーが表示されます。

Ruby 1.8 の頃に使われていたライブラリ jcode をロードしようとして失敗しています。Mavericks からデフォルトの Ruby が 2.0.0 に変わったのが原因でしょう。

たぶん回避するすべはないので、おとなしく Python か Perl で書きましょう。

いちおう、問い合わせフォームから報告はしておきました。

「検索処理でエラーが発生しました」と表示される

インストール後、文字列を入力して ⌥T を押しても「検索処理でエラーが発生しました」と表示されて、候補が表示されませんでした。

ATOK の設定から「ATOKダイレクト for iTunes」を無効にしたら解決しました。これも iTunes のバージョンの関係ですかね。