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.
@@ -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 = this.quotes.slice(0, 2);
6
- scopes = [["{", "}"]]
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
- if (o.type !== STAMP || o.text !== ";") return false;
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 run = function (o) {
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 values = null;
44
- loop: while (o) {
45
- switch (o.type) {
46
- case PROPERTY:
47
- var p = [];
48
- while (o && !(o.type & (STAMP | SCOPED))) {
49
- p.push(o.text);
50
- o = o.next;
51
- }
52
- var pj = p.join(' ');
53
- props.push({ p: pj, v: values = [] });
54
- if (!props[pj]) props[pj] = [];
55
- props[pj].push(values);
56
- if (!o) break loop;
57
- if (o.type === STAMP) break;
58
- continue;
59
- case STAMP:
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
- values.used = used;
80
- values.vars = vars;
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
- o = o.next;
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.first);
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) return o[name];
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 root = scoped[":root"], scope = scoped[":scope"];
117
- var vars = Object.create(null);
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 = scoped[s];
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
- while (/^\-\-/.test(v)) {
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|[\]\)\(\[\-\+\*\/])(?:var\s*\(([\s\S]*?)\)|(--[^\s]+))/g, function (m, q, a, b) {
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 = /^(@[^\s,]+)\s*\(\s*(@[^\s,]+\s*(?:,\s*@[^\s,]+\s*)*)?\)/.exec(k);
463
+ var match = /^([@\.#][^\s,]+)\s*\(([\s\S]*?)\)\s*$/.exec(k);
164
464
  if (!match) continue;
165
- p.base = base;
465
+ if (presets.test(match[1])) continue;
166
466
  var [, name, args] = match;
167
- args = args.split(",").map(a => a.trim());
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
- methods[name].push(function () {
172
- var body = evalthis(this);
173
- var valueMap = {};
174
- this.args.forEach((a, i) => {
175
- valueMap[a] = arguments[i];
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 in valueMap) return valueMap[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
- result.push(k, ":", calcvars(p.join(" ")), ';');
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
- k = calcvars(k);
203
- var match = /^(@\S+)\s*\(([\s\S]*)\)$/.exec(k);
204
- if (!match) continue;
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)/g, function () {
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
- return result.rest.map(a => a.join("")).concat(result).join(compress ? "" : "\r\n");
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
  }