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.
Files changed (35) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +3 -0
  2. package/coms/basic/Table.js +26 -0
  3. package/coms/basic/escapeRegExp.js +24 -0
  4. package/coms/basic/escapeRegExp_test.js +35 -0
  5. package/coms/basic/math.js +77 -0
  6. package/coms/basic/math.md +97 -0
  7. package/coms/basic/spaces.js +1 -1
  8. package/coms/basic/strings.js +8 -5
  9. package/coms/compile/Html.js +15 -7
  10. package/coms/compile/Program.js +3 -1
  11. package/coms/compile/autoeval.js +2 -2
  12. package/coms/compile/autoeval_test.js +5 -0
  13. package/coms/compile/scanner2.js +1 -1
  14. package/coms/compile//347/256/227/345/274/217.js +38 -7
  15. package/coms/compile//347/256/227/345/274/217_test.js +6 -2
  16. package/coms/compile//347/264/240/351/246/250.js +8 -7
  17. package/coms/compile//347/264/240/351/246/250_test.js +8 -2
  18. package/coms/explorer/main.less +1 -0
  19. package/coms/reptile/colors.js +2 -1
  20. package/coms/zimoli/arriswise.js +1 -1
  21. package/coms/zimoli/color-config.less +1 -1
  22. package/coms/zimoli/confirm.js +1 -1
  23. package/coms/zimoli/popup.js +1 -1
  24. package/coms/zimoli/prompt.js +4 -1
  25. package/coms/zimoli/scrollbar.less +1 -1
  26. package/coms/zimoli/table.js +1 -1
  27. package/coms/zimoli/vbox.js +1 -0
  28. package/coms//350/214/250/350/217/260//344/270/212/350/211/262.xht +5 -1
  29. package/coms//350/214/250/350/217/260//346/240/207/347/255/276/345/214/226.js +9 -1
  30. package/coms//350/214/250/350/217/260//346/270/262/346/237/223.js +1 -1
  31. package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +16 -2
  32. package/package.json +1 -1
  33. package/public/efront.js +1 -1
  34. package/public//346/226/207/344/273/266/347/263/273/347/273/237//344/270/273/351/241/265.jsp +2 -2
  35. package/debug.log +0 -3
@@ -40,6 +40,9 @@
40
40
  - zh-CN: 禁用
41
41
  en: Disable
42
42
 
43
+ - zh-CN: 代码结构错误
44
+ en: Code structure error
45
+
43
46
  - zh-CN: 复制失败!
44
47
  en: Copy failed!
45
48
 
@@ -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')
@@ -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 "&nbsp;&nbsp;" + args
90
+ .map(toRoman)
91
+ .map(a => `<mn>${a}</mn>`)
92
+ .join('<ms>&ensp;</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;
@@ -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
@@ -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",
@@ -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
  }
@@ -133,7 +133,7 @@ class Html extends Javascript {
133
133
  }
134
134
  var property = new Program;
135
135
  property.stamps = "=".split('');
136
- var p = new Javascript;
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
- p.lastIndex = 0;
146
- return p.exec(data);
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[strings.decode(createString([nn]))] = true;
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 = strings.decode(c.text);
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;
@@ -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 = 1, colstart = -1;
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 () {
@@ -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 (n2 << n1) + s;
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 (+n2 || +n1) + s;
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")
@@ -252,7 +252,7 @@ function scan(text) {
252
252
  type = a;
253
253
  break;
254
254
  default:
255
- throw new Error('无效参数: ' + type);
255
+ throw new Error('无效参数: ' + a);
256
256
  }
257
257
  }
258
258
  if (!type) {
@@ -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+(\.\d+)?|\.\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(toFlat);
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 v = +et;
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) !== et.slice(1)) break a;
271
+ if (String(v) !== a.slice(1)) break a;
241
272
  v = make("+", '', v);
242
273
  }
243
- if (String(v) !== et) break a;
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 replaceHReg = new RegExp(numberReg.source + /\s*([\/\*])\s*/.source + numberReg.source, 'gi');
20
- var replaceLReg = new RegExp(numberReg.source + /(\s*[\+\-]\s+|[\+\-])/.source + numberReg.source, 'gi');
21
- var replaceTReg = new RegExp(numberReg.source + /\s*[\/\*\+\-]\s*/.source + numberReg.source, 'i');
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 = [];