diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-03-11 10:43:37 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-03-11 10:43:37 +0100 |
commit | 514883f0bd7e44ac9f40482a6f4a44bbcd2e6f53 (patch) | |
tree | 7fde330d94f81ab62c63199c017dce1601cc2044 | |
parent | 27681aad98c0a891a8cbf1a0bc09ea6d292000c5 (diff) | |
download | gitbook-514883f0bd7e44ac9f40482a6f4a44bbcd2e6f53.zip gitbook-514883f0bd7e44ac9f40482a6f4a44bbcd2e6f53.tar.gz gitbook-514883f0bd7e44ac9f40482a6f4a44bbcd2e6f53.tar.bz2 |
Create new loader for nunjucks to avoid infinite loop
-rw-r--r-- | lib/output/website.js | 16 | ||||
-rw-r--r-- | lib/template/fs-loader.js | 44 |
2 files changed, 49 insertions, 11 deletions
diff --git a/lib/output/website.js b/lib/output/website.js index 9c20670..43f732c 100644 --- a/lib/output/website.js +++ b/lib/output/website.js @@ -8,13 +8,10 @@ var Promise = require('../utils/promise'); var location = require('../utils/location'); var fs = require('../utils/fs'); var defaultFilters = require('../template/filters'); +var FSLoader = require('../template/fs-loader'); var conrefsLoader = require('./conrefs'); var Output = require('./base'); -// Tranform a theme ID into a plugin -function themeID(plugin) { - return 'theme-' + plugin; -} // Directory for a theme with the templates function templatesPath(dir) { @@ -58,7 +55,7 @@ WebsiteOutput.prototype.prepare = function() { .then(function() { // This list is ordered to give priority to templates in the book - var searchPaths = _.pluck(this.plugins.list(), 'root'); + var searchPaths = _.pluck(that.plugins.list(), 'root'); // The book itself can contains a "_layouts" folder searchPaths.unshift(that.book.root); @@ -71,7 +68,7 @@ WebsiteOutput.prototype.prepare = function() { that.i18n.load(i18nRoot); }); - that.env = new nunjucks.Environment(new nunjucks.FileSystemLoader(_.map(searchPaths, templatesPath))); + that.env = new nunjucks.Environment(new FSLoader(_.map(searchPaths, templatesPath))); // Add GitBook default filters _.each(defaultFilters, function(fn, filter) { @@ -212,13 +209,10 @@ WebsiteOutput.prototype.outputMultilingualIndex = function() { // Templates are stored in `_layouts` folders WebsiteOutput.prototype.render = function(tpl, context) { var filename = this.templateName(tpl); + context = _.extend(context, { template: { - // Same template but in the default theme - default: this.themeDefault? path.resolve(templatesPath(this.themeDefault.root), filename) : null, - - // Same template but in the theme - theme: path.resolve(templatesPath(this.theme.root), filename) + self: filename }, plugins: { diff --git a/lib/template/fs-loader.js b/lib/template/fs-loader.js new file mode 100644 index 0000000..5720cb5 --- /dev/null +++ b/lib/template/fs-loader.js @@ -0,0 +1,44 @@ +var _ = require('lodash'); +var fs = require('fs'); +var path = require('path'); +var nunjucks = require('nunjucks'); + +/* + Nunjucks loader similar to FileSystemLoader, but avoid infinite looping +*/ + +var Loader = nunjucks.Loader.extend({ + init: function(searchPaths) { + this.searchPaths = searchPaths.map(path.normalize); + }, + + getSource: function(fullpath) { + fullpath = this.resolve(null, fullpath); + + if(!fullpath) { + return null; + } + + return { + src: fs.readFileSync(fullpath, 'utf-8'), + path: fullpath, + noCache: true + }; + }, + + resolve: function(from, to) { + var resultFolder = _.find(this.searchPaths, function(basePath) { + var p = path.resolve(basePath, to); + + return ( + p.indexOf(basePath) === 0 + && p != from + && fs.existsSync(p) + ); + }); + + return path.resolve(resultFolder, to); + } +}); + +module.exports = Loader; |