IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

id:otsune さんと id:otsnue さんを間違えないようにする Greasemonkey

最近、はてなユーザーも多様化してきて

似た名前のユーザーって多いですよね><!
たとえば、以下のように名前を間違えるというようなこともままあります。

  • id:otsune id:kajuntkさん。そのidは私じゃありません。 2009/01/12
  • id:kajuntk id:otsune その辺は考慮して書いてると思うよ/ホントだ!今気がついた。 2009/01/12
  • id:otsnue amachangはアイドルであり身内だからな。身内が叩かれるとプッツンしてさらに過激にdis返しをするのが奴らの恒例行事。トコロテンさんが気の毒です。 2009/01/12
はてなブックマーク - なんかブコメで叩かれまくってる - Automatons Hacking Guide

これは困ってしまいました><
なんと、かの id:TAKESAKO 氏ですら見間違えてしまうほどです!

というわけで

間違えないように Greasemonkey を書きました!ライフハックです!
この Greasemonkey を使うと、以下のようになります!(流行に乗って、あえて Google Chrome で動かしてみました、てへてへ)

これで、もう間違えることはありませんね!

ソースコードは以下になります。

ご自由にお使いください

// ==UserScript==
// @name           Oh! Tsune!
// @namespace      http://d.hatena.ne.jp/amachang/
// @include        http://*
// ==/UserScript==

(function() {
    translateChildren(document.body);

    document.addEventListener('DOMNodeInserted', listener, false);
    document.addEventListener('DOMCharacterDataModified', listener, false);
    document.addEventListener('DOMAttrModified', function(e) {
        var node = e.target;
        if (node.tagName.match(/^(input|option)$/i)) translate(node);
    }, false);

    function listener(e) {
        translate(e.target);
    }

    function translate(node) {
        switch (node.nodeType) {
        case 1:
            if (node.tagName.match(/^(input|option)$/i))
                translateProperty(node, 'value');
            else
                translateChildren(node);
            break;
        case 3:
            translateProperty(node, 'nodeValue');
            break;
        }
    }

    function translateChildren(node) {
        var xpath = './/text()[contains(., "otsune") or contains(., "otsnue")] | .//input | .//option';
        var r = document.evaluate(xpath, document.body, null, 7, null)
        for (var i = 0; i < r.snapshotLength; i ++) translate(r.snapshotItem(i));
    }

    function translateProperty(node, prop) {
        var value = node[prop];
        if (!value) return;
        if (value.indexOf('otsune') != -1)
            node[prop] = value.replace(/\botsune\b/, 'おちゅね');
        if (value.indexOf('otsnue') != -1)
            node[prop] = value.replace(/\botsnue\b/, 'おちゅぬえ');
    }
})();

割と高速に動くので、邪魔になりませんよ!

ちなみに、全置換のコードは

ネットを日本語化する:JapanizeJapanize.user.js を参考にしました