efront 4.35.3 → 4.35.5
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.
- package/#/345/233/275/351/231/205/345/214/226.yml +3 -0
- package/coms/basic/Table.js +26 -0
- package/coms/basic/escapeRegExp.js +24 -0
- package/coms/basic/escapeRegExp_test.js +35 -0
- package/coms/basic/math.js +77 -0
- package/coms/basic/math.md +97 -0
- package/coms/basic/spaces.js +1 -1
- package/coms/basic/strings.js +8 -5
- package/coms/compile/Html.js +15 -7
- package/coms/compile/Program.js +3 -1
- package/coms/compile/autoeval.js +2 -2
- package/coms/compile/autoeval_test.js +5 -0
- package/coms/compile/scanner2.js +1 -1
- package/coms/compile//347/256/227/345/274/217.js +38 -7
- package/coms/compile//347/256/227/345/274/217_test.js +6 -2
- package/coms/compile//347/264/240/351/246/250.js +8 -7
- package/coms/compile//347/264/240/351/246/250_test.js +8 -2
- package/coms/explorer/main.less +1 -0
- package/coms/reptile/colors.js +2 -1
- package/coms/zimoli/arriswise.js +1 -1
- package/coms/zimoli/color-config.less +1 -1
- package/coms/zimoli/confirm.js +1 -1
- package/coms/zimoli/popup.js +1 -1
- package/coms/zimoli/prompt.js +4 -1
- package/coms/zimoli/scrollbar.less +1 -1
- package/coms/zimoli/table.js +1 -1
- package/coms/zimoli/vbox.js +1 -0
- package/coms//350/214/250/350/217/260//344/270/212/350/211/262.xht +5 -1
- package/coms//350/214/250/350/217/260//346/240/207/347/255/276/345/214/226.js +9 -1
- package/coms//350/214/250/350/217/260//346/270/262/346/237/223.js +1 -1
- package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +16 -2
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/public//346/226/207/344/273/266/347/263/273/347/273/237//344/270/273/351/241/265.jsp +2 -2
- package/debug.log +0 -3
package/coms/basic/Table.js
CHANGED
|
@@ -54,6 +54,32 @@ class Table extends Array {
|
|
|
54
54
|
});
|
|
55
55
|
this.update();
|
|
56
56
|
}
|
|
57
|
+
clone() {
|
|
58
|
+
var t = new Table;
|
|
59
|
+
t.fields = this.fields;
|
|
60
|
+
t.source = this.source;
|
|
61
|
+
t.searchFields = this.searchFields;
|
|
62
|
+
t.summaryFields = this.summaryFields;
|
|
63
|
+
return t;
|
|
64
|
+
}
|
|
65
|
+
toSorted(field) {
|
|
66
|
+
var t = this.clone();
|
|
67
|
+
t.sort(field);
|
|
68
|
+
return t;
|
|
69
|
+
}
|
|
70
|
+
toReversed() {
|
|
71
|
+
var t = this.clone();
|
|
72
|
+
t.length = this.length;
|
|
73
|
+
for (var cx = 0, dx = this.length; cx < dx; cx++) {
|
|
74
|
+
t[dx - cx] = this[cx];
|
|
75
|
+
}
|
|
76
|
+
return t;
|
|
77
|
+
}
|
|
78
|
+
toSpliced() {
|
|
79
|
+
var t = this.clone();
|
|
80
|
+
t.splice.apply(t, arguments);
|
|
81
|
+
return t;
|
|
82
|
+
}
|
|
57
83
|
unsort() {
|
|
58
84
|
this.sorted = null;
|
|
59
85
|
this.update();
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
if (RegExp.escape) return RegExp.escape;
|
|
2
|
+
var tnvfr = 'tnvfr';
|
|
3
|
+
var replaceFirst = function (m) {
|
|
4
|
+
return "\\x" + m.charCodeAt().toString(16)
|
|
5
|
+
}
|
|
6
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#white_space
|
|
7
|
+
// https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=%5Cp%7BGeneral_Category%3DSpace_Separator%7D
|
|
8
|
+
var syntaxReg = /(^[0-9a-fA-F])|([\^\$\\\.\*\+\?\(\)\[\]\{\}\|\/])|([,\-\=\<\>#\&\!%\:;@~'`"\x20\xa0])|([\u0009-\u000d])|([\ud800-\udfff\ufeff\u2028\u2029\u1680\u2000-\u200a\u202f\u205f\u3000])/g;
|
|
9
|
+
var replaceSynax = function (_, z, a, b, c, d) {
|
|
10
|
+
if (z) return replaceFirst(z);
|
|
11
|
+
if (a) return "\\" + a;
|
|
12
|
+
if (b) return "\\x" + b.charCodeAt().toString(16);
|
|
13
|
+
if (c) return "\\" + tnvfr.charAt(c.charCodeAt() - 9);
|
|
14
|
+
if (d) {
|
|
15
|
+
d = d.charCodeAt();
|
|
16
|
+
if (d <= 0xff) return "\\u00" + d.toString(16);
|
|
17
|
+
return "\\u" + d.toString(16);
|
|
18
|
+
}
|
|
19
|
+
return _;
|
|
20
|
+
}
|
|
21
|
+
function escapeRegExp(string) {
|
|
22
|
+
return string.replace(syntaxReg, replaceSynax)
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var escape = RegExp.escape;
|
|
2
|
+
delete RegExp.escape;
|
|
3
|
+
var escapeRegExp = require("./escapeRegExp");
|
|
4
|
+
var test = function (a) {
|
|
5
|
+
assert(escapeRegExp(a), escape(a))
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
test('0')
|
|
9
|
+
test('9')
|
|
10
|
+
test('a')
|
|
11
|
+
test('b')
|
|
12
|
+
test('c')
|
|
13
|
+
test('d')
|
|
14
|
+
test('e')
|
|
15
|
+
test('f')
|
|
16
|
+
test('foo')
|
|
17
|
+
test(' ');
|
|
18
|
+
test('\u00a0')
|
|
19
|
+
test('\u0085')
|
|
20
|
+
test('\ufeff')
|
|
21
|
+
test('\ufffe')
|
|
22
|
+
test('\u8fff')
|
|
23
|
+
test('\u8fff')
|
|
24
|
+
test('\u1680')
|
|
25
|
+
test('\u2000')
|
|
26
|
+
test('\u2009')
|
|
27
|
+
test('\u0009')
|
|
28
|
+
test('\u0008')
|
|
29
|
+
test('\u000d')
|
|
30
|
+
test('\u202f')
|
|
31
|
+
test('\u2028')
|
|
32
|
+
test('\u2029')
|
|
33
|
+
test('\u3000')
|
|
34
|
+
test('\u2000')
|
|
35
|
+
test('\u1680')
|
package/coms/basic/math.js
CHANGED
|
@@ -3,6 +3,7 @@ var mo3 = (o, args) => args.length === 1 ? args[0] + `<ms>${o}</ms>` : args.join
|
|
|
3
3
|
var ms = s => `<ms>${s}</ms>`;
|
|
4
4
|
var mroot = (d, z) => `<mroot>${d}${z}</mroot>`;
|
|
5
5
|
var msqrt = a => `<msqrt>${a}</msqrt>`;
|
|
6
|
+
var mdot = a => `<mover><mn>${a}</mn><ms>・</ms></mover>`;
|
|
6
7
|
var mi = s => `<mi>${s}</mi>`;
|
|
7
8
|
var mn = s => `<mn>${s}</mn>`;
|
|
8
9
|
var mi2 = (s, a, n) => {
|
|
@@ -69,6 +70,31 @@ var 三角函数 = {
|
|
|
69
70
|
return mi2("arccsc", a, n);
|
|
70
71
|
},
|
|
71
72
|
};
|
|
73
|
+
var roman = {
|
|
74
|
+
I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000
|
|
75
|
+
};
|
|
76
|
+
var toRoman = function (n) {
|
|
77
|
+
if (n > 3888 || (n | 0) !== n || n < 1) return `<mo>(</mo><ms>Roman</ms><mo>,</mo><mn>${n}</mn><mo>)</mo>`;
|
|
78
|
+
var [a = 0, b = 0, c = 0, d = 0] = n.toString().split("").reverse();
|
|
79
|
+
a = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"][a];
|
|
80
|
+
b = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"][b];
|
|
81
|
+
c = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"][c];
|
|
82
|
+
d = ["", "M", "MM", "MMM"][d];
|
|
83
|
+
return d + c + b + a;
|
|
84
|
+
};
|
|
85
|
+
var circles = "①②③④⑤⑥⑦⑧⑨⑩";
|
|
86
|
+
|
|
87
|
+
var tabs = {
|
|
88
|
+
roman(...args) {
|
|
89
|
+
return " " + args
|
|
90
|
+
.map(toRoman)
|
|
91
|
+
.map(a => `<mn>${a}</mn>`)
|
|
92
|
+
.join('<ms> </ms>');
|
|
93
|
+
},
|
|
94
|
+
circle(...args) {
|
|
95
|
+
return args.map(n => circles.charAt(n - 1)).map(a => `<mn>${a}</mn>`).join('');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
72
98
|
|
|
73
99
|
var funcmap = {
|
|
74
100
|
"+"(...args) {
|
|
@@ -86,6 +112,12 @@ var funcmap = {
|
|
|
86
112
|
"*"(...args) {
|
|
87
113
|
return args.join("");
|
|
88
114
|
},
|
|
115
|
+
">="(...args) {
|
|
116
|
+
return mo3("≥", args);
|
|
117
|
+
},
|
|
118
|
+
"<="(...args) {
|
|
119
|
+
return mo3("≤", args);
|
|
120
|
+
},
|
|
89
121
|
"vector"(name, ...args) {
|
|
90
122
|
name = `<mover>${name}<mo>→</mo></mover>`;
|
|
91
123
|
if (args.length) {
|
|
@@ -105,6 +137,12 @@ var funcmap = {
|
|
|
105
137
|
abs(a) {
|
|
106
138
|
return `<mo>|</mo>${a}<mo>|</mo>`;
|
|
107
139
|
},
|
|
140
|
+
log(x, n) {
|
|
141
|
+
return `<msub><mo>log</mo>${n}</msub>${x}`
|
|
142
|
+
},
|
|
143
|
+
ln(x){
|
|
144
|
+
return `<mo>ln</mo>${x}`
|
|
145
|
+
},
|
|
108
146
|
"div"(...args) {
|
|
109
147
|
return mo3("÷", args);
|
|
110
148
|
},
|
|
@@ -122,6 +160,9 @@ var funcmap = {
|
|
|
122
160
|
},
|
|
123
161
|
sigma: series,
|
|
124
162
|
series,
|
|
163
|
+
group(...args) {
|
|
164
|
+
return `<mo>{</mo><mtable><mtr><mtd>${args.join("</mtd></mtr><mtr><mtd>")}</mtd></mtr></mtable>`
|
|
165
|
+
},
|
|
125
166
|
'!='(...args) {
|
|
126
167
|
return mo3("≉", args);
|
|
127
168
|
},
|
|
@@ -189,6 +230,9 @@ var puncmap = {
|
|
|
189
230
|
"_"(a, ...args) {
|
|
190
231
|
return qt(msub, a, args);
|
|
191
232
|
},
|
|
233
|
+
corner(name) {
|
|
234
|
+
return mo2("∠", name);
|
|
235
|
+
},
|
|
192
236
|
|
|
193
237
|
// "积分": "∫",
|
|
194
238
|
// "summa": "∫",
|
|
@@ -256,6 +300,9 @@ var br = function () {
|
|
|
256
300
|
};
|
|
257
301
|
function toString(obj, p, deep) {
|
|
258
302
|
if (obj instanceof Array) {
|
|
303
|
+
if (deep == 1 && obj.length === 2 && obj[1].tab) {
|
|
304
|
+
return toString(obj[0], 0, deep) + "</mtd><mtd>" + obj.slice(1, obj.length).map(a => toString(a, 0, 0)).join("</mtd><mtd>");
|
|
305
|
+
}
|
|
259
306
|
deep++;
|
|
260
307
|
var args = obj.map(a => toString(a, deep > 1 ? 0 : p, deep));
|
|
261
308
|
deep--;
|
|
@@ -277,6 +324,35 @@ function toString(obj, p, deep) {
|
|
|
277
324
|
for (var k in obj) break;
|
|
278
325
|
if (!k) return '';
|
|
279
326
|
var origin = obj[k];
|
|
327
|
+
if (k === '..') {
|
|
328
|
+
var [prefix, rep, dots, e] = origin;
|
|
329
|
+
prefix = String(prefix);
|
|
330
|
+
if (typeof rep === 'number') rep = String(rep);
|
|
331
|
+
if (rep && !/\./.test(prefix)) prefix += '.';
|
|
332
|
+
if (typeof e === 'number') e = String(e);
|
|
333
|
+
if (!rep) rep = '';
|
|
334
|
+
else if (rep.length === 1) {
|
|
335
|
+
rep = mdot(rep);
|
|
336
|
+
}
|
|
337
|
+
else if (rep.length >= 2) {
|
|
338
|
+
rep = mdot(rep.charAt(0)) + mn(rep.slice(1, rep.length - 1)) + mdot(rep.charAt(rep.length - 1));
|
|
339
|
+
}
|
|
340
|
+
else rep = mn(rep);
|
|
341
|
+
if (dots) dots = mn(dots);
|
|
342
|
+
else dots = '';
|
|
343
|
+
if (e) e = `<mo>×</mo><msup><mn>10</mn><mn>${e}</mn></msup>`;
|
|
344
|
+
else e = '';
|
|
345
|
+
prefix = mn(prefix);
|
|
346
|
+
return mrow([prefix, rep, dots, e].join(''), e ? p >= pmap["*"] : false, deep);
|
|
347
|
+
}
|
|
348
|
+
if (k === 'tab') {
|
|
349
|
+
k = origin.shift();
|
|
350
|
+
if (!origin.length || !(k in tabs)) {
|
|
351
|
+
var args = origin.map(a => toString(a, 0, deep));
|
|
352
|
+
return mrow(`<ms>(</ms>${k}${args.length ? "<ms>,</ms>" + args.join('<ms>,</ms>') : ''}<ms>)</ms>`, -1, deep);
|
|
353
|
+
}
|
|
354
|
+
return mrow(tabs[k](...origin), -1, deep);
|
|
355
|
+
}
|
|
280
356
|
if (k in 三角函数) {
|
|
281
357
|
var args = origin.map(a => toString(a, pmap["*"], 0));
|
|
282
358
|
obj = 三角函数[k](...args);
|
|
@@ -296,6 +372,7 @@ function toString(obj, p, deep) {
|
|
|
296
372
|
return mrow(`<mi>${希腊[k] || k}</mi>${mrow(args instanceof Array ? args.join('<mo>,</mo>') : args, true)}`, false, deep);
|
|
297
373
|
}
|
|
298
374
|
if (args instanceof Array) {
|
|
375
|
+
|
|
299
376
|
if (k === '*') {
|
|
300
377
|
var allnum = true;
|
|
301
378
|
var bx = 1;
|
package/coms/basic/math.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# 数学公式生成工具
|
|
2
|
+
在2023年及以后的浏览器(Chrome109, Firefox1, Safari5.1, ...)中可用
|
|
3
|
+
受支持的浏览器参考 [https://developer.mozilla.org/zh-CN/docs/Web/MathML](https://developer.mozilla.org/zh-CN/docs/Web/MathML)
|
|
2
4
|
使用方法有如下两种:
|
|
3
5
|
1. 直接传入解析结构
|
|
4
6
|
```javascript
|
|
@@ -252,6 +254,101 @@ series(公式主体,n=1,+Infinity)
|
|
|
252
254
|
H[+], O[2-]
|
|
253
255
|
```
|
|
254
256
|
|
|
257
|
+
* 无限小数
|
|
258
|
+
```mathscript
|
|
259
|
+
// 循环节
|
|
260
|
+
0.3.;// 三分之一
|
|
261
|
+
0.142857.;// 七分之一
|
|
262
|
+
0.142.857142.;//七分之一
|
|
263
|
+
0.142.857142;//七分之一
|
|
264
|
+
```
|
|
265
|
+
```math
|
|
266
|
+
0.3.;// 三分之一
|
|
267
|
+
0.142857.;// 七分之一
|
|
268
|
+
0.142.857142.;//七分之一
|
|
269
|
+
0.142.857142;//七分之一
|
|
270
|
+
```
|
|
271
|
+
```mathscript
|
|
272
|
+
// 省略号,如果末尾出现多于一个小数点,这些小数点将被追加到数值结尾
|
|
273
|
+
0.3...
|
|
274
|
+
3444..
|
|
275
|
+
66....
|
|
276
|
+
```
|
|
277
|
+
```math
|
|
278
|
+
0.3...
|
|
279
|
+
3444..
|
|
280
|
+
66....
|
|
281
|
+
```
|
|
282
|
+
* 科学计数法
|
|
283
|
+
```mathscript
|
|
284
|
+
1e3;
|
|
285
|
+
1e-3;
|
|
286
|
+
1.3.e3;
|
|
287
|
+
a*1.3e3
|
|
288
|
+
```
|
|
289
|
+
```math
|
|
290
|
+
1e3;
|
|
291
|
+
1e-3;
|
|
292
|
+
1.3.e3;
|
|
293
|
+
a*1.3e3
|
|
294
|
+
```
|
|
295
|
+
* 方程组
|
|
296
|
+
```mathscript
|
|
297
|
+
group(
|
|
298
|
+
a+1=b;
|
|
299
|
+
a+b=3;
|
|
300
|
+
)
|
|
301
|
+
```
|
|
302
|
+
```math
|
|
303
|
+
group(
|
|
304
|
+
a+1=b,
|
|
305
|
+
a+b**2=3
|
|
306
|
+
)
|
|
307
|
+
```
|
|
308
|
+
* 标号
|
|
309
|
+
```mathscript
|
|
310
|
+
tab(1); // 带小括号的数字
|
|
311
|
+
tab(circle,1,2,3,10); // 带圆圈的数字
|
|
312
|
+
tab(roman,1); //罗马数字
|
|
313
|
+
tab(roman,3888); //罗马数字
|
|
314
|
+
group(// 方程组中使用
|
|
315
|
+
x+y=10 tab(circle,1),
|
|
316
|
+
x*y=25 tab(circle,2)
|
|
317
|
+
)
|
|
318
|
+
```
|
|
319
|
+
```math
|
|
320
|
+
tab(1);
|
|
321
|
+
tab(circle,1,2,3,10);
|
|
322
|
+
tab(roman,1);
|
|
323
|
+
tab(roman,3888);
|
|
324
|
+
group(
|
|
325
|
+
x+y=10 tab(circle,1),
|
|
326
|
+
x*y=25 tab(circle,2)
|
|
327
|
+
)
|
|
328
|
+
```
|
|
329
|
+
* 角
|
|
330
|
+
```mathscript
|
|
331
|
+
corner(1);
|
|
332
|
+
corner(A);
|
|
333
|
+
corner(BAC);
|
|
334
|
+
```
|
|
335
|
+
```math
|
|
336
|
+
corner(1);
|
|
337
|
+
corner(A);
|
|
338
|
+
corner(BAC);
|
|
339
|
+
```
|
|
340
|
+
* 对数
|
|
341
|
+
```mathscript
|
|
342
|
+
log(x,2);
|
|
343
|
+
log(x,e);
|
|
344
|
+
ln(x);
|
|
345
|
+
```
|
|
346
|
+
```math
|
|
347
|
+
log(x,2);
|
|
348
|
+
log(x,e);
|
|
349
|
+
ln(x);
|
|
350
|
+
```
|
|
351
|
+
|
|
255
352
|
## 希腊字母对照表如下
|
|
256
353
|
按此表中的英文单词命名的变量将自动转换为希腊字母
|
|
257
354
|
```javascript
|
package/coms/basic/spaces.js
CHANGED
|
@@ -2,7 +2,7 @@ var spaceDefined = [
|
|
|
2
2
|
"\\u0002",
|
|
3
3
|
"\\b-\\r",// "\\b"/*8*/, "\\t"/*9*/, "\\n"/*10*/, "\\v"/*11*/, "\\f"/*12*/, "\\r"/*13*/,
|
|
4
4
|
" "/*32*/,
|
|
5
|
-
"\\u007f", "\\u00a0", "\\u00ad", "\\u034f", "\\u061c",
|
|
5
|
+
"\\u007f", "\\u0085"/*next line*/, "\\u00a0", "\\u00ad", "\\u034f", "\\u061c",
|
|
6
6
|
"\\u115f", "\\u1160",
|
|
7
7
|
"\\u17b4", "\\u17b5",
|
|
8
8
|
"\\u180b-\\u180e",
|
package/coms/basic/strings.js
CHANGED
|
@@ -5,6 +5,7 @@ var escapeMap = {
|
|
|
5
5
|
"\b": "\\b",
|
|
6
6
|
"\f": "\\f",
|
|
7
7
|
"\v": "\\u000b",
|
|
8
|
+
"\\": "\\\\",
|
|
8
9
|
"\u2028": "\\u2028",
|
|
9
10
|
"\u2029": "\\u2029",
|
|
10
11
|
};
|
|
@@ -44,7 +45,7 @@ var esc = function (a) {
|
|
|
44
45
|
function uncode(s) {
|
|
45
46
|
return s.replace(/\\u(?:\{[0-9a-f]+\}|[0-9a-f]{4})/ig, esc);
|
|
46
47
|
}
|
|
47
|
-
function kicode(s) {
|
|
48
|
+
function kicode(s, singleSlash = false) {
|
|
48
49
|
var t = [];
|
|
49
50
|
return s.replace(/\\(?:u\{[0-9a-f]+\}|u[0-9a-f]{4}|x[0-9a-f]{2}|([0-7]{1,3}|[\s\S]))/ig, (a, b, i) => {
|
|
50
51
|
if (!b) {
|
|
@@ -63,17 +64,19 @@ function kicode(s) {
|
|
|
63
64
|
}
|
|
64
65
|
if (unescapeMap.hasOwnProperty(a)) return unescapeMap[a];
|
|
65
66
|
if (/^[0-7]+$/.test(b)) return String.fromCharCode(parseInt(b, 8));
|
|
67
|
+
if (b === singleSlash) return b;
|
|
68
|
+
if (singleSlash) return '\\' + b;
|
|
66
69
|
return b;
|
|
67
70
|
});
|
|
68
71
|
}
|
|
69
|
-
function decode(s) {
|
|
72
|
+
function decode(s, singleSlash) {
|
|
70
73
|
var r = /^(['"`])([\s\S]*)\1$/.exec(s);
|
|
71
74
|
if (!r) return s;
|
|
72
|
-
return kicode(r[2]);
|
|
75
|
+
return kicode(r[2], singleSlash ? r[1] : null);
|
|
73
76
|
}
|
|
74
77
|
|
|
75
|
-
function recode(s) {
|
|
76
|
-
s = decode(s);
|
|
78
|
+
function recode(s, singleSlash) {
|
|
79
|
+
s = decode(s, singleSlash);
|
|
77
80
|
s = encode(s);
|
|
78
81
|
return s;
|
|
79
82
|
}
|
package/coms/compile/Html.js
CHANGED
|
@@ -133,7 +133,7 @@ class Html extends Javascript {
|
|
|
133
133
|
}
|
|
134
134
|
var property = new Program;
|
|
135
135
|
property.stamps = "=".split('');
|
|
136
|
-
var
|
|
136
|
+
var progExp = new Javascript;
|
|
137
137
|
var replaceISO8859 = function (data) {
|
|
138
138
|
return String(data).replace(/<\!--([\s\S]*)--\>$/g, '$1').replace(/&\w+;/g, a => iso8859[a] || a).replace(/&#(\d+);/g, (_, a) => String.fromCodePoint(a))
|
|
139
139
|
};
|
|
@@ -142,8 +142,8 @@ var parseExpress = function (data, mayberepeat) {
|
|
|
142
142
|
data = `for(var ${data});`;
|
|
143
143
|
}
|
|
144
144
|
else data = "=" + replaceISO8859(data);
|
|
145
|
-
|
|
146
|
-
return
|
|
145
|
+
progExp.lastIndex = 0;
|
|
146
|
+
return progExp.exec(data);
|
|
147
147
|
};
|
|
148
148
|
|
|
149
149
|
var toCamelCase = function (a) {
|
|
@@ -151,8 +151,12 @@ var toCamelCase = function (a) {
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
var isDynamic = a => /^(on|@|\-|_|\.|#|\:|\+|\*|\?|&|\$|\S+\-)|(@|\-|_|\.|#|\:|\+|\*|\?|&|\$)$/i.test(a);
|
|
154
|
-
|
|
154
|
+
var decode = strings.decode;
|
|
155
|
+
var decode2 = function (s) {
|
|
156
|
+
return decode(s, true);
|
|
157
|
+
}
|
|
155
158
|
Html.prototype.createScoped = function (code) {
|
|
159
|
+
progExp.mindpath = this.mindpath;
|
|
156
160
|
var used = Object.create(null);
|
|
157
161
|
var vars = Object.create(null);
|
|
158
162
|
var rootvars = vars;
|
|
@@ -197,7 +201,7 @@ Html.prototype.createScoped = function (code) {
|
|
|
197
201
|
var nn = c.next.next;
|
|
198
202
|
if (!nn || nn.length > 0) return;
|
|
199
203
|
if (nn.type === EXPRESS || nn.type === QUOTED) {
|
|
200
|
-
rootvars[
|
|
204
|
+
rootvars[decode(createString([nn]))] = true;
|
|
201
205
|
}
|
|
202
206
|
}
|
|
203
207
|
}
|
|
@@ -219,12 +223,14 @@ Html.prototype.createScoped = function (code) {
|
|
|
219
223
|
break;
|
|
220
224
|
}
|
|
221
225
|
if (noTag || !c.text) break;
|
|
222
|
-
var t =
|
|
226
|
+
var t = decode2(c.text);
|
|
223
227
|
if (color.isColor(t)) break;
|
|
224
228
|
var p = c.prev;
|
|
225
229
|
var pp = p && p.prev;
|
|
226
230
|
if (pp && isDynamic(pp.text)) {
|
|
227
231
|
var mayberepeat = p && pp && p.type === STAMP && p.text === "=" && /[\:\-\_@\&\*\?\#\+\.\$](src|repeat|for|each|foreach)$/i.test(pp.text)
|
|
232
|
+
progExp.col = c.col;
|
|
233
|
+
progExp.row = c.row;
|
|
228
234
|
t = parseExpress(t, mayberepeat);
|
|
229
235
|
var s = createScoped(t);
|
|
230
236
|
var envs = s.envs;
|
|
@@ -242,6 +248,8 @@ Html.prototype.createScoped = function (code) {
|
|
|
242
248
|
if (inScript || noTag) break;
|
|
243
249
|
if (c.queue.type === QUOTED) break;
|
|
244
250
|
var t = c.text;
|
|
251
|
+
progExp.col = c.col;
|
|
252
|
+
progExp.row = c.row;
|
|
245
253
|
t = parseExpress(t);
|
|
246
254
|
var s = createScoped(t);
|
|
247
255
|
var envs = s.envs;
|
|
@@ -301,7 +309,7 @@ Html.prototype.createScoped = function (code) {
|
|
|
301
309
|
scoped.envs = envs;
|
|
302
310
|
scoped.vars = vars;
|
|
303
311
|
scoped.used = used;
|
|
304
|
-
|
|
312
|
+
delete progExp.mindpath;
|
|
305
313
|
return scoped;
|
|
306
314
|
};
|
|
307
315
|
Html.prototype.createString = common.createString;
|
package/coms/compile/Program.js
CHANGED
|
@@ -179,6 +179,8 @@ class Program {
|
|
|
179
179
|
lbtype = false;
|
|
180
180
|
keepspace = false;
|
|
181
181
|
lastIndex = 0
|
|
182
|
+
col = 1;
|
|
183
|
+
row = 1;
|
|
182
184
|
detectLabel(o) {
|
|
183
185
|
var queue = o.queue;
|
|
184
186
|
var last = queue.last;
|
|
@@ -413,7 +415,7 @@ class Program {
|
|
|
413
415
|
}
|
|
414
416
|
queue.push(scope);
|
|
415
417
|
};
|
|
416
|
-
var row =
|
|
418
|
+
var row = this.row, colstart = -this.col;
|
|
417
419
|
var cache_stamp = null;
|
|
418
420
|
var powermap = this.powermap;
|
|
419
421
|
var push_stamp = function () {
|
package/coms/compile/autoeval.js
CHANGED
|
@@ -54,7 +54,7 @@ var punc_3 = {
|
|
|
54
54
|
if (s && n1.length + +n2 > 15) {
|
|
55
55
|
return BigInt(n1) << BigInt(n2) + s;
|
|
56
56
|
}
|
|
57
|
-
return (
|
|
57
|
+
return (n1 << n2) + s;
|
|
58
58
|
},
|
|
59
59
|
">"(n1, n2, s) {
|
|
60
60
|
return String(+n1 > +n2);
|
|
@@ -84,7 +84,7 @@ var punc_3 = {
|
|
|
84
84
|
return (n1 & n2) + s;
|
|
85
85
|
},
|
|
86
86
|
"||"(n1, n2, s) {
|
|
87
|
-
return (+
|
|
87
|
+
return (+n1 || +n2) + s;
|
|
88
88
|
},
|
|
89
89
|
"&&"(n1, n2, s) {
|
|
90
90
|
return (+n1 && + n2) + s;
|
|
@@ -86,3 +86,8 @@ tc("Math.log(f) / Math.LN2 / 10 | 0", "Math.log(f) * 0.14426950408889633 | 0");
|
|
|
86
86
|
tc("Math.log(f) / Math.LN2 / 10 * 10 | 0", "Math.log(f) * 1.4426950408889634 | 0");
|
|
87
87
|
tc("Math.log(f) / Math.LN2 / 10 ** 2 | 0", "Math.log(f) * 0.014426950408889633 | 0");
|
|
88
88
|
// tf(path.join(__dirname, "../zimoli/spacechar_test.js"))
|
|
89
|
+
t("1<<0", '1');
|
|
90
|
+
t("1<<3", '8');
|
|
91
|
+
t("(1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)",'1335')
|
|
92
|
+
t("(1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)","7973")
|
|
93
|
+
t("(1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)","21522")
|
package/coms/compile/scanner2.js
CHANGED
|
@@ -6,10 +6,11 @@ const {
|
|
|
6
6
|
createString,
|
|
7
7
|
} = require("./common");
|
|
8
8
|
var powermap = require("./powermap");
|
|
9
|
-
|
|
9
|
+
var number_rep = /^[+-]?([\d\.]+)(?:e([+-]?\d+))?$/;
|
|
10
10
|
class Math extends Program {
|
|
11
|
-
number_reg = /^(\d+(
|
|
11
|
+
number_reg = /^(\d+(?:\.\d+){0,2}|(?:\.\d+){1,2}|(?:\d+\.){1,3})\.*(?:e[+-]?\d+)?$/;
|
|
12
12
|
powermap = Object.assign({}, powermap);
|
|
13
|
+
value_reg = /^(false|true|null|Infinity|NaN|undefined|eval|this|arguments)$/;
|
|
13
14
|
constructor() {
|
|
14
15
|
super();
|
|
15
16
|
var pmap = this.powermap;
|
|
@@ -101,7 +102,12 @@ var getRows = function (code) {
|
|
|
101
102
|
return trs;
|
|
102
103
|
}
|
|
103
104
|
var getArgs = function (a) {
|
|
104
|
-
return split(a, ',').map(
|
|
105
|
+
return split(a, ',').map(a => {
|
|
106
|
+
var cells = createExpressList(a);
|
|
107
|
+
if (!cells[cells.length - 1]?.first) cells.pop();
|
|
108
|
+
if (cells.length === 1) return toFlat(cells[0]);
|
|
109
|
+
return cells.map(toFlat);
|
|
110
|
+
});
|
|
105
111
|
}
|
|
106
112
|
var uncup = function (cup) {
|
|
107
113
|
if (cup.iscup && cup.length <= 1) cup = cup[0];
|
|
@@ -127,7 +133,7 @@ var back = function (cache) {
|
|
|
127
133
|
cache.splice(s, cache.length - s);
|
|
128
134
|
}
|
|
129
135
|
var toFlat = function (exp) {
|
|
130
|
-
if (exp.length === 1 && exp[0].type !== SCOPED) return exp[0].text;
|
|
136
|
+
if (exp.length === 1 && exp[0].type !== SCOPED && !exp[0].isdigit) return exp[0].text;
|
|
131
137
|
var bx = 0;
|
|
132
138
|
var p0 = 0;
|
|
133
139
|
var left = [];
|
|
@@ -235,12 +241,37 @@ var toFlat = function (exp) {
|
|
|
235
241
|
}
|
|
236
242
|
if (e.isdigit) a: {
|
|
237
243
|
var et = e.text;
|
|
238
|
-
var
|
|
244
|
+
var [, a, e10] = number_rep.exec(et);
|
|
245
|
+
var b = a.split('.');
|
|
246
|
+
if (b.length > 2 || e10) {
|
|
247
|
+
var nrep = b[2] || b[1];
|
|
248
|
+
var npre = b[0];
|
|
249
|
+
if (b[2]) {
|
|
250
|
+
npre += "." + b[1];
|
|
251
|
+
}
|
|
252
|
+
else if (b[1] ? b.length <= 2 || b.length > 3 : b.length <= 1 || b.length > 2) {
|
|
253
|
+
if (nrep) npre += "." + nrep;
|
|
254
|
+
nrep = '';
|
|
255
|
+
}
|
|
256
|
+
if (String(+npre) === npre) npre = +npre;
|
|
257
|
+
if (String(+nrep) === nrep) nrep = +nrep;
|
|
258
|
+
var v = [npre, nrep];
|
|
259
|
+
if (b.length > (b[2] ? 4 : b[1] ? 3 : 2)) v.push(b.slice(b[2] ? 3 : b[1] ? 2 : 1, b.length).join('.') + ".");
|
|
260
|
+
else if (e10) v.push('');
|
|
261
|
+
if (e10) {
|
|
262
|
+
if (String(+e10) === e10) e10 = +e10;
|
|
263
|
+
v.push(e10);
|
|
264
|
+
}
|
|
265
|
+
v = { "..": v };
|
|
266
|
+
left.push(v);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
var v = +a;
|
|
239
270
|
if (/^\+/.test(et)) {
|
|
240
|
-
if (String(v) !==
|
|
271
|
+
if (String(v) !== a.slice(1)) break a;
|
|
241
272
|
v = make("+", '', v);
|
|
242
273
|
}
|
|
243
|
-
if (String(v) !==
|
|
274
|
+
if (String(v) !== a) break a;
|
|
244
275
|
left.push(v);
|
|
245
276
|
continue;
|
|
246
277
|
}
|
|
@@ -21,6 +21,10 @@ t(`a(b,c)`)
|
|
|
21
21
|
t(`[b,c]'`)
|
|
22
22
|
t(`H[+]`)
|
|
23
23
|
t(`H[2-]`)
|
|
24
|
-
t.debug = true;
|
|
25
24
|
t(`H'*1`)
|
|
26
|
-
t(`cos(theta,2)*E +(1 - cos(theta))*K'*K+sin(theta)*[0,-K_2,K_1;K_2,0,-K_0;-K_1,K_0,0]`)
|
|
25
|
+
t(`cos(theta,2)*E +(1 - cos(theta))*K'*K+sin(theta)*[0,-K_2,K_1;K_2,0,-K_0;-K_1,K_0,0]`)
|
|
26
|
+
t.debug = true;
|
|
27
|
+
t(`group(
|
|
28
|
+
x+y=10 tab(circle,1),
|
|
29
|
+
x*y=25 tab(circle,2)
|
|
30
|
+
)`)
|
|
@@ -16,9 +16,10 @@ class 素玉 extends Program {
|
|
|
16
16
|
|
|
17
17
|
var rarg = new 素玉;
|
|
18
18
|
rarg.quotes.push(["url(", ")"]);
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
var
|
|
19
|
+
var numberReg2 = /([\-\+]?(?:\d+(?:\.\d*)?|\.\d+))([a-zH]+|%)?/;
|
|
20
|
+
var replaceHReg = new RegExp(numberReg2.source + /\s*([\/\*])\s*/.source + numberReg2.source, 'gi');
|
|
21
|
+
var replaceLReg = new RegExp(numberReg2.source + /(\s*[\+\-]\s+|[\+\-])/.source + numberReg2.source, 'gi');
|
|
22
|
+
var replaceTReg = new RegExp(numberReg2.source + /\s*[\/\*\+\-]\s*/.source + numberReg2.source, 'i');
|
|
22
23
|
var remove_quote = a => a.replace(/~\s*(['"`])((?:\\[\s\S]|[^'"`\\])*?)\1/g, '$2');
|
|
23
24
|
var keepdot = function (a) {
|
|
24
25
|
var g = Math.pow(10, Math.log10(a) | 0) * 1000;
|
|
@@ -70,7 +71,7 @@ var replace_punc = function (a) {
|
|
|
70
71
|
}
|
|
71
72
|
var killcalc = a => replace_punc(createString(a));
|
|
72
73
|
var seprateFunc = function (express) {
|
|
73
|
-
var express = scanner2(express, rarg);
|
|
74
|
+
var express = scanner2(express, rarg, basepath[0] || base || '');
|
|
74
75
|
var sps = [];
|
|
75
76
|
var sp = [];
|
|
76
77
|
for (var cx = 0, dx = express.length; cx < dx; cx++) {
|
|
@@ -108,7 +109,7 @@ var seprateFunc = function (express) {
|
|
|
108
109
|
}
|
|
109
110
|
var splitParams = function (params) {
|
|
110
111
|
if (!params) return [];
|
|
111
|
-
params = scanner2(params, rarg);
|
|
112
|
+
params = scanner2(params, rarg, basepath[0] || base || '');
|
|
112
113
|
var code = params;
|
|
113
114
|
var params = [], p = [];
|
|
114
115
|
for (var cx = 0, dx = code.length; cx < dx; cx++) {
|
|
@@ -124,7 +125,7 @@ var splitParams = function (params) {
|
|
|
124
125
|
return params;
|
|
125
126
|
}
|
|
126
127
|
var createArgMap = function (args, split = ',', equal = ':') {
|
|
127
|
-
if (args) args = scanner2(args, rarg);
|
|
128
|
+
if (args) args = scanner2(args, rarg, basepath[0] || base || "");
|
|
128
129
|
else args = [];
|
|
129
130
|
var map = Object.create(null);
|
|
130
131
|
var o = args.first;
|
|
@@ -726,7 +727,7 @@ var rcss = null;
|
|
|
726
727
|
function 素馨(text, scopeName, compress) {
|
|
727
728
|
if (!rcss) rcss = new 素心;
|
|
728
729
|
rcss.debug = true;
|
|
729
|
-
var code = scanner2(text, rcss);
|
|
730
|
+
var code = scanner2(text, rcss, scopeName || "");
|
|
730
731
|
var { scoped } = code;
|
|
731
732
|
var result = evalscoped(scoped, scopeName);
|
|
732
733
|
var queried = [];
|