efront 4.4.8 → 4.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coms/basic/renderExpress.js +113 -23
- package/coms/basic/renderExpress_test.js +14 -6
- package/coms/compile/Html.js +10 -3
- package/package.json +1 -1
- package/public/efront.js +98 -98
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
function splitSeek(express) {
|
|
2
2
|
var dist = [];
|
|
3
3
|
var x = 0;
|
|
4
|
+
var called = false;
|
|
4
5
|
express.forEach((e, i) => {
|
|
5
|
-
if (
|
|
6
|
+
if (isArray(e)) called = true;
|
|
7
|
+
if (i > x && /^\?/.test(e)) {
|
|
6
8
|
var exp = express.slice(x, x = i);
|
|
9
|
+
exp.called = called;
|
|
7
10
|
dist.push(exp);
|
|
11
|
+
called = false;
|
|
8
12
|
}
|
|
9
13
|
});
|
|
10
14
|
if (x < express.length) dist.push(express.slice(x, express.length));
|
|
15
|
+
dist[dist.length - 1].called = called;
|
|
11
16
|
dist.forEach(d => d[0] = d[0].replace(/^\?/, ''))
|
|
12
17
|
return dist;
|
|
13
18
|
}
|
|
@@ -24,31 +29,114 @@ function getTmpvar(explist) {
|
|
|
24
29
|
return tmpvar;
|
|
25
30
|
}
|
|
26
31
|
var autoDefine = false;
|
|
27
|
-
function
|
|
28
|
-
var
|
|
32
|
+
function joinsharp(sharped, ctx) {
|
|
33
|
+
var willcall = [], call = false;
|
|
34
|
+
for (var cx = 1, dx = sharped.length; cx < dx; cx++) {
|
|
35
|
+
if (/^\(/.test(sharped[cx])) {
|
|
36
|
+
var p = sharped[cx - 1];
|
|
37
|
+
if (/\)$/.test(p)) continue;
|
|
38
|
+
if (cx > 1 || /\./.test(p)) willcall[cx] = true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
var result = [];
|
|
42
|
+
var will = false, call = false;
|
|
43
|
+
if (sharped[sharped.length - 1] === '.') sharped[sharped.length - 1] = "";
|
|
44
|
+
for (var cx = 0, dx = sharped.length; cx < dx; cx++) {
|
|
45
|
+
var s = sharped[cx];
|
|
46
|
+
var plus = /^\//.test(s);
|
|
47
|
+
if (plus) s = s.slice(1);
|
|
48
|
+
call = will;
|
|
49
|
+
will = willcall[cx + 1];
|
|
50
|
+
if (will) {
|
|
51
|
+
if (/\]/.test(s)) {
|
|
52
|
+
s = [s];
|
|
53
|
+
s.unshift('');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
s = s.split('.');
|
|
57
|
+
if (s.length > 1) {
|
|
58
|
+
s.unshift(s.splice(0, s.length - 1).join('.'));
|
|
59
|
+
s[1] = '.' + s[1];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
s.unshift("");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (plus) {
|
|
66
|
+
s[0] = result[result.length - 1] + s[0];
|
|
67
|
+
result[result.length - 1] = s;
|
|
68
|
+
}
|
|
69
|
+
else result.push(s);
|
|
70
|
+
}
|
|
71
|
+
else if (call) {
|
|
72
|
+
var params = s.replace(/^\(\s*([\s\S]*)\s*\)$/, '$1');
|
|
73
|
+
result.push(`["call"](${ctx}${params ? ',' + params : ''})`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
if (plus) {
|
|
77
|
+
result[result.length - 1] += s;
|
|
78
|
+
}
|
|
79
|
+
else result.push(s);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
var wrapquote = false;
|
|
85
|
+
function createSeek(sharped, splited = true) {
|
|
86
|
+
if (splited) wrapquote = false;
|
|
87
|
+
if (sharped.length <= 1) return sharped[0];
|
|
88
|
+
var tmpvar = 'a', undef = '_', tmpctx = 'c';
|
|
89
|
+
var express = splited ? joinsharp(sharped, tmpctx) : sharped;
|
|
29
90
|
if (express.length <= 1) return express[0];
|
|
30
|
-
|
|
91
|
+
if (splited) wrapquote = true;
|
|
92
|
+
var [exp0, exp1] = express;
|
|
93
|
+
var notmp = typeof exp0 === 'string' && !/[\.\[\(\{]/.test(exp0);
|
|
31
94
|
if (express.length === 2) {
|
|
32
|
-
if (
|
|
33
|
-
if (notmp) return `typeof ${
|
|
34
|
-
return `function(${tmpvar},${undef}){return ${tmpvar}
|
|
95
|
+
if (splited && /^\?/.test(exp1)) {
|
|
96
|
+
if (notmp) return `typeof ${exp0}!=='undefined'&&${exp0}!==null?${exp0}:${exp1.slice(1)}`;
|
|
97
|
+
return `function(${tmpvar},${undef}){return ${tmpvar}==${undef}?${exp1.slice(1)}:${tmpvar}}(${exp0})`;
|
|
35
98
|
}
|
|
36
99
|
if (notmp) {
|
|
37
|
-
tmpvar = express[0];
|
|
38
100
|
if (autoDefine) {
|
|
39
|
-
return `typeof ${
|
|
101
|
+
return `typeof ${exp0}==='undefined'||${exp0}===null?void 0:${exp0}${exp1}`;
|
|
40
102
|
}
|
|
41
|
-
return `${
|
|
103
|
+
return `${exp0}==null?void 0:${exp0}${exp1}`;
|
|
42
104
|
};
|
|
43
|
-
|
|
105
|
+
if (isArray(exp0)) {
|
|
106
|
+
return `function(${tmpctx},${tmpvar},${undef}){${tmpvar}=${tmpctx}${exp0[exp0.length - 1]};return ${tmpvar}==${undef}?${undef}:${tmpvar}${exp1}}(${exp0.slice(0, exp0.length - 1)})`;
|
|
107
|
+
}
|
|
108
|
+
return `function(${tmpvar},${undef}){return ${tmpvar}==${undef}?${undef}:${tmpvar}${exp1}}(${exp0})`;
|
|
44
109
|
}
|
|
45
|
-
if (!
|
|
46
|
-
var
|
|
47
|
-
|
|
110
|
+
if (!splited) {
|
|
111
|
+
var called = express.called;
|
|
112
|
+
var prop = isArray(exp0) ? exp0[exp0.length - 1] : '';
|
|
113
|
+
var prop0 = prop;
|
|
114
|
+
var dist = express.slice(1).map(search => {
|
|
115
|
+
var res = prop ? `${tmpvar}=${tmpctx}${prop}` : '';
|
|
116
|
+
res += `if(${tmpvar}==${undef})return;`;
|
|
117
|
+
if (isArray(search)) {
|
|
118
|
+
prop = search[search.length - 1];
|
|
119
|
+
res += `${tmpctx}=${tmpvar}${search.slice(0, search.length - 1)},${tmpvar}=${tmpctx}${prop};`;
|
|
120
|
+
prop = '';
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
res += `${tmpvar}=${tmpvar}${search};`;
|
|
124
|
+
}
|
|
125
|
+
return res;
|
|
48
126
|
}).join('');
|
|
49
|
-
|
|
127
|
+
if (called) {
|
|
128
|
+
if (prop0) {
|
|
129
|
+
dist = `function(${tmpctx},${tmpvar},${undef}){${dist}return ${tmpvar}}(${exp0.slice(0, exp0.length - 1)})`;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
dist = `function(${tmpvar},${tmpctx},${undef}){${dist}return ${tmpvar}}(${exp0})`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
dist = `function(${tmpvar},${undef}){${dist}return ${tmpvar}}(${exp0})`;
|
|
137
|
+
}
|
|
50
138
|
if (notmp && autoDefine) {
|
|
51
|
-
dist = `typeof ${
|
|
139
|
+
dist = `typeof ${exp0}==='undefined'||${exp0}===null?void 0:${dist}`;
|
|
52
140
|
}
|
|
53
141
|
return dist;
|
|
54
142
|
}
|
|
@@ -59,14 +147,14 @@ function createSeek(express, split = true) {
|
|
|
59
147
|
tmpvar = getTmpvar(explist);
|
|
60
148
|
var dist = explist.slice(0, explist.length - 1).map(express => {
|
|
61
149
|
var dist = createSeek(express, false);
|
|
62
|
-
return `${tmpvar}=${dist};if(${tmpvar}
|
|
150
|
+
return `${tmpvar}=${dist};if(${tmpvar}!=null)return ${tmpvar};`;
|
|
63
151
|
}).join("") + `return ${createSeek(explist[explist.length - 1], false)}`;
|
|
64
152
|
return `function(${tmpvar}){${dist}}()`;
|
|
65
153
|
}
|
|
66
154
|
function main(express, autodef = true) {
|
|
67
155
|
autoDefine = autodef;
|
|
68
|
-
if (!/\?\s*\.(?=[^\d])|\?\s*[\?\]\}\)\:\,=|%&;\>\<]
|
|
69
|
-
var reg = /\\[\s\S]|\?\s*([\.](?!\d)|\?|$|(?=[\?\]\}\)
|
|
156
|
+
if (!/\?\s*\.(?=[^\d])|\?\s*[\?\]\}\)\:\,=|%&;\>\<]|\?\.?\s*$/.test(express)) return express;
|
|
157
|
+
var reg = /\\[\s\S]|\?\s*([\.](?!\d)|\?|$|(?=[\?\]\}\)\:\,\=\|%&;\>\<\*\/]))|[\:\,\+\=\-\!%\^\|\/\&\*\!\;\?\>\<\~\{\}\[\]\(\)'"`\s]/g;
|
|
70
158
|
var cache = [], queue = [];
|
|
71
159
|
var exp = [];
|
|
72
160
|
var instr = false;
|
|
@@ -80,8 +168,11 @@ function main(express, autodef = true) {
|
|
|
80
168
|
exp.splice(0, exp.length, '');
|
|
81
169
|
e = '';
|
|
82
170
|
}
|
|
83
|
-
if (/\.$/.test(e)
|
|
84
|
-
e = e.replace(/\.$/, '');
|
|
171
|
+
if (/\.$/.test(e)) {
|
|
172
|
+
if (/^[\[\("'`]/.test(s)) e = e.replace(/\.$/, '');
|
|
173
|
+
}
|
|
174
|
+
else if (!cache.length) {
|
|
175
|
+
return exp.push('/' + s);
|
|
85
176
|
}
|
|
86
177
|
e += s;
|
|
87
178
|
exp[exp.length - 1] = e;
|
|
@@ -103,7 +194,7 @@ function main(express, autodef = true) {
|
|
|
103
194
|
var add_punc = function (m) {
|
|
104
195
|
if (exp.length) {
|
|
105
196
|
var temp = createSeek(exp);
|
|
106
|
-
queue.push(
|
|
197
|
+
queue.push(wrapquote ? `(${temp})` : temp, m);
|
|
107
198
|
exp = [];
|
|
108
199
|
} else if (queue.length) {
|
|
109
200
|
queue[queue.length - 1] += m;
|
|
@@ -129,7 +220,6 @@ function main(express, autodef = true) {
|
|
|
129
220
|
isstr = true;
|
|
130
221
|
index++;
|
|
131
222
|
}
|
|
132
|
-
|
|
133
223
|
var str = express.slice(lastIndex, index);
|
|
134
224
|
if (str) {
|
|
135
225
|
add_exp(str);
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
assert(renderExpress("[].a"), "[].a")
|
|
2
2
|
assert(renderExpress("a?b:c"), "a?b:c")
|
|
3
3
|
assert(renderExpress("a?"), "(typeof a==='undefined'||a===null?void 0:a)")
|
|
4
|
-
assert(renderExpress("
|
|
5
|
-
assert(renderExpress("
|
|
4
|
+
assert(renderExpress("b+a?."), "b+(typeof a==='undefined'||a===null?void 0:a)")
|
|
5
|
+
assert(renderExpress("a?.+b"), "(typeof a==='undefined'||a===null?void 0:a)+b")
|
|
6
|
+
assert(renderExpress("a?.()"), "(typeof a==='undefined'||a===null?void 0:a())")
|
|
7
|
+
assert(renderExpress("a.b?.()"), `(function(c,a,_){a=c.b;return a==_?_:a["call"](c)}(a))`)
|
|
8
|
+
assert(renderExpress("a[['a[']][]?.()"), `(function(c,a,_){a=c[];return a==_?_:a["call"](c)}(a[['a[']]))`)
|
|
9
|
+
assert(renderExpress("a?.b?.()"), `(typeof a==='undefined'||a===null?void 0:function(a,c,_){if(a==_)return;c=a,a=c.b;if(a==_)return;a=a["call"](c);return a}(a))`)
|
|
10
|
+
assert(renderExpress("[].a?.()"), `(function(c,a,_){a=c.a;return a==_?_:a["call"](c)}([]))`)// 已支持在?.()的函数中访问this
|
|
11
|
+
assert(renderExpress("[].a?.b?.c?.()"), `(function(a,c,_){if(a==_)return;a=a.b;if(a==_)return;c=a,a=c.c;if(a==_)return;a=a["call"](c);return a}([].a))`)
|
|
6
12
|
assert(renderExpress("a??b"), "(typeof a!=='undefined'&&a!==null?a:b)")
|
|
7
|
-
assert(renderExpress("a?.b??b?.c", false), "(function(b0){b0=a
|
|
13
|
+
assert(renderExpress("a?.b??b?.c", false), "(function(b0){b0=a==null?void 0:a.b;if(b0!=null)return b0;return b==null?void 0:b.c}())")
|
|
8
14
|
|
|
9
|
-
assert(renderExpress("[]?.a"), "(function(a,_){return a
|
|
10
|
-
assert(renderExpress("[]?.()"), "(function(a,_){return a
|
|
11
|
-
assert(renderExpress("[]?.[]"), "(function(a,_){return a
|
|
15
|
+
assert(renderExpress("[]?.a"), "(function(a,_){return a==_?_:a.a}([]))")
|
|
16
|
+
assert(renderExpress("[]?.()"), "(function(a,_){return a==_?_:a()}([]))")
|
|
17
|
+
assert(renderExpress("[]?.[]"), "(function(a,_){return a==_?_:a[]}([]))")
|
|
18
|
+
assert(renderExpress("a['a?.a']"), "a['a?.a']")
|
|
19
|
+
assert(renderExpress("a?.['a?.a']?.b"), "(typeof a==='undefined'||a===null?void 0:function(a,_){if(a==_)return;a=a['a?.a'];if(a==_)return;a=a.b;return a}(a))")
|
package/coms/compile/Html.js
CHANGED
|
@@ -17,6 +17,8 @@ const {
|
|
|
17
17
|
/*1024 */PROPERTY,
|
|
18
18
|
/*2048 */ELEMENT,
|
|
19
19
|
createScoped,
|
|
20
|
+
createString,
|
|
21
|
+
relink,
|
|
20
22
|
} = require("./common");
|
|
21
23
|
var ignore = { test() { return false } };
|
|
22
24
|
var property = new Program;
|
|
@@ -123,7 +125,7 @@ Html.prototype.createScoped = function (code) {
|
|
|
123
125
|
var nn = c.next.next;
|
|
124
126
|
if (!nn || nn.length > 0) return;
|
|
125
127
|
if (nn.type === EXPRESS || nn.type === QUOTED) {
|
|
126
|
-
vars[strings.decode(nn
|
|
128
|
+
vars[strings.decode(createString([nn]))] = true;
|
|
127
129
|
}
|
|
128
130
|
}
|
|
129
131
|
}
|
|
@@ -184,17 +186,22 @@ Html.prototype.createScoped = function (code) {
|
|
|
184
186
|
var root = rootNodes[0];
|
|
185
187
|
scoped.tagName = root.tagName;
|
|
186
188
|
var attrs = rootNodes[0].attributes;
|
|
189
|
+
var attributes = [];
|
|
190
|
+
if (attrs) relink(attrs);
|
|
187
191
|
if (attrs) for (var a of attrs) {
|
|
188
192
|
if (a.type === PROPERTY) {
|
|
189
|
-
|
|
193
|
+
var at = { name: a.text };
|
|
194
|
+
attributes.push(at);
|
|
190
195
|
var n = a.next;
|
|
191
196
|
if (!n) continue;
|
|
192
197
|
if (n.type !== STAMP || n.text !== '=') continue;
|
|
193
198
|
var nn = n.next;
|
|
199
|
+
if (nn.type === PROPERTY) continue;
|
|
194
200
|
if (!nn) continue;
|
|
195
|
-
|
|
201
|
+
at.value = this.createString([nn]);
|
|
196
202
|
}
|
|
197
203
|
}
|
|
204
|
+
scoped.attributes = attributes;
|
|
198
205
|
scoped.innerHTML = this.createString(rootNodes[0]);
|
|
199
206
|
}
|
|
200
207
|
else {
|