diff options
Diffstat (limited to 'lib/generate/index.js')
-rw-r--r-- | lib/generate/index.js | 110 |
1 files changed, 100 insertions, 10 deletions
diff --git a/lib/generate/index.js b/lib/generate/index.js index 4804548..33edc1f 100644 --- a/lib/generate/index.js +++ b/lib/generate/index.js @@ -1,8 +1,8 @@ var Q = require("q"); var _ = require("lodash"); - var path = require("path"); var swig = require('swig'); +var tmp = require('tmp'); var fs = require("./fs"); var parse = require("../parse"); @@ -15,6 +15,12 @@ var generators = { "json": require("./json") }; +var defaultDescription = "Book generated using GitBook"; + +/* + * Use a specific generator to convert a gitbook to a site/pdf/ebook/ + * output is always a folder + */ var generate = function(options) { var generator = null; var files; @@ -29,7 +35,7 @@ var generate = function(options) { // Book title, keyword, description title: null, - description: "Book generated using GitBook", + description: null, // Origin github repository id github: null, @@ -39,14 +45,16 @@ var generate = function(options) { theme: path.resolve(__dirname, '../../theme') }); - if (!options.title || !options.input || !options.output) { - return Q.reject(new Error("Need options: title, input, output")); + if (!options.input) { + return Q.reject(new Error("Need option input (book input directory)")); } if (!generators[options.generator]) { return Q.reject(new Error("Invalid generator (availables are: "+_.keys(generators).join(", "))); } + options.output = options.output || path.join(options.input, "_book"); + // Clean output folder return fs.remove(options.output) @@ -97,14 +105,37 @@ var generate = function(options) { return Q.reject(new Error("Invalid gitbook repository, need SUMMARY.md and README.md")); } else { // Generate the book - return fs.readFile(path.join(options.input, "SUMMARY.md"), "utf-8") + return Q() + + // Read readme + .then(function() { + return fs.readFile(path.join(options.input, "README.md"), "utf-8") + .then(function(_readme) { + _readme = parse.readme(_readme); + + options.title = options.title || _readme.title; + options.description = options.description || _readme.description || defaultDescription; + }); + }) // Get summary - .then(function(_summary) { - options.summary = parse.summary(_summary); + .then(function() { + return fs.readFile(path.join(options.input, "SUMMARY.md"), "utf-8") + .then(function(_summary) { + options.summary = parse.summary(_summary); + + // Parse navigation + options.navigation = parse.navigation(options.summary); + }); + }) - // Parse navigation - options.navigation = parse.navigation(options.summary); + // Skip processing some files + .then(function() { + files = _.filter(files, function (file) { + return !( + file === 'SUMMARY.md' + ); + }); }) // Copy file and replace markdown file @@ -142,7 +173,66 @@ var generate = function(options) { }); }; +/* + * Extract files from generate output in a temporary folder + */ +var generateFile = function(options) { + options = _.defaults(options || {}, { + input: null, + output: null, + extension: null + }); + + return Q.nfcall(tmp.dir) + .then(function(tmpDir) { + return generate( + _.extend({}, + options, + { + output: tmpDir + }) + ) + .then(function(_options) { + var ext = options.extension; + var outputFile = options.output || path.resolve(options.input, "book."+ext); + + var copyFile = function(lang) { + var _outputFile = outputFile; + var _tmpDir = tmpDir; + + if (lang) { + _outputFile = _outputFile.slice(0, -path.extname(_outputFile).length)+"_"+lang+path.extname(_outputFile); + _tmpDir = path.join(_tmpDir, lang); + } + + return fs.copy( + path.join(_tmpDir, "index."+ext), + _outputFile + ); + }; + + // Multi-langs book + return Q() + .then(function() { + if (_options.langsSummary) { + return Q.all( + _.map(_options.langsSummary.list, function(lang) { + return copyFile(lang.lang); + }) + ); + } else { + return copyFile(); + } + }) + .then(function() { + return fs.remove(tmpDir); + }); + }); + }); +}; + module.exports = { generators: generators, - folder: generate + folder: generate, + file: generateFile }; |