summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pesse <samypesse@gmail.com>2016-04-25 22:30:41 +0200
committerSamy Pesse <samypesse@gmail.com>2016-04-25 22:30:41 +0200
commitab2ebefe2bb6dee75e064c1ad572749e3f8104d1 (patch)
treeb6a09abe8726a04a57f69580bad3136dd5d4de60
parentc34a9f6213c204c43c78dd691a5295d7e5a757e8 (diff)
downloadgitbook-ab2ebefe2bb6dee75e064c1ad572749e3f8104d1.zip
gitbook-ab2ebefe2bb6dee75e064c1ad572749e3f8104d1.tar.gz
gitbook-ab2ebefe2bb6dee75e064c1ad572749e3f8104d1.tar.bz2
Copy resources from plugins to output folder
-rw-r--r--lib/models/plugin.js17
-rw-r--r--lib/output/website/onInit.js99
2 files changed, 96 insertions, 20 deletions
diff --git a/lib/models/plugin.js b/lib/models/plugin.js
index ed7ad82..372558b 100644
--- a/lib/models/plugin.js
+++ b/lib/models/plugin.js
@@ -74,6 +74,23 @@ Plugin.prototype.getHooks = function() {
};
/**
+ Return infos about resources for a specific type
+
+ @param {String} type
+ @return {Map<String:Mixed>}
+*/
+Plugin.prototype.getResources = function(type) {
+ if (type != 'website' && type != 'ebook') {
+ throw new Error('Invalid assets type ' + type);
+ }
+
+ var content = this.getContent();
+ return (content.get(type)
+ || (type == 'website'? content.get('book') : null)
+ || Immutable.Map());
+};
+
+/**
Return map of filters
@return {Map<String:Function>}
*/
diff --git a/lib/output/website/onInit.js b/lib/output/website/onInit.js
index 632c6d6..d348984 100644
--- a/lib/output/website/onInit.js
+++ b/lib/output/website/onInit.js
@@ -9,45 +9,104 @@ var fs = require('../../utils/fs');
*/
function onInit(output) {
return Promise(output)
- .then(copyPluginAssets)
+ .then(copyAllPluginAssets)
.thenResolve(output);
}
/**
- Copy all assets from plugins
+ Copy all assets from plugins.
+ Assets are files stored in "_assets"
+ nd resources declared in the plugin itself.
@param {Output}
@return {Promise}
*/
-function copyPluginAssets(output) {
- var options = output.getOptions();
+function copyAllPluginAssets(output) {
var plugins = output.getPlugins();
+
+ return Promise.forEach(plugins, function(plugin) {
+ return copyAssets(output, plugin)
+ .then(function() {
+ return copyResources(output, plugin);
+ });
+ });
+}
+
+/**
+ Copy assets from a plugin
+
+ @param {Plugin}
+ @return {Promise}
+*/
+function copyAssets(output, plugin) {
var logger = output.getLogger();
+ var pluginRoot = plugin.getPath();
+ var options = output.getOptions();
var outputRoot = options.get('root');
var assetOutputFolder = path.join(outputRoot, 'gitbook');
var prefix = options.get('prefix');
- return Promise.forEach(plugins, function(plugin) {
- var pluginRoot = plugin.getPath();
- var assetFolder = path.join(pluginRoot, ASSET_FOLDER, prefix);
+ var assetFolder = path.join(pluginRoot, ASSET_FOLDER, prefix);
- if (!fs.existsSync(assetFolder)) {
- return;
+ if (!fs.existsSync(assetFolder)) {
+ return Promise();
+ }
+
+ logger.debug.ln('copy assets from theme', assetFolder);
+ return fs.copyDir(
+ assetFolder,
+ assetOutputFolder,
+ {
+ deleteFirst: false,
+ overwrite: true,
+ confirm: true
}
+ );
+}
- logger.debug.ln('copy assets from theme', assetFolder);
- return fs.copyDir(
- assetFolder,
- assetOutputFolder,
- {
- deleteFirst: false,
- overwrite: true,
- confirm: true
- }
- );
- });
+/**
+ Copy resources from a plugin
+
+ @param {Plugin}
+ @return {Promise}
+*/
+function copyResources(output, plugin) {
+ var logger = output.getLogger();
+
+ var options = output.getOptions();
+ var prefix = options.get('prefix');
+ var outputRoot = options.get('root');
+
+ var pluginRoot = plugin.getPath();
+ var resources = plugin.getResources(prefix);
+
+ var assetsFolder = resources.get('assets');
+ var assetOutputFolder = path.join(outputRoot, 'gitbook', plugin.getNpmID());
+
+ if (!assetsFolder) {
+ return Promise();
+ }
+
+ // Resolve assets folder
+ assetsFolder = path.resolve(pluginRoot, assetsFolder);
+ if (!fs.existsSync(assetsFolder)) {
+ logger.warn.ln('assets folder for plugin "' + plugin.getName() + '" doesn\'t exist');
+ return Promise();
+ }
+
+ logger.debug.ln('copy resources from plugin', assetsFolder);
+
+ return fs.copyDir(
+ assetsFolder,
+ assetOutputFolder,
+ {
+ deleteFirst: false,
+ overwrite: true,
+ confirm: true
+ }
+ );
}
module.exports = onInit;