diff options
Diffstat (limited to 'lib/generate/plugin.js')
-rw-r--r-- | lib/generate/plugin.js | 73 |
1 files changed, 57 insertions, 16 deletions
diff --git a/lib/generate/plugin.js b/lib/generate/plugin.js index 9d740a5..5ca5e92 100644 --- a/lib/generate/plugin.js +++ b/lib/generate/plugin.js @@ -4,6 +4,7 @@ var semver = require("semver"); var path = require("path"); var url = require("url"); var fs = require("./fs"); +var npmi = require('npmi'); var resolve = require('resolve'); var pkg = require("../../package.json"); @@ -152,33 +153,73 @@ Plugin.prototype.copyAssets = function(out, options) { }; -// Normalize a list of plugin name to use -Plugin.normalizeNames = function(names) { +// Install a list of plugin +Plugin.install = function(options) { + // Normalize list of plugins + var plugins = Plugin.normalizeList(options.plugins); + + // Install plugins one by one + return _.reduce(plugins, function(prev, plugin) { + return prev.then(function() { + 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', + 'loaded': false, + 'prefix': options.input + } + }); + }); + }, Q()); +}; + +// 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 @@ -196,7 +237,7 @@ Plugin.fromList = function(names, root, generator, options) { return plugin; }); - if (_.size(failed) > 0) return Q.reject(new Error("Error loading plugins: "+failed.join(","))); + if (_.size(failed) > 0) return Q.reject(new Error("Error loading plugins: "+failed.join(",")+". Run 'gitbook install' to install plugins from NPM.")); // The raw resources extracted from each plugin var pluginResources; @@ -276,7 +317,7 @@ Plugin.fromList = function(names, root, generator, options) { }); }; -// Default plugins +// Default plugins added to each books Plugin.defaults = [ "mathjax" ]; |