summaryrefslogtreecommitdiffstats
path: root/lib/template
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-03-22 10:54:47 +0100
committerSamy Pessé <samypesse@gmail.com>2016-03-22 10:59:25 +0100
commite07719a86c779c8777bae4969313023b37dc671e (patch)
treea46398a30357304e3a414fab34cf69aaf1ffa163 /lib/template
parentfa5bee6ca374108ba806442cc7f7c422df8811c4 (diff)
downloadgitbook-e07719a86c779c8777bae4969313023b37dc671e.zip
gitbook-e07719a86c779c8777bae4969313023b37dc671e.tar.gz
gitbook-e07719a86c779c8777bae4969313023b37dc671e.tar.bz2
Fix template search paths to use plugins listed first
Diffstat (limited to 'lib/template')
-rw-r--r--lib/template/fs-loader.js25
1 files changed, 22 insertions, 3 deletions
diff --git a/lib/template/fs-loader.js b/lib/template/fs-loader.js
index 00c4743..7f469bb 100644
--- a/lib/template/fs-loader.js
+++ b/lib/template/fs-loader.js
@@ -13,7 +13,7 @@ function isRelative(filename) {
var Loader = nunjucks.Loader.extend({
init: function(searchPaths) {
- this.searchPaths = searchPaths.map(path.normalize);
+ this.searchPaths = _.map(searchPaths, path.normalize);
},
getSource: function(fullpath) {
@@ -38,18 +38,37 @@ var Loader = nunjucks.Loader.extend({
},
resolve: function(from, to) {
+ var searchPaths = this.searchPaths;
+
// Relative template like "./test.html"
if (isRelative(to) && from) {
return path.resolve(path.dirname(from), to);
}
+ // Determine in which search folder we currently are
+ var originalSearchPath = _.chain(this.searchPaths)
+ .sortBy(function(s) {
+ return -s.length;
+ })
+ .find(function(basePath) {
+ return (from && from.indexOf(basePath) === 0);
+ })
+ .value();
+ var originalFilename = originalSearchPath? path.relative(originalSearchPath, from) : null;
+
+ // If we are including same file from a different search path
+ // Slice the search paths to avoid including from previous ones
+ if (originalFilename == to) {
+ var currentIndex = searchPaths.indexOf(originalSearchPath);
+ searchPaths = searchPaths.slice(currentIndex + 1);
+ }
+
// Absolute template to resolve in root folder
- var resultFolder = _.find(this.searchPaths, function(basePath) {
+ var resultFolder = _.find(searchPaths, function(basePath) {
var p = path.resolve(basePath, to);
return (
p.indexOf(basePath) === 0
- && p != from
&& fs.existsSync(p)
);
});