はてなブックマークのタグ補完を改善

完成版はこちら

// ==UserScript==
// @name           Yet Another Hatena Bookmark Tag Suggestion
// @namespace      http://d.hatena.ne.jp/nozom/
// @description    Improve Tag Suggestion of Hatena Bookmark
// @include        http://b.hatena.ne.jp/add?*
// @include        http://b.hatena.ne.jp/edit?*
// ==/UserScript==

// This script higly depends on tag_suggest.js.
// So, it might not work with the future release.

(function() {
    function onKeyDownHandler(e) {
        if (e.keyCode == 9) {
            var win = window.wrappedJSObject;
            var doc = document.wrappedJSObject;
            if (! win.suggesting) return;
            if (win.candidates.length == 1) {
                var ev = doc.createEvent('KeyboardEvent');
                ev.initEvent('keypress', true, true, win, false, false, false, false, 13, 13);
                var obj = e.target.wrappedJSObject;
                // obj.dispatchEvent(ev);

                // dirty hack, however it works
                var ev2 = new Object;
                for (prop in ev) {
                    ev2[prop] = ev[prop];
                }
                with (ev2) {
                    charCode = which = 13;
                    target = obj;
                    preventDefault = stopPropagation = function() {};
                }
                win.onKeyPressHandler(ev2);
            }
        }
    }

    var commentInput = document.getElementById("comment");
    commentInput.addEventListener("keydown", onKeyDownHandler, false);
})();

まだ全然完成ではないけど、とりあえずコンセプトコードということで公開。
やりたいことは、はてなブックマークではタグとコメントが同じ入力欄なために

  • タグを打つたびに[を入力する必要がある
  • タグ補完を決定するつもりでENTERキーを押したらタイプミスしていてコメント入力自体終了、という事故が起こりやすい

という問題を改善すること。
今回は、タグ補完の決定にENTERキーだけでなくTABキーも使えるようにして2番目の問題に対処した(Google Reader風)。候補が2つ以上の時TABキーは次候補へ移動に割り当てられてるので、ちょっと微妙な操作感だけどまあいいか。

技術的には、Greasemonkeyから元のページの変数へのアクセスのしかたとか、キーイベントの生成方法とか、その辺りがこれまで知らなくて勉強になった部分。

追記

Greasemonkeyから元のページの変数へアクセスするには、unsafeWindowを使うのが正しいようだ。