Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
AMSMappings
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 10
182
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 removeInstance
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getInstance
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 getEntryFromList
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 getOperatorByKey
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getIdentifierByKey
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSymbolDelimiterByKey
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getMathDelimiterByKey
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getMacroByKey
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getEnvironmentByKey
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2namespace MediaWiki\Extension\Math\WikiTexVC\MMLmappings;
3
4use MediaWiki\Extension\Math\WikiTexVC\MMLmappings\Lengths\MathSpace;
5use MediaWiki\Extension\Math\WikiTexVC\MMLmappings\TexConstants\Align;
6use MediaWiki\Extension\Math\WikiTexVC\MMLmappings\TexConstants\TexClass;
7use MediaWiki\Extension\Math\WikiTexVC\MMLmappings\TexConstants\Variants;
8use MediaWiki\Extension\Math\WikiTexVC\MMLmappings\Util\MMLutil;
9
10/**
11 * Based on AMSMappings.js in MML3
12 * Only importing infix atm
13 * Singleton
14 *
15 */
16class AMSMappings {
17
18    private static $instance = null;
19    private const AMSMACROS = [
20        "mathring" => [ 'accent', '02DA' ],
21        "nobreakspace" => 'Tilde',
22        "negmedspace" => [ 'spacer', MathSpace::NEGATIVEMEDIUMMATHSPACE ],
23        "negthickspace" => [ 'spacer', MathSpace::NEGATIVETHICKMATHSPACE ],
24        "idotsint" => [ 'MultiIntegral', '\\int\\cdots\\int' ],
25        "dddot" => [ 'accent', '20DB' ],
26        "ddddot" => [ 'accent', '20DC' ],
27        "sideset" => 'SideSet',
28        "boxed" => [ 'macro', '\\fbox{$\\displaystyle{#1}$}', 1 ],
29        "tag" => 'HandleTag',
30        "notag" => 'HandleNoTag',
31        "eqref" => [ 'HandleRef', true ],
32        "substack" => [ 'macro', '\\begin{subarray}{c}#1\\end{subarray}', 1 ],
33        "injlim" => [ 'namedOp', 'inj lim' ],
34        "projlim" => [ 'namedOp', 'proj lim' ],
35        "varliminf" => [ 'macro', '\\mathop{\\underline{\\mmlToken{mi}{lim}}}' ],
36        "varlimsup" => [ 'macro', '\\mathop{\\overline{\\mmlToken{mi}{lim}}}' ],
37        // replaced underrightarrow here not supported
38        "varinjlim" => [ 'macro', '\\mathop{\\xrightarrow{\\mmlToken{mi}{lim}}}' ],
39        // replaced underleftarrow here not supported
40        "varprojlim" => [ 'macro', '\\mathop{\\xleftarrow{\\mmlToken{mi}{lim}}}' ],
41        "DeclareMathOperator" => 'HandleDeclareOp',
42        "operatorname" => 'handleOperatorName',
43        "genfrac" => 'genFrac',
44        "frac" => [ 'genFrac', '', '', '', '' ],
45        "tfrac" => [ 'genFrac', '', '', '', '1' ],
46        "dfrac" => [ 'genFrac', '', '', '', '0' ],
47        "binom" => [ 'genFrac', '(', ')', '0', '0' ],
48        "tbinom" => [ 'genFrac', '(', ')', '0', '1' ],
49        "dbinom" => [ 'genFrac', '(', ')', '0', '0' ],
50        "cfrac" => 'cFrac',
51        "shoveleft" => [ 'HandleShove', Align::LEFT ],
52        "shoveright" => [ 'HandleShove', Align::RIGHT ],
53        "xrightarrow" => [ 'xArrow', 0x2192, 5, 10 ],
54        "xleftarrow" => [ 'xArrow', 0x2190, 10, 5 ]
55        ];
56    private const AMSMATHCHAR0MI = [
57        "digamma" => '\u03DD',
58        "varkappa" => '\u03F0',
59        "varGamma" => [ '\u0393', [ "mathvariant" => Variants::ITALIC ] ],
60        "varDelta" => [ '\u0394', [ "mathvariant" => Variants::ITALIC ] ],
61        "varTheta" => [ '\u0398', [ "mathvariant" => Variants::ITALIC ] ],
62        "varLambda" => [ '\u039B', [ "mathvariant" => Variants::ITALIC ] ],
63        "varXi" => [ '\u039E', [ "mathvariant" => Variants::ITALIC ] ],
64        "varPi" => [ '\u03A0', [ "mathvariant" => Variants::ITALIC ] ],
65        "varSigma" => [ '\u03A3', [ "mathvariant" => Variants::ITALIC ] ],
66        "varStigma" => [ '\u03DB', [ "mathvariant" => Variants::ITALIC ] ],
67        "varUpsilon" => [ '\u03A5', [ "mathvariant" => Variants::ITALIC ] ],
68        "varPhi" => [ '\u03A6', [ "mathvariant" => Variants::ITALIC ] ],
69        "varPsi" => [ '\u03A8', [ "mathvariant" => Variants::ITALIC ] ],
70        "varOmega" => [ '\u03A9', [ "mathvariant" => Variants::ITALIC ] ],
71        "beth" => '\u2136',
72        "gimel" => '\u2137',
73        "daleth" => '\u2138',
74        "backprime" => [ '\u2035', [ "variantForm" => "True" ] ], // actually: "variantForm" => "True"
75        "hslash" => '\u210F',
76        "varnothing" => [ '\u2205', [ "variantForm" => "True" ] ], // actually: "variantForm" => "True"
77        "blacktriangle" => '\u25B4',
78        "triangledown" => [ '\u25BD', [ "variantForm" => "True" ] ], // actually: "variantForm" => "True"
79        "blacktriangledown" => '\u25BE',
80        "square" => '\u25FB',
81        "Box" => '\u25FB',
82        "blacksquare" => '\u25FC',
83        "lozenge" => '\u25CA',
84        "Diamond" => '\u25CA',
85        "blacklozenge" => '\u29EB',
86        "circledS" => [ '\u24C8', [ "mathvariant" => Variants::NORMAL ] ],
87        "bigstar" => '\u2605',
88        "sphericalangle" => '\u2222',
89        "measuredangle" => '\u2221',
90        "nexists" => '\u2204',
91        "complement" => '\u2201',
92        "mho" => '\u2127',
93        "eth" => [ '\u00F0', [ "mathvariant" => Variants::NORMAL ] ],
94        "Finv" => '\u2132',
95        "diagup" => '\u2571',
96        "Game" => '\u2141',
97        "diagdown" => '\u2572',
98        "Bbbk" => [ '\u006B', [ "mathvariant" => Variants::DOUBLESTRUCK ] ],
99        "yen" => '\u00A5',
100        "circledR" => '\u00AE',
101        "checkmark" => '\u2713',
102        "maltese" => '\u2720'
103        ];
104    private const AMSMATHCHAR0MO = [
105        "iiiint" => [ '\u2A0C', [ "texClass" => TexClass::OP ] ], // added this mapping from other array
106        "dotplus" => '\u2214',
107        "ltimes" => '\u22C9',
108        "smallsetminus" => [ '\u2216', [ "variantForm" => "True" ] ], // actually: "variantForm" => "True"
109        "rtimes" => '\u22CA',
110        "Cap" => '\u22D2',
111        "doublecap" => '\u22D2',
112        "leftthreetimes" => '\u22CB',
113        "Cup" => '\u22D3',
114        "doublecup" => '\u22D3',
115        "rightthreetimes" => '\u22CC',
116        "barwedge" => '\u22BC',
117        "curlywedge" => '\u22CF',
118        "veebar" => '\u22BB',
119        "curlyvee" => '\u22CE',
120        "doublebarwedge" => '\u2A5E',
121        "boxminus" => '\u229F',
122        "circleddash" => '\u229D',
123        "boxtimes" => '\u22A0',
124        "circledast" => '\u229B',
125        "boxdot" => '\u22A1',
126        "circledcirc" => '\u229A',
127        "boxplus" => '\u229E',
128        "centerdot" => [ '\u22C5', [ "variantForm" => "True" ] ], // actually: "variantForm" => "True"
129        "divideontimes" => '\u22C7',
130        "intercal" => '\u22BA',
131        "leqq" => '\u2266',
132        "geqq" => '\u2267',
133        "leqslant" => '\u2A7D',
134        "geqslant" => '\u2A7E',
135        "eqslantless" => '\u2A95',
136        "eqslantgtr" => '\u2A96',
137        "lesssim" => '\u2272',
138        "gtrsim" => '\u2273',
139        "lessapprox" => '\u2A85',
140        "gtrapprox" => '\u2A86',
141        "approxeq" => '\u224A',
142        "lessdot" => '\u22D6',
143        "gtrdot" => '\u22D7',
144        "lll" => '\u22D8',
145        "llless" => '\u22D8',
146        "ggg" => '\u22D9',
147        "gggtr" => '\u22D9',
148        "lessgtr" => '\u2276',
149        "gtrless" => '\u2277',
150        "lesseqgtr" => '\u22DA',
151        "gtreqless" => '\u22DB',
152        "lesseqqgtr" => '\u2A8B',
153        "gtreqqless" => '\u2A8C',
154        "doteqdot" => '\u2251',
155        "Doteq" => '\u2251',
156        "eqcirc" => '\u2256',
157        "risingdotseq" => '\u2253',
158        "circeq" => '\u2257',
159        "fallingdotseq" => '\u2252',
160        "triangleq" => '\u225C',
161        "backsim" => '\u223D',
162        "thicksim" => [ '\u223C', [ "variantForm" => "True" ] ], // actually: "variantForm" => "True"
163        "backsimeq" => '\u22CD',
164        "thickapprox" => [ '\u2248', [ "variantForm" => "True" ] ], // actually: "variantForm" => "True"
165        "subseteqq" => '\u2AC5',
166        "supseteqq" => '\u2AC6',
167        "Subset" => '\u22D0',
168        "Supset" => '\u22D1',
169        "sqsubset" => '\u228F',
170        "sqsupset" => '\u2290',
171        "preccurlyeq" => '\u227C',
172        "succcurlyeq" => '\u227D',
173        "curlyeqprec" => '\u22DE',
174        "curlyeqsucc" => '\u22DF',
175        "precsim" => '\u227E',
176        "succsim" => '\u227F',
177        "precapprox" => '\u2AB7',
178        "succapprox" => '\u2AB8',
179        "vartriangleleft" => '\u22B2',
180        "lhd" => '\u22B2',
181        "vartriangleright" => '\u22B3',
182        "rhd" => '\u22B3',
183        "trianglelefteq" => '\u22B4',
184        "unlhd" => '\u22B4',
185        "trianglerighteq" => '\u22B5',
186        "unrhd" => '\u22B5',
187        "vDash" => [ '\u22A8', [ "variantForm" => true ] ],
188        "Vdash" => '\u22A9',
189        "Vvdash" => '\u22AA',
190        "smallsmile" => [ '\u2323', [ "variantForm" => true ] ],
191        "shortmid" => [ '\u2223', [ "variantForm" => true ] ],
192        "smallfrown" => [ '\u2322', [ "variantForm" => true ] ],
193        "shortparallel" => [ '\u2225', [ "variantForm" => true ] ],
194        "bumpeq" => '\u224F',
195        "between" => '\u226C',
196        "Bumpeq" => '\u224E',
197        "pitchfork" => '\u22D4',
198        "varpropto" => [ '\u221D', [ "variantForm" => true ] ],
199        "backepsilon" => '\u220D',
200        "blacktriangleleft" => '\u25C2',
201        "blacktriangleright" => '\u25B8',
202        "therefore" => '\u2234',
203        "because" => '\u2235',
204        "eqsim" => '\u2242',
205        "vartriangle" => [ '\u25B3', [ "variantForm" => true ] ],
206        "Join" => '\u22C8',
207        "nless" => '\u226E',
208        "ngtr" => '\u226F',
209        "nleq" => '\u2270',
210        "ngeq" => '\u2271',
211        "nleqslant" => [ '\u2A87', [ "variantForm" => true ] ],
212        "ngeqslant" => [ '\u2A88', [ "variantForm" => true ] ],
213        "nleqq" => [ '\u2270', [ "variantForm" => true ] ],
214        "ngeqq" => [ '\u2271', [ "variantForm" => true ] ],
215        "lneq" => '\u2A87',
216        "gneq" => '\u2A88',
217        "lneqq" => '\u2268',
218        "gneqq" => '\u2269',
219        "lvertneqq" => [ '\u2268', [ "variantForm" => true ] ],
220        "gvertneqq" => [ '\u2269', [ "variantForm" => true ] ],
221        "lnsim" => '\u22E6',
222        "gnsim" => '\u22E7',
223        "lnapprox" => '\u2A89',
224        "gnapprox" => '\u2A8A',
225        "nprec" => '\u2280',
226        "nsucc" => '\u2281',
227        "npreceq" => [ '\u22E0', [ "variantForm" => true ] ],
228        "nsucceq" => [ '\u22E1', [ "variantForm" => true ] ],
229        "precneqq" => '\u2AB5',
230        "succneqq" => '\u2AB6',
231        "precnsim" => '\u22E8',
232        "succnsim" => '\u22E9',
233        "precnapprox" => '\u2AB9',
234        "succnapprox" => '\u2ABA',
235        "nsim" => '\u2241',
236        "ncong" => '\u2246',
237        "nshortmid" => [ '\u2224', [ "variantForm" => true ] ],
238        "nshortparallel" => [ '\u2226', [ "variantForm" => true ] ],
239        "nmid" => '\u2224',
240        "nparallel" => '\u2226',
241        "nvdash" => '\u22AC',
242        "nvDash" => '\u22AD',
243        "nVdash" => '\u22AE',
244        "nVDash" => '\u22AF',
245        "ntriangleleft" => '\u22EA',
246        "ntriangleright" => '\u22EB',
247        "ntrianglelefteq" => '\u22EC',
248        "ntrianglerighteq" => '\u22ED',
249        "nsubseteq" => '\u2288',
250        "nsupseteq" => '\u2289',
251        "nsubseteqq" => [ '\u2288', [ "variantForm" => true ] ],
252        "nsupseteqq" => [ '\u2289', [ "variantForm" => true ] ],
253        "subsetneq" => '\u228A',
254        "supsetneq" => '\u228B',
255        "varsubsetneq" => [ '\u228A', [ "variantForm" => true ] ],
256        "varsupsetneq" => [ '\u228B', [ "variantForm" => true ] ],
257        "subsetneqq" => '\u2ACB',
258        "supsetneqq" => '\u2ACC',
259        "varsubsetneqq" => [ '\u2ACB', [ "variantForm" => true ] ],
260        "varsupsetneqq" => [ '\u2ACC', [ "variantForm" => true ] ],
261        "leftleftarrows" => '\u21C7',
262        "rightrightarrows" => '\u21C9',
263        "leftrightarrows" => '\u21C6',
264        "rightleftarrows" => '\u21C4',
265        "Lleftarrow" => '\u21DA',
266        "Rrightarrow" => '\u21DB',
267        "twoheadleftarrow" => '\u219E',
268        "twoheadrightarrow" => '\u21A0',
269        "leftarrowtail" => '\u21A2',
270        "rightarrowtail" => '\u21A3',
271        "looparrowleft" => '\u21AB',
272        "looparrowright" => '\u21AC',
273        "leftrightharpoons" => '\u21CB',
274        "rightleftharpoons" => [ '\u21CC', [ "variantForm" => true ] ],
275        "curvearrowleft" => '\u21B6',
276        "curvearrowright" => '\u21B7',
277        "circlearrowleft" => '\u21BA',
278        "circlearrowright" => '\u21BB',
279        "Lsh" => '\u21B0',
280        "Rsh" => '\u21B1',
281        "upuparrows" => '\u21C8',
282        "downdownarrows" => '\u21CA',
283        "upharpoonleft" => '\u21BF',
284        "upharpoonright" => '\u21BE',
285        "downharpoonleft" => '\u21C3',
286        "restriction" => '\u21BE',
287        "multimap" => '\u22B8',
288        "downharpoonright" => '\u21C2',
289        "leftrightsquigarrow" => '\u21AD',
290        "rightsquigarrow" => '\u21DD',
291        "leadsto" => '\u21DD',
292        "dashrightarrow" => '\u21E2',
293        "dashleftarrow" => '\u21E0',
294        "nleftarrow" => '\u219A',
295        "nrightarrow" => '\u219B',
296        "nLeftarrow" => '\u21CD',
297        "nRightarrow" => '\u21CF',
298        "nleftrightarrow" => '\u21AE',
299        "nLeftrightarrow" => '\u21CE'
300    ];
301
302    private const AMSMATHENVIRONMENT = [
303        'equation*' => [ 'Equation', null, false ],
304        'eqnarray*' => [ 'EqnArray', null, false, true, 'rcl', null, '.5em' ],
305        'align' => [ 'EqnArray', null, true, true, 'rl', 'ParseUtil_js_1.default.cols(0, 2)' ],
306        'align*' => [ 'EqnArray', null, false, true, 'rl', "ParseUtil_js_1.default.cols(0, 2)" ],
307        "multline" => [ 'Multline', null, true ],
308        'multline*' => [ 'Multline', null, false ],
309        "split" => [ 'EqnArray', null, false, false, 'rl', "ParseUtil_js_1.default.cols(0)" ],
310        "gather" => [ 'EqnArray', null, true, true, 'c' ],
311        'gather*' => [ 'EqnArray', null, false, true, 'c' ],
312        "alignat" => [ 'alignAt', null, true, true ],
313        'alignat*' => [ 'alignAt', null, false, true ],
314        "alignedat" => [ 'alignAt', null, false, false ],
315        "aligned" => [ 'amsEqnArray', null, null, null, 'rl', "ParseUtil_js_1.default.cols(0, 2)", '.5em', 'D' ],
316        "gathered" => [ 'amsEqnArray', null, null, null, 'c', null, '.5em', 'D' ],
317        "xalignat" => [ 'XalignAt', null, true, true ],
318        'xalignat*' => [ 'XalignAt', null, false, true ],
319        "xxalignat" => [ 'XalignAt', null, false, false ],
320        "flalign" => [ 'FlalignArray', null, true, false, true, 'rlc', 'auto auto fit' ],
321        'flalign*' => [ 'FlalignArray', null, false, false, true, 'rlc', 'auto auto fit' ],
322        "subarray" => [ 'array', null, null, null, null, "ParseUtil_js_1.default.cols(0)", '0.1em', 'S', 1 ],
323        "smallmatrix" => [ 'array', null, null, null, 'c', "ParseUtil_js_1.default.cols(1 / 3)",
324            '.2em', 'S', 1 ],
325        "matrix" => [ 'array', null, null, null, 'c' ],
326        "pmatrix" => [ 'array', null, '(', ')', 'c' ],
327        "bmatrix" => [ 'array', null, '[', ']', 'c' ],
328        "Bmatrix" => [ 'array', null, '\\{', '\\}', 'c' ],
329        "vmatrix" => [ 'array', null, '\\vert', '\\vert', 'c' ],
330        "Vmatrix" => [ 'array', null, '\\Vert', '\\Vert', 'c' ],
331        "cases" => [ 'array', null, '\\{', '.', 'll', null, '.2em', 'T' ]
332    ];
333    private const AMSSYMBOLDELIMITERS = [
334        'ulcorner' => '\u231C',
335        'urcorner' => '\u231D',
336        'llcorner' => '\u231E',
337        'lrcorner' => '\u231F'
338    ];
339
340    private const AMSSYMBOLMACROS = [
341        "implies" => [ 'macro', '\\;\\Longrightarrow\\;' ],
342        "impliedby" => [ 'macro', '\\;\\Longleftarrow\\;' ]
343    ];
344
345    private const AMSMATHDELIMITERS = [
346        'lvert' => [ '\u007C', [ "texClass" => TexClass::OPEN ] ],
347        'rvert' => [ '\u007C', [ "texClass" => TexClass::CLOSE ] ],
348        'lVert' => [ '\u2016', [ "texClass" => TexClass::OPEN ] ],
349        'rVert' => [ '\u2016', [ "texClass" => TexClass::CLOSE ] ]
350    ];
351    private const ALL = [
352        "amsmathchar0mo" => self::AMSMATHCHAR0MO,
353        "amsmathchar0mi" => self::AMSMATHCHAR0MI,
354        "amsmacros" => self::AMSMACROS,
355        "amssymbolmacros" => self::AMSSYMBOLMACROS,
356        "amsdelimiters" => self::AMSSYMBOLDELIMITERS,
357        "amsmathenvironment" => self::AMSMATHENVIRONMENT
358    ];
359
360    private function __construct() {
361        // Just an empty private constructor, for singleton pattern
362    }
363
364    public static function removeInstance() {
365        self::$instance = null;
366    }
367
368    public static function getInstance() {
369        if ( self::$instance == null ) {
370            self::$instance = new AMSMappings();
371        }
372
373        return self::$instance;
374    }
375
376    public static function getEntryFromList( $keylist, $key ) {
377        if ( isset( self::ALL[$keylist][$key] ) ) {
378            return self::ALL[$keylist][$key];
379        }
380        return null;
381    }
382
383    public static function getOperatorByKey( $key ) {
384        // &#x221A; to \\u.... this is only temporary probably entities.php will be refactored with \u vals again
385        $key = MMLutil::x2uNotation( $key );
386        return MMLutil::getMappingByKey( $key, self::AMSMATHCHAR0MO, true );
387    }
388
389    public static function getIdentifierByKey( $key ) {
390        return MMLutil::getMappingByKey( $key, self::AMSMATHCHAR0MI, true );
391    }
392
393    public static function getSymbolDelimiterByKey( $key ) {
394        return MMLutil::getMappingByKey( $key, self::AMSSYMBOLDELIMITERS, true );
395    }
396
397    public static function getMathDelimiterByKey( $key ) {
398        return MMLutil::getMappingByKey( $key, self::AMSMATHDELIMITERS, true );
399    }
400
401    public static function getMacroByKey( $key ) {
402        $ret = MMLutil::getMappingByKey( $key, self::AMSMACROS );
403        if ( $ret != null ) {
404            return $ret;
405        }
406        return MMLutil::getMappingByKey( $key, self::AMSSYMBOLMACROS );
407    }
408
409    public static function getEnvironmentByKey( $key ) {
410        return MMLutil::getMappingByKey( $key, self::AMSMATHENVIRONMENT );
411    }
412}