CPAN_Dependencies

By Yanick Champoux Last update Jan 29, 2008 — Installed 312 times.
// ==UserScript==
// @name           CPAN_Dependencies
// @version        0.01
// @author         Yanick Champoux <yanick+gm@babyl.dyndns.org>
// @namespace      http://babyl.dyndns.org/
// @description    Display a distribution's dependencies
// @include        http://search.cpan.org/*
// ==/UserScript==
//
// Changes
// 0.01 - Jan 27, 2008
// * Initial release
//

var moduleName = document.getElementsByTagName( 'h1' )[0].innerHTML;

            // cut the version number
moduleName = moduleName.replace( /-[0-9._]+$/, "" );   
            // change - for ::
moduleName = moduleName.replace( /-/g, "::" );

GM_log( moduleName );

var dep_url = 'http://cpandeps.cantrell.org.uk/?module=' 
                + escape( moduleName );
var dep_url_xml = dep_url + ';' + "xml=1" ;


var tables = document.getElementsByTagName( 'table' );

tables[0].innerHTML = tables[0].innerHTML.replace( 
    /<tr>.*?<td>.*?CPAN Testers/, "<tr id='dependencies'></tr>$&" );

tables[0].innerHTML = tables[0].innerHTML.replace( 
    /<tr>\s*<td.*?>CPAN Testers/i, 
      "<tr><td class='label'>"
    + "<a href='" + dep_url + "'>Dependencies</a>" 
    + "</td>"
    + "<td class='cell' colspan='3' id='deps'>"
    + "<a id='deps_click' href='#dummy'>click to show dependencies</a>" 
    + "</td></tr>$&" );

var d = document.getElementById( "deps" );

document.addEventListener( 'click', function( event ) {
    if( event.target.id != "deps_click" ) {
        return;
    }

    d.innerHTML = "<i>retrieving dependencies...</i>"; 

    GM_xmlhttpRequest({ 
        method: "GET",
        url: dep_url_xml, 
        onload: function ( resp ) { mashupDeps( resp ) }
    });

    event.stopPropagation();
    event.preventDefault();
}, true );


function mashupDeps ( resp ) {
    var xml = (new DOMParser()).parseFromString(
                                    resp.responseText, 
                                    "text/xml" );

    var direct_deps = xml.evaluate( 
        "//dependency/module[../depth/text()=1]", xml, null, 
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );

    var deps = new Array();

    for ( var i = 0; i < direct_deps.snapshotLength; i++ ) {
        var m = direct_deps.snapshotItem(i).textContent;
        var distname = m.replace( /::/g, "-" );
        var url = "http://search.cpan.org/dist/"
                + escape( distname ) ;
        deps.push( "<a href='" + url + "'>" + m + "</a>" ); 
    }

    var depTable = "<table><tr class='distfiles'>";

    for ( i in deps ) {
        var j = 0 + i;   // numify i ?
        if ( (j>0) && !( j % 4 ) ) {
            depTable += "</tr><tr>";
        }
        depTable += "<td style='padding-right: 5px; padding-left: 5px;'>" 
                  + deps[i] + "</td>";
    }
    
    depTable += "</tr></table>";

    d.innerHTML = depTable;
}