summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-05-04 10:33:29 +0200
committerSamy Pessé <samypesse@gmail.com>2016-05-04 10:33:29 +0200
commit38a986995a82c6484d677f56ffd68bafcc5398c3 (patch)
treec70e698a8fbd76f01b84d1163e17329833d6d14e /lib
parent5d11641a5f4ff607068d871f48a842ecc1d65bf1 (diff)
parentee8d35df7a26a130a48cdbddd55a26b354378682 (diff)
downloadgitbook-38a986995a82c6484d677f56ffd68bafcc5398c3.zip
gitbook-38a986995a82c6484d677f56ffd68bafcc5398c3.tar.gz
gitbook-38a986995a82c6484d677f56ffd68bafcc5398c3.tar.bz2
Merge pull request #1264 from GitbookIO/fix/plugin-resources
Fix Loading plugin resources
Diffstat (limited to 'lib')
-rw-r--r--lib/api/encodeGlobal.js11
-rw-r--r--lib/output/website/copyPluginAssets.js12
-rw-r--r--lib/output/website/onInit.js2
-rw-r--r--lib/output/website/onPage.js16
-rw-r--r--lib/output/website/prepareResources.js54
-rw-r--r--lib/output/website/state.js9
-rw-r--r--lib/plugins/listResources.js8
7 files changed, 96 insertions, 16 deletions
diff --git a/lib/api/encodeGlobal.js b/lib/api/encodeGlobal.js
index cb91a33..8144883 100644
--- a/lib/api/encodeGlobal.js
+++ b/lib/api/encodeGlobal.js
@@ -1,3 +1,4 @@
+var path = require('path');
var Promise = require('../utils/promise');
var PathUtils = require('../utils/path');
var fs = require('../utils/fs');
@@ -67,6 +68,16 @@ function encodeGlobal(output) {
return bookFS.readAsString(fileName);
},
+ /**
+ Resolve a file from the book root
+
+ @param {String} fileName
+ @return {String}
+ */
+ resolve: function(fileName) {
+ return path.resolve(book.getContentRoot(), fileName);
+ },
+
template: {
/**
Apply a templating block and returns its result
diff --git a/lib/output/website/copyPluginAssets.js b/lib/output/website/copyPluginAssets.js
index 9dc876f..9150636 100644
--- a/lib/output/website/copyPluginAssets.js
+++ b/lib/output/website/copyPluginAssets.js
@@ -78,14 +78,16 @@ function copyAssets(output, plugin) {
function copyResources(output, plugin) {
var logger = output.getLogger();
- var options = output.getOptions();
- var prefix = options.get('prefix');
+ var options = output.getOptions();
var outputRoot = options.get('root');
- var pluginRoot = plugin.getPath();
- var resources = plugin.getResources(prefix);
+ var state = output.getState();
+ var resources = state.getResources();
+
+ var pluginRoot = plugin.getPath();
+ var pluginResources = resources.get(plugin.getName());
- var assetsFolder = resources.get('assets');
+ var assetsFolder = pluginResources.get('assets');
var assetOutputFolder = path.join(outputRoot, 'gitbook', plugin.getNpmID());
if (!assetsFolder) {
diff --git a/lib/output/website/onInit.js b/lib/output/website/onInit.js
index 979a90d..3465eef 100644
--- a/lib/output/website/onInit.js
+++ b/lib/output/website/onInit.js
@@ -2,6 +2,7 @@ var Promise = require('../../utils/promise');
var copyPluginAssets = require('./copyPluginAssets');
var prepareI18n = require('./prepareI18n');
+var prepareResources = require('./prepareResources');
/**
Initialize the generator
@@ -12,6 +13,7 @@ var prepareI18n = require('./prepareI18n');
function onInit(output) {
return Promise(output)
.then(prepareI18n)
+ .then(prepareResources)
.then(copyPluginAssets);
}
diff --git a/lib/output/website/onPage.js b/lib/output/website/onPage.js
index 64b4e04..16a5c39 100644
--- a/lib/output/website/onPage.js
+++ b/lib/output/website/onPage.js
@@ -18,11 +18,15 @@ var fileToOutput = require('../helper/fileToOutput');
@param {Page} page
*/
function onPage(output, page) {
- var options = output.getOptions();
- var file = page.getFile();
- var prefix = options.get('prefix');
- var book = output.getBook();
- var plugins = output.getPlugins();
+ var options = output.getOptions();
+ var prefix = options.get('prefix');
+
+ var file = page.getFile();
+
+ var book = output.getBook();
+ var plugins = output.getPlugins();
+ var state = output.getState();
+ var resources = state.getResources();
var engine = createTemplateEngine(output, page.getPath());
@@ -38,7 +42,7 @@ function onPage(output, page) {
// Generate the context
var context = JSONUtils.encodeBookWithPage(output.getBook(), resultPage);
context.plugins = {
- resources: Plugins.listResources(plugins, prefix).toJS()
+ resources: Plugins.listResources(plugins, resources).toJS()
};
context.template = {
diff --git a/lib/output/website/prepareResources.js b/lib/output/website/prepareResources.js
new file mode 100644
index 0000000..4e6835d
--- /dev/null
+++ b/lib/output/website/prepareResources.js
@@ -0,0 +1,54 @@
+var is = require('is');
+var Immutable = require('immutable');
+var Promise = require('../../utils/promise');
+
+var Api = require('../../api');
+
+/**
+ Prepare plugins resources, add all output corresponding type resources
+
+ @param {Output}
+ @return {Promise<Output>}
+*/
+function prepareResources(output) {
+ var plugins = output.getPlugins();
+ var options = output.getOptions();
+ var type = options.get('prefix');
+ var state = output.getState();
+ var context = Api.encodeGlobal(output);
+
+ var result = Immutable.Map();
+
+ return Promise.forEach(plugins, function(plugin) {
+ var pluginResources = plugin.getResources(type);
+
+ return Promise()
+ .then(function() {
+ // Apply resources if is a function
+ if (is.fn(pluginResources)) {
+ return Promise()
+ .then(pluginResources.bind(context));
+ }
+ else {
+ return pluginResources;
+ }
+ })
+ .then(function(resources) {
+ result = result.set(plugin.getName(), Immutable.Map(resources));
+ });
+ })
+ .then(function() {
+ // Set output resources
+ state = state.merge({
+ resources: result
+ });
+
+ output = output.merge({
+ state: state
+ });
+
+ return output;
+ });
+}
+
+module.exports = prepareResources; \ No newline at end of file
diff --git a/lib/output/website/state.js b/lib/output/website/state.js
index 99e7f04..cb8f750 100644
--- a/lib/output/website/state.js
+++ b/lib/output/website/state.js
@@ -2,11 +2,18 @@ var I18n = require('i18n-t');
var Immutable = require('immutable');
var GeneratorState = Immutable.Record({
- i18n: I18n()
+ i18n: I18n(),
+
+ // List of plugins' resources
+ resources: Immutable.Map()
});
GeneratorState.prototype.getI18n = function() {
return this.get('i18n');
};
+GeneratorState.prototype.getResources = function() {
+ return this.get('resources');
+};
+
module.exports = GeneratorState;
diff --git a/lib/plugins/listResources.js b/lib/plugins/listResources.js
index 4a73a2c..fe31b5a 100644
--- a/lib/plugins/listResources.js
+++ b/lib/plugins/listResources.js
@@ -11,13 +11,13 @@ var PLUGIN_RESOURCES = require('../constants/pluginResources');
@param {String} type
@return {Map<String:List<{url, path}>}
*/
-function listResources(plugins, type) {
+function listResources(plugins, resources) {
return plugins.reduce(function(result, plugin) {
- var npmId = plugin.getNpmID();
- var resources = plugin.getResources(type);
+ var npmId = plugin.getNpmID();
+ var pluginResources = resources.get(plugin.getName());
PLUGIN_RESOURCES.forEach(function(resourceType) {
- var assets = resources.get(resourceType);
+ var assets = pluginResources.get(resourceType);
if (!assets) return;
var list = result.get(resourceType) || Immutable.List();