ページ中の URL っぽいテキスト表現をアンカータグに変える
by
a-kuma3
2015-02-18 [2015/02/18 21:46:32]
http://q.hatena.ne.jp/1356135347#a1182565 にあった http://tipszone.jp/20120604_jquery_url2link/ にインスパイアされて
-
/*
* @title ページ中の URL っぽいテキスト表現をアンカータグに変える
* @description http://q.hatena.ne.jp/1356135347#a1182565 にあった http://tipszone.jp/20120604_jquery_url2link/ にインスパイアされて
* @include NONE
* @license License FREE
* @require NONE
*/
(function(){
var RE_URL = /(?:h?t)?(tps?:\/\/[^/\s]+|[a-z]+\.hatena\.ne\.jp)((\/[A-Za-z0-9!-/:;=?@_~]*)?)/i;
var RE_TPS = /^tps?:\/\//i;
function txt2anchor(txt, url) {
var anchor = txt.ownerDocument.createElement("a");
anchor.href = url;
anchor.target = "_blank";
anchor.innerHTML = txt.nodeValue;
txt.parentNode.replaceChild(anchor, txt);
}
function url2link(txt) {
var result = RE_URL.exec(txt.nodeValue);
if (result) {
var middlebit = txt.splitText(result.index);
var endbit = middlebit.splitText(result[0].length);
var url;
if (RE_TPS.test(result[1])) {
url = 'ht' + result[1] + result[2];
} else {
url = 'http://' + result[1] + result[2];
}
txt2anchor(middlebit, url);
return url2link(endbit);
}
return txt.nextSibling;
}
function url2link_walk_element(ele) {
var e = ele.firstChild;
while (e) {
if (e.nodeType == 3) {
e = url2link(e);
} else {
if (e.nodeType == 1 && ! (e.tagName == "A" && e.href != "")) { // walk in <A name="xxx">
url2link_walk_element(e);
}
e = e.nextSibling;
}
}
}
function url2link_walk_window(w) {
url2link_walk_element(w.document.body);
var ff = w.frames;
for (var i = 0 ; i < ff.length ; ++i) {
url2link_walk_window(ff[i]);
}
}
url2link_walk_window(window);
})();
-
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。