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
|
|
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 (
|
|
180
|
-
if (
|
|
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 =
|
|
189
|
+
list = list.concat(list.rest);
|
|
183
190
|
}
|
|
184
191
|
return list[index];
|
|
185
192
|
};
|
|
186
193
|
macros.length = function (list) {
|
|
187
|
-
if (
|
|
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
|
-
|
|
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 =
|
|
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
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
372
|
-
|
|
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
|
-
|
|
391
|
+
tmp.push(n);
|
|
392
|
+
n = code[++cx];
|
|
375
393
|
}
|
|
376
|
-
|
|
377
|
-
|
|
394
|
+
if (n && n.type === SCOPED) {
|
|
395
|
+
o.unary = true;
|
|
396
|
+
p.push(o, ...tmp);
|
|
397
|
+
v = createScoped(n);
|
|
378
398
|
}
|
|
379
|
-
|
|
380
|
-
|
|
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
|
-
|
|
386
|
-
props.push({ p: pj, v: vs })
|
|
387
|
-
propmap[pj].push(vs);
|
|
402
|
+
o = n;
|
|
388
403
|
}
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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 !==
|
|
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
|
-
|
|
434
|
-
|
|
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
|
-
|
|
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
|
-
};
|
|
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(""))
|
|
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");
|
package/coms/zimoli/render.js
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|