diff --git a/doxy/node/docgen.js b/doxy/node/docgen.js index ecf190c4..305cec39 100644 --- a/doxy/node/docgen.js +++ b/doxy/node/docgen.js @@ -43,20 +43,17 @@ opts // use promise-style programming rather than spaghetti callbacks Promise.promisifyAll(fs); - - -// TODO: create directory structure if doesn't exist -var formats = opts.formats.split(','); -formats.forEach(function(format){ - mkdirp('jsdoc/' + format + '/' + opts.module); -}); +Promise.promisifyAll(mkdirp); // main xml2js.parse().then(function(specjs) { + var formats = opts.formats.split(','); Promise.all(_.map(formats, function(format) { var generateDocs = require(__dirname + '/generators/' + format + '/generator'); - var outFile = opts.outdir + '/' + format + '/' + specjs.MODULE + '/doc.js'; - return fs.writeFileAsync(outFile, generateDocs(specjs)); + var dir = opts.outdir + '/' + format + '/' + specjs.MODULE; + return mkdirp.mkdirpAsync(dir).then(function() { + return fs.writeFileAsync(dir + '/doc.js', generateDocs(specjs)); + }); })); }); diff --git a/doxy/node/generators/jsdoc/generator.js b/doxy/node/generators/jsdoc/generator.js index 81cce67a..6dd3d7dc 100644 --- a/doxy/node/generators/jsdoc/generator.js +++ b/doxy/node/generators/jsdoc/generator.js @@ -58,6 +58,7 @@ function GENERATE_MODULE(module) { // generate method spec with parent module/class function GENERATE_METHOD(name, spec, parent) { + name = name.replace(/!+$/, ''); return GENERATE_DOC(spec.description + '\n' + '@method ' + name + '\n' + '@instance\n' diff --git a/doxy/node/generators/ternjs/generator.js b/doxy/node/generators/ternjs/generator.js index 7bbc0a00..2378fe1f 100644 --- a/doxy/node/generators/ternjs/generator.js +++ b/doxy/node/generators/ternjs/generator.js @@ -28,44 +28,66 @@ var _ = require('lodash'); // generate json for ternjs input function generateDocs(specjs) { - var docs = GENERATE_MODULE(specjs.MODULE); GENERATE_TYPE = (function(enums) { return function(type) { return (_.contains(enums, type) ? ('Enum ' + type) : type); } })(_.keys(specjs.ENUMS_BY_GROUP)); + var docs = { '!name': specjs.MODULE + 'library' }; + _.extend(docs, GENERATE_MODULE(specjs.MODULE)); _.each(specjs.ENUMS, function(enumSpec, enumName) { _.extend(docs[specjs.MODULE], GENERATE_ENUM(enumName, enumSpec)); }); _.each(specjs.METHODS, function(methodSpec, methodName) { _.extend(docs[specjs.MODULE], GENERATE_METHOD(methodName, methodSpec)); }); - _.each(specjs.CLASSES, function(classSpec, parentClass) { - var constructor = classSpec.methods[parentClass]; - _.extend(docs[specjs.MODULE], GENERATE_METHOD(parentClass, constructor ? constructor : { params: {}, return: {}, description: '' } )); - _.each(classSpec.enums, function(enumSpec, enumName) { - _.extend(docs[specjs.MODULE][parentClass], GENERATE_ENUM(enumName, enumSpec)); + + if (_.isEmpty(specjs.CLASSGROUPS)) { + _.extend(docs[specjs.MODULE], GENERATE_CLASSES(specjs.CLASSES)); + } else { + var grouped = _.flatten(_.pluck(_.values(specjs.CLASSGROUPS), 'classes')); + var ungrouped = _.difference(_.keys(specjs.CLASSES), grouped); + _.extend(docs[specjs.MODULE], GENERATE_CLASSES(_.pick(specjs.CLASSES, ungrouped))); + _.each(specjs.CLASSGROUPS, function(groupSpec, groupName) { + _.extend(docs, GENERATE_MODULE(groupName)); + _.extend(docs[groupName], GENERATE_CLASSES(_.pick(specjs.CLASSES, groupSpec.classes), groupName)); }); - docs[specjs.MODULE][parentClass].prototype = {}; - _.each(_.omit(classSpec.methods, parentClass), function(methodSpec, methodName) { - _.extend(docs[specjs.MODULE][parentClass].prototype, GENERATE_METHOD(methodName, methodSpec)); - }); - _.each(classSpec.variables, function(variableSpec, variableName) { - _.extend(docs[specjs.MODULE][parentClass].prototype, GENERATE_VARIABLE(variableName, variableSpec)); - }); - }); + } return JSON.stringify(docs, null, 2); } // generate module spec function GENERATE_MODULE(module) { - var docs = { '!name': module + 'library' }; + var docs = {}; docs[module] = {}; return docs; } +// generate the spec for the given list of classes +function GENERATE_CLASSES(classes) { + var docs = {}; + _.each(classes, function(classSpec, parentClass) { + var constructor = classSpec.methods[parentClass]; + _.extend(docs, GENERATE_METHOD(parentClass, constructor ? constructor : { params: {}, return: {}, description: '' } )); + if (_.has(docs, parentClass)) { + _.each(classSpec.enums, function(enumSpec, enumName) { + _.extend(docs[parentClass], GENERATE_ENUM(enumName, enumSpec)); + }); + docs[parentClass].prototype = {}; + _.each(_.omit(classSpec.methods, parentClass), function(methodSpec, methodName) { + _.extend(docs[parentClass].prototype, GENERATE_METHOD(methodName, methodSpec)); + }); + _.each(classSpec.variables, function(variableSpec, variableName) { + _.extend(docs[parentClass].prototype, GENERATE_VARIABLE(variableName, variableSpec)); + }); + } + }); + return docs; +} + + // generate method spec function GENERATE_METHOD(name, spec) { var doc = {}; diff --git a/doxy/node/generators/yuidoc/generator.js b/doxy/node/generators/yuidoc/generator.js index 94c45ea6..fb5fe2ab 100644 --- a/doxy/node/generators/yuidoc/generator.js +++ b/doxy/node/generators/yuidoc/generator.js @@ -46,7 +46,7 @@ function generateDocs(specjs) { docs += GENERATE_MODULE('common', ''); var grouped = _.flatten(_.pluck(_.values(specjs.CLASSGROUPS), 'classes')); var ungrouped = _.difference(_.keys(specjs.CLASSES), grouped); - docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, ungrouped), 'common'); + docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, ungrouped), 'common'); _.each(specjs.CLASSGROUPS, function(groupSpec, groupName) { docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, groupSpec.classes), groupName); }); @@ -76,7 +76,7 @@ function GENERATE_MODULE(name, description) { function GENERATE_CLASSES(classes, parent) { return _.reduce(classes, function(memo, classSpec, className) { return memo - + GENERATE_CLASS(className, classSpec.description, parent) + + GENERATE_CLASS(className, classSpec.description, parent, classSpec.parent) + _.reduce(classSpec.methods, function(memo, methodSpec, methodName) { return memo += GENERATE_METHOD(methodName, methodSpec, className); }, '') @@ -91,15 +91,21 @@ function GENERATE_CLASSES(classes, parent) { // generate class spec -function GENERATE_CLASS(name, description, parent) { +function GENERATE_CLASS(name, description, namespace, parent) { return GENERATE_DOC(description + '\n' + '@class ' + name + '\n' - + (parent ? ('@module ' + parent + '\n') : '')); + + (namespace ? ('@module ' + namespace + '\n') : '') + /* + TODO: leave out until figure out what swig does with inheritance + + (parent ? ('@extends ' + parent + '\n') : '') + */ + ); } // generate method spec with parent module/class function GENERATE_METHOD(name, spec, parent) { + name = name.replace(/!+$/, ''); return GENERATE_DOC(spec.description + '\n' + '@method ' + name + '\n' + (parent ? ('@for ' + parent + '\n') : '@for common\n') diff --git a/doxy/node/generators/yuidoc/helper.js b/doxy/node/generators/yuidoc/helper.js index 504e3767..d65bf582 100644 --- a/doxy/node/generators/yuidoc/helper.js +++ b/doxy/node/generators/yuidoc/helper.js @@ -77,17 +77,15 @@ function listByGroup(modules, classes, field, projectRoot) { var groups = Object.keys(modulesByGroup).sort(); var html = ''; var pfx = projectRoot + 'modules/'; - var first = true; for (i = 0; i < groups.length; i++) { var group = groups[i]; - html += (first ? '' : ''); html += '