Thanks Driven Life

日々是感謝

KeySnail を触ってみた&翻訳プラグインを作ってみた

最近まで Firefox でのキーバインドFiremacs を使っていましたが
どうにも物足りない。確かに充分動いてくれてはいるのだけれど。
なぜだろう。周りの人が Vimperator を使っていて、あの変態っぷりなカズタマイズが
Firemacs にもほしいなぁと思ってたりしました。そんなときに KeySnail を発見しました。

https://addons.mozilla.org/ja/firefox/addon/13118

これは Vimperator と同じように(って考えてもいいのかな)、JavaScript
いろんな関数を定義しつつそれをキーに割り当てることができるので
拡張性がさらに高まっているんじゃないかと思います。何よりデフォルトで Emacs ライクなのがベネ。


少し触ってみた感じ、特に問題無し。
タブの移動が lh ってのは vim のアレだと思いますが(w3m?)、これもまあよし。
Firemacs に慣れていたので、C-f、C-b で動けばいいなー。なぜか今は動かないけど。


せっかくなので、何かプラグインを作ろうと考え、簡単そうな翻訳をすることに。
エキサイト翻訳の英和・和英に対応したやつを試しに作ってみました。

key.setGlobalKey('C-1', function (ev, arg) {
    var trans_list = [];

    trans_list.push(["je", "和英"]);
    var JAEN = 0;
    trans_list.push(["ej", "英和"]);
    var ENJA = 1;

    prompt.selector({
        message: "Select Translation",
        collection: trans_list,
        callback: function (sel) {
            prompt.read("String: ", function (input, trans) {
                function createHttpRequest() {
                    if (window.ActiveXObject) {
                        try {
                            return new ActiveXObject("Msxml2.XMLHTTP");
                        } catch(e) {
                            try {
                                return new ActiveXObject("Microsoft.XMLHTTP");
                            } catch(e2) {
                                return null;
                            }
                        }
                    } else if (window.XMLHttpRequest) {
                        return new XMLHttpRequest();
                    } else {
                        return null;
                    }
                }

                var xhr = createHttpRequest();

                xhr.onreadystatechange = function (aEvent) {
                    if (xhr.readyState == 4) {
                        if (xhr.status != 200) {
                            // error 処理とか
                            return;
                        }
                        var text = xhr.responseText;
                        text.match(/<textarea [^>]+after[^>]+>(.+)<\/textarea>/i);
                        alert(RegExp.$1);
                    }
                };

                var uri = "http://www.excite.co.jp/world/english/?";
                var direction = "";

                if (trans == JAEN) {
                    direction = "JAEN";
                } else {
                    direction = "ENJA";
                }

                xhr.overrideMimeType("text/html; charset=Shift_JIS");
                xhr.open("GET", uri + "wb_lp=" + direction + "&before=" + EscapeSJIS(input), true);
1970 00:00:00 GMT");
                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xhr.send("");
            },
            sel);
        }
    });
}, 'translation');

操作方法は

  • C-1 を押すと 英和(je)か和英(ej)を選ぶ prompt.selector が起動
  • 選択すると、次に翻訳したい文字列を入力し、Enter
  • 翻訳結果を alert() で表示するというダサい仕様

まだまだ見落としありそうですが、なんとか動いています。
もう少し形になったら github にでも上げるか。へぼくてもいい。人間だもの。


翻訳対象の文字列は、encodeURIComponent() 経由で渡しても文字化けしてしまったので
エキサイト翻訳のcharset である ShiftJIS に変換して渡してあります。
EscapeSJIS は http://nurucom-archives.hp.infoseek.co.jp/digital/escape-codec-library.html のライブラリから呼んでいます。
他jsファイルを使う場合は、本家HP にも書いてあるように
該当ファイルを準備してから

userscript.require("ecl.js");

とやれば読んでくれるでしょう。


これからいろいろ作っていきたい。