summaryrefslogtreecommitdiffstats
path: root/lib/configuration.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/configuration.js')
-rw-r--r--lib/configuration.js86
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