Home

Convert Map to Links

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