2010-03-05

はてなダイアリーのキーワード自動リンクを消すChrome Extension

はてなダイアリーのキーワード自動リンクは、単なる広告である。見るに値しない。これは前々から思っていたことである。考えてみれば、多くの日本人のプログラマが、はてなダイアリーを使っている。これは憂慮すべき問題だ。今さっき、ふと、自動リンクがうざいというつぶやきを見たので、自動リンクを消すChrome Extensionを作ることにした。一瞬で完成した。

思うに、このエクステンションは、小粒だが、価値がある。欲しがっている人は、かならずいるはずだ。そこで、今回は初めて、公開することにした。

また、ブックマークレットの形でも、提供することにした。これは、Selectors API Level 1と、Document Object Model (DOM) Level 3 Core Specificationと、Document Object Model Rangeをサポートしているブラウザならば、動くはずだ。ブックマークバーまで、ドラッグして登録すればいい。

content scriptはこうなっている。

(function(){
    var list = document.querySelectorAll("a.keyword") ;

    var range = document.createRange() ;

    for ( var i = 0 ; i != list.length ; ++i )
    {
        var node = list.item(i) ;
        var parent = node.parentNode ;

        range.selectNodeContents( node ) ;
        parent.replaceChild( range.extractContents(), node ) ;
    }

})() ;

追記、content scriptをDOM level 2 rangeを使うように変更しました。2010/03/05 20:36以前にextensionやbookmarkletをインストールした人は、古いバージョンを使っています。

4 comments:

Y.Suzuki said...

大丈夫だと思うのですが, 念のためにこんな感じでどうでしょうかー?

(function(){
var range = document.createRange();
var list = document.querySelectorAll("a.keyword") ;

for ( var i = 0, len = list.length ; i < len ; ++i )
{
var node = list.item(i);
range.selectNodeContents(node);
node.parentNode.replaceChild( range.extractContents(), node ) ;
}
range.detach();

})() ;

江添亮 said...

最初はそのような形で実装したのですが、そもそも、複数のノードを子に持っている、はてなダイアリーの例が見つけられなかったので、単にreplaceChildを使いました。
もし、問題のあるはてなダイアリーがあれば、変更する予定です。

江添亮 said...

お、しかし、よくみたら、面白いコードだ。
Document Object Model (DOM) Level 2 Traversal and Range Specificationの存在は知らなかった。
ありがとうございます。

江添亮 said...

いや、考えてみたら、Traversalは、前に読んだことがあるな。