ページ中の URL っぽいテキスト表現をアンカータグに変える

  • /*
     * @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 です。

History

  1. 2015/02/18 21:46:32 - 2015-02-18
  2. 2013/01/01 22:01:31 - 2013-01-01
  3. 2013/01/01 11:41:47 - 2013-01-01
  4. 2013/01/01 11:03:27 - 2013-01-01