summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-04-29 13:04:54 +0200
committerSamy Pessé <samypesse@gmail.com>2016-04-29 13:04:54 +0200
commit3ea4e334bff428c60db175db58d042ba8e44cd77 (patch)
tree623f54f645065e2da6e5db9788ed9f1335ee7807
parent9955fa8c29383dcbaaaf17e98c442d2d6b07aea6 (diff)
downloadgitbook-3ea4e334bff428c60db175db58d042ba8e44cd77.zip
gitbook-3ea4e334bff428c60db175db58d042ba8e44cd77.tar.gz
gitbook-3ea4e334bff428c60db175db58d042ba8e44cd77.tar.bz2
It should generate index for languages
-rw-r--r--lib/__tests__/module.js6
-rw-r--r--lib/json/encodeOutput.js22
-rw-r--r--lib/json/index.js1
-rw-r--r--lib/output/__tests__/website.js27
-rw-r--r--lib/output/generateBook.js11
-rw-r--r--lib/output/website/onFinish.js26
-rw-r--r--lib/utils/promise.js12
-rw-r--r--test.js28
8 files changed, 91 insertions, 42 deletions
diff --git a/lib/__tests__/module.js b/lib/__tests__/module.js
new file mode 100644
index 0000000..d9220f5
--- /dev/null
+++ b/lib/__tests__/module.js
@@ -0,0 +1,6 @@
+
+describe('GitBook', function() {
+ it('should correctly export', function() {
+ require('../');
+ });
+});
diff --git a/lib/json/encodeOutput.js b/lib/json/encodeOutput.js
new file mode 100644
index 0000000..bb53a62
--- /dev/null
+++ b/lib/json/encodeOutput.js
@@ -0,0 +1,22 @@
+var encodeBook = require('./encodeBook');
+
+/**
+ Encode an output to JSON
+
+ @param {Output}
+ @return {Object}
+*/
+function encodeOutputToJson(output) {
+ var book = output.getBook();
+ var generator = output.getGenerator();
+
+ var result = encodeBook(book);
+
+ result.output = {
+ name: generator
+ };
+
+ return result;
+}
+
+module.exports = encodeOutputToJson;
diff --git a/lib/json/index.js b/lib/json/index.js
index e58beee..39cac99 100644
--- a/lib/json/index.js
+++ b/lib/json/index.js
@@ -1,5 +1,6 @@
module.exports = {
+ encodeOutput: require('./encodeOutput'),
encodeBookWithPage: require('./encodeBookWithPage'),
encodeBook: require('./encodeBook'),
encodeFile: require('./encodeFile'),
diff --git a/lib/output/__tests__/website.js b/lib/output/__tests__/website.js
index 7afa737..54938c8 100644
--- a/lib/output/__tests__/website.js
+++ b/lib/output/__tests__/website.js
@@ -25,5 +25,32 @@ describe('WebsiteGenerator', function() {
expect(folder).toHaveFile('test/page.html');
});
});
+
+ pit('should generate a multilingual book', function() {
+ return generateMock(WebsiteGenerator, {
+ 'LANGS.md': '# Languages\n\n* [en](en)\n* [fr](fr)',
+ 'en': {
+ 'README.md': 'Hello'
+ },
+ 'fr': {
+ 'README.md': 'Bonjour'
+ }
+ })
+ .then(function(folder) {
+ // It should generate languages
+ expect(folder).toHaveFile('en/index.html');
+ expect(folder).toHaveFile('fr/index.html');
+
+ // Should not copy languages as assets
+ expect(folder).not.toHaveFile('en/README.md');
+ expect(folder).not.toHaveFile('fr/README.md');
+
+ // Should copy assets only once
+ expect(folder).toHaveFile('gitbook/style.css');
+ expect(folder).not.toHaveFile('en/gitbook/style.css');
+
+ expect(folder).toHaveFile('index.html');
+ });
+ });
});
diff --git a/lib/output/generateBook.js b/lib/output/generateBook.js
index 6e878e8..c5d61f8 100644
--- a/lib/output/generateBook.js
+++ b/lib/output/generateBook.js
@@ -21,7 +21,7 @@ var generatePages = require('./generatePages');
@return {Promise<Output>}
*/
function processOutput(generator, startOutput) {
- return Pormise(startOutput)
+ return Promise(startOutput)
.then(preparePlugins)
.then(preparePages)
.then(prepareAssets)
@@ -81,10 +81,11 @@ function processOutput(generator, startOutput) {
var outputRoot = output.getRoot();
var plugins = output.getPlugins();
var state = output.getState();
+ var options = output.getOptions();
- return Promise.forEach(books, function(langBook, language) {
+ return Promise.forEach(books, function(langBook) {
// Inherits plugins list, options and state
- var langOptions = options.set('root', path.join(outputRoot, language));
+ var langOptions = options.set('root', path.join(outputRoot, langBook.getLanguage()));
var langOutput = new Output({
book: langBook,
options: langOptions,
@@ -155,7 +156,8 @@ function generateBook(generator, book, options) {
var state = generator.State? generator.State({}) : Immutable.Map();
var start = Date.now();
- return Promise(
+ return processOutput(
+ generator,
new Output({
book: book,
options: options,
@@ -163,7 +165,6 @@ function generateBook(generator, book, options) {
generator: generator.name
})
)
- .then(processOutput)
.then(function(output) {
var logger = output.getLogger();
var end = Date.now();
diff --git a/lib/output/website/onFinish.js b/lib/output/website/onFinish.js
index a424250..e3560e2 100644
--- a/lib/output/website/onFinish.js
+++ b/lib/output/website/onFinish.js
@@ -1,15 +1,35 @@
var Promise = require('../../utils/promise');
+var JSONUtils = require('../../json');
+var Templating = require('../../templating');
+var writeFile = require('../helper/writeFile');
+var createTemplateEngine = require('./createTemplateEngine');
/**
- Finish the generation
+ Finish the generation, write the languages index
@param {Output}
@return {Output}
*/
function onFinish(output) {
- // todo: render language index
+ var book = output.getBook();
+ var options = output.getOptions();
+ var prefix = options.get('prefix');
- return Promise(output);
+ if (!book.isMultilingual()) {
+ return Promise(output);
+ }
+
+ var filePath = 'index.html';
+ var engine = createTemplateEngine(output, filePath);
+ var context = JSONUtils.encodeOutput(output);
+
+ // Render the theme
+ return Templating.renderFile(engine, prefix + '/languages.html', context)
+
+ // Write it to the disk
+ .then(function(html) {
+ return writeFile(output, filePath, html);
+ });
}
module.exports = onFinish;
diff --git a/lib/utils/promise.js b/lib/utils/promise.js
index b8ab63c..f272767 100644
--- a/lib/utils/promise.js
+++ b/lib/utils/promise.js
@@ -11,9 +11,9 @@ var Immutable = require('immutable');
function reduce(arr, iter, base) {
arr = Immutable.Iterable.isIterable(arr)? arr : Immutable.List(arr);
- return arr.reduce(function(prev, elem, i) {
+ return arr.reduce(function(prev, elem, key) {
return prev.then(function(val) {
- return iter(val, elem, i);
+ return iter(val, elem, key);
});
}, Q(base));
}
@@ -26,8 +26,8 @@ function reduce(arr, iter, base) {
@return {Promise}
*/
function forEach(arr, iter) {
- return reduce(arr, function(val, el) {
- return iter(el);
+ return reduce(arr, function(val, el, key) {
+ return iter(el, key);
});
}
@@ -39,8 +39,8 @@ function forEach(arr, iter) {
@return {Promise}
*/
function serie(arr, iter, base) {
- return reduce(arr, function(before, item, i) {
- return Q(iter(item, i))
+ return reduce(arr, function(before, item, key) {
+ return Q(iter(item, key))
.then(function(r) {
before.push(r);
return before;
diff --git a/test.js b/test.js
deleted file mode 100644
index e1f3ac9..0000000
--- a/test.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var path = require('path');
-
-var gitbook = require('./lib');
-var Output = require('./lib/output');
-var NodeFS = require('./lib/fs/node');
-
-
-var BASE_PATH = path.join(__dirname); //, 'docs');
-
-// Create a filesystem to read the book
-var fs = NodeFS(BASE_PATH);
-
-// Create a book instance
-var book = gitbook.Book.createForFS(fs);
-
-// Parse the book
-gitbook.Parse.parseBook(book)
-.then(function(_book) {
- return Output.generate(Output.WebsiteGenerator, _book, {
- root: path.join(__dirname, '_book')
- });
-})
-.then(function(pages) {
- //console.log('parsed', pages);
-}, function(err) {
- console.log('error:', err.stack);
-});
-