diff options
author | Samy Pesse <samypesse@gmail.com> | 2016-02-12 20:48:51 +0100 |
---|---|---|
committer | Samy Pesse <samypesse@gmail.com> | 2016-02-12 20:48:51 +0100 |
commit | 82f94b010f1d77957c9d1b0967dcdd5eafe73c39 (patch) | |
tree | c13607b4bbdf20eb589052dc785edb6e70d6e031 /lib/output/base.js | |
parent | 4555c541a8f98cb6ad4cbec2d7bf85b375dbf505 (diff) | |
download | gitbook-82f94b010f1d77957c9d1b0967dcdd5eafe73c39.zip gitbook-82f94b010f1d77957c9d1b0967dcdd5eafe73c39.tar.gz gitbook-82f94b010f1d77957c9d1b0967dcdd5eafe73c39.tar.bz2 |
Remove concept of generator, to merge it with Output
Diffstat (limited to 'lib/output/base.js')
-rw-r--r-- | lib/output/base.js | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/lib/output/base.js b/lib/output/base.js new file mode 100644 index 0000000..8bc27d4 --- /dev/null +++ b/lib/output/base.js @@ -0,0 +1,141 @@ +var _ = require('lodash'); +var Ignore = require('ignore'); +var path = require('path'); + +var Promise = require('../utils/promise'); +var pathUtil = require('../utils/path'); +var fs = require('../utils/fs'); +var PluginsManager = require('../plugins'); + +function Output(book, type) { + this.book = book; + this.log = this.book.log; + + this.type = type; + this.plugins = new PluginsManager(book); + + // Files to ignore in output + this.ignore = Ignore(); + this.ignore.addPattern(_.compact([ + '.gitignore', + '.ignore', + '.bookignore', + + // The configuration file should not be copied in the output + this.book.config.path + ])); +} + +// Return path to the root folder +Output.prototype.root = function(filename) { + return path.resolve(process.cwd(), this.book.config.get('output')); +}; + +// Resolve a file in the output directory +Output.prototype.resolve = function(filename) { + return pathUtil.resolveInRoot.apply(null, [this.root()].concat(_.toArray(arguments))); +}; + +// Write a file/buffer to the output folder +Output.prototype.writeFile = function(filename, buf) { + var that = this; + + return Promise() + .then(function() { + filename = that.resolve(filename); + var folder = path.dirname(filename); + + // Ensure fodler exists + return fs.mkdirp(folder); + }) + + // Write the file + .then(function() { + return fs.writeFile(filename, buf); + }); +}; + +// Copy a file to the output +Output.prototype.copyFile = function(from, to) { + var that = this; + + return Promise() + .then(function() { + to = that.resolve(to); + + return fs.copy(from, to); + }); +}; + +// Start the generation, for a parsed book +Output.prototype.generate = function() { + var that = this; + var isMultilingual = this.book.isMultilingual(); + + return Promise() + + // Load all plugins + .then(function() { + that.log.info.ln('Loading and preparing plugins'); + + var plugins = _.pluck(that.book.config.get('plugins'), 'name'); + + return that.plugins.load(plugins); + }) + + // Create the output folder + .then(function() { + return fs.mkdirp(that.root()); + }) + + // Initialize the generation + .then(function() { + return that.prepare(); + }) + + // Process all files + .then(function() { + return that.book.fs.listAllFiles(that.book.root); + }) + .then(function(files) { + return Promise.serie(files, function(filename) { + // Ignore file present in a language book + if (isMultilingual && that.book.isInLanguageBook(filename)) return; + + // Process file as page or asset + if (that.book.hasPage(filename)) { + return that.writePage(that.book.getPage(filename)); + } else { + return that.copyAsset(filename); + } + }); + }) + + // Finish the generation + .then(function() { + return that.finish(); + }); +}; + +// Prepare the generation +Output.prototype.prepare = function() { + +}; + +// Copy an asset file (non-parsable), ex: images, etc +Output.prototype.copyAsset = function(filename) { + +}; + +// Write a page (parsable file), ex: markdown, etc +Output.prototype.writePage = function(page) { + +}; + +// Finish the generation +Output.prototype.finish = function() { + +}; + + +module.exports = Output; |