efront 4.11.8 → 4.12.1

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.
@@ -18,6 +18,10 @@ var replaceHReg = new RegExp(numberReg.source + /\s*([\/\*])\s*/.source + number
18
18
  var replaceLReg = new RegExp(numberReg.source + /(\s*[\+\-]\s+|[\+\-])/.source + numberReg.source, 'gi');
19
19
  var replaceTReg = new RegExp(numberReg.source + /\s*[\/\*\+\-]\s*/.source + numberReg.source, 'i');
20
20
  var remove_quote = a => a.replace(/~\s*(['"`])((?:\\[\s\S]|[^'"`\\])*?)\1/g, '$2');
21
+ var keepdot = function (a) {
22
+ var g = Math.pow(10, Math.log10(a) | 0) * 1000;
23
+ return (a * g | 0) / g;
24
+ }
21
25
  var replace_punc = function (a) {
22
26
  if (typeof a !== "string") return a;
23
27
  a = remove_quote(a);
@@ -31,11 +35,11 @@ var replace_punc = function (a) {
31
35
  d2 = eval(d2);
32
36
  if (c === '*') {
33
37
  replaced = true;
34
- return d1 * d2 + p1;
38
+ return keepdot(d1 * d2) + p1;
35
39
  }
36
40
  if (c === '/') {
37
41
  replaced = true;
38
- return d1 / d2 + p1;
42
+ return keepdot(d1 / d2) + p1;
39
43
  }
40
44
  }
41
45
  return _;
@@ -50,11 +54,11 @@ var replace_punc = function (a) {
50
54
  c = c.trim();
51
55
  if (c === "+") {
52
56
  replaced = true;
53
- return (+d1 + +d2) + p1;
57
+ return keepdot(+d1 + +d2) + p1;
54
58
  }
55
59
  if (c === '-') {
56
60
  replaced = true;
57
- return (d1 - d2) + p1;
61
+ return keepdot(d1 - d2) + p1;
58
62
  }
59
63
  }
60
64
  return _;
@@ -124,7 +128,7 @@ var createArgMap = function (args, split = ',', equal = ':') {
124
128
  var o = args.first;
125
129
  var args = [];
126
130
  while (o) {
127
- if (!(o.type & (PROPERTY | EXPRESS))) {
131
+ if (!(o.type & (VALUE | STRAP | QUOTED | PROPERTY | EXPRESS))) {
128
132
  throw new Error(i18n`参数异常!`);
129
133
  }
130
134
  var k = o.text;
@@ -152,7 +156,7 @@ macros.calc = function (a) {
152
156
  };
153
157
  macros.range = function () {
154
158
  if (arguments.length === 1) {
155
- return ArrayFill(arguments[0], 0).map((a, i) => i + 1);
159
+ return ArrayFill(arguments[0], 0).map((a, i) => i + 1).join(' ');
156
160
  }
157
161
  if (arguments.length === 3) {
158
162
  var [start, end, step] = arguments;
@@ -169,22 +173,26 @@ macros.range = function () {
169
173
  end = parseFloat(end);
170
174
  step = parseFloat(step) || 1;
171
175
  var result = [];
172
- for (var temp = start; temp < end; temp += step) {
173
- result.push(temp.toFixed(fixed) + unit);
176
+ for (var temp = start; temp <= end; temp += step) {
177
+ result.push(+temp.toFixed(fixed) + unit);
174
178
  }
175
- return result;
179
+ return result.join(' ');
176
180
  }
177
181
  throw new Error(i18n`range参数错误:` + arguments);
178
182
  };
179
- macros.extract = function (list, index) {
180
- if (typeof list === 'string') list = list.split(',');
183
+ macros.extract = function () {
184
+ if (arguments.length === 2) var [list, index] = arguments;
185
+ else var index = arguments[arguments.length - 1], list = Array.prototype.slice.call(arguments, 0, arguments.length - 1);
186
+ index -= 1;
187
+ if (typeof list === 'string') list = getList(list);
181
188
  else if (list instanceof Array) {
182
- list = createArgMap(list.concat(list.rest).join(''), ';');
189
+ list = list.concat(list.rest);
183
190
  }
184
191
  return list[index];
185
192
  };
186
193
  macros.length = function (list) {
187
- if (typeof list === 'string') return list.split(',').length;
194
+ if (arguments.length !== 1) return arguments.length;
195
+ if (typeof list === 'string') return getList(list).length;
188
196
  else if (list instanceof Array) {
189
197
  return createArgMap(list.concat(list.rest).join(''), ';').length;
190
198
  }
@@ -198,6 +206,7 @@ macros.escape = function (a) {
198
206
  macros.e = function (a) {
199
207
  return strings.decode(a);
200
208
  };
209
+
201
210
  var wrapColor = function (k) {
202
211
  var f = color[k];
203
212
  macros[k] = function (c) {
@@ -227,35 +236,41 @@ macros[""] = function (a) {
227
236
  return a;
228
237
  };
229
238
 
230
- macros.each = function (list, body) {
239
+ var getList = function (list) {
240
+ list = splitParams(list);
241
+ if (list.length === 1) list = list[0].split(/\s+/);
242
+ return list;
243
+ };
244
+ macros.each = function () {
245
+ if (arguments.length !== 2) {
246
+ body = arguments[arguments.length - 1];
247
+ list = Array.prototype.slice.call(arguments, 0, arguments.length - 1).join(',');
248
+ }
249
+ else {
250
+ var [list, body] = arguments;
251
+ }
231
252
  var match = /^(?:\s*[#\.]?\(([\s\S]*?)\))?\s*\{([\s\S]*)\}$/.exec(body);
232
253
  if (!match) throw new Error(i18n`each参数异常!`);
233
254
  var [_, args, content] = match;
234
255
  if (!content) return;
235
- content = 素馨(content);
236
256
  if (args) args = args.split(",").map(a => a.trim());
237
257
  else args = [];
238
258
  if (args.length < 1) args.push("@value");
239
259
  if (args.length < 2) args.push("@key");
240
260
  if (args.length < 3) args.push("@index");
241
- if (typeof list === "string") list = splitParams(list);
261
+ if (typeof list === "string") list = getList(list);
242
262
  else if (list instanceof Array) {
243
263
  list = createArgMap(list.concat(list.rest).join(""), ';');
244
264
  }
245
265
  if (args.indexOf("@value") < 0) args.push("@value");
246
266
  if (args.indexOf("@key") < 0) args.push("@key");
247
267
  if (args.indexOf("@index") < 0) args.push("@index");
248
- var reg = new RegExp(args.join("|") + /|@\{[^@\{]+\}/.source, 'g');
249
268
  var defaults = list.defaults;
250
269
  var argsMap = null;
251
- var replace = a => {
252
- if (/^@\{/.test(a)) {
253
- var k = "@" + a.slice(2, -1).trim();
254
- if (k in argsMap) return strings.decode(argsMap[k]);
255
- return a;
256
- }
257
- if (a in argsMap) return argsMap[a];
258
- return a;
270
+ var match = /^(\s*)([\S\s]*?)(\s*)$/.exec(content);
271
+ if (match) var [, b, c, f] = match;
272
+ var replace = _ => {
273
+ return b + 素馨(args.map(a => a + ":" + argsMap[a] + ';').join('') + c, base, true) + f;
259
274
  };
260
275
  if (defaults) list = list.map(function (a, i) {
261
276
  argsMap = {
@@ -266,15 +281,18 @@ macros.each = function (list, body) {
266
281
  [args[1]]: a,
267
282
  [args[2]]: i + 1,
268
283
  };
269
- return content.replace(reg, replace);
284
+ return replace();
270
285
  });
271
286
  else list = list.map(function (a, i) {
272
287
  argsMap = {
273
288
  "@value": a,
274
289
  "@key": i + 1,
275
290
  "@index": i + 1,
291
+ [args[0]]: a,
292
+ [args[1]]: i,
293
+ [args[2]]: i + 1,
276
294
  };
277
- return content.replace(reg, replace);
295
+ return replace();
278
296
  });
279
297
  return list;
280
298
  };
@@ -318,80 +336,89 @@ class 素心 extends Program {
318
336
  }
319
337
  };
320
338
 
321
- 素心.prototype.createScoped = function (code) {
322
- var setVarsUsed = function (s) {
323
- var vars = null, used = null;
324
- for (var cx = s.length - 1; cx >= 0; cx--) {
325
- var { p: k, v } = s[cx];
326
- if (/^\-\-|^@[^\{]/.test(k) && !("used" in v) && v.length) {
327
- if (!vars) vars = Object.create(null);
328
- vars[k] = v.join(" ");
329
- s.splice(cx, 1);
330
- }
331
- else {
332
- if (!used) used = [];
333
- used.push({ p: k, v });
334
- }
339
+ var setVarsUsed = function (s) {
340
+ var vars = null, used = null;
341
+ for (var cx = s.length - 1; cx >= 0; cx--) {
342
+ var { p: k, v } = s[cx];
343
+ if (/^\-\-|^@[^\{]/.test(k) && !("used" in v) && v.length) {
344
+ if (!vars) vars = Object.create(null);
345
+ vars[k] = v.join(" ");
346
+ s.splice(cx, 1);
335
347
  }
336
- if (used) used.reverse();
337
- s.used = used;
338
- s.vars = vars;
339
- };
340
- var run = function (code) {
341
- var props = [];
342
- var propmap = Object.create(null);
343
- for (var cx = 0, dx = code.length; cx < dx; cx++) {
344
- var o = code[cx];
345
- if (o && (o.type & (SPACE | COMMENT) || o.type === STAMP && o.text === ';')) continue;
346
- if (!o.isprop) {
347
- console.log(createString([o]), o.type, createString(code))
348
- throw new Error(i18n`结构异常`);
349
- }
350
- var p = [], v = [];
351
- while (o && (o.type !== SCOPED || o.entry !== "{")) {
352
- if (o.type === STAMP && !o.isprop) break;
353
- p.push(o);
354
- o = code[++cx];
355
- }
356
- if (o && o.type === STAMP && o.text === ':') {
357
- var n = code[++cx];
358
- var tmp = [];
359
- while (n && (n.type !== STAMP || n.text !== ";")) {
360
- if (n.type === SCOPED && n.entry === '{') {
348
+ else {
349
+ if (!used) used = [];
350
+ used.push({ p: k, v });
351
+ }
352
+ }
353
+ if (used) used.reverse();
354
+ s.used = used;
355
+ s.vars = vars;
356
+ };
357
+ var createScoped = function (code) {
358
+ var props = [];
359
+ var propmap = Object.create(null);
360
+ for (var cx = 0, dx = code.length; cx < dx; cx++) {
361
+ var o = code[cx];
362
+ if (o && (o.type & (SPACE | COMMENT) || o.type === STAMP && o.text === ';')) continue;
363
+ if (!o.isprop) {
364
+ console.log(createString([o]), o.type, createString(code))
365
+ throw new Error(i18n`结构异常`);
366
+ }
367
+ var p = [], v = [];
368
+ while (o && (o.type !== SCOPED || o.entry !== "{")) {
369
+ if (o.type === STAMP && !o.isprop) break;
370
+ p.push(o);
371
+ a: if (o.type === SCOPED && o.entry === '(') {
372
+ var n = o.next;
373
+ if (n) {
374
+ if (n.type === STAMP && n.text === ';') break a;
375
+ if (n.type === SCOPED && n.entry === "{") break a;
376
+ if (p[0].type === PROPERTY && !/^@/.test(p[0].text)) {
377
+ o = n;
361
378
  break;
362
379
  }
363
- tmp.push(n);
364
- n = code[++cx];
365
- }
366
- if (n && n.type === SCOPED) {
367
- o.unary = true;
368
- p.push(o, ...tmp);
369
- v = run(n);
370
380
  }
371
- else {
372
- v = tmp;
381
+ }
382
+ o = code[++cx];
383
+ }
384
+ if (o && o.type === STAMP && o.text === ':') {
385
+ var n = code[++cx];
386
+ var tmp = [];
387
+ while (n && (n.type !== STAMP || n.text !== ";")) {
388
+ if (n.type === SCOPED && n.entry === '{') {
389
+ break;
373
390
  }
374
- o = n;
391
+ tmp.push(n);
392
+ n = code[++cx];
375
393
  }
376
- else if (o && o.type === SCOPED) {
377
- v = run(o);
394
+ if (n && n.type === SCOPED) {
395
+ o.unary = true;
396
+ p.push(o, ...tmp);
397
+ v = createScoped(n);
378
398
  }
379
- var pj = createString(p).trim();
380
- if (!propmap[pj]) propmap[pj] = [];
381
- var vs = [];
382
- if (v.used === undefined) {
383
- if (v.length) vs.push(createString(v).trim());
399
+ else {
400
+ v = tmp;
384
401
  }
385
- else vs.used = v.used, vs.vars = v.vars;
386
- props.push({ p: pj, v: vs })
387
- propmap[pj].push(vs);
402
+ o = n;
388
403
  }
389
- props.maps = propmap;
390
- setVarsUsed(props);
391
- return props;
392
- };
393
- return run(code);
404
+ else if (o && o.type === SCOPED && o.entry === "{") {
405
+ v = createScoped(o);
406
+ }
407
+ var pj = createString(p).trim();
408
+ if (!propmap[pj]) propmap[pj] = [];
409
+ var vs = [];
410
+ if (v.used === undefined) {
411
+ if (v.length) vs.push(createString(v).trim());
412
+ }
413
+ else vs.used = v.used, vs.vars = v.vars;
414
+ props.push({ p: pj, v: vs })
415
+ propmap[pj].push(vs);
416
+ }
417
+ props.maps = propmap;
418
+ setVarsUsed(props);
419
+ return props;
394
420
  };
421
+ 素心.prototype.createScoped = createScoped;
395
422
  素心.prototype.createString = createString;
396
423
  var getFromScopeList = function (name, varsList, value = name) {
397
424
  name = name.replace(/^@\{\s*(\S*)\s*\}$/g, '@$1');
@@ -401,7 +428,9 @@ var getFromScopeList = function (name, varsList, value = name) {
401
428
  if (name in o) queue = [];
402
429
  while (name in o) {
403
430
  name = o[name];
404
- if (typeof name !== "string" || !/^\-\-|^@[^\{]/.test(name)) return name;
431
+ if (typeof name !== 'string') return name;
432
+ name = strings.decode(name);
433
+ if (!/^\-\-|^@[^\{]/.test(name)) return name;
405
434
  if (queue.indexOf(name) >= 0) throw `变量环形引用,无法初始化:${queue}`;
406
435
  queue.push(name);
407
436
  }
@@ -430,8 +459,141 @@ var fixBase = function (b, a) {
430
459
  }).join(",");
431
460
  }).join(",");
432
461
  }
433
- function evalscoped(scoped, base = '') {
434
- base = removeSelectorSpace(base);
462
+ var Method = function () {
463
+ var valueMap = Object.create(null);
464
+ if (!this.base) this.base = base;
465
+ vlist.push(valueMap);
466
+ var argDefaults = this.args.defaults;
467
+ this.args.forEach((k, i) => {
468
+ var a = arguments[i];
469
+ if (a === undefined || a === null) a = seprateFunc(calcvars(argDefaults[k])).map(evalproc).join('');
470
+ valueMap[k] = a;
471
+ });
472
+ var replace = text => text.replace(this.reg, function (name) {
473
+ if (/^\@\{/.test(name)) {
474
+ var key = "@" + name.slice(2, -1);
475
+ if (key in valueMap) return strings.decode(valueMap[key]);
476
+ }
477
+ else if (name in valueMap) return valueMap[name];
478
+ return name;
479
+ });
480
+ var vars = this.vars;
481
+ if (vars) Object.keys(vars).forEach(k => {
482
+ valueMap[k] = seprateFunc(replace(calcvars(vars[k]))).map(evalproc).join('');
483
+ });
484
+ var body = evalthis(this);
485
+ var rest = body.rest.map(a => a.map(replace));
486
+ var body = body.map(replace);
487
+ body.rest = rest;
488
+ vlist.pop();
489
+ return body;
490
+ }
491
+ var vlist = [], mlist = [macros], clist = [], base = '';
492
+ var calcvars = function (v) {
493
+ return v.replace(/@[^\s\{\}\(\)\[\]\:\+\*\/,;\!\>\$\=\&\%\#\@'"`\?\.\/\|~#]+|@\{[^\}@]*\}/g, function (m) {
494
+ return getFromScopeList(m, vlist, m);
495
+ }).replace(/(^|\s|[\]\)\(\[\-\+\*\/,;])(?:var\s*\(([\s\S]*?)\)|(--\S+))/g, function (m, q, a, b) {
496
+ return q + getFromScopeList(b || a.trim(), vlist, m.slice(q.length));
497
+ });
498
+ };
499
+ var initvars = function (vars) {
500
+ for (var k in vars) {
501
+ var v = vars[k];
502
+ vars[k] = replace_punc(calcvars(v));
503
+ }
504
+ };
505
+ var evalthis = function (p) {
506
+ var temp = base;
507
+ base = p.base;
508
+ var res = eval2(p.used);
509
+ base = temp;
510
+ return res;
511
+ };
512
+ var evalproc = function (k, retnoparam) {
513
+ var match = (retnoparam !== false ? /^([^\(\)\s,;:]*)(?:\s*\(([\s\S]*)\))$/ : /^([^\(\)\s,;:]+)(?:\s*\(([\s\S]*)\))?$/).exec(k);
514
+ if (!match) return calcvars(k);
515
+ var [, name, params] = match;
516
+ var method = getFromScopeList(name, mlist);
517
+ if (!isFunction(method)) {
518
+ if (/^@/.test(name)) return calcvars(k);
519
+ var block = getFromScopeList(name, clist, null);
520
+ if (block) {
521
+ var res = [];
522
+ var rest = [];
523
+ block.map(eval2).forEach(e => {
524
+ res = res.concat(e);
525
+ rest = rest.concat(e.rest);
526
+ });
527
+ return res.concat(rest).join('');
528
+ }
529
+ else return k;
530
+ };
531
+ params = splitParams(params);
532
+ params = params.map(evalproc).map(replace_punc);
533
+ return method.apply(null, params);
534
+ };
535
+ var eval2 = function (props) {
536
+ var rest = [];
537
+ var result = [];
538
+ var methods = Object.create(null);
539
+ mlist.push(methods);
540
+ if (props.maps) clist.push(props.maps);
541
+
542
+ for (var { p: k, v: p } of props) {
543
+ if (p.used) {
544
+ var match = /^([@\.#][^\s,]+)\s*\(([\s\S]*?)\)\s*$/.exec(k);
545
+ if (!match) continue;
546
+ if (presets.test(match[1])) continue;
547
+ var [, name, args] = match;
548
+ args = createArgMap(args);
549
+ p.args = args;
550
+ p.reg = new RegExp(args.join("|") + /|@\{[^\}@]+\}/.source, 'g');
551
+ if (!methods[name]) methods[name] = [];
552
+ var argDefaults = args.defaults;
553
+ Object.keys(argDefaults).forEach(k => {
554
+ argDefaults[k] = calcvars(argDefaults[k]);
555
+ });
556
+ methods[name] = Method.bind(p);
557
+ p.isMethod = true;
558
+ }
559
+ }
560
+ for (var { p: k, v: p } of props) {
561
+ if (p.isMethod) continue;
562
+ if (p.used) {
563
+ k = calcvars(k);
564
+ k = removeSelectorSpace(k);
565
+ if (base && !p.rooted) p.base = fixBase(base, k);
566
+ else p.base = presets.test(k) ? `@{${k}}` : k;
567
+ var vars = shallowClone(p.vars);
568
+ if (vars) vlist.push(vars);
569
+ initvars(vars);
570
+ var value = evalthis(p);
571
+ if (vars) vlist.pop();
572
+ if (value.rest.length) rest = rest.concat(value.rest);
573
+ if (value.length) rest.push([p.base, '{', value.join(""), "}"]);
574
+ }
575
+ else if (p.length) {
576
+ k = calcvars(k);
577
+ p = calcvars(p.join(" "));
578
+ p = replace_punc(seprateFunc(p).map(evalproc).join(''));
579
+ result.push(k, ":", p, ';');
580
+ }
581
+ else {
582
+ var res = evalproc(k, false);
583
+ if (res instanceof Array) {
584
+ if (res.rest && res.rest.length) rest = rest.concat(res.rest);
585
+ if (res.length) result = result.concat(res);
586
+ }
587
+ }
588
+ }
589
+ mlist.pop();
590
+ if (props.maps) clist.pop();
591
+ result.rest = rest;
592
+ return result;
593
+ };
594
+ function evalscoped(scoped, scopeName = '') {
595
+ var _base = base;
596
+ base = removeSelectorSpace(scopeName);
435
597
  var smaps = scoped.maps;
436
598
  var root = smaps[":root"], scope = smaps[":scope"];
437
599
  var and = smaps["&"];
@@ -439,140 +601,13 @@ function evalscoped(scoped, base = '') {
439
601
  if (root) root.forEach(r => extend(vars, r.vars));
440
602
  if (scope) scope.forEach(s => extend(vars, s.vars));
441
603
  if (and) and.forEach(a => extend(vars, a.vars));
442
- var vlist = [vars];
443
- var mlist = [macros];
444
- var clist = [smaps];
445
- var calcvars = function (v) {
446
- return v.replace(/(^|\s|[\]\)\(\[\-\+\*\/,;])(?:var\s*\(([\s\S]*?)\)|(--\S+|@[^\s\{\}\(\)\[\]\:\+\*\/,;\!\>\$\=\&\%\#\@'"`\?\.\/\|~#]+|@\{[^\}@]*\}))/g, function (m, q, a, b) {
447
- return q + getFromScopeList(b || a.trim(), vlist, m.slice(q.length));
448
- });
449
- };
450
- var initvars = function (vars) {
451
- for (var k in vars) {
452
- var v = vars[k];
453
- vars[k] = replace_punc(calcvars(v));
454
- }
455
- };
604
+ vlist.push(vars);
605
+ clist.push(smaps);
456
606
  initvars(vars);
457
-
458
- var eval2 = function (props) {
459
- var rest = [];
460
- var result = [];
461
- var methods = Object.create(null);
462
- mlist.push(methods);
463
- if (props.maps) clist.push(props.maps);
464
- var evalthis = function (p) {
465
- var temp = base;
466
- base = p.base;
467
- var res = eval2(p.used);
468
- base = temp;
469
- return res;
470
- };
471
- var evalproc = function (k, retnoparam) {
472
- var match = (retnoparam !== false ? /^([^\(\)\s,;:]*)(?:\s*\(([\s\S]*)\))$/ : /^([^\(\)\s,;:]+)(?:\s*\(([\s\S]*)\))?$/).exec(k);
473
- if (!match) return calcvars(k);
474
- var [, name, params] = match;
475
- var method = getFromScopeList(name, mlist);
476
- if (!isFunction(method)) {
477
- if (/^@/.test(name)) return calcvars(k);
478
- var block = getFromScopeList(name, clist, null);
479
- if (block) {
480
- var res = [];
481
- var rest = [];
482
- block.map(eval2).forEach(e => {
483
- res = res.concat(e);
484
- rest = rest.concat(e.rest);
485
- });
486
- return res.concat(rest).join('');
487
- }
488
- else return k;
489
- };
490
- params = splitParams(params);
491
- params = params.map(evalproc).map(replace_punc);
492
- return method.apply(null, params);
493
- };
494
-
495
- for (var { p: k, v: p } of props) {
496
- if (p.used) {
497
- var match = /^([@\.#][^\s,]+)\s*\(([\s\S]*?)\)\s*$/.exec(k);
498
- if (!match) continue;
499
- if (presets.test(match[1])) continue;
500
- var [, name, args] = match;
501
- args = createArgMap(args);
502
- p.args = args;
503
- p.reg = new RegExp(args.join("|") + /|@\{[^\}@]+\}/.source, 'g');
504
- if (!methods[name]) methods[name] = [];
505
- var argDefaults = args.defaults;
506
- Object.keys(argDefaults).forEach(k => {
507
- argDefaults[k] = calcvars(argDefaults[k]);
508
- });
509
- methods[name] = function () {
510
- var valueMap = Object.create(null);
511
- this.base = p.base || base;
512
- vlist.push(valueMap);
513
- var argDefaults = this.args.defaults;
514
- this.args.forEach((k, i) => {
515
- var a = arguments[i];
516
- if (a === undefined || a === null) a = seprateFunc(calcvars(argDefaults[k])).map(evalproc).join('');
517
- valueMap[k] = a;
518
- });
519
- var replace = text => text.replace(this.reg, function (name) {
520
- if (/^\@\{/.test(name)) {
521
- var key = "@" + name.slice(2, -1);
522
- if (key in valueMap) return strings.decode(valueMap[key]);
523
- }
524
- else if (name in valueMap) return valueMap[name];
525
- return name;
526
- });
527
- var vars = this.vars;
528
- if (vars) Object.keys(vars).forEach(k => {
529
- valueMap[k] = seprateFunc(replace(calcvars(vars[k]))).map(evalproc).join('');
530
- });
531
- var body = evalthis(this);
532
- var rest = body.rest.map(a => a.map(replace));
533
- var body = body.map(replace);
534
- body.rest = rest;
535
- vlist.pop();
536
- return body;
537
- }.bind(p);
538
- p.isMethod = true;
539
- }
540
- }
541
- for (var { p: k, v: p } of props) {
542
- if (p.isMethod) continue;
543
- if (p.used) {
544
- k = calcvars(k);
545
- k = removeSelectorSpace(k);
546
- if (base && !p.rooted) p.base = fixBase(base, k);
547
- else p.base = presets.test(k) ? `@{${k}}` : k;
548
- var vars = shallowClone(p.vars);
549
- if (vars) vlist.push(vars);
550
- initvars(vars);
551
- var value = evalthis(p);
552
- if (vars) vlist.pop();
553
- if (value.rest.length) rest = rest.concat(value.rest);
554
- if (value.length) rest.push([p.base, '{', value.join(""), "}"]);
555
- }
556
- else if (p.length) {
557
- k = calcvars(k);
558
- p = calcvars(p.join(" "));
559
- p = replace_punc(seprateFunc(p).map(evalproc).join(''));
560
- result.push(k, ":", p, ';');
561
- }
562
- else {
563
- var res = evalproc(k, false);
564
- if (res instanceof Array) {
565
- if (res.rest && res.rest.length) rest = rest.concat(res.rest);
566
- if (res.length) result = result.concat(res);
567
- }
568
- }
569
- }
570
- mlist.pop();
571
- if (props.maps) clist.pop();
572
- result.rest = rest;
573
- return result;
574
- }
575
607
  var result = eval2(scoped, [vars]);
608
+ vlist.pop();
609
+ clist.pop();
610
+ base = _base;
576
611
  return result;
577
612
  }
578
613
  var rcss = null;
@@ -593,7 +628,7 @@ function 素馨(text, scopeName, compress) {
593
628
  queried = [];
594
629
  return b;
595
630
  }
596
- return result.rest.map(a => a.join("")).concat(result).map(a => {
631
+ return result.concat(result.rest.map(a => a.join(""))).map(a => {
597
632
  var ats = [];
598
633
  a = a.replace(/\s*@\{(@[^\}]*)\}/g, function (_, q) {
599
634
  q = q.replace(/((?:\s|\))(?:and|or))\(/g, '$1 (');
@@ -75,6 +75,17 @@ assert(素馨(`@media screen and(max-width:100px){&.a{b:1}}`, 'a'), `@media scre
75
75
  assert(素馨(`b{:not([resizing], [dragging]) {transition: padding .2s, margin .2s;}}`), `b :not([resizing], [dragging]){transition:padding .2s, margin .2s;}`);
76
76
  assert(素馨(`@a(@b){a@b{@w:@b/2;c:@w;}} @a(1); @a(2); @a(3)`), `a1{c:0.5;}\r\na2{c:1;}\r\na3{c:1.5;}`);
77
77
  assert(素馨(`a{filter:grayscale(.9)}`), `a{filter:grayscale(.9);}`);
78
+ assert(素馨(`a{each(1,2,3,4,5,(@a){a:@a})}`), `a{a:1;a:2;a:3;a:4;a:5;}`);
79
+ assert(素馨(`each(1,(@a){a{a:@a}})a>b{b:2}`), `a{a:1;}\r\na>b{b:2;}`);
80
+ assert(素馨(`each(2,(@a){@b:1/@a;a{a:@b}})`), `a{a:0.5;}`);
81
+ assert(素馨(`each(2,.(@a){@b:1/@a;a{a:@b}})`), `a{a:0.5;}`);
82
+ assert(素馨(`a{a:length(2)}`), `a{a:1;}`);
83
+ assert(素馨(`a{b:length(2,3)}`), `a{b:2;}`);
84
+ assert(素馨(`a{a:extract(2,1)}`), `a{a:2;}`);
85
+ assert(素馨(`a{a:extract(2,3,2)}`), `a{a:3;}`);
86
+ assert(素馨(`a{a:extract(2 3,2)}`), `a{a:3;}`);
87
+ assert(素馨(`value: range(10px, 30px, 10);`, '', true), `value:10px 20px 30px;`);
88
+ assert(素馨(`value: range(4);`, '', true), `value:1 2 3 4;`);
78
89
  assert(scanner2(`-0.2em .3em -0.2em 0`, new 素馨.素心)[0].text, '-0.2em');
79
90
  assert(scanner2(`-0.2em .3em -0.2em 0`, new 素馨.素心)[0].isdigit, true);
80
91
  assert(scanner2(`-0.2em .3em -0.2em 0`, new 素馨.素心)[2].text, ".3em");
@@ -41,6 +41,7 @@ presets.template = function (t) {
41
41
  var comment = document.createComment('template');
42
42
  comment.$scope = t.$scope;
43
43
  comment.$parentScopes = t.$parentScopes;
44
+ t.$comment = comment;
44
45
  if (t.$struct.binds.src) {
45
46
  care(comment, createTemplateNodes)
46
47
  }
@@ -274,7 +275,9 @@ var createRepeat = function (search, id = 0) {
274
275
  for (var k in clonedElements) {
275
276
  if (clonedElements1[k] !== clonedElements[k]) {
276
277
  var selected = clonedElements[k].selected;
277
- remove(clonedElements[k]);
278
+ var c = clonedElements[k];
279
+ if (!c.parentNode && c.$comment) remove(c.$comment);
280
+ else remove(clonedElements[k]);
278
281
  if (selected) { clonedElements1[k].selected = true; }
279
282
  }
280
283
  }