diff options
Diffstat (limited to 'lib/generate/plugin.js')
-rw-r--r-- | lib/generate/plugin.js | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/lib/generate/plugin.js b/lib/generate/plugin.js index 41831a7..5ca5e92 100644 --- a/lib/generate/plugin.js +++ b/lib/generate/plugin.js @@ -156,17 +156,16 @@ Plugin.prototype.copyAssets = function(out, options) { // Install a list of plugin Plugin.install = function(options) { // Normalize list of plugins - var plugins = Plugin.normalizeNames(options.plugins); + var plugins = Plugin.normalizeList(options.plugins); - // Remove defaults plugins - plugins = _.without.apply(null, [plugins].concat(Plugin.defaults)); - - return _.reduce(plugins, function(prev, name) { + // Install plugins one by one + return _.reduce(plugins, function(prev, plugin) { return prev.then(function() { - var fullname = "gitbook-plugin-"+name; - console.log("Install plugin", name, "from npm ("+fullname+")"); + var fullname = "gitbook-plugin-"+plugin.name; + console.log("Install plugin", plugin.name, "from npm ("+fullname+") with version", (plugin.version || "*")); return Q.nfcall(npmi, { 'name': fullname, + 'version': plugin.version, 'path': options.input, 'npmLoad': { 'loglevel': 'silent', @@ -178,33 +177,49 @@ Plugin.install = function(options) { }, Q()); }; -// Normalize a list of plugin name to use -Plugin.normalizeNames = function(names) { +// Normalize a list of plugins to use +Plugin.normalizeList = function(plugins) { // Normalize list to an array - names = _.isString(names) ? names.split(",") : (names || []); + 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(names) - .filter(function(name) { - return name.length > 0 && name[0] == "-"; + var toremove = _.chain(plugins) + .filter(function(plugin) { + return plugin.name.length > 0 && plugin.name[0] == "-"; }) - .map(function(name) { - return name.slice(1); + .map(function(plugin) { + return plugin.name.slice(1); }) .value(); // Merge with defaults - names = _.chain(names) - .concat(Plugin.defaults) + plugins = _.chain(plugins) + .concat(_.map(Plugin.defaults, function(plugin) { + return { 'name': plugin } + })) .uniq() .value(); - // Remove plugins starting with - names = _.filter(names, function(name) { - return !_.contains(toremove, name) && !(name.length > 0 && name[0] == "-"); + // Build final list + plugins = _.filter(plugins, function(plugin) { + return !_.contains(toremove, plugin.name) && !(plugin.name.length > 0 && plugin.name[0] == "-"); }); - return names; + return plugins; +}; + +// Normalize a list of plugin name to use +Plugin.normalizeNames = function(plugins) { + return _.pluck(Plugin.normalizeList(plugins), "name"); }; // Extract data from a list of plugin @@ -302,7 +317,7 @@ Plugin.fromList = function(names, root, generator, options) { }); }; -// Default plugins +// Default plugins added to each books Plugin.defaults = [ "mathjax" ]; |