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:

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

    (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();

    })() ;

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

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

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

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.