opera:tips:get_n_go_selection_linksで書いた get-n-go-selection-links.js ver. 0.1 をちょっと改良して ver 0.3 としてリリース.

お持ち帰りはget-n-go-selection-links.jsから.導入はopera:tips:get_n_go_selection_linksを参照.

追記opera:tips:get_n_go_selection_links_version_0_4_release

変更点

ver 0.3 での主な変更点は以下の通り

抽出範囲設定の改善の概略

ver 0.1ではリンクの取得に,View selection sourceをそのままに,

    node = getSelection().getRangeAt(0).commonAncestorContainer;
    uris = getUrisIn( node );

という風にしてた.

これだと選択範囲のひとつ上のcontainerを選択していて,正確な選択範囲にはならず,要らないリンクも取得してしまう.

で,それだとまずいので コミュで出ていたXUL Apps > Tips > 選択範囲のリンクを収集する ~ DOM2 RangeのcompareBoundaryPointsの使い方 - outsider reflexを参考に

    node = getSelection().getRangeAt(0).cloneContents();
    uris = getUrisIn( node );

と, cloneContents()DocumentFragment なノードを作ってその中から取得するようにしてみたのだけど getUrisIn() の中で呼んでる getElementsByTagName() で失敗する.

DOM のreferenceを手繰ってみると,どうやら DocumentFragment なノードに getElementsByTagName() は出来なくて,element なノードなら出来ると言うことらしい

    dummy = document.createElement("div");
    df = getSelection().getRangeAt(0).cloneContents();
    dummy.appendChild( df );
    uris = getUrisIn( dummy ); 

と 選択範囲を element な ノードにすることで無事に取得できるように.

リンク取得先要素の設定項目追加

ソースの conf の tags に 取得したい要素(タグ)とその属性を書くことで取得先を設定できるように.初期状態では Aの href, IMG,SCRIPT と EMBED の src から取得するように設定.

  var conf = {
    tags : [
            {"tag": "a",      "attr": "href", "ext" : ""},
            {"tag": "img",    "attr": "src",  "ext" : ""},
            {"tag": "script", "attr": "src",  "ext" : ""},
            {"tag": "embed",  "attr": "src" , "ext" : ""},
           ],

ext は次のバージョンで使用する予定.

重複リンクの削除

取得した URI を単純に文字列として sort | uniq という感じなので,改良の余地あり.

リンク数が多数の時に警告

conf.confirm_open_window より多くのリンクを開こうとすると警告するように.