UNPKG

coddoc

Version:

Documentation generator

155 lines (130 loc) 5.53 kB
(function () { "use strict"; var Handlebars = require("handlebars"), util = require("../../lib/util.js"), fs = require("fs"), path = require("path"); var template = __dirname; var readmeTemplate = fs.readFileSync(path.resolve(template, "./index.html"), "utf8"); var compiledReadmeTemplate = Handlebars.compile(readmeTemplate); var link = function (name, context) { return new Handlebars.SafeString( "#" + normalize(name) ); }; var normalize = function (name, context) { return util.resolveName(name).replace(/\./g, "_"); }; var escapeLink = function (name) { return normalize(name.replace(/\./g, "_")); }; var joinTypes = function (types) { return"<code>" + types.join("|") + "</code>"; }; var replaceToken = function (str, token, cb) { var start = "{@" + token, startToken = "{", endToken = "}", index = str.indexOf(start); while (index !== -1) { var code = util.getTokensBetween(str.substr(index), startToken, endToken, true).join(""); if (new RegExp("\\" + endToken + "$").test(code)) { str = str.replace(code, cb(code, str, index)); index = str.indexOf(start); } else { break; } } return str; }; var replaceLinks = function (text) { return replaceCode(text ? replaceToken(text, "link", function (link) { link = link.replace(/^\{@link|\}$/g, ""); return ["<a href='#", normalize(link), "'>", link, "</a>"].join(""); }) : ""); }; var replaceCode = function (text) { return text ? replaceToken(text, "code", function (code) { code = code.replace(/^\{@code|\}$/g, ""); return ["<pre class='prettyprint linenums lang-js'>", code, "</pre>"].join("\n"); }) : ""; }; var formatParamName = function (name) { var ret = name.name; if (name.optional) { var defaultValue = name.defaultValue; if ("undefined" !== typeof defaultValue) { ret = "[" + ret + "= <code>" + name.defaultValue + "</code>]"; } else { ret += "?"; } } return ret; }; var propertyTable = function (properties) { var ret = ""; if (properties.length) { ret = "<table class='table table-bordered table-striped'><tr><td>Property</td><td>Type</td><td>Default Value</td><td>Description</td></tr>"; properties.forEach(function (p) { var nameValue = util.isString(p.name) ? p.name : p.name.name; var name = p.isStatic ? "<em>" + nameValue + "</em>" : nameValue; var value = replaceLinks(p.code || p.defaultValue || ""); var type = p.type || ""; var description = replaceLinks(p.description) || ""; ret += ["<tr><td>", name , "</td><td>", type, "</td><td>", value ? "<code>" + value + "</code>" : "", "</td><td>", description, "</td><tr>"].join(""); }); ret += "</table>"; } return ret; }; var importFile = (function () { var compiledImports = {}; return function (file, context, b) { if (!file.match(/\.(tmpl|html|css|js)$/)) { file += ".tmpl"; } try { var filePath = path.resolve(template, file); var tmpl = compiledImports[filePath]; if (!tmpl) { var fileContent = fs.readFileSync(filePath, "utf8"); tmpl = compiledImports[filePath] = Handlebars.compile(fileContent); } return tmpl(this); } catch (e) { throw e; } }; })(); var see = function (see) { var parts = see.split(/\s+/); if (parts.length) { var sym = util.splitName(util.resolveName(parts[0])); } }; Handlebars.registerHelper('link', link); Handlebars.registerHelper('normalize', normalize); Handlebars.registerHelper('escapeLink', escapeLink); Handlebars.registerHelper("joinTypes", joinTypes); Handlebars.registerHelper("see", see); Handlebars.registerHelper("replaceLinks", replaceLinks); Handlebars.registerHelper("formatParamName", formatParamName); Handlebars.registerHelper("propertyTable", propertyTable); Handlebars.registerHelper("import", importFile); var objComp = function (n1, n2) { return n1.name === n2.name ? 0 : n1.name < n2.name ? -1 : 1; }; exports.generate = function (tree, options) { var nameSpaces = tree.getNamespaces().sort(objComp); nameSpaces.forEach(function (n) { n.methods.sort(objComp); n.properties.sort(objComp); }); var classes = tree.getClasses().sort(objComp); classes.forEach(function (c) { c.instanceMethods.sort(objComp); c.instanceProperties.sort(objComp); c.staticMethods.sort(objComp); c.staticProperties.sort(objComp); c.allMethods = c.instanceMethods.concat(c.staticMethods).sort(objComp); }); return compiledReadmeTemplate({namespaces:nameSpaces, headers:tree.getHeaders(), footers:tree.getFooters(), projectName:tree.getProjectName(), github:tree.getGitHub(), classes:classes}); }; })();