summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--appveyor.yml4
-rw-r--r--lib/api/decodeGlobal.js3
-rw-r--r--lib/api/decodePage.js28
-rw-r--r--lib/fs/mock.js10
-rw-r--r--lib/json/index.js13
-rw-r--r--lib/output/website/createTemplateEngine.js39
-rw-r--r--lib/output/website/onAsset.js2
-rw-r--r--lib/templating/themesLoader.js2
8 files changed, 72 insertions, 29 deletions
diff --git a/appveyor.yml b/appveyor.yml
index b679777..4de816d 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -5,8 +5,8 @@ init:
# Test against these versions of Node.js.
environment:
matrix:
- - nodejs_version: "0.12"
- - nodejs_version: "4.1"
+ - nodejs_version: "5"
+ - nodejs_version: "4"
# Install scripts. (runs after repo cloning)
install:
diff --git a/lib/api/decodeGlobal.js b/lib/api/decodeGlobal.js
index 1b0b135..118afb2 100644
--- a/lib/api/decodeGlobal.js
+++ b/lib/api/decodeGlobal.js
@@ -1,7 +1,8 @@
var decodeConfig = require('./decodeConfig');
/**
- Decode changes from a JS API to a output object
+ Decode changes from a JS API to a output object.
+ Only the configuration can be edited by plugin's hooks
@param {Output} output
@param {Object} result: result from API
diff --git a/lib/api/decodePage.js b/lib/api/decodePage.js
index 5cce56c..e0b7d1e 100644
--- a/lib/api/decodePage.js
+++ b/lib/api/decodePage.js
@@ -1,6 +1,7 @@
/**
- Decode changes from a JS API to a page object
+ Decode changes from a JS API to a page object.
+ Only the content can be edited by plugin's hooks.
@param {Output} output
@param {Page} page: page instance to edit
@@ -8,7 +9,30 @@
@return {Page}
*/
function decodePage(output, page, result) {
- // todo
+ var originalContent = page.getContent();
+
+ // No returned value
+ // Existing content will be used
+ if (!result) {
+ return page;
+ }
+
+ // GitBook 3
+ // Use returned page.content if different from original content
+ if (result.content != originalContent) {
+ return page.set('content', result.content);
+ }
+
+ // GitBook 2 compatibility
+ // Finally, use page.sections
+ if (result.sections) {
+ return page.set('content',
+ result.sections.map(function(section) {
+ return section.content;
+ }).join('\n')
+ );
+ }
+
return page;
}
diff --git a/lib/fs/mock.js b/lib/fs/mock.js
index 6c2670b..2149e1d 100644
--- a/lib/fs/mock.js
+++ b/lib/fs/mock.js
@@ -7,20 +7,14 @@ var FS = require('../models/fs');
var error = require('../utils/error');
/**
- Create a fake filesystem for testing books
+ Create a fake filesystem for unit testing GitBook.
- @param {Map<String:File>}
+ @param {Map<String:String|Map>}
*/
function createMockFS(files) {
files = Immutable.fromJS(files);
var mtime = new Date();
- /**
- Get a file by resolving its path
-
- @param {String}
- @return {String|Map|null}
- */
function getFile(filePath) {
var parts = path.normalize(filePath).split('/');
return parts.reduce(function(list, part, i) {
diff --git a/lib/json/index.js b/lib/json/index.js
index 92b105a..e58beee 100644
--- a/lib/json/index.js
+++ b/lib/json/index.js
@@ -1,9 +1,10 @@
module.exports = {
- encodeBookWithPage: require('./encodeBookWithPage'),
- encodeBook: require('./encodeBook'),
- encodeFile: require('./encodeFile'),
- encodePage: require('./encodePage'),
- encodeSummary: require('./encodeSummary'),
- encodeReadme: require('./encodeReadme')
+ encodeBookWithPage: require('./encodeBookWithPage'),
+ encodeBook: require('./encodeBook'),
+ encodeFile: require('./encodeFile'),
+ encodePage: require('./encodePage'),
+ encodeSummary: require('./encodeSummary'),
+ encodeSummaryArticle: require('./encodeSummaryArticle'),
+ encodeReadme: require('./encodeReadme')
};
diff --git a/lib/output/website/createTemplateEngine.js b/lib/output/website/createTemplateEngine.js
index 06e9192..2c2ac8d 100644
--- a/lib/output/website/createTemplateEngine.js
+++ b/lib/output/website/createTemplateEngine.js
@@ -2,18 +2,19 @@ var path = require('path');
var nunjucks = require('nunjucks');
var DoExtension = require('nunjucks-do')(nunjucks);
-var TEMPLATES_FOLDER = require('../../constants/templatesFolder');
-
-var Templating = require('../../templating');
+var JSONUtils = require('../../json');
+var LocationUtils = require('../../utils/location');
var TemplateEngine = require('../../models/templateEngine');
+var templatesFolder = require('../../constants/templatesFolder');
var defaultFilters = require('../../constants/defaultFilters');
+var Templating = require('../../templating');
var listSearchPaths = require('./listSearchPaths');
/**
Directory for a theme with the templates
*/
function templateFolder(dir) {
- return path.join(dir, TEMPLATES_FOLDER);
+ return path.join(dir, templatesFolder);
}
/**
@@ -28,6 +29,7 @@ function createTemplateEngine(output, currentFile) {
var state = output.getState();
var i18n = state.getI18n();
var config = book.getConfig();
+ var summary = book.getSummary();
// Search paths for templates
var searchPaths = listSearchPaths(output);
@@ -43,11 +45,28 @@ function createTemplateEngine(output, currentFile) {
loader: loader,
filters: defaultFilters.merge({
- t: function(s) {
+ /**
+ Translate a sentence
+ */
+ t: function t(s) {
return i18n.t(language, s);
},
+
+ /**
+ Resolve an absolute file path into a
+ relative path
+ */
resolveFile: function(s) {
- return s;
+ // Convert /test.png -> test.png
+ s = LocationUtils.toAbsolute(s, '', '');
+
+ // Convert to relative
+ s = LocationUtils.relative(
+ this.resolve('.') + '/',
+ this.book.resolve(name)
+ );
+
+ return LocationUtils.normalize(s);
},
resolveAsset: function(s) {
return s;
@@ -58,8 +77,14 @@ function createTemplateEngine(output, currentFile) {
contentURL: function(s) {
return s;
},
+
+ /**
+ Return an article by its path
+ */
getArticleByPath: function(s) {
- return undefined;
+ var article = summary.getByPath(s);
+ if (!article) return undefined;
+ return JSONUtils.encodeSummaryArticle(article);
}
}),
diff --git a/lib/output/website/onAsset.js b/lib/output/website/onAsset.js
index 169db56..1311c95 100644
--- a/lib/output/website/onAsset.js
+++ b/lib/output/website/onAsset.js
@@ -2,7 +2,7 @@ var path = require('path');
var fs = require('../../utils/fs');
/**
- Copy an asset to the outptu folder
+ Copy an asset to the output folder
@param {Output} output
@param {Page} page
diff --git a/lib/templating/themesLoader.js b/lib/templating/themesLoader.js
index 2b436a4..69c3879 100644
--- a/lib/templating/themesLoader.js
+++ b/lib/templating/themesLoader.js
@@ -5,9 +5,7 @@ var path = require('path');
var PathUtils = require('../utils/path');
-/**
-*/
var ThemesLoader = nunjucks.Loader.extend({
init: function(searchPaths) {
this.searchPaths = Immutable.List(searchPaths)