summaryrefslogtreecommitdiffstats
path: root/lib/cli/helper.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cli/helper.js')
-rw-r--r--lib/cli/helper.js139
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
+};