summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-04-25 10:32:44 +0200
committerSamy Pessé <samypesse@gmail.com>2016-04-25 10:32:44 +0200
commit4646ed8f4af184a33280d8fe1f978c7da5404725 (patch)
treeb8c3102e539e4ff72a10536dd626c94ac5501b0c
parent3f5c8acb3cdbf71c429ad331d23698cc53358746 (diff)
downloadgitbook-4646ed8f4af184a33280d8fe1f978c7da5404725.zip
gitbook-4646ed8f4af184a33280d8fe1f978c7da5404725.tar.gz
gitbook-4646ed8f4af184a33280d8fe1f978c7da5404725.tar.bz2
Fix plugins loading
-rw-r--r--book.js2
-rw-r--r--lib/json/encodeBookWithPage.js2
-rw-r--r--lib/json/encodeGlossary.js2
-rw-r--r--lib/json/encodeReadme.js2
-rw-r--r--lib/models/output.js9
-rw-r--r--lib/models/plugin.js2
-rw-r--r--lib/models/summary.js11
-rw-r--r--lib/output/callHook.js6
-rw-r--r--lib/output/generateAssets.js3
-rw-r--r--lib/output/generateBook.js39
-rw-r--r--lib/output/generatePages.js9
-rw-r--r--lib/output/getModifiers.js8
-rw-r--r--lib/output/json/onPage.js4
-rw-r--r--lib/output/modifiers/modifyHTML.js3
-rw-r--r--lib/output/prepareAssets.js3
-rw-r--r--lib/output/preparePages.js3
-rw-r--r--lib/output/writer/writePage.js6
-rw-r--r--lib/parse/parseGlossary.js5
-rw-r--r--lib/parse/parseLanguages.js8
-rw-r--r--lib/parse/parseReadme.js4
-rw-r--r--lib/parse/parseSummary.js4
-rw-r--r--lib/plugins/loadForBook.js8
-rw-r--r--lib/plugins/loadPlugin.js1
-rw-r--r--lib/plugins/validatePlugin.js13
-rw-r--r--lib/utils/promise.js36
-rw-r--r--test.js5
26 files changed, 166 insertions, 32 deletions
diff --git a/book.js b/book.js
index d6afa1f..a1df67c 100644
--- a/book.js
+++ b/book.js
@@ -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
diff --git a/test.js b/test.js
index 8265683..0de26b7 100644
--- a/test.js
+++ b/test.js
@@ -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);