diff --git a/lib/parser.js b/lib/parser.js index acd48f8..4168b46 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -2,6 +2,7 @@ var _ = require('lodash'); var fs = require('fs'); var path = require('path'); var util = require('util'); +var glob = require('glob'); var findFiles = require('./utils/find_files'); @@ -19,6 +20,7 @@ function Parser(_app) { // class variables self.languages = {}; self.parsers = {}; + self.hooks = {}; self.parsedFileElements = []; self.parsedFiles = []; self.countDeprecated = {}; @@ -38,6 +40,9 @@ function Parser(_app) { app.log.debug('load parser: ' + parser + ', ' + filename); self.addParser(parser, require(filename)); }); + + // load hooks + self.addHooks(__dirname); } /** @@ -64,6 +69,26 @@ Parser.prototype.addParser = function(name, parser) { this.parsers[name] = parser; }; +Parser.prototype.addHooks = function (dir) { + var self = this; + if (fs.readdirSync(dir).indexOf('node_modules') === -1 ) { return this.addHooks( path.join(dir,'..') ); } + + var hooks = glob.sync(dir+'/node_modules/apidoc-plugin-*'); + var offset = dir.length + '/node_modules/apidoc-plugin-'.length; + hooks.forEach(function(hook) { + var id = 'api' + hook.substr(offset); // 'apidoc-plugin-'.length = 12 + app.log.debug('load hook: ' + id + ', ' +path.relative(__dirname, hook) + ', '); + self.addHook(id, require(hook)); + }); +}; + +/** + * Add a Hook + */ +Parser.prototype.addHook = function(name, hook) { + this.hooks[name] = hook; +}; + /** * Parse files in specified folder * @@ -119,7 +144,7 @@ Parser.prototype.parseFile = function(filename) { // determine elements in blocks self.elements = self.blocks.map(function(block, i) { - var elements = self._findElements(block); + var elements = self._findElements(block, filename); app.log.debug('count elements in block ' + i + ': ' + elements.length); return elements; }); @@ -412,7 +437,8 @@ Parser.prototype._findBlockWithApiGetIndex = function(blocks) { /** * Get Elements of Blocks */ -Parser.prototype._findElements = function(block) { +Parser.prototype._findElements = function(block, filename) { + var self = this; var elements = []; // Replace Linebreak with Unicode @@ -432,9 +458,14 @@ Parser.prototype._findElements = function(block) { // reverse Unicode Linebreaks element.content = element.content.replace(/\uffff/g, '\n'); element.source = element.source.replace(/\uffff/g, '\n'); - - elements.push(element); - + + if (self.hooks[element.name]) { + var blockExtend = self.hooks[element.name](element, filename); + elements = elements.concat(self._findElements(blockExtend, filename)); + } else { + elements.push(element); + } + // next Match matches = elementsRegExp.exec(block); } diff --git a/package.json b/package.json index dec04af..50804e1 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "node": ">= 0.10.0" }, "dependencies": { + "glob": "~7.0.3", "lodash": "~4.5.0", "semver": "~5.1.0", "wrench": "~1.5.8"