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 より多くのリンクを開こうとすると警告するように.