summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-04-22 22:58:37 +0200
committerSamy Pessé <samypesse@gmail.com>2016-04-22 22:58:37 +0200
commita162af5a75453a6ecb818447540cbffdc774715f (patch)
tree5355932bda4aa7a6f6bf934625389a2362aa5987
parentfb0ea4610d7835a14c91fd57268ae3d809062f8d (diff)
downloadgitbook-a162af5a75453a6ecb818447540cbffdc774715f.zip
gitbook-a162af5a75453a6ecb818447540cbffdc774715f.tar.gz
gitbook-a162af5a75453a6ecb818447540cbffdc774715f.tar.bz2
Add base for calling hook on page/global
-rw-r--r--lib/models/config.js15
-rw-r--r--lib/output/callHook.js28
-rw-r--r--lib/output/callPageHook.js29
-rw-r--r--lib/output/generateBook.js47
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;