temml 0.10.9 → 0.10.12
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/temml.cjs +13 -113
- package/dist/temml.js +13 -113
- package/dist/temml.min.js +1 -1
- package/dist/temml.mjs +13 -113
- package/dist/temmlPostProcess.js +1 -1
- package/package.json +2 -2
- package/src/Parser.js +2 -8
- package/src/Settings.js +1 -0
- package/src/buildMathML.js +1 -1
- package/src/functions/mclass.js +4 -1
- package/src/functions/symbolsOrd.js +2 -0
- package/src/postProcess.js +1 -1
- package/src/symbols.js +3 -0
- package/src/unicodeScripts.js +0 -119
package/dist/temml.mjs
CHANGED
@@ -186,6 +186,7 @@ class Settings {
|
|
186
186
|
this.displayMode = utils.deflt(options.displayMode, false); // boolean
|
187
187
|
this.annotate = utils.deflt(options.annotate, false); // boolean
|
188
188
|
this.leqno = utils.deflt(options.leqno, false); // boolean
|
189
|
+
this.throwOnError = utils.deflt(options.throwOnError, false); // boolean
|
189
190
|
this.errorColor = utils.deflt(options.errorColor, "#b22222"); // string
|
190
191
|
this.macros = options.macros || {};
|
191
192
|
this.wrap = utils.deflt(options.wrap, "tex"); // "tex" | "="
|
@@ -863,6 +864,9 @@ defineSymbol(math, rel, "\u225e", "\\measeq", true);
|
|
863
864
|
defineSymbol(math, rel, "\u225f", "\\questeq", true);
|
864
865
|
defineSymbol(math, rel, "\u2260", "\\ne", true);
|
865
866
|
defineSymbol(math, rel, "\u2260", "\\neq");
|
867
|
+
// unicodemath
|
868
|
+
defineSymbol(math, rel, "\u2a75", "\\eqeq", true);
|
869
|
+
defineSymbol(math, rel, "\u2a76", "\\eqeqeq", true);
|
866
870
|
// mathtools.sty
|
867
871
|
defineSymbol(math, rel, "\u2237", "\\dblcolon", true);
|
868
872
|
defineSymbol(math, rel, "\u2254", "\\coloneqq", true);
|
@@ -2128,7 +2132,7 @@ function buildMathML(tree, texExpression, style, settings) {
|
|
2128
2132
|
math.setAttribute("display", "block");
|
2129
2133
|
math.style.display = math.children.length === 1 && math.children[0].type === "mtable"
|
2130
2134
|
? "inline"
|
2131
|
-
: "
|
2135
|
+
: "block math";
|
2132
2136
|
}
|
2133
2137
|
return math;
|
2134
2138
|
}
|
@@ -5999,7 +6003,9 @@ defineFunction({
|
|
5999
6003
|
const arr = (body.body) ? body.body : [body];
|
6000
6004
|
for (const arg of arr) {
|
6001
6005
|
if (textAtomTypes.includes(arg.type)) {
|
6002
|
-
if (arg.text) {
|
6006
|
+
if (symbols[parser.mode][arg.text]) {
|
6007
|
+
mord.text += symbols[parser.mode][arg.text].replace;
|
6008
|
+
} else if (arg.text) {
|
6003
6009
|
mord.text += arg.text;
|
6004
6010
|
} else if (arg.body) {
|
6005
6011
|
arg.body.map(e => { mord.text += e.text; });
|
@@ -7746,6 +7752,8 @@ defineFunctionBuilders({
|
|
7746
7752
|
node = new mathMLTree.MathNode("mi", [text]);
|
7747
7753
|
if (text.text === origText && latinRegEx.test(origText)) {
|
7748
7754
|
node.setAttribute("mathvariant", "italic");
|
7755
|
+
} else if (text.text === "∇" && variant === "normal") {
|
7756
|
+
node.setAttribute("mathvariant", "normal");
|
7749
7757
|
}
|
7750
7758
|
}
|
7751
7759
|
return node
|
@@ -11233,109 +11241,6 @@ class MacroExpander {
|
|
11233
11241
|
}
|
11234
11242
|
}
|
11235
11243
|
|
11236
|
-
/*
|
11237
|
-
* This file defines the Unicode scripts and script families that we
|
11238
|
-
* support. To add new scripts or families, just add a new entry to the
|
11239
|
-
* scriptData array below. Adding scripts to the scriptData array allows
|
11240
|
-
* characters from that script to appear in \text{} environments.
|
11241
|
-
*/
|
11242
|
-
|
11243
|
-
/**
|
11244
|
-
* Each script or script family has a name and an array of blocks.
|
11245
|
-
* Each block is an array of two numbers which specify the start and
|
11246
|
-
* end points (inclusive) of a block of Unicode codepoints.
|
11247
|
-
|
11248
|
-
/**
|
11249
|
-
* Unicode block data for the families of scripts we support in \text{}.
|
11250
|
-
* Scripts only need to appear here if they do not have font metrics.
|
11251
|
-
*/
|
11252
|
-
const scriptData = [
|
11253
|
-
{
|
11254
|
-
// Latin characters beyond the Latin-1 characters we have metrics for.
|
11255
|
-
// Needed for Czech, Hungarian and Turkish text, for example.
|
11256
|
-
name: "latin",
|
11257
|
-
blocks: [
|
11258
|
-
[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B
|
11259
|
-
[0x0300, 0x036f] // Combining Diacritical marks
|
11260
|
-
]
|
11261
|
-
},
|
11262
|
-
{
|
11263
|
-
// The Cyrillic script used by Russian and related languages.
|
11264
|
-
// A Cyrillic subset used to be supported as explicitly defined
|
11265
|
-
// symbols in symbols.js
|
11266
|
-
name: "cyrillic",
|
11267
|
-
blocks: [[0x0400, 0x04ff]]
|
11268
|
-
},
|
11269
|
-
{
|
11270
|
-
// Armenian
|
11271
|
-
name: "armenian",
|
11272
|
-
blocks: [[0x0530, 0x058f]]
|
11273
|
-
},
|
11274
|
-
{
|
11275
|
-
// The Brahmic scripts of South and Southeast Asia
|
11276
|
-
// Devanagari (0900–097F)
|
11277
|
-
// Bengali (0980–09FF)
|
11278
|
-
// Gurmukhi (0A00–0A7F)
|
11279
|
-
// Gujarati (0A80–0AFF)
|
11280
|
-
// Oriya (0B00–0B7F)
|
11281
|
-
// Tamil (0B80–0BFF)
|
11282
|
-
// Telugu (0C00–0C7F)
|
11283
|
-
// Kannada (0C80–0CFF)
|
11284
|
-
// Malayalam (0D00–0D7F)
|
11285
|
-
// Sinhala (0D80–0DFF)
|
11286
|
-
// Thai (0E00–0E7F)
|
11287
|
-
// Lao (0E80–0EFF)
|
11288
|
-
// Tibetan (0F00–0FFF)
|
11289
|
-
// Myanmar (1000–109F)
|
11290
|
-
name: "brahmic",
|
11291
|
-
blocks: [[0x0900, 0x109f]]
|
11292
|
-
},
|
11293
|
-
{
|
11294
|
-
name: "georgian",
|
11295
|
-
blocks: [[0x10a0, 0x10ff]]
|
11296
|
-
},
|
11297
|
-
{
|
11298
|
-
// Chinese and Japanese.
|
11299
|
-
// The "k" in cjk is for Korean, but we've separated Korean out
|
11300
|
-
name: "cjk",
|
11301
|
-
blocks: [
|
11302
|
-
[0x3000, 0x30ff], // CJK symbols and punctuation, Hiragana, Katakana
|
11303
|
-
[0x4e00, 0x9faf], // CJK ideograms
|
11304
|
-
[0xff00, 0xff60] // Fullwidth punctuation
|
11305
|
-
// TODO: add halfwidth Katakana and Romanji glyphs
|
11306
|
-
]
|
11307
|
-
},
|
11308
|
-
{
|
11309
|
-
// Korean
|
11310
|
-
name: "hangul",
|
11311
|
-
blocks: [[0xac00, 0xd7af]]
|
11312
|
-
}
|
11313
|
-
];
|
11314
|
-
|
11315
|
-
/**
|
11316
|
-
* A flattened version of all the supported blocks in a single array.
|
11317
|
-
* This is an optimization to make supportedCodepoint() fast.
|
11318
|
-
*/
|
11319
|
-
const allBlocks = [];
|
11320
|
-
scriptData.forEach((s) => s.blocks.forEach((b) => allBlocks.push(...b)));
|
11321
|
-
|
11322
|
-
/**
|
11323
|
-
* Given a codepoint, return true if it falls within one of the
|
11324
|
-
* scripts or script families defined above and false otherwise.
|
11325
|
-
*
|
11326
|
-
* Micro benchmarks shows that this is faster than
|
11327
|
-
* /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test()
|
11328
|
-
* in Firefox, Chrome and Node.
|
11329
|
-
*/
|
11330
|
-
function supportedCodepoint(codepoint) {
|
11331
|
-
for (let i = 0; i < allBlocks.length; i += 2) {
|
11332
|
-
if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {
|
11333
|
-
return true;
|
11334
|
-
}
|
11335
|
-
}
|
11336
|
-
return false;
|
11337
|
-
}
|
11338
|
-
|
11339
11244
|
// Helpers for Parser.js handling of Unicode (sub|super)script characters.
|
11340
11245
|
|
11341
11246
|
const unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;
|
@@ -12738,13 +12643,8 @@ class Parser {
|
|
12738
12643
|
symbol = s;
|
12739
12644
|
} else if (text.charCodeAt(0) >= 0x80) {
|
12740
12645
|
// no symbol for e.g. ^
|
12741
|
-
if (this.settings.strict) {
|
12742
|
-
|
12743
|
-
throw new ParseError(`Unrecognized Unicode character "${text[0]}"` +
|
12744
|
-
` (${text.charCodeAt(0)})`, nucleus);
|
12745
|
-
} else if (this.mode === "math") {
|
12746
|
-
throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus)
|
12747
|
-
}
|
12646
|
+
if (this.settings.strict && this.mode === "math") {
|
12647
|
+
throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus)
|
12748
12648
|
}
|
12749
12649
|
// All nonmathematical Unicode characters are rendered as if they
|
12750
12650
|
// are in text mode (wrapped in \text) because that's what it
|
@@ -12975,7 +12875,7 @@ class Style {
|
|
12975
12875
|
* https://mit-license.org/
|
12976
12876
|
*/
|
12977
12877
|
|
12978
|
-
const version = "0.10.
|
12878
|
+
const version = "0.10.12";
|
12979
12879
|
|
12980
12880
|
function postProcess(block) {
|
12981
12881
|
const labelMap = {};
|
package/dist/temmlPostProcess.js
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "temml",
|
3
|
-
"version": "0.10.
|
3
|
+
"version": "0.10.12",
|
4
4
|
"description": "TeX to MathML conversion in JavaScript.",
|
5
5
|
"main": "dist/temml.js",
|
6
6
|
"exports": {
|
@@ -23,7 +23,7 @@
|
|
23
23
|
],
|
24
24
|
"license": "MIT",
|
25
25
|
"devDependencies": {
|
26
|
-
"eslint": "^8.
|
26
|
+
"eslint": "^8.39.0",
|
27
27
|
"esm": "^3.2.25",
|
28
28
|
"rollup": "^2.66.1",
|
29
29
|
"terser": "^5.14.2"
|
package/src/Parser.js
CHANGED
@@ -3,7 +3,6 @@ import functions from "./functions";
|
|
3
3
|
import MacroExpander, { implicitCommands } from "./MacroExpander";
|
4
4
|
import symbols, { ATOMS } from "./symbols";
|
5
5
|
import { validUnit } from "./units";
|
6
|
-
import { supportedCodepoint } from "./unicodeScripts";
|
7
6
|
import ParseError from "./ParseError";
|
8
7
|
import { combiningDiacriticalMarksEndRegex } from "./Lexer";
|
9
8
|
import { uSubsAndSups, unicodeSubRegEx } from "./unicodeSupOrSub"
|
@@ -939,13 +938,8 @@ export default class Parser {
|
|
939
938
|
symbol = s;
|
940
939
|
} else if (text.charCodeAt(0) >= 0x80) {
|
941
940
|
// no symbol for e.g. ^
|
942
|
-
if (this.settings.strict) {
|
943
|
-
|
944
|
-
throw new ParseError(`Unrecognized Unicode character "${text[0]}"` +
|
945
|
-
` (${text.charCodeAt(0)})`, nucleus);
|
946
|
-
} else if (this.mode === "math") {
|
947
|
-
throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus)
|
948
|
-
}
|
941
|
+
if (this.settings.strict && this.mode === "math") {
|
942
|
+
throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus)
|
949
943
|
}
|
950
944
|
// All nonmathematical Unicode characters are rendered as if they
|
951
945
|
// are in text mode (wrapped in \text) because that's what it
|
package/src/Settings.js
CHANGED
@@ -15,6 +15,7 @@ export default class Settings {
|
|
15
15
|
this.displayMode = utils.deflt(options.displayMode, false); // boolean
|
16
16
|
this.annotate = utils.deflt(options.annotate, false) // boolean
|
17
17
|
this.leqno = utils.deflt(options.leqno, false); // boolean
|
18
|
+
this.throwOnError = utils.deflt(options.throwOnError, false); // boolean
|
18
19
|
this.errorColor = utils.deflt(options.errorColor, "#b22222"); // string
|
19
20
|
this.macros = options.macros || {};
|
20
21
|
this.wrap = utils.deflt(options.wrap, "tex") // "tex" | "="
|
package/src/buildMathML.js
CHANGED
@@ -262,7 +262,7 @@ export default function buildMathML(tree, texExpression, style, settings) {
|
|
262
262
|
math.setAttribute("display", "block");
|
263
263
|
math.style.display = math.children.length === 1 && math.children[0].type === "mtable"
|
264
264
|
? "inline"
|
265
|
-
: "
|
265
|
+
: "block math"
|
266
266
|
}
|
267
267
|
return math;
|
268
268
|
}
|
package/src/functions/mclass.js
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import defineFunction, { ordargument } from "../defineFunction";
|
2
|
+
import symbols from "../symbols";
|
2
3
|
import mathMLTree from "../mathMLTree";
|
3
4
|
import utils from "../utils";
|
4
5
|
|
@@ -112,7 +113,9 @@ defineFunction({
|
|
112
113
|
const arr = (body.body) ? body.body : [body];
|
113
114
|
for (const arg of arr) {
|
114
115
|
if (textAtomTypes.includes(arg.type)) {
|
115
|
-
if (arg.text) {
|
116
|
+
if (symbols[parser.mode][arg.text]) {
|
117
|
+
mord.text += symbols[parser.mode][arg.text].replace
|
118
|
+
} else if (arg.text) {
|
116
119
|
mord.text += arg.text
|
117
120
|
} else if (arg.body) {
|
118
121
|
arg.body.map(e => { mord.text += e.text })
|
@@ -88,6 +88,8 @@ defineFunctionBuilders({
|
|
88
88
|
node = new mathMLTree.MathNode("mi", [text])
|
89
89
|
if (text.text === origText && latinRegEx.test(origText)) {
|
90
90
|
node.setAttribute("mathvariant", "italic")
|
91
|
+
} else if (text.text === "∇" && variant === "normal") {
|
92
|
+
node.setAttribute("mathvariant", "normal")
|
91
93
|
}
|
92
94
|
}
|
93
95
|
return node
|
package/src/postProcess.js
CHANGED
package/src/symbols.js
CHANGED
@@ -105,6 +105,9 @@ defineSymbol(math, rel, "\u225e", "\\measeq", true);
|
|
105
105
|
defineSymbol(math, rel, "\u225f", "\\questeq", true);
|
106
106
|
defineSymbol(math, rel, "\u2260", "\\ne", true);
|
107
107
|
defineSymbol(math, rel, "\u2260", "\\neq");
|
108
|
+
// unicodemath
|
109
|
+
defineSymbol(math, rel, "\u2a75", "\\eqeq", true);
|
110
|
+
defineSymbol(math, rel, "\u2a76", "\\eqeqeq", true);
|
108
111
|
// mathtools.sty
|
109
112
|
defineSymbol(math, rel, "\u2237", "\\dblcolon", true);
|
110
113
|
defineSymbol(math, rel, "\u2254", "\\coloneqq", true);
|
package/src/unicodeScripts.js
DELETED
@@ -1,119 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* This file defines the Unicode scripts and script families that we
|
3
|
-
* support. To add new scripts or families, just add a new entry to the
|
4
|
-
* scriptData array below. Adding scripts to the scriptData array allows
|
5
|
-
* characters from that script to appear in \text{} environments.
|
6
|
-
*/
|
7
|
-
|
8
|
-
/**
|
9
|
-
* Each script or script family has a name and an array of blocks.
|
10
|
-
* Each block is an array of two numbers which specify the start and
|
11
|
-
* end points (inclusive) of a block of Unicode codepoints.
|
12
|
-
|
13
|
-
/**
|
14
|
-
* Unicode block data for the families of scripts we support in \text{}.
|
15
|
-
* Scripts only need to appear here if they do not have font metrics.
|
16
|
-
*/
|
17
|
-
const scriptData = [
|
18
|
-
{
|
19
|
-
// Latin characters beyond the Latin-1 characters we have metrics for.
|
20
|
-
// Needed for Czech, Hungarian and Turkish text, for example.
|
21
|
-
name: "latin",
|
22
|
-
blocks: [
|
23
|
-
[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B
|
24
|
-
[0x0300, 0x036f] // Combining Diacritical marks
|
25
|
-
]
|
26
|
-
},
|
27
|
-
{
|
28
|
-
// The Cyrillic script used by Russian and related languages.
|
29
|
-
// A Cyrillic subset used to be supported as explicitly defined
|
30
|
-
// symbols in symbols.js
|
31
|
-
name: "cyrillic",
|
32
|
-
blocks: [[0x0400, 0x04ff]]
|
33
|
-
},
|
34
|
-
{
|
35
|
-
// Armenian
|
36
|
-
name: "armenian",
|
37
|
-
blocks: [[0x0530, 0x058f]]
|
38
|
-
},
|
39
|
-
{
|
40
|
-
// The Brahmic scripts of South and Southeast Asia
|
41
|
-
// Devanagari (0900–097F)
|
42
|
-
// Bengali (0980–09FF)
|
43
|
-
// Gurmukhi (0A00–0A7F)
|
44
|
-
// Gujarati (0A80–0AFF)
|
45
|
-
// Oriya (0B00–0B7F)
|
46
|
-
// Tamil (0B80–0BFF)
|
47
|
-
// Telugu (0C00–0C7F)
|
48
|
-
// Kannada (0C80–0CFF)
|
49
|
-
// Malayalam (0D00–0D7F)
|
50
|
-
// Sinhala (0D80–0DFF)
|
51
|
-
// Thai (0E00–0E7F)
|
52
|
-
// Lao (0E80–0EFF)
|
53
|
-
// Tibetan (0F00–0FFF)
|
54
|
-
// Myanmar (1000–109F)
|
55
|
-
name: "brahmic",
|
56
|
-
blocks: [[0x0900, 0x109f]]
|
57
|
-
},
|
58
|
-
{
|
59
|
-
name: "georgian",
|
60
|
-
blocks: [[0x10a0, 0x10ff]]
|
61
|
-
},
|
62
|
-
{
|
63
|
-
// Chinese and Japanese.
|
64
|
-
// The "k" in cjk is for Korean, but we've separated Korean out
|
65
|
-
name: "cjk",
|
66
|
-
blocks: [
|
67
|
-
[0x3000, 0x30ff], // CJK symbols and punctuation, Hiragana, Katakana
|
68
|
-
[0x4e00, 0x9faf], // CJK ideograms
|
69
|
-
[0xff00, 0xff60] // Fullwidth punctuation
|
70
|
-
// TODO: add halfwidth Katakana and Romanji glyphs
|
71
|
-
]
|
72
|
-
},
|
73
|
-
{
|
74
|
-
// Korean
|
75
|
-
name: "hangul",
|
76
|
-
blocks: [[0xac00, 0xd7af]]
|
77
|
-
}
|
78
|
-
];
|
79
|
-
|
80
|
-
/**
|
81
|
-
* Given a codepoint, return the name of the script or script family
|
82
|
-
* it is from, or null if it is not part of a known block
|
83
|
-
*/
|
84
|
-
export function scriptFromCodepoint(codepoint) {
|
85
|
-
for (let i = 0; i < scriptData.length; i++) {
|
86
|
-
const script = scriptData[i];
|
87
|
-
for (let i = 0; i < script.blocks.length; i++) {
|
88
|
-
const block = script.blocks[i];
|
89
|
-
if (codepoint >= block[0] && codepoint <= block[1]) {
|
90
|
-
return script.name;
|
91
|
-
}
|
92
|
-
}
|
93
|
-
}
|
94
|
-
return null;
|
95
|
-
}
|
96
|
-
|
97
|
-
/**
|
98
|
-
* A flattened version of all the supported blocks in a single array.
|
99
|
-
* This is an optimization to make supportedCodepoint() fast.
|
100
|
-
*/
|
101
|
-
const allBlocks = [];
|
102
|
-
scriptData.forEach((s) => s.blocks.forEach((b) => allBlocks.push(...b)));
|
103
|
-
|
104
|
-
/**
|
105
|
-
* Given a codepoint, return true if it falls within one of the
|
106
|
-
* scripts or script families defined above and false otherwise.
|
107
|
-
*
|
108
|
-
* Micro benchmarks shows that this is faster than
|
109
|
-
* /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test()
|
110
|
-
* in Firefox, Chrome and Node.
|
111
|
-
*/
|
112
|
-
export function supportedCodepoint(codepoint) {
|
113
|
-
for (let i = 0; i < allBlocks.length; i += 2) {
|
114
|
-
if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {
|
115
|
-
return true;
|
116
|
-
}
|
117
|
-
}
|
118
|
-
return false;
|
119
|
-
}
|