var Render = new function() {
var templatesDir = (JSDOC.opt.t || SYS.pwd + '../templates/jsdoc/')
+ 'templates/';
var templates = {
_class: 'class.tmpl',
method: 'method.tmpl',
property: 'property.tmpl',
parameters: 'parameters.tmpl',
parameter: 'parameter.tmpl',
operators: 'operators.tmpl',
returns: 'returns.tmpl',
'return': 'return.tmpl',
seeAlsos: 'seeAlsos.tmpl',
example: 'example.tmpl',
constructor: 'constructor.tmpl',
html: 'html.tmpl',
allClasses: 'allClasses.tmpl',
menu: 'packages.tmpl',
operator: 'operator.tmpl',
packagesjs: 'packagesjs.tmpl'
};
publish.classes = [];
for (var i in templates) {
templates[i] = new JSDOC.JsPlate(templatesDir + templates[i]);
}
var processGroupTitle = function(symbol) {
var matches = symbol.desc.match(/\{@grouptitle ([^}]+)\}/),
groupTitle;
if (matches) {
groupTitle = matches[1];
symbol.desc = symbol.desc.replace(/\{@grouptitle ([^}]+)\}/, '');
}
return groupTitle;
};
var processInlineTags = function(str, param) {
if (!param)
param = {};
// ..
->
..str = str.replace(/<(\/)*(code)>/g, '<$1pre>'); //
->str = str.replace(//g, ''); // {@link ...} -> html links str = str.replace(/\{@link ([^} ]+) ?\}/gi, function(match, symbolName) { return new Link().toSymbol(symbolName.replace(/[\^]/g, '-')); } ); // {@code ...} -> code blocks str = str.replace(/\{@code[\s]([^}]+)\}/gi, function(match, code) { return '' + code + ''; } ); // {@true ...} -> true if.. false otherwise.. str = str.replace(/\{@true[\s]([^}]+)\}/gi, function(match, text) { return 'true ' + text + ', false otherwise'; } ); var lineBreak = java.lang.System.getProperty('line.separator'); // Convert any type of lineBreak to the one we're using now: str = str.replace(/(\r\n|\n|\r)/g, function(match, lineBreak) { return lineBreak; }); // Replace inlinewith str = str.replace(/
[ \t]*([^\n\r]*?)[ \t]*<\/code>/g, function(match, content) { return '' + content + ''; }); // Put code and pre tags on the same line as the content, as white-space: pre is set: str = str.replace(/(<(?:code|pre)>)\s*([\u0000-\uffff]*?)\s*(<\/(?:code|pre)>)/g, function(match, open, content, close) { // Filter out the first white space at the beginning of each line, since // that stems from the space after the * in the comment and replace
// with
, to fix a IE problem where lighter.js does not receive // linebreaks from code tags weven when white-space: pre is set. return '' + content.replace(/(\r\n|\n|\r) /mg, function(match, lineBreak) { return lineBreak; }) + ''; }); // Empty lines -> Paragraphs if (!param.stripParagraphs) { if (param.wrapInParagraphs === undefined || param.wrapInParagraphs) str = '' + str.trim() + '
'; str = str.trim().replace(/(\r\n|\n|\r)\s*(\r\n|\n|\r)/g, function(match, lineBreak) { return '' + lineBreak + ''; }); // Automatically put
at the end of sentences with line breaks. // Match following
andtags and swallow them. This happens when // the original content contains these. str = str.trim().replace(/([.:?!;])\s*(\r\n|\n|\r)(\s*)(<\/p>|
|)/g, function(match, before, lineBreak, whiteSpace, after) { // Include following whiteSpace as well, since for code blocks they are relevant (e.g. indentation on new line) return before + '
' + lineBreak + whiteSpace + ''; }); // Filter out
tags within and around
and
blocks again str = str.replace(/((?:\s*|)<(?:code|pre)[^>]*>[\u0000-\uffff]*<\/(?:code|pre)>(?:\s*<\/p>|))/g, function(match, code) { return Utils.stripTags(code, 'p'); }); // Filter out empty paragraphs str = str.replace(/
<\/p>/g, ''); } return str; }; /** Build output for displaying function parameters. */ var makeSignature = function(params) { if (!params) return '()'; var postString = ''; var first = true; params = params.filter( function($) { return $.name.indexOf('.') == -1; // don't show config params in signature } ); var signature = ''; var postSignature = ''; for (var i = 0, l = params.length; i < l; i++) { var param = params[i]; if (param.isOptional) { signature += '['; postSignature += ']'; } if (i > 0) signature += ', '; signature += param.name; } return '(' + signature + postSignature + ')'; }; return { _class: function(symbol) { var param = { name: symbol.alias, description: processInlineTags(symbol.classDesc), symbol: symbol, constructors: symbol.getConstructors(), properties: symbol.getProperties(), staticProperties: symbol.getStaticProperties(), methods: symbol.getOwnMethods(), staticMethods: symbol.getStaticMethods(), showConstructors: (!(/(Event|Style)/).test(symbol.alias) && !symbol.isNamespace && !symbol.ignore && symbol.desc.length), inheritedClasses: symbol.getInheritedClasses() }; param.inheritedLinks = []; for (var i in param.inheritedClasses) { param.inheritedLinks.push(new Link().toSymbol(i)); } param.inheritedLinks = param.inheritedLinks.join(', '); // Add the grouped operators to param: var operators = symbol.getOperators(); if (operators.length) { param.operators = {}; for (var i = 0, l = operators.length; i < l; i++) { var operator = operators[i]; var name = operator.name.replace(/\^[0-9]$/, ''); if (!param.operators[name]) param.operators[name] = []; param.operators[name].push(operator); } } publish.curClass = { name: symbol.alias, index: { 'class': { title: param.name, text: param.description } } }; publish.classes.push(publish.curClass); return templates._class.process(param); }, constructor: function(symbol) { var param = { symbol: symbol, groupTitle: processGroupTitle(symbol), id: symbol.getId(), name: symbol.alias.replace(/(#|\^).+$/, ''), description: processInlineTags(symbol.desc), signature: makeSignature(symbol.params), parameters: Render.parameters(symbol), returns: Render.returns(symbol), examples: Render.examples(symbol), seeAlsos: Render.seeAlsos(symbol) }; if (symbol.returns.length == 0) { var type = symbol.memberOf ? symbol.memberOf : symbol.alias; symbol.returns = [{type: type, desc: ''}]; } publish.curClass.index[param.id] = { title: param.name, text: param.description }; return templates.constructor.process(param); }, method: function(symbol) { var name = symbol.name.replace(/\^\d+$/, ''); if (symbol.isStatic) name = symbol.memberOf + '.' + name; var param = { name: name, groupTitle: processGroupTitle(symbol), id: symbol.getId(), signature: makeSignature(symbol.params), description: processInlineTags(symbol.desc), symbol: symbol }; publish.curClass.index[param.id] = { title: param.name, text: param.description }; return templates.method.process(param); }, property: function(symbol) { var name = symbol.name.replace(/\^\d+$/, ''); if (symbol.isStatic) name = symbol.memberOf + '.' + name; var param = { name: name, groupTitle: processGroupTitle(symbol), id: symbol.getId(), description: processInlineTags(symbol.desc), symbol: symbol }; publish.curClass.index[param.id] = { title: param.name, text: param.description }; return templates.property.process(param); }, parameters: function(symbol) { return templates.parameters.process(symbol); }, parameter: function(symbol) { return templates.parameter.process({ name: symbol.name, description: processInlineTags(symbol.desc, {stripParagraphs: true}), typeLink: new Link().toSymbol(symbol.type), symbol: symbol }); }, operators: function(symbols) { var operatorCount = 0; var title = []; for (var i = 0, l = symbols.length; i < l; i++) { var type = symbols[i].params[0].type; type = type.charAt(0).toUpperCase() + type.slice(1); title.push('' + Operator.getOperator(symbols[i]) + ' ' + type + ''); } return templates.operators.process({ id: symbols[0].name.toLowerCase().replace(/\^[0-9]$/, ''), title: title.join(', '), operators: symbols }); }, operator: function(symbol, id) { var type = symbol.params[0].type; return templates.operator.process({ id: id, name: Operator.getOperator(symbol), type: type.charAt(0).toUpperCase() + type.slice(1), description: processInlineTags(symbol.desc), symbol: symbol }); }, returns: function(symbol) { return templates.returns.process(symbol); }, 'return': function(symbol) { return templates['return'].process({ name: symbol.name, description: processInlineTags(symbol.desc, {stripParagraphs: true}), typeLink: new Link().toSymbol(symbol.type), symbol: symbol }); }, seeAlsos: function(symbol) { return templates.seeAlsos.process(symbol); }, examples: function(symbol) { var out = [], examples = symbol.example; for (var i = 0, l = examples.length; i < l; i++) { var example = examples[i], lines = example.toString().split('\n'), description = []; // The description is the first commented lines: while (/^[\/]{2}/.test(lines[0])) { description.push(lines.shift().replace('// ', '')); } out.push(Render.example({ description: description.join(' ').trim(), code: lines.join('\n').trim() })); } return out.join('\n'); }, example: function(param) { return templates.example.process(param); }, html: function(content) { return templates.html.process(content); }, allClasses: function(symbol) { return templates.allClasses.process(symbol); }, menu: function(html) { return templates.menu.process(html); }, packagesjs: function() { return templates.packagesjs.process(publish.classes); } }; };