temml 0.10.23 → 0.10.24

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/dist/temml.mjs CHANGED
@@ -144,11 +144,29 @@ const assert = function(value) {
144
144
 
145
145
  /**
146
146
  * Return the protocol of a URL, or "_relative" if the URL does not specify a
147
- * protocol (and thus is relative).
147
+ * protocol (and thus is relative), or `null` if URL has invalid protocol
148
+ * (so should be outright rejected).
148
149
  */
149
150
  const protocolFromUrl = function(url) {
150
- const protocol = /^\s*([^\\/#]*?)(?::|&#0*58|&#x0*3a)/i.exec(url);
151
- return protocol != null ? protocol[1] : "_relative";
151
+ // Check for possible leading protocol.
152
+ // https://url.spec.whatwg.org/#url-parsing strips leading whitespace
153
+ // (\x00) or C0 control (\x00-\x1F) characters.
154
+ // eslint-disable-next-line no-control-regex
155
+ const protocol = /^[\x00-\x20]*([^\\/#?]*?)(:|&#0*58|&#x0*3a|&colon)/i.exec(url);
156
+ if (!protocol) {
157
+ return "_relative";
158
+ }
159
+ // Reject weird colons
160
+ if (protocol[2] !== ":") {
161
+ return null;
162
+ }
163
+ // Reject invalid characters in scheme according to
164
+ // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1
165
+ if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(protocol[1])) {
166
+ return null;
167
+ }
168
+ // Lowercase the protocol
169
+ return protocol[1].toLowerCase();
152
170
  };
153
171
 
154
172
  /**
@@ -213,7 +231,11 @@ class Settings {
213
231
  */
214
232
  isTrusted(context) {
215
233
  if (context.url && !context.protocol) {
216
- context.protocol = utils.protocolFromUrl(context.url);
234
+ const protocol = utils.protocolFromUrl(context.url);
235
+ if (protocol == null) {
236
+ return false
237
+ }
238
+ context.protocol = protocol;
217
239
  }
218
240
  const trust = typeof this.trust === "function" ? this.trust(context) : this.trust;
219
241
  return Boolean(trust);
@@ -1252,7 +1274,72 @@ defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true);
1252
1274
  defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true);
1253
1275
  defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true);
1254
1276
 
1255
- defineSymbol(math, bin, "\u2238", "\\dotminus", true); // stix
1277
+ // stix Binary Operators
1278
+ defineSymbol(math, bin, "\u2238", "\\dotminus", true);
1279
+ defineSymbol(math, bin, "\u27D1", "\\wedgedot", true);
1280
+ defineSymbol(math, bin, "\u27C7", "\\veedot", true);
1281
+ defineSymbol(math, bin, "\u2A62", "\\doublebarvee", true);
1282
+ defineSymbol(math, bin, "\u2A63", "\\veedoublebar", true);
1283
+ defineSymbol(math, bin, "\u2A5F", "\\wedgebar", true);
1284
+ defineSymbol(math, bin, "\u2A60", "\\wedgedoublebar", true);
1285
+ defineSymbol(math, bin, "\u2A54", "\\Vee", true);
1286
+ defineSymbol(math, bin, "\u2A53", "\\Wedge", true);
1287
+ defineSymbol(math, bin, "\u2A43", "\\barcap", true);
1288
+ defineSymbol(math, bin, "\u2A42", "\\barcup", true);
1289
+ defineSymbol(math, bin, "\u2A48", "\\capbarcup", true);
1290
+ defineSymbol(math, bin, "\u2A40", "\\capdot", true);
1291
+ defineSymbol(math, bin, "\u2A47", "\\capovercup", true);
1292
+ defineSymbol(math, bin, "\u2A46", "\\cupovercap", true);
1293
+ defineSymbol(math, bin, "\u2A4D", "\\closedvarcap", true);
1294
+ defineSymbol(math, bin, "\u2A4C", "\\closedvarcup", true);
1295
+ defineSymbol(math, bin, "\u2A2A", "\\minusdot", true);
1296
+ defineSymbol(math, bin, "\u2A2B", "\\minusfdots", true);
1297
+ defineSymbol(math, bin, "\u2A2C", "\\minusrdots", true);
1298
+ defineSymbol(math, bin, "\u22BB", "\\Xor", true);
1299
+ defineSymbol(math, bin, "\u22BC", "\\Nand", true);
1300
+ defineSymbol(math, bin, "\u22BD", "\\Nor", true);
1301
+ defineSymbol(math, bin, "\u22BD", "\\barvee");
1302
+ defineSymbol(math, bin, "\u2AF4", "\\interleave", true);
1303
+ defineSymbol(math, bin, "\u29E2", "\\shuffle", true);
1304
+ defineSymbol(math, bin, "\u2AF6", "\\threedotcolon", true);
1305
+ defineSymbol(math, bin, "\u2982", "\\typecolon", true);
1306
+ defineSymbol(math, bin, "\u223E", "\\invlazys", true);
1307
+ defineSymbol(math, bin, "\u2A4B", "\\twocaps", true);
1308
+ defineSymbol(math, bin, "\u2A4A", "\\twocups", true);
1309
+ defineSymbol(math, bin, "\u2A4E", "\\Sqcap", true);
1310
+ defineSymbol(math, bin, "\u2A4F", "\\Sqcup", true);
1311
+ defineSymbol(math, bin, "\u2A56", "\\veeonvee", true);
1312
+ defineSymbol(math, bin, "\u2A55", "\\wedgeonwedge", true);
1313
+ defineSymbol(math, bin, "\u29D7", "\\blackhourglass", true);
1314
+ defineSymbol(math, bin, "\u29C6", "\\boxast", true);
1315
+ defineSymbol(math, bin, "\u29C8", "\\boxbox", true);
1316
+ defineSymbol(math, bin, "\u29C7", "\\boxcircle", true);
1317
+ defineSymbol(math, bin, "\u229C", "\\circledequal", true);
1318
+ defineSymbol(math, bin, "\u29B7", "\\circledparallel", true);
1319
+ defineSymbol(math, bin, "\u29B6", "\\circledvert", true);
1320
+ defineSymbol(math, bin, "\u29B5", "\\circlehbar", true);
1321
+ defineSymbol(math, bin, "\u27E1", "\\concavediamond", true);
1322
+ defineSymbol(math, bin, "\u27E2", "\\concavediamondtickleft", true);
1323
+ defineSymbol(math, bin, "\u27E3", "\\concavediamondtickright", true);
1324
+ defineSymbol(math, bin, "\u22C4", "\\diamond", true);
1325
+ defineSymbol(math, bin, "\u29D6", "\\hourglass", true);
1326
+ defineSymbol(math, bin, "\u27E0", "\\lozengeminus", true);
1327
+ defineSymbol(math, bin, "\u233D", "\\obar", true);
1328
+ defineSymbol(math, bin, "\u29B8", "\\obslash", true);
1329
+ defineSymbol(math, bin, "\u2A38", "\\odiv", true);
1330
+ defineSymbol(math, bin, "\u29C1", "\\ogreaterthan", true);
1331
+ defineSymbol(math, bin, "\u29C0", "\\olessthan", true);
1332
+ defineSymbol(math, bin, "\u29B9", "\\operp", true);
1333
+ defineSymbol(math, bin, "\u2A37", "\\Otimes", true);
1334
+ defineSymbol(math, bin, "\u2A36", "\\otimeshat", true);
1335
+ defineSymbol(math, bin, "\u22C6", "\\star", true);
1336
+ defineSymbol(math, bin, "\u25B3", "\\triangle", true);
1337
+ defineSymbol(math, bin, "\u2A3A", "\\triangleminus", true);
1338
+ defineSymbol(math, bin, "\u2A39", "\\triangleplus", true);
1339
+ defineSymbol(math, bin, "\u2A3B", "\\triangletimes", true);
1340
+ defineSymbol(math, bin, "\u27E4", "\\whitesquaretickleft", true);
1341
+ defineSymbol(math, bin, "\u27E5", "\\whitesquaretickright", true);
1342
+ defineSymbol(math, bin, "\u2A33", "\\smashtimes", true);
1256
1343
 
1257
1344
  // AMS Arrows
1258
1345
  // Note: unicode-math maps \u21e2 to their own function \rightdasharrow.
@@ -1494,8 +1581,8 @@ defineSymbol(math, spacing, null, "\\allowbreak");
1494
1581
  defineSymbol(math, punct, ",", ",");
1495
1582
  defineSymbol(text, punct, ":", ":");
1496
1583
  defineSymbol(math, punct, ";", ";");
1497
- defineSymbol(math, bin, "\u22bc", "\\barwedge", true);
1498
- defineSymbol(math, bin, "\u22bb", "\\veebar", true);
1584
+ defineSymbol(math, bin, "\u22bc", "\\barwedge");
1585
+ defineSymbol(math, bin, "\u22bb", "\\veebar");
1499
1586
  defineSymbol(math, bin, "\u2299", "\\odot", true);
1500
1587
  // Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here.
1501
1588
  defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus");
@@ -1508,7 +1595,6 @@ defineSymbol(math, bin, "\u25b3", "\\bigtriangleup");
1508
1595
  defineSymbol(math, bin, "\u25bd", "\\bigtriangledown");
1509
1596
  defineSymbol(math, bin, "\u2020", "\\dagger");
1510
1597
  defineSymbol(math, bin, "\u22c4", "\\diamond");
1511
- defineSymbol(math, bin, "\u22c6", "\\star");
1512
1598
  defineSymbol(math, bin, "\u25c3", "\\triangleleft");
1513
1599
  defineSymbol(math, bin, "\u25b9", "\\triangleright");
1514
1600
  defineSymbol(math, open, "{", "\\{");
@@ -3483,6 +3569,9 @@ defineFunction({
3483
3569
 
3484
3570
  if (funcName === "\\edef" || funcName === "\\xdef") {
3485
3571
  tokens = parser.gullet.expandTokens(tokens);
3572
+ if (tokens.length > parser.gullet.settings.maxExpand) {
3573
+ throw new ParseError("Too many expansions in an " + funcName);
3574
+ }
3486
3575
  tokens.reverse(); // to fit in with stack order
3487
3576
  }
3488
3577
  // Final arg is the expansion of the macro
@@ -13221,7 +13310,7 @@ class Style {
13221
13310
  * https://mit-license.org/
13222
13311
  */
13223
13312
 
13224
- const version = "0.10.23";
13313
+ const version = "0.10.24";
13225
13314
 
13226
13315
  function postProcess(block) {
13227
13316
  const labelMap = {};
@@ -14,7 +14,7 @@
14
14
  * https://mit-license.org/
15
15
  */
16
16
 
17
- const version = "0.10.23";
17
+ const version = "0.10.24";
18
18
 
19
19
  function postProcess(block) {
20
20
  const labelMap = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "temml",
3
- "version": "0.10.23",
3
+ "version": "0.10.24",
4
4
  "description": "TeX to MathML conversion in JavaScript.",
5
5
  "main": "dist/temml.js",
6
6
  "engines": {
package/src/Settings.js CHANGED
@@ -42,7 +42,11 @@ export default class Settings {
42
42
  */
43
43
  isTrusted(context) {
44
44
  if (context.url && !context.protocol) {
45
- context.protocol = utils.protocolFromUrl(context.url);
45
+ const protocol = utils.protocolFromUrl(context.url);
46
+ if (protocol == null) {
47
+ return false
48
+ }
49
+ context.protocol = protocol
46
50
  }
47
51
  const trust = typeof this.trust === "function" ? this.trust(context) : this.trust;
48
52
  return Boolean(trust);
@@ -141,6 +141,9 @@ defineFunction({
141
141
 
142
142
  if (funcName === "\\edef" || funcName === "\\xdef") {
143
143
  tokens = parser.gullet.expandTokens(tokens);
144
+ if (tokens.length > parser.gullet.settings.maxExpand) {
145
+ throw new ParseError("Too many expansions in an " + funcName);
146
+ }
144
147
  tokens.reverse(); // to fit in with stack order
145
148
  }
146
149
  // Final arg is the expansion of the macro
@@ -8,7 +8,7 @@
8
8
  * https://mit-license.org/
9
9
  */
10
10
 
11
- export const version = "0.10.23";
11
+ export const version = "0.10.24";
12
12
 
13
13
  export function postProcess(block) {
14
14
  const labelMap = {}
package/src/symbols.js CHANGED
@@ -446,7 +446,72 @@ defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true);
446
446
  defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true);
447
447
  defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true);
448
448
 
449
- defineSymbol(math, bin, "\u2238", "\\dotminus", true); // stix
449
+ // stix Binary Operators
450
+ defineSymbol(math, bin, "\u2238", "\\dotminus", true);
451
+ defineSymbol(math, bin, "\u27D1", "\\wedgedot", true);
452
+ defineSymbol(math, bin, "\u27C7", "\\veedot", true);
453
+ defineSymbol(math, bin, "\u2A62", "\\doublebarvee", true);
454
+ defineSymbol(math, bin, "\u2A63", "\\veedoublebar", true)
455
+ defineSymbol(math, bin, "\u2A5F", "\\wedgebar", true)
456
+ defineSymbol(math, bin, "\u2A60", "\\wedgedoublebar", true)
457
+ defineSymbol(math, bin, "\u2A54", "\\Vee", true)
458
+ defineSymbol(math, bin, "\u2A53", "\\Wedge", true)
459
+ defineSymbol(math, bin, "\u2A43", "\\barcap", true)
460
+ defineSymbol(math, bin, "\u2A42", "\\barcup", true)
461
+ defineSymbol(math, bin, "\u2A48", "\\capbarcup", true)
462
+ defineSymbol(math, bin, "\u2A40", "\\capdot", true)
463
+ defineSymbol(math, bin, "\u2A47", "\\capovercup", true)
464
+ defineSymbol(math, bin, "\u2A46", "\\cupovercap", true)
465
+ defineSymbol(math, bin, "\u2A4D", "\\closedvarcap", true)
466
+ defineSymbol(math, bin, "\u2A4C", "\\closedvarcup", true)
467
+ defineSymbol(math, bin, "\u2A2A", "\\minusdot", true)
468
+ defineSymbol(math, bin, "\u2A2B", "\\minusfdots", true)
469
+ defineSymbol(math, bin, "\u2A2C", "\\minusrdots", true)
470
+ defineSymbol(math, bin, "\u22BB", "\\Xor", true)
471
+ defineSymbol(math, bin, "\u22BC", "\\Nand", true)
472
+ defineSymbol(math, bin, "\u22BD", "\\Nor", true)
473
+ defineSymbol(math, bin, "\u22BD", "\\barvee")
474
+ defineSymbol(math, bin, "\u2AF4", "\\interleave", true)
475
+ defineSymbol(math, bin, "\u29E2", "\\shuffle", true)
476
+ defineSymbol(math, bin, "\u2AF6", "\\threedotcolon", true)
477
+ defineSymbol(math, bin, "\u2982", "\\typecolon", true)
478
+ defineSymbol(math, bin, "\u223E", "\\invlazys", true)
479
+ defineSymbol(math, bin, "\u2A4B", "\\twocaps", true)
480
+ defineSymbol(math, bin, "\u2A4A", "\\twocups", true)
481
+ defineSymbol(math, bin, "\u2A4E", "\\Sqcap", true)
482
+ defineSymbol(math, bin, "\u2A4F", "\\Sqcup", true)
483
+ defineSymbol(math, bin, "\u2A56", "\\veeonvee", true)
484
+ defineSymbol(math, bin, "\u2A55", "\\wedgeonwedge", true)
485
+ defineSymbol(math, bin, "\u29D7", "\\blackhourglass", true)
486
+ defineSymbol(math, bin, "\u29C6", "\\boxast", true)
487
+ defineSymbol(math, bin, "\u29C8", "\\boxbox", true)
488
+ defineSymbol(math, bin, "\u29C7", "\\boxcircle", true)
489
+ defineSymbol(math, bin, "\u229C", "\\circledequal", true)
490
+ defineSymbol(math, bin, "\u29B7", "\\circledparallel", true)
491
+ defineSymbol(math, bin, "\u29B6", "\\circledvert", true)
492
+ defineSymbol(math, bin, "\u29B5", "\\circlehbar", true)
493
+ defineSymbol(math, bin, "\u27E1", "\\concavediamond", true)
494
+ defineSymbol(math, bin, "\u27E2", "\\concavediamondtickleft", true)
495
+ defineSymbol(math, bin, "\u27E3", "\\concavediamondtickright", true)
496
+ defineSymbol(math, bin, "\u22C4", "\\diamond", true)
497
+ defineSymbol(math, bin, "\u29D6", "\\hourglass", true)
498
+ defineSymbol(math, bin, "\u27E0", "\\lozengeminus", true)
499
+ defineSymbol(math, bin, "\u233D", "\\obar", true)
500
+ defineSymbol(math, bin, "\u29B8", "\\obslash", true)
501
+ defineSymbol(math, bin, "\u2A38", "\\odiv", true)
502
+ defineSymbol(math, bin, "\u29C1", "\\ogreaterthan", true)
503
+ defineSymbol(math, bin, "\u29C0", "\\olessthan", true)
504
+ defineSymbol(math, bin, "\u29B9", "\\operp", true)
505
+ defineSymbol(math, bin, "\u2A37", "\\Otimes", true)
506
+ defineSymbol(math, bin, "\u2A36", "\\otimeshat", true)
507
+ defineSymbol(math, bin, "\u22C6", "\\star", true)
508
+ defineSymbol(math, bin, "\u25B3", "\\triangle", true)
509
+ defineSymbol(math, bin, "\u2A3A", "\\triangleminus", true)
510
+ defineSymbol(math, bin, "\u2A39", "\\triangleplus", true)
511
+ defineSymbol(math, bin, "\u2A3B", "\\triangletimes", true)
512
+ defineSymbol(math, bin, "\u27E4", "\\whitesquaretickleft", true)
513
+ defineSymbol(math, bin, "\u27E5", "\\whitesquaretickright", true)
514
+ defineSymbol(math, bin, "\u2A33", "\\smashtimes", true)
450
515
 
451
516
  // AMS Arrows
452
517
  // Note: unicode-math maps \u21e2 to their own function \rightdasharrow.
@@ -688,8 +753,8 @@ defineSymbol(math, spacing, null, "\\allowbreak");
688
753
  defineSymbol(math, punct, ",", ",");
689
754
  defineSymbol(text, punct, ":", ":");
690
755
  defineSymbol(math, punct, ";", ";");
691
- defineSymbol(math, bin, "\u22bc", "\\barwedge", true);
692
- defineSymbol(math, bin, "\u22bb", "\\veebar", true);
756
+ defineSymbol(math, bin, "\u22bc", "\\barwedge");
757
+ defineSymbol(math, bin, "\u22bb", "\\veebar");
693
758
  defineSymbol(math, bin, "\u2299", "\\odot", true);
694
759
  // Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here.
695
760
  defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus");
@@ -702,7 +767,6 @@ defineSymbol(math, bin, "\u25b3", "\\bigtriangleup");
702
767
  defineSymbol(math, bin, "\u25bd", "\\bigtriangledown");
703
768
  defineSymbol(math, bin, "\u2020", "\\dagger");
704
769
  defineSymbol(math, bin, "\u22c4", "\\diamond");
705
- defineSymbol(math, bin, "\u22c6", "\\star");
706
770
  defineSymbol(math, bin, "\u25c3", "\\triangleleft");
707
771
  defineSymbol(math, bin, "\u25b9", "\\triangleright");
708
772
  defineSymbol(math, open, "{", "\\{");
package/src/utils.js CHANGED
@@ -81,11 +81,29 @@ export const assert = function(value) {
81
81
 
82
82
  /**
83
83
  * Return the protocol of a URL, or "_relative" if the URL does not specify a
84
- * protocol (and thus is relative).
84
+ * protocol (and thus is relative), or `null` if URL has invalid protocol
85
+ * (so should be outright rejected).
85
86
  */
86
87
  export const protocolFromUrl = function(url) {
87
- const protocol = /^\s*([^\\/#]*?)(?::|&#0*58|&#x0*3a)/i.exec(url);
88
- return protocol != null ? protocol[1] : "_relative";
88
+ // Check for possible leading protocol.
89
+ // https://url.spec.whatwg.org/#url-parsing strips leading whitespace
90
+ // (\x00) or C0 control (\x00-\x1F) characters.
91
+ // eslint-disable-next-line no-control-regex
92
+ const protocol = /^[\x00-\x20]*([^\\/#?]*?)(:|&#0*58|&#x0*3a|&colon)/i.exec(url);
93
+ if (!protocol) {
94
+ return "_relative";
95
+ }
96
+ // Reject weird colons
97
+ if (protocol[2] !== ":") {
98
+ return null;
99
+ }
100
+ // Reject invalid characters in scheme according to
101
+ // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1
102
+ if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(protocol[1])) {
103
+ return null;
104
+ }
105
+ // Lowercase the protocol
106
+ return protocol[1].toLowerCase();
89
107
  };
90
108
 
91
109
  /**