mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-18 00:25:07 +00:00
62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
var _ = require('lodash');
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var nunjucks = require('nunjucks');
|
|
|
|
/*
|
|
Nunjucks loader similar to FileSystemLoader, but avoid infinite looping
|
|
*/
|
|
|
|
function isRelative(filename) {
|
|
return (filename.indexOf('./') === 0 || filename.indexOf('../') === 0);
|
|
}
|
|
|
|
var Loader = nunjucks.Loader.extend({
|
|
init: function(searchPaths) {
|
|
this.searchPaths = searchPaths.map(path.normalize);
|
|
},
|
|
|
|
getSource: function(fullpath) {
|
|
if (!fullpath) return null;
|
|
|
|
fullpath = this.resolve(null, fullpath);
|
|
|
|
if(!fullpath) {
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
src: fs.readFileSync(fullpath, 'utf-8'),
|
|
path: fullpath,
|
|
noCache: true
|
|
};
|
|
},
|
|
|
|
// We handle absolute paths ourselves in ".resolve"
|
|
isRelative: function() {
|
|
return true;
|
|
},
|
|
|
|
resolve: function(from, to) {
|
|
// Relative template like "./test.html"
|
|
if (isRelative(to) && from) {
|
|
return path.resolve(path.dirname(from), to);
|
|
}
|
|
|
|
// Absolute template to resolve in root folder
|
|
var resultFolder = _.find(this.searchPaths, function(basePath) {
|
|
var p = path.resolve(basePath, to);
|
|
|
|
return (
|
|
p.indexOf(basePath) === 0
|
|
&& p != from
|
|
&& fs.existsSync(p)
|
|
);
|
|
});
|
|
if (!resultFolder) return null;
|
|
return path.resolve(resultFolder, to);
|
|
}
|
|
});
|
|
|
|
module.exports = Loader;
|