summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/models/output.js30
-rw-r--r--lib/output/generateBook.js9
-rw-r--r--lib/output/website/copyPluginAssets.js103
-rw-r--r--lib/output/website/createTemplateEngine.js12
-rw-r--r--lib/output/website/index.js2
-rw-r--r--lib/output/website/onFinish.js13
-rw-r--r--lib/output/website/onInit.js110
-rw-r--r--lib/output/website/prepareI18n.js30
-rw-r--r--lib/output/website/state.js12
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;