apidoc
Version:
RESTful web API Documentation Generator
144 lines (119 loc) • 3.9 kB
JavaScript
var _ = require('lodash');
var fs = require('fs');
var path = require('path');
var app = {};
function PackageInfo(_app) {
// global variables
app = _app;
}
/**
* Exports
*/
module.exports = PackageInfo;
/**
* 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',
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;
};
/**
* Read json data from source dir, or if it not exists from current dir.
* Return the data merged with the default values.
*
* @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);
}
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;
};
/**
* Get json.header / json.footer title and markdown content (from file)
*
* @param {Object} json
* @returns {Object}
*/
PackageInfo.prototype._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;
};
/**
* Resolve source path.
*
* If multiple input dirs are given, the current workdir './' will be returned.
* On one input dir, the current workdir will be the input dir.
*
* @returns {string}
* @private
*/
PackageInfo.prototype._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;
};