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 (
|
|
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
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
322
|
-
var
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
if (
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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
|
-
|
|
381
|
+
tmp.push(n);
|
|
382
|
+
n = code[++cx];
|
|
375
383
|
}
|
|
376
|
-
|
|
377
|
-
|
|
384
|
+
if (n && n.type === SCOPED) {
|
|
385
|
+
o.unary = true;
|
|
386
|
+
p.push(o, ...tmp);
|
|
387
|
+
v = createScoped(n);
|
|
378
388
|
}
|
|
379
|
-
|
|
380
|
-
|
|
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
|
-
|
|
386
|
-
props.push({ p: pj, v: vs })
|
|
387
|
-
propmap[pj].push(vs);
|
|
392
|
+
o = n;
|
|
388
393
|
}
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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 !==
|
|
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
|
-
|
|
434
|
-
|
|
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
|
-
|
|
443
|
-
|
|
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(""))
|
|
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");
|
package/coms/zimoli/tree.js
CHANGED
|
@@ -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);
|