diff options
Diffstat (limited to 'lib/config')
-rw-r--r-- | lib/config/index.js | 11 | ||||
-rw-r--r-- | lib/config/plugins.js | 71 |
2 files changed, 77 insertions, 5 deletions
diff --git a/lib/config/index.js b/lib/config/index.js index 801dca1..ede45ba 100644 --- a/lib/config/index.js +++ b/lib/config/index.js @@ -2,8 +2,9 @@ var _ = require('lodash'); var semver = require('semver'); var gitbook = require('../gitbook'); -var configDefault = require('./default'); var Promise = require('../utils/promise'); +var configDefault = require('./default'); +var plugins = require('./plugins'); // Config files to tested (sorted) var CONFIG_FILES = [ @@ -56,10 +57,10 @@ Config.prototype.load = function() { } that.options.output = that.options.output || that.book.resolve('_book'); - //that.options.plugins = normalizePluginsList(that.options.plugins); - //that.options.defaultsPlugins = normalizePluginsList(that.options.defaultsPlugins || '', false); - //that.options.plugins = _.union(that.options.plugins, that.options.defaultsPlugins); - //that.options.plugins = _.uniq(that.options.plugins, 'name'); + that.options.plugins = plugins.toList(that.options.plugins); + that.options.defaultsPlugins = plugins.toList(that.options.defaultsPlugins || '', false); + that.options.plugins = _.union(that.options.plugins, that.options.defaultsPlugins); + that.options.plugins = _.uniq(that.options.plugins, 'name'); // Default value for text direction (from language) /*if (!that.options.direction) { diff --git a/lib/config/plugins.js b/lib/config/plugins.js new file mode 100644 index 0000000..43eafdf --- /dev/null +++ b/lib/config/plugins.js @@ -0,0 +1,71 @@ +var _ = require('lodash'); + +// Default plugins added to each books +var DEFAULT_PLUGINS = ['highlight', 'search', 'sharing', 'fontsettings']; + +// Return true if a plugin is a default plugin +function isDefaultPlugin(name, version) { + return _.contains(DEFAULT_PLUGINS, name); +} + +// Normalize a list of plugins to use +function normalizePluginsList(plugins, addDefaults) { + // Normalize list to an array + plugins = _.isString(plugins) ? plugins.split(',') : (plugins || []); + + // Remove empty parts + plugins = _.compact(plugins); + + // Divide as {name, version} to handle format like 'myplugin@1.0.0' + plugins = _.map(plugins, function(plugin) { + if (plugin.name) return plugin; + + var parts = plugin.split('@'); + var name = parts[0]; + var version = parts[1]; + return { + 'name': name, + 'version': version, // optional + 'isDefault': isDefaultPlugin(name, version) + }; + }); + + // List plugins to remove + var toremove = _.chain(plugins) + .filter(function(plugin) { + return plugin.name.length > 0 && plugin.name[0] == '-'; + }) + .map(function(plugin) { + return plugin.name.slice(1); + }) + .value(); + + // Merge with defaults + if (addDefaults !== false) { + _.each(DEFAULT_PLUGINS, function(plugin) { + if (_.find(plugins, { name: plugin })) { + return; + } + + plugins.push({ + 'name': plugin, + 'isDefault': true + }); + }); + } + + // Remove plugin that start with '-' + plugins = _.filter(plugins, function(plugin) { + return !_.contains(toremove, plugin.name) && !(plugin.name.length > 0 && plugin.name[0] == '-'); + }); + + // Remove duplicates + plugins = _.uniq(plugins, 'name'); + + return plugins; +} + +module.exports = { + toList: normalizePluginsList +}; + |