-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
73 lines (62 loc) · 1.6 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
/**
* µTemplate
* @license MIT http://mikael.mit-license.org/ © Mikael Karon mailto:[email protected]
*/
(function (root, factory) {
if (typeof define === "function" && define.amd) {
define([], factory);
} else if (typeof module === "object" && module.exports) {
module.exports = factory();
} else {
root["mu-template/main"] = factory();
}
})(this, function () {
var EMPTY = "";
var REPLACE = {
"\"": "\\\"",
"\n": "\\n",
"\t": "\\t",
"\r": "\\r"
};
/**
* Compiles template
*
* @param {String} body Template body
* @returns {String}
*/
return function (body) {
var re_sanitize = /^[\n\t\r]+|[\n\t\r]+$/g;
var re_blocks = /<%(=)?([\S\s]*?)%>/g;
var re_tokens = /<%(\d+)%>/gm;
var re_replace = /(["\n\t\r])/gm;
var re_clean = /o \+= "";| \+ ""/gm;
var blocks = [];
var length = 0;
function blocksTokens(original, prefix, block) {
blocks[length] = prefix
? "\" + (" + block + ") + \""
: "\";" + block + "o += \"";
return "<%" + String(length++) + "%>";
}
function tokensBlocks(original, token) {
return blocks[token];
}
function replace(original, token) {
return REPLACE[token] || token;
}
body = ("var o = \""
// Sanitize body before we start templating
+ body.replace(re_sanitize, "")
// Replace script blocks with tokens
.replace(re_blocks, blocksTokens)
// Replace unwanted tokens
.replace(re_replace, replace)
// Replace tokens with script blocks
.replace(re_tokens, tokensBlocks)
+ "\"; return o;")
// Clean
.replace(re_clean, EMPTY);
// Return compiled template
return Function("data", body);
};
});