efront 4.0.54 → 4.0.56
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/#loader.js +1 -0
- package/coms/basic/color.js +97 -2
- package/coms/basic_/exec_.js +1 -1
- package/coms/compile/Javascript.js +121 -0
- package/coms/compile/Program.js +9 -114
- package/coms/compile/autoenum_test.js +4 -0
- package/coms/compile/common.js +13 -12
- package/coms/compile/richcss.js +445 -92
- package/coms/compile/richcss_test.js +33 -8
- package/coms/compile/scanner2.js +1 -0
- package/coms/docs/codetext.xht +1 -1
- package/coms/docs/markdown.js +28 -15
- package/coms/zimoli/AudioContext_test.less +38 -5
- package/coms/zimoli/HexEditor.less +3 -3
- package/coms/zimoli/autodragchildren.js +13 -0
- package/coms/zimoli/cloneVisible.js +1 -1
- package/coms/zimoli/drag.js +1 -0
- package/coms/zimoli/gallery_test.less +1 -1
- package/coms/zimoli/getGenerator.js +6 -4
- package/coms/zimoli/lattice_test.less +1 -0
- package/coms/zimoli/list.js +16 -4
- package/coms/zimoli/maps_test.less +7 -2
- package/coms/zimoli/mediaDevices.less +1 -2
- package/docs/main.xht +1 -1
- package/docs/mark.xht +45 -2
- package/docs//347/273/204/344/273/266.xht +1 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/coms/compile/richcss.js
CHANGED
|
@@ -1,22 +1,258 @@
|
|
|
1
|
-
var { STAMP, PROPERTY, SCOPED, VALUE, EXPRESS, QUOTED, createString } = require("./common");
|
|
1
|
+
var { STAMP, PROPERTY, SCOPED, VALUE, EXPRESS, QUOTED, SPACE, COMMENT, createString } = require("./common");
|
|
2
|
+
class Richarg extends Program {
|
|
3
|
+
straps = ["and"];
|
|
4
|
+
stamps = ',:;'.split("");
|
|
5
|
+
quotes = this.quotes.slice(0, 2).concat();
|
|
6
|
+
keepspace = true;
|
|
7
|
+
scopes = [["(", ")"], ["{", "}"]];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
var rarg = new Richarg;
|
|
11
|
+
rarg.quotes.push(["url(", ")"]);
|
|
12
|
+
var killcalc = a => createString(a).replace(/((?:[\+\-]+)?(?:\d+(?:\.\d*)?|\.\d+))\s*(px|%|pt|cm|mm|r?em)?\s*([\/\*]\s*|[\+\-]\s+)((?:[\+\-]+)?(?:\d+(?:\.\d*)?|\.\d+))(px|%|pt|cm|mm|r?em)?/ig, function (_, d1, p1 = '', c, d2, p2 = '') {
|
|
13
|
+
d1 = eval(d1);
|
|
14
|
+
d2 = eval(d2);
|
|
15
|
+
if (!p2) {
|
|
16
|
+
if (c === '*') {
|
|
17
|
+
return d1 * d2 + p1;
|
|
18
|
+
}
|
|
19
|
+
if (c === '/') {
|
|
20
|
+
return d1 / d2 + p1;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (p1 === p2) {
|
|
24
|
+
if (c === "+") {
|
|
25
|
+
return (+d1 + +d2) + p1;
|
|
26
|
+
}
|
|
27
|
+
if (c === '-') {
|
|
28
|
+
return (d1 - d2) + p1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return _;
|
|
32
|
+
});
|
|
33
|
+
var seprateFunc = function (express) {
|
|
34
|
+
var express = scanner2(express, rarg);
|
|
35
|
+
var sps = [];
|
|
36
|
+
var sp = [];
|
|
37
|
+
sp.autospace = false;
|
|
38
|
+
for (var cx = 0, dx = express.length; cx < dx; cx++) {
|
|
39
|
+
var o = express[cx];
|
|
40
|
+
if (o.type === SCOPED && o.entry === '(') {
|
|
41
|
+
if (!sp.length) continue;
|
|
42
|
+
var p = sp[sp.length - 1];
|
|
43
|
+
if (p.type & (EXPRESS | PROPERTY)) {
|
|
44
|
+
sp.pop();
|
|
45
|
+
if (sp.length) sps.push(killcalc(sp));
|
|
46
|
+
sp.splice(0, sp.length, p, o);
|
|
47
|
+
sps.push(createString(sp));
|
|
48
|
+
sp.splice(0, sp.length);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (o.type === QUOTED) {
|
|
52
|
+
if (sp.length) sps.push(killcalc(sp));
|
|
53
|
+
sp.splice(0, sp.length);
|
|
54
|
+
sps.push(createString([o]));
|
|
55
|
+
}
|
|
56
|
+
else sp.push(o);
|
|
57
|
+
}
|
|
58
|
+
if (sp.length) sps.push(killcalc(sp));
|
|
59
|
+
return sps;
|
|
60
|
+
}
|
|
61
|
+
var splitParams = function (params) {
|
|
62
|
+
if (!params) return [];
|
|
63
|
+
params = scanner2(params, rarg);
|
|
64
|
+
var o = params.first;
|
|
65
|
+
var params = [];
|
|
66
|
+
while (o) {
|
|
67
|
+
var p = [];
|
|
68
|
+
while (o) {
|
|
69
|
+
if (o.type === STAMP && o.text === ',') {
|
|
70
|
+
o = o.next;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
p.push(o);
|
|
74
|
+
o = o.next;
|
|
75
|
+
}
|
|
76
|
+
p.autospace = false;
|
|
77
|
+
params.push(createString(p));
|
|
78
|
+
}
|
|
79
|
+
return params;
|
|
80
|
+
}
|
|
81
|
+
var createArgMap = function (args, split = ',', equal = ':') {
|
|
82
|
+
if (args) args = scanner2(args, rarg);
|
|
83
|
+
else args = [];
|
|
84
|
+
var map = Object.create(null);
|
|
85
|
+
var o = args.first;
|
|
86
|
+
var args = [];
|
|
87
|
+
while (o) {
|
|
88
|
+
if (!(o.type & (PROPERTY | EXPRESS))) {
|
|
89
|
+
throw new Error("参数异常!");
|
|
90
|
+
}
|
|
91
|
+
var k = o.text;
|
|
92
|
+
args.push(k);
|
|
93
|
+
o = o.next;
|
|
94
|
+
if (o && o.type === STAMP && o.text === equal) {
|
|
95
|
+
var v = []
|
|
96
|
+
o = o.next;
|
|
97
|
+
while (o && (o.type !== STAMP || o.text !== split)) {
|
|
98
|
+
v.push(o);
|
|
99
|
+
o = o.next;
|
|
100
|
+
}
|
|
101
|
+
map[k] = createString(v);
|
|
102
|
+
}
|
|
103
|
+
if (o && o.type === STAMP && o.text === split) o = o.next;
|
|
104
|
+
}
|
|
105
|
+
args.defaults = map;
|
|
106
|
+
return args;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
var macros = Object.create(null);
|
|
110
|
+
macros.range = function () {
|
|
111
|
+
if (arguments.length === 1) {
|
|
112
|
+
return ArrayFill(arguments[0], 0).map((a, i) => i + 1);
|
|
113
|
+
}
|
|
114
|
+
if (arguments.length === 3) {
|
|
115
|
+
var [start, end, step] = arguments;
|
|
116
|
+
var unit = /[^\d]+$/.exec(start);
|
|
117
|
+
if (!unit) unit = /[^\d]+$/.exec(end);
|
|
118
|
+
if (!unit) unit = /[^\d]+$/.exec(step);
|
|
119
|
+
if (unit) unit = unit[0];
|
|
120
|
+
else unit = '';
|
|
121
|
+
var fixed1 = start.length - start.lastIndexOf('.');
|
|
122
|
+
var fixed2 = end.length - end.lastIndexOf('.');
|
|
123
|
+
var fixed3 = step.length - step.lastIndexOf('.');
|
|
124
|
+
var fixed = Math.max(fixed1, fixed2, fixed3);
|
|
125
|
+
start = parseFloat(start);
|
|
126
|
+
end = parseFloat(end);
|
|
127
|
+
step = parseFloat(step) || 1;
|
|
128
|
+
var result = [];
|
|
129
|
+
for (var temp = start; temp < end; temp += step) {
|
|
130
|
+
result.push(temp.toFixed(fixed) + unit);
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
throw new Error("range参数错误:" + arguments);
|
|
135
|
+
};
|
|
136
|
+
macros.extract = function (list, index) {
|
|
137
|
+
if (typeof list === 'string') list = list.split(',');
|
|
138
|
+
else if (list instanceof Array) {
|
|
139
|
+
list = createArgMap(list.concat(list.rest).join(''), ';');
|
|
140
|
+
}
|
|
141
|
+
return list[index];
|
|
142
|
+
};
|
|
143
|
+
macros.length = function (list) {
|
|
144
|
+
if (typeof list === 'string') return list.split(',').length;
|
|
145
|
+
else if (list instanceof Array) {
|
|
146
|
+
return createArgMap(list.concat(list.rest).join(''), ';').length;
|
|
147
|
+
}
|
|
148
|
+
return 1;
|
|
149
|
+
};
|
|
150
|
+
macros.escape = function (a) {
|
|
151
|
+
return strings.decode(a).replace(/[^,\/\?@&\+'~\!\$\w\.]/g, function (a) {
|
|
152
|
+
return "%" + encodeUTF8(a).map(a => a < 16 ? "0" + a.toString(16) : a.toString(16));
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
macros.e = function (a) {
|
|
156
|
+
return strings.decode(a);
|
|
157
|
+
};
|
|
158
|
+
var wrapColor = function (f) {
|
|
159
|
+
return function (c) {
|
|
160
|
+
if (color.isColor(c)) return f(...arguments);
|
|
161
|
+
return f;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
macros.saturate = wrapColor(color.strurate);
|
|
165
|
+
macros.desaturate = wrapColor(color.desaturate);
|
|
166
|
+
macros.lighten = wrapColor(color.lighten);
|
|
167
|
+
macros.darken = wrapColor(color.darken);
|
|
168
|
+
macros.fadein = wrapColor(color.fadein);
|
|
169
|
+
macros.fadeout = wrapColor(color.fadeout);
|
|
170
|
+
macros.fade = wrapColor(color.fade);
|
|
171
|
+
macros.spin = wrapColor(color.spin);
|
|
172
|
+
macros.mix = wrapColor(color.mix);
|
|
173
|
+
macros.tint = wrapColor(color.tint);
|
|
174
|
+
macros.shade = wrapColor(color.shade);
|
|
175
|
+
macros.grayscale = wrapColor(color.grayscale);
|
|
176
|
+
macros.grayluma = wrapColor(color.grayluma);
|
|
177
|
+
macros.fade = wrapColor(color.fade);
|
|
178
|
+
macros.each = function (list, body) {
|
|
179
|
+
var match = /^(?:\s*[#\.]?\(([\s\S]*?)\))?\s*\{([\s\S]*)\}$/.exec(body);
|
|
180
|
+
if (!match) throw new Error("each参数异常!");
|
|
181
|
+
var [_, args, content] = match;
|
|
182
|
+
if (!content) return;
|
|
183
|
+
content = richcss(content);
|
|
184
|
+
if (args) args = args.split(",").map(a => a.trim());
|
|
185
|
+
else args = [];
|
|
186
|
+
if (args.length < 1) args.push("@value");
|
|
187
|
+
if (args.length < 2) args.push("@key");
|
|
188
|
+
if (args.length < 3) args.push("@index");
|
|
189
|
+
if (typeof list === "string") list = splitParams(list);
|
|
190
|
+
else if (list instanceof Array) {
|
|
191
|
+
list = createArgMap(list.concat(list.rest).join(""), ';');
|
|
192
|
+
}
|
|
193
|
+
if (args.indexOf("@value") < 0) args.push("@value");
|
|
194
|
+
if (args.indexOf("@key") < 0) args.push("@key");
|
|
195
|
+
if (args.indexOf("@index") < 0) args.push("@index");
|
|
196
|
+
var reg = new RegExp(args.join("|") + /|@\{[^@\{]+\}/.source, 'g');
|
|
197
|
+
var defaults = list.defaults;
|
|
198
|
+
var argsMap = null;
|
|
199
|
+
var replace = a => {
|
|
200
|
+
if (/^@\{/.test(a)) {
|
|
201
|
+
var k = "@" + a.slice(2, -1).trim();
|
|
202
|
+
if (k in argsMap) return strings.decode(argsMap[k]);
|
|
203
|
+
return a;
|
|
204
|
+
}
|
|
205
|
+
if (a in argsMap) return argsMap[a];
|
|
206
|
+
return a;
|
|
207
|
+
};
|
|
208
|
+
if (defaults) list = list.map(function (a, i) {
|
|
209
|
+
argsMap = {
|
|
210
|
+
"@value": defaults[a],
|
|
211
|
+
"@key": a,
|
|
212
|
+
"@index": i + 1,
|
|
213
|
+
[args[0]]: defaults[a],
|
|
214
|
+
[args[1]]: a,
|
|
215
|
+
[args[2]]: i + 1,
|
|
216
|
+
};
|
|
217
|
+
return content.replace(reg, replace);
|
|
218
|
+
});
|
|
219
|
+
else list = list.map(function (a, i) {
|
|
220
|
+
argsMap = {
|
|
221
|
+
"@value": a,
|
|
222
|
+
"@key": i + 1,
|
|
223
|
+
"@index": i + 1,
|
|
224
|
+
};
|
|
225
|
+
return content.replace(reg, replace);
|
|
226
|
+
});
|
|
227
|
+
return list;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
|
|
2
231
|
class Richcss extends Program {
|
|
3
|
-
straps = [];
|
|
232
|
+
straps = ["and"];
|
|
4
233
|
stamps = `;:`.split("");
|
|
5
|
-
quotes =
|
|
6
|
-
|
|
234
|
+
quotes = rarg.quotes;
|
|
235
|
+
keepspace = true;
|
|
236
|
+
scopes = [["{", "}"], ["(", ")"]]
|
|
7
237
|
}
|
|
238
|
+
|
|
239
|
+
var presets = /^@(media|keyframes|layer|import|namespace|page|property|suppports|font-face|document|counter-style|charset|color-profile|container|font-feature-values|font-palette-values)(\s|\(|$)/i;
|
|
240
|
+
|
|
8
241
|
Richcss.prototype.setType = function (o) {
|
|
9
242
|
var p = o.prev;
|
|
10
243
|
if (o.type !== SCOPED) {
|
|
11
|
-
if (!p || p.type === STAMP && p.text === ";" || p.type === SCOPED) {
|
|
244
|
+
if (!p || p.type === STAMP && p.text === ";" || p.type === SCOPED && p.entry === '{') {
|
|
12
245
|
o.type = PROPERTY;
|
|
13
246
|
return;
|
|
14
247
|
}
|
|
15
248
|
}
|
|
16
249
|
if (!p) return;
|
|
17
250
|
var q = o.queue;
|
|
251
|
+
if (o.type & (PROPERTY | EXPRESS) && p && p === q[q.length - 1] && p.type & (PROPERTY | EXPRESS)) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
18
254
|
if (o.type === SCOPED && o.entry === "{") {
|
|
19
|
-
if (p.type & (PROPERTY | EXPRESS) && /@$/.test(p.text)) {
|
|
255
|
+
if (p && p.type & (PROPERTY | EXPRESS) && /@$/.test(p.text)) {
|
|
20
256
|
return false;
|
|
21
257
|
}
|
|
22
258
|
var pps = [];
|
|
@@ -34,68 +270,111 @@ Richcss.prototype.setType = function (o) {
|
|
|
34
270
|
}
|
|
35
271
|
}
|
|
36
272
|
if (!q.entry && o.type !== SCOPED) {
|
|
37
|
-
|
|
273
|
+
var p = q.last;
|
|
274
|
+
if (p && p.type === STAMP && p.text === ':') {
|
|
275
|
+
if (p.keep) return;
|
|
276
|
+
}
|
|
277
|
+
else if (o.type === STAMP && o.text === ':') {
|
|
278
|
+
if (p.type & (EXPRESS | PROPERTY)) {
|
|
279
|
+
o.keep = true;
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (o.type === STAMP && o.text !== ";") return false;
|
|
38
284
|
}
|
|
39
285
|
};
|
|
286
|
+
|
|
40
287
|
Richcss.prototype.createScoped = function (code) {
|
|
41
|
-
var
|
|
288
|
+
var setVarsUsed = function (s) {
|
|
289
|
+
var vars = null, used = null;
|
|
290
|
+
for (var cx = s.length - 1; cx >= 0; cx--) {
|
|
291
|
+
var { p: k, v } = s[cx];
|
|
292
|
+
if (/^\-\-|^@[^\{]/.test(k) && !("used" in v) && v.length) {
|
|
293
|
+
if (!vars) vars = Object.create(null);
|
|
294
|
+
vars[k] = v.join(" ");
|
|
295
|
+
s.splice(cx, 1);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
if (!used) used = [];
|
|
299
|
+
used.push({ p: k, v });
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (used) used.reverse();
|
|
303
|
+
s.used = used;
|
|
304
|
+
s.vars = vars;
|
|
305
|
+
};
|
|
306
|
+
var run = function (code) {
|
|
42
307
|
var props = [];
|
|
43
|
-
var
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (o.text === ';') break;
|
|
61
|
-
case EXPRESS:
|
|
62
|
-
case VALUE:
|
|
63
|
-
case QUOTED:
|
|
64
|
-
values.push(o.text);
|
|
65
|
-
break;
|
|
66
|
-
case SCOPED:
|
|
67
|
-
var s = run(o.first);
|
|
68
|
-
var vars = null, used = null;
|
|
69
|
-
for (var { p: k, v } of s) {
|
|
70
|
-
if (/^\-\-/.test(k)) {
|
|
71
|
-
if (!vars) vars = {};
|
|
72
|
-
vars[k] = v.join(" ");
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
if (!used) used = [];
|
|
76
|
-
used.push({ p: k, v });
|
|
77
|
-
}
|
|
308
|
+
var propmap = Object.create(null);
|
|
309
|
+
for (var cx = 0, dx = code.length; cx < dx; cx++) {
|
|
310
|
+
var o = code[cx];
|
|
311
|
+
if (o && (o.type & (SPACE | COMMENT) || o.type === STAMP && o.text === ';')) continue;
|
|
312
|
+
if (o.type !== PROPERTY) throw new Error("结构异常");
|
|
313
|
+
var p = [], v = [];
|
|
314
|
+
while (o && (o.type !== SCOPED || o.entry !== "{")) {
|
|
315
|
+
if (o.type === STAMP) break;
|
|
316
|
+
p.push(o);
|
|
317
|
+
o = code[++cx];
|
|
318
|
+
}
|
|
319
|
+
if (o && o.type === STAMP && o.text === ':') {
|
|
320
|
+
var n = code[++cx];
|
|
321
|
+
var tmp = [];
|
|
322
|
+
while (n && (n.type !== STAMP || n.text !== ";")) {
|
|
323
|
+
if (n.type === SCOPED && n.entry === '{') {
|
|
324
|
+
break;
|
|
78
325
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
326
|
+
tmp.push(n);
|
|
327
|
+
n = code[++cx];
|
|
328
|
+
}
|
|
329
|
+
if (n && n.type === SCOPED) {
|
|
330
|
+
o.unary = true;
|
|
331
|
+
p.push(o, ...tmp);
|
|
332
|
+
v = run(n);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
v = tmp;
|
|
336
|
+
}
|
|
337
|
+
o = n;
|
|
82
338
|
}
|
|
83
|
-
|
|
339
|
+
else if (o) {
|
|
340
|
+
v = run(o);
|
|
341
|
+
}
|
|
342
|
+
p.autospace = false;
|
|
343
|
+
var pj = createString(p).trim();
|
|
344
|
+
if (!propmap[pj]) propmap[pj] = [];
|
|
345
|
+
var vs = [];
|
|
346
|
+
if (v.used === undefined) {
|
|
347
|
+
if (v.length) vs.push(createString(v).trim());
|
|
348
|
+
}
|
|
349
|
+
else vs.used = v.used, vs.vars = v.vars;
|
|
350
|
+
props.push({ p: pj, v: vs })
|
|
351
|
+
propmap[pj].push(vs);
|
|
84
352
|
}
|
|
353
|
+
props.maps = propmap;
|
|
354
|
+
setVarsUsed(props);
|
|
85
355
|
return props;
|
|
86
356
|
};
|
|
87
|
-
return run(code
|
|
357
|
+
return run(code);
|
|
88
358
|
};
|
|
89
359
|
Richcss.prototype.createString = createString;
|
|
90
|
-
var getFromScopeList = function (name, varsList, value) {
|
|
360
|
+
var getFromScopeList = function (name, varsList, value = name) {
|
|
361
|
+
name = name.replace(/^@\{\s*(\S*)\s*\}$/g, '@$1');
|
|
362
|
+
var queue = [];
|
|
91
363
|
for (var cx = varsList.length - 1; cx >= 0; cx--) {
|
|
92
364
|
var o = varsList[cx];
|
|
93
|
-
if (name in o)
|
|
365
|
+
if (name in o) queue = [];
|
|
366
|
+
while (name in o) {
|
|
367
|
+
name = o[name];
|
|
368
|
+
if (typeof name !== "string" || !/^\-\-|^@[^\{]/.test(name)) return name;
|
|
369
|
+
if (queue.indexOf(name) >= 0) throw `变量环形引用,无法初始化:${queue}`;
|
|
370
|
+
queue.push(name);
|
|
371
|
+
}
|
|
94
372
|
}
|
|
95
373
|
return value;
|
|
96
374
|
}
|
|
97
375
|
var fixBase = function (b, a) {
|
|
98
376
|
return a.split(/,\s*/).map(a => {
|
|
377
|
+
if (presets.test(a)) a = `@{${a}}`;
|
|
99
378
|
var replaced = false;
|
|
100
379
|
return b.split(/\s*,\s*/).map(b => {
|
|
101
380
|
var a1 = a.replace(/(:scope|&)/g, function (match) {
|
|
@@ -113,107 +392,146 @@ var fixBase = function (b, a) {
|
|
|
113
392
|
}).join(",");
|
|
114
393
|
}
|
|
115
394
|
function evalscoped(scoped, scopeNames, base = '') {
|
|
116
|
-
var
|
|
117
|
-
var
|
|
395
|
+
var smaps = scoped.maps;
|
|
396
|
+
var root = smaps[":root"], scope = smaps[":scope"], and = smaps["&"];
|
|
397
|
+
var vars = extend(Object.create(null), scoped.vars);
|
|
118
398
|
if (root) root.forEach(r => extend(vars, r.vars));
|
|
119
399
|
if (scope) scope.forEach(s => extend(vars, s.vars));
|
|
400
|
+
if (and) and.forEach(s => extend(vars, s.vars));
|
|
120
401
|
scopeNames.forEach(s => {
|
|
121
|
-
var ss =
|
|
402
|
+
var ss = smaps[s];
|
|
122
403
|
if (ss) ss.forEach(s => {
|
|
123
404
|
extend(vars, s.vars), s.rooted = true;
|
|
124
405
|
})
|
|
125
406
|
});
|
|
126
407
|
var vlist = [vars];
|
|
127
|
-
var mlist = [];
|
|
408
|
+
var mlist = [macros];
|
|
409
|
+
var clist = [smaps];
|
|
128
410
|
var initvars = function (vars) {
|
|
129
|
-
var queue = [];
|
|
130
411
|
for (var k in vars) {
|
|
131
412
|
var v = vars[k];
|
|
132
|
-
|
|
133
|
-
if (queue.indexOf(v) >= 0) throw `变量环形引用,无法初始化:${queue}`;
|
|
134
|
-
queue.push(v);
|
|
135
|
-
v = getFromScopeList(v, vlist);
|
|
136
|
-
}
|
|
413
|
+
v = getFromScopeList(v, vlist);
|
|
137
414
|
vars[k] = v;
|
|
138
415
|
}
|
|
139
416
|
};
|
|
140
417
|
initvars(vars);
|
|
418
|
+
|
|
141
419
|
var eval2 = function (props) {
|
|
142
420
|
var rest = [];
|
|
143
421
|
var result = [];
|
|
144
|
-
var methods =
|
|
422
|
+
var methods = Object.create(null);
|
|
145
423
|
mlist.push(methods);
|
|
424
|
+
if (props.maps) clist.push(props.maps);
|
|
146
425
|
var evalthis = function (p) {
|
|
147
|
-
if (p.vars) vlist.push(p.vars);
|
|
148
|
-
initvars(p.vars);
|
|
149
426
|
var temp = base;
|
|
150
427
|
base = p.base;
|
|
151
428
|
var res = eval2(p.used);
|
|
152
429
|
base = temp;
|
|
153
|
-
if (p.vars) vlist.pop();
|
|
154
430
|
return res;
|
|
155
431
|
};
|
|
156
432
|
var calcvars = function (v) {
|
|
157
|
-
return v.replace(/(^|\s|[\]\)\(\[
|
|
433
|
+
return v.replace(/(^|\s|[\]\)\(\[\-\+\*\/,;])(?:var\s*\(([\s\S]*?)\)|(--\S+|@[^\s\{\(\:\+\*\/,;\!\[\>\$\=\&\%\#\@\+'"`\?\.\/\|~]+|@\{[^\}@]*\}))/g, function (m, q, a, b) {
|
|
158
434
|
return q + getFromScopeList(b || a.trim(), vlist, m.slice(q.length));
|
|
159
435
|
});
|
|
160
436
|
};
|
|
437
|
+
var evalproc = function (k, retnoparam) {
|
|
438
|
+
var match = (retnoparam !== false ? /^([^\(\)\s,;:]+)(?:\s*\(([\s\S]*)\))$/ : /^([^\(\)\s,;:]+)(?:\s*\(([\s\S]*)\))?$/).exec(k);
|
|
439
|
+
if (!match) return calcvars(k);
|
|
440
|
+
var [, name, params] = match;
|
|
441
|
+
params = splitParams(params);
|
|
442
|
+
var method = getFromScopeList(name, mlist);
|
|
443
|
+
if (!isFunction(method)) {
|
|
444
|
+
if (/^@/.test(name)) return calcvars(k);
|
|
445
|
+
var block = getFromScopeList(name, clist, null);
|
|
446
|
+
if (block) {
|
|
447
|
+
var res = [];
|
|
448
|
+
var rest = [];
|
|
449
|
+
block.map(eval2).forEach(e => {
|
|
450
|
+
res = res.concat(e);
|
|
451
|
+
rest = rest.concat(e.rest);
|
|
452
|
+
});
|
|
453
|
+
return res.concat(rest).join('');
|
|
454
|
+
}
|
|
455
|
+
else return k;
|
|
456
|
+
};
|
|
457
|
+
params = params.map(evalproc);
|
|
458
|
+
return method.apply(null, params);
|
|
459
|
+
};
|
|
460
|
+
|
|
161
461
|
for (var { p: k, v: p } of props) {
|
|
162
462
|
if (p.used) {
|
|
163
|
-
var match = /^(
|
|
463
|
+
var match = /^([@\.#][^\s,]+)\s*\(([\s\S]*?)\)\s*$/.exec(k);
|
|
164
464
|
if (!match) continue;
|
|
165
|
-
|
|
465
|
+
if (presets.test(match[1])) continue;
|
|
166
466
|
var [, name, args] = match;
|
|
167
|
-
|
|
467
|
+
p.base = base;
|
|
468
|
+
args = createArgMap(args);
|
|
168
469
|
p.args = args;
|
|
169
|
-
p.reg = new RegExp(args.join("|"), 'g');
|
|
470
|
+
p.reg = new RegExp(args.join("|") + /|@\{[^\}@]+\}/.source, 'g');
|
|
170
471
|
if (!methods[name]) methods[name] = [];
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
472
|
+
var argDefaults = args.defaults;
|
|
473
|
+
Object.keys(argDefaults).forEach(k => {
|
|
474
|
+
argDefaults[k] = calcvars(argDefaults[k]);
|
|
475
|
+
});
|
|
476
|
+
methods[name] = function () {
|
|
477
|
+
var valueMap = Object.create(null);
|
|
478
|
+
vlist.push(valueMap);
|
|
479
|
+
var argDefaults = this.args.defaults;
|
|
480
|
+
this.args.forEach((k, i) => {
|
|
481
|
+
var a = arguments[i];
|
|
482
|
+
if (a === undefined || a === null) a = seprateFunc(calcvars(argDefaults[k])).map(evalproc).join('');
|
|
483
|
+
valueMap[k] = a;
|
|
484
|
+
});
|
|
177
485
|
var replace = text => text.replace(this.reg, function (name) {
|
|
178
|
-
if (name
|
|
486
|
+
if (/^\@\{/.test(name)) {
|
|
487
|
+
var key = "@" + name.slice(2, -1);
|
|
488
|
+
if (key in valueMap) return strings.decode(valueMap[key]);
|
|
489
|
+
}
|
|
490
|
+
else if (name in valueMap) return valueMap[name];
|
|
179
491
|
return name;
|
|
180
492
|
});
|
|
493
|
+
var vars = this.vars;
|
|
494
|
+
if (vars) Object.keys(vars).forEach(k => {
|
|
495
|
+
valueMap[k] = replace(calcvars(vars[k]));
|
|
496
|
+
});
|
|
497
|
+
var body = evalthis(this);
|
|
181
498
|
var rest = body.rest.map(a => a.map(replace));
|
|
182
499
|
var body = body.map(replace);
|
|
183
500
|
body.rest = rest;
|
|
501
|
+
vlist.pop();
|
|
184
502
|
return body;
|
|
185
|
-
}.bind(p)
|
|
503
|
+
}.bind(p);
|
|
186
504
|
p.isMethod = true;
|
|
187
505
|
}
|
|
188
506
|
}
|
|
189
507
|
for (var { p: k, v: p } of props) {
|
|
190
508
|
if (p.isMethod) continue;
|
|
191
509
|
if (p.used) {
|
|
510
|
+
k = calcvars(k);
|
|
192
511
|
if (base && !p.rooted) p.base = fixBase(base, k);
|
|
193
|
-
else p.base = k;
|
|
512
|
+
else p.base = presets.test(k) ? `@{${k}}` : k;
|
|
513
|
+
if (p.vars) vlist.push(p.vars);
|
|
194
514
|
var value = evalthis(p);
|
|
515
|
+
if (p.vars) vlist.pop();
|
|
195
516
|
if (value.rest.length) rest = rest.concat(value.rest);
|
|
196
517
|
if (value.length) rest.push([p.base, '{', value.join(""), "}"]);
|
|
197
518
|
}
|
|
198
519
|
else if (p.length) {
|
|
199
|
-
|
|
520
|
+
k = calcvars(k);
|
|
521
|
+
p = calcvars(p.join(" "));
|
|
522
|
+
p = seprateFunc(p).map(evalproc).join('');
|
|
523
|
+
result.push(k, ":", p, ';');
|
|
200
524
|
}
|
|
201
525
|
else {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
var [, name, params] = match;
|
|
206
|
-
params = params.split(",").map(a => a.trim());
|
|
207
|
-
var method = getFromScopeList(name, mlist);
|
|
208
|
-
if (!isArray(method)) throw `函数未定义:${name}`;
|
|
209
|
-
method.forEach(m => {
|
|
210
|
-
var res = m.apply(null, params);
|
|
211
|
-
if (res.rest.length) rest = rest.concat(res.rest);
|
|
526
|
+
var res = evalproc(k, false);
|
|
527
|
+
if (res instanceof Array) {
|
|
528
|
+
if (res.rest && res.rest.length) rest = rest.concat(res.rest);
|
|
212
529
|
if (res.length) result = result.concat(res);
|
|
213
|
-
}
|
|
530
|
+
}
|
|
214
531
|
}
|
|
215
532
|
}
|
|
216
533
|
mlist.pop();
|
|
534
|
+
if (props.maps) clist.pop();
|
|
217
535
|
result.rest = rest;
|
|
218
536
|
return result;
|
|
219
537
|
}
|
|
@@ -223,12 +541,13 @@ function evalscoped(scoped, scopeNames, base = '') {
|
|
|
223
541
|
var rcss = null;
|
|
224
542
|
function richcss(text, scopeName, compress) {
|
|
225
543
|
if (!rcss) rcss = new Richcss;
|
|
544
|
+
rcss.debug = true;
|
|
226
545
|
var code = scanner2(text, rcss);
|
|
227
546
|
var scopeNames = [];
|
|
228
547
|
if (scopeName) code.forEach(c => {
|
|
229
548
|
if (c.type === PROPERTY) {
|
|
230
549
|
var replaced = false;
|
|
231
|
-
c.text = c.text.replace(/\:(scope|root)
|
|
550
|
+
c.text = c.text.replace(/\:(scope|root)|&/g, function () {
|
|
232
551
|
replaced = true;
|
|
233
552
|
return scopeName;
|
|
234
553
|
});
|
|
@@ -239,5 +558,39 @@ function richcss(text, scopeName, compress) {
|
|
|
239
558
|
})
|
|
240
559
|
var { scoped } = code;
|
|
241
560
|
var result = evalscoped(scoped, scopeNames, scopeName);
|
|
242
|
-
|
|
561
|
+
var queried = [];
|
|
562
|
+
var getquried = function () {
|
|
563
|
+
if (!queried.length) return "";
|
|
564
|
+
var ats = queried.key.split(';');
|
|
565
|
+
var b = /@keyframes\s/i.test(queried.key) ? queried.map(a => a.replace(new RegExp(/^\s*/.source + scopeName + /\s/.source), "")).join('') : queried.join('');
|
|
566
|
+
while (ats.length) {
|
|
567
|
+
b = ats.pop() + `{${b}}`;
|
|
568
|
+
}
|
|
569
|
+
queried = [];
|
|
570
|
+
return b;
|
|
571
|
+
}
|
|
572
|
+
return result.rest.map(a => a.join("")).concat(result).map(a => {
|
|
573
|
+
var ats = [];
|
|
574
|
+
a = a.replace(/@\{(@[^\}]*)\}\s*/g, function (_, q) {
|
|
575
|
+
ats.push(q);
|
|
576
|
+
return ''
|
|
577
|
+
}).replace(/~\s*(['"`])((?:\\[\s\S]|[^'"`\\])*?)\1/g, '$2');
|
|
578
|
+
if (!a) return '';
|
|
579
|
+
var atk = ats.join(';');
|
|
580
|
+
if (queried.key !== atk) {
|
|
581
|
+
var b = getquried();
|
|
582
|
+
if (!atk) return b + a;
|
|
583
|
+
queried = [a];
|
|
584
|
+
queried.key = atk;
|
|
585
|
+
return b;
|
|
586
|
+
}
|
|
587
|
+
else if (atk) {
|
|
588
|
+
queried.push(a);
|
|
589
|
+
return '';
|
|
590
|
+
}
|
|
591
|
+
else if (queried.length) {
|
|
592
|
+
return getquried() + a;
|
|
593
|
+
}
|
|
594
|
+
return a;
|
|
595
|
+
}).filter(a => !!a).join(compress ? "" : "\r\n") + getquried();
|
|
243
596
|
}
|