diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/models/output.js | 30 | ||||
-rw-r--r-- | lib/output/generateBook.js | 9 | ||||
-rw-r--r-- | lib/output/website/copyPluginAssets.js | 103 | ||||
-rw-r--r-- | lib/output/website/createTemplateEngine.js | 12 | ||||
-rw-r--r-- | lib/output/website/index.js | 2 | ||||
-rw-r--r-- | lib/output/website/onFinish.js | 13 | ||||
-rw-r--r-- | lib/output/website/onInit.js | 110 | ||||
-rw-r--r-- | lib/output/website/prepareI18n.js | 30 | ||||
-rw-r--r-- | lib/output/website/state.js | 12 |
9 files changed, 207 insertions, 114 deletions
diff --git a/lib/models/output.js b/lib/models/output.js index 3e8dab8..10df67b 100644 --- a/lib/models/output.js +++ b/lib/models/output.js @@ -4,10 +4,21 @@ var Book = require('./book'); var Output = Immutable.Record({ book: Book(), + + // Map of plugins to use (String -> Plugin) plugins: Immutable.OrderedMap(), + + // Map pages to generation (String -> Page) pages: Immutable.OrderedMap(), + + // List assets (String) assets: Immutable.List(), - options: Immutable.Map() + + // Option for the generation + options: Immutable.Map(), + + // Internal state for the generation + state: Immutable.Map() }); Output.prototype.getBook = function() { @@ -30,6 +41,10 @@ Output.prototype.getAssets = function() { return this.get('assets'); }; +Output.prototype.getState = function() { + return this.get('state'); +}; + /** Return logegr for this output (same as book) @@ -40,17 +55,14 @@ Output.prototype.getLogger = function() { }; /** - Create an Output instance from a book and a set of options + Update state of output - @param {Book} book - @param {Object} options + @param {Output} output + @param {Map} newState @return {Output} */ -Output.createForBook = function(book, options) { - return new Output({ - book: book, - options: options - }); +Output.updateState = function(output, newState) { + return output.set('state', newState); }; module.exports = Output; diff --git a/lib/output/generateBook.js b/lib/output/generateBook.js index ab07e41..ef7d5f1 100644 --- a/lib/output/generateBook.js +++ b/lib/output/generateBook.js @@ -1,3 +1,5 @@ +var Immutable = require('immutable'); + var Output = require('../models/output'); var Config = require('../models/config'); var Promise = require('../utils/promise'); @@ -33,10 +35,15 @@ var generatePages = require('./generatePages'); */ function generateBook(generator, book, options) { options = generator.Options(options); + var state = generator.State? generator.State({}) : Immutable.Map(); var start = Date.now(); return Promise( - Output.createForBook(book, options) + new Output({ + book: book, + options: options, + state: state + }) ) .then(preparePlugins) .then(preparePages) diff --git a/lib/output/website/copyPluginAssets.js b/lib/output/website/copyPluginAssets.js new file mode 100644 index 0000000..0b79582 --- /dev/null +++ b/lib/output/website/copyPluginAssets.js @@ -0,0 +1,103 @@ +var path = require('path'); + +var ASSET_FOLDER = require('../../constants/pluginAssetsFolder'); +var Promise = require('../../utils/promise'); +var fs = require('../../utils/fs'); + +/** + Copy all assets from plugins. + Assets are files stored in "_assets" + nd resources declared in the plugin itself. + + @param {Output} + @return {Promise} +*/ +function copyPluginAssets(output) { + var plugins = output.getPlugins(); + + return Promise.forEach(plugins, function(plugin) { + return copyAssets(output, plugin) + .then(function() { + return copyResources(output, plugin); + }); + }) + .thenResolve(output); +} + +/** + Copy assets from a plugin + + @param {Plugin} + @return {Promise} +*/ +function copyAssets(output, plugin) { + var logger = output.getLogger(); + var pluginRoot = plugin.getPath(); + var options = output.getOptions(); + + var outputRoot = options.get('root'); + var assetOutputFolder = path.join(outputRoot, 'gitbook'); + var prefix = options.get('prefix'); + + var assetFolder = path.join(pluginRoot, ASSET_FOLDER, prefix); + + if (!fs.existsSync(assetFolder)) { + return Promise(); + } + + logger.debug.ln('copy assets from theme', assetFolder); + return fs.copyDir( + assetFolder, + assetOutputFolder, + { + deleteFirst: false, + overwrite: true, + confirm: true + } + ); +} + +/** + Copy resources from a plugin + + @param {Plugin} + @return {Promise} +*/ +function copyResources(output, plugin) { + var logger = output.getLogger(); + + var options = output.getOptions(); + var prefix = options.get('prefix'); + var outputRoot = options.get('root'); + + var pluginRoot = plugin.getPath(); + var resources = plugin.getResources(prefix); + + var assetsFolder = resources.get('assets'); + var assetOutputFolder = path.join(outputRoot, 'gitbook', plugin.getNpmID()); + + if (!assetsFolder) { + return Promise(); + } + + // Resolve assets folder + assetsFolder = path.resolve(pluginRoot, assetsFolder); + if (!fs.existsSync(assetsFolder)) { + logger.warn.ln('assets folder for plugin "' + plugin.getName() + '" doesn\'t exist'); + return Promise(); + } + + logger.debug.ln('copy resources from plugin', assetsFolder); + + return fs.copyDir( + assetsFolder, + assetOutputFolder, + { + deleteFirst: false, + overwrite: true, + confirm: true + } + ); +} + +module.exports = copyPluginAssets; diff --git a/lib/output/website/createTemplateEngine.js b/lib/output/website/createTemplateEngine.js index 7f91ba2..06e9192 100644 --- a/lib/output/website/createTemplateEngine.js +++ b/lib/output/website/createTemplateEngine.js @@ -24,19 +24,27 @@ function templateFolder(dir) { @return {TemplateEngine} */ function createTemplateEngine(output, currentFile) { - var searchPaths = listSearchPaths(output); + var book = output.getBook(); + var state = output.getState(); + var i18n = state.getI18n(); + var config = book.getConfig(); // Search paths for templates + var searchPaths = listSearchPaths(output); var tplSearchPaths = searchPaths.map(templateFolder); + // Create loader var loader = new Templating.ThemesLoader(tplSearchPaths); + // Get languages + var language = config.get('language'); + return TemplateEngine.create({ loader: loader, filters: defaultFilters.merge({ t: function(s) { - return s; + return i18n.t(language, s); }, resolveFile: function(s) { return s; diff --git a/lib/output/website/index.js b/lib/output/website/index.js index 9c5614e..0c9fed8 100644 --- a/lib/output/website/index.js +++ b/lib/output/website/index.js @@ -1,8 +1,10 @@ module.exports = { name: 'website', + State: require('./state'), Options: require('./options'), onInit: require('./onInit'), + onFinish: require('./onFinish'), onPage: require('./onPage'), onAsset: require('./onAsset') }; diff --git a/lib/output/website/onFinish.js b/lib/output/website/onFinish.js index e69de29..691a775 100644 --- a/lib/output/website/onFinish.js +++ b/lib/output/website/onFinish.js @@ -0,0 +1,13 @@ +var Promise = require('../../utils/promise'); + +/** + Initialize the generator + + @param {Output} + @return {Output} +*/ +function onFinish(output) { + return Promise(output); +} + +module.exports = onFinish; diff --git a/lib/output/website/onInit.js b/lib/output/website/onInit.js index d348984..979a90d 100644 --- a/lib/output/website/onInit.js +++ b/lib/output/website/onInit.js @@ -1,112 +1,18 @@ -var path = require('path'); - -var ASSET_FOLDER = require('../../constants/pluginAssetsFolder'); var Promise = require('../../utils/promise'); -var fs = require('../../utils/fs'); - -/** - Initialize the generator -*/ -function onInit(output) { - return Promise(output) - .then(copyAllPluginAssets) - .thenResolve(output); -} +var copyPluginAssets = require('./copyPluginAssets'); +var prepareI18n = require('./prepareI18n'); /** - Copy all assets from plugins. - Assets are files stored in "_assets" - nd resources declared in the plugin itself. + Initialize the generator @param {Output} - @return {Promise} + @return {Output} */ -function copyAllPluginAssets(output) { - var plugins = output.getPlugins(); - - return Promise.forEach(plugins, function(plugin) { - return copyAssets(output, plugin) - .then(function() { - return copyResources(output, plugin); - }); - }); -} - -/** - Copy assets from a plugin - - @param {Plugin} - @return {Promise} -*/ -function copyAssets(output, plugin) { - var logger = output.getLogger(); - var pluginRoot = plugin.getPath(); - var options = output.getOptions(); - - var outputRoot = options.get('root'); - var assetOutputFolder = path.join(outputRoot, 'gitbook'); - var prefix = options.get('prefix'); - - var assetFolder = path.join(pluginRoot, ASSET_FOLDER, prefix); - - if (!fs.existsSync(assetFolder)) { - return Promise(); - } - - logger.debug.ln('copy assets from theme', assetFolder); - return fs.copyDir( - assetFolder, - assetOutputFolder, - { - deleteFirst: false, - overwrite: true, - confirm: true - } - ); -} - -/** - Copy resources from a plugin - - @param {Plugin} - @return {Promise} -*/ -function copyResources(output, plugin) { - var logger = output.getLogger(); - - var options = output.getOptions(); - var prefix = options.get('prefix'); - var outputRoot = options.get('root'); - - var pluginRoot = plugin.getPath(); - var resources = plugin.getResources(prefix); - - var assetsFolder = resources.get('assets'); - var assetOutputFolder = path.join(outputRoot, 'gitbook', plugin.getNpmID()); - - if (!assetsFolder) { - return Promise(); - } - - // Resolve assets folder - assetsFolder = path.resolve(pluginRoot, assetsFolder); - if (!fs.existsSync(assetsFolder)) { - logger.warn.ln('assets folder for plugin "' + plugin.getName() + '" doesn\'t exist'); - return Promise(); - } - - logger.debug.ln('copy resources from plugin', assetsFolder); - - return fs.copyDir( - assetsFolder, - assetOutputFolder, - { - deleteFirst: false, - overwrite: true, - confirm: true - } - ); +function onInit(output) { + return Promise(output) + .then(prepareI18n) + .then(copyPluginAssets); } module.exports = onInit; diff --git a/lib/output/website/prepareI18n.js b/lib/output/website/prepareI18n.js new file mode 100644 index 0000000..b57d178 --- /dev/null +++ b/lib/output/website/prepareI18n.js @@ -0,0 +1,30 @@ +var path = require('path'); + +var fs = require('../../utils/fs'); +var Promise = require('../../utils/promise'); +var listSearchPaths = require('./listSearchPaths'); + +/** + Prepare i18n, load translations from plugins and book + + @param {Output} + @return {Promise<Output>} +*/ +function prepareI18n(output) { + var state = output.getState(); + var i18n = state.getI18n(); + var searchPaths = listSearchPaths(output); + + searchPaths + .reverse() + .forEach(function(searchPath) { + var i18nRoot = path.resolve(searchPath, '_i18n'); + + if (!fs.existsSync(i18nRoot)) return; + i18n.load(i18nRoot); + }); + + return Promise(output); +} + +module.exports = prepareI18n; diff --git a/lib/output/website/state.js b/lib/output/website/state.js new file mode 100644 index 0000000..99e7f04 --- /dev/null +++ b/lib/output/website/state.js @@ -0,0 +1,12 @@ +var I18n = require('i18n-t'); +var Immutable = require('immutable'); + +var GeneratorState = Immutable.Record({ + i18n: I18n() +}); + +GeneratorState.prototype.getI18n = function() { + return this.get('i18n'); +}; + +module.exports = GeneratorState; |