-
Notifications
You must be signed in to change notification settings - Fork 23
/
index.js
71 lines (56 loc) · 1.86 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
var utils = require('loader-utils');
var fs = require('fs');
var path = require('path');
var nunjucks = require('nunjucks');
var NunjucksLoader = nunjucks.Loader.extend({
//Based off of the Nunjucks 'FileSystemLoader'
init: function(searchPaths, sourceFoundCallback) {
this.sourceFoundCallback = sourceFoundCallback;
if(searchPaths) {
searchPaths = Array.isArray(searchPaths) ? searchPaths : [searchPaths];
// For windows, convert to forward slashes
this.searchPaths = searchPaths.map(path.normalize);
}
else {
this.searchPaths = ['.'];
}
},
getSource: function(name) {
var fullpath = null;
var paths = this.searchPaths;
for(var i=0; i<paths.length; i++) {
var basePath = path.resolve(paths[i]);
var p = path.resolve(paths[i], name);
// Only allow the current directory and anything
// underneath it to be searched
if(p.indexOf(basePath) === 0 && fs.existsSync(p)) {
fullpath = p;
break;
}
}
if(!fullpath) {
return null;
}
this.sourceFoundCallback(fullpath);
return {
src: fs.readFileSync(fullpath, 'utf-8'),
path: fullpath,
noCache: this.noCache
};
}
});
module.exports = function(content) {
this.cacheable();
var callback = this.async();
var opt = utils.parseQuery(this.query);
var nunjucksSearchPaths = opt.searchPaths;
var nunjucksContext = opt.context;
var loader = new NunjucksLoader(nunjucksSearchPaths, function(path) {
this.addDependency(path);
}.bind(this));
var nunjEnv = new nunjucks.Environment(loader);
nunjucks.configure(null, { watch: false });
var template = nunjucks.compile(content, nunjEnv);
html = template.render(nunjucksContext);
callback(null, html);
};