-
Notifications
You must be signed in to change notification settings - Fork 0
/
template.js
69 lines (63 loc) · 1.51 KB
/
template.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
/**
* 元素标签格式化
* @param {*} str
*/
function str_format(str) {
return str
.replace(/'/g, '"')
.replace(/\s*(?:\n|\r)\s*/g, "")
.trim();
}
/**
* 逻辑代码编译处理
* @param {*} str
*/
function deal_logic(str) {
const REG = /<%[^=]([^%]*)%>/g;
let _str = 'let str = "";\n';
let exec;
let index = 0;
let content;
while ((exec = REG.exec(str))) {
content = str_format(str.slice(index, exec.index));
if (content) {
_str += `str += '${content}';\n`;
}
_str += `${str_format(exec[1])}\n`;
index = exec.index + exec[0].length;
}
/**
* 模板没有逻辑处理
* 应该都是html元素
*/
if (index === 0) {
// 去除换行空格,避免new Function解析报错
_str += `str += '${str_format(str)}';\n`;
_str += "return str;";
return _str;
// return str.replace(/\s*(\n|\r)\*/g, "");
}
// 屁股的元素
content = str_format(str.slice(index));
// console.log(content);
if (content) {
_str += `str += '${content}';\n`;
}
_str += "return str;\n";
return _str;
}
function deal_data(str) {
const REG = /<%=([^%]*)%>/g;
return str.replace(REG, ($0, $1) => `'+ (${$1}) +'`);
}
export default function template(source, data) {
const logic_str = deal_logic(source);
const exec_str = deal_data(logic_str);
let keys = [];
let values = [];
if (!!data && typeof data === "object") {
keys = Object.keys(data);
values = keys.map(key => data[key]);
}
return new Function(...keys, exec_str)(...values);
}