summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-07-11 16:27:22 +0200
committerSamy Pessé <samypesse@gmail.com>2016-07-11 16:27:22 +0200
commit6b103f4532c23b4855025029ff966abc65092ff3 (patch)
treea7374739337d90e22cbad9375d6ab50ec437d92d /lib
parentd4fa5c18a8049986e224d98738390aac90c411be (diff)
downloadgitbook-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.js4
-rw-r--r--lib/output/__tests__/createMock.js38
-rw-r--r--lib/output/__tests__/ebook.js2
-rw-r--r--lib/output/__tests__/generateMock.js (renamed from lib/output/generateMock.js)27
-rw-r--r--lib/output/__tests__/json.js2
-rw-r--r--lib/output/__tests__/website.js2
-rw-r--r--lib/output/generateBook.js54
-rw-r--r--lib/output/preparePlugins.js10
-rw-r--r--lib/output/website/__tests__/i18n.js38
-rw-r--r--lib/output/website/createTemplateEngine.js58
-rw-r--r--lib/output/website/prepareI18n.js10
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();