diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-07-11 16:27:22 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-07-11 16:27:22 +0200 |
commit | 6b103f4532c23b4855025029ff966abc65092ff3 (patch) | |
tree | a7374739337d90e22cbad9375d6ab50ec437d92d /lib | |
parent | d4fa5c18a8049986e224d98738390aac90c411be (diff) | |
download | gitbook-6b103f4532c23b4855025029ff966abc65092ff3.zip gitbook-6b103f4532c23b4855025029ff966abc65092ff3.tar.gz gitbook-6b103f4532c23b4855025029ff966abc65092ff3.tar.bz2 |
Fix #1408: fix i18n in website generator and add tests for it
Diffstat (limited to 'lib')
-rw-r--r-- | lib/constants/configSchema.js | 4 | ||||
-rw-r--r-- | lib/output/__tests__/createMock.js | 38 | ||||
-rw-r--r-- | lib/output/__tests__/ebook.js | 2 | ||||
-rw-r--r-- | lib/output/__tests__/generateMock.js (renamed from lib/output/generateMock.js) | 27 | ||||
-rw-r--r-- | lib/output/__tests__/json.js | 2 | ||||
-rw-r--r-- | lib/output/__tests__/website.js | 2 | ||||
-rw-r--r-- | lib/output/generateBook.js | 54 | ||||
-rw-r--r-- | lib/output/preparePlugins.js | 10 | ||||
-rw-r--r-- | lib/output/website/__tests__/i18n.js | 38 | ||||
-rw-r--r-- | lib/output/website/createTemplateEngine.js | 58 | ||||
-rw-r--r-- | lib/output/website/prepareI18n.js | 10 |
11 files changed, 159 insertions, 86 deletions
diff --git a/lib/constants/configSchema.js b/lib/constants/configSchema.js index e693977..d2126c6 100644 --- a/lib/constants/configSchema.js +++ b/lib/constants/configSchema.js @@ -18,6 +18,10 @@ module.exports = { 'type': 'string', 'title': 'ISBN for published book' }, + 'language': { + 'type': 'string', + 'title': 'Language of the book' + }, 'author': { 'type': 'string', 'title': 'Name of the author' diff --git a/lib/output/__tests__/createMock.js b/lib/output/__tests__/createMock.js new file mode 100644 index 0000000..f21c544 --- /dev/null +++ b/lib/output/__tests__/createMock.js @@ -0,0 +1,38 @@ +var Immutable = require('immutable'); + +var Output = require('../../models/output'); +var Book = require('../../models/book'); +var parseBook = require('../../parse/parseBook'); +var createMockFS = require('../../fs/mock'); +var preparePlugins = require('../preparePlugins'); + +/** + * Create an output using a generator + * + * FOR TESTING PURPOSE ONLY + * + * @param {Generator} generator + * @param {Map<String:String|Map>} files + * @return {Promise<Output>} + */ +function createMockOutput(generator, files, options) { + var fs = createMockFS(files); + var book = Book.createForFS(fs); + var state = generator.State? generator.State({}) : Immutable.Map(); + + book = book.setLogLevel('disabled'); + options = generator.Options(options); + + return parseBook(book) + .then(function(resultBook) { + return new Output({ + book: resultBook, + options: options, + state: state, + generator: generator.name + }); + }) + .then(preparePlugins); +} + +module.exports = createMockOutput; diff --git a/lib/output/__tests__/ebook.js b/lib/output/__tests__/ebook.js index bcac990..9266e9f 100644 --- a/lib/output/__tests__/ebook.js +++ b/lib/output/__tests__/ebook.js @@ -1,4 +1,4 @@ -var generateMock = require('../generateMock'); +var generateMock = require('./generateMock'); var EbookGenerator = require('../ebook'); describe('EbookGenerator', function() { diff --git a/lib/output/generateMock.js b/lib/output/__tests__/generateMock.js index ac1e193..691ee2d 100644 --- a/lib/output/generateMock.js +++ b/lib/output/__tests__/generateMock.js @@ -1,21 +1,20 @@ var tmp = require('tmp'); -var Book = require('../models/book'); -var createMockFS = require('../fs/mock'); -var parseBook = require('../parse/parseBook'); -var generateBook = require('./generateBook'); - +var Book = require('../../models/book'); +var createMockFS = require('../../fs/mock'); +var parseBook = require('../../parse/parseBook'); +var generateBook = require('../generateBook'); /** - Generate a book using JSON generator - And returns the path to the output dir. - - FOR TESTING PURPOSE ONLY - - @param {Generator} - @param {Map<String:String|Map>} files - @return {Promise<String>} -*/ + * Generate a book using a generator + * And returns the path to the output dir. + * + * FOR TESTING PURPOSE ONLY + * + * @param {Generator} + * @param {Map<String:String|Map>} files + * @return {Promise<String>} + */ function generateMock(Generator, files) { var fs = createMockFS(files); var book = Book.createForFS(fs); diff --git a/lib/output/__tests__/json.js b/lib/output/__tests__/json.js index 9897813..12ab567 100644 --- a/lib/output/__tests__/json.js +++ b/lib/output/__tests__/json.js @@ -1,4 +1,4 @@ -var generateMock = require('../generateMock'); +var generateMock = require('./generateMock'); var JSONGenerator = require('../json'); describe('JSONGenerator', function() { diff --git a/lib/output/__tests__/website.js b/lib/output/__tests__/website.js index 501503a..1f8c3c0 100644 --- a/lib/output/__tests__/website.js +++ b/lib/output/__tests__/website.js @@ -1,5 +1,5 @@ var fs = require('fs'); -var generateMock = require('../generateMock'); +var generateMock = require('./generateMock'); var WebsiteGenerator = require('../website'); describe('WebsiteGenerator', function() { diff --git a/lib/output/generateBook.js b/lib/output/generateBook.js index 3c10b1a..46712bd 100644 --- a/lib/output/generateBook.js +++ b/lib/output/generateBook.js @@ -13,13 +13,12 @@ var generateAssets = require('./generateAssets'); var generatePages = require('./generatePages'); /** - Process an output to generate the book - - @param {Generator} generator - @param {Output} output - - @return {Promise<Output>} -*/ + * Process an output to generate the book + * + * @param {Generator} generator + * @param {Output} output + * @return {Promise<Output>} + */ function processOutput(generator, startOutput) { return Promise(startOutput) .then(preparePlugins) @@ -133,27 +132,26 @@ function processOutput(generator, startOutput) { } /** - Generate a book using a generator. - - The overall process is: - 1. List and load plugins for this book - 2. Call hook "config" - 3. Call hook "init" - 4. Initialize generator - 5. List all assets and pages - 6. Copy all assets to output - 7. Generate all pages - 8. Call hook "finish:before" - 9. Finish generation - 10. Call hook "finish" - - - @param {Generator} generator - @param {Book} book - @param {Object} options - - @return {Promise<Output>} -*/ + * Generate a book using a generator. + * + * The overall process is: + * 1. List and load plugins for this book + * 2. Call hook "config" + * 3. Call hook "init" + * 4. Initialize generator + * 5. List all assets and pages + * 6. Copy all assets to output + * 7. Generate all pages + * 8. Call hook "finish:before" + * 9. Finish generation + * 10. Call hook "finish" + * + * + * @param {Generator} generator + * @param {Book} book + * @param {Object} options + * @return {Promise<Output>} + */ function generateBook(generator, book, options) { options = generator.Options(options); var state = generator.State? generator.State({}) : Immutable.Map(); diff --git a/lib/output/preparePlugins.js b/lib/output/preparePlugins.js index 54837ed..5c4be93 100644 --- a/lib/output/preparePlugins.js +++ b/lib/output/preparePlugins.js @@ -2,11 +2,11 @@ var Plugins = require('../plugins'); var Promise = require('../utils/promise'); /** - Load and setup plugins - - @param {Output} - @return {Promise<Output>} -*/ + * Load and setup plugins + * + * @param {Output} + * @return {Promise<Output>} + */ function preparePlugins(output) { var book = output.getBook(); diff --git a/lib/output/website/__tests__/i18n.js b/lib/output/website/__tests__/i18n.js new file mode 100644 index 0000000..fd610fb --- /dev/null +++ b/lib/output/website/__tests__/i18n.js @@ -0,0 +1,38 @@ +var createMockOutput = require('../../__tests__/createMock'); +var prepareI18n = require('../prepareI18n'); +var createTemplateEngine = require('../createTemplateEngine'); + +var WebsiteGenerator = require('../'); + +describe('i18n', function() { + it('should correctly use english as default language', function() { + return createMockOutput(WebsiteGenerator, { + 'README.md': 'Hello World' + }) + .then(function(output) { + return prepareI18n(output); + }) + .then(function(output) { + var engine = createTemplateEngine(output, 'README.md'); + var t = engine.getFilters().get('t'); + + expect(t('SUMMARY_INTRODUCTION')).toEqual('Introduction'); + }); + }); + + it('should correctly use language from book.json', function() { + return createMockOutput(WebsiteGenerator, { + 'README.md': 'Hello World', + 'book.json': JSON.stringify({ language: 'fr' }) + }) + .then(function(output) { + return prepareI18n(output); + }) + .then(function(output) { + var engine = createTemplateEngine(output, 'README.md'); + var t = engine.getFilters().get('t'); + + expect(t('GITBOOK_LINK')).toEqual('Publié avec GitBook'); + }); + }); +}); diff --git a/lib/output/website/createTemplateEngine.js b/lib/output/website/createTemplateEngine.js index c60b3a1..02ec796 100644 --- a/lib/output/website/createTemplateEngine.js +++ b/lib/output/website/createTemplateEngine.js @@ -18,19 +18,19 @@ var fileToURL = require('../helper/fileToURL'); var resolveFileToURL = require('../helper/resolveFileToURL'); /** - Directory for a theme with the templates -*/ + * Directory for a theme with the templates + */ function templateFolder(dir) { return path.join(dir, templatesFolder); } /** - Create templating engine to render themes - - @param {Output} output - @param {String} currentFile - @return {TemplateEngine} -*/ + * Create templating engine to render themes + * + * @param {Output} output + * @param {String} currentFile + * @return {TemplateEngine} + */ function createTemplateEngine(output, currentFile) { var book = output.getBook(); var state = output.getState(); @@ -47,18 +47,17 @@ function createTemplateEngine(output, currentFile) { var loader = new Templating.ThemesLoader(tplSearchPaths); // Get languages - var language = config.get('language'); + var language = config.getValue('language'); // Create API context var context = Api.encodeGlobal(output); /** - Check if a file exists - - @param {String} fileName - @return {Boolean} - */ + * Check if a file exists + * @param {String} fileName + * @return {Boolean} + */ function fileExists(fileName) { if (!fileName) { return false; @@ -69,11 +68,10 @@ function createTemplateEngine(output, currentFile) { } /** - Return an article by its path - - @param {String} filePath - @return {Object|undefined} - */ + * Return an article by its path + * @param {String} filePath + * @return {Object|undefined} + */ function getArticleByPath(filePath) { var article = summary.getByPath(filePath); if (!article) return undefined; @@ -82,11 +80,10 @@ function createTemplateEngine(output, currentFile) { } /** - Return a page by its path - - @param {String} filePath - @return {Object|undefined} - */ + * Return a page by its path + * @param {String} filePath + * @return {Object|undefined} + */ function getPageByPath(filePath) { var page = output.getPage(filePath); if (!page) return undefined; @@ -94,7 +91,6 @@ function createTemplateEngine(output, currentFile) { return JSONUtils.encodePage(page, summary); } - return TemplateEngine.create({ loader: loader, @@ -108,17 +104,17 @@ function createTemplateEngine(output, currentFile) { filters: defaultFilters.merge({ /** - Translate a sentence - */ + * Translate a sentence + */ t: function t(s) { return i18n.t(language, s); }, /** - Resolve an absolute file path into a - relative path. - it also resolve pages - */ + * Resolve an absolute file path into a + * relative path. + * it also resolve pages + */ resolveFile: function(filePath) { filePath = resolveFileToURL(output, filePath); return LocationUtils.relativeForFile(currentFile, filePath); diff --git a/lib/output/website/prepareI18n.js b/lib/output/website/prepareI18n.js index b57d178..cedd3b9 100644 --- a/lib/output/website/prepareI18n.js +++ b/lib/output/website/prepareI18n.js @@ -5,11 +5,11 @@ var Promise = require('../../utils/promise'); var listSearchPaths = require('./listSearchPaths'); /** - Prepare i18n, load translations from plugins and book - - @param {Output} - @return {Promise<Output>} -*/ + * Prepare i18n, load translations from plugins and book + * + * @param {Output} + * @return {Promise<Output>} + */ function prepareI18n(output) { var state = output.getState(); var i18n = state.getI18n(); |