summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2014-11-30 13:04:38 +0100
committerSamy Pessé <samypesse@gmail.com>2014-11-30 13:04:38 +0100
commited48f5f3eede0f55ddc5fc4a65b319ce4e3875d5 (patch)
tree0a52f9e0727b1a0798996ae97d711b9780f7d289
parent7b4accb117d1e3dbd7b6853a7455d96b6fd0f352 (diff)
downloadgitbook-ed48f5f3eede0f55ddc5fc4a65b319ce4e3875d5.zip
gitbook-ed48f5f3eede0f55ddc5fc4a65b319ce4e3875d5.tar.gz
gitbook-ed48f5f3eede0f55ddc5fc4a65b319ce4e3875d5.tar.bz2
Add command "install" to install plugins from book.json
-rwxr-xr-xbin/gitbook.js24
-rw-r--r--lib/generate/config.js29
-rw-r--r--lib/generate/index.js33
-rw-r--r--lib/generate/plugin.js26
-rw-r--r--package.json1
5 files changed, 89 insertions, 24 deletions
diff --git a/bin/gitbook.js b/bin/gitbook.js
index 7a49cde..4a58d2f 100755
--- a/bin/gitbook.js
+++ b/bin/gitbook.js
@@ -7,7 +7,7 @@ var prog = require('commander');
var tinylr = require('tiny-lr-fork');
var pkg = require('../package.json');
-var generators = require("../lib/generate").generators;
+var genbook = require("../lib/generate");
var initDir = require("../lib/generate/init");
var fs = require('../lib/generate/fs');
@@ -80,6 +80,28 @@ build.command(prog.command('serve [source_dir]'))
generate();
});
+build.commandEbook(prog.command('install [source_dir]'))
+.description('Install plugins for a book')
+.action(function(dir, options) {
+ console.log("Install plugins in", dir);
+ genbook.config.read({
+ input: dir
+ })
+ .then(function(options) {
+ return genbook.Plugin.install(options);
+ })
+ .then(function() {
+ console.log("Successfully installed plugins!");
+ })
+ .fail(function(err) {
+ // Log error
+ utils.logError(err);
+
+ // Exit process with failure code
+ process.exit(-1);
+ });
+});
+
build.commandEbook(prog.command('pdf [source_dir]'))
.description('Build a gitbook as a PDF')
.action(function(dir, options) {
diff --git a/lib/generate/config.js b/lib/generate/config.js
index 7ec0741..d2054df 100644
--- a/lib/generate/config.js
+++ b/lib/generate/config.js
@@ -1,3 +1,4 @@
+var Q = require('q');
var _ = require('lodash');
var path = require('path');
@@ -96,10 +97,32 @@ var CONFIG = {
}
};
+// Return complete configuration
+var defaultsConfig = function(options) {
+ return _.merge(options || {}, CONFIG, _.defaults);
+};
+
+// Read configuration from book.json
+var readConfig = function(options) {
+ options = defaultsConfig(options);
+
+ return Q()
+ .then(function() {
+ try {
+ var _config = require(path.resolve(options.input, options.configFile));
+ options = _.merge(options, _.omit(_config, 'input', 'configFile', 'defaultsPlugins', 'generator'));
+ }
+ catch(err) {
+ // No config file: not a big deal
+ return Q();
+ }
+ })
+ .thenResolve(options);
+};
+
module.exports = {
CONFIG: CONFIG,
- defaults: function(options) {
- return _.merge(options || {}, CONFIG, _.defaults);
- }
+ defaults: defaultsConfig,
+ read: readConfig
}
diff --git a/lib/generate/index.js b/lib/generate/index.js
index 01c8b62..de1fc0e 100644
--- a/lib/generate/index.js
+++ b/lib/generate/index.js
@@ -48,28 +48,18 @@ var loadGenerator = function(options) {
var generate = function(options) {
- // Set defaults to options
- options = defaultConfig.defaults(options);
-
- // Validate options
- if (!options.input) {
- return Q.reject(new Error("Need option input (book input directory)"));
- }
-
- // Check files to get folder type (book, multilanguage book or neither)
- return checkGenerator(options)
-
// Read config file
- .then(function() {
- try {
- var _config = require(path.resolve(options.input, options.configFile));
+ return defaultConfig.read(options)
+ .then(function(_options) {
+ options = _options;
- options = _.merge(options, _.omit(_config, 'input', 'configFile', 'defaultsPlugins', 'generator'));
- }
- catch(err) {
- // No config file: not a big deal
- return Q();
+ // Validate options
+ if (!options.input) {
+ return Q.reject(new Error("Need option input (book input directory)"));
}
+
+ // Check files to get folder type (book, multilanguage book or neither)
+ return checkGenerator(options);
})
// Read readme
@@ -99,7 +89,9 @@ var generate = function(options) {
});
};
-
+/*
+ * Generate a multilanguage book by generating a book for each folder.
+ */
var generateMultiLang = function(options) {
var langsSummary;
options.output = options.output || path.join(options.input, "_book");
@@ -378,4 +370,5 @@ module.exports = {
file: generateFile,
book: generateBook,
Plugin: Plugin,
+ config: defaultConfig
};
diff --git a/lib/generate/plugin.js b/lib/generate/plugin.js
index 9d740a5..373af14 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,6 +153,31 @@ 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);
+
+ // Remove defaults plugins
+ plugins = _.without.apply(null, [plugins].concat(Plugin.defaults));
+
+ return _.reduce(plugins, function(prev, name) {
+ return prev.then(function() {
+ var fullname = "gitbook-plugin-"+name;
+ console.log("Install plugin", name, "from npm ("+fullname+")");
+ return Q.nfcall(npmi, {
+ 'name': fullname,
+ 'path': options.input,
+ 'npmLoad': {
+ 'loglevel': 'silent',
+ 'loaded': false,
+ 'prefix': options.input
+ }
+ });
+ });
+ }, Q());
+};
+
// Normalize a list of plugin name to use
Plugin.normalizeNames = function(names) {
// Normalize list to an array
diff --git a/package.json b/package.json
index fb55f23..b430350 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"highlight.js": "8.3.0",
"tmp": "0.0.23",
"semver": "2.2.1",
+ "npmi": "0.1.1",
"gaze": "~0.5.1",
"resolve": "0.6.3",
"tiny-lr-fork": "0.0.5",