2009年7月6日月曜日

ATOKの電子辞典をFirefoxで引く(Jetpack)

Jetpackで何か作ってみたかったので作ってみた。
OperaでATOK 2007 for Windowsの電子辞典を使うためのツールが必要。

ステータスバーにATOKのアイコンが出ます。
テキストを選択した状態で、アイコンをクリックすると電子辞典の検索を行います。

本当はコンテキストメニューに登録して呼び出すのがやりたかったんだけど、
Jetpackでやる方法がわからなかったので、この形にしました。

(function() {
var cmd = 'c:\\path\\to\\GetTextOperaLClick.exe';

var convert = function(s, charset) {
var ccls = "@mozilla.org/intl/scriptableunicodeconverter";
var cif = Components.interfaces.nsIScriptableUnicodeConverter;
var c = Components.classes[ccls].getService(cif);
c.charset = charset;
return c.ConvertFromUnicode(s);
}
var lookup = function(s) {
var fcls = "@mozilla.org/file/local;1";
var fif = Components.interfaces.nsILocalFile;
var pcls = "@mozilla.org/process/util;1";
var pif = Components.interfaces.nsIProcess;
var file = Components.classes[fcls].createInstance(fif);
file.initWithPath(cmd);
var process = Components.classes[pcls].createInstance(pif);
process.init(file);
var args = [convert(s, "shift_jis")];
process.run(false, args, args.length);
}

jetpack.statusBar.append({
html: '<img id="icon_img" src="http://www.atok.com/favicon.ico />',
width: 30,
onReady: function(doc) {
$('#icon_img', doc).css({
cursor: "pointer",
});
$(doc).click(function() {
var w = jetpack.tabs.focused.contentDocument.getSelection();
if (w.length) {
lookup(w);
}
});
}
});
})();

選択するだけで検索する版(使いにくい)
アイコンをクリックすると、機能のon/offができます。
無効(初期)状態では、アイコンが半透明になっています。
有効になっているときは、テキストを選択してマウスのボタンを離すと電子辞典の検索が動きます。
(クリックイベントが発生したときに、選択されているテキストの長さで判断してます)

(function() {
  var cmd = 'c:\\path\\to\\GetTextOperaLClick.exe';
  var enabled = false;

  var convert = function(s, charset) {
    var ccls = "@mozilla.org/intl/scriptableunicodeconverter";
    var cif = Components.interfaces.nsIScriptableUnicodeConverter;
    var c = Components.classes[ccls].getService(cif);
    c.charset = charset;
    return c.ConvertFromUnicode(s);
  }
  var lookup = function(s) {
      var fcls = "@mozilla.org/file/local;1";
      var fif = Components.interfaces.nsILocalFile;
      var pcls = "@mozilla.org/process/util;1";
      var pif = Components.interfaces.nsIProcess;
      var file = Components.classes[fcls].createInstance(fif);
      file.initWithPath(cmd);
      var process = Components.classes[pcls].createInstance(pif);
      process.init(file);
      var args = [convert(s, "shift_jis")];
      process.run(false, args, args.length);
  }

  jetpack.statusBar.append({
    html: '<img id="icon_img" src="http://www.atok.com/favicon.ico />',
    width: 30,
    onReady: function(doc) {
      $('#icon_img', doc).css({
                   cursor: "pointer",
                   opacity: 0.4
      });
      $(doc).click(function() {
        var elem = $('#icon_img', doc);
        var a;
        if (enabled = !enabled) {
          a = 1;
          $(jetpack.tabs.focused.contentDocument).click(function() {
            var w = jetpack.tabs.focused.contentDocument.getSelection();
            if (w.length) {
              lookup(w);
            }
          });
        } else {
          a = 0.4;
          $(jetpack.tabs.focused.contentDocument).unbind('click');
        }
        elem.css({opacity: a});
      });
    }
  });
})();




0 件のコメント:

コメントを投稿