Merge pull request #36 from tschaub/require

Use Rhino's require implementation.
This commit is contained in:
Michael Mathews 2011-09-22 23:20:23 -07:00
commit a9574d413b
22 changed files with 2301 additions and 2555 deletions

2
jsdoc
View File

@ -3,6 +3,6 @@
# rhino discards the path to the current script file, so we must add it back # rhino discards the path to the current script file, so we must add it back
PWD=`pwd` PWD=`pwd`
BASEDIR=`dirname $0` BASEDIR=`dirname $0`
java -classpath ${BASEDIR}/lib/js.jar org.mozilla.javascript.tools.shell.Main ${BASEDIR}/jsdoc.js --dirname=${PWD}/${BASEDIR} $@ java -classpath ${BASEDIR}/lib/js.jar org.mozilla.javascript.tools.shell.Main -modules ${BASEDIR}/node_modules -modules ${BASEDIR}/rhino_modules ${BASEDIR}/jsdoc.js --dirname=${PWD}/${BASEDIR} $@
#java -classpath ${BASEDIR}/lib/js.jar org.mozilla.javascript.tools.debugger.Main -debug ${BASEDIR}/jsdoc.js --dirname=${PWD}/${BASEDIR} $@ #java -classpath ${BASEDIR}/lib/js.jar org.mozilla.javascript.tools.debugger.Main -debug ${BASEDIR}/jsdoc.js --dirname=${PWD}/${BASEDIR} $@

View File

@ -30,7 +30,6 @@ for (var i = 0; i < arguments.length; i++) {
} }
} }
load(__dirname + '/lib/require.js');
load(__dirname + '/lib/rhino-shim.js'); load(__dirname + '/lib/rhino-shim.js');
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

View File

@ -1,222 +0,0 @@
/*
Rhino-Require is Public Domain
<http://en.wikipedia.org/wiki/Public_Domain>
The author or authors of this code dedicate any and all copyright interest
in this code to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and successors. We
intend this dedication to be an overt act of relinquishment in perpetuity of
all present and future rights to this code under copyright law.
*/
(function(global) {
var require = global.require = function(id) {
if (typeof arguments[0] !== 'string') throw 'USAGE: require(moduleId)';
var moduleContent = '',
moduleUrl;
moduleUrl = require.resolve(id);
moduleContent = '';
var file = new java.io.File(moduleUrl);
try {
var scanner = new java.util.Scanner(file).useDelimiter("\\Z");
moduleContent = String( scanner.next() );
}
catch(e) {
throw 'Unable to read file at: '+moduleUrl+', '+e;
}
if (moduleContent) {
try {
var f = new Function('require', 'exports', 'module', '__dirname', moduleContent),
exports = require.cache[moduleUrl] || {},
module = { id: id, uri: moduleUrl, exports: exports };
require._root.unshift(toDir(moduleUrl));
(function(__dirname) {
/*debug*///var lineno=1;print('\n== '+moduleUrl+' ===============\n1'+moduleContent.replace(/(\n)/g, function(m, i){return '\n'+(++lineno);}));
f.call({}, require, exports, module, __dirname);
})(require._root[0]);
require._root.shift();
}
catch(e) {
throw 'Unable to require source code from "' + moduleUrl + '": ' + e.toSource();
}
exports = module.exports || exports;
require.cache[id] = exports;
}
else {
throw 'The requested module cannot be returned: no content for id: "' + id + '" in paths: ' + require.paths.join(', ');
}
return exports;
}
require._root = [__dirname]; // the dir of the script that is calling require()
require.paths = [];
require.cache = {}; // cache module exports. Like: {id: exported}
var SLASH = Packages.java.io.File.separator;
/** Given a module id, try to find the path to the associated module.
*/
require.resolve = function(id) {
var parts = id.match(/^(\.\/|\/)?(.+)$/),
isRelative = false,
isAbsolute = false,
isInModule = false,
basename = id,
url = '';
if (parts) {
isRelative = parts[1] === './';
isAbsolute = parts[1] === '/';
isInModule = !(isRelative || isAbsolute);
basename = parts[2];
}
if (typeof basename === 'undefined') {
throw new Error('Malformed module identifier: '+id);
}
if (isAbsolute) {
rootedId = id;
}
else if (isRelative) {
var root = require._root[0],
rootedId = root + '/' + basename;
}
if (rootedId) {
if ( url = loadAsFile(rootedId) ) { return url; }
else if ( url = loadAsDir(rootedId) ) { return url; }
}
else if (isInModule) {
var url,
paths = require.paths;
for (var i = 0, len = paths.length; i < len; i++) {
rootedId = paths[i] + '/' + basename;
if ( url = loadAsFile(rootedId) ) { return url; }
else if ( url = loadAsDir(rootedId) ) { return url; }
}
if (url = findInNodemodules(require._root[0], basename, 'rhino_modules')) { return url; }
if (url = findInNodemodules(require._root[0], basename, 'node_modules')) { return url; }
}
throw new Error('Module not found: '+id);
}
function loadAsFile(id) {
if ( isFile(id) ) { return id; }
if ( isFile(id + '.js') ) { return id + '.js'; }
}
function loadAsDir(id) {
// look for the "main" property of the package.json file
if ( isFile(id + '/' + 'package.json') ) {
var packageJson = readFileSync(id + '/' + 'package.json', 'utf-8');
eval( 'packageJson = '+ packageJson);
if (packageJson.hasOwnProperty('main')) {
var main = deDotPath(id + '/' + packageJson.main);
return require.resolve(main);
}
}
if ( isFile(id + '/' + 'index.js') ) {
return id + '/' + 'index.js';
}
}
function findInNodemodules(root, id, moduleFolderName) {
var dirs = root.split('/'),
dir = '',
rootedId;
while (dirs.length) {
dir = dirs.join('/');
rootedId = dir + '/' + moduleFolderName + '/' + id;
if ( url = loadAsFile(rootedId) ) { return url; }
else if ( url = loadAsDir(rootedId) ) { return url; }
dirs.pop();
}
}
/** Given a path, return the base directory of that path.
@example toDir('/foo/bar/somefile.js'); => '/foo/bar'
*/
function toDir(path) {
var file = new java.io.File(path);
if (file.isDirectory()) {
return path;
}
var parts = path.split('/');
parts.pop();
return parts.join('/');
}
/** Returns true if the given path exists and is a file.
*/
function isFile(path) {
var file = new java.io.File(path);
if (file.isFile()) {
return true;
}
return false;
}
/** Returns true if the given path exists and is a directory.
*/
function isDir(path) {
var file = new java.io.File(path);
if (file.isDirectory()) {
return true;
}
return false;
}
/**
Resolve dots in filepaths.
*/
function deDotPath(path) {
return String(path)
.replace(/(\/|\\)[^\/\\]+\/\.\.(\/|\\)/g, '/')
.replace(/(\/|\\)\.(\/|\\|$)/g, '/');
}
function readFileSync(filename, encoding, callback) {
if (typeof arguments[1] === 'function') {
encoding = null;
callback = arguments[1];
}
encoding = encoding || java.lang.System.getProperty('file.encoding');
try {
var content = new java.util.Scanner(
new java.io.File(filename),
encoding
).useDelimiter("\\Z");
return String( content.next() );
}
catch (e) {
return '';
}
}
})(this);

View File

@ -1,10 +1,10 @@
function readFileSync(filename, encoding) { exports.readFileSync = function(filename, encoding) {
encoding = encoding || 'utf-8'; encoding = encoding || 'utf-8';
return readFile(filename, encoding); return readFile(filename, encoding);
} };
function readdirSync(path) { var readdirSync = exports.readdirSync = function(path) {
var dir, var dir,
files; files;
@ -14,9 +14,9 @@ function readdirSync(path) {
files = dir.list(); files = dir.list();
return files; return files;
} };
function ls(dir, recurse, _allFiles, _path) { var ls = exports.ls = function(dir, recurse, _allFiles, _path) {
var files, var files,
file; file;
@ -56,9 +56,9 @@ function ls(dir, recurse, _allFiles, _path) {
} }
return _allFiles; return _allFiles;
} };
function stat(path, encoding) { var stat = exports.stat = function(path, encoding) {
var f = new java.io.File(path) var f = new java.io.File(path)
return { return {
isFile: function() { isFile: function() {
@ -69,9 +69,9 @@ function stat(path, encoding) {
} }
} }
} };
function mkPath(/**Array*/ path) { exports.mkPath = function(/**Array*/ path) {
if (path.constructor != Array) path = path.split(/[\\\/]/); if (path.constructor != Array) path = path.split(/[\\\/]/);
var make = ""; var make = "";
for (var i = 0, l = path.length; i < l; i++) { for (var i = 0, l = path.length; i < l; i++) {
@ -80,7 +80,7 @@ function mkPath(/**Array*/ path) {
makeDir(make); makeDir(make);
} }
} }
} };
function makeDir(/**string*/ path) { function makeDir(/**string*/ path) {
var dirPath = toDir(path); var dirPath = toDir(path);
@ -102,7 +102,7 @@ function exists(path) {
return true; return true;
} }
function toDir(path) { var toDir = exports.toDir = function(path) {
var f = new java.io.File(path); var f = new java.io.File(path);
if (f.isDirectory()){ if (f.isDirectory()){
@ -113,9 +113,9 @@ function toDir(path) {
parts.pop(); parts.pop();
return parts.join('/'); return parts.join('/');
} };
function copyFile(inFile, outDir, fileName) { exports.copyFile = function(inFile, outDir, fileName) {
if (fileName == null) fileName = toFile(inFile); if (fileName == null) fileName = toFile(inFile);
outDir = toDir(outDir); outDir = toDir(outDir);
@ -131,14 +131,14 @@ function copyFile(inFile, outDir, fileName) {
} }
bos.close(); bos.close();
bis.close(); bis.close();
} };
function toFile(path) { function toFile(path) {
var parts = path.split(/[\\\/]/); var parts = path.split(/[\\\/]/);
return parts.pop(); return parts.pop();
} }
function writeFileSync(filename, data, encoding) { exports.writeFileSync = function(filename, data, encoding) {
encoding = encoding || 'utf-8'; encoding = encoding || 'utf-8';
var out = new Packages.java.io.PrintWriter( var out = new Packages.java.io.PrintWriter(
@ -155,16 +155,4 @@ function writeFileSync(filename, data, encoding) {
out.flush(); out.flush();
out.close(); out.close();
} }
}
module.exports = {
readFileSync: readFileSync,
writeFileSync: writeFileSync,
readdirSync: readdirSync,
stat: stat,
ls: ls,
mkPath: mkPath,
toDir: toDir,
copyFile: copyFile
}; };

View File

@ -4,16 +4,15 @@
@author Michael Mathews <micmath@gmail.com> @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.
*/ */
(function() {
// requires docs to have been indexed: docs.index must be defined here // requires docs to have been indexed: docs.index must be defined here
/** /**
Take a copy of the docs for borrowed symbols and attach them to the Take a copy of the docs for borrowed symbols and attach them to the
docs for the borrowing symbol. This process changes the symbols involved, docs for the borrowing symbol. This process changes the symbols involved,
moving docs from the "borrowed" array and into the general docs, then moving docs from the "borrowed" array and into the general docs, then
deleting the "borrowed" array. deleting the "borrowed" array.
*/ */
exports.resolveBorrows = function(docs) { exports.resolveBorrows = function(docs) {
if (!docs.index) { if (!docs.index) {
throw 'Docs has not been indexed: docs.index must be defined here.'; throw 'Docs has not been indexed: docs.index must be defined here.';
} }
@ -47,13 +46,13 @@
delete doc.borrowed; delete doc.borrowed;
} }
}); });
} }
/** /**
Deep clone a simple object. Deep clone a simple object.
@private @private
*/ */
function doop(o) { function doop(o) {
if (o instanceof Object && o.constructor != Function) { if (o instanceof Object && o.constructor != Function) {
var clone = o instanceof Array ? [] : {}, prop; var clone = o instanceof Array ? [] : {}, prop;
@ -65,6 +64,4 @@
return clone; return clone;
} }
return o; return o;
}; };
})();

View File

@ -10,22 +10,22 @@
@requires jsdoc/name @requires jsdoc/name
@requires jsdoc/tag/dictionary @requires jsdoc/tag/dictionary
*/ */
(function() {
var jsdoc = { var jsdoc = {
tag: { tag: {
Tag: require('jsdoc/tag').Tag, Tag: require('jsdoc/tag').Tag,
dictionary: require('jsdoc/tag/dictionary') dictionary: require('jsdoc/tag/dictionary')
}, },
name: require('jsdoc/name') name: require('jsdoc/name')
}; };
/** /**
@class @class
@classdesc Represents a single JSDoc comment. @classdesc Represents a single JSDoc comment.
@param {string} docletSrc - The raw source code of the jsdoc comment. @param {string} docletSrc - The raw source code of the jsdoc comment.
@param {object=} meta - Properties describing the code related to this comment. @param {object=} meta - Properties describing the code related to this comment.
*/ */
exports.Doclet = function(docletSrc, meta) { exports.Doclet = function(docletSrc, meta) {
var newTags = []; var newTags = [];
/** The original text of the comment from the source code. */ /** The original text of the comment from the source code. */
@ -42,10 +42,10 @@
} }
this.postProcess(); this.postProcess();
} }
/** Called once after all tags have been added. */ /** Called once after all tags have been added. */
exports.Doclet.prototype.postProcess = function() { exports.Doclet.prototype.postProcess = function() {
if (!this.preserveName) { jsdoc.name.resolve(this); } if (!this.preserveName) { jsdoc.name.resolve(this); }
if (this.name && !this.longname) { if (this.name && !this.longname) {
this.setLongname(this.name); this.setLongname(this.name);
@ -56,13 +56,13 @@
if (!this.kind && this.meta && this.meta.code) { if (!this.kind && this.meta && this.meta.code) {
this.addTag( 'kind', codetypeToKind(this.meta.code.type) ); this.addTag( 'kind', codetypeToKind(this.meta.code.type) );
} }
} }
/** Add a tag to this doclet. /** Add a tag to this doclet.
@param {string} title - The title of the tag being added. @param {string} title - The title of the tag being added.
@param {string} [text] - The text of the tag being added. @param {string} [text] - The text of the tag being added.
*/ */
exports.Doclet.prototype.addTag = function(title, text) { exports.Doclet.prototype.addTag = function(title, text) {
var tagDef = jsdoc.tag.dictionary.lookUp(title), var tagDef = jsdoc.tag.dictionary.lookUp(title),
newTag = new jsdoc.tag.Tag(title, text, this.meta); newTag = new jsdoc.tag.Tag(title, text, this.meta);
@ -76,24 +76,24 @@
} }
applyTag.call(this, newTag); applyTag.call(this, newTag);
} }
/** Set the `memberof` property of this doclet. /** Set the `memberof` property of this doclet.
@param {string} sid - The longname of the symbol that this doclet is a member of. @param {string} sid - The longname of the symbol that this doclet is a member of.
*/ */
exports.Doclet.prototype.setMemberof = function(sid) { exports.Doclet.prototype.setMemberof = function(sid) {
if (/^<global>\.?/.test(sid)) { sid = sid.replace(/^<global>.?/, ''); } if (/^<global>\.?/.test(sid)) { sid = sid.replace(/^<global>.?/, ''); }
/** /**
The longname of the symbol that contains this one, if any. The longname of the symbol that contains this one, if any.
@type string @type string
*/ */
this.memberof = sid.replace(/\.prototype/g, '#'); this.memberof = sid.replace(/\.prototype/g, '#');
} }
/** Set the `longname` property of this doclet. /** Set the `longname` property of this doclet.
@param {string} name @param {string} name
*/ */
exports.Doclet.prototype.setLongname = function(name) { exports.Doclet.prototype.setLongname = function(name) {
if (/^<global>\.?/.test(name)) { name = name.replace(/^<global>\.?/, ''); } if (/^<global>\.?/.test(name)) { name = name.replace(/^<global>\.?/, ''); }
/** /**
@ -104,13 +104,13 @@
if (jsdoc.tag.dictionary.isNamespace(this.kind)) { if (jsdoc.tag.dictionary.isNamespace(this.kind)) {
this.longname = jsdoc.name.applyNamespace(this.longname, this.kind); this.longname = jsdoc.name.applyNamespace(this.longname, this.kind);
} }
} }
/** Add a symbol to this doclet's `borrowed` array. /** Add a symbol to this doclet's `borrowed` array.
@param {string} source - The longname of the symbol that is the source. @param {string} source - The longname of the symbol that is the source.
@param {string} target - The name the symbol is being assigned to. @param {string} target - The name the symbol is being assigned to.
*/ */
exports.Doclet.prototype.borrow = function(source, target) { exports.Doclet.prototype.borrow = function(source, target) {
var about = {from: source}; var about = {from: source};
if (target) about.as = target; if (target) about.as = target;
@ -122,9 +122,9 @@
this.borrowed = []; this.borrowed = [];
} }
this.borrowed.push(about); this.borrowed.push(about);
} }
exports.Doclet.prototype.mix = function(source) { exports.Doclet.prototype.mix = function(source) {
if (!this.mixes) { if (!this.mixes) {
/** /**
A list of symbols that are mixed into this one, if any. A list of symbols that are mixed into this one, if any.
@ -133,12 +133,12 @@
this.mixes = []; this.mixes = [];
} }
this.mixes.push(source); this.mixes.push(source);
} }
/** Add a symbol to this doclet's `augments` array. /** Add a symbol to this doclet's `augments` array.
@param {string} base - The longname of the base symbol. @param {string} base - The longname of the base symbol.
*/ */
exports.Doclet.prototype.augment = function(base) { exports.Doclet.prototype.augment = function(base) {
if (!this.augments) { if (!this.augments) {
/** /**
A list of symbols that are augmented by this one, if any. A list of symbols that are augmented by this one, if any.
@ -147,13 +147,13 @@
this.augments = []; this.augments = [];
} }
this.augments.push(base); this.augments.push(base);
} }
/** /**
Set the `meta` property of this doclet. Set the `meta` property of this doclet.
@param {object} meta @param {object} meta
*/ */
exports.Doclet.prototype.setMeta = function(meta) { exports.Doclet.prototype.setMeta = function(meta) {
if (!this.meta) { if (!this.meta) {
/** /**
Information about the source code associated with this doclet. Information about the source code associated with this doclet.
@ -204,9 +204,9 @@
this.meta.code.value = meta.code.value; this.meta.code.value = meta.code.value;
} }
} }
} }
function applyTag(tag) { function applyTag(tag) {
if (tag.title === 'name') { if (tag.title === 'name') {
this.name = tag.value; this.name = tag.value;
} }
@ -222,10 +222,10 @@
if (tag.title === 'scope') { if (tag.title === 'scope') {
this.scope = tag.value; this.scope = tag.value;
} }
} }
// use the meta info about the source code to guess what the doclet kind should be // use the meta info about the source code to guess what the doclet kind should be
function codetypeToKind(type) { function codetypeToKind(type) {
var kind = (type || '').toLowerCase(); var kind = (type || '').toLowerCase();
if (kind !== 'function') { if (kind !== 'function') {
@ -233,13 +233,13 @@
} }
return kind; return kind;
} }
/** /**
Convert the raw source of the doclet comment into an array of Tag objects. Convert the raw source of the doclet comment into an array of Tag objects.
@private @private
*/ */
function toTags(docletSrc) { function toTags(docletSrc) {
var tagSrcs, var tagSrcs,
tags = []; tags = [];
@ -251,9 +251,9 @@
} }
return tags; return tags;
} }
function unwrap(docletSrc) { function unwrap(docletSrc) {
if (!docletSrc) { return ''; } if (!docletSrc) { return ''; }
// note: keep trailing whitespace for @examples // note: keep trailing whitespace for @examples
@ -267,16 +267,16 @@
.replace(/\s*\\Z$/g, ''); // remove end-marker .replace(/\s*\\Z$/g, ''); // remove end-marker
return docletSrc; return docletSrc;
} }
function fixDescription(docletSrc) { function fixDescription(docletSrc) {
if (!/^\s*@/.test(docletSrc)) { if (!/^\s*@/.test(docletSrc)) {
docletSrc = '@description ' + docletSrc; docletSrc = '@description ' + docletSrc;
} }
return docletSrc; return docletSrc;
} }
function split(docletSrc) { function split(docletSrc) {
var tagSrcs = []; var tagSrcs = [];
// split out the basic tags, keep surrounding whitespace // split out the basic tags, keep surrounding whitespace
@ -302,6 +302,4 @@
}); });
return tagSrcs; return tagSrcs;
} }
})();

View File

@ -5,20 +5,20 @@
@author Michael Mathews <micmath@gmail.com> @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.
*/ */
(function() {
var jsdoc = { var jsdoc = {
tagDictionary: require('jsdoc/tag/dictionary') tagDictionary: require('jsdoc/tag/dictionary')
}; };
var puncToScope = { '.': 'static', '~': 'inner', '#': 'instance' }, var puncToScope = { '.': 'static', '~': 'inner', '#': 'instance' },
scopeToPunc = { 'static': '.', 'inner': '~', 'instance': '#' }, scopeToPunc = { 'static': '.', 'inner': '~', 'instance': '#' },
Token = Packages.org.mozilla.javascript.Token; Token = Packages.org.mozilla.javascript.Token;
/** /**
Resolves the longname, memberof, variation and name values of the given doclet. Resolves the longname, memberof, variation and name values of the given doclet.
@param {module:jsdoc/doclet.Doclet} doclet @param {module:jsdoc/doclet.Doclet} doclet
*/ */
exports.resolve = function(doclet) { exports.resolve = function(doclet) {
var name = doclet.name, var name = doclet.name,
memberof = doclet.memberof || '', memberof = doclet.memberof || '',
about = {}, about = {},
@ -84,16 +84,16 @@
if (about.variation) { if (about.variation) {
doclet.variation = about.variation; doclet.variation = about.variation;
} }
} }
/** /**
@inner @inner
@memberof module:jsdoc/name @memberof module:jsdoc/name
@param {string} name @param {string} name
@param {string} kind @param {string} kind
@returns {string} The name with unsafe names enclosed in quotes. @returns {string} The name with unsafe names enclosed in quotes.
*/ */
function quoteUnsafe(name, kind) { // docspaced names may have unsafe characters which need to be quoted by us function quoteUnsafe(name, kind) { // docspaced names may have unsafe characters which need to be quoted by us
if ( (jsdoc.tagDictionary.lookUp(kind).setsDocletDocspace) && /[^$_a-zA-Z0-9\/]/.test(name) ) { if ( (jsdoc.tagDictionary.lookUp(kind).setsDocletDocspace) && /[^$_a-zA-Z0-9\/]/.test(name) ) {
if (!/^[a-z_$-\/]+:\"/i.test(name)) { if (!/^[a-z_$-\/]+:\"/i.test(name)) {
return '"' + name.replace(/\"/g, '"') + '"'; return '"' + name.replace(/\"/g, '"') + '"';
@ -101,20 +101,20 @@
} }
return name; return name;
} }
RegExp.escape = RegExp.escape || function(str) { RegExp.escape = RegExp.escape || function(str) {
var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\ var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\
return str.replace(specials, "\\$&"); return str.replace(specials, "\\$&");
} }
/** /**
@method module:jsdoc/name.applyNamespace @method module:jsdoc/name.applyNamespace
@param {string} longname The full longname of the symbol. @param {string} longname The full longname of the symbol.
@param {string} ns The namespace to be applied. @param {string} ns The namespace to be applied.
@returns {string} The longname with the namespace applied. @returns {string} The longname with the namespace applied.
*/ */
exports.applyNamespace = function(longname, ns) { exports.applyNamespace = function(longname, ns) {
var nameParts = exports.shorten(longname), var nameParts = exports.shorten(longname),
name = nameParts.name, name = nameParts.name,
longname = nameParts.longname; longname = nameParts.longname;
@ -124,15 +124,15 @@
} }
return longname; return longname;
} }
/** /**
Given a longname like "a.b#c(2)", slice it up into ["a.b", "#", 'c', '2'], Given a longname like "a.b#c(2)", slice it up into ["a.b", "#", 'c', '2'],
representing the memberof, the scope, the name, and variation. representing the memberof, the scope, the name, and variation.
@param {string} longname @param {string} longname
@returns {object} Representing the properties of the given name. @returns {object} Representing the properties of the given name.
*/ */
exports.shorten = function(longname) { exports.shorten = function(longname) {
// quoted strings in a longname are atomic, convert to tokens // quoted strings in a longname are atomic, convert to tokens
var atoms = [], token; var atoms = [], token;
@ -177,6 +177,5 @@
//// ////
return {longname: longname, memberof: memberof, scope: scope, name: name, variation: variation}; return {longname: longname, memberof: memberof, scope: scope, name: name, variation: variation};
} }
})();

View File

@ -4,38 +4,38 @@
@author Michael Mathews <micmath@gmail.com> @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.
*/ */
(function() {
var common = {
args: require('common/args')
};
var argParser = new common.args.ArgParser(), var common = {
args: require('common/args')
};
var argParser = new common.args.ArgParser(),
ourOptions, ourOptions,
defaults = { defaults = {
template: 'default', template: 'default',
destination: './out/' destination: './out/'
}; };
argParser.addOption('t', 'template', true, 'The name of the template to use. Default: the "default" template'); argParser.addOption('t', 'template', true, 'The name of the template to use. Default: the "default" template');
argParser.addOption('c', 'configure', true, 'The path to the configuration file. Default: jsdoc __dirname + /conf.json'); argParser.addOption('c', 'configure', true, 'The path to the configuration file. Default: jsdoc __dirname + /conf.json');
argParser.addOption('e', 'encoding', true, 'Assume this encoding when reading all source files. Default: utf-8'); argParser.addOption('e', 'encoding', true, 'Assume this encoding when reading all source files. Default: utf-8');
argParser.addOption('T', 'test', false, 'Run all tests and quit.'); argParser.addOption('T', 'test', false, 'Run all tests and quit.');
argParser.addOption('d', 'destination', true, 'The path to the output folder. Use "console" to dump data to the console. Default: console'); argParser.addOption('d', 'destination', true, 'The path to the output folder. Use "console" to dump data to the console. Default: console');
argParser.addOption('r', 'recurse', false, 'Recurse into subdirectories when scanning for source code files.'); argParser.addOption('r', 'recurse', false, 'Recurse into subdirectories when scanning for source code files.');
argParser.addOption('h', 'help', false, 'Print this message and quit.'); argParser.addOption('h', 'help', false, 'Print this message and quit.');
argParser.addOption('X', 'explain', false, 'Dump all found doclet internals to console and quit.'); argParser.addOption('X', 'explain', false, 'Dump all found doclet internals to console and quit.');
argParser.addOption('q', 'query', true, 'Provide a querystring to define custom variable names/values to add to the options hash.'); argParser.addOption('q', 'query', true, 'Provide a querystring to define custom variable names/values to add to the options hash.');
// TODO [-R, recurseonly] = a number representing the depth to recurse // TODO [-R, recurseonly] = a number representing the depth to recurse
// TODO [-f, filter] = a regex to filter on <-- this can be better defined in the configs? // TODO [-f, filter] = a regex to filter on <-- this can be better defined in the configs?
/** /**
Set the options for this app. Set the options for this app.
@throws {Error} Illegal arguments will throw errors. @throws {Error} Illegal arguments will throw errors.
@param {string|String[]} args The command line arguments for this app. @param {string|String[]} args The command line arguments for this app.
*/ */
exports.parse = function(args) { exports.parse = function(args) {
args = args || []; args = args || [];
if (typeof args === 'string' || args.constructor === String) { if (typeof args === 'string' || args.constructor === String) {
@ -45,16 +45,16 @@
ourOptions = argParser.parse(args, defaults); ourOptions = argParser.parse(args, defaults);
return ourOptions; return ourOptions;
} }
/** /**
Display help message for options. Display help message for options.
*/ */
exports.help = function() { exports.help = function() {
return argParser.help(); return argParser.help();
} }
/** /**
Get a named option. Get a named option.
@param {string} name The name of the option. @param {string} name The name of the option.
@return {string} The value associated with the given name. @return {string} The value associated with the given name.
@ -62,12 +62,11 @@
Get all the options for this app. Get all the options for this app.
@return {Object} A collection of key/values representing all the options. @return {Object} A collection of key/values representing all the options.
*/ */
exports.get = function(name) { exports.get = function(name) {
if (typeof name === 'undefined') { if (typeof name === 'undefined') {
return ourOptions; return ourOptions;
} }
else { else {
return ourOptions[name]; return ourOptions[name];
} }
} }
})();

View File

@ -8,13 +8,13 @@
@module jsdoc/package @module jsdoc/package
@see http://wiki.commonjs.org/wiki/Packages/1.0 @see http://wiki.commonjs.org/wiki/Packages/1.0
*/ */
(function() {
/** /**
@class @class
@classdesc Represents a JavaScript package. @classdesc Represents a JavaScript package.
@param {string} json - The contents of package.json. @param {string} json - The contents of package.json.
*/ */
exports.Package = function(json) { exports.Package = function(json) {
/** The source files associated with this package. /** The source files associated with this package.
@type {Array<String>} @type {Array<String>}
*/ */
@ -64,6 +64,5 @@
* ] * ]
*/ */
this.licenses = json.licenses; this.licenses = json.licenses;
} }
})();

View File

@ -2,14 +2,14 @@
@module jsdoc/src/handlers @module jsdoc/src/handlers
*/ */
(function() {
var currentModule = null;
/** var currentModule = null;
/**
Attach these event handlers to a particular instance of a parser. Attach these event handlers to a particular instance of a parser.
@param parser @param parser
*/ */
exports.attachTo = function(parser) { exports.attachTo = function(parser) {
var jsdoc = {doclet: require('jsdoc/doclet')}; var jsdoc = {doclet: require('jsdoc/doclet')};
// handles JSDoc comments that include a @name tag -- the code is ignored in such a case // handles JSDoc comments that include a @name tag -- the code is ignored in such a case
@ -148,5 +148,5 @@
return false; return false;
} }
} }
})();

View File

@ -5,25 +5,24 @@
* @requires common/events * @requires common/events
*/ */
(function() { var Token = Packages.org.mozilla.javascript.Token,
var Token = Packages.org.mozilla.javascript.Token,
currentParser = null, currentParser = null,
currentSourceName = ''; currentSourceName = '';
/** /**
* @class * @class
* @mixes module:common/events * @mixes module:common/events
* *
* @example <caption>Create a new parser.</caption> * @example <caption>Create a new parser.</caption>
* var jsdocParser = new (require('jsdoc/src/parser').Parser)(); * var jsdocParser = new (require('jsdoc/src/parser').Parser)();
*/ */
exports.Parser = function() { exports.Parser = function() {
this._resultBuffer = []; this._resultBuffer = [];
this.refs = {}; this.refs = {};
} }
require('common/util').mixin(exports.Parser.prototype, require('common/events')); require('common/util').mixin(exports.Parser.prototype, require('common/events'));
/** /**
* Parse the given source files for JSDoc comments. * Parse the given source files for JSDoc comments.
* @param {Array.<string>} sourceFiles An array of filepaths to the JavaScript sources. * @param {Array.<string>} sourceFiles An array of filepaths to the JavaScript sources.
* @param {string} [encoding=utf8] * @param {string} [encoding=utf8]
@ -38,7 +37,7 @@
* var myFiles = ['file1.js', 'file2.js']; * var myFiles = ['file1.js', 'file2.js'];
* var docs = jsdocParser.parse(myFiles); * var docs = jsdocParser.parse(myFiles);
*/ */
exports.Parser.prototype.parse = function(sourceFiles, encoding) { exports.Parser.prototype.parse = function(sourceFiles, encoding) {
const SCHEMA = 'javascript:'; const SCHEMA = 'javascript:';
var sourceCode = '', var sourceCode = '',
filename = ''; filename = '';
@ -67,33 +66,33 @@
} }
return this._resultBuffer; return this._resultBuffer;
} }
/** /**
* @returns {Array<Doclet>} The accumulated results of any calls to parse. * @returns {Array<Doclet>} The accumulated results of any calls to parse.
*/ */
exports.Parser.prototype.results = function() { exports.Parser.prototype.results = function() {
return this._resultBuffer; return this._resultBuffer;
} }
/** /**
* @param {Object} o The parse result to add to the result buffer. * @param {Object} o The parse result to add to the result buffer.
*/ */
exports.Parser.prototype.addResult = function(o) { exports.Parser.prototype.addResult = function(o) {
this._resultBuffer.push(o); this._resultBuffer.push(o);
} }
/** /**
* Empty any accumulated results of calls to parse. * Empty any accumulated results of calls to parse.
*/ */
exports.Parser.prototype.clear = function() { exports.Parser.prototype.clear = function() {
currentParser = null; currentParser = null;
currentSourceName = ''; currentSourceName = '';
this._resultBuffer = []; this._resultBuffer = [];
} }
/** @private */ /** @private */
exports.Parser.prototype._parseSourceCode = function(sourceCode, sourceName) { exports.Parser.prototype._parseSourceCode = function(sourceCode, sourceName) {
currentSourceName = sourceName; currentSourceName = sourceName;
sourceCode = pretreat(sourceCode); sourceCode = pretreat(sourceCode);
@ -114,22 +113,22 @@
this.fire('fileComplete', e); this.fire('fileComplete', e);
currentSourceName = ''; currentSourceName = '';
} }
function pretreat(code) { function pretreat(code) {
return code return code
// merge adjacent doclets // merge adjacent doclets
.replace(/\*\/\/\*\*+/g, '@also') .replace(/\*\/\/\*\*+/g, '@also')
// make lent objectliterals documentable by giving them a dummy name // make lent objectliterals documentable by giving them a dummy name
.replace(/(\/\*\*[\s\S]*?@lends\b[\s\S]*?\*\/\s*)\{/g, '$1____ = {'); .replace(/(\/\*\*[\s\S]*?@lends\b[\s\S]*?\*\/\s*)\{/g, '$1____ = {');
} }
/** /**
* Given a node, determine what the node is a member of. * Given a node, determine what the node is a member of.
* @param {astnode} node * @param {astnode} node
* @returns {string} The long name of the node that this is a member of. * @returns {string} The long name of the node that this is a member of.
*/ */
exports.Parser.prototype.astnodeToMemberof = function(node) { exports.Parser.prototype.astnodeToMemberof = function(node) {
var memberof = {}; var memberof = {};
if (node.type === Token.VAR || node.type === Token.FUNCTION) { if (node.type === Token.VAR || node.type === Token.FUNCTION) {
@ -148,14 +147,14 @@
if (!memberof.doclet) return ''; // global? if (!memberof.doclet) return ''; // global?
return memberof.doclet.longname||memberof.doclet.name; return memberof.doclet.longname||memberof.doclet.name;
} }
} }
/** /**
* Resolve what "this" refers too, relative to a node. * Resolve what "this" refers too, relative to a node.
* @param {astnode} node - The "this" node * @param {astnode} node - The "this" node
* @returns {string} The longname of the enclosing node. * @returns {string} The longname of the enclosing node.
*/ */
exports.Parser.prototype.resolveThis = function(node) { exports.Parser.prototype.resolveThis = function(node) {
var memberof = {}; var memberof = {};
if (node.enclosingFunction) { if (node.enclosingFunction) {
@ -198,14 +197,14 @@
else { else {
return ''; // global? return ''; // global?
} }
} }
/** /**
* Resolve what function a var is limited to. * Resolve what function a var is limited to.
* @param {astnode} node * @param {astnode} node
* @param {string} basename The leftmost name in the long name: in foo.bar.zip the basename is foo. * @param {string} basename The leftmost name in the long name: in foo.bar.zip the basename is foo.
*/ */
exports.Parser.prototype.resolveVar = function(node, basename) { exports.Parser.prototype.resolveVar = function(node, basename) {
var doclet, var doclet,
enclosingFunction = node.enclosingFunction; enclosingFunction = node.enclosingFunction;
@ -217,10 +216,10 @@
} }
return this.resolveVar(enclosingFunction, basename); return this.resolveVar(enclosingFunction, basename);
} }
/** @private */ /** @private */
function visitNode(node) { function visitNode(node) {
var e, var e,
commentSrc; commentSrc;
@ -367,10 +366,10 @@
} }
return true; return true;
} }
/** @private */ /** @private */
function parserFactory() { function parserFactory() {
var cx = Packages.org.mozilla.javascript.Context.getCurrentContext(); var cx = Packages.org.mozilla.javascript.Context.getCurrentContext();
var ce = new Packages.org.mozilla.javascript.CompilerEnvirons(); var ce = new Packages.org.mozilla.javascript.CompilerEnvirons();
@ -380,14 +379,14 @@
ce.initFromContext(cx); ce.initFromContext(cx);
return new Packages.org.mozilla.javascript.Parser(ce, ce.getErrorReporter()); return new Packages.org.mozilla.javascript.Parser(ce, ce.getErrorReporter());
} }
/** /**
* Attempts to find the name and type of the given node. * Attempts to find the name and type of the given node.
* @private * @private
* @memberof module:src/parser.Parser * @memberof module:src/parser.Parser
*/ */
function aboutNode(node) { function aboutNode(node) {
about = {}; about = {};
if (node.type == Token.FUNCTION) { if (node.type == Token.FUNCTION) {
@ -438,12 +437,12 @@
} }
return about; return about;
} }
/** @private /** @private
@memberof module:src/parser.Parser @memberof module:src/parser.Parser
*/ */
function nodeToString(node) { function nodeToString(node) {
var str; var str;
if (!node) return; if (!node) return;
@ -474,12 +473,12 @@
} }
return '' + str; return '' + str;
}; };
/** @private /** @private
@memberof module:src/parser.Parser @memberof module:src/parser.Parser
*/ */
function getTypeName(node) { function getTypeName(node) {
var type = ''; var type = '';
if (node) { if (node) {
@ -487,16 +486,14 @@
} }
return type; return type;
} }
/** @private /** @private
@memberof module:src/parser.Parser @memberof module:src/parser.Parser
*/ */
function isValidJsdoc(commentSrc) { function isValidJsdoc(commentSrc) {
return commentSrc.indexOf('/***') !== 0; /*** ignore comments that start with many stars ***/ return commentSrc.indexOf('/***') !== 0; /*** ignore comments that start with many stars ***/
} }
})();
/** /**
Fired whenever the parser encounters a JSDoc comment in the current source code. Fired whenever the parser encounters a JSDoc comment in the current source code.
@ -506,4 +503,4 @@
@param {string} e.comment The text content of the JSDoc comment @param {string} e.comment The text content of the JSDoc comment
@param {number} e.lineno The line number associated with the found comment. @param {number} e.lineno The line number associated with the found comment.
@param {string} e.filename The file name associated with the found comment. @param {string} e.filename The file name associated with the found comment.
*/ */

View File

@ -6,29 +6,29 @@
@license Apache License 2.0 - See file 'LICENSE.md' in this project. @license Apache License 2.0 - See file 'LICENSE.md' in this project.
*/ */
(function() {
var common = { var common = {
mixin: require('common/util').mixin, mixin: require('common/util').mixin,
events: require('common/events') events: require('common/events')
}; };
var fs = require('fs'); var fs = require('fs');
/** /**
@constructor @constructor
@mixes module:common.events @mixes module:common.events
*/ */
exports.Scanner = function() { exports.Scanner = function() {
} }
common.mixin(exports.Scanner.prototype, common.events); common.mixin(exports.Scanner.prototype, common.events);
/** /**
Recursively searches the given searchPaths for js files. Recursively searches the given searchPaths for js files.
@param {Array.<string>} searchPaths @param {Array.<string>} searchPaths
@param {number} [depth=1] @param {number} [depth=1]
@fires sourceFileFound @fires sourceFileFound
*/ */
exports.Scanner.prototype.scan = function(searchPaths, depth, includeMatch, excludeMatch) { exports.Scanner.prototype.scan = function(searchPaths, depth, includeMatch, excludeMatch) {
var filePaths = [], var filePaths = [],
that = this; that = this;
@ -64,6 +64,5 @@
}); });
return filePaths; return filePaths;
} }
})();

View File

@ -11,17 +11,17 @@
@requires jsdoc/tag/validator @requires jsdoc/tag/validator
@requires jsdoc/tag/type @requires jsdoc/tag/type
*/ */
(function() {
var jsdoc = {
var jsdoc = {
tag: { tag: {
dictionary: require('jsdoc/tag/dictionary'), dictionary: require('jsdoc/tag/dictionary'),
validator: require('jsdoc/tag/validator'), validator: require('jsdoc/tag/validator'),
type: require('jsdoc/tag/type') type: require('jsdoc/tag/type')
} }
}; };
/** /**
Constructs a new tag object. Calls the tag validator. Constructs a new tag object. Calls the tag validator.
@class @class
@classdesc Represents a single doclet tag. @classdesc Represents a single doclet tag.
@ -29,7 +29,7 @@
@param {string=} tagBody @param {string=} tagBody
@param {object=} meta @param {object=} meta
*/ */
exports.Tag = function(tagTitle, tagBody, meta) { exports.Tag = function(tagTitle, tagBody, meta) {
var tagDef = jsdoc.tag.dictionary.lookUp(tagTitle), var tagDef = jsdoc.tag.dictionary.lookUp(tagTitle),
meta = meta || {}; meta = meta || {};
@ -92,9 +92,9 @@
} }
jsdoc.tag.validator.validate(this, meta); jsdoc.tag.validator.validate(this, meta);
} }
function trim(text, newlines) { function trim(text, newlines) {
if (!text) { return ''; } if (!text) { return ''; }
if (newlines) { if (newlines) {
@ -103,9 +103,9 @@
else { else {
return text.replace(/^\s+|\s+$/g, ''); return text.replace(/^\s+|\s+$/g, '');
} }
} }
/** /**
Parse the parameter name and parameter desc from the tag text. Parse the parameter name and parameter desc from the tag text.
@inner @inner
@method parseParamText @method parseParamText
@ -113,7 +113,7 @@
@param {string} tagText @param {string} tagText
@returns {Array.<string, string, boolean, boolean>} [pname, pdesc, poptional, pdefault]. @returns {Array.<string, string, boolean, boolean>} [pname, pdesc, poptional, pdefault].
*/ */
function parseParamText(tagText) { function parseParamText(tagText) {
var pname, pdesc, poptional, pdefault; var pname, pdesc, poptional, pdefault;
// like: pname, pname pdesc, or name - pdesc // like: pname, pname pdesc, or name - pdesc
@ -131,6 +131,4 @@
} }
} }
return [pname, pdesc, poptional, pdefault]; return [pname, pdesc, poptional, pdefault];
} }
})();

View File

@ -3,12 +3,12 @@
@author Michael Mathews <micmath@gmail.com> @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.
*/ */
(function() {
var _synonyms = {}, var _synonyms = {},
_definitions = {}, _definitions = {},
_namespaces = []; _namespaces = [];
function _TagDefinition(title, etc) { function _TagDefinition(title, etc) {
etc = etc || {}; etc = etc || {};
this.title = dictionary.normalise(title); this.title = dictionary.normalise(title);
@ -18,15 +18,15 @@
this[p] = etc[p]; this[p] = etc[p];
} }
} }
} }
_TagDefinition.prototype.synonym = function(synonymName) { _TagDefinition.prototype.synonym = function(synonymName) {
_synonyms[synonymName.toLowerCase()] = this.title; _synonyms[synonymName.toLowerCase()] = this.title;
return this; // chainable return this; // chainable
} }
/** @exports jsdoc/tag/dictionary */ /** @exports jsdoc/tag/dictionary */
var dictionary = { var dictionary = {
/** @function */ /** @function */
defineTag: function(title, opts) { defineTag: function(title, opts) {
_definitions[title] = new _TagDefinition(title, opts); _definitions[title] = new _TagDefinition(title, opts);
@ -64,10 +64,13 @@
return canonicalName; return canonicalName;
} }
}; };
require('jsdoc/tag/dictionary/definitions').defineTags(dictionary); require('jsdoc/tag/dictionary/definitions').defineTags(dictionary);
module.exports = dictionary; for (var prop in dictionary) {
if (dictionary.hasOwnProperty(prop)) {
exports[prop] = dictionary[prop];
}
}
})();

View File

@ -5,11 +5,11 @@
@author Michael Mathews <micmath@gmail.com> @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.
*/ */
(function() {
/** Populate the given dictionary with all known JSDoc tag definitions. /** Populate the given dictionary with all known JSDoc tag definitions.
@param {module:jsdoc/tag/dictionary} dictionary @param {module:jsdoc/tag/dictionary} dictionary
*/ */
exports.defineTags = function(dictionary) { exports.defineTags = function(dictionary) {
dictionary.defineTag('access', { dictionary.defineTag('access', {
mustHaveValue: true, mustHaveValue: true,
@ -506,48 +506,48 @@
doclet.version = tag.value; doclet.version = tag.value;
} }
}); });
} }
/** @private */ /** @private */
function setDocletKindToTitle(doclet, tag) { function setDocletKindToTitle(doclet, tag) {
doclet.addTag( 'kind', tag.title ); doclet.addTag( 'kind', tag.title );
} }
function setDocletScopeToTitle(doclet, tag) { function setDocletScopeToTitle(doclet, tag) {
doclet.addTag( 'scope', tag.title ); doclet.addTag( 'scope', tag.title );
} }
function setDocletNameToValue(doclet, tag) { function setDocletNameToValue(doclet, tag) {
if (tag.value && tag.value.description) { // as in a long tag if (tag.value && tag.value.description) { // as in a long tag
doclet.addTag( 'name', tag.value.description); doclet.addTag( 'name', tag.value.description);
} }
else if (tag.text) { // or a short tag else if (tag.text) { // or a short tag
doclet.addTag('name', tag.text); doclet.addTag('name', tag.text);
} }
} }
function setDocletDescriptionToValue(doclet, tag) { function setDocletDescriptionToValue(doclet, tag) {
if (tag.value) { if (tag.value) {
doclet.addTag( 'description', tag.value ); doclet.addTag( 'description', tag.value );
} }
} }
function setNameToFile(doclet, tag) { function setNameToFile(doclet, tag) {
if (doclet.meta.filename) { doclet.addTag( 'name', 'file:'+doclet.meta.filename ); } if (doclet.meta.filename) { doclet.addTag( 'name', 'file:'+doclet.meta.filename ); }
} }
function setDocletMemberof(doclet, tag) { function setDocletMemberof(doclet, tag) {
doclet.setMemberof(tag.value); doclet.setMemberof(tag.value);
} }
function applyNamespace(doclet, tag) { function applyNamespace(doclet, tag) {
if (!doclet.name) return; // error? if (!doclet.name) return; // error?
//doclet.displayname = doclet.name; //doclet.displayname = doclet.name;
doclet.longname = app.jsdoc.name.applyNamespace(doclet.name, tag.title) doclet.longname = app.jsdoc.name.applyNamespace(doclet.name, tag.title)
} }
function setDocletNameToFilename(doclet, tag) { function setDocletNameToFilename(doclet, tag) {
var name = doclet.meta.filename; var name = doclet.meta.filename;
name = name.replace(/\.js$/i, ''); name = name.replace(/\.js$/i, '');
@ -558,9 +558,9 @@
} }
} }
doclet.name = name; doclet.name = name;
} }
function parseBorrows(doclet, tag) { function parseBorrows(doclet, tag) {
var m = /^(\S+)(?:\s+as\s+(\S+))?$/.exec(tag.text); var m = /^(\S+)(?:\s+as\s+(\S+))?$/.exec(tag.text);
if (m) { if (m) {
if (m[1] && m[2]) { if (m[1] && m[2]) {
@ -570,11 +570,10 @@
return [ m[1] ]; return [ m[1] ];
} }
} }
} }
function firstWordOf(string) { function firstWordOf(string) {
var m = /^(\S+)/.exec(string); var m = /^(\S+)/.exec(string);
if (m) { return m[1]; } if (m) { return m[1]; }
else { return ''; } else { return ''; }
} }
})();

View File

@ -5,13 +5,12 @@
@license Apache License 2.0 - See file 'LICENSE.md' in this project. @license Apache License 2.0 - See file 'LICENSE.md' in this project.
*/ */
(function() {
/** /**
@param {string} tagValue @param {string} tagValue
@returns {Array.<string>} @returns {Array.<string>}
*/ */
exports.parse = function(tagValue) { exports.parse = function(tagValue) {
if (typeof tagValue !== 'string') { tagValue = ''; } if (typeof tagValue !== 'string') { tagValue = ''; }
var type = '', var type = '',
text = '', text = '',
@ -50,9 +49,9 @@
type = parseTypes(type); // make it into an array type = parseTypes(type); // make it into an array
return [type, text, optional, nullable, variable]; return [type, text, optional, nullable, variable];
} }
function parseOptional(type) { function parseOptional(type) {
var optional = null; var optional = null;
// {sometype=} means optional // {sometype=} means optional
@ -62,9 +61,9 @@
} }
return [type, optional]; return [type, optional];
} }
function parseNullable(type) { function parseNullable(type) {
var nullable = null; var nullable = null;
// {?sometype} means nullable, {!sometype} means not-nullable // {?sometype} means nullable, {!sometype} means not-nullable
@ -74,9 +73,9 @@
} }
return [type, nullable]; return [type, nullable];
} }
function parseVariable(type) { function parseVariable(type) {
var variable = null; var variable = null;
// {...sometype} means variable number of that type // {...sometype} means variable number of that type
@ -86,9 +85,9 @@
} }
return [type, variable]; return [type, variable];
} }
function parseTypes(type) { function parseTypes(type) {
var types = []; var types = [];
if ( ~type.indexOf('|') ) { if ( ~type.indexOf('|') ) {
@ -104,10 +103,9 @@
} }
return types; return types;
} }
/** @private */ /** @private */
function trim(text) { function trim(text) {
return text.replace(/^\s+|\s+$/g, ''); return text.replace(/^\s+|\s+$/g, '');
} }
})();

View File

@ -5,14 +5,14 @@
@author Michael Mathews <micmath@gmail.com> @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.
*/ */
(function() {
var dictionary = require('jsdoc/tag/dictionary');
/** var dictionary = require('jsdoc/tag/dictionary');
/**
Validate the given tag. Validate the given tag.
*/ */
exports.validate = function(tag, meta) { exports.validate = function(tag, meta) {
var tagDef = dictionary.lookUp(tag.title); var tagDef = dictionary.lookUp(tag.title);
if (!tagDef && !env.conf.tags.allowUnknownTags) { if (!tagDef && !env.conf.tags.allowUnknownTags) {
@ -29,24 +29,23 @@
throw new TagValueNotPermittedError(tag.title, meta); throw new TagValueNotPermittedError(tag.title, meta);
} }
} }
} }
function UnknownTagError(tagName, meta) { function UnknownTagError(tagName, meta) {
this.name = 'UnknownTagError'; this.name = 'UnknownTagError';
this.message = 'The @' + tagName + ' tag is not a known tag. File: ' + meta.filename + ', Line: ' + meta.lineno + '\n' + meta.comment; this.message = 'The @' + tagName + ' tag is not a known tag. File: ' + meta.filename + ', Line: ' + meta.lineno + '\n' + meta.comment;
} }
UnknownTagError.prototype = Error.prototype; UnknownTagError.prototype = Error.prototype;
function TagValueRequiredError(tagName, meta) { function TagValueRequiredError(tagName, meta) {
this.name = 'TagValueRequiredError'; this.name = 'TagValueRequiredError';
this.message = 'The @' + tagName + ' tag requires a value. File: ' + meta.filename + ', Line: ' + meta.lineno + '\n' + meta.comment; this.message = 'The @' + tagName + ' tag requires a value. File: ' + meta.filename + ', Line: ' + meta.lineno + '\n' + meta.comment;
} }
TagValueRequiredError.prototype = Error.prototype; TagValueRequiredError.prototype = Error.prototype;
function TagValueNotPermittedError(tagName, message, meta) { function TagValueNotPermittedError(tagName, message, meta) {
this.name = 'TagValueNotPermittedError'; this.name = 'TagValueNotPermittedError';
this.message = 'The @' + tagName + ' tag does not permit a value: "' + message + '". File: ' + meta.filename + ', Line: ' + meta.lineno + '\n' + meta.comment; this.message = 'The @' + tagName + ' tag does not permit a value: "' + message + '". File: ' + meta.filename + ', Line: ' + meta.lineno + '\n' + meta.comment;
} }
TagValueNotPermittedError.prototype = Error.prototype; TagValueNotPermittedError.prototype = Error.prototype;
})();

View File

@ -4,65 +4,65 @@
@author Michael Mathews <micmath@gmail.com> @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.
*/ */
(function() {
/** /**
@param {any} object @param {any} object
*/ */
exports.dump = function(object) { exports.dump = function(object) {
indentBy = 0; indentBy = 0;
output = ''; output = '';
walk(object); walk(object);
outdent(false); outdent(false);
return output; return output;
} }
const INDENTATION = ' '; // 4 spaces const INDENTATION = ' '; // 4 spaces
var indentBy, var indentBy,
output; output;
function pad(depth) { function pad(depth) {
var padding = ''; var padding = '';
while (depth--) { while (depth--) {
padding += INDENTATION; padding += INDENTATION;
} }
return padding; return padding;
} }
/** /**
@param {string} openingBrace - The opening brace to add, like "{". @param {string} openingBrace - The opening brace to add, like "{".
@private @private
@inner @inner
@memberof module:common/dumper @memberof module:common/dumper
*/ */
function indent(openingBrace) { function indent(openingBrace) {
indentBy++; indentBy++;
if (openingBrace) output += openingBrace + '\n'; if (openingBrace) output += openingBrace + '\n';
} }
/** /**
@param {string|boolean} closingBrace - The closing brace to add, like "}" or if boolean @param {string|boolean} closingBrace - The closing brace to add, like "}" or if boolean
`false` no closing brace or trailing newline. `false` no closing brace or trailing newline.
@private @private
@inner @inner
@memberof module:common/dumper @memberof module:common/dumper
*/ */
function outdent(closingBrace) { function outdent(closingBrace) {
indentBy--; indentBy--;
output = output.replace(/,\n$/, '\n'); // trim trailing comma output = output.replace(/,\n$/, '\n'); // trim trailing comma
if (closingBrace === false) { output = output.replace(/\n$/, ''); } if (closingBrace === false) { output = output.replace(/\n$/, ''); }
else if (closingBrace) output += pad(indentBy) + closingBrace + ',\n'; else if (closingBrace) output += pad(indentBy) + closingBrace + ',\n';
} }
var seen = []; var seen = [];
seen.has = function(object) { seen.has = function(object) {
for (var i = 0, l = seen.length; i < l; i++) { for (var i = 0, l = seen.length; i < l; i++) {
if (seen[i] === object) { return true; } if (seen[i] === object) { return true; }
} }
return false; return false;
} }
function walk(object) { function walk(object) {
var value; var value;
if ( value = getValue(object) ) { if ( value = getValue(object) ) {
@ -114,45 +114,44 @@
} }
outdent('}'); outdent('}');
} }
} }
function getValue(o) { // see: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/typeof function getValue(o) { // see: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/typeof
if (o === null) { return 'null'; } if (o === null) { return 'null'; }
if ( /^(string|boolean|number|undefined)$/.test(typeof o) ) { if ( /^(string|boolean|number|undefined)$/.test(typeof o) ) {
return ''+stringify(o); return ''+stringify(o);
} }
} }
function stringify(o) { function stringify(o) {
return JSON.stringify(o); return JSON.stringify(o);
} }
function isUnwalkable(o) { // some objects are unwalkable, like Java native objects function isUnwalkable(o) { // some objects are unwalkable, like Java native objects
return (typeof o === 'object' && typeof o.constructor === 'undefined'); return (typeof o === 'object' && typeof o.constructor === 'undefined');
} }
function isArray(o) { function isArray(o) {
return o && (o instanceof Array) || o.constructor === Array; return o && (o instanceof Array) || o.constructor === Array;
} }
function isRegExp(o) { function isRegExp(o) {
return (o instanceof RegExp) || return (o instanceof RegExp) ||
(typeof o.constructor !== 'undefined' && o.constructor.name === 'RegExp'); (typeof o.constructor !== 'undefined' && o.constructor.name === 'RegExp');
} }
function isDate(o) { function isDate(o) {
return o && (o instanceof Date) || return o && (o instanceof Date) ||
(typeof o.constructor !== 'undefined' && o.constructor.name === 'Date'); (typeof o.constructor !== 'undefined' && o.constructor.name === 'Date');
} }
function isFunction(o) { function isFunction(o) {
return o && (typeof o === 'function' || o instanceof Function);// || return o && (typeof o === 'function' || o instanceof Function);// ||
//(typeof o.constructor !== 'undefined' && (o.constructor||{}).name === 'Function'); //(typeof o.constructor !== 'undefined' && (o.constructor||{}).name === 'Function');
} }
function isObject(o) { function isObject(o) {
return o && o instanceof Object || return o && o instanceof Object ||
(typeof o.constructor !== 'undefined' && o.constructor.name === 'Object'); (typeof o.constructor !== 'undefined' && o.constructor.name === 'Object');
} }
})();

17
rhino_modules/path.js Normal file
View File

@ -0,0 +1,17 @@
exports.basename = function(path) {
var parts = path.split('/');
parts.pop();
path = parts.join('/');
return path;
};
exports.existsSync = function(path) {
var file = new java.io.File(path);
if (file.isFile()) {
return true;
}
return false;
};

View File

@ -1,18 +0,0 @@
module.exports = {
basename : function(path) {
var parts = path.split('/');
parts.pop();
path = parts.join('/');
return path;
},
existsSync: function(path) {
var file = new java.io.File(path);
if (file.isFile()) {
return true;
}
return false;
}
};

4
rhino_modules/sys.js Normal file
View File

@ -0,0 +1,4 @@
exports.puts = function(str) {
print(String(str));
};

View File

@ -1,6 +0,0 @@
module.exports = {
'puts' : function(str) {
print(String(str));
}
};