Files
gitbook/lib/output/website/copyPluginAssets.js
2016-05-04 10:27:21 +02:00

118 lines
2.9 KiB
JavaScript

var path = require('path');
var ASSET_FOLDER = require('../../constants/pluginAssetsFolder');
var Promise = require('../../utils/promise');
var fs = require('../../utils/fs');
/**
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 book = output.getBook();
// Don't copy plugins assets for language book
// It'll be resolved to the parent folder
if (book.isLanguageBook()) {
return Promise(output);
}
var plugins = output.getPlugins()
// We reverse the order of plugins to copy
// so that first plugins can replace assets from other plugins.
.reverse();
return Promise.forEach(plugins, function(plugin) {
return copyAssets(output, plugin)
.then(function() {
return copyResources(output, plugin);
});
})
.thenResolve(output);
}
/**
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');
var assetFolder = path.join(pluginRoot, ASSET_FOLDER, prefix);
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
}
);
}
/**
Copy resources from a plugin
@param {Plugin}
@return {Promise}
*/
function copyResources(output, plugin) {
var logger = output.getLogger();
var options = output.getOptions();
var outputRoot = options.get('root');
var state = output.getState();
var resources = state.getResources();
var pluginRoot = plugin.getPath();
var pluginResources = resources.get(plugin.getName());
var assetsFolder = pluginResources.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 = copyPluginAssets;