diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-01-19 16:53:20 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-01-19 16:53:20 +0100 |
commit | ad233c0d8e242957288a9edb3a2f358e21a45a7d (patch) | |
tree | 4e1a910a23f9fce5807f5bfbee64f2b8bd468543 | |
parent | 41c3db4c049c98f1a6fc5af9068757306ef26214 (diff) | |
download | gitbook-ad233c0d8e242957288a9edb3a2f358e21a45a7d.zip gitbook-ad233c0d8e242957288a9edb3a2f358e21a45a7d.tar.gz gitbook-ad233c0d8e242957288a9edb3a2f358e21a45a7d.tar.bz2 |
Improve plugins installation to prevent installation of default plugins
-rw-r--r-- | lib/book.js | 4 | ||||
-rw-r--r-- | lib/configuration.js | 86 | ||||
-rw-r--r-- | lib/generator.js | 81 | ||||
-rw-r--r-- | lib/index.js | 4 | ||||
-rw-r--r-- | lib/plugin.js | 74 |
5 files changed, 171 insertions, 78 deletions
diff --git a/lib/book.js b/lib/book.js index 1a8643f..620333b 100644 --- a/lib/book.js +++ b/lib/book.js @@ -135,12 +135,10 @@ Book.prototype.generateMultiLingual = function() { // Parse list of plugins Book.prototype.parsePlugins = function() { var that = this; - var names = Plugin.normalizeNames(this.options.plugins); - var failed = []; // Load plugins - that.plugins = _.map(names, function(name) { + that.plugins = _.map(that.options.plugins, function(name) { var plugin = new Plugin(that, name); if (!plugin.isValid()) failed.push(name); return plugin; 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 diff --git a/lib/generator.js b/lib/generator.js new file mode 100644 index 0000000..ef64018 --- /dev/null +++ b/lib/generator.js @@ -0,0 +1,81 @@ +var _ = require("lodash"); +var path = require("path"); +var Q = require("q"); +var fs = require("./fs"); + +var BaseGenerator = function(book, options) { + this.options = options; + + // Base for assets in plugins + this.pluginAssetsBase = "book"; +}; + +BaseGenerator.prototype.callHook = function(name, data) { + return this.plugins.hook(name, data); +}; + +// Sets up generator +BaseGenerator.prototype.load = function() { + return this.loadPlugins(); +}; + +BaseGenerator.prototype.loadPlugins = function() { + var that = this; + + return Plugin.fromList(this.options.plugins, this.options.input, this, { + assetsBase: this.pluginAssetsBase + }) + .then(function(_plugins) { + that.plugins = _plugins; + + return that.callHook("init"); + }); +}; + +BaseGenerator.prototype.convertFile = function(content, input) { + return Q.reject(new Error("Could not convert "+input)); +}; + +BaseGenerator.prototype.transferFile = function(input) { + return fs.copy( + path.join(this.options.input, input), + path.join(this.options.output, input) + ); +}; + +BaseGenerator.prototype.transferFolder = function(input) { + return fs.mkdirp( + path.join(this.options.output, input) + ); +}; + +BaseGenerator.prototype.copyCover = function() { + var that = this; + + return Q.all([ + fs.copy(path.join(this.options.input, "cover.jpg"), path.join(this.options.output, "cover.jpg")), + fs.copy(path.join(this.options.input, "cover_small.jpg"), path.join(this.options.output, "cover_small.jpg")) + ]) + .fail(function() { + // If orignally from multi-lang, try copy from originalInput + if (!that.options.originalInput) return; + + return Q.all([ + fs.copy(path.join(that.options.originalInput, "cover.jpg"), path.join(that.options.output, "cover.jpg")), + fs.copy(path.join(that.options.originalInput, "cover_small.jpg"), path.join(that.options.output, "cover_small.jpg")) + ]); + }) + .fail(function(err) { + return Q(); + }); +}; + +BaseGenerator.prototype.langsIndex = function(langs) { + return Q.reject(new Error("Langs index is not supported in this generator")); +}; + +BaseGenerator.prototype.finish = function() { + return Q.reject(new Error("Could not finish generation")); +}; + +module.exports = BaseGenerator; diff --git a/lib/index.js b/lib/index.js index a71d325..5f8648e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -36,7 +36,9 @@ module.exports = { return book.config.load() .then(function() { - return Plugin.install(input, book.options.plugins); + return book.config.installPlugins({ + log: true + }); }); } } diff --git a/lib/plugin.js b/lib/plugin.js index d1ec08d..6767aed 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -4,7 +4,6 @@ var semver = require("semver"); var path = require("path"); var url = require("url"); var fs = require("./utils/fs"); -var npmi = require('npmi'); var resolve = require('resolve'); var pkg = require("../package.json"); @@ -31,9 +30,6 @@ var Plugin = function(book, name) { // Type of plugins resources Plugin.RESOURCES = ["js", "css"]; -// Default plugins added to each books -Plugin.defaults = ["mathjax"]; - // Load from a name Plugin.prototype.load = function(name, baseDir) { try { @@ -154,74 +150,4 @@ Plugin.prototype.copyAssets = function(out, options) { }, _.constant(false)); }; - -// Install a list of plugin -Plugin.install = function(root, plugins) { - // Normalize list of plugins - plugins = Plugin.normalizeList(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': root, - 'npmLoad': { - 'loglevel': 'silent', - 'loaded': false, - 'prefix': root - } - }); - }); - }, Q()); -}; - -// Normalize a list of plugins to use -Plugin.normalizeList = function(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(Plugin.defaults, 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 -Plugin.normalizeNames = function(plugins) { - return _.pluck(Plugin.normalizeList(plugins), "name"); -}; - module.exports = Plugin; |