Comparing version 0.6.5 to 0.7.0
# apiDoc Changelog | ||
#### 0.7.0 | ||
Add rudimentary support for direct api calls from within the doc. | ||
Add configuration var `sampleUrl` parameter for `apidoc.json` (for the api calls). | ||
Added ability to have forward slash (/) in parameter field names. | ||
Add parameter `--parse` for parse only the files and return the parsed data. | ||
Allow perl comments between "=pod" and "=cut". | ||
#### 0.6.5 | ||
@@ -4,0 +18,0 @@ |
@@ -5,2 +5,11 @@ # apiDoc Contributors | ||
* [Brian Horakh](https://github.com/brianhorakh) | ||
* Perl - allow =pod and =cut ([#103] (https://github.com/apidoc/apidoc/issues/103)) | ||
* [Brian Horakh](https://github.com/brianhorakh) | ||
* Added ability to have forward slash (/) in parameter field names ([#101] (https://github.com/apidoc/apidoc/pull/101)) | ||
* [PaulDapolito](https://github.com/PaulDapolito) | ||
* Sample Requests feature ([#98] (https://github.com/apidoc/apidoc/pull/98)) | ||
* [Paul Dapolito](https://github.com/PaulDapolito) | ||
@@ -7,0 +16,0 @@ * Fixed bug where dropdown opens off of page ([#85] (https://github.com/apidoc/apidoc/pull/85)) |
@@ -7,2 +7,3 @@ { | ||
"url" : "https://api.github.com/v1", | ||
"sampleUrl": "https://api.github.com/v1", | ||
"header": { | ||
@@ -9,0 +10,0 @@ "title": "My own header title", |
@@ -10,3 +10,3 @@ /** | ||
* | ||
* @apiParam {String} id The Users-ID. | ||
* @apiParam {Number} id The Users-ID. | ||
* | ||
@@ -16,3 +16,3 @@ * @apiExample Example usage: | ||
* | ||
* @apiSuccess {String} id The Users-ID. | ||
* @apiSuccess {Number} id The Users-ID. | ||
* @apiSuccess {Date} registered Registration Date. | ||
@@ -51,3 +51,3 @@ * @apiSuccess {Date} name Fullname of the User. | ||
* | ||
* @apiSuccess {String} id The new Users-ID. | ||
* @apiSuccess {Number} id The new Users-ID. | ||
* | ||
@@ -59,3 +59,3 @@ * @apiErrorStructure CreateUserError | ||
/** | ||
* @api {put} /user/:id Change a new User | ||
* @api {put} /user/:id Change a User | ||
* @apiVersion 0.3.0 | ||
@@ -62,0 +62,0 @@ * @apiName PutUser |
var _ = require("underscore"); | ||
var path = require("path"); | ||
var semver = require("semver"); | ||
var findFiles = require("./utils/find_files"); | ||
var PackageInfo = require("./package_info"); | ||
@@ -14,27 +13,28 @@ var Parser = require("./parser"); | ||
var _defaultOptions = { | ||
excludeFilters: [], | ||
includeFilters: [ ".*\\.(coffee|cs|dart|erl|go|java|js|php?|py|rb|ts|pm)$" ], | ||
src: path.join(__dirname, "../example/"), | ||
dest: path.join(__dirname, "../doc/"), | ||
debug: false, | ||
log: true, | ||
simulate: false, | ||
template: path.join(__dirname, "../template/"), | ||
filters: {}, | ||
parsers: {}, | ||
workers: {}, | ||
marked: { | ||
gfm: true, | ||
tables: true, | ||
breaks: false, | ||
pedantic: false, | ||
sanitize: false, | ||
smartLists: false, | ||
smartypants: false | ||
} | ||
excludeFilters: [], | ||
includeFilters: [ ".*\\.(coffee|cs|dart|erl|go|java|js|php?|py|rb|ts|pm)$" ], | ||
src: path.join(__dirname, "../example/"), | ||
dest: path.join(__dirname, "../doc/"), | ||
debug: false, | ||
log: true, | ||
simulate: false, | ||
parse: false, // only parse and return the data, no file creation | ||
template: path.join(__dirname, "../template/"), | ||
filters: {}, | ||
parsers: {}, | ||
workers: {}, | ||
marked: { | ||
gfm: true, | ||
tables: true, | ||
breaks: false, | ||
pedantic: false, | ||
sanitize: false, | ||
smartLists: false, | ||
smartypants: false | ||
} | ||
}; | ||
@@ -47,5 +47,5 @@ | ||
process.on("uncaughtException", function(err) { | ||
console.error((new Date()).toUTCString() + " uncaughtException:", err.message); | ||
console.error(err.stack); | ||
process.exit(1); | ||
console.error((new Date()).toUTCString() + " uncaughtException:", err.message); | ||
console.error(err.stack); | ||
process.exit(1); | ||
}); | ||
@@ -60,3 +60,3 @@ | ||
{ | ||
if(options.debug) console.log("apidoc: " + message); | ||
if (options.debug) console.log("apidoc: " + message); | ||
} // debug | ||
@@ -71,3 +71,3 @@ | ||
{ | ||
if(options.log) console.log("apidoc: " + message); | ||
if (options.log) console.log("apidoc: " + message); | ||
} // log | ||
@@ -82,63 +82,134 @@ | ||
{ | ||
if(options.log) console.warn("apidoc: " + message.yellow); | ||
if (options.log) console.warn("apidoc: " + message.yellow); | ||
} // logWarn | ||
var app = { | ||
debug: debug, | ||
log: log, | ||
logWarn: logWarn, | ||
options: options, | ||
filters: { | ||
apierror : "./filters/api_error.js", | ||
apiinfo : "./filters/api_info.js", | ||
apiparam : "./filters/api_param.js", | ||
apisuccess : "./filters/api_success.js" | ||
}, | ||
parsers: { | ||
api : "./parsers/api.js", | ||
apidefineerrorstructure : "./parsers/api_define_error_structure.js", | ||
apidefineheaderstructure : "./parsers/api_define_header_structure.js", | ||
apidefinepermission : "./parsers/api_define_permission.js", | ||
apidefinestructure : "./parsers/api_define_structure.js", | ||
apidefinesuccessstructure: "./parsers/api_define_success_structure.js", | ||
apigroupdescription : "./parsers/api_group_description.js", | ||
apidescription : "./parsers/api_description.js", | ||
apierror : "./parsers/api_error.js", | ||
apierrorexample : "./parsers/api_error_example.js", | ||
apierrorstructure : "./parsers/api_error_structure.js", | ||
apierrortitle : "./parsers/api_error_title.js", | ||
apiexample : "./parsers/api_example.js", | ||
apiheader : "./parsers/api_header.js", | ||
apiheaderexample : "./parsers/api_header_example.js", | ||
apiheaderstructure : "./parsers/api_header_structure.js", | ||
apiheadertitle : "./parsers/api_header_title.js", | ||
apigroup : "./parsers/api_group.js", | ||
apiinfo : "./parsers/api_info.js", | ||
apiinfoexample : "./parsers/api_info_example.js", | ||
apiinfotitle : "./parsers/api_info_title.js", | ||
apiname : "./parsers/api_name.js", | ||
apiparam : "./parsers/api_param.js", | ||
apiparamtitle : "./parsers/api_param_title.js", | ||
apipermission : "./parsers/api_permission.js", | ||
apistructure : "./parsers/api_structure.js", | ||
apisuccess : "./parsers/api_success.js", | ||
apisuccessexample : "./parsers/api_success_example.js", | ||
apisuccessstructure : "./parsers/api_success_structure.js", | ||
apisuccesstitle : "./parsers/api_success_title.js", | ||
apiversion : "./parsers/api_version.js" | ||
}, | ||
workers: { | ||
workererrorstructure : "./workers/error_structure.js", | ||
workererrortitle : "./workers/error_title.js", | ||
workerheaderstructure : "./workers/header_structure.js", | ||
workerheadertitle : "./workers/header_title.js", | ||
workerparamtitle : "./workers/param_title.js", | ||
workerpermission : "./workers/permission.js", | ||
workerstructure : "./workers/structure.js", | ||
workersuccessstructure : "./workers/success_structure.js", | ||
workersuccesstitle : "./workers/success_title.js" | ||
} | ||
debug: debug, | ||
log: log, | ||
logWarn: logWarn, | ||
options: options, | ||
filters: { | ||
apierror : "./filters/api_error.js", | ||
apiinfo : "./filters/api_info.js", | ||
apiparam : "./filters/api_param.js", | ||
apisuccess : "./filters/api_success.js" | ||
}, | ||
parsers: { | ||
api : "./parsers/api.js", | ||
apidefineerrorstructure : "./parsers/api_define_error_structure.js", | ||
apidefineheaderstructure : "./parsers/api_define_header_structure.js", | ||
apidefinepermission : "./parsers/api_define_permission.js", | ||
apidefinestructure : "./parsers/api_define_structure.js", | ||
apidefinesuccessstructure: "./parsers/api_define_success_structure.js", | ||
apigroupdescription : "./parsers/api_group_description.js", | ||
apidescription : "./parsers/api_description.js", | ||
apierror : "./parsers/api_error.js", | ||
apierrorexample : "./parsers/api_error_example.js", | ||
apierrorstructure : "./parsers/api_error_structure.js", | ||
apierrortitle : "./parsers/api_error_title.js", | ||
apiexample : "./parsers/api_example.js", | ||
apiheader : "./parsers/api_header.js", | ||
apiheaderexample : "./parsers/api_header_example.js", | ||
apiheaderstructure : "./parsers/api_header_structure.js", | ||
apiheadertitle : "./parsers/api_header_title.js", | ||
apigroup : "./parsers/api_group.js", | ||
apiinfo : "./parsers/api_info.js", | ||
apiinfoexample : "./parsers/api_info_example.js", | ||
apiinfotitle : "./parsers/api_info_title.js", | ||
apiname : "./parsers/api_name.js", | ||
apiparam : "./parsers/api_param.js", | ||
apiparamtitle : "./parsers/api_param_title.js", | ||
apipermission : "./parsers/api_permission.js", | ||
apistructure : "./parsers/api_structure.js", | ||
apisuccess : "./parsers/api_success.js", | ||
apisuccessexample : "./parsers/api_success_example.js", | ||
apisuccessstructure : "./parsers/api_success_structure.js", | ||
apisuccesstitle : "./parsers/api_success_title.js", | ||
apiversion : "./parsers/api_version.js", | ||
apisamplerequest : "./parsers/api_sample_request.js" | ||
}, | ||
workers: { | ||
apierrorstructure : "./workers/api_error_structure.js", | ||
apierrortitle : "./workers/api_error_title.js", | ||
apiheaderstructure : "./workers/api_header_structure.js", | ||
apiheadertitle : "./workers/api_header_title.js", | ||
apiparamtitle : "./workers/api_param_title.js", | ||
apipermission : "./workers/api_permission.js", | ||
apisamplerequest : "./workers/api_sample_request.js", | ||
apistructure : "./workers/api_structure.js", | ||
apisuccessstructure : "./workers/api_success_structure.js", | ||
apisuccesstitle : "./workers/api_success_title.js" | ||
} | ||
}; // app | ||
/** | ||
* Parser | ||
* | ||
* @param {Object} defaults Overwrite default options. | ||
* @return {Mixed} False on error | 0 = nothing todo | 1 = everything ok | List of Parsed files (if parse is set). | ||
*/ | ||
function parse(defaults) | ||
{ | ||
// bin-parameters | ||
if (defaults) options = _.defaults(defaults, options); | ||
// Paths | ||
options.dest = path.join(options.dest, "./"); | ||
options.template = path.join(options.template, "./"); | ||
// Funktionen erweitern / ersetzen | ||
_.defaults(options.logger, app.logger); | ||
_.defaults(options.filters, app.filters); | ||
_.defaults(options.parsers, app.parsers); | ||
_.defaults(options.workers, app.workers); | ||
// Options | ||
app.options = options; | ||
var packageInfo = new PackageInfo(app); | ||
var parser = new Parser(app); | ||
var parsedFiles = []; | ||
var parsedFilenames = []; | ||
var worker = new Worker(app); | ||
var filter = new Filter(app); | ||
try { | ||
// If input option for source is an array of folders, | ||
// parse each folder in the order provided. | ||
if (options.src instanceof Array) { | ||
options.src.forEach(function(folder) { | ||
// Keep same options for each folder, but ensure the "src" of options | ||
// is the folder currently being processed. | ||
var folderOptions = options; | ||
folderOptions.src = path.join(folder, "./"); | ||
parser.parseFiles(folderOptions, parsedFiles, parsedFilenames); | ||
}); | ||
} | ||
else { | ||
// If the input option for source is a single folder, parse as usual. | ||
options.src = path.join(options.src, "./"); | ||
parser.parseFiles(options, parsedFiles, parsedFilenames); | ||
} | ||
// Worker / Filter | ||
if (parsedFiles.length > 0) { | ||
var packageInfos = packageInfo.get(); | ||
worker.process(parsedFiles, parsedFilenames, packageInfos); | ||
filter.process(parsedFiles, parsedFilenames); | ||
return createOutputFiles(parsedFiles, parsedFilenames, packageInfos); | ||
} else { | ||
app.log("Nothing to do."); | ||
return 0; | ||
} | ||
} catch(e) { | ||
if (e.stack) app.debug(e.stack); | ||
app.log(e); | ||
} | ||
return; | ||
} // parse | ||
/** | ||
* Output parsed content to files | ||
@@ -152,191 +223,97 @@ * | ||
{ | ||
var blocks = []; | ||
// Reduce to get only local blocks. | ||
for(var fileIndex = 0; fileIndex < parsedFiles.length; fileIndex += 1) | ||
{ | ||
var parsedFile = parsedFiles[fileIndex]; | ||
for(var blockIndex = 0; blockIndex < parsedFile.length; blockIndex += 1) | ||
{ | ||
var block = parsedFile[blockIndex]; | ||
// "<= 1" if successTitle gets removed, empty Object remain. | ||
if(Object.keys(block.global).length <= 1 && Object.keys(block.local).length > 0) | ||
{ | ||
// Add needed Elements for sorting | ||
if( ! block.local.group) { | ||
block.local.group = path.basename( parsedFilenames[fileIndex] ); | ||
// Replace special chars | ||
// TODO: check & escape all other fields -> in template? | ||
block.local.group = block.local.group.replace(/[.]/g, "_"); | ||
} | ||
if( ! block.local.type) block.local.type = ""; | ||
if( ! block.local.url) block.local.url = ""; | ||
if( ! block.local.version) block.local.version = "0.0.0"; | ||
// Info Element | ||
if( ! block.local.filename) block.local.filename = parsedFilenames[fileIndex]; | ||
// Convert dir delimeter \\ to / | ||
block.local.filename = block.local.filename.replace(/\\/g, "/"); | ||
blocks.push(block.local); | ||
} | ||
} // for blockIndex | ||
} // for fileIndex | ||
// Empty | ||
parsedFiles = null; | ||
parsedFilenames = null; | ||
// Sort by group ASC, name ASC, version DESC | ||
blocks.sort(function(a, b) { | ||
var nameA = a.group + a.name; | ||
var nameB = b.group + b.name; | ||
if(nameA === nameB) | ||
{ | ||
if(a.version === b.version) return 0; | ||
return (semver.gte(a.version, b.version)) ? -1 : 1; | ||
} | ||
return (nameA < nameB) ? -1 : 1; | ||
}); | ||
if(options.simulate) | ||
{ | ||
app.debug(""); | ||
app.debug("!!! Simulation !!! No file or dir will be copied or created."); | ||
app.debug(""); | ||
} | ||
app.debug("create dir: " + options.dest); | ||
if( ! options.simulate) fs.mkdirsSync(options.dest); | ||
app.debug("copy template " + options.template + " to: " + options.dest); | ||
if( ! options.simulate) fs.copySync(options.template, options.dest); | ||
// api_data | ||
var json = JSON.stringify(blocks, null, 2); | ||
json = json.replace(/(\r\n|\n|\r)/g, "\r\n"); | ||
app.debug("write json file: " + options.dest + "api_data.json"); | ||
if( ! options.simulate) fs.writeFileSync(options.dest + "./api_data.json", json); | ||
app.debug("write js file: " + options.dest + "api_data.js"); | ||
if( ! options.simulate) fs.writeFileSync(options.dest + "./api_data.js", "define({ api: " + json + " });"); | ||
// api_project | ||
var json = JSON.stringify(packageInfos, null, 2); | ||
json = json.replace(/(\r\n|\n|\r)/g, "\r\n"); | ||
app.debug("write json file: " + options.dest + "api_project.json"); | ||
if( ! options.simulate) fs.writeFileSync(options.dest + "./api_project.json", json); | ||
app.debug("write js file: " + options.dest + "api_project.js"); | ||
if( ! options.simulate) fs.writeFileSync(options.dest + "./api_project.js", "define(" + json + ");"); | ||
// TODO the following logic should be placed in parser | ||
var blocks = []; | ||
// Reduce to get only local blocks. | ||
for (var fileIndex = 0; fileIndex < parsedFiles.length; fileIndex += 1) { | ||
var parsedFile = parsedFiles[fileIndex]; | ||
for (var blockIndex = 0; blockIndex < parsedFile.length; blockIndex += 1) { | ||
var block = parsedFile[blockIndex]; | ||
// "<= 1" if successTitle gets removed, empty Object remain. | ||
if (Object.keys(block.global).length <= 1 && Object.keys(block.local).length > 0) { | ||
// Add needed Elements for sorting | ||
if ( ! block.local.group) { | ||
block.local.group = path.basename( parsedFilenames[fileIndex] ); | ||
// Replace special chars | ||
// TODO: check & escape all other fields -> in template? | ||
block.local.group = block.local.group.replace(/[.]/g, "_"); | ||
} | ||
if ( ! block.local.type) block.local.type = ""; | ||
if ( ! block.local.url) block.local.url = ""; | ||
if ( ! block.local.version) block.local.version = "0.0.0"; | ||
// Info Element | ||
if ( ! block.local.filename) block.local.filename = parsedFilenames[fileIndex]; | ||
// Convert dir delimeter \\ to / | ||
block.local.filename = block.local.filename.replace(/\\/g, "/"); | ||
blocks.push(block.local); | ||
} | ||
} // for blockIndex | ||
} // for fileIndex | ||
// Empty | ||
parsedFiles = null; | ||
parsedFilenames = null; | ||
// Sort by group ASC, name ASC, version DESC | ||
blocks.sort(function(a, b) { | ||
var nameA = a.group + a.name; | ||
var nameB = b.group + b.name; | ||
if (nameA === nameB) { | ||
if (a.version === b.version) return 0; | ||
return (semver.gte(a.version, b.version)) ? -1 : 1; | ||
} | ||
return (nameA < nameB) ? -1 : 1; | ||
}); | ||
if (options.simulate) { | ||
app.debug(""); | ||
app.debug("!!! Simulation !!! No file or dir will be copied or created."); | ||
app.debug(""); | ||
} | ||
// api_data | ||
var apiData = JSON.stringify(blocks, null, 2); | ||
apiData = apiData.replace(/(\r\n|\n|\r)/g, "\r\n"); | ||
var apiProject = JSON.stringify(packageInfos, null, 2); | ||
apiProject = apiProject.replace(/(\r\n|\n|\r)/g, "\r\n"); | ||
if (options.parse === true) { | ||
return { | ||
apiData: apiData, | ||
apiProject: apiProject | ||
}; | ||
} else { | ||
app.debug("create dir: " + options.dest); | ||
if ( ! options.simulate) fs.mkdirsSync(options.dest); | ||
app.debug("copy template " + options.template + " to: " + options.dest); | ||
if ( ! options.simulate) fs.copySync(options.template, options.dest); | ||
// Write api_data | ||
app.debug("write json file: " + options.dest + "api_data.json"); | ||
if( ! options.simulate) fs.writeFileSync(options.dest + "./api_data.json", apiData); | ||
app.debug("write js file: " + options.dest + "api_data.js"); | ||
if( ! options.simulate) fs.writeFileSync(options.dest + "./api_data.js", "define({ api: " + apiData + " });"); | ||
// Write api_project | ||
app.debug("write json file: " + options.dest + "api_project.json"); | ||
if( ! options.simulate) fs.writeFileSync(options.dest + "./api_project.json", apiProject); | ||
app.debug("write js file: " + options.dest + "api_project.js"); | ||
if( ! options.simulate) fs.writeFileSync(options.dest + "./api_project.js", "define(" + apiProject + ");"); | ||
} | ||
return true; | ||
} // createOutputFiles | ||
/** | ||
* Parse files in specified folder. | ||
* @param {Object} parser Util to parse the files. | ||
* @param {Object} options The options used to parse and filder the files. | ||
* @param {Object[]} parsedFiles List of parsed files. | ||
* @param {String[]} parsedFilenames List of parsed files, with full path. | ||
*/ | ||
function parseFiles(parser, options, parsedFiles, parsedFilenames) | ||
{ | ||
var files = findFiles(options); | ||
// Parser | ||
for(var i = 0; i < files.length; i += 1) | ||
{ | ||
var filename = options.src + files[i]; | ||
var parsedFile = parser.parseFile(filename); | ||
if(parsedFile) | ||
{ | ||
app.log("parse file: " + filename); | ||
parsedFiles.push(parsedFile); | ||
parsedFilenames.push(filename); | ||
} | ||
} // for | ||
} // parseFiles | ||
/** | ||
* Main | ||
* | ||
* @return {Number} Count parsed files. | ||
*/ | ||
function main(defaults) | ||
{ | ||
// bin-parameters | ||
if(defaults) options = _.defaults(defaults, options); | ||
// Paths | ||
options.dest = path.join(options.dest, "./"); | ||
options.template = path.join(options.template, "./"); | ||
// Funktionen erweitern / ersetzen | ||
_.defaults(options.logger, app.logger); | ||
_.defaults(options.filters, app.filters); | ||
_.defaults(options.parsers, app.parsers); | ||
_.defaults(options.workers, app.workers); | ||
// Options | ||
app.options = options; | ||
var packageInfo = new PackageInfo(app); | ||
var parser = new Parser(app); | ||
var parsedFiles = []; | ||
var parsedFilenames = []; | ||
var worker = new Worker(app); | ||
var filter = new Filter(app); | ||
try | ||
{ | ||
// If input option for source is an array of folders, | ||
// parse each folder in the order provided. | ||
if (options.src instanceof Array) | ||
{ | ||
options.src.forEach(function(folder) | ||
{ | ||
// Keep same options for each folder, but ensure the "src" of options | ||
// is the folder currently being processed. | ||
var folderOptions = options; | ||
folderOptions.src = path.join(folder, "./"); | ||
parseFiles(parser, folderOptions, parsedFiles, parsedFilenames); | ||
}); | ||
} | ||
else | ||
{ | ||
// If the input option for source is a single folder, parse as usual. | ||
options.src = path.join(options.src, "./"); | ||
parseFiles(parser, options, parsedFiles, parsedFilenames); | ||
} | ||
// Worker / Filter | ||
if(parsedFiles.length > 0) | ||
{ | ||
worker.process(parsedFiles, parsedFilenames); | ||
filter.process(parsedFiles, parsedFilenames); | ||
createOutputFiles(parsedFiles, parsedFilenames, packageInfo.get()); | ||
return parsedFiles.length; | ||
} | ||
else | ||
{ | ||
app.log("Nothing to do."); | ||
return 0; | ||
} | ||
} | ||
catch(e) | ||
{ | ||
if(e.stack) app.debug(e.stack); | ||
app.log(e); | ||
} | ||
return; | ||
} // main | ||
/** | ||
* Exports | ||
*/ | ||
module.exports = main; | ||
module.exports = parse; | ||
// Direct call | ||
if(path.dirname(process.argv[1]) === __dirname) main(); | ||
if(path.dirname(process.argv[1]) === __dirname) parse(); |
@@ -130,3 +130,5 @@ var fs = require("fs"); | ||
packageInfo.url = json.url; | ||
packageInfo.sampleUrl = json.sampleUrl; | ||
// Header | ||
@@ -133,0 +135,0 @@ // TODO: replace it later with a more flexible system to add new navigation points and content files on specific positions. |
@@ -6,2 +6,3 @@ var fs = require("fs"); | ||
var markdown = require("marked"); | ||
var findFiles = require("./utils/find_files"); | ||
@@ -53,2 +54,25 @@ var app = {}; | ||
/** | ||
* Parse files in specified folder. | ||
* @param {Object} options The options used to parse and filder the files. | ||
* @param {Object[]} parsedFiles List of parsed files. | ||
* @param {String[]} parsedFilenames List of parsed files, with full path. | ||
*/ | ||
Parser.prototype.parseFiles = function(options, parsedFiles, parsedFilenames) | ||
{ | ||
var self = this; | ||
var files = findFiles(options); | ||
// Parser | ||
for(var i = 0; i < files.length; i += 1) { | ||
var filename = options.src + files[i]; | ||
var parsedFile = self.parseFile(filename); | ||
if(parsedFile) { | ||
app.log("parse file: " + filename); | ||
parsedFiles.push(parsedFile); | ||
parsedFilenames.push(filename); | ||
} | ||
} // for | ||
}; // parseFiles | ||
/** | ||
* Execute Fileparsing | ||
@@ -322,3 +346,4 @@ */ | ||
// Find document blocks between "#**" and "#*" | ||
docBlocksRegExp: /#\*\*\uffff?(.+?)#\*/g, | ||
// or between "=pod" and "=cut" | ||
docBlocksRegExp: /#\*\*\uffff?(.+?)#\*|=pod\uffff?(.+?)=cut/g, | ||
// Remove not needed " # " and " " (tabs) at the beginning | ||
@@ -338,3 +363,3 @@ inlineRegExp: /^(\s+)?(#)[ ]?/gm | ||
{ | ||
var block = matches[1]; | ||
var block = matches[2] || matches[1]; | ||
@@ -341,0 +366,0 @@ // Reverse Unicode Linebreaks |
@@ -48,3 +48,3 @@ var group = ""; | ||
b: "(\\[?", // 3 | ||
fieldname: "(\\S[a-zA-Z0-9._\\-]*)", // 4 | ||
fieldname: "(\\S[a-zA-Z0-9\/._\\-]*)", // 4 | ||
vDefaultValue: { | ||
@@ -51,0 +51,0 @@ b: "(?:=['|\"]?", |
@@ -46,3 +46,3 @@ var util = require("util"); | ||
*/ | ||
Worker.prototype.process = function(parsedFiles, parsedFilenames) | ||
Worker.prototype.process = function(parsedFiles, parsedFilenames, packageInfos) | ||
{ | ||
@@ -53,3 +53,3 @@ var preProcessResults = {}; | ||
{ | ||
var result = worker.preProcess(parsedFiles, parsedFilenames); | ||
var result = worker.preProcess(parsedFiles, parsedFilenames, packageInfos); | ||
_.extend(preProcessResults, result); | ||
@@ -63,3 +63,3 @@ } | ||
{ | ||
worker.postProcess(parsedFiles, parsedFilenames, preProcessResults); | ||
worker.postProcess(parsedFiles, parsedFilenames, preProcessResults, packageInfos); | ||
} | ||
@@ -66,0 +66,0 @@ catch(e) |
{ | ||
"name": "apidoc", | ||
"version": "0.6.5", | ||
"version": "0.7.0", | ||
"description": "RESTful web API Documentation Generator", | ||
@@ -5,0 +5,0 @@ "author": "Peter Rottmann <rottmann@inveris.de>", |
@@ -1,2 +0,2 @@ | ||
# apiDoc 0.6.x | ||
# apiDoc 0.7.x | ||
@@ -72,2 +72,7 @@ Generates a RESTful web API Documentation. | ||
``` | ||
```=pod | ||
This is a comment. | ||
=cut | ||
``` | ||
@@ -74,0 +79,0 @@ * **Python** |
@@ -16,5 +16,9 @@ define({ | ||
"Permission:" : "Berechtigung:", | ||
"Response" : "Antwort", | ||
"Send" : "Senden", | ||
"Send a Sample Request" : "Eine Beispielanfrage senden", | ||
"show up to version:" : "zeige bis zur Version:", | ||
"Type" : "Typ" | ||
"Type" : "Typ", | ||
"url" : "url" | ||
} | ||
}); |
@@ -10,3 +10,4 @@ require.config({ | ||
lodash: "./vendor/lodash.min", | ||
prettify: "./vendor/prettify/prettify" | ||
prettify: "./vendor/prettify/prettify", | ||
utilsSampleRequest: "utils/send_sample_request" | ||
}, | ||
@@ -35,16 +36,2 @@ shim: { | ||
function loadGoogleFontCss($){ | ||
var host = document.location.hostname.toLowerCase(); | ||
var protocol = document.location.protocol.toLowerCase(); | ||
var googleCss = '//fonts.googleapis.com/css?family=Source+Code+Pro|Source+Sans+Pro:400,600,700'; | ||
if (host == "localhost" || !host.length || protocol === 'file:'){ | ||
googleCss = 'http:' + googleCss; | ||
} | ||
$("<link/>", { | ||
rel: "stylesheet", | ||
type: "text/css", | ||
href: googleCss | ||
}).appendTo("head"); | ||
} | ||
require([ | ||
@@ -58,8 +45,11 @@ "jquery", | ||
"prettify", | ||
"utilsSampleRequest", | ||
"bootstrap" | ||
], function($, _, locale, Handlebars, apiProject, apiData, prettyPrint) { | ||
], function($, _, locale, Handlebars, apiProject, apiData, prettyPrint, sampleRequest) { | ||
loadGoogleFontCss($); | ||
/** | ||
* Load google web fonts. | ||
*/ | ||
loadGoogleFontCss($); | ||
var api = apiData.api; | ||
@@ -320,3 +310,5 @@ | ||
*/ | ||
$("body").scrollspy({ offset: 25 }); | ||
$('[data-spy="scroll"]').each(function () { | ||
$(this).scrollspy('refresh'); | ||
}); | ||
@@ -385,2 +377,7 @@ // Content-Scroll on Navigation click. | ||
} | ||
/** | ||
* Init Modules | ||
*/ | ||
sampleRequest.initDynamic(); | ||
} // initDynamic | ||
@@ -393,3 +390,3 @@ initDynamic(); | ||
prettyPrint(); | ||
/** | ||
@@ -612,2 +609,18 @@ * HTML-Template specific jQuery-Functions | ||
} // resetArticle | ||
function loadGoogleFontCss($){ | ||
var host = document.location.hostname.toLowerCase(); | ||
var protocol = document.location.protocol.toLowerCase(); | ||
var googleCss = '//fonts.googleapis.com/css?family=Source+Code+Pro|Source+Sans+Pro:400,600,700'; | ||
if (host == "localhost" || !host.length || protocol === 'file:'){ | ||
googleCss = 'http:' + googleCss; | ||
} | ||
$("<link/>", { | ||
rel: "stylesheet", | ||
type: "text/css", | ||
href: googleCss | ||
}).appendTo("head"); | ||
} // loadGoogleFontCss | ||
}); |
@@ -606,2 +606,17 @@ define({ api: [ | ||
"type": "get", | ||
"url": "/language/perl/podcut", | ||
"title": "Perl comment with pod and cut", | ||
"name": "GetLanguagePerlPodCut", | ||
"group": "Language", | ||
"version": "0.4.0", | ||
"examples": [ | ||
{ | ||
"title": "Test for indented comment.", | ||
"content": "This is example line 2.\nThis is example line 3.\n Line 4 indented (with tab at beginning).\n Line 5 indented.\nThis is example line 6.\n" | ||
} | ||
], | ||
"filename": "test/fixtures/example/language.pm" | ||
}, | ||
{ | ||
"type": "get", | ||
"url": "/language/python", | ||
@@ -608,0 +623,0 @@ "title": "Python", |
@@ -606,2 +606,17 @@ [ | ||
"type": "get", | ||
"url": "/language/perl/podcut", | ||
"title": "Perl comment with pod and cut", | ||
"name": "GetLanguagePerlPodCut", | ||
"group": "Language", | ||
"version": "0.4.0", | ||
"examples": [ | ||
{ | ||
"title": "Test for indented comment.", | ||
"content": "This is example line 2.\nThis is example line 3.\n Line 4 indented (with tab at beginning).\n Line 5 indented.\nThis is example line 6.\n" | ||
} | ||
], | ||
"filename": "test/fixtures/example/language.pm" | ||
}, | ||
{ | ||
"type": "get", | ||
"url": "/language/python", | ||
@@ -608,0 +623,0 @@ "title": "Python", |
@@ -14,5 +14,5 @@ define({ | ||
"generator": { | ||
"version": "0.6.2", | ||
"time": "2014-08-08T13:56:55.412Z" | ||
"version": "0.7.0", | ||
"time": "2014-08-22T14:39:03.051Z" | ||
} | ||
}); |
@@ -14,5 +14,5 @@ { | ||
"generator": { | ||
"version": "0.6.2", | ||
"time": "2014-08-08T13:56:55.412Z" | ||
"version": "0.7.0", | ||
"time": "2014-08-22T14:39:03.051Z" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
732349
151
9018
110