diff options
Diffstat (limited to 'lib/cli/helper.js')
-rw-r--r-- | lib/cli/helper.js | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/lib/cli/helper.js b/lib/cli/helper.js new file mode 100644 index 0000000..e4dc8da --- /dev/null +++ b/lib/cli/helper.js @@ -0,0 +1,139 @@ +var _ = require('lodash'); +var path = require('path'); + +var Book = require('../book'); +var NodeFS = require('../fs/node'); +var Logger = require('../utils/logger'); +var Promise = require('../utils/promise'); +var fs = require('../utils/fs'); +var JSONOutput = require('../output/json'); +var WebsiteOutput = require('../output/website'); +var EBookOutput = require('../output/ebook'); + +var nodeFS = new NodeFS(); + +var LOG_OPTION = { + name: 'log', + description: 'Minimum log level to display', + values: _.chain(Logger.LEVELS) + .keys() + .map(function(s) { + return s.toLowerCase(); + }) + .value(), + defaults: 'info' +}; + +var FORMAT_OPTION = { + name: 'format', + description: 'Format to build to', + values: ['website', 'json', 'ebook'], + defaults: 'website' +}; + +var FORMATS = { + json: JSONOutput, + website: WebsiteOutput, + ebook: EBookOutput +}; + +// Commands which is processing a book +// the root of the book is the first argument (or current directory) +function bookCmd(fn) { + return function(args, kwargs) { + var input = path.resolve(args[0] || process.cwd()); + return Book.setup(nodeFS, input, { + logLevel: kwargs.log + }) + .then(function(book) { + return fn(book, args.slice(1), kwargs); + }); + }; +} + +// Commands which is working on a Output instance +function outputCmd(fn) { + return bookCmd(function(book, args, kwargs) { + var Out = FORMATS[kwargs.format]; + var outputFolder = undefined; + + // Set output folder + if (args[0]) { + outputFolder = path.resolve(process.cwd(), args[0]); + } + + return fn(new Out(book, { + root: outputFolder + }), args); + }); +} + +// Command to generate an ebook +function ebookCmd(format) { + return { + name: format + ' [book] [output] [file]', + description: 'generates ebook '+format, + options: [ + LOG_OPTION + ], + exec: bookCmd(function(book, args, kwargs) { + return fs.tmpDir() + .then(function(dir) { + var ext = '.'+format; + var outputFile = path.resolve(process.cwd(), args[1] || ('book' + ext)); + var output = new EBookOutput(book, { + root: dir, + format: format + }); + + return output.book.parse() + .then(function() { + return output.generate(); + }) + + // Copy the ebook files + .then(function() { + if (output.book.isMultilingual()) { + return Promise.serie(output.book.langs.list(), function(lang) { + var _outputFile = path.join( + path.dirname(outputFile), + path.basename(outputFile, ext) + '_' + lang.id + ext + ); + + return fs.copy( + path.resolve(dir, lang.id, 'index' + ext), + _outputFile + ); + }) + .thenResolve(output.book.langs.count()); + } else { + return fs.copy( + path.resolve(dir, 'index' + ext), + outputFile + ).thenResolve(1); + } + }) + .then(function(n) { + output.book.log.info.ok(n+' file(s) generated'); + + output.book.log.info('cleaning up... '); + return output.book.log.info.promise(fs.rmDir(dir)); + }); + }); + }) + }; +} + +module.exports = { + nodeFS: nodeFS, + bookCmd: bookCmd, + outputCmd: outputCmd, + ebookCmd: ebookCmd, + + options: { + log: LOG_OPTION, + format: FORMAT_OPTION + }, + + FORMATS: FORMATS +}; |