Skip to content

Commit 6d911de

Browse files
committed
Merge branch 'full-optable' into alpha
2 parents 3d89c20 + fa011d5 commit 6d911de

File tree

2 files changed

+1266
-337
lines changed

2 files changed

+1266
-337
lines changed

mathjax3-ts/core/MmlTree/MmlNodes/mo.ts

Lines changed: 10 additions & 337 deletions
Original file line numberDiff line numberDiff line change
@@ -24,50 +24,7 @@
2424
import {PropertyList} from '../../Tree/Node.js';
2525
import {AbstractMmlTokenNode, MmlNode, AttributeList, TEXCLASS} from '../MmlNode.js';
2626
import {MmlMrow} from './mrow.js';
27-
28-
/*
29-
* Types needed for the operator dictionary
30-
*/
31-
export type OperatorDef = [number, number, number, PropertyList];
32-
export type OperatorList = {[name: string]: OperatorDef};
33-
export type RangeDef = [number, number, number, string];
34-
35-
export function OPDEF(lspace: number, rspace: number, texClass: number, properties: PropertyList = null): OperatorDef {
36-
return [lspace, rspace, texClass, properties] as OperatorDef;
37-
}
38-
39-
/*
40-
* The various kinds of operators in the dictionary
41-
*/
42-
export let MO = {
43-
ORD: OPDEF(0, 0, TEXCLASS.ORD),
44-
ORD11: OPDEF(1, 1, TEXCLASS.ORD),
45-
ORD21: OPDEF(2, 1, TEXCLASS.ORD),
46-
ORD02: OPDEF(0, 2, TEXCLASS.ORD),
47-
ORD55: OPDEF(5, 5, TEXCLASS.ORD),
48-
OP: OPDEF(1, 2, TEXCLASS.OP, {largeop: true, movablelimits: true, symmetric: true}),
49-
OPFIXED: OPDEF(1, 2, TEXCLASS.OP, {largeop: true, movablelimits: true}),
50-
INTEGRAL: OPDEF(0, 1, TEXCLASS.OP, {largeop: true, symmetric: true}),
51-
INTEGRAL2: OPDEF(1, 2, TEXCLASS.OP, {largeop: true, symmetric: true}),
52-
BIN3: OPDEF(3, 3, TEXCLASS.BIN),
53-
BIN4: OPDEF(4, 4, TEXCLASS.BIN),
54-
BIN01: OPDEF(0, 1, TEXCLASS.BIN),
55-
BIN5: OPDEF(5, 5, TEXCLASS.BIN),
56-
TALLBIN: OPDEF(4, 4, TEXCLASS.BIN, {stretchy: true}),
57-
BINOP: OPDEF(4, 4, TEXCLASS.BIN, {largeop: true, movablelimits: true}),
58-
REL: OPDEF(5, 5, TEXCLASS.REL),
59-
REL1: OPDEF(1, 1, TEXCLASS.REL, {stretchy: true}),
60-
REL4: OPDEF(4, 4, TEXCLASS.REL),
61-
RELSTRETCH: OPDEF(5, 5, TEXCLASS.REL, {stretchy: true}),
62-
RELACCENT: OPDEF(5, 5, TEXCLASS.REL, {accent: true}),
63-
WIDEREL: OPDEF(5, 5, TEXCLASS.REL, {accent: true, stretchy: true}),
64-
OPEN: OPDEF(0, 0, TEXCLASS.OPEN, {fence: true, stretchy: true, symmetric: true}),
65-
CLOSE: OPDEF(0, 0, TEXCLASS.CLOSE, {fence: true, stretchy: true, symmetric: true}),
66-
INNER: OPDEF(0, 0, TEXCLASS.INNER),
67-
PUNCT: OPDEF(0, 3, TEXCLASS.PUNCT),
68-
ACCENT: OPDEF(0, 0, TEXCLASS.ORD, {accent: true}),
69-
WIDEACCENT: OPDEF(0, 0, TEXCLASS.ORD, {accent: true, stretchy: true})
70-
};
27+
import {OperatorList, OPTABLE, RangeDef, RANGES} from '../OperatorDictionary.js';
7128

7229
/*****************************************************************/
7330
/*
@@ -116,289 +73,17 @@ export class MmlMo extends AbstractMmlTokenNode {
11673
/*
11774
* Unicode ranges and their default TeX classes
11875
*/
119-
public static RANGES: RangeDef[] = [
120-
[0x20, 0x7F, TEXCLASS.REL, 'BasicLatin'],
121-
[0xA0, 0xFF, TEXCLASS.ORD, 'Latin1Supplement'],
122-
[0x100, 0x17F, TEXCLASS.ORD, 'LatinExtendedA'],
123-
[0x180, 0x24F, TEXCLASS.ORD, 'LatinExtendedB'],
124-
[0x2B0, 0x2FF, TEXCLASS.ORD, 'SpacingModLetters'],
125-
[0x300, 0x36F, TEXCLASS.ORD, 'CombDiacritMarks'],
126-
[0x370, 0x3FF, TEXCLASS.ORD, 'GreekAndCoptic'],
127-
[0x1E00, 0x1EFF, TEXCLASS.ORD, 'LatinExtendedAdditional'],
128-
[0x2000, 0x206F, TEXCLASS.PUNCT, 'GeneralPunctuation'],
129-
[0x2070, 0x209F, TEXCLASS.ORD, 'SuperAndSubscripts'],
130-
[0x20A0, 0x20CF, TEXCLASS.ORD, 'Currency'],
131-
[0x20D0, 0x20FF, TEXCLASS.ORD, 'CombDiactForSymbols'],
132-
[0x2100, 0x214F, TEXCLASS.ORD, 'LetterlikeSymbols'],
133-
[0x2150, 0x218F, TEXCLASS.ORD, 'NumberForms'],
134-
[0x2190, 0x21FF, TEXCLASS.REL, 'Arrows'],
135-
[0x2200, 0x22FF, TEXCLASS.BIN, 'MathOperators'],
136-
[0x2300, 0x23FF, TEXCLASS.ORD, 'MiscTechnical'],
137-
[0x2460, 0x24FF, TEXCLASS.ORD, 'EnclosedAlphaNums'],
138-
[0x2500, 0x259F, TEXCLASS.ORD, 'BoxDrawing'],
139-
[0x25A0, 0x25FF, TEXCLASS.ORD, 'GeometricShapes'],
140-
[0x2700, 0x27BF, TEXCLASS.ORD, 'Dingbats'],
141-
[0x27C0, 0x27EF, TEXCLASS.ORD, 'MiscMathSymbolsA'],
142-
[0x27F0, 0x27FF, TEXCLASS.REL, 'SupplementalArrowsA'],
143-
[0x2900, 0x297F, TEXCLASS.REL, 'SupplementalArrowsB'],
144-
[0x2980, 0x29FF, TEXCLASS.ORD, 'MiscMathSymbolsB'],
145-
[0x2A00, 0x2AFF, TEXCLASS.BIN, 'SuppMathOperators'],
146-
[0x2B00, 0x2BFF, TEXCLASS.ORD, 'MiscSymbolsAndArrows'],
147-
[0x1D400, 0x1D7FF, TEXCLASS.ORD, 'MathAlphabets']
148-
];
76+
public static RANGES: RangeDef[] = RANGES;
14977

15078
/*
151-
* The (minimal) Operator Dictionary. Currently this only include the basics.
79+
* The Operator Dictionary.
15280
*/
153-
public static OPTABLE: {[form: string]: OperatorList} = {
154-
prefix: {
155-
'\u2200': MO.ORD21, // for all
156-
'\u2202': MO.ORD21, // partial differential
157-
'\u2203': MO.ORD21, // there exists
158-
'\u2207': MO.ORD21, // nabla
159-
'\u220F': MO.OP, // n-ary product
160-
'\u2210': MO.OP, // n-ary coproduct
161-
'\u2211': MO.OP, // n-ary summation
162-
'\u2212': MO.BIN01, // minus sign
163-
'\u2213': MO.BIN01, // minus-or-plus sign
164-
'\u221A': [1, 1, TEXCLASS.ORD, {stretchy: true}], // square root
165-
'\u2220': MO.ORD, // angle
166-
'\u222B': MO.INTEGRAL, // integral
167-
'\u222E': MO.INTEGRAL, // contour integral
168-
'\u22C0': MO.OP, // n-ary logical and
169-
'\u22C1': MO.OP, // n-ary logical or
170-
'\u22C2': MO.OP, // n-ary intersection
171-
'\u22C3': MO.OP, // n-ary union
172-
'\u2308': MO.OPEN, // left ceiling
173-
'\u230A': MO.OPEN, // left floor
174-
'\u27E8': MO.OPEN, // mathematical left angle bracket
175-
'\u27EE': MO.OPEN, // mathematical left flattened parenthesis
176-
'\u2A00': MO.OP, // n-ary circled dot operator
177-
'\u2A01': MO.OP, // n-ary circled plus operator
178-
'\u2A02': MO.OP, // n-ary circled times operator
179-
'\u2A04': MO.OP, // n-ary union operator with plus
180-
'\u2A06': MO.OP, // n-ary square union operator
181-
'\u00AC': MO.ORD21, // not sign
182-
'\u00B1': MO.BIN01, // plus-minus sign
183-
'(': MO.OPEN, // left parenthesis
184-
'+': MO.BIN01, // plus sign
185-
'-': MO.BIN01, // hyphen-minus
186-
'[': MO.OPEN, // left square bracket
187-
'{': MO.OPEN, // left curly bracket
188-
'|': MO.OPEN // vertical line
189-
},
190-
postfix: {
191-
'!': [1, 0, TEXCLASS.CLOSE, null], // exclamation mark
192-
'&': MO.ORD, // ampersand
193-
'\u2032': MO.ORD02, // prime
194-
'\u203E': MO.WIDEACCENT, // overline
195-
'\u2309': MO.CLOSE, // right ceiling
196-
'\u230B': MO.CLOSE, // right floor
197-
'\u23DE': MO.WIDEACCENT, // top curly bracket
198-
'\u23DF': MO.WIDEACCENT, // bottom curly bracket
199-
'\u266D': MO.ORD02, // music flat sign
200-
'\u266E': MO.ORD02, // music natural sign
201-
'\u266F': MO.ORD02, // music sharp sign
202-
'\u27E9': MO.CLOSE, // mathematical right angle bracket
203-
'\u27EF': MO.CLOSE, // mathematical right flattened parenthesis
204-
'\u02C6': MO.WIDEACCENT, // modifier letter circumflex accent
205-
'\u02C7': MO.WIDEACCENT, // caron
206-
'\u02C9': MO.WIDEACCENT, // modifier letter macron
207-
'\u02CA': MO.ACCENT, // modifier letter acute accent
208-
'\u02CB': MO.ACCENT, // modifier letter grave accent
209-
'\u02D8': MO.ACCENT, // breve
210-
'\u02D9': MO.ACCENT, // dot above
211-
'\u02DC': MO.WIDEACCENT, // small tilde
212-
'\u0302': MO.WIDEACCENT, // combining circumflex accent
213-
'\u00A8': MO.ACCENT, // diaeresis
214-
'\u00AF': MO.WIDEACCENT, // macron
215-
')': MO.CLOSE, // right parenthesis
216-
']': MO.CLOSE, // right square bracket
217-
'^': MO.WIDEACCENT, // circumflex accent
218-
'_': MO.WIDEACCENT, // low line
219-
'`': MO.ACCENT, // grave accent
220-
'|': MO.CLOSE, // vertical line
221-
'}': MO.CLOSE, // right curly bracket
222-
'~': MO.WIDEACCENT // tilde
223-
},
224-
infix: {
225-
'': MO.ORD, // empty <mo>
226-
'%': [3, 3, TEXCLASS.ORD, null], // percent sign
227-
'\u2022': MO.BIN4, // bullet
228-
'\u2026': MO.INNER, // horizontal ellipsis
229-
'\u2044': MO.TALLBIN, // fraction slash
230-
'\u2061': MO.ORD, // function application
231-
'\u2062': MO.ORD, // invisible times
232-
'\u2063': [0, 0, TEXCLASS.ORD, {linebreakstyle: 'after', separator: true}], // invisible separator
233-
'\u2064': MO.ORD, // invisible plus
234-
'\u2190': MO.WIDEREL, // leftwards arrow
235-
'\u2191': MO.RELSTRETCH, // upwards arrow
236-
'\u2192': MO.WIDEREL, // rightwards arrow
237-
'\u2193': MO.RELSTRETCH, // downwards arrow
238-
'\u2194': MO.WIDEREL, // left right arrow
239-
'\u2195': MO.RELSTRETCH, // up down arrow
240-
'\u2196': MO.RELSTRETCH, // north west arrow
241-
'\u2197': MO.RELSTRETCH, // north east arrow
242-
'\u2198': MO.RELSTRETCH, // south east arrow
243-
'\u2199': MO.RELSTRETCH, // south west arrow
244-
'\u21A6': MO.WIDEREL, // rightwards arrow from bar
245-
'\u21A9': MO.WIDEREL, // leftwards arrow with hook
246-
'\u21AA': MO.WIDEREL, // rightwards arrow with hook
247-
'\u21BC': MO.WIDEREL, // leftwards harpoon with barb upwards
248-
'\u21BD': MO.WIDEREL, // leftwards harpoon with barb downwards
249-
'\u21C0': MO.WIDEREL, // rightwards harpoon with barb upwards
250-
'\u21C1': MO.WIDEREL, // rightwards harpoon with barb downwards
251-
'\u21CC': MO.WIDEREL, // rightwards harpoon over leftwards harpoon
252-
'\u21D0': MO.WIDEREL, // leftwards double arrow
253-
'\u21D1': MO.RELSTRETCH, // upwards double arrow
254-
'\u21D2': MO.WIDEREL, // rightwards double arrow
255-
'\u21D3': MO.RELSTRETCH, // downwards double arrow
256-
'\u21D4': MO.WIDEREL, // left right double arrow
257-
'\u21D5': MO.RELSTRETCH, // up down double arrow
258-
'\u2208': MO.REL, // element of
259-
'\u2209': MO.REL, // not an element of
260-
'\u220B': MO.REL, // contains as member
261-
'\u2212': MO.BIN4, // minus sign
262-
'\u2213': MO.BIN4, // minus-or-plus sign
263-
'\u2215': MO.TALLBIN, // division slash
264-
'\u2216': MO.BIN4, // set minus
265-
'\u2217': MO.BIN4, // asterisk operator
266-
'\u2218': MO.BIN4, // ring operator
267-
'\u2219': MO.BIN4, // bullet operator
268-
'\u221D': MO.REL, // proportional to
269-
'\u2223': MO.REL, // divides
270-
'\u2225': MO.REL, // parallel to
271-
'\u2227': MO.BIN4, // logical and
272-
'\u2228': MO.BIN4, // logical or
273-
'\u2229': MO.BIN4, // intersection
274-
'\u222A': MO.BIN4, // union
275-
'\u223C': MO.REL, // tilde operator
276-
'\u2240': MO.BIN4, // wreath product
277-
'\u2243': MO.REL, // asymptotically equal to
278-
'\u2245': MO.REL, // approximately equal to
279-
'\u2248': MO.REL, // almost equal to
280-
'\u224D': MO.REL, // equivalent to
281-
'\u2250': MO.REL, // approaches the limit
282-
'\u2260': MO.REL, // not equal to
283-
'\u2261': MO.REL, // identical to
284-
'\u2264': MO.REL, // less-than or equal to
285-
'\u2265': MO.REL, // greater-than or equal to
286-
'\u226A': MO.REL, // much less-than
287-
'\u226B': MO.REL, // much greater-than
288-
'\u227A': MO.REL, // precedes
289-
'\u227B': MO.REL, // succeeds
290-
'\u2282': MO.REL, // subset of
291-
'\u2283': MO.REL, // superset of
292-
'\u2286': MO.REL, // subset of or equal to
293-
'\u2287': MO.REL, // superset of or equal to
294-
'\u228E': MO.BIN4, // multiset union
295-
'\u2291': MO.REL, // square image of or equal to
296-
'\u2292': MO.REL, // square original of or equal to
297-
'\u2293': MO.BIN4, // square cap
298-
'\u2294': MO.BIN4, // square cup
299-
'\u2295': MO.BIN4, // circled plus
300-
'\u2296': MO.BIN4, // circled minus
301-
'\u2297': MO.BIN4, // circled times
302-
'\u2298': MO.BIN4, // circled division slash
303-
'\u2299': MO.BIN4, // circled dot operator
304-
'\u22A2': MO.REL, // right tack
305-
'\u22A3': MO.REL, // left tack
306-
'\u22A4': MO.ORD55, // down tack
307-
'\u22A5': MO.REL, // up tack
308-
'\u22A8': MO.REL, // true
309-
'\u22C4': MO.BIN4, // diamond operator
310-
'\u22C5': MO.BIN4, // dot operator
311-
'\u22C6': MO.BIN4, // star operator
312-
'\u22C8': MO.REL, // bowtie
313-
'\u22EE': MO.ORD55, // vertical ellipsis
314-
'\u22EF': MO.INNER, // midline horizontal ellipsis
315-
'\u22F1': [5, 5, TEXCLASS.INNER, null], // down right diagonal ellipsis
316-
'\u25B3': MO.BIN4, // white up-pointing triangle
317-
'\u25B5': MO.BIN4, // white up-pointing small triangle
318-
'\u25B9': MO.BIN4, // white right-pointing small triangle
319-
'\u25BD': MO.BIN4, // white down-pointing triangle
320-
'\u25BF': MO.BIN4, // white down-pointing small triangle
321-
'\u25C3': MO.BIN4, // white left-pointing small triangle
322-
'\u2758': MO.REL, // light vertical bar
323-
'\u27F5': MO.WIDEREL, // long leftwards arrow
324-
'\u27F6': MO.WIDEREL, // long rightwards arrow
325-
'\u27F7': MO.WIDEREL, // long left right arrow
326-
'\u27F8': MO.WIDEREL, // long leftwards double arrow
327-
'\u27F9': MO.WIDEREL, // long rightwards double arrow
328-
'\u27FA': MO.WIDEREL, // long left right double arrow
329-
'\u27FC': MO.WIDEREL, // long rightwards arrow from bar
330-
'\u2A2F': MO.BIN4, // vector or cross product
331-
'\u2A3F': MO.BIN4, // amalgamation or coproduct
332-
'\u2AAF': MO.REL, // precedes above single-line equals sign
333-
'\u2AB0': MO.REL, // succeeds above single-line equals sign
334-
'\u00B1': MO.BIN4, // plus-minus sign
335-
'\u00B7': MO.BIN4, // middle dot
336-
'\u00D7': MO.BIN4, // multiplication sign
337-
'\u00F7': MO.BIN4, // division sign
338-
'*': MO.BIN3, // asterisk
339-
'+': MO.BIN4, // plus sign
340-
',': [0, 3, TEXCLASS.PUNCT, {linebreakstyle: 'after', separator: true}], // comma
341-
'-': MO.BIN4, // hyphen-minus
342-
'/': MO.ORD11, // solidus
343-
':': [1, 2, TEXCLASS.REL, null], // colon
344-
';': [0, 3, TEXCLASS.PUNCT, {linebreakstyle: 'after', separator: true}], // semicolon
345-
'<': MO.REL, // less-than sign
346-
'=': MO.REL, // equals sign
347-
'>': MO.REL, // greater-than sign
348-
'?': [1, 1, TEXCLASS.CLOSE, null], // question mark
349-
'\\': MO.ORD, // reverse solidus
350-
'^': MO.ORD11, // circumflex accent
351-
'_': MO.ORD11, // low line
352-
'|': [2, 2, TEXCLASS.ORD, {fence: true, stretchy: true, symmetric: true}], // vertical line
353-
'#': MO.ORD, // #
354-
'$': MO.ORD, // $
355-
'.': [0, 3, TEXCLASS.PUNCT, {separator: true}], // \ldotp
356-
'\u02B9': MO.ORD, // prime
357-
'\u0300': MO.ACCENT, // \grave
358-
'\u0301': MO.ACCENT, // \acute
359-
'\u0303': MO.WIDEACCENT, // \tilde
360-
'\u0304': MO.ACCENT, // \bar
361-
'\u0306': MO.ACCENT, // \breve
362-
'\u0307': MO.ACCENT, // \dot
363-
'\u0308': MO.ACCENT, // \ddot
364-
'\u030C': MO.ACCENT, // \check
365-
'\u0332': MO.WIDEACCENT, // horizontal line
366-
'\u0338': MO.REL4, // \not
367-
'\u2015': [0, 0, TEXCLASS.ORD, {stretchy: true}], // horizontal line
368-
'\u2017': [0, 0, TEXCLASS.ORD, {stretchy: true}], // horizontal line
369-
'\u2020': MO.BIN3, // \dagger
370-
'\u2021': MO.BIN3, // \ddagger
371-
'\u20D7': MO.ACCENT, // \vec
372-
'\u2111': MO.ORD, // \Im
373-
'\u2113': MO.ORD, // \ell
374-
'\u2118': MO.ORD, // \wp
375-
'\u211C': MO.ORD, // \Re
376-
'\u2205': MO.ORD, // \emptyset
377-
'\u221E': MO.ORD, // \infty
378-
'\u2305': MO.BIN3, // barwedge
379-
'\u2306': MO.BIN3, // doublebarwedge
380-
'\u2322': MO.REL4, // \frown
381-
'\u2323': MO.REL4, // \smile
382-
'\u2329': MO.OPEN, // langle
383-
'\u232A': MO.CLOSE, // rangle
384-
'\u23AA': MO.ORD, // \bracevert
385-
'\u23AF': [0, 0, TEXCLASS.ORD, {stretchy: true}], // \underline
386-
'\u23B0': MO.OPEN, // \lmoustache
387-
'\u23B1': MO.CLOSE, // \rmoustache
388-
'\u2500': MO.ORD, // horizontal line
389-
'\u25EF': MO.BIN3, // \bigcirc
390-
'\u2660': MO.ORD, // \spadesuit
391-
'\u2661': MO.ORD, // \heartsuit
392-
'\u2662': MO.ORD, // \diamondsuit
393-
'\u2663': MO.ORD, // \clubsuit
394-
'\u3008': MO.OPEN, // langle
395-
'\u3009': MO.CLOSE, // rangle
396-
'\uFE37': MO.WIDEACCENT, // horizontal brace down
397-
'\uFE38': MO.WIDEACCENT // horizontal brace up
398-
}
399-
};
81+
public static OPTABLE: {[form: string]: OperatorList} = OPTABLE;
40082

401-
public texClass = TEXCLASS.REL; // for MathML, but TeX sets it explicitly in setTeXclass()
83+
/*
84+
* The TeX class of the node is set to REL for MathML, but TeX sets it explicitly in setTeXclass()
85+
*/
86+
public texClass = TEXCLASS.REL;
40287

40388
/*
40489
* @return {string} The mo kind
@@ -544,7 +229,7 @@ export class MmlMo extends AbstractMmlTokenNode {
544229
let mo = this.getText();
545230
let [form1, form2, form3] = this.getForms();
546231
this.attributes.setInherited('form', form1);
547-
let OPTABLE = MmlMo.OPTABLE;
232+
let OPTABLE = (this.constructor as typeof MmlMo).OPTABLE;
548233
let def = OPTABLE[form1][mo] || OPTABLE[form2][mo] || OPTABLE[form3][mo];
549234
if (def) {
550235
this.texClass = def[2];
@@ -596,7 +281,7 @@ export class MmlMo extends AbstractMmlTokenNode {
596281
if (mo.length === 2) {
597282
n = (n - 0xD800) * 0x400 + mo.charCodeAt(1) - 0xDC00 + 0x10000;
598283
}
599-
let ranges = MmlMo.RANGES;
284+
let ranges = (this.constructor as typeof MmlMo).RANGES;
600285
for (const range of ranges) {
601286
if (range[0] <= n && n <= range[1]) {
602287
return range;
@@ -608,15 +293,3 @@ export class MmlMo extends AbstractMmlTokenNode {
608293
return null;
609294
}
610295
}
611-
612-
//
613-
// These are not in the W3C table, but FF works this way,
614-
// and it makes sense, so add them here
615-
//
616-
let OPTABLE = MmlMo.OPTABLE;
617-
OPTABLE['infix']['^'] = MO.WIDEREL;
618-
OPTABLE['infix']['_'] = MO.WIDEREL;
619-
OPTABLE['prefix']['\u2223'] = MO.OPEN;
620-
OPTABLE['prefix']['\u2225'] = MO.OPEN;
621-
OPTABLE['postfix']['\u2223'] = MO.CLOSE;
622-
OPTABLE['postfix']['\u2225'] = MO.CLOSE;

0 commit comments

Comments
 (0)