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);
}());