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;
}
...