diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-04-25 10:32:44 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-04-25 10:32:44 +0200 |
commit | 4646ed8f4af184a33280d8fe1f978c7da5404725 (patch) | |
tree | b8c3102e539e4ff72a10536dd626c94ac5501b0c | |
parent | 3f5c8acb3cdbf71c429ad331d23698cc53358746 (diff) | |
download | gitbook-4646ed8f4af184a33280d8fe1f978c7da5404725.zip gitbook-4646ed8f4af184a33280d8fe1f978c7da5404725.tar.gz gitbook-4646ed8f4af184a33280d8fe1f978c7da5404725.tar.bz2 |
Fix plugins loading
-rw-r--r-- | book.js | 2 | ||||
-rw-r--r-- | lib/json/encodeBookWithPage.js | 2 | ||||
-rw-r--r-- | lib/json/encodeGlossary.js | 2 | ||||
-rw-r--r-- | lib/json/encodeReadme.js | 2 | ||||
-rw-r--r-- | lib/models/output.js | 9 | ||||
-rw-r--r-- | lib/models/plugin.js | 2 | ||||
-rw-r--r-- | lib/models/summary.js | 11 | ||||
-rw-r--r-- | lib/output/callHook.js | 6 | ||||
-rw-r--r-- | lib/output/generateAssets.js | 3 | ||||
-rw-r--r-- | lib/output/generateBook.js | 39 | ||||
-rw-r--r-- | lib/output/generatePages.js | 9 | ||||
-rw-r--r-- | lib/output/getModifiers.js | 8 | ||||
-rw-r--r-- | lib/output/json/onPage.js | 4 | ||||
-rw-r--r-- | lib/output/modifiers/modifyHTML.js | 3 | ||||
-rw-r--r-- | lib/output/prepareAssets.js | 3 | ||||
-rw-r--r-- | lib/output/preparePages.js | 3 | ||||
-rw-r--r-- | lib/output/writer/writePage.js | 6 | ||||
-rw-r--r-- | lib/parse/parseGlossary.js | 5 | ||||
-rw-r--r-- | lib/parse/parseLanguages.js | 8 | ||||
-rw-r--r-- | lib/parse/parseReadme.js | 4 | ||||
-rw-r--r-- | lib/parse/parseSummary.js | 4 | ||||
-rw-r--r-- | lib/plugins/loadForBook.js | 8 | ||||
-rw-r--r-- | lib/plugins/loadPlugin.js | 1 | ||||
-rw-r--r-- | lib/plugins/validatePlugin.js | 13 | ||||
-rw-r--r-- | lib/utils/promise.js | 36 | ||||
-rw-r--r-- | test.js | 5 |
26 files changed, 166 insertions, 32 deletions
@@ -9,7 +9,7 @@ module.exports = { gitbook: '>=3.0.0-pre.0', // Use the "official" theme - plugins: ['theme-official', 'sitemap'], + //plugins: ['theme-official', 'sitemap'], variables: { version: pkg.version diff --git a/lib/json/encodeBookWithPage.js b/lib/json/encodeBookWithPage.js index 26ab174..5600a82 100644 --- a/lib/json/encodeBookWithPage.js +++ b/lib/json/encodeBookWithPage.js @@ -13,7 +13,7 @@ function encodeBookWithPage(book, page) { var file = page.getFile(); var result = encodeBook(book); - result.page = encodePage(page); + result.page = encodePage(page, book.getSummary()); result.file = encodeFile(file); return result; diff --git a/lib/json/encodeGlossary.js b/lib/json/encodeGlossary.js index fcaf4d2..e9bcfc9 100644 --- a/lib/json/encodeGlossary.js +++ b/lib/json/encodeGlossary.js @@ -1,4 +1,4 @@ -var encodeFile = require('./encodeFileToJson'); +var encodeFile = require('./encodeFile'); var encodeGlossaryEntry = require('./encodeGlossaryEntry'); /** diff --git a/lib/json/encodeReadme.js b/lib/json/encodeReadme.js index 0127788..96176a3 100644 --- a/lib/json/encodeReadme.js +++ b/lib/json/encodeReadme.js @@ -1,4 +1,4 @@ -var encodeFile = require('./encodeFileToJson'); +var encodeFile = require('./encodeFile'); /** Encode a readme to JSON diff --git a/lib/models/output.js b/lib/models/output.js index 957d9d3..3e8dab8 100644 --- a/lib/models/output.js +++ b/lib/models/output.js @@ -31,6 +31,15 @@ Output.prototype.getAssets = function() { }; /** + Return logegr for this output (same as book) + + @return {Logger} +*/ +Output.prototype.getLogger = function() { + return this.getBook().getLogger(); +}; + +/** Create an Output instance from a book and a set of options @param {Book} book diff --git a/lib/models/plugin.js b/lib/models/plugin.js index 2f791dc..6891d7d 100644 --- a/lib/models/plugin.js +++ b/lib/models/plugin.js @@ -70,7 +70,7 @@ Plugin.prototype.isLoaded = function() { @return {Map<String:Function>} */ Plugin.prototype.getHooks = function() { - return this.getContent().get('hooks'); + return this.getContent().get('hooks') || Immutable.Map(); }; /** diff --git a/lib/models/summary.js b/lib/models/summary.js index f295a16..4ab2d68 100644 --- a/lib/models/summary.js +++ b/lib/models/summary.js @@ -27,6 +27,17 @@ Summary.prototype.getByLevel = function(level) { return SummaryArticle.getByLevel(this, level, 'getParts'); }; +/** + Return an article by its path + + @param {String} filePath + @return {Part|Article} +*/ +Summary.prototype.getByPath = function(filePath) { + // todo + + return undefined; +}; /** Create a new summary for a list of parts diff --git a/lib/output/callHook.js b/lib/output/callHook.js index f6119fd..8d34bdc 100644 --- a/lib/output/callHook.js +++ b/lib/output/callHook.js @@ -21,12 +21,18 @@ function callHook(name, getArgument, handleResult, output) { getArgument = getArgument || defaultGetArgument; handleResult = handleResult || defaultHandleResult; + var logger = output.getLogger(); var plugins = output.getPlugins(); + logger.debug.ln('calling hook "' + name + '"'); + return Promise(getArgument(output)) .then(function(arg) { return Promise.reduce(plugins, function(prev, plugin) { var hook = plugin.getHook(name); + if (!hook) { + return prev; + } return hook(prev); }, arg); diff --git a/lib/output/generateAssets.js b/lib/output/generateAssets.js index 04ca05d..7a6e104 100644 --- a/lib/output/generateAssets.js +++ b/lib/output/generateAssets.js @@ -9,6 +9,7 @@ var Promise = require('../utils/promise'); */ function generateAssets(generator, output) { var assets = output.getAssets(); + var logger = output.getLogger(); // Is generator ignoring assets? if (!generator.onAsset) { @@ -16,6 +17,8 @@ function generateAssets(generator, output) { } return Promise.reduce(assets, function(out, assetFile) { + logger.debug.ln('copy asset "' + assetFile + '"'); + return generator.onAsset(out, assetFile); }, output); } diff --git a/lib/output/generateBook.js b/lib/output/generateBook.js index c35719b..ca19067 100644 --- a/lib/output/generateBook.js +++ b/lib/output/generateBook.js @@ -62,7 +62,17 @@ function generateBook(generator, book, options) { ) ) - .then(callHook.bind(null, 'init')) + .then( + callHook.bind(null, + 'init', + function(output) { + return {}; + }, + function(output) { + return output; + } + ) + ) .then(function(output) { if (!generator.onInit) { @@ -75,7 +85,16 @@ function generateBook(generator, book, options) { .then(generateAssets.bind(null, generator)) .then(generatePages.bind(null, generator)) - .then(callHook.bind(null, 'finish:before')) + .then(callHook.bind(null, + 'finish:before', + function(output) { + return {}; + }, + function(output) { + return output; + } + ) + ) .then(function(output) { if (!generator.onFinish) { @@ -83,6 +102,22 @@ function generateBook(generator, book, options) { } return generator.onFinish(output); + }) + + /*.then(callHook.bind(null, + 'finish', + function(output) { + return {}; + }, + function(output) { + return output; + } + ) + )*/ + + .then(function(output) { + var logger = output.getLogger(); + logger.info.ok('generation finished with success!'); }); } diff --git a/lib/output/generatePages.js b/lib/output/generatePages.js index 406f242..5ec46f8 100644 --- a/lib/output/generatePages.js +++ b/lib/output/generatePages.js @@ -9,14 +9,19 @@ var Promise = require('../utils/promise'); */ function generatePages(generator, output) { var pages = output.getPages(); + var logger = output.getLogger(); // Is generator ignoring assets? if (!generator.onPage) { return Promise(output); } - return Promise.reduce(pages, function(out, assetFile) { - return generator.onPage(out, assetFile); + return Promise.reduce(pages, function(out, page) { + var file = page.getFile(); + + logger.debug.ln('generate page "' + file.getPath() + '"'); + + return generator.onPage(out, page); }, output); } diff --git a/lib/output/getModifiers.js b/lib/output/getModifiers.js index 96784fe..21a0692 100644 --- a/lib/output/getModifiers.js +++ b/lib/output/getModifiers.js @@ -1,4 +1,4 @@ -var Modifier = require('../modifier'); +var Modifiers = require('./modifiers'); var resolveFile = require('./resolveFile'); /** @@ -14,12 +14,12 @@ function getModifiers(output, page) { var file = page.getFile(); return [ - Modifier.addHeadingId, - Modifier.resolveLinks.bind(null, + Modifiers.addHeadingId, + Modifiers.resolveLinks.bind(null, file.getPath(), resolveFile.bind(null, output) ), - Modifier.annotateText(entries) + Modifiers.annotateText.bind(null, entries) ]; } diff --git a/lib/output/json/onPage.js b/lib/output/json/onPage.js index 8216bb9..5e45662 100644 --- a/lib/output/json/onPage.js +++ b/lib/output/json/onPage.js @@ -1,5 +1,5 @@ var JSONUtils = require('../../json'); -var Modifier = require('../modifier'); +var Modifiers = require('../modifiers'); var Writer = require('../writer'); var getModifiers = require('../getModifiers'); @@ -10,7 +10,7 @@ var getModifiers = require('../getModifiers'); @param {Page} page */ function onPage(output, page) { - return Modifier.modifyHTML(page, getModifiers(output, page)) + return Modifiers.modifyHTML(page, getModifiers(output, page)) .then(function(resultPage) { // Generate the JSON var json = JSONUtils.encodeBookWithPage(output.getBook(), resultPage); diff --git a/lib/output/modifiers/modifyHTML.js b/lib/output/modifiers/modifyHTML.js index d46a44f..0fcf994 100644 --- a/lib/output/modifiers/modifyHTML.js +++ b/lib/output/modifiers/modifyHTML.js @@ -16,7 +16,8 @@ function modifyHTML(page, operations) { return Promise.forEach(operations, function(op) { op($); }) - .then(function(resultHTML) { + .then(function() { + var resultHTML = $.html(); return page.set('content', resultHTML); }); } diff --git a/lib/output/prepareAssets.js b/lib/output/prepareAssets.js index 19aabef..ae9b55a 100644 --- a/lib/output/prepareAssets.js +++ b/lib/output/prepareAssets.js @@ -9,9 +9,12 @@ var Parse = require('../parse'); function prepareAssets(output) { var book = output.getBook(); var pages = output.getPages(); + var logger = output.getLogger(); return Parse.listAssets(book, pages) .then(function(assets) { + logger.info.ln('found', assets.size, 'asset files'); + return output.set('assets', assets); }); } diff --git a/lib/output/preparePages.js b/lib/output/preparePages.js index 396edde..8ad5f8c 100644 --- a/lib/output/preparePages.js +++ b/lib/output/preparePages.js @@ -8,9 +8,12 @@ var Parse = require('../parse'); */ function preparePages(output) { var book = output.getBook(); + var logger = book.getLogger(); return Parse.parsePagesList(book) .then(function(pages) { + logger.info.ln('found', pages.size, 'pages'); + return output.set('pages', pages); }); } diff --git a/lib/output/writer/writePage.js b/lib/output/writer/writePage.js index 23e37d0..6bcc1ba 100644 --- a/lib/output/writer/writePage.js +++ b/lib/output/writer/writePage.js @@ -27,7 +27,11 @@ function writePage(output, page, content, options) { var fileName = PathUtils.setExtension(file.getPath(), options.get('extension')); var filePath = path.join(rootFolder, fileName); - return fs.writeFile(filePath, content); + return fs.ensure(filePath) + .then(function() { + return fs.writeFile(filePath, content); + }) + .thenResolve(output); } module.exports = writePage; diff --git a/lib/parse/parseGlossary.js b/lib/parse/parseGlossary.js index f56c751..1dbfbe0 100644 --- a/lib/parse/parseGlossary.js +++ b/lib/parse/parseGlossary.js @@ -8,12 +8,17 @@ var Glossary = require('../models/glossary'); @return {Promise<Book>} */ function parseGlossary(book) { + var logger = book.getLogger(); + return parseStructureFile(book, 'glossary') .spread(function(file, entries) { if (!file) { return book; } + + logger.debug.ln('glossary index file found at', file.getPath()); + var glossary = Glossary.createFromEntries(file, entries); return book.set('glossary', glossary); }); diff --git a/lib/parse/parseLanguages.js b/lib/parse/parseLanguages.js index d78881f..346f3a3 100644 --- a/lib/parse/parseLanguages.js +++ b/lib/parse/parseLanguages.js @@ -8,13 +8,19 @@ var Languages = require('../models/languages'); @return {Promise<Book>} */ function parseLanguages(book) { + var logger = book.getLogger(); + return parseStructureFile(book, 'langs') .spread(function(file, result) { if (!file) { - return; + return book; } var languages = Languages.createFromList(file, result); + + logger.debug.ln('languages index file found at', file.getPath()); + logger.info.ln('parsing multilingual book, with', languages.getList().size, 'languages'); + return book.set('languages', languages); }); } diff --git a/lib/parse/parseReadme.js b/lib/parse/parseReadme.js index ea6ef59..a2ede77 100644 --- a/lib/parse/parseReadme.js +++ b/lib/parse/parseReadme.js @@ -10,12 +10,16 @@ var error = require('../utils/error'); @return {Promise<Book>} */ function parseReadme(book) { + var logger = book.getLogger(); + return parseStructureFile(book, 'readme') .spread(function(file, result) { if (!file) { throw new error.FileNotFoundError({ filename: 'README' }); } + logger.debug.ln('readme found at', file.getPath()); + var readme = Readme.create(file, result); return book.set('readme', readme); }); diff --git a/lib/parse/parseSummary.js b/lib/parse/parseSummary.js index 3fb471e..fc34446 100644 --- a/lib/parse/parseSummary.js +++ b/lib/parse/parseSummary.js @@ -8,11 +8,15 @@ var Summary = require('../models/summary'); @return {Promise<Book>} */ function parseSummary(book) { + var logger = book.getLogger(); + return parseStructureFile(book, 'summary') .spread(function(file, result) { if (!file) { + logger.warn.ln('no summary file in this book'); return book; } + logger.debug.ln('summary file found at', file.getPath()); var summary = Summary.createFromParts(file, result.parts); return book.set('summary', summary); diff --git a/lib/plugins/loadForBook.js b/lib/plugins/loadForBook.js index fcfac08..9494696 100644 --- a/lib/plugins/loadForBook.js +++ b/lib/plugins/loadForBook.js @@ -1,7 +1,7 @@ var Promise = require('../utils/promise'); var listForBook = require('./listForBook'); -var listInstalledForBook = require('./listInstalledForBook'); +var findForBook = require('./findForBook'); var loadPlugin = require('./loadPlugin'); @@ -14,9 +14,9 @@ var loadPlugin = require('./loadPlugin'); function loadForBook(book) { var logger = book.getLogger(); var requirements = listForBook(book); - var requirementsKeys = requirements.keys().toList(); + var requirementsKeys = requirements.keySeq().toList(); - return listInstalledForBook(book) + return findForBook(book) .then(function(installed) { // Filter out plugins not listed of first level // (aka pre-installed plugins) @@ -48,7 +48,7 @@ function loadForBook(book) { } return Promise.map(installed, function(plugin) { - return loadPlugin(plugin); + return loadPlugin(book, plugin); }); }); } diff --git a/lib/plugins/loadPlugin.js b/lib/plugins/loadPlugin.js index 375329e..39e2e33 100644 --- a/lib/plugins/loadPlugin.js +++ b/lib/plugins/loadPlugin.js @@ -26,7 +26,6 @@ function loadPlugin(book, plugin) { var name = plugin.getName(); var pkgPath = plugin.getPath(); - // Try loading plugins from different location var p = Promise() .then(function() { diff --git a/lib/plugins/validatePlugin.js b/lib/plugins/validatePlugin.js index 37f6900..4baa911 100644 --- a/lib/plugins/validatePlugin.js +++ b/lib/plugins/validatePlugin.js @@ -14,20 +14,21 @@ function validatePlugin(plugin) { var isValid = ( plugin.isLoaded() && packageInfos && - packageInfos.name && - packageInfos.engines && - packageInfos.engines.gitbook + packageInfos.get('name') && + packageInfos.get('engines') && + packageInfos.get('engines').get('gitbook') ); if (!isValid) { return Promise.reject(new Error('Error loading plugin "' + plugin.getName() + '" at "' + plugin.getPath() + '"')); } - if (!gitbook.satisfies(this.packageInfos.engines.gitbook)) { - return Promise.reject(new Error('GitBook doesn\'t satisfy the requirements of this plugin: ' + packageInfos.engines.gitbook)); + var engine = packageInfos.get('engines').get('gitbook'); + if (!gitbook.satisfies(engine)) { + return Promise.reject(new Error('GitBook doesn\'t satisfy the requirements of this plugin: ' + engine)); } - return Promise(); + return Promise(plugin); } module.exports = validatePlugin; diff --git a/lib/utils/promise.js b/lib/utils/promise.js index b0cfb34..b8ab63c 100644 --- a/lib/utils/promise.js +++ b/lib/utils/promise.js @@ -9,7 +9,7 @@ var Immutable = require('immutable'); @return {Promise<Mixed>} */ function reduce(arr, iter, base) { - arr = Immutable.List(arr); + arr = Immutable.Iterable.isIterable(arr)? arr : Immutable.List(arr); return arr.reduce(function(prev, elem, i) { return prev.then(function(val) { @@ -74,7 +74,7 @@ function some(arr, iter) { @param {Function(element, index)} @return {Promise<List>} */ -function map(arr, iter) { +function mapAsList(arr, iter) { return reduce(arr, function(prev, entry, i) { return Q(iter(entry, i)) .then(function(out) { @@ -85,6 +85,38 @@ function map(arr, iter) { } /** + Map an array or map + + @param {Array|List|Map|OrderedMap} arr + @param {Function(element, key)} + @return {Promise<List|Map|OrderedMap>} +*/ +function map(arr, iter) { + if (Immutable.Map.isMap(arr)) { + var type = 'Map'; + if (Immutable.OrderedMap.isOrderedMap(arr)) { + type = 'OrderedMap'; + } + + return mapAsList(arr, function(value, key) { + return Q(iter(value, key)) + .then(function(result) { + return [key, result]; + }); + }) + .then(function(result) { + return Immutable[type](result); + }); + } else { + return mapAsList(arr, iter) + .then(function(result) { + return Immutable.List(result); + }); + } +} + + +/** Wrap a fucntion in a promise @param {Function} func @@ -1,6 +1,7 @@ var path = require('path'); var gitbook = require('./lib'); +var Output = require('./lib/output'); var NodeFS = require('./lib/fs/node'); @@ -15,7 +16,9 @@ var book = gitbook.Book.createForFS(fs); // Parse the book gitbook.Parse.parseBook(book) .then(function(_book) { - return gitbook.Parse.parsePagesList(_book); + return Output.generate(Output.JSONGenerator, _book, { + root: path.join(__dirname, '_book') + }); }) .then(function(pages) { //console.log('parsed', pages); |