var _ = require('lodash'); var fs = require('fs'); var Ignore = require('ignore'); var Promise = require('./utils/promise'); var pathUtil = require('./utils/path'); var generators = require('./generators'); var PluginsManager = require('./plugins'); function Output(book, type) { if (!generators[type]) throw new Error('Generator not found"' + type + '"'); this.book = book; this.type = type; this.plugins = new PluginsManager(book); this.generator = new generators[type](this, type); // Files to ignore in output this.ignore = Ignore(); this.ignore.addPattern([ '.gitignore', '.ignore', '.bookignore', // The configuration file should not be copied in the output this.book.config.filename ]); } // Resolve a file in the output directory Output.prototype.resolve = function(filename) { return pathUtil.resolveInRoot.apply(null, [this.book.config.get('output')].concat(_.toArray(arguments))); }; // Write a file/buffer to the output folder Output.prototype.writeFile = function(filename, buf) { filename = this.resolve(filename); return Promise.nfcall(fs.writeFileSync, filename, buf); }; // Start the generation, for a parsed book Output.prototype.generate = function() { var that = this; var isMultilingual = this.isMultilingual(); return Promise() // Initialize the generation .then(function() { return that.generator.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.generator.writePage(that.book.getPage(filename)); } else { return that.generator.writeAsset(filename); } }); }) // Finish the generation .then(function() { return that.generator.finish(); }); }; module.exports = Output;