Merge pull request #147 from hegemonic/jshint-clean-v2

Make JSDoc JSHint-clean (part 4/final)
This commit is contained in:
Jeff Williams 2012-07-10 07:18:00 -07:00
commit 5e587fbc32
26 changed files with 303 additions and 295 deletions

View File

@ -15,31 +15,31 @@
"strict": false,
"trailing": true,
"asi": true,
"boss": true,
"debug": true,
"asi": false,
"boss": false,
"debug": false,
"eqnull": true,
"es5": true,
"esnext": true,
"evil": true,
"expr": true,
"funcscope": true,
"globalstrict": true,
"iterator": true,
"lastsemic": true,
"laxbreak": true,
"laxcomma": true,
"evil": false,
"expr": false,
"funcscope": false,
"globalstrict": false,
"iterator": false,
"lastsemic": false,
"laxbreak": false,
"laxcomma": false,
"loopfunc": true,
"multistr": true,
"multistr": false,
"onecase": true,
"proto": true,
"regexdash": true,
"proto": false,
"regexdash": false,
"scripturl": true,
"shadow": true,
"smarttabs": true,
"sub": true,
"supernew": true,
"validthis": true,
"shadow": false,
"smarttabs": false,
"sub": false,
"supernew": false,
"validthis": false,
"browser": false,
"couch": false,

View File

@ -89,7 +89,7 @@ include.resolve = function(filepath) {
}
return env.dirname + '/' + filepath;
}
};
/** Print string/s out to the console.
@param {string} ... String/s to print out to console.
@ -172,7 +172,7 @@ app = {
parser: new (require('jsdoc/src/parser').Parser)(),
name: require('jsdoc/name')
}
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

View File

@ -29,6 +29,10 @@
{
"name": "Jannon Frank",
"email": "jannon@jannon.net"
},
{
"name": "Jeff Williams",
"email": "jeffrey.l.williams@gmail.com"
}
],
"maintainers": [

View File

@ -39,7 +39,7 @@ function getParser(parser, conf) {
return function(source) {
return parser.renderJsonML(parser.toHTMLTree(source, conf.dialect));
}
};
} else {
throw "unknown Markdown parser: '" + parser + "'";
}

View File

@ -131,7 +131,7 @@ exports.copyFile = function(inFile, outDir, fileName) {
outDir = toDir(outDir);
var inFile = new java.io.File(inFile);
inFile = new java.io.File(inFile);
var outFile = new java.io.File(outDir+'/'+fileName);
var bis = new Packages.java.io.BufferedInputStream(new Packages.java.io.FileInputStream(inFile), 4096);

View File

@ -18,7 +18,7 @@ var doop = require("jsdoc/util/doop").doop;
docs.push(doc);
});
});
}
};
function mapDependencies(index) {
var doclets, doc, len, dependencies = {};

View File

@ -23,7 +23,7 @@ exports.resolveBorrows = function(docs) {
if (doc.borrowed) {
doc.borrowed.forEach(function(b, i) {
var lent = docs.index[b.from], // lent is an array
asName = b['as'] || b.from;
asName = b.as || b.from;
if (lent) {
var cloned = doop(lent);
@ -48,4 +48,4 @@ exports.resolveBorrows = function(docs) {
delete doc.borrowed;
}
});
}
};

View File

@ -27,7 +27,7 @@ const defaults = {
@param {string} [json] - The contents of config.json.
*/
function Config(json) {
var json = JSON.parse( (json || "{}") );
json = JSON.parse( (json || "{}") );
this._config = util.mergeRecurse(defaults, json);
}
@ -39,5 +39,4 @@ module.exports = Config;
*/
Config.prototype.get = function() {
return this._config;
}
};

View File

@ -1,14 +1,14 @@
/**
@overview
@author Michael Mathews <micmath@gmail.com>
@license Apache License 2.0 - See file 'LICENSE.md' in this project.
@license Apache License 2.0 - See file 'LICENSE.md' in this project.
*/
/**
@module jsdoc/doclet
@requires jsdoc/tag
@requires jsdoc/name
@requires jsdoc/tag/dictionary
@module jsdoc/doclet
@requires jsdoc/tag
@requires jsdoc/name
@requires jsdoc/tag/dictionary
*/
var jsdoc = {
@ -51,17 +51,17 @@ function codetypeToKind(type) {
function unwrap(docletSrc) {
if (!docletSrc) { return ''; }
// note: keep trailing whitespace for @examples
// extra opening/closing stars are ignored
// left margin is considered a star and a space
// use the /m flag on regex to avoid having to guess what this platform's newline is
docletSrc =
docletSrc.replace(/^\/\*\*+/, '') // remove opening slash+stars
.replace(/\**\*\/$/, "\\Z") // replace closing star slash with end-marker
.replace(/^\s*(\* ?|\\Z)/gm, '') // remove left margin like: spaces+star or spaces+end-marker
.replace(/\s*\\Z$/g, ''); // remove end-marker
// note: keep trailing whitespace for @examples
// extra opening/closing stars are ignored
// left margin is considered a star and a space
// use the /m flag on regex to avoid having to guess what this platform's newline is
docletSrc =
docletSrc.replace(/^\/\*\*+/, '') // remove opening slash+stars
.replace(/\**\*\/$/, "\\Z") // replace closing star slash with end-marker
.replace(/^\s*(\* ?|\\Z)/gm, '') // remove left margin like: spaces+star or spaces+end-marker
.replace(/\s*\\Z$/g, ''); // remove end-marker
return docletSrc;
return docletSrc;
}
function split(docletSrc) {
@ -69,14 +69,14 @@ function split(docletSrc) {
tagText,
tagTitle;
// split out the basic tags, keep surrounding whitespace
// like: @tagTitle tagBody
docletSrc
.replace(/^(\s*)@(\S)/gm, '$1\\@$2') // replace splitter ats with an arbitrary sequence
.split('\\@') // then split on that arbitrary sequence
.forEach(function($) {
if ($) {
var parsedTag = $.match(/^(\S+)(:?\s+(\S[\s\S]*))?/);
// split out the basic tags, keep surrounding whitespace
// like: @tagTitle tagBody
docletSrc
.replace(/^(\s*)@(\S)/gm, '$1\\@$2') // replace splitter ats with an arbitrary sequence
.split('\\@') // then split on that arbitrary sequence
.forEach(function($) {
if ($) {
var parsedTag = $.match(/^(\S+)(:?\s+(\S[\s\S]*))?/);
if (parsedTag) {
// we don't need parsedTag[0]
@ -91,9 +91,9 @@ function split(docletSrc) {
}
}
}
});
return tagSrcs;
});
return tagSrcs;
}
/**
@ -116,9 +116,9 @@ function toTags(docletSrc) {
function fixDescription(docletSrc) {
if (!/^\s*@/.test(docletSrc)) {
docletSrc = '@description ' + docletSrc;
}
return docletSrc;
docletSrc = '@description ' + docletSrc;
}
return docletSrc;
}
/**
@ -144,7 +144,7 @@ exports.Doclet = function(docletSrc, meta) {
}
this.postProcess();
}
};
/** Called once after all tags have been added. */
exports.Doclet.prototype.postProcess = function() {
@ -172,7 +172,7 @@ exports.Doclet.prototype.postProcess = function() {
}
}
}
}
};
/** Add a tag to this doclet.
@param {string} title - The title of the tag being added.
@ -183,7 +183,7 @@ exports.Doclet.prototype.addTag = function(title, text) {
newTag = new jsdoc.tag.Tag(title, text, this.meta);
if (tagDef && tagDef.onTagged) {
tagDef.onTagged(this, newTag)
tagDef.onTagged(this, newTag);
}
if (!tagDef) {
@ -192,7 +192,7 @@ exports.Doclet.prototype.addTag = function(title, text) {
}
applyTag.call(this, newTag);
}
};
/** Set the `memberof` property of this doclet.
@param {string} sid - The longname of the symbol that this doclet is a member of.
@ -204,7 +204,7 @@ exports.Doclet.prototype.setMemberof = function(sid) {
@type string
*/
this.memberof = sid.replace(/\.prototype/g, '#');
}
};
/** Set the `longname` property of this doclet.
@param {string} name
@ -220,7 +220,7 @@ exports.Doclet.prototype.setLongname = function(name) {
if (jsdoc.tag.dictionary.isNamespace(this.kind)) {
this.longname = jsdoc.name.applyNamespace(this.longname, this.kind);
}
}
};
/** Add a symbol to this doclet's `borrowed` array.
@param {string} source - The longname of the symbol that is the source.
@ -238,7 +238,7 @@ exports.Doclet.prototype.borrow = function(source, target) {
this.borrowed = [];
}
this.borrowed.push(about);
}
};
exports.Doclet.prototype.mix = function(source) {
if (!this.mixes) {
@ -249,7 +249,7 @@ exports.Doclet.prototype.mix = function(source) {
this.mixes = [];
}
this.mixes.push(source);
}
};
/** Add a symbol to this doclet's `augments` array.
@param {string} base - The longname of the base symbol.
@ -263,7 +263,7 @@ exports.Doclet.prototype.augment = function(base) {
this.augments = [];
}
this.augments.push(base);
}
};
/**
Set the `meta` property of this doclet.
@ -329,4 +329,4 @@ exports.Doclet.prototype.setMeta = function(meta) {
this.meta.code.paramnames = meta.code.paramnames.concat([]);
}
}
}
};

View File

@ -91,7 +91,7 @@ exports.resolve = function(doclet) {
if (about.variation) {
doclet.variation = about.variation;
}
}
};
/**
@inner
@ -113,7 +113,7 @@ function quoteUnsafe(name, kind) { // docspaced names may have unsafe characters
RegExp.escape = RegExp.escape || function(str) {
var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\
return str.replace(specials, "\\$&");
}
};
/**
@method module:jsdoc/name.applyNamespace
@ -123,15 +123,15 @@ RegExp.escape = RegExp.escape || function(str) {
*/
exports.applyNamespace = function(longname, ns) {
var nameParts = exports.shorten(longname),
name = nameParts.name,
longname = nameParts.longname;
name = nameParts.name;
longname = nameParts.longname;
if ( !/^[a-zA-Z]+?:.+$/i.test(name) ) {
longname = longname.replace( new RegExp(RegExp.escape(name)+'$'), ns + ':' + name );
}
return longname;
}
};
/**
Given a longname like "a.b#c(2)", slice it up into ["a.b", "#", 'c', '2'],
@ -161,21 +161,22 @@ exports.shorten = function(longname, forcedMemberof) {
var name = '',
scope = '', // ., ~, or #
memberof = '',
parts,
variation;
longname = longname.replace( /\.prototype\.?/g, '#' );
if (typeof forcedMemberof !== 'undefined') {
name = longname.substr(forcedMemberof.length);
var parts = forcedMemberof.match(/^(.*?)([#.~]?)$/);
parts = forcedMemberof.match(/^(.*?)([#.~]?)$/);
if (parts[1]) { memberof = parts[1] || forcedMemberof; }
if (parts[2]) { scope = parts[2]; }
}
else {
var parts = longname?
(longname.match( /^(:?(.+)([#.~]))?(.+?)$/ ) || []).reverse()
: [''];
parts = longname?
(longname.match( /^(:?(.+)([#.~]))?(.+?)$/ ) || []).reverse()
: [''];
name = parts[0] || ''; // ensure name is always initialised to avoid error being thrown when calling replace on undefined [gh-24]
scope = parts[1] || ''; // ., ~, or #
@ -198,7 +199,7 @@ exports.shorten = function(longname, forcedMemberof) {
////
return {longname: longname, memberof: memberof, scope: scope, name: name, variation: variation};
}
};
/**
Split a string that starts with a name and ends with a description, into its parts.
@ -241,4 +242,4 @@ exports.splitName = function(nameDesc) {
}
return { name: name, description: desc };
}
};

View File

@ -51,14 +51,14 @@ exports.parse = function(args) {
ourOptions = argParser.parse(args, defaults);
return ourOptions;
}
};
/**
Display help message for options.
*/
exports.help = function() {
return argParser.help();
}
};
/**
Get a named option.
@ -75,4 +75,4 @@ exports.get = function(name) {
else {
return ourOptions[name];
}
}
};

View File

@ -66,5 +66,4 @@ exports.Package = function(json) {
* ]
*/
this.licenses = json.licenses;
}
};

View File

@ -33,7 +33,7 @@ function getParser(parser, conf) {
return function(source) {
return parser.renderJsonML(parser.toHTMLTree(source, conf.dialect));
}
};
}
else {
throw 'unknown Markdown parser: "' + parser + '"';

View File

@ -20,7 +20,7 @@ exports.Filter = function(opts) {
this.excludePattern = opts.excludePattern?
typeof opts.excludePattern === 'string'? new RegExp(opts.excludePattern) : opts.excludePattern
: null;
}
};
/**
@param {string} filepath - The filepath to check.
@ -40,4 +40,4 @@ exports.Filter.prototype.isIncluded = function(filepath) {
}
return true;
}
};

View File

@ -83,14 +83,14 @@ exports.Parser.prototype.parse = function(sourceFiles, encoding) {
*/
exports.Parser.prototype.results = function() {
return this._resultBuffer;
}
};
/**
* @param {Object} o The parse result to add to the result buffer.
*/
exports.Parser.prototype.addResult = function(o) {
this._resultBuffer.push(o);
}
};
/**
* Empty any accumulated results of calls to parse.
@ -99,21 +99,21 @@ exports.Parser.prototype.clear = function() {
currentParser = null;
currentSourceName = '';
this._resultBuffer = [];
}
};
/**
* Adds a node visitor to use in parsing
*/
exports.Parser.prototype.addNodeVisitor = function(visitor) {
this._visitors.push(visitor);
}
};
/**
* Get the node visitors used in parsing
*/
exports.Parser.prototype.getVisitors = function() {
return this._visitors;
}
};
function pretreat(code) {
return code
@ -168,7 +168,7 @@ function nodeToString(node) {
str = [nodeToString(node.target), node.property.string].join('.');
}
else if (node.type === Token.VAR) {
str = nodeToString(node.target)
str = nodeToString(node.target);
}
else if (node.type === Token.NAME) {
str = node.string;
@ -281,7 +281,7 @@ function makeVarsFinisher(funcDoc) {
if (funcDoc && e.doclet && e.doclet.alias) {
funcDoc.meta.vars[e.code.name] = e.doclet.longname;
}
}
};
return func;
}
@ -303,6 +303,9 @@ function visitNode(node) {
nodeComments,
comment,
commentSrc,
basename,
func,
funcDoc,
i,
l;
@ -316,17 +319,16 @@ function visitNode(node) {
continue;
}
if (commentSrc = ''+comment.toSource()) {
commentSrc = '' + comment.toSource();
if ( commentSrc && isValidJsdoc(commentSrc) ) {
e = {
comment: commentSrc,
lineno: comment.getLineno(),
filename: currentSourceName
};
if ( isValidJsdoc(commentSrc) ) {
currentParser.fire('jsdocCommentFound', e, currentParser);
}
currentParser.fire('jsdocCommentFound', e, currentParser);
}
}
e = null;
@ -343,7 +345,7 @@ function visitNode(node) {
finishers: [currentParser.addDocletRef]
};
var basename = getBasename(e.code.name);
basename = getBasename(e.code.name);
if (basename !== 'this') {
e.code.funcscope = currentParser.resolveVar(node, basename);
@ -385,8 +387,8 @@ function visitNode(node) {
};
// keep track of vars in a function or global scope
var func = "__global__",
funcDoc = null;
func = "__global__";
funcDoc = null;
if (node.enclosingFunction) {
func = 'astnode'+node.enclosingFunction.hashCode();
}
@ -413,8 +415,8 @@ function visitNode(node) {
//console.log(':: e.code.name is', e.code.name);
// keep track of vars in a function or global scope
var func = "__global__",
funcDoc = null;
func = "__global__";
funcDoc = null;
if (node.enclosingFunction) {
func = 'astnode'+node.enclosingFunction.hashCode();
}
@ -425,12 +427,12 @@ function visitNode(node) {
e.finishers.push(makeVarsFinisher(funcDoc));
}
var basename = getBasename(e.code.name)
basename = getBasename(e.code.name);
e.code.funcscope = currentParser.resolveVar(node, basename);
}
if (!e) { e = {finishers: []}; }
for(var i = 0, l = currentParser._visitors.length; i < l; i++) {
for(i = 0, l = currentParser._visitors.length; i < l; i++) {
currentParser._visitors[i].visitNode(node, e, currentParser, currentSourceName);
if (e.stopPropagation) { break; }
}
@ -439,7 +441,7 @@ function visitNode(node) {
currentParser.fire(e.event, e, currentParser);
}
for (var i = 0, l = e.finishers.length; i < l; i++) {
for (i = 0, l = e.finishers.length; i < l; i++) {
e.finishers[i].call(currentParser, e);
}
@ -470,7 +472,7 @@ exports.Parser.prototype._parseSourceCode = function(sourceCode, sourceName) {
this.fire('fileComplete', e);
currentSourceName = '';
}
};
/**
* Given a node, determine what the node is a member of.
@ -479,7 +481,8 @@ exports.Parser.prototype._parseSourceCode = function(sourceCode, sourceName) {
*/
exports.Parser.prototype.astnodeToMemberof = function(node) {
var id,
doclet;
doclet,
alias;
if (node.type === Token.VAR || node.type === Token.FUNCTION || node.type == tkn.NAMEDFUNCTIONSTATEMENT) {
if (node.enclosingFunction) { // an inner var or func
@ -499,7 +502,7 @@ exports.Parser.prototype.astnodeToMemberof = function(node) {
id = 'astnode'+scope.enclosingFunction.hashCode();
doclet = this.refs[id];
if (doclet && doclet.meta.vars && basename in doclet.meta.vars) {
var alias = hasOwnProp.call(doclet.meta.vars, basename)? doclet.meta.vars[basename] : false;
alias = hasOwnProp.call(doclet.meta.vars, basename)? doclet.meta.vars[basename] : false;
if (alias !== false) {
return [alias, basename];
}
@ -508,9 +511,9 @@ exports.Parser.prototype.astnodeToMemberof = function(node) {
scope = scope.enclosingFunction;
}
//First check to see if we have a global scope alias
doclet = this.refs["__global__"];
doclet = this.refs.__global__;
if (doclet && doclet.meta.vars && hasOwnProp.call(doclet.meta.vars, basename)) {
var alias = doclet.meta.vars[basename];
alias = doclet.meta.vars[basename];
if (alias !== false) {
return [alias, basename];
}
@ -523,7 +526,7 @@ exports.Parser.prototype.astnodeToMemberof = function(node) {
}
return doclet.longname||doclet.name;
}
}
};
/**
* Resolve what "this" refers too, relative to a node.
@ -579,7 +582,7 @@ exports.Parser.prototype.resolveThis = function(node) {
else {
return ''; // global?
}
}
};
/**
Given: foo = { x:1 }, find foo from x.
@ -598,7 +601,7 @@ exports.Parser.prototype.resolvePropertyParent = function(node) {
if (memberof.doclet) { return memberof; }
}
}
};
/**
* Resolve what function a var is limited to.
@ -617,7 +620,7 @@ exports.Parser.prototype.resolveVar = function(node, basename) {
}
return this.resolveVar(enclosingFunction, basename);
}
};
exports.Parser.prototype.addDocletRef = function(e) {
var node = e.code.node;
@ -630,7 +633,7 @@ exports.Parser.prototype.addDocletRef = function(e) {
meta: { code: e.code }
};
}
}
};
exports.Parser.prototype.resolveEnum = function(e) {
var doop = require("jsdoc/util/doop").doop,
@ -645,7 +648,7 @@ exports.Parser.prototype.resolveEnum = function(e) {
// use a copy of the doclet to avoid circular references
parent.doclet.properties.push( doop(e.doclet) );
}
}
};
/**
Fired whenever the parser encounters a JSDoc comment in the current source code.

View File

@ -1,15 +1,15 @@
/**
@module jsdoc/src/scanner
@requires module:common/fs
@author Michael Mathews <micmath@gmail.com>
@license Apache License 2.0 - See file 'LICENSE.md' in this project.
@module jsdoc/src/scanner
@requires module:common/fs
@author Michael Mathews <micmath@gmail.com>
@license Apache License 2.0 - See file 'LICENSE.md' in this project.
*/
var common = {
mixin: require('common/util').mixin,
events: require('common/events')
mixin: require('common/util').mixin,
events: require('common/events')
};
var fs = require('fs');
@ -19,43 +19,42 @@ var fs = require('fs');
@mixes module:common.events
*/
exports.Scanner = function() {
}
};
common.mixin(exports.Scanner.prototype, common.events);
/**
Recursively searches the given searchPaths for js files.
@param {Array.<string>} searchPaths
@param {number} [depth=1]
@fires sourceFileFound
Recursively searches the given searchPaths for js files.
@param {Array.<string>} searchPaths
@param {number} [depth=1]
@fires sourceFileFound
*/
exports.Scanner.prototype.scan = function(searchPaths, depth, filter) {
var filePaths = [],
that = this;
var filePaths = [],
that = this;
searchPaths = searchPaths || [];
depth = depth || 1;
searchPaths = searchPaths || [];
depth = depth || 1;
searchPaths.forEach(function($) {
var filepath = decodeURIComponent($);
searchPaths.forEach(function($) {
var filepath = decodeURIComponent($);
if ( fs.stat(filepath).isFile() ) {
filePaths.push(filepath);
}
else {
filePaths = filePaths.concat(fs.ls(filepath, depth));
}
});
filePaths = filePaths.filter(function($) {
return filter.isIncluded($);
});
filePaths = filePaths.filter(function($) {
var e = { fileName: $ };
}
});
filePaths = filePaths.filter(function($) {
return filter.isIncluded($);
});
filePaths = filePaths.filter(function($) {
var e = { fileName: $ };
that.fire('sourceFileFound', e);
return !e.defaultPrevented;
});
return filePaths;
}
return !e.defaultPrevented;
});
return filePaths;
};

View File

@ -70,8 +70,8 @@ function parseParamText(tagText) {
@param {object=} meta
*/
exports.Tag = function(tagTitle, tagBody, meta) {
var tagDef = jsdoc.tag.dictionary.lookUp(tagTitle),
meta = meta || {};
var tagDef = jsdoc.tag.dictionary.lookUp(tagTitle);
meta = meta || {};
this.originalTitle = trim(tagTitle);
@ -137,4 +137,4 @@ exports.Tag = function(tagTitle, tagBody, meta) {
throw e;
}
}
}
};

View File

@ -27,7 +27,7 @@ function TagDefinition(title, etc) {
TagDefinition.prototype.synonym = function(synonymName) {
_synonyms[synonymName.toLowerCase()] = this.title;
return this; // chainable
}
};
/** @exports jsdoc/tag/dictionary */
dictionary = {

View File

@ -1,10 +1,10 @@
/*global app: true, env: true */
/**
Define tags that are known in JSDoc.
@module jsdoc/tag/dictionary/definitions
Define tags that are known in JSDoc.
@module jsdoc/tag/dictionary/definitions
@author Michael Mathews <micmath@gmail.com>
@license Apache License 2.0 - See file 'LICENSE.md' in this project.
@author Michael Mathews <micmath@gmail.com>
@license Apache License 2.0 - See file 'LICENSE.md' in this project.
*/
/** @private */
@ -66,7 +66,7 @@ function setDocletNameToFilename(doclet, tag) {
for (var i = 0, len = env.opts._.length; i < len; i++) {
if (name.indexOf(env.opts._[i]) === 0) {
name = name.replace(env.opts._[0], '');
break
break;
}
}
doclet.name = name;
@ -224,31 +224,31 @@ exports.defineTags = function(dictionary) {
}
});
dictionary.defineTag('default', {
dictionary.defineTag('default', {
onTagged: function(doclet, tag) {
if (tag.value) {
doclet.defaultvalue = tag.value;
}
else if (doclet.meta && doclet.meta.code && typeof doclet.meta.code.value !== 'undefined') {
if (doclet.meta.code.type && /STRING|NUMBER|NAME|TRUE|FALSE/.test(doclet.meta.code.type)) {
doclet.defaultvalue = doclet.meta.code.value;
if (doclet.meta.code.type === 'STRING') {
// TODO: handle escaped quotes in values
doclet.defaultvalue = '"'+doclet.defaultvalue.replace(/"/g, '\\"')+'"'
}
if (doclet.defaultvalue === 'TRUE' || doclet.defaultvalue == 'FALSE') {
doclet.defaultvalue = doclet.defaultvalue.toLowerCase();
}
}
else if (doclet.meta.code.type === 'NULL') {
// TODO: handle escaped quotes in values
doclet.defaultvalue = 'null'
}
}
doclet.defaultvalue = tag.value;
}
else if (doclet.meta && doclet.meta.code && typeof doclet.meta.code.value !== 'undefined') {
if (doclet.meta.code.type && /STRING|NUMBER|NAME|TRUE|FALSE/.test(doclet.meta.code.type)) {
doclet.defaultvalue = doclet.meta.code.value;
if (doclet.meta.code.type === 'STRING') {
// TODO: handle escaped quotes in values
doclet.defaultvalue = '"'+doclet.defaultvalue.replace(/"/g, '\\"')+'"';
}
if (doclet.defaultvalue === 'TRUE' || doclet.defaultvalue == 'FALSE') {
doclet.defaultvalue = doclet.defaultvalue.toLowerCase();
}
}
else if (doclet.meta.code.type === 'NULL') {
// TODO: handle escaped quotes in values
doclet.defaultvalue = 'null';
}
}
}
})
.synonym('defaultvalue');
.synonym('defaultvalue');
dictionary.defineTag('deprecated', {
// value is optional
@ -440,7 +440,9 @@ exports.defineTags = function(dictionary) {
onTagged: function(doclet, tag) {
setDocletKindToTitle(doclet, tag);
setDocletNameToValue(doclet, tag);
doclet.name || setDocletNameToFilename(doclet, tag);
if (!doclet.name) {
setDocletNameToFilename(doclet, tag);
}
if (tag.value && tag.value.type) {
doclet.type = tag.value.type;
}
@ -645,4 +647,4 @@ exports.defineTags = function(dictionary) {
doclet.version = tag.value;
}
});
}
};

View File

@ -1,133 +1,133 @@
/**
@module jsdoc/tag/type
@module jsdoc/tag/type
@author Michael Mathews <micmath@gmail.com>
@license Apache License 2.0 - See file 'LICENSE.md' in this project.
@author Michael Mathews <micmath@gmail.com>
@license Apache License 2.0 - See file 'LICENSE.md' in this project.
*/
function parseOptional(type) {
var optional = null;
var optional = null;
// {sometype=} means optional
if ( /(.+)=$/.test(type) ) {
type = RegExp.$1;
optional = true;
}
// {sometype=} means optional
if ( /(.+)=$/.test(type) ) {
type = RegExp.$1;
optional = true;
}
return { type: type, optional: optional };
return { type: type, optional: optional };
}
function parseNullable(type) {
var nullable = null;
var nullable = null;
// {?sometype} means nullable, {!sometype} means not-nullable
if ( /^([\?\!])(.+)$/.test(type) ) {
type = RegExp.$2;
nullable = (RegExp.$1 === '?')? true : false;
}
// {?sometype} means nullable, {!sometype} means not-nullable
if ( /^([\?\!])(.+)$/.test(type) ) {
type = RegExp.$2;
nullable = (RegExp.$1 === '?')? true : false;
}
return { type: type, nullable: nullable };
return { type: type, nullable: nullable };
}
function parseVariable(type) {
var variable = null;
var variable = null;
// {...sometype} means variable number of that type
if ( /^(\.\.\.)(.+)$/.test(type) ) {
type = RegExp.$2;
variable = true;
}
// {...sometype} means variable number of that type
if ( /^(\.\.\.)(.+)$/.test(type) ) {
type = RegExp.$2;
variable = true;
}
return { type: type, variable: variable };
return { type: type, variable: variable };
}
function parseTypes(type) {
var types = [];
var types = [];
if ( type.indexOf('|') !== -1 ) {
// remove optional parens, like: { ( string | number ) }
// see: http://code.google.com/closure/compiler/docs/js-for-compiler.html#types
if ( /^\s*\(\s*(.+)\s*\)\s*$/.test(type) ) {
type = RegExp.$1;
}
types = type.split(/\s*\|\s*/g);
}
else if (type) {
types = [type];
}
if ( type.indexOf('|') !== -1 ) {
// remove optional parens, like: { ( string | number ) }
// see: http://code.google.com/closure/compiler/docs/js-for-compiler.html#types
if ( /^\s*\(\s*(.+)\s*\)\s*$/.test(type) ) {
type = RegExp.$1;
}
types = type.split(/\s*\|\s*/g);
}
else if (type) {
types = [type];
}
return types;
return types;
}
/** @private */
function trim(text) {
return text.trim();
return text.trim();
}
function getTagType(tagValue) {
var type = '',
text = '',
count = 0;
var type = '',
text = '',
count = 0;
// type expressions start with '{'
if (tagValue[0] === '{') {
count++;
// type expressions start with '{'
if (tagValue[0] === '{') {
count++;
// find matching closer '}'
for (var i = 1, leni = tagValue.length; i < leni; i++) {
if (tagValue[i] === '\\') { i++; continue; } // backslash escapes the next character
// find matching closer '}'
for (var i = 1, leni = tagValue.length; i < leni; i++) {
if (tagValue[i] === '\\') { i++; continue; } // backslash escapes the next character
if (tagValue[i] === '{') { count++; }
else if (tagValue[i] === '}') { count--; }
if (tagValue[i] === '{') { count++; }
else if (tagValue[i] === '}') { count--; }
if (count === 0) {
type = trim(tagValue.slice(1, i))
.replace(/\\\{/g, '{') // unescape escaped curly braces
.replace(/\\\}/g, '}');
text = trim(tagValue.slice(i+1));
break;
}
}
}
return { type: type, text: text };
if (count === 0) {
type = trim(tagValue.slice(1, i))
.replace(/\\\{/g, '{') // unescape escaped curly braces
.replace(/\\\}/g, '}');
text = trim(tagValue.slice(i+1));
break;
}
}
}
return { type: type, text: text };
}
exports.getTagType = getTagType;
/**
@param {string} tagValue
@returns {object} Hash with type, text, optional, nullable, and variable properties
@param {string} tagValue
@returns {object} Hash with type, text, optional, nullable, and variable properties
*/
exports.parse = function(tagValue) {
if (typeof tagValue !== 'string') { tagValue = ''; }
var type = '',
text = '',
tagType,
optional,
nullable,
variable;
tagType = getTagType(tagValue);
if (typeof tagValue !== 'string') { tagValue = ''; }
var type = '',
text = '',
tagType,
optional,
nullable,
variable;
tagType = getTagType(tagValue);
type = tagType.type;
if (tagType.type === '') {
text = tagValue;
} else {
text = tagType.text;
}
optional = parseOptional(type);
nullable = parseNullable(type);
variable = parseVariable(type);
type = variable.type || nullable.type || optional.type;
optional = parseOptional(type);
nullable = parseNullable(type);
variable = parseVariable(type);
type = variable.type || nullable.type || optional.type;
type = parseTypes(type); // make it into an array
type = parseTypes(type); // make it into an array
return {
type: type,
text: text,
optional: optional.optional,
nullable: nullable.nullable,
variable: variable.variable
};
}
return {
type: type,
text: text,
optional: optional.optional,
nullable: nullable.nullable,
variable: variable.variable
};
};

View File

@ -48,4 +48,4 @@ exports.validate = function(tag, meta) {
throw new TagValueNotPermittedError(tag.title, meta);
}
}
}
};

View File

@ -108,7 +108,7 @@ exports.resolve = function() {
}
item = conf[name];
current = tutorials[name]
current = tutorials[name];
// set title
if (item.title) {

View File

@ -48,7 +48,7 @@ seen.has = function(object) {
if (seen[i] === object) { return true; }
}
return false;
}
};
function stringify(o) {
return JSON.stringify(o);
@ -90,19 +90,18 @@ function isObject(o) {
}
function walk(object) {
var value;
if ( value = getValue(object) ) {
var value = getValue(object);
if (value) {
output += value + ',\n';
}
else if ( isUnwalkable(object) ) {
output += '<Object>,\n'
output += '<Object>,\n';
}
else if ( isRegExp(object) ) {
output += '<RegExp ' + object + '>,\n'
output += '<RegExp ' + object + '>,\n';
}
else if ( isDate(object) ) {
output += '<Date ' + object.toUTCString() + '>,\n'
output += '<Date ' + object.toUTCString() + '>,\n';
}
else if ( isFunction(object) ) {
output += '<Function' + (object.name? ' '+ object.name : '') + '>,\n';
@ -153,4 +152,4 @@ exports.dump = function(object) {
walk(object);
outdent(false);
return output;
}
};

View File

@ -46,7 +46,7 @@ function strToFilename(str) {
// allow for namespace prefix
var basename = str.replace(nsprefix, '$1-');
if ( /[^$a-z0-9._-]/i.test(basename) ) {
if ( /[^$a-z0-9._\-]/i.test(basename) ) {
return hash.hex_md5(str).substr(0, 10);
}
return makeFilenameUnique(basename, str);
@ -61,7 +61,7 @@ var linkMap = {
exports.registerLink = function(longname, url) {
linkMap.longnameToUrl[longname] = url;
linkMap.urlToLongname[url] = longname;
}
};
function toLink(longname, content) {
if (!longname) {
@ -81,8 +81,8 @@ function toLink(longname, content) {
}
}
else {
url = linkMap.longnameToUrl[longname];
}
url = linkMap.longnameToUrl[longname];
}
content = content || longname;
@ -108,7 +108,7 @@ var toTutorial = exports.toTutorial = function(tutorial, content) {
content = content || node.title;
return '<a href="'+exports.tutorialToUrl(tutorial)+'">'+content+'</a>';
}
};
/** Find symbol {@link ...} and {@tutorial ...} strings in text and turn into html links */
exports.resolveLinks = function(str) {
@ -125,27 +125,29 @@ exports.resolveLinks = function(str) {
);
return str;
}
};
/** Turn a doclet into a URL. */
exports.createLink = function(doclet) {
var url = '';
var url = '',
longname,
filename;
if (containers.indexOf(doclet.kind) < 0) {
var longname = doclet.longname,
filename = strToFilename(doclet.memberof || exports.globalName);
longname = doclet.longname;
filename = strToFilename(doclet.memberof || exports.globalName);
url = filename + exports.fileExtension + '#' + getNamespace(doclet.kind) + doclet.name;
}
else {
var longname = doclet.longname,
filename = strToFilename(longname);
longname = doclet.longname;
filename = strToFilename(longname);
url = filename + exports.fileExtension;
}
return url;
}
};
exports.longnameToUrl = linkMap.longnameToUrl;

View File

@ -222,7 +222,7 @@
addSignatureReturns(doclet);
addAttribs(doclet);
}
})
});
// do this after the urls have all been generated
data.forEach(function(doclet) {
@ -232,12 +232,12 @@
if (doclet.kind === 'member') {
addSignatureType(doclet);
addAttribs(doclet)
addAttribs(doclet);
}
if (doclet.kind === 'constant') {
addSignatureType(doclet);
addAttribs(doclet)
addAttribs(doclet);
}
});
@ -392,7 +392,7 @@
html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
fs.writeFileSync(path, html)
fs.writeFileSync(path, html);
}
for (var longname in helper.longnameToUrl) {
@ -444,7 +444,7 @@
// yes, you can use {@link} in tutorials too!
html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
fs.writeFileSync(path, html)
fs.writeFileSync(path, html);
}
// tutorials can have only one parent so there is no risk for loops
@ -455,7 +455,7 @@
});
}
saveChildren(tutorials);
}
};
function hashToLink(doclet, hash) {
if ( !/^(#.+)/.test(hash) ) { return hash; }

View File

@ -36,7 +36,7 @@
console.log('The only -d destination option currently supported is "console"!');
}
}
};
function graft(parentNode, childNodes, parentLongname, parentName) {
childNodes