Source code for bookmarklet Convert Map to Links.
javascript:
(function(){
function cE(a)
{
var a2 = [];
for (var k = 0; k < a.length; ++k) {
a2.push(a[k]);
}
return a2;
}
function hHat(img)
{
return img.hasAttribute("ALT") && ! /\S+/.test(img.alt);
}
function hasAttribute(e, a)
{
return e.hasAttribute(a);
}
var rp = 0,
ic = 0,
hc = 0;
function rM(m, dt)
{
var c = cE( m.getElementsByTagName("area") );
if ( c.length == 0 ){ return; }
var d = dt.createElement( "ul" );
for (var k = 0; k < c.length; ++k) {
var inp = c[k];
var noalt = !hasAttribute(inp, "ALT");
var hidden = hHat(inp);
rp += (noalt ? 1: 0);
hc += (hidden ? 1: 0);
var a = dt.createElement( "a" );
// AREA and A have a similar set of attributes,
// so it is quite OK to copy all of them.
var aa = inp.attributes;
for (var ii = 0, kk = aa.length; ii < kk; ++ii) {
a.setAttribute( aa[ii].name, aa[ii].value );
}
var nhref = ++ic + ": [" + inp.href + "]";
a.appendChild(
dt.createTextNode(
(noalt ? nhref : (hidden ? "[" + nhref + "]" : inp.alt))
)
);
var sp = dt.createElement( "li" );
sp.appendChild( a );
d.appendChild( sp );
}
m.parentNode.replaceChild( d, m );
}
function eD(dt)
{
var c = cE( dt.getElementsByTagName("map") );
for (var k = 0; k < c.length; ++k) {
rM(c[k], dt);
}
alert("Hidden: " + hc + ". ALT-less: " + rp + ", text: "+ (ic - hc - 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);
}());