ATOKダイレクトAPIでタグ入力補完プラグインを作ってみた

作ってみました。
例によってRubyです。


公開場所:SkyDrive
http://cid-8200fae396e53ba8.skydrive.live.com/self.aspx/ATOKDirectPlugin/tag|_comp.zip


このプラグインは入力「」に対して、「」を出力します。
そして、の間にキャレットを移動します。


以下、ソース。

require 'win32ole'
require 'Win32API'
require 'win32/clipboard'
require 'jcode'

module Atok_plugin
def run_process( a_request_data )

startTag = a_request_data[ 'composition_string' ].tr("<>A-Za-z:”−_", '<>A-Za-z:"-_')
unless startTag =~ /^$/ then
startTag += '>'
end

endTag = startTag[/^<[^>\s]+/]
endTag += '>'
endTag.insert(1, "/")

wsh = WIN32OLE.new("Wscript.Shell")

Win32::Clipboard.empty

Win32::Clipboard.set_data startTag + endTag
wsh.SendKeys("{ESC}")
wsh.SendKeys("^v")

for i in 1..endTag.length
wsh.SendKeys("{LEFT}")
end

result_data = Hash.new
end
end

簡単に説明しますと。

  1. ESCのキーイベントを送りつけてATOKの入力状態を解除。
  2. 入力文字列を受け取り加工する。
  3. クリップボードに出力文字列を流し込む。
  4. Ctrl+vのキーイベントを発行
  5. LEFTのキーイベントを閉じタグの文字数分発行

以上です。


要するに、ATOKのことを一切無視して自力で文字列を入力することもできますよ、ってこと。
まあ、かなり無茶苦茶やってますので、すべての環境でちゃんと動作するか怪しい面が多々ありますが。
なんで出力をクリップボードに積んでいるかというと、日本語要素名に対応させるためと言うわけではなく(むしろこの実装だと化ける)、キーイベントで送るとATOKが未確定文字列として補足してしまうからです。キャレット移動を考えなければキーベントでもいいんですが。むしろATOKが学習してくれるようになるのである意味便利かもしれません。


ちなみに、ESC送ってるので他のプラグインと一緒に動作させると他のプラグインを停止させてしまいます。
なので「プラグインを指定して検索(Ctrl+Shift+Ins)」でしかまともに動作しません。


日本語入力にも対応すれば、新しい方向性が模索できそうな気がします。クリップボード経由の整形済み文書入力とか。
まあ、今回取った手法では候補の表示ができないので、ほぼ1対1の変換しかできないのが問題と言えば問題ですかね。