diff options
author | Samy Pesse <samypesse@gmail.com> | 2016-04-24 00:15:38 +0200 |
---|---|---|
committer | Samy Pesse <samypesse@gmail.com> | 2016-04-24 00:15:38 +0200 |
commit | c3275a4aa985710c0fcc9d3f7104bc5ebed2eb04 (patch) | |
tree | e072d9aa0bdc59879d105a777a60010491971b56 /lib | |
parent | 927185d95c9875a9b74d176b93669ebdbceecd14 (diff) | |
download | gitbook-c3275a4aa985710c0fcc9d3f7104bc5ebed2eb04.zip gitbook-c3275a4aa985710c0fcc9d3f7104bc5ebed2eb04.tar.gz gitbook-c3275a4aa985710c0fcc9d3f7104bc5ebed2eb04.tar.bz2 |
Parse multilingual books
Diffstat (limited to 'lib')
-rw-r--r-- | lib/models/book.js | 41 | ||||
-rw-r--r-- | lib/parse/index.js | 3 | ||||
-rw-r--r-- | lib/parse/parseBook.js | 55 | ||||
-rw-r--r-- | lib/parse/parseLanguages.js | 22 |
4 files changed, 112 insertions, 9 deletions
diff --git a/lib/models/book.js b/lib/models/book.js index da0deee..62faba6 100644 --- a/lib/models/book.js +++ b/lib/models/book.js @@ -27,7 +27,14 @@ var Book = Immutable.Record({ readme: Readme(), summary: Summary(), glossary: Glossary(), - languages: Languages() + languages: Languages(), + + + // Parent of this book, if multilingual + parent: null, + + // List of children, if multilingual + books: Immutable.List() }); Book.prototype.getLogger = function() { @@ -62,8 +69,12 @@ Book.prototype.getLanguages = function() { return this.get('languages'); }; -Book.prototype.getPages = function() { - return this.get('pages'); +Book.prototype.getParent = function() { + return this.get('parent'); +}; + +Book.prototype.getBooks = function() { + return this.get('books'); }; /** @@ -132,6 +143,15 @@ Book.prototype.getPage = function(ref) { }; /** + Is this book the parent of language's books + + @return {Boolean} +*/ +Book.prototype.isMultilingual = function() { + return (this.getLanguages().getList().size > 0); +}; + +/** Create a book using a filesystem @param {FS} fs @@ -143,4 +163,19 @@ Book.createForFS = function createForFS(fs) { }); }; +/** + Create a language book from a parent + + @param {Book} parent + @param {String} basePath: folder o the book in the parent + @return {Book} +*/ +Book.createFromParent = function createFromParent(parent, basePath) { + return new Book({ + logger: parent.getLogger(), + parent: parent, + fs: FS.reduceScope(book.getFS(), basePath) + }); +}; + module.exports = Book; diff --git a/lib/parse/index.js b/lib/parse/index.js index 58561fb..785b67e 100644 --- a/lib/parse/index.js +++ b/lib/parse/index.js @@ -7,5 +7,6 @@ module.exports = { parseConfig: require('./parseConfig'), parsePagesList: require('./parsePagesList'), parseIgnore: require('./parseIgnore'), - listAssets: require('./listAssets') + listAssets: require('./listAssets'), + parseLanguages: require('./parseLanguages') }; diff --git a/lib/parse/parseBook.js b/lib/parse/parseBook.js index 4af1768..3a7d845 100644 --- a/lib/parse/parseBook.js +++ b/lib/parse/parseBook.js @@ -1,11 +1,52 @@ var Promise = require('../utils/promise'); +var Book = require('../models/book'); var parseIgnore = require('./parseIgnore'); var parseConfig = require('./parseConfig'); var parseGlossary = require('./parseGlossary'); var parseSummary = require('./parseSummary'); var parseReadme = require('./parseReadme'); -//var parseLanguages = require('./parseLanguages'); +var parseLanguages = require('./parseLanguages'); + +/** + Parse content of a book + + @param {Book} book + @return {Promise<Book>} +*/ +function parseBookContent(book) { + return Promise(book) + .then(parseReadme) + .then(parseSummary) + .then(parseGlossary); +} + +/** + Parse a multilingual book + + @param {Book} book + @return {Promise<Book>} +*/ +function parseMultilingualBook(book) { + var languages = book.getLanguages(); + var langList = languages.getList(); + + return Promise.reduce(langList, function(currentBook, lang) { + var child = Book.createFromParent(currentBook, lang.getPath()); + + return Promise(child) + .then(parseIgnore) + .then(parseConfig) + .then(parseBookContent) + .then(function(result) { + var books = currentBook.getBooks(); + books = books.push(result); + + return currentBook.set('books', books); + }); + }, book); +} + /** Parse a whole book from a filesystem @@ -17,10 +58,14 @@ function parseBook(book) { return Promise(book) .then(parseIgnore) .then(parseConfig) - //.then(parseLanguages) - .then(parseReadme) - .then(parseSummary) - .then(parseGlossary); + .then(parseLanguages) + .then(function(resultBook) { + if (book.isMultilingual()) { + return parseMultilingualBook(resultBook); + } else { + return parseBookContent(resultBook); + } + }); } module.exports = parseBook; diff --git a/lib/parse/parseLanguages.js b/lib/parse/parseLanguages.js new file mode 100644 index 0000000..d78881f --- /dev/null +++ b/lib/parse/parseLanguages.js @@ -0,0 +1,22 @@ +var parseStructureFile = require('./parseStructureFile'); +var Languages = require('../models/languages'); + +/** + Parse languages list from book + + @param {Book} book + @return {Promise<Book>} +*/ +function parseLanguages(book) { + return parseStructureFile(book, 'langs') + .spread(function(file, result) { + if (!file) { + return; + } + + var languages = Languages.createFromList(file, result); + return book.set('languages', languages); + }); +} + +module.exports = parseLanguages; |