summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/cli/buildEbook.js76
-rw-r--r--lib/cli/index.js6
-rw-r--r--lib/models/book.js2
-rw-r--r--lib/models/languages.js8
4 files changed, 90 insertions, 2 deletions
diff --git a/lib/cli/buildEbook.js b/lib/cli/buildEbook.js
new file mode 100644
index 0000000..ce1d836
--- /dev/null
+++ b/lib/cli/buildEbook.js
@@ -0,0 +1,76 @@
+var path = require('path');
+var tmp = require('tmp');
+
+var Promise = require('../utils/promise');
+var fs = require('../utils/fs');
+var Parse = require('../parse');
+var Output = require('../output');
+
+var options = require('./options');
+var getBook = require('./getBook');
+
+
+module.exports = function(format) {
+ return {
+ name: (format + ' [book] [output]'),
+ description: 'build a book into an ebook file',
+ options: [
+ options.log
+ ],
+ exec: function(args, kwargs) {
+ // Output file will be stored in
+ var outputFile = args[1] || ('book.' + format);
+
+ // Create temporary directory
+ var outputFolder = tmp.dirSync().name;
+
+ var book = getBook(args, kwargs);
+ var logger = book.getLogger();
+ var Generator = Output.getGenerator('ebook');
+
+ return Parse.parseBook(book)
+ .then(function(resultBook) {
+ return Output.generate(Generator, resultBook, {
+ root: outputFolder,
+ format: format
+ });
+ })
+
+ // Extract ebook file
+ .then(function(output) {
+ var book = output.getBook();
+ var languages = book.getLanguages();
+
+ if (book.isMultilingual()) {
+ return Promise.ForEach(languages, function(lang) {
+ var langID = lang.getID();
+
+ var langOutputFile = path.join(
+ path.dirname(outputFile),
+ path.basename(outputFile, format) + '_' + langID + format
+ );
+
+ return fs.copy(
+ path.resolve(outputFolder, langID, 'index' + format),
+ langOutputFile
+ );
+ })
+ .thenResolve(languages.getCount());
+ } else {
+ return fs.copy(
+ path.resolve(outputFolder, 'index' + format),
+ outputFile
+ ).thenResolve(1);
+ }
+ })
+
+ // Log end
+ .then(function(count) {
+ logger.info.ok(count + ' file(s) generated');
+
+ logger.debug('cleaning up... ');
+ return logger.debug.promise(fs.rmDir(outputFolder));
+ });
+ }
+ };
+};
diff --git a/lib/cli/index.js b/lib/cli/index.js
index bb65578..f1fca1d 100644
--- a/lib/cli/index.js
+++ b/lib/cli/index.js
@@ -1,8 +1,12 @@
+var buildEbook = require('./buildEbook');
module.exports = [
require('./build'),
require('./serve'),
require('./install'),
require('./parse'),
- require('./init')
+ require('./init'),
+ buildEbook('pdf'),
+ buildEbook('epub'),
+ buildEbook('mobi')
];
diff --git a/lib/models/book.js b/lib/models/book.js
index 693e830..f960df1 100644
--- a/lib/models/book.js
+++ b/lib/models/book.js
@@ -165,7 +165,7 @@ Book.prototype.getPage = function(ref) {
@return {Boolean}
*/
Book.prototype.isMultilingual = function() {
- return (this.getLanguages().getList().size > 0);
+ return (this.getLanguages().getCount() > 0);
};
/**
diff --git a/lib/models/languages.js b/lib/models/languages.js
index 6c19cba..069c589 100644
--- a/lib/models/languages.js
+++ b/lib/models/languages.js
@@ -35,6 +35,14 @@ Languages.prototype.getLanguage = function(lang) {
return this.getList().get(lang);
};
+/**
+ Return count of langs
+
+ @return {Number}
+*/
+Languages.prototype.getCount = function() {
+ return this.getList().size;
+};
/**
Create a languages list from a JS object