diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-10-20 17:08:44 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-10-20 17:08:44 +0200 |
commit | ba5f9132c9ef27a3922f475646ddff3a419cb372 (patch) | |
tree | a5f5e51960e075803302540b29b27dc96ca4e91b | |
parent | 991681daa2357b8649e40ae9f04e58c88ba0d23f (diff) | |
download | gitbook-ba5f9132c9ef27a3922f475646ddff3a419cb372.zip gitbook-ba5f9132c9ef27a3922f475646ddff3a419cb372.tar.gz gitbook-ba5f9132c9ef27a3922f475646ddff3a419cb372.tar.bz2 |
Fix #982: fix shortcuts for included templates
-rw-r--r-- | lib/conrefs_loader.js | 30 | ||||
-rw-r--r-- | lib/template.js | 30 |
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) { |