Home

Separate Adjacent Links

Source code for bookmarklet Separate Adjacent Links.



javascript:
(function(){
    
    function cE(a)
    {
        var a2 = [];
        for (var k = 0; k < a.length; ++k) {
            a2.push(a[k]);
            }
        return a2;
    }

    function hasAttribute(e, a)
    {
        return e.hasAttribute(a);
    }
    var rp = 0;

    function ns(nxi)
    {
        var nx = nxi;
        while (nx != null &&
               ( (nx.tagName == "A" && nx.href.length == 0) || nx.tagName == "BR" )
            ) {
            nx = nx.nextSibling;
        }
        return nx;
    }

    function tc(node)
    {
        function ns(nxi, level)
        {
            var str = "";

            var nx = nxi;
            while (nx != null)
            {
                if (nx.tagName == "IMG") {
                    str += (hasAttribute(nx, "ALT") ? nx.alt : nx.src);
                }
                else if (nx.data != null
                    && nx.nodeType != 8 // COMMENT_NODE
                    && nx.parentNode.tagName != "SCRIPT") {
                    str += nx.data;
                }
                str += ns(nx.firstChild, level + 1);
                nx = (level > 0) ? nx.nextSibling : null;
            }
            return str;
        }

        var nx = ns(node, 0);
        return nx.replace( /\s+/mg, " ").replace( /^\s/, "" ).replace( /\s+$/, "" );
    }


    function eE(node)
    {
        if (node.href == null || node.href.length == 0) {return false;}
        var nx = ns(node.nextSibling);
        if (nx == null) {return false;}
        if (nx.tagName == "A") {return true;}

        var nx2 = ns(nx.nextSibling);
        if (nx2 == null) {return false;}

        if (nx2.tagName == "A")
        {
            var sep = tc(nx);
            return ! /\S+/.test(sep);
        }

        return false;
    }

    function eD(dt)
    {
        var c = cE( dt.getElementsByTagName( "A" ) );
        for (var k = 0; k < c.length; ++k) {
            var l = c[k];
            if ( eE(l) ) {
                ++rp;
                l.parentNode.insertBefore(
                    dt.createTextNode(" | "),
                    l.nextSibling
                    );
            }
        }
        alert("Adjacent links: " + rp);
    }


    // "dIr" == "documentIterator"
    function dIr(dt, f) {
        function ifsr( fs )
        {
            for (var i = 0; i < fs.length; ++i)
            {
                try {
                    dIr(fs[i].contentDocument, fs[i]); // recursive call
                }
                catch (e) {
                    alert(e || "Unspecified error");
                }
            }
        }

        if (dt == null) {return;}
        eD(dt, f);
        ifsr( dt.getElementsByTagName("FRAME") );
        ifsr( dt.getElementsByTagName("IFRAME") );
    }

    // iterate through all documents
    dIr(document, null);
}());