diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-04-29 13:04:54 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-04-29 13:04:54 +0200 |
commit | 3ea4e334bff428c60db175db58d042ba8e44cd77 (patch) | |
tree | 623f54f645065e2da6e5db9788ed9f1335ee7807 | |
parent | 9955fa8c29383dcbaaaf17e98c442d2d6b07aea6 (diff) | |
download | gitbook-3ea4e334bff428c60db175db58d042ba8e44cd77.zip gitbook-3ea4e334bff428c60db175db58d042ba8e44cd77.tar.gz gitbook-3ea4e334bff428c60db175db58d042ba8e44cd77.tar.bz2 |
It should generate index for languages
-rw-r--r-- | lib/__tests__/module.js | 6 | ||||
-rw-r--r-- | lib/json/encodeOutput.js | 22 | ||||
-rw-r--r-- | lib/json/index.js | 1 | ||||
-rw-r--r-- | lib/output/__tests__/website.js | 27 | ||||
-rw-r--r-- | lib/output/generateBook.js | 11 | ||||
-rw-r--r-- | lib/output/website/onFinish.js | 26 | ||||
-rw-r--r-- | lib/utils/promise.js | 12 | ||||
-rw-r--r-- | test.js | 28 |
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); -}); - |