function createDoc(options) { var api; var apidocPath = path.join(__dirname, '../'); var markdownParser; var packageInfo; options = _.defaults({}, options, defaults); // Paths. options.dest = path.join(options.dest, './'); options.template = path.join(options.template, './'); // Line-Ending. if (options.lineEnding) { if (options.lineEnding === 'CRLF') options.lineEnding = '\r\n'; // win32 else if (options.lineEnding === 'CR') options.lineEnding = '\r'; // darwin else options.lineEnding = '\n'; // linux } // Options. app.options = options; // Logger. app.log = new (winston.Logger)({ transports: [ new (winston.transports.Console)({ level : app.options.debug ? 'debug' : app.options.verbose ? 'verbose' : 'info', silent : app.options.silent, prettyPrint: true, colorize : app.options.colorize, timestamp : false }), ] }); // Markdown Parser: enable / disable / use a custom parser. if(app.options.markdown === true) { markdownParser = new Markdown({ breaks : false, html : true, linkify : false, typographer: false }); } else if(app.options.markdown !== false) { // Include custom Parser @see MARKDOWN.md and test/fixtures/custom_markdown_parser.js Markdown = require(app.options.markdown); // Overwrite default Markdown. markdownParser = new Markdown(); } app.markdownParser = markdownParser; try { packageInfo = new PackageInfo(app); // generator information var json = JSON.parse( fs.readFileSync(apidocPath + 'package.json', 'utf8') ); apidoc.setGeneratorInfos({ name : json.name, time : new Date(), url : json.homepage, version: json.version }); apidoc.setLogger(app.log); apidoc.setMarkdownParser(markdownParser); apidoc.setPackageInfos(packageInfo.get()); api = apidoc.parse(app.options); if (api === true) { app.log.info('Nothing to do.'); return true; } if (api === false) return false; if (app.options.parse !== true) createOutputFiles(api); app.log.info('Done.'); return api; } catch(e) { app.log.error(e.message); if (e.stack) app.log.debug(e.stack); return false; } }
...
silent : argv['silent'],
simulate : argv['simulate'],
markdown : argv['markdown'],
lineEnding : argv['line-ending'],
encoding : argv['encoding'],
};
if (apidoc.createDoc(options) === false) {
process.exit(1);
}
...
function PackageInfo(_app) { // global variables app = _app; }
n/a
function PackageInfo(_app) { // global variables app = _app; }
n/a
_getHeaderFooter = function (json) { var result = {}; var self = this; ['header', 'footer'].forEach(function(key) { if (json[key] && json[key].filename) { // var filename = path.join(app.options.src, json[key].filename); var dir = self._resolveSrcPath(); var filename = path.join(dir, json[key].filename); if ( ! fs.existsSync(filename)) filename = path.join('./', json[key].filename); try { app.log.debug('read header file: ' + filename); var content = fs.readFileSync(filename, 'utf8'); result[key] = { title : json[key].title, content: app.markdownParser ? app.markdownParser.render(content) : content }; } catch (e) { throw new Error('Can not read: ' + filename + '.'); } } }); return result; }
...
// apidoc.json has higher priority
_.extend(result, apidocJson);
// options.packageInfo overwrites packageInfo
_.extend(result, app.options.packageInfo);
// replace header footer with file contents
_.extend(result, this._getHeaderFooter(result));
if (Object.keys(apidocJson).length === 0 && ! packageJson.apidoc)
app.log.warn('Please create an apidoc.json configuration file.');
return result;
};
...
_readPackageData = function (filename) { var result = {}; var dir = this._resolveSrcPath(); var jsonFilename = path.join(dir, filename); // Read from source dir if ( ! fs.existsSync(jsonFilename)) { // Read from config dir (default './') jsonFilename = path.join(app.options.config, filename); } if ( ! fs.existsSync(jsonFilename)) { app.log.debug(jsonFilename + ' not found!'); } else { try { result = JSON.parse( fs.readFileSync(jsonFilename, 'utf8') ); app.log.debug('read: ' + jsonFilename); } catch (e) { throw new Error('Can not read: ' + filename + ', please check the format (e.g. missing comma).'); } } return result; }
...
/**
* Read apidoc.json / package.json data
*/
PackageInfo.prototype.get = function() {
var result = {};
// Read package.json
var packageJson = this._readPackageData('package.json');
if (packageJson.apidoc)
result = packageJson.apidoc;
result = _.defaults({}, result, {
name : packageJson.name || '',
version : packageJson.version || '0.0.0',
...
_resolveSrcPath = function () { var dir = './'; if (app.options.src instanceof Array) { if (app.options.src.length === 1) { dir = app.options.src[0]; } } else { if (app.options.src) { dir = app.options.src; } } return dir; }
...
*
* @param {String} filename
* @param {Object} defaults
* @returns {Object}
*/
PackageInfo.prototype._readPackageData = function(filename) {
var result = {};
var dir = this._resolveSrcPath();
var jsonFilename = path.join(dir, filename);
// Read from source dir
if ( ! fs.existsSync(jsonFilename)) {
// Read from config dir (default './')
jsonFilename = path.join(app.options.config, filename);
}
...
get = function () { var result = {}; // Read package.json var packageJson = this._readPackageData('package.json'); if (packageJson.apidoc) result = packageJson.apidoc; result = _.defaults({}, result, { name : packageJson.name || '', version : packageJson.version || '0.0.0', description: packageJson.description || '', }); // read apidoc.json (and overwrite package.json information) var apidocJson = this._readPackageData('apidoc.json'); // apidoc.json has higher priority _.extend(result, apidocJson); // options.packageInfo overwrites packageInfo _.extend(result, app.options.packageInfo); // replace header footer with file contents _.extend(result, this._getHeaderFooter(result)); if (Object.keys(apidocJson).length === 0 && ! packageJson.apidoc) app.log.warn('Please create an apidoc.json configuration file.'); return result; }
...
name : json.name,
time : new Date(),
url : json.homepage,
version: json.version
});
apidoc.setLogger(app.log);
apidoc.setMarkdownParser(markdownParser);
apidoc.setPackageInfos(packageInfo.get());
api = apidoc.parse(app.options);
if (api === true) {
app.log.info('Nothing to do.');
return true;
}
...