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 inline  with 
		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

and

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