diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-04-22 22:58:37 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-04-22 22:58:37 +0200 |
commit | a162af5a75453a6ecb818447540cbffdc774715f (patch) | |
tree | 5355932bda4aa7a6f6bf934625389a2362aa5987 | |
parent | fb0ea4610d7835a14c91fd57268ae3d809062f8d (diff) | |
download | gitbook-a162af5a75453a6ecb818447540cbffdc774715f.zip gitbook-a162af5a75453a6ecb818447540cbffdc774715f.tar.gz gitbook-a162af5a75453a6ecb818447540cbffdc774715f.tar.bz2 |
Add base for calling hook on page/global
-rw-r--r-- | lib/models/config.js | 15 | ||||
-rw-r--r-- | lib/output/callHook.js | 28 | ||||
-rw-r--r-- | lib/output/callPageHook.js | 29 | ||||
-rw-r--r-- | lib/output/generateBook.js | 47 |
4 files changed, 114 insertions, 5 deletions
diff --git a/lib/models/config.js b/lib/models/config.js index e32ccdc..8684a03 100644 --- a/lib/models/config.js +++ b/lib/models/config.js @@ -77,6 +77,19 @@ Config.createWithValues = function(values) { }); }; +/** + Update values for an existing configuration + + @param {Config} config + @param {Object} values + @returns {Config} +*/ +Config.updateValues = function(config, values) { + values = Immutable.fromJS(values); + + return config.set('values', values); +}; + /** Convert a keyPath to an array of keys @@ -87,6 +100,6 @@ Config.createWithValues = function(values) { Config.keyToKeyPath = function(keyPath) { if (is.string(keyPath)) keyPath = keyPath.split('.'); return keyPath; -} +}; module.exports = Config; diff --git a/lib/output/callHook.js b/lib/output/callHook.js index 0db1ff1..f6119fd 100644 --- a/lib/output/callHook.js +++ b/lib/output/callHook.js @@ -1,15 +1,39 @@ +var Promise = require('../utils/promise'); + +function defaultGetArgument() { + return undefined; +} + +function defaultHandleResult(output, result) { + return output; +} /** Call a "global" hook for an output @param {String} name + @param {Function(Output) -> Mixed} getArgument + @param {Function(Output, result) -> Output} handleResult @param {Output} output @return {Promise<Output>} */ -function callHook(name, output) { +function callHook(name, getArgument, handleResult, output) { + getArgument = getArgument || defaultGetArgument; + handleResult = handleResult || defaultHandleResult; -} + var plugins = output.getPlugins(); + return Promise(getArgument(output)) + .then(function(arg) { + return Promise.reduce(plugins, function(prev, plugin) { + var hook = plugin.getHook(name); + return hook(prev); + }, arg); + }) + .then(function(result) { + return handleResult(output, result); + }); +} module.exports = callHook; diff --git a/lib/output/callPageHook.js b/lib/output/callPageHook.js new file mode 100644 index 0000000..f7d5bfa --- /dev/null +++ b/lib/output/callPageHook.js @@ -0,0 +1,29 @@ +var callHook = require('./callHook'); + +/** + Call a hook for a specific page + + @param {String} name + @param {Output} output + @param {Page} page + @return {Page} +*/ +function callPageHook(name, output, page) { + return callHook( + name, + + function(out) { + + + }, + + function(result) { + + + }, + + output + ); +} + +module.exports = callPageHook; diff --git a/lib/output/generateBook.js b/lib/output/generateBook.js index fb03418..c35719b 100644 --- a/lib/output/generateBook.js +++ b/lib/output/generateBook.js @@ -1,4 +1,5 @@ var Output = require('../models/output'); +var Config = require('../models/config'); var Promise = require('../utils/promise'); var callHook = require('./callHook'); @@ -28,7 +29,7 @@ var generatePages = require('./generatePages'); @param {Book} book @param {Object} options - @return {Promise} + @return {Promise<Output>} */ function generateBook(generator, book, options) { options = generator.Options(options); @@ -39,8 +40,50 @@ function generateBook(generator, book, options) { .then(preparePlugins) .then(preparePages) .then(prepareAssets) + + .then( + callHook.bind(null, + 'config', + function(output) { + var book = output.getBook(); + var config = book.getConfig(); + var values = config.getValues(); + + return values.toJS(); + }, + function(output, result) { + var book = output.getBook(); + var config = book.getConfig(); + + config = Config.updateValues(config, result); + book = book.set('config', config); + return output.set('book', book); + } + ) + ) + + .then(callHook.bind(null, 'init')) + + .then(function(output) { + if (!generator.onInit) { + return output; + } + + return generator.onInit(output); + }) + .then(generateAssets.bind(null, generator)) - .then(generatePages.bind(null, generator)); + .then(generatePages.bind(null, generator)) + + .then(callHook.bind(null, 'finish:before')) + + .then(function(output) { + if (!generator.onFinish) { + return output; + } + + return generator.onFinish(output); + }); } module.exports = generateBook; |