diff options
Diffstat (limited to 'lib/configuration.js')
-rw-r--r-- | lib/configuration.js | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/configuration.js b/lib/configuration.js index daf1b3c..8a01140 100644 --- a/lib/configuration.js +++ b/lib/configuration.js @@ -1,9 +1,59 @@ var _ = require("lodash"); var Q = require("q"); var path = require("path"); +var npmi = require('npmi'); var fs = require("./utils/fs"); +// Default plugins added to each books +var defaultsPlugins = ["mathjax"]; + +// Normalize a list of plugins to use +function normalizePluginsList(plugins) { + // Normalize list to an array + plugins = _.isString(plugins) ? plugins.split(",") : (plugins || []); + + // Divide as {name, version} to handle format like "myplugin@1.0.0" + plugins = _.map(plugins, function(plugin) { + var parts = plugin.split("@"); + return { + 'name': parts[0], + 'version': parts[1] // optional + } + }); + + // 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 + plugins = _.chain(plugins) + .concat(_.map(defaultsPlugins, function(plugin) { + return { 'name': plugin } + })) + .uniq() + .value(); + + // Build final list + plugins = _.filter(plugins, function(plugin) { + return !_.contains(toremove, plugin.name) && !(plugin.name.length > 0 && plugin.name[0] == "-"); + }); + + return plugins; +} + +// Normalize a list of plugin name to use +function normalizePluginsNames(plugins) { + return _.pluck(normalizePluginsList(plugins), "name"); +}; + + var Configuration = function(book, options) { this.book = book; this.options = _.cloneDeep(Configuration.DEFAULT); @@ -29,6 +79,10 @@ Configuration.prototype.load = function() { }) .then(function() { that.options.output = that.options.output || path.join(that.book.root, "_book"); + that.options.plugins = normalizePluginsList(that.options.plugins); + that.options.defaultsPlugins = normalizePluginsList(that.options.defaultsPlugins); + that.options.plugins = _.union(that.options.plugins, that.options.defaultsPlugins); + that.options.plugins = _.uniq(that.options.plugins, "name"); }); }; @@ -37,6 +91,38 @@ Configuration.prototype.getStructure = function(name) { return this.options.structure[name].split(".").slice(0, -1).join("."); }; +// Install plugins +Configuration.prototype.installPlugins = function(options) { + var that = this; + options = _.defaults(options || { + log: true + }); + + // Remov defaults (no need to install) + var plugins = _.filter(that.options.plugins, function(plugin) { + return !_.contains(defaultsPlugins, plugin.name); + }); + + // Install plugins one by one + if (options.log) console.log(plugins.length+" plugins to install"); + return _.reduce(plugins, function(prev, plugin) { + return prev.then(function() { + var fullname = "gitbook-plugin-"+plugin.name; + if (options.log) console.log("Install plugin", plugin.name, "from npm ("+fullname+") with version", (plugin.version || "*")); + return Q.nfcall(npmi, { + 'name': fullname, + 'version': plugin.version, + 'path': that.book.root, + 'npmLoad': { + 'loglevel': 'silent', + 'loaded': false, + 'prefix': that.book.root + } + }); + }); + }, Q()); +} + // Default configuration Configuration.DEFAULT = { // Options that can't be extend |