diff options
author | Samy Pessé <samypesse@gmail.com> | 2014-11-30 13:04:38 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2014-11-30 13:04:38 +0100 |
commit | ed48f5f3eede0f55ddc5fc4a65b319ce4e3875d5 (patch) | |
tree | 0a52f9e0727b1a0798996ae97d711b9780f7d289 | |
parent | 7b4accb117d1e3dbd7b6853a7455d96b6fd0f352 (diff) | |
download | gitbook-ed48f5f3eede0f55ddc5fc4a65b319ce4e3875d5.zip gitbook-ed48f5f3eede0f55ddc5fc4a65b319ce4e3875d5.tar.gz gitbook-ed48f5f3eede0f55ddc5fc4a65b319ce4e3875d5.tar.bz2 |
Add command "install" to install plugins from book.json
-rwxr-xr-x | bin/gitbook.js | 24 | ||||
-rw-r--r-- | lib/generate/config.js | 29 | ||||
-rw-r--r-- | lib/generate/index.js | 33 | ||||
-rw-r--r-- | lib/generate/plugin.js | 26 | ||||
-rw-r--r-- | package.json | 1 |
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", |