temml 0.10.22 → 0.10.24
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
/**
|