summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-10-20 17:08:44 +0200
committerSamy Pessé <samypesse@gmail.com>2015-10-20 17:08:44 +0200
commitba5f9132c9ef27a3922f475646ddff3a419cb372 (patch)
treea5f5e51960e075803302540b29b27dc96ca4e91b
parent991681daa2357b8649e40ae9f04e58c88ba0d23f (diff)
downloadgitbook-ba5f9132c9ef27a3922f475646ddff3a419cb372.zip
gitbook-ba5f9132c9ef27a3922f475646ddff3a419cb372.tar.gz
gitbook-ba5f9132c9ef27a3922f475646ddff3a419cb372.tar.bz2
Fix #982: fix shortcuts for included templates
-rw-r--r--lib/conrefs_loader.js30
-rw-r--r--lib/template.js30
2 files changed, 47 insertions, 13 deletions
diff --git a/lib/conrefs_loader.js b/lib/conrefs_loader.js
index a6c2049..255bf06 100644
--- a/lib/conrefs_loader.js
+++ b/lib/conrefs_loader.js
@@ -1,15 +1,19 @@
-var path = require("path");
-var nunjucks = require("nunjucks");
+var _ = require('lodash');
+var path = require('path');
+var nunjucks = require('nunjucks');
-var git = require("./utils/git");
-var fs = require("./utils/fs");
-var pathUtil = require("./utils/path");
+var git = require('./utils/git');
+var fs = require('./utils/fs');
+var pathUtil = require('./utils/path');
// The loader should handle relative and git url
var BookLoader = nunjucks.Loader.extend({
async: true,
- init: function(book) {
+ init: function(book, opts) {
+ this.opts = _.defaults(opts || {}, {
+ interpolate: _.identity
+ });
this.book = book;
},
@@ -20,14 +24,20 @@ var BookLoader = nunjucks.Loader.extend({
.then(function(filepath) {
// Is local file
if (!filepath) filepath = path.resolve(fileurl);
- else that.book.log.debug.ln("resolve from git", fileurl, "to", filepath);
+ else that.book.log.debug.ln('resolve from git', fileurl, 'to', filepath);
// Read file from absolute path
return fs.readFile(filepath)
.then(function(source) {
+ return that.opts.interpolate(filepath, source.toString());
+ })
+ .then(function(source) {
return {
- src: source.toString(),
- path: filepath
+ src: source,
+ path: filepath,
+
+ // We disable cache sincde content is modified (shortcuts, ...)
+ noCache: true
};
});
})
@@ -53,7 +63,7 @@ var BookLoader = nunjucks.Loader.extend({
return path.resolve(path.dirname(from), to);
},
- // Handle all files as relative, so that nunjucks pass responsability to "resolve"
+ // Handle all files as relative, so that nunjucks pass responsability to 'resolve'
// Only git urls are considered as absolute
isRelative: function(filename) {
return !git.checkUrl(filename);
diff --git a/lib/template.js b/lib/template.js
index 9f32515..dac1201 100644
--- a/lib/template.js
+++ b/lib/template.js
@@ -1,6 +1,8 @@
var _ = require('lodash');
var Q = require('q');
+var path = require('path');
var nunjucks = require('nunjucks');
+var parsers = require('gitbook-parsers');
var escapeStringRegexp = require('escape-string-regexp');
var batch = require('./utils/batch');
@@ -16,12 +18,25 @@ function normBlockResult(blk) {
var TemplateEngine = function(book) {
+ var that = this;
+
this.book = book;
this.log = this.book.log;
+ // Template loader
+ this.loader = new BookLoader(book, {
+ // Replace shortcuts in imported files
+ interpolate: function(filepath, source) {
+ var parser = parsers.get(path.extname(filepath));
+ var type = parser? parser.name : null;
+
+ return that.applyShortcuts(type, source);
+ }
+ });
+
// Nunjucks env
this.env = new nunjucks.Environment(
- new BookLoader(book),
+ this.loader,
{
// Escaping is done after by the markdown parser
autoescape: false,
@@ -67,7 +82,7 @@ TemplateEngine.prototype.processBlock = function(blk) {
// Add to global map
if (toAdd) this.blockBodies[blk.id] = blk;
- //Parsable block, just return it
+ // Parsable block, just return it
if (blk.parse) {
return blk.body;
}
@@ -349,6 +364,11 @@ TemplateEngine.prototype._applyShortcut = function(parser, content, shortcut) {
});
};
+// Apply all shortcuts to some template string
+TemplateEngine.prototype.applyShortcuts = function(type, content) {
+ return _.reduce(this.shortcuts, _.partial(this._applyShortcut.bind(this), type), content);
+};
+
// Render a string from the book
TemplateEngine.prototype.renderString = function(content, context, options) {
context = _.extend({}, context, {
@@ -369,9 +389,13 @@ TemplateEngine.prototype.renderString = function(content, context, options) {
type: null
});
if (options.path) options.path = this.book.resolve(options.path);
+ if (!options.type && options.path) {
+ var parser = parsers.get(path.extname(options.path));
+ options.type = parser? parser.name : null;
+ }
// Replace shortcuts
- content = _.reduce(this.shortcuts, _.partial(this._applyShortcut.bind(this), options.type), content);
+ content = this.applyShortcuts(options.type, content);
return Q.nfcall(this.env.renderString.bind(this.env), content, context, options)
.fail(function(err) {