sazze/node-pm

View on GitHub
docs/scripts/sunlight-plugin.doclinks.js

Summary

Maintainability
F
3 days
Test Coverage
/**
 * Sunlight documentation link plugin
 *
 * This plugin generates hyperlinks to language documentation for certain tokens
 * (e.g. links to php.net for functions).
 *
 * Supported languages:
 *    - PHP (functions and language constructs)
 *    - Ruby (functions)
 *    - Python (functions)
 *    - Perl (functions)
 *    - Lua (functions)
 *
 * Options:
 *     - enableDocLinks: true/false (default is false)
 */
(function(sunlight, document, undefined){
    if (sunlight === undefined) {
        throw "Include sunlight.js before including plugin files";
    }
    
    var supportedLanguages = {
        php: {
            "function": function(word) { return "http://php.net/" + word; },
            languageConstruct: function(word) { return "http://php.net/" + word; }
        },
        
        ruby: {
            "function": function(word) {
                return "http://www.ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/function.html#" 
                    + word.replace(/!/g, "_bang").replace(/\?/g, "_p");
            }
        },
        
        python: {
            "function": function(word) {
                return "http://docs.python.org/py3k/library/functions.html#" + word;
            }
        },
        
        perl: {
            "function": function(word) { return "http://perldoc.perl.org/functions/" + word + ".html"; }
        },
        
        lua: {
            "function": function(word) { return "http://www.lua.org/manual/5.1/manual.html#pdf-" + word; }
        }
    };
    
    function createLink(transformUrl) {
        return function(context) {
            var link = document.createElement("a");
            link.className = context.options.classPrefix + context.tokens[context.index].name;
            link.setAttribute("href", transformUrl(context.tokens[context.index].value));
            link.appendChild(context.createTextNode(context.tokens[context.index]));
            context.addNode(link);
        };
    }
    
    sunlight.bind("beforeAnalyze", function(context) {
        if (!this.options.enableDocLinks) {
            return;
        }
        
        context.analyzerContext.getAnalyzer = function() {
            var language = supportedLanguages[this.language.name],
                analyzer,
                tokenName;
            
            if (!language) {
                return;
            }
            
            analyzer = sunlight.util.clone(context.analyzerContext.language.analyzer);
            
            for (tokenName in language) {
                if (!language.hasOwnProperty(tokenName)) {
                    continue;
                }
                
                analyzer["handle_" + tokenName] = createLink(language[tokenName]);
            }
            
            return analyzer;
        };
        
    });
    
    sunlight.globalOptions.enableDocLinks = false;
    
}(this["Sunlight"], document));