efront 4.11.6 → 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");
@@ -3,12 +3,13 @@
3
3
  box-shadow: none !important;
4
4
  display: block;
5
5
  line-height: 22px;
6
- border-bottom: 1px;
6
+ padding: 8px 0;
7
+ border-bottom: 1px solid #0001;
7
8
  }
8
9
 
9
10
  >.head,
10
11
  >.foot {
11
- padding: 10px 16px;
12
+ padding: 2px 16px;
12
13
  vertical-align: top;
13
14
  display: inline-block;
14
15
  position: absolute;
@@ -24,6 +25,12 @@ model {
24
25
  }
25
26
 
26
27
  >.head {
28
+ font-weight: 600;
29
+ font-family: "宋体";
30
+
31
+ &:after {
32
+ content: ":";
33
+ }
27
34
 
28
35
  .image {
29
36
  margin: 10px 0;
@@ -35,10 +42,10 @@ model {
35
42
  margin: 10px 0;
36
43
  }
37
44
 
45
+ min-height: 30px;
38
46
  vertical-align: top;
39
- padding: 10px 20px;
47
+ padding: 2px 16px;
40
48
  height: 100%;
41
- border-bottom: 1px solid #0001;
42
49
  display: inline-block;
43
50
  width: 100%;
44
51
  text-align: left;
@@ -543,7 +543,7 @@ var directives = {
543
543
  var parsedSrc = this.$src;
544
544
  return src2.call(this, parsedSrc && /[\{\[\s]/.test(src) ? parsedSrc.srcName : src);
545
545
  },
546
- model(search, target) {
546
+ model(search, target, change) {
547
547
  var getter = createGetter(this, search);
548
548
  var oldValue;
549
549
  var getstr = target.getValue instanceof Function ? "this.getValue()" : "";
@@ -561,12 +561,12 @@ var directives = {
561
561
  oldValue = value;
562
562
  this[key] = value;
563
563
  };
564
- if (/^input$/i.test(target.tagName) && /^checkbox$/i.test(target.type) || /^checkbox$/i.test(target.tagName)) {
565
- this.$renders.push(setter || setter2.bind(target, 'checked'));
566
- var change = getstr || "this.checked";
567
- } else if (("value" in target || target.getValue instanceof Function) && target.setValue instanceof Function) {
564
+ if (("value" in target || target.getValue instanceof Function) && target.setValue instanceof Function) {
568
565
  this.$renders.push(setter);
569
566
  var change = getstr || "this.value";
567
+ } else if (/^input$/i.test(target.tagName) && /^checkbox$/i.test(target.type) || /^checkbox$/i.test(target.tagName)) {
568
+ this.$renders.push(setter || setter2.bind(target, 'checked'));
569
+ var change = getstr || "this.checked";
570
570
  } else if (/^(select|input|textarea)$/i.test(target.tagName) || "value" in target) {
571
571
  this.$renders.push(setter || setter2.bind(target, 'value'));
572
572
  var change = getstr || "this.value";
@@ -580,6 +580,7 @@ var directives = {
580
580
  });
581
581
  var change = getstr || "'value' in this?this.value:this.innerHTML";
582
582
  }
583
+ if (change === false) return;
583
584
  setter2 = null;
584
585
  var changeme = $$eval.bind(this, search + "=" + change, getScopeList(this));
585
586
  var onchange = function () {
@@ -593,6 +594,9 @@ var directives = {
593
594
  };
594
595
  eventsBinders.forEach(on => on(target, onchange, true));
595
596
  },
597
+ value(search, target) {
598
+ directives.model.call(this, search, target, false);
599
+ },
596
600
 
597
601
  };
598
602
  // property binder
@@ -993,7 +997,7 @@ function createStructure(element, useExists) {
993
997
  }
994
998
  // ng-html,ng-src,ng-text,ng-model,ng-style,ng-class,...
995
999
  var key = name.replace(/^(ng|v|[^\_\:\.]*?)\-|^[\:\_\.]|^v\-bind\:/i, "").toLowerCase();
996
- if (directives.hasOwnProperty(key) || /^([\_\:\.]|v\-bind\:)/.test(name)) {
1000
+ if (key.length !== name.length && directives.hasOwnProperty(key) || /^([\_\:\.]|v\-bind\:)/.test(name)) {
997
1001
  if (value) binds[key] = value;
998
1002
  element.removeAttribute(name);
999
1003
  }