efront 4.11.8 → 4.12.0

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;
@@ -227,12 +231,18 @@ macros[""] = function (a) {
227
231
  return a;
228
232
  };
229
233
 
230
- macros.each = function (list, body) {
234
+ macros.each = function () {
235
+ if (arguments.length !== 2) {
236
+ body = arguments[arguments.length - 1];
237
+ list = Array.prototype.slice.call(arguments, 0, arguments.length - 1).join(',');
238
+ }
239
+ else {
240
+ var [list, body] = arguments;
241
+ }
231
242
  var match = /^(?:\s*[#\.]?\(([\s\S]*?)\))?\s*\{([\s\S]*)\}$/.exec(body);
232
243
  if (!match) throw new Error(i18n`each参数异常!`);
233
244
  var [_, args, content] = match;
234
245
  if (!content) return;
235
- content = 素馨(content);
236
246
  if (args) args = args.split(",").map(a => a.trim());
237
247
  else args = [];
238
248
  if (args.length < 1) args.push("@value");
@@ -245,17 +255,12 @@ macros.each = function (list, body) {
245
255
  if (args.indexOf("@value") < 0) args.push("@value");
246
256
  if (args.indexOf("@key") < 0) args.push("@key");
247
257
  if (args.indexOf("@index") < 0) args.push("@index");
248
- var reg = new RegExp(args.join("|") + /|@\{[^@\{]+\}/.source, 'g');
249
258
  var defaults = list.defaults;
250
259
  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;
260
+ var match = /^(\s*)([\S\s]*?)(\s*)$/.exec(content);
261
+ if (match) var [, b, c, f] = match;
262
+ var replace = _ => {
263
+ return b + 素馨(args.map(a => a + ":" + argsMap[a] + ';').join('') + c, base, true) + f;
259
264
  };
260
265
  if (defaults) list = list.map(function (a, i) {
261
266
  argsMap = {
@@ -266,15 +271,18 @@ macros.each = function (list, body) {
266
271
  [args[1]]: a,
267
272
  [args[2]]: i + 1,
268
273
  };
269
- return content.replace(reg, replace);
274
+ return replace();
270
275
  });
271
276
  else list = list.map(function (a, i) {
272
277
  argsMap = {
273
278
  "@value": a,
274
279
  "@key": i + 1,
275
280
  "@index": i + 1,
281
+ [args[0]]: a,
282
+ [args[1]]: i,
283
+ [args[2]]: i + 1,
276
284
  };
277
- return content.replace(reg, replace);
285
+ return replace();
278
286
  });
279
287
  return list;
280
288
  };
@@ -318,80 +326,89 @@ class 素心 extends Program {
318
326
  }
319
327
  };
320
328
 
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
- }
329
+ var setVarsUsed = function (s) {
330
+ var vars = null, used = null;
331
+ for (var cx = s.length - 1; cx >= 0; cx--) {
332
+ var { p: k, v } = s[cx];
333
+ if (/^\-\-|^@[^\{]/.test(k) && !("used" in v) && v.length) {
334
+ if (!vars) vars = Object.create(null);
335
+ vars[k] = v.join(" ");
336
+ s.splice(cx, 1);
335
337
  }
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 === '{') {
338
+ else {
339
+ if (!used) used = [];
340
+ used.push({ p: k, v });
341
+ }
342
+ }
343
+ if (used) used.reverse();
344
+ s.used = used;
345
+ s.vars = vars;
346
+ };
347
+ var createScoped = function (code) {
348
+ var props = [];
349
+ var propmap = Object.create(null);
350
+ for (var cx = 0, dx = code.length; cx < dx; cx++) {
351
+ var o = code[cx];
352
+ if (o && (o.type & (SPACE | COMMENT) || o.type === STAMP && o.text === ';')) continue;
353
+ if (!o.isprop) {
354
+ console.log(createString([o]), o.type, createString(code))
355
+ throw new Error(i18n`结构异常`);
356
+ }
357
+ var p = [], v = [];
358
+ while (o && (o.type !== SCOPED || o.entry !== "{")) {
359
+ if (o.type === STAMP && !o.isprop) break;
360
+ p.push(o);
361
+ a: if (o.type === SCOPED && o.entry === '(') {
362
+ var n = o.next;
363
+ if (n) {
364
+ if (n.type === STAMP && n.text === ';') break a;
365
+ if (n.type === SCOPED && n.entry === "{") break a;
366
+ if (p[0].type === PROPERTY && !/^@/.test(p[0].text)) {
367
+ o = n;
361
368
  break;
362
369
  }
363
- tmp.push(n);
364
- n = code[++cx];
365
370
  }
366
- if (n && n.type === SCOPED) {
367
- o.unary = true;
368
- p.push(o, ...tmp);
369
- v = run(n);
370
- }
371
- else {
372
- v = tmp;
371
+ }
372
+ o = code[++cx];
373
+ }
374
+ if (o && o.type === STAMP && o.text === ':') {
375
+ var n = code[++cx];
376
+ var tmp = [];
377
+ while (n && (n.type !== STAMP || n.text !== ";")) {
378
+ if (n.type === SCOPED && n.entry === '{') {
379
+ break;
373
380
  }
374
- o = n;
381
+ tmp.push(n);
382
+ n = code[++cx];
375
383
  }
376
- else if (o && o.type === SCOPED) {
377
- v = run(o);
384
+ if (n && n.type === SCOPED) {
385
+ o.unary = true;
386
+ p.push(o, ...tmp);
387
+ v = createScoped(n);
378
388
  }
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());
389
+ else {
390
+ v = tmp;
384
391
  }
385
- else vs.used = v.used, vs.vars = v.vars;
386
- props.push({ p: pj, v: vs })
387
- propmap[pj].push(vs);
392
+ o = n;
388
393
  }
389
- props.maps = propmap;
390
- setVarsUsed(props);
391
- return props;
392
- };
393
- return run(code);
394
+ else if (o && o.type === SCOPED && o.entry === "{") {
395
+ v = createScoped(o);
396
+ }
397
+ var pj = createString(p).trim();
398
+ if (!propmap[pj]) propmap[pj] = [];
399
+ var vs = [];
400
+ if (v.used === undefined) {
401
+ if (v.length) vs.push(createString(v).trim());
402
+ }
403
+ else vs.used = v.used, vs.vars = v.vars;
404
+ props.push({ p: pj, v: vs })
405
+ propmap[pj].push(vs);
406
+ }
407
+ props.maps = propmap;
408
+ setVarsUsed(props);
409
+ return props;
394
410
  };
411
+ 素心.prototype.createScoped = createScoped;
395
412
  素心.prototype.createString = createString;
396
413
  var getFromScopeList = function (name, varsList, value = name) {
397
414
  name = name.replace(/^@\{\s*(\S*)\s*\}$/g, '@$1');
@@ -401,7 +418,9 @@ var getFromScopeList = function (name, varsList, value = name) {
401
418
  if (name in o) queue = [];
402
419
  while (name in o) {
403
420
  name = o[name];
404
- if (typeof name !== "string" || !/^\-\-|^@[^\{]/.test(name)) return name;
421
+ if (typeof name !== 'string') return name;
422
+ name = strings.decode(name);
423
+ if (!/^\-\-|^@[^\{]/.test(name)) return name;
405
424
  if (queue.indexOf(name) >= 0) throw `变量环形引用,无法初始化:${queue}`;
406
425
  queue.push(name);
407
426
  }
@@ -430,8 +449,141 @@ var fixBase = function (b, a) {
430
449
  }).join(",");
431
450
  }).join(",");
432
451
  }
433
- function evalscoped(scoped, base = '') {
434
- base = removeSelectorSpace(base);
452
+ var Method = function () {
453
+ var valueMap = Object.create(null);
454
+ if (!this.base) this.base = base;
455
+ vlist.push(valueMap);
456
+ var argDefaults = this.args.defaults;
457
+ this.args.forEach((k, i) => {
458
+ var a = arguments[i];
459
+ if (a === undefined || a === null) a = seprateFunc(calcvars(argDefaults[k])).map(evalproc).join('');
460
+ valueMap[k] = a;
461
+ });
462
+ var replace = text => text.replace(this.reg, function (name) {
463
+ if (/^\@\{/.test(name)) {
464
+ var key = "@" + name.slice(2, -1);
465
+ if (key in valueMap) return strings.decode(valueMap[key]);
466
+ }
467
+ else if (name in valueMap) return valueMap[name];
468
+ return name;
469
+ });
470
+ var vars = this.vars;
471
+ if (vars) Object.keys(vars).forEach(k => {
472
+ valueMap[k] = seprateFunc(replace(calcvars(vars[k]))).map(evalproc).join('');
473
+ });
474
+ var body = evalthis(this);
475
+ var rest = body.rest.map(a => a.map(replace));
476
+ var body = body.map(replace);
477
+ body.rest = rest;
478
+ vlist.pop();
479
+ return body;
480
+ }
481
+ var vlist = [], mlist = [macros], clist = [], base = '';
482
+ var calcvars = function (v) {
483
+ return v.replace(/@[^\s\{\}\(\)\[\]\:\+\*\/,;\!\>\$\=\&\%\#\@'"`\?\.\/\|~#]+|@\{[^\}@]*\}/g, function (m) {
484
+ return getFromScopeList(m, vlist, m);
485
+ }).replace(/(^|\s|[\]\)\(\[\-\+\*\/,;])(?:var\s*\(([\s\S]*?)\)|(--\S+))/g, function (m, q, a, b) {
486
+ return q + getFromScopeList(b || a.trim(), vlist, m.slice(q.length));
487
+ });
488
+ };
489
+ var initvars = function (vars) {
490
+ for (var k in vars) {
491
+ var v = vars[k];
492
+ vars[k] = replace_punc(calcvars(v));
493
+ }
494
+ };
495
+ var evalthis = function (p) {
496
+ var temp = base;
497
+ base = p.base;
498
+ var res = eval2(p.used);
499
+ base = temp;
500
+ return res;
501
+ };
502
+ var evalproc = function (k, retnoparam) {
503
+ var match = (retnoparam !== false ? /^([^\(\)\s,;:]*)(?:\s*\(([\s\S]*)\))$/ : /^([^\(\)\s,;:]+)(?:\s*\(([\s\S]*)\))?$/).exec(k);
504
+ if (!match) return calcvars(k);
505
+ var [, name, params] = match;
506
+ var method = getFromScopeList(name, mlist);
507
+ if (!isFunction(method)) {
508
+ if (/^@/.test(name)) return calcvars(k);
509
+ var block = getFromScopeList(name, clist, null);
510
+ if (block) {
511
+ var res = [];
512
+ var rest = [];
513
+ block.map(eval2).forEach(e => {
514
+ res = res.concat(e);
515
+ rest = rest.concat(e.rest);
516
+ });
517
+ return res.concat(rest).join('');
518
+ }
519
+ else return k;
520
+ };
521
+ params = splitParams(params);
522
+ params = params.map(evalproc).map(replace_punc);
523
+ return method.apply(null, params);
524
+ };
525
+ var eval2 = function (props) {
526
+ var rest = [];
527
+ var result = [];
528
+ var methods = Object.create(null);
529
+ mlist.push(methods);
530
+ if (props.maps) clist.push(props.maps);
531
+
532
+ for (var { p: k, v: p } of props) {
533
+ if (p.used) {
534
+ var match = /^([@\.#][^\s,]+)\s*\(([\s\S]*?)\)\s*$/.exec(k);
535
+ if (!match) continue;
536
+ if (presets.test(match[1])) continue;
537
+ var [, name, args] = match;
538
+ args = createArgMap(args);
539
+ p.args = args;
540
+ p.reg = new RegExp(args.join("|") + /|@\{[^\}@]+\}/.source, 'g');
541
+ if (!methods[name]) methods[name] = [];
542
+ var argDefaults = args.defaults;
543
+ Object.keys(argDefaults).forEach(k => {
544
+ argDefaults[k] = calcvars(argDefaults[k]);
545
+ });
546
+ methods[name] = Method.bind(p);
547
+ p.isMethod = true;
548
+ }
549
+ }
550
+ for (var { p: k, v: p } of props) {
551
+ if (p.isMethod) continue;
552
+ if (p.used) {
553
+ k = calcvars(k);
554
+ k = removeSelectorSpace(k);
555
+ if (base && !p.rooted) p.base = fixBase(base, k);
556
+ else p.base = presets.test(k) ? `@{${k}}` : k;
557
+ var vars = shallowClone(p.vars);
558
+ if (vars) vlist.push(vars);
559
+ initvars(vars);
560
+ var value = evalthis(p);
561
+ if (vars) vlist.pop();
562
+ if (value.rest.length) rest = rest.concat(value.rest);
563
+ if (value.length) rest.push([p.base, '{', value.join(""), "}"]);
564
+ }
565
+ else if (p.length) {
566
+ k = calcvars(k);
567
+ p = calcvars(p.join(" "));
568
+ p = replace_punc(seprateFunc(p).map(evalproc).join(''));
569
+ result.push(k, ":", p, ';');
570
+ }
571
+ else {
572
+ var res = evalproc(k, false);
573
+ if (res instanceof Array) {
574
+ if (res.rest && res.rest.length) rest = rest.concat(res.rest);
575
+ if (res.length) result = result.concat(res);
576
+ }
577
+ }
578
+ }
579
+ mlist.pop();
580
+ if (props.maps) clist.pop();
581
+ result.rest = rest;
582
+ return result;
583
+ };
584
+ function evalscoped(scoped, scopeName = '') {
585
+ var _base = base;
586
+ base = removeSelectorSpace(scopeName);
435
587
  var smaps = scoped.maps;
436
588
  var root = smaps[":root"], scope = smaps[":scope"];
437
589
  var and = smaps["&"];
@@ -439,140 +591,13 @@ function evalscoped(scoped, base = '') {
439
591
  if (root) root.forEach(r => extend(vars, r.vars));
440
592
  if (scope) scope.forEach(s => extend(vars, s.vars));
441
593
  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
- };
594
+ vlist.push(vars);
595
+ clist.push(smaps);
456
596
  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
597
  var result = eval2(scoped, [vars]);
598
+ vlist.pop();
599
+ clist.pop();
600
+ base = _base;
576
601
  return result;
577
602
  }
578
603
  var rcss = null;
@@ -593,7 +618,7 @@ function 素馨(text, scopeName, compress) {
593
618
  queried = [];
594
619
  return b;
595
620
  }
596
- return result.rest.map(a => a.join("")).concat(result).map(a => {
621
+ return result.concat(result.rest.map(a => a.join(""))).map(a => {
597
622
  var ats = [];
598
623
  a = a.replace(/\s*@\{(@[^\}]*)\}/g, function (_, q) {
599
624
  q = q.replace(/((?:\s|\))(?:and|or))\(/g, '$1 (');
@@ -75,6 +75,9 @@ 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;}`);
78
81
  assert(scanner2(`-0.2em .3em -0.2em 0`, new 素馨.素心)[0].text, '-0.2em');
79
82
  assert(scanner2(`-0.2em .3em -0.2em 0`, new 素馨.素心)[0].isdigit, true);
80
83
  assert(scanner2(`-0.2em .3em -0.2em 0`, new 素馨.素心)[2].text, ".3em");
@@ -323,13 +323,24 @@ function tree() {
323
323
  var limit = useLimit && top + h > limitHeight;
324
324
  css(p, {
325
325
  position: 'sticky',
326
+ zIndex: 2,
326
327
  top: limit ? limitHeight - h : top, zIndex: 3 - limit
327
328
  });
328
329
  top += h;
329
330
  });
330
331
  stickys.top = top;
331
332
  }
333
+ var unSticky = function () {
334
+ stickys.forEach(s => {
335
+ css(s, {
336
+ position: '',
337
+ top: '',
338
+ zIndex: 1
339
+ })
340
+ })
341
+ }
332
342
  var refresh = function () {
343
+ unSticky();
333
344
  var index = banner.index();
334
345
  var needremoves = dom.map(d => d.$target).filter(d => !!d);
335
346
  dom = getArrayFromTree(root, banner.joined);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "4.11.8",
3
+ "version": "4.12.0",
4
4
  "description": "简化前端开发,优化web性能",
5
5
  "main": "public/efront.js",
6
6
  "directories": {