summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-01-19 16:53:20 +0100
committerSamy Pessé <samypesse@gmail.com>2015-01-19 16:53:20 +0100
commitad233c0d8e242957288a9edb3a2f358e21a45a7d (patch)
tree4e1a910a23f9fce5807f5bfbee64f2b8bd468543
parent41c3db4c049c98f1a6fc5af9068757306ef26214 (diff)
downloadgitbook-ad233c0d8e242957288a9edb3a2f358e21a45a7d.zip
gitbook-ad233c0d8e242957288a9edb3a2f358e21a45a7d.tar.gz
gitbook-ad233c0d8e242957288a9edb3a2f358e21a45a7d.tar.bz2
Improve plugins installation to prevent installation of default plugins
-rw-r--r--lib/book.js4
-rw-r--r--lib/configuration.js86
-rw-r--r--lib/generator.js81
-rw-r--r--lib/index.js4
-rw-r--r--lib/plugin.js74
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;