-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
108 lines (87 loc) · 2.07 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
var common = require('common');
var ejs = require('ejs');
var fs = require('fs');
var adds = {};
var creates = {};
adds.raw = function(filename, callback) {
fs.readFile(filename, 'utf-8', callback);
};
creates.file = function(locals, options) {
return function(filename, locals, callback) {
var opt = common.join(options);
if (!callback) {
callback = locals;
locals = options.locals;
} else {
locals = common.join(options.locals, locals);
}
opt.locals = locals;
exports.renderFile(filename, opt, callback);
};
};
exports.add = function(name, fn) {
adds[name] = fn;
return exports;
};
exports.create = function(name, fn) {
creates[name] = fn;
return exports;
};
exports.renderFile = function(filename, options, callback) {
if (!callback) {
callback = options;
options = {};
}
fs.readFile(filename, 'utf-8', common.fork(callback, function(src) {
exports.render(src, options, callback);
}));
};
exports.render = function(src, options, callback) {
if (!callback) {
callback = options;
options = {};
}
options.locals = options.locals || {};
var fns = options.fns;
if (!fns) {
options.fns = fns = {};
for (var i in adds) {
fns[i] = adds[i];
}
for (var i in creates) {
fns[i] = creates[i](options.locals, options);
}
}
common.step([
function(next) {
var args = [];
Object.keys(fns).forEach(function(name) {
options.locals[name] = function() {
args.push([name].concat(Array.prototype.slice.call(arguments)));
};
});
var clone = common.join(options);
clone.locals = common.join(clone.locals);
var result = ejs.render(src, clone);
if (!args.length) {
callback(null, result);
return;
}
args.forEach(function(arg) {
var name = arg.shift();
arg.push(next.parallel());
fns[name].apply(fns, arg);
});
},
function(results, next) {
var i = 0;
Object.keys(fns).forEach(function(name) {
options.locals[name] = function() {
return results[i++];
}
});
src = ejs.render(src, options);
callback(null, src);
}
], callback);
};