-
Notifications
You must be signed in to change notification settings - Fork 13
/
main.js
98 lines (80 loc) · 2.03 KB
/
main.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
/*!
* jshtml
* Copyright(c) 2011 Elmer Bulthuis <elmerbulthuis@gmail.com>
* MIT Licensed
*/
var fs = require('fs');
var JsHtmlParser = require('./lib/JsHtmlParser');
var util = require('./lib/util');
var cache = {};
function compile(template, options) {
var fnSrc = '';
var parser = new JsHtmlParser(function(data) {
fnSrc += data;
}, options);
parser.end(template);
var fn = new Function('locals', 'context', 'with(locals)with(context){' + fnSrc + '}');
return function(locals) {
var buffer = '';
fn(locals
, {
write: function(data) {
buffer += util.str(data);
}
, tag: function(tagName) {
var tagAttributeSetList = [];
var tagContentList = [];
var argumentCount = arguments.length;
var hasContent = false;
for(var argumentIndex = 1; argumentIndex < argumentCount; argumentIndex++){
var argument = arguments[argumentIndex];
switch(typeof argument) {
case 'object':
tagAttributeSetList.push(argument);
break;
default:
hasContent = true;
tagContentList.push(argument);
}
}
buffer += '<';
buffer += tagName;
tagAttributeSetList.forEach(function(tagAttributeSet) {
buffer += ' ';
buffer += util.htmlAttributeEncode(tagAttributeSet);
});
if(hasContent) {
buffer += '>';
tagContentList.forEach(function(tagContent) {
switch(typeof tagContent) {
case 'function':
tagContent();
break;
default:
buffer += util.htmlLiteralEncode(tagContent);
}
});
buffer += '</';
buffer += tagName;
buffer += '>';
}
else{
buffer += ' />';
}
}
, htmlEncode: util.htmlEncode
});
return buffer;
};
}
function render(template, options) {
var options = util.extend({}, options);
var fn = options.filename
? (cache[options.filename] || (cache[options.filename] = compile(template, options)))
: compile(template, options)
;
return fn.call(options.scope, options.locals || {});
}
//exports
exports.compile = compile;
exports.render = render;