temml 0.10.22 → 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/README.md +1 -1
- package/dist/Temml-Asana.css +2 -0
- package/dist/Temml-Fira.css +154 -0
- package/dist/Temml-Latin-Modern.css +2 -0
- package/dist/Temml-Libertinus.css +2 -0
- package/dist/Temml-Local.css +2 -0
- package/dist/Temml-STIX2.css +2 -0
- package/dist/temml.cjs +136 -12
- package/dist/temml.js +136 -12
- package/dist/temml.min.js +1 -1
- package/dist/temml.mjs +136 -12
- package/dist/temmlPostProcess.js +1 -1
- package/package.json +1 -1
- package/src/Settings.js +5 -1
- package/src/buildMathML.js +7 -4
- package/src/functions/def.js +3 -0
- package/src/functions/font.js +30 -1
- package/src/postProcess.js +1 -1
- package/src/symbols.js +70 -3
- package/src/utils.js +21 -3
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
|
-
|
151
|
-
|
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]*([^\\/#?]*?)(:|�*58|�*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
|
-
|
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);
|
@@ -1024,6 +1046,7 @@ defineSymbol(math, mathord, "\u2609", "\\astrosun", true);
|
|
1024
1046
|
defineSymbol(math, mathord, "\u263c", "\\sun", true);
|
1025
1047
|
defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
|
1026
1048
|
defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
|
1049
|
+
defineSymbol(math, mathord, "\u2295", "\\Earth");
|
1027
1050
|
|
1028
1051
|
// AMS Negated Binary Relations
|
1029
1052
|
defineSymbol(math, rel, "\u226e", "\\nless", true);
|
@@ -1251,6 +1274,73 @@ defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true);
|
|
1251
1274
|
defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true);
|
1252
1275
|
defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true);
|
1253
1276
|
|
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);
|
1343
|
+
|
1254
1344
|
// AMS Arrows
|
1255
1345
|
// Note: unicode-math maps \u21e2 to their own function \rightdasharrow.
|
1256
1346
|
// We'll map it to AMS function \dashrightarrow. It produces the same atom.
|
@@ -1491,8 +1581,8 @@ defineSymbol(math, spacing, null, "\\allowbreak");
|
|
1491
1581
|
defineSymbol(math, punct, ",", ",");
|
1492
1582
|
defineSymbol(text, punct, ":", ":");
|
1493
1583
|
defineSymbol(math, punct, ";", ";");
|
1494
|
-
defineSymbol(math, bin, "\u22bc", "\\barwedge"
|
1495
|
-
defineSymbol(math, bin, "\u22bb", "\\veebar"
|
1584
|
+
defineSymbol(math, bin, "\u22bc", "\\barwedge");
|
1585
|
+
defineSymbol(math, bin, "\u22bb", "\\veebar");
|
1496
1586
|
defineSymbol(math, bin, "\u2299", "\\odot", true);
|
1497
1587
|
// Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here.
|
1498
1588
|
defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus");
|
@@ -1505,7 +1595,6 @@ defineSymbol(math, bin, "\u25b3", "\\bigtriangleup");
|
|
1505
1595
|
defineSymbol(math, bin, "\u25bd", "\\bigtriangledown");
|
1506
1596
|
defineSymbol(math, bin, "\u2020", "\\dagger");
|
1507
1597
|
defineSymbol(math, bin, "\u22c4", "\\diamond");
|
1508
|
-
defineSymbol(math, bin, "\u22c6", "\\star");
|
1509
1598
|
defineSymbol(math, bin, "\u25c3", "\\triangleleft");
|
1510
1599
|
defineSymbol(math, bin, "\u25b9", "\\triangleright");
|
1511
1600
|
defineSymbol(math, open, "{", "\\{");
|
@@ -2019,9 +2108,11 @@ const consolidateText = mrow => {
|
|
2019
2108
|
};
|
2020
2109
|
|
2021
2110
|
const numberRegEx$1 = /^[0-9]$/;
|
2022
|
-
const
|
2023
|
-
return (node.type === "
|
2024
|
-
|
2111
|
+
const isDotOrComma = (node, followingNode) => {
|
2112
|
+
return ((node.type === "textord" && node.text === ".") ||
|
2113
|
+
(node.type === "atom" && node.text === ",")) &&
|
2114
|
+
// Don't consolidate if there is a space after the comma.
|
2115
|
+
node.loc && followingNode.loc && node.loc.end === followingNode.loc.start
|
2025
2116
|
};
|
2026
2117
|
const consolidateNumbers = expression => {
|
2027
2118
|
// Consolidate adjacent numbers. We want to return <mn>1,506.3</mn>,
|
@@ -2044,7 +2135,8 @@ const consolidateNumbers = expression => {
|
|
2044
2135
|
|
2045
2136
|
// Determine if numeral groups are separated by a comma or dot.
|
2046
2137
|
for (let i = nums.length - 1; i > 0; i--) {
|
2047
|
-
if (nums[i - 1].end === nums[i].start - 2 &&
|
2138
|
+
if (nums[i - 1].end === nums[i].start - 2 &&
|
2139
|
+
isDotOrComma(expression[nums[i].start - 1], expression[nums[i].start])) {
|
2048
2140
|
// Merge the two groups.
|
2049
2141
|
nums[i - 1].end = nums[i].end;
|
2050
2142
|
nums.splice(i, 1);
|
@@ -3477,6 +3569,9 @@ defineFunction({
|
|
3477
3569
|
|
3478
3570
|
if (funcName === "\\edef" || funcName === "\\xdef") {
|
3479
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
|
+
}
|
3480
3575
|
tokens.reverse(); // to fit in with stack order
|
3481
3576
|
}
|
3482
3577
|
// Final arg is the expansion of the macro
|
@@ -5110,6 +5205,21 @@ defineFunction({
|
|
5110
5205
|
}
|
5111
5206
|
});
|
5112
5207
|
|
5208
|
+
const isLongVariableName = (group, font) => {
|
5209
|
+
if (font !== "mathrm" || group.body.type !== "ordgroup" || group.body.body.length === 1) {
|
5210
|
+
return false
|
5211
|
+
}
|
5212
|
+
if (group.body.body[0].type !== "mathord") { return false }
|
5213
|
+
for (let i = 1; i < group.body.body.length; i++) {
|
5214
|
+
const parseNodeType = group.body.body[i].type;
|
5215
|
+
if (!(parseNodeType === "mathord" ||
|
5216
|
+
(parseNodeType === "textord" && !isNaN(group.body.body[i].text)))) {
|
5217
|
+
return false
|
5218
|
+
}
|
5219
|
+
}
|
5220
|
+
return true
|
5221
|
+
};
|
5222
|
+
|
5113
5223
|
const mathmlBuilder$6 = (group, style) => {
|
5114
5224
|
const font = group.font;
|
5115
5225
|
const newStyle = style.withFont(font);
|
@@ -5121,6 +5231,20 @@ const mathmlBuilder$6 = (group, style) => {
|
|
5121
5231
|
return mathGroup
|
5122
5232
|
}
|
5123
5233
|
// Check if it is possible to consolidate elements into a single <mi> element.
|
5234
|
+
if (isLongVariableName(group, font)) {
|
5235
|
+
// This is a \mathrm{…} group. It gets special treatment because symbolsOrd.js
|
5236
|
+
// wraps <mi> elements with <mrow>s to work around a Firefox bug.
|
5237
|
+
const mi = mathGroup.children[0].children[0];
|
5238
|
+
delete mi.attributes.mathvariant;
|
5239
|
+
for (let i = 1; i < mathGroup.children.length; i++) {
|
5240
|
+
mi.children[0].text += mathGroup.children[i].type === "mn"
|
5241
|
+
? mathGroup.children[i].children[0].text
|
5242
|
+
: mathGroup.children[i].children[0].children[0].text;
|
5243
|
+
}
|
5244
|
+
// Wrap in a <mrow> to prevent the same Firefox bug.
|
5245
|
+
const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b"));
|
5246
|
+
return new mathMLTree.MathNode("mrow", [bogus, mi])
|
5247
|
+
}
|
5124
5248
|
let canConsolidate = mathGroup.children[0].type === "mo";
|
5125
5249
|
for (let i = 1; i < mathGroup.children.length; i++) {
|
5126
5250
|
if (mathGroup.children[i].type === "mo" && font === "boldsymbol") {
|
@@ -13186,7 +13310,7 @@ class Style {
|
|
13186
13310
|
* https://mit-license.org/
|
13187
13311
|
*/
|
13188
13312
|
|
13189
|
-
const version = "0.10.
|
13313
|
+
const version = "0.10.24";
|
13190
13314
|
|
13191
13315
|
function postProcess(block) {
|
13192
13316
|
const labelMap = {};
|
package/dist/temmlPostProcess.js
CHANGED
package/package.json
CHANGED
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
|
-
|
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);
|
package/src/buildMathML.js
CHANGED
@@ -80,9 +80,11 @@ export const consolidateText = mrow => {
|
|
80
80
|
}
|
81
81
|
|
82
82
|
const numberRegEx = /^[0-9]$/
|
83
|
-
const
|
84
|
-
return (node.type === "
|
85
|
-
|
83
|
+
const isDotOrComma = (node, followingNode) => {
|
84
|
+
return ((node.type === "textord" && node.text === ".") ||
|
85
|
+
(node.type === "atom" && node.text === ",")) &&
|
86
|
+
// Don't consolidate if there is a space after the comma.
|
87
|
+
node.loc && followingNode.loc && node.loc.end === followingNode.loc.start
|
86
88
|
}
|
87
89
|
const consolidateNumbers = expression => {
|
88
90
|
// Consolidate adjacent numbers. We want to return <mn>1,506.3</mn>,
|
@@ -105,7 +107,8 @@ const consolidateNumbers = expression => {
|
|
105
107
|
|
106
108
|
// Determine if numeral groups are separated by a comma or dot.
|
107
109
|
for (let i = nums.length - 1; i > 0; i--) {
|
108
|
-
if (nums[i - 1].end === nums[i].start - 2 &&
|
110
|
+
if (nums[i - 1].end === nums[i].start - 2 &&
|
111
|
+
isDotOrComma(expression[nums[i].start - 1], expression[nums[i].start])) {
|
109
112
|
// Merge the two groups.
|
110
113
|
nums[i - 1].end = nums[i].end
|
111
114
|
nums.splice(i, 1)
|
package/src/functions/def.js
CHANGED
@@ -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
|
package/src/functions/font.js
CHANGED
@@ -2,6 +2,21 @@ import defineFunction, { normalizeArgument } from "../defineFunction"
|
|
2
2
|
import * as mml from "../buildMathML"
|
3
3
|
import mathMLTree from "../mathMLTree"
|
4
4
|
|
5
|
+
const isLongVariableName = (group, font) => {
|
6
|
+
if (font !== "mathrm" || group.body.type !== "ordgroup" || group.body.body.length === 1) {
|
7
|
+
return false
|
8
|
+
}
|
9
|
+
if (group.body.body[0].type !== "mathord") { return false }
|
10
|
+
for (let i = 1; i < group.body.body.length; i++) {
|
11
|
+
const parseNodeType = group.body.body[i].type
|
12
|
+
if (!(parseNodeType === "mathord" ||
|
13
|
+
(parseNodeType === "textord" && !isNaN(group.body.body[i].text)))) {
|
14
|
+
return false
|
15
|
+
}
|
16
|
+
}
|
17
|
+
return true
|
18
|
+
}
|
19
|
+
|
5
20
|
const mathmlBuilder = (group, style) => {
|
6
21
|
const font = group.font
|
7
22
|
const newStyle = style.withFont(font)
|
@@ -13,6 +28,20 @@ const mathmlBuilder = (group, style) => {
|
|
13
28
|
return mathGroup
|
14
29
|
}
|
15
30
|
// Check if it is possible to consolidate elements into a single <mi> element.
|
31
|
+
if (isLongVariableName(group, font)) {
|
32
|
+
// This is a \mathrm{…} group. It gets special treatment because symbolsOrd.js
|
33
|
+
// wraps <mi> elements with <mrow>s to work around a Firefox bug.
|
34
|
+
const mi = mathGroup.children[0].children[0];
|
35
|
+
delete mi.attributes.mathvariant
|
36
|
+
for (let i = 1; i < mathGroup.children.length; i++) {
|
37
|
+
mi.children[0].text += mathGroup.children[i].type === "mn"
|
38
|
+
? mathGroup.children[i].children[0].text
|
39
|
+
: mathGroup.children[i].children[0].children[0].text
|
40
|
+
}
|
41
|
+
// Wrap in a <mrow> to prevent the same Firefox bug.
|
42
|
+
const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b"))
|
43
|
+
return new mathMLTree.MathNode("mrow", [bogus, mi])
|
44
|
+
}
|
16
45
|
let canConsolidate = mathGroup.children[0].type === "mo"
|
17
46
|
for (let i = 1; i < mathGroup.children.length; i++) {
|
18
47
|
if (mathGroup.children[i].type === "mo" && font === "boldsymbol") {
|
@@ -25,7 +54,7 @@ const mathmlBuilder = (group, style) => {
|
|
25
54
|
}
|
26
55
|
if (!canConsolidate) { return mathGroup }
|
27
56
|
// Consolidate the <mi> elements.
|
28
|
-
const mi = mathGroup.children[0]
|
57
|
+
const mi = mathGroup.children[0];
|
29
58
|
for (let i = 1; i < mathGroup.children.length; i++) {
|
30
59
|
mi.children.push(mathGroup.children[i].children[0])
|
31
60
|
}
|
package/src/postProcess.js
CHANGED
package/src/symbols.js
CHANGED
@@ -218,6 +218,7 @@ defineSymbol(math, mathord, "\u2609", "\\astrosun", true);
|
|
218
218
|
defineSymbol(math, mathord, "\u263c", "\\sun", true);
|
219
219
|
defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
|
220
220
|
defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
|
221
|
+
defineSymbol(math, mathord, "\u2295", "\\Earth");
|
221
222
|
|
222
223
|
// AMS Negated Binary Relations
|
223
224
|
defineSymbol(math, rel, "\u226e", "\\nless", true);
|
@@ -445,6 +446,73 @@ defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true);
|
|
445
446
|
defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true);
|
446
447
|
defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true);
|
447
448
|
|
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)
|
515
|
+
|
448
516
|
// AMS Arrows
|
449
517
|
// Note: unicode-math maps \u21e2 to their own function \rightdasharrow.
|
450
518
|
// We'll map it to AMS function \dashrightarrow. It produces the same atom.
|
@@ -685,8 +753,8 @@ defineSymbol(math, spacing, null, "\\allowbreak");
|
|
685
753
|
defineSymbol(math, punct, ",", ",");
|
686
754
|
defineSymbol(text, punct, ":", ":");
|
687
755
|
defineSymbol(math, punct, ";", ";");
|
688
|
-
defineSymbol(math, bin, "\u22bc", "\\barwedge"
|
689
|
-
defineSymbol(math, bin, "\u22bb", "\\veebar"
|
756
|
+
defineSymbol(math, bin, "\u22bc", "\\barwedge");
|
757
|
+
defineSymbol(math, bin, "\u22bb", "\\veebar");
|
690
758
|
defineSymbol(math, bin, "\u2299", "\\odot", true);
|
691
759
|
// Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here.
|
692
760
|
defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus");
|
@@ -699,7 +767,6 @@ defineSymbol(math, bin, "\u25b3", "\\bigtriangleup");
|
|
699
767
|
defineSymbol(math, bin, "\u25bd", "\\bigtriangledown");
|
700
768
|
defineSymbol(math, bin, "\u2020", "\\dagger");
|
701
769
|
defineSymbol(math, bin, "\u22c4", "\\diamond");
|
702
|
-
defineSymbol(math, bin, "\u22c6", "\\star");
|
703
770
|
defineSymbol(math, bin, "\u25c3", "\\triangleleft");
|
704
771
|
defineSymbol(math, bin, "\u25b9", "\\triangleright");
|
705
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
|
-
|
88
|
-
|
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]*([^\\/#?]*?)(:|�*58|�*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
|
/**
|