@pie-lib/math-input-mathlive 1.0.11 → 1.0.13
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/lib/__tests__/composites.test.js +1 -1
- package/lib/__tests__/drop-in-compat.test.js +1 -1
- package/lib/__tests__/index.test.js +1 -1
- package/lib/__tests__/input-imperative.test.js +1 -1
- package/lib/__tests__/keypad-label.test.js +99 -1
- package/lib/__tests__/keypad-render.test.js +1 -1
- package/lib/__tests__/latex-bridge.test.js +22 -1
- package/lib/__tests__/mathlive-instance.test.js +137 -1
- package/lib/__tests__/mount-race.test.js +4 -1
- package/lib/__tests__/static-prompts.test.js +124 -1
- package/lib/__tests__/tmp-markup.test.js +26 -0
- package/lib/keypad/index.js +4 -4
- package/lib/keypad/index.js.map +1 -1
- package/lib/keys/misc.js +9 -2
- package/lib/keys/misc.js.map +1 -1
- package/lib/latex-bridge.js +30 -0
- package/lib/latex-bridge.js.map +1 -1
- package/lib/mathlive-instance.js +72 -3
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/common-styles.js +41 -6
- package/lib/mf/common-styles.js.map +1 -1
- package/lib/mf/index.js +6 -0
- package/lib/mf/index.js.map +1 -1
- package/lib/mf/input.js +7 -0
- package/lib/mf/input.js.map +1 -1
- package/lib/mf/static.js +84 -3
- package/lib/mf/static.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/keypad-label.test.jsx +131 -5
- package/src/__tests__/latex-bridge.test.js +22 -0
- package/src/__tests__/mathlive-instance.test.js +150 -0
- package/src/__tests__/mount-race.test.jsx +1 -0
- package/src/__tests__/static-prompts.test.jsx +113 -0
- package/src/keypad/index.jsx +4 -1
- package/src/keys/misc.js +8 -2
- package/src/latex-bridge.js +34 -0
- package/src/mathlive-instance.js +80 -1
- package/src/mf/common-styles.js +45 -4
- package/src/mf/index.js +2 -0
- package/src/mf/input.jsx +15 -1
- package/src/mf/static.jsx +98 -3
- package/lib/__tests__/composites.test.js.map +0 -1
- package/lib/__tests__/drop-in-compat.test.js.map +0 -1
- package/lib/__tests__/index.test.js.map +0 -1
- package/lib/__tests__/input-imperative.test.js.map +0 -1
- package/lib/__tests__/keypad-label.test.js.map +0 -1
- package/lib/__tests__/keypad-render.test.js.map +0 -1
- package/lib/__tests__/latex-bridge.test.js.map +0 -1
- package/lib/__tests__/mathlive-instance.test.js.map +0 -1
- package/lib/__tests__/mount-race.test.js.map +0 -1
- package/lib/__tests__/static-prompts.test.js.map +0 -1
package/src/mf/common-styles.js
CHANGED
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
* Most are intentionally near-empty: MathLive sizes scripts, radicals and
|
|
14
14
|
* fences correctly on its own, so the MathQuill-era corrections are not needed.
|
|
15
15
|
* They stay as documented extension points rather than being deleted, so the
|
|
16
|
-
* destructuring above keeps working.
|
|
16
|
+
* destructuring above keeps working. The exception is the radical index, which
|
|
17
|
+
* MathLive sizes to TeX metrics that read too small here - see
|
|
18
|
+
* `rootIndexStyles`.
|
|
17
19
|
*/
|
|
18
20
|
|
|
19
21
|
/**
|
|
@@ -40,10 +42,47 @@ export const longdivStyles = {
|
|
|
40
42
|
};
|
|
41
43
|
|
|
42
44
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
+
* How the index of a radical is sized.
|
|
46
|
+
*
|
|
47
|
+
* MathLive follows TeX and sets the index of `\sqrt[n]{x}` in scriptscriptstyle,
|
|
48
|
+
* which it emits as an inline `font-size: 50%` on the span wrapping the index's
|
|
49
|
+
* glyphs. At authoring sizes that leaves the index - on the nth-root key, and in
|
|
50
|
+
* any radical the author types - too small to read next to the radicand, so it is
|
|
51
|
+
* scaled up to 80% - 1.6x what MathLive asks for.
|
|
52
|
+
*
|
|
53
|
+
* Only that innermost span is resized. `.ML__sqrt-index` itself keeps its font
|
|
54
|
+
* size on purpose: the vlist inside it tucks the index into the radical's crook
|
|
55
|
+
* with em-based `top`/`height` offsets, and scaling those lifts the index clear
|
|
56
|
+
* of the radical instead of just enlarging it.
|
|
57
|
+
*
|
|
58
|
+
* The child chain is spelled out so that nothing nested deeper inside the index
|
|
59
|
+
* (a fraction's numerator, another radical) is caught by the same rule, and
|
|
60
|
+
* `!important` is required because the 50% is an INLINE style.
|
|
45
61
|
*/
|
|
46
|
-
|
|
62
|
+
const ROOT_INDEX_SELECTOR = '.ML__sqrt-index > .ML__vlist-t > .ML__vlist-r > .ML__vlist > span > [style*="font-size"]';
|
|
63
|
+
const ROOT_INDEX_FONT_SIZE = '80%';
|
|
64
|
+
|
|
65
|
+
export const rootIndexStyles = {
|
|
66
|
+
[`& ${ROOT_INDEX_SELECTOR}`]: {
|
|
67
|
+
fontSize: `${ROOT_INDEX_FONT_SIZE} !important`,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The same rule as a CSS string, for a live mathfield's shadow root - see
|
|
73
|
+
* `SHADOW_CSS` in mathlive-instance.js. Static markup is styled by
|
|
74
|
+
* {@link rootIndexStyles}.
|
|
75
|
+
*/
|
|
76
|
+
export const ROOT_INDEX_CSS = `${ROOT_INDEX_SELECTOR}{font-size:${ROOT_INDEX_FONT_SIZE} !important}`;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Superscript/subscript sizing. MathLive follows TeX metrics for scripts, so the
|
|
80
|
+
* MathQuill-era corrections are gone; the radical index is the one place where a
|
|
81
|
+
* TeX-correct size reads too small in the authoring UI.
|
|
82
|
+
*/
|
|
83
|
+
export const supsubStyles = {
|
|
84
|
+
...rootIndexStyles,
|
|
85
|
+
};
|
|
47
86
|
|
|
48
87
|
/** Empty placeholder boxes (answer blocks / open slots). */
|
|
49
88
|
export const placeholderStyles = {
|
|
@@ -102,6 +141,7 @@ export const placeholderStyles = {
|
|
|
102
141
|
export const commonMqKeyboardStyles = {
|
|
103
142
|
...commonMqFontStyles,
|
|
104
143
|
...longdivStyles,
|
|
144
|
+
...rootIndexStyles,
|
|
105
145
|
...placeholderStyles,
|
|
106
146
|
touchAction: 'manipulation',
|
|
107
147
|
'& math-field': {
|
|
@@ -143,6 +183,7 @@ export const commonKeyboardStyles = commonMqKeyboardStyles;
|
|
|
143
183
|
export default {
|
|
144
184
|
commonMqFontStyles,
|
|
145
185
|
longdivStyles,
|
|
186
|
+
rootIndexStyles,
|
|
146
187
|
supsubStyles,
|
|
147
188
|
commonMqKeyboardStyles,
|
|
148
189
|
placeholderStyles,
|
package/src/mf/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import CommonMqStyles, {
|
|
|
6
6
|
commonMqFontStyles,
|
|
7
7
|
commonMqKeyboardStyles,
|
|
8
8
|
longdivStyles,
|
|
9
|
+
rootIndexStyles,
|
|
9
10
|
supsubStyles,
|
|
10
11
|
placeholderStyles,
|
|
11
12
|
} from './common-styles';
|
|
@@ -21,6 +22,7 @@ export {
|
|
|
21
22
|
commonMqFontStyles,
|
|
22
23
|
commonMqKeyboardStyles,
|
|
23
24
|
longdivStyles,
|
|
25
|
+
rootIndexStyles,
|
|
24
26
|
supsubStyles,
|
|
25
27
|
placeholderStyles,
|
|
26
28
|
};
|
package/src/mf/input.jsx
CHANGED
|
@@ -2,7 +2,13 @@ import React from 'react';
|
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { styled } from '@mui/material/styles';
|
|
4
4
|
import debug from 'debug';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
loadMathLive,
|
|
7
|
+
getMacros,
|
|
8
|
+
MATH_MODE_SPACE,
|
|
9
|
+
applyShadowStyles,
|
|
10
|
+
trackPlaceholderCaret,
|
|
11
|
+
} from '../mathlive-instance';
|
|
6
12
|
import { toMathLive, fromMathLive, keyToAction, KEYSTROKES } from '../latex-bridge';
|
|
7
13
|
|
|
8
14
|
const log = debug('pie-lib:math-input-mathlive:input');
|
|
@@ -79,6 +85,9 @@ export class Input extends React.Component {
|
|
|
79
85
|
// stretchy-accent fix has to be injected there directly.
|
|
80
86
|
applyShadowStyles(this.mathField);
|
|
81
87
|
|
|
88
|
+
// A selected `\placeholder{}` gets no MathLive caret; draw one.
|
|
89
|
+
this.untrackCaret = trackPlaceholderCaret(this.mathField);
|
|
90
|
+
|
|
82
91
|
this.mathField.addEventListener('input', this.onInputEdit);
|
|
83
92
|
|
|
84
93
|
// Belt and braces: drop anything a previous mount may have left behind.
|
|
@@ -117,6 +126,11 @@ export class Input extends React.Component {
|
|
|
117
126
|
// append a field into a holder that is going away.
|
|
118
127
|
this.mountGeneration = (this.mountGeneration || 0) + 1;
|
|
119
128
|
|
|
129
|
+
if (this.untrackCaret) {
|
|
130
|
+
this.untrackCaret();
|
|
131
|
+
this.untrackCaret = undefined;
|
|
132
|
+
}
|
|
133
|
+
|
|
120
134
|
if (this.mathField) {
|
|
121
135
|
this.mathField.removeEventListener('input', this.onInputEdit);
|
|
122
136
|
this.mathField.remove();
|
package/src/mf/static.jsx
CHANGED
|
@@ -2,9 +2,16 @@ import React from 'react';
|
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { styled } from '@mui/material/styles';
|
|
4
4
|
import debug from 'debug';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
loadMathLive,
|
|
7
|
+
getMacros,
|
|
8
|
+
latexToMarkup,
|
|
9
|
+
MATH_MODE_SPACE,
|
|
10
|
+
applyShadowStyles,
|
|
11
|
+
trackPlaceholderCaret,
|
|
12
|
+
} from '../mathlive-instance';
|
|
6
13
|
import { toMathLive, fromMathLive, fieldIds } from '../latex-bridge';
|
|
7
|
-
import { placeholderStyles } from './common-styles';
|
|
14
|
+
import { placeholderStyles, rootIndexStyles } from './common-styles';
|
|
8
15
|
|
|
9
16
|
const log = debug('pie-lib:math-input-mathlive:static');
|
|
10
17
|
|
|
@@ -12,6 +19,9 @@ const Holder = styled('span')({
|
|
|
12
19
|
display: 'inline-block',
|
|
13
20
|
// Shared static-math rules: muted empty-slot glyphs and svg containment.
|
|
14
21
|
...placeholderStyles,
|
|
22
|
+
// Readable radical index - display mode renders in the light DOM, so the
|
|
23
|
+
// shadow-root copy of this rule does not reach it.
|
|
24
|
+
...rootIndexStyles,
|
|
15
25
|
'& math-field': {
|
|
16
26
|
display: 'inline-block',
|
|
17
27
|
border: 'none',
|
|
@@ -97,6 +107,10 @@ export default class Static extends React.Component {
|
|
|
97
107
|
// stretchy-accent fix has to be injected there directly.
|
|
98
108
|
applyShadowStyles(this.mathField);
|
|
99
109
|
|
|
110
|
+
// A selected `\placeholder{}` gets no MathLive caret; draw one. Answer
|
|
111
|
+
// blocks are typed into with the same keypad, so they grow placeholders too.
|
|
112
|
+
this.untrackCaret = trackPlaceholderCaret(this.mathField);
|
|
113
|
+
|
|
100
114
|
this.mathField.addEventListener('input', this.onPromptInput);
|
|
101
115
|
this.mathField.addEventListener('focusin', this.onPromptFocus);
|
|
102
116
|
this.mathField.addEventListener('keydown', this.onKeyDown);
|
|
@@ -123,6 +137,11 @@ export default class Static extends React.Component {
|
|
|
123
137
|
// Invalidate any mount still awaiting the MathLive load.
|
|
124
138
|
this.mountGeneration = (this.mountGeneration || 0) + 1;
|
|
125
139
|
|
|
140
|
+
if (this.untrackCaret) {
|
|
141
|
+
this.untrackCaret();
|
|
142
|
+
this.untrackCaret = undefined;
|
|
143
|
+
}
|
|
144
|
+
|
|
126
145
|
if (this.mathField) {
|
|
127
146
|
this.mathField.removeEventListener('input', this.onPromptInput);
|
|
128
147
|
this.mathField.removeEventListener('focusin', this.onPromptFocus);
|
|
@@ -254,6 +273,13 @@ export default class Static extends React.Component {
|
|
|
254
273
|
promptHandle(id) {
|
|
255
274
|
return {
|
|
256
275
|
id,
|
|
276
|
+
// MathQuill's inner fields could be focused directly; keep that.
|
|
277
|
+
focus: () => {
|
|
278
|
+
if (this.mathField) {
|
|
279
|
+
this.mathField.focus();
|
|
280
|
+
this.focusPrompt(id);
|
|
281
|
+
}
|
|
282
|
+
},
|
|
257
283
|
latex: (value) => {
|
|
258
284
|
if (!this.mathField) {
|
|
259
285
|
return '';
|
|
@@ -351,8 +377,77 @@ export default class Static extends React.Component {
|
|
|
351
377
|
}
|
|
352
378
|
};
|
|
353
379
|
|
|
380
|
+
/** The id of the prompt whose range contains `position`, if any. */
|
|
381
|
+
promptContaining(position) {
|
|
382
|
+
if (!this.mathField || typeof position !== 'number') {
|
|
383
|
+
return undefined;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return (this.mathField.getPrompts() || []).find((id) => {
|
|
387
|
+
const range = this.mathField.getPromptRange(id);
|
|
388
|
+
|
|
389
|
+
return range && position >= range[0] && position <= range[1];
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Put a blinking caret inside an answer block.
|
|
395
|
+
*
|
|
396
|
+
* MathLive only makes the caret visible while the field element carries the
|
|
397
|
+
* `ML__focused` class, and it adds that class during a *render*, gated on
|
|
398
|
+
* `isSelectionEditable && hasFocus()`. In a read-only field only prompt
|
|
399
|
+
* interiors are editable, so the two things both have to be true:
|
|
400
|
+
*
|
|
401
|
+
* - the selection must sit inside a prompt, and
|
|
402
|
+
* - a render must run afterwards.
|
|
403
|
+
*
|
|
404
|
+
* Assigning `selection` satisfies the first but not the second - it updates
|
|
405
|
+
* the model without re-rendering, so the class stays off and the caret span
|
|
406
|
+
* remains `visibility: hidden`. Executing any command does trigger the
|
|
407
|
+
* render, and `scrollIntoView` is the one with no other effect: it keeps the
|
|
408
|
+
* caret on screen, which the preceding `focus()` already does anyway.
|
|
409
|
+
*
|
|
410
|
+
* @param {string} [id] prompt to focus; defaults to the first one
|
|
411
|
+
*/
|
|
412
|
+
focusPrompt(id) {
|
|
413
|
+
if (!this.mathField) {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
const ids = this.mathField.getPrompts() || [];
|
|
418
|
+
const target = id && ids.indexOf(id) !== -1 ? id : ids[0];
|
|
419
|
+
|
|
420
|
+
if (!target) {
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const range = this.mathField.getPromptRange(target);
|
|
425
|
+
|
|
426
|
+
if (!range) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
this.mathField.selection = { ranges: [[range[0], range[0]]] };
|
|
431
|
+
|
|
432
|
+
if (typeof this.mathField.executeCommand === 'function') {
|
|
433
|
+
this.mathField.executeCommand('scrollIntoView');
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
354
437
|
focus() {
|
|
355
|
-
|
|
438
|
+
if (!this.mathField) {
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
this.mathField.focus();
|
|
443
|
+
|
|
444
|
+
// A bare focus() leaves the selection outside every prompt, which in a
|
|
445
|
+
// read-only field is not editable - the block looked focused but had no
|
|
446
|
+
// cursor. Clicking a prompt already works, because MathLive's own pointer
|
|
447
|
+
// handling moves the selection and re-renders.
|
|
448
|
+
if (!this.promptContaining(this.mathField.position)) {
|
|
449
|
+
this.focusPrompt();
|
|
450
|
+
}
|
|
356
451
|
}
|
|
357
452
|
|
|
358
453
|
blur() {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"composites.test.js","names":["_react","_interopRequireDefault","require","_react2","_mathInput","_horizontalKeypad","_input","describe","withInput","mi","MathInput","calls","write","keystroke","input","v","push","it","_withInput","keypadPress","latex","expect","toEqual","_withInput2","command","_withInput3","_withInput4","not","toThrow","onChange","jest","fn","changeLatex","toHaveBeenCalled","toHaveBeenCalledWith","setState","s","Object","assign","state","inputFocus","focused","toBe","inputBlur","pressed","key","onClick","hk","HorizontalKeypad","mock","value","type","render","createElement","withField","Input","mathField","getValue","insert","executeCommand","focus","blur","addEventListener","removeEventListener","remove","props","onInputEdit","lastEmitted","componentDidUpdate","readOnly","clear","preventDefault","onKeyDown","mockClear"],"sources":["../../src/__tests__/composites.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport MathInput from '../math-input';\nimport HorizontalKeypad from '../horizontal-keypad';\nimport Input from '../mf/input';\n\n/**\n * The pieces that sit between the keypad and the field: how a pressed key is\n * routed into the field, and the legacy `{value,type}` shape math-toolbar\n * consumes.\n */\ndescribe('MathInput.keypadPress routing', () => {\n const withInput = () => {\n const mi = new MathInput({});\n const calls = { write: [], keystroke: [] };\n\n mi.input = {\n write: (v) => calls.write.push(v),\n keystroke: (v) => calls.keystroke.push(v),\n };\n\n return { mi, calls };\n };\n\n it('routes an insert action to write()', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ latex: '\\\\pi' });\n\n expect(calls.write).toEqual(['\\\\pi']);\n expect(calls.keystroke).toEqual([]);\n });\n\n it('expands an argument-taking command before writing', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ command: '\\\\frac' });\n\n expect(calls.write).toEqual(['\\\\frac{#?}{#?}']);\n });\n\n it('routes a cursor keystroke to keystroke()', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ keystroke: 'Left' });\n\n expect(calls.keystroke).toEqual(['moveToPreviousChar']);\n expect(calls.write).toEqual([]);\n });\n\n it('ignores keys with no action', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({});\n mi.keypadPress({ keystroke: 'Nonsense' });\n\n expect(calls.write).toEqual([]);\n expect(calls.keystroke).toEqual([]);\n });\n\n it('is a no-op before the field ref exists', () => {\n const mi = new MathInput({});\n\n expect(() => mi.keypadPress({ latex: '\\\\pi' })).not.toThrow();\n });\n\n it('changeLatex only fires onChange when the value differs', () => {\n const onChange = jest.fn();\n const mi = new MathInput({ latex: 'x', onChange });\n\n mi.changeLatex('x');\n expect(onChange).not.toHaveBeenCalled();\n\n mi.changeLatex('y');\n expect(onChange).toHaveBeenCalledWith('y');\n });\n\n it('tracks focus state', () => {\n const mi = new MathInput({});\n\n mi.setState = (s) => Object.assign(mi.state, s);\n mi.inputFocus();\n expect(mi.state.focused).toBe(true);\n\n mi.inputBlur();\n expect(mi.state.focused).toBe(false);\n });\n});\n\ndescribe('HorizontalKeypad legacy {value,type} model', () => {\n const pressed = (key) => {\n const onClick = jest.fn();\n const hk = new HorizontalKeypad({ onClick });\n\n hk.keypadPress(key);\n\n return onClick.mock.calls[0][0];\n };\n\n it('maps a command to {value, type: command}', () => {\n expect(pressed({ command: '\\\\frac' })).toEqual({ value: '\\\\frac', type: 'command' });\n });\n\n it('maps a write to {value}', () => {\n expect(pressed({ write: 'x' })).toEqual({ value: 'x' });\n });\n\n it('maps a keystroke to {type: cursor}', () => {\n expect(pressed({ keystroke: 'Left' })).toEqual({ type: 'cursor', value: 'Left' });\n });\n\n it('renders without throwing', () => {\n expect(() => render(<HorizontalKeypad onClick={() => {}} />)).not.toThrow();\n });\n});\n\ndescribe('Input: controlled-value sync and events', () => {\n const withField = () => {\n const input = new Input({});\n\n input.mathField = {\n value: '',\n getValue: () => input.mathField.value,\n insert(v) {\n input.mathField.value += v;\n },\n executeCommand() {},\n focus() {},\n blur() {},\n addEventListener() {},\n removeEventListener() {},\n remove() {},\n };\n\n return input;\n };\n\n it('emits stored-form latex on edit', () => {\n const onChange = jest.fn();\n const input = withField();\n\n input.props = { onChange };\n input.mathField.value = '\\\\longdiv{\\\\placeholder{}}';\n input.onInputEdit();\n\n // \\placeholder is MathLive-internal and must not reach the model\n expect(onChange).toHaveBeenCalledWith('\\\\longdiv{}');\n expect(input.lastEmitted).toEqual('\\\\longdiv{}');\n });\n\n it('does not push a prop echo back into the field', () => {\n const input = withField();\n\n input.mathField.value = 'x';\n input.lastEmitted = 'x';\n input.props = { latex: 'x' };\n\n input.componentDidUpdate({ latex: '' });\n\n expect(input.mathField.value).toEqual('x');\n });\n\n it('pushes a genuinely new latex prop into the field', () => {\n const input = withField();\n\n input.mathField.value = 'x';\n input.lastEmitted = 'x';\n input.props = { latex: 'y' };\n\n input.componentDidUpdate({ latex: 'x' });\n\n expect(input.mathField.value).toEqual('y');\n });\n\n it('bridges stored latex on the way in', () => {\n const input = withField();\n\n input.props = { latex: '\\\\longdiv{5}' };\n input.componentDidUpdate({ latex: '' });\n\n // must become native \\enclose so the content stays editable\n expect(input.mathField.value).toEqual('\\\\enclose{longdiv}{5}');\n });\n\n it('toggles readOnly', () => {\n const input = withField();\n\n input.props = { readOnly: true };\n input.componentDidUpdate({ readOnly: false });\n\n expect(input.mathField.readOnly).toBe(true);\n });\n\n it('clear() empties the field', () => {\n const input = withField();\n\n input.mathField.value = 'abc';\n expect(input.clear()).toEqual('');\n expect(input.mathField.value).toEqual('');\n });\n\n it('suppresses Enter so it cannot insert a line break', () => {\n const input = withField();\n const preventDefault = jest.fn();\n\n input.onKeyDown({ key: 'Enter', preventDefault });\n expect(preventDefault).toHaveBeenCalled();\n\n preventDefault.mockClear();\n input.onKeyDown({ key: 'a', preventDefault });\n expect(preventDefault).not.toHaveBeenCalled();\n });\n\n it('componentDidUpdate is safe before the field exists', () => {\n const input = new Input({ latex: 'x' });\n\n expect(() => input.componentDidUpdate({ latex: '' })).not.toThrow();\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drop-in-compat.test.js","names":["_react","_interopRequireDefault","require","_react2","_styles","_index","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","describe","it","_mq$CommonMqStyles","mq","CommonMqStyles","commonMqFontStyles","longdivStyles","supsubStyles","expect","toBeDefined","_mq$CommonMqStyles2","commonMqKeyboardStyles","not","toThrow","_mq$CommonMqStyles3","Styled","styled","render","createElement","MathEditor","Input","width","latex","onChange","padding","_render","container","firstChild","toBeTruthy","className","Static","onFocus","onBlur","onSubFieldChange","pointerEvents","pkg","name"],"sources":["../../src/__tests__/drop-in-compat.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\nimport { styled } from '@mui/material/styles';\n\nimport { mq } from '../index';\n\n/**\n * Exercises the exact call patterns real consumers use against\n * @pie-lib/math-input, to catch drop-in incompatibilities.\n *\n * Sources:\n * - packages/math-toolbar/src/editor-and-pad.jsx:16,185\n * - packages/math-toolbar/src/math-preview.jsx:8,156\n * - packages/editable-html/src/plugins/respArea/math-templated/index.jsx:92\n * - packages/editable-html-tip-tap/src/components/respArea/MathTemplated.jsx:111\n */\ndescribe('drop-in compatibility with @pie-lib/math-input consumers', () => {\n describe('mq.CommonMqStyles destructuring', () => {\n it('math-preview.jsx: { commonMqFontStyles, longdivStyles, supsubStyles }', () => {\n const { commonMqFontStyles, longdivStyles, supsubStyles } = mq.CommonMqStyles;\n\n expect(commonMqFontStyles).toBeDefined();\n expect(longdivStyles).toBeDefined();\n expect(supsubStyles).toBeDefined();\n });\n\n it('editor-and-pad.jsx: also { commonMqKeyboardStyles }', () => {\n const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles } = mq.CommonMqStyles;\n\n expect(commonMqKeyboardStyles).toBeDefined();\n // All four must be spreadable into an emotion style object.\n expect(() => ({\n ...commonMqFontStyles,\n ...commonMqKeyboardStyles,\n ...longdivStyles,\n ...supsubStyles,\n })).not.toThrow();\n });\n\n it('the destructured groups survive being spread into a styled component', () => {\n const { commonMqFontStyles, longdivStyles, supsubStyles } = mq.CommonMqStyles;\n const Styled = styled('div')({ ...commonMqFontStyles, ...longdivStyles, ...supsubStyles });\n\n expect(() => render(<Styled />)).not.toThrow();\n });\n });\n\n describe('mq.Input', () => {\n it('editor-and-pad.jsx: styled(mq.Input) renders', () => {\n const MathEditor = styled(mq.Input)(() => ({ width: '100%' }));\n\n expect(() => render(<MathEditor latex=\"\\\\frac{1}{2}\" onChange={() => {}} />)).not.toThrow();\n });\n\n it('accepts the className that styled() injects', () => {\n const Styled = styled(mq.Input)({ padding: 4 });\n const { container } = render(<Styled latex=\"x\" onChange={() => {}} />);\n\n expect(container.firstChild).toBeTruthy();\n expect(container.firstChild.className).toBeTruthy();\n });\n });\n\n describe('mq.Static', () => {\n it('math-preview.jsx: <mq.Static latex onFocus onBlur />', () => {\n expect(() => render(<mq.Static latex={'\\\\frac{1}{2}'} onFocus={() => {}} onBlur={() => {}} />)).not.toThrow();\n });\n\n it('math-templated respArea: <mq.Static latex={value} />', () => {\n expect(() => render(<mq.Static latex={'x=1'} />)).not.toThrow();\n });\n\n it('renders answer-block latex (the templated-math case) without throwing', () => {\n expect(() =>\n render(<mq.Static latex={'x=\\\\MathQuillMathField[r1]{}'} onSubFieldChange={() => {}} />),\n ).not.toThrow();\n });\n\n it('is styleable, as keypad labels were in math-input', () => {\n const Styled = styled(mq.Static)({ pointerEvents: 'none' });\n\n expect(() => render(<Styled latex={'\\\\pi'} />)).not.toThrow();\n });\n });\n\n describe('surface parity', () => {\n it('exposes exactly the names math-input exported', () => {\n // eslint-disable-next-line global-require\n const pkg = require('../index');\n\n [\n 'keysForGrade',\n 'addBrackets',\n 'removeBrackets',\n 'keys',\n 'HorizontalKeypad',\n 'mq',\n 'updateSpans',\n 'registerEmbed',\n 'applyStaticMath',\n ].forEach((name) => {\n expect(pkg[name]).toBeDefined();\n });\n });\n\n it('mq exposes Input, Static and CommonMqStyles', () => {\n ['Input', 'Static', 'CommonMqStyles'].forEach((name) => {\n expect(mq[name]).toBeDefined();\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","names":["_react","_interopRequireDefault","require","_react2","_index","describe","it","expect","_typeof2","keysForGrade","toBe","addBrackets","removeBrackets","registerEmbed","applyStaticMath","updateSpans","keys","toBeDefined","baseSet","mf","Input","Static","mq","not","toThrow","_mf$CommonMqStyles","CommonMqStyles","commonMqFontStyles","commonMqKeyboardStyles","longdivStyles","supsubStyles","forEach","s","toEqual","set","Array","isArray","length","_render","render","createElement","KeyPad","onPress","container","querySelectorAll","toBeGreaterThan","_render2","name","latex","category","textContent","toContain","jest","fn","key","label","write","_render3","querySelector","click","toHaveBeenCalledWith","MathInput","onChange","onClick","HorizontalKeypad"],"sources":["../../src/__tests__/index.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport {\n keys,\n keysForGrade,\n addBrackets,\n removeBrackets,\n registerEmbed,\n applyStaticMath,\n updateSpans,\n mf,\n mq,\n MathInput,\n HorizontalKeypad,\n KeyPad,\n} from '../index';\n\ndescribe('math-input-mathlive public API', () => {\n it('mirrors the @pie-lib/math-input export surface', () => {\n expect(typeof keysForGrade).toBe('function');\n expect(typeof addBrackets).toBe('function');\n expect(typeof removeBrackets).toBe('function');\n expect(typeof registerEmbed).toBe('function');\n expect(typeof applyStaticMath).toBe('function');\n expect(typeof updateSpans).toBe('function');\n expect(keys).toBeDefined();\n expect(keys.baseSet).toBeDefined();\n });\n\n it('exports the field wrappers under both mf and mq', () => {\n expect(mf.Input).toBeDefined();\n expect(mf.Static).toBeDefined();\n // `mq` alias lets a consumer swap packages by changing only the import.\n expect(mq).toBe(mf);\n });\n\n it('updateSpans is a safe no-op', () => {\n expect(() => updateSpans()).not.toThrow();\n });\n\n it('CommonMqStyles keeps the shape consumers destructure', () => {\n // math-toolbar does:\n // const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles }\n // = mq.CommonMqStyles;\n const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles } = mf.CommonMqStyles;\n\n [commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles].forEach((s) => {\n expect(s).toBeDefined();\n expect(typeof s).toBe('object');\n });\n });\n\n it('bracket helpers round-trip', () => {\n expect(addBrackets('x')).toEqual('\\\\(x\\\\)');\n expect(removeBrackets('\\\\(x\\\\)')).toEqual('x');\n expect(removeBrackets(addBrackets('\\\\frac{1}{2}'))).toEqual('\\\\frac{1}{2}');\n });\n\n it('keysForGrade returns a 5-row keyset', () => {\n const set = keysForGrade('geometry');\n\n expect(Array.isArray(set)).toBe(true);\n expect(set.length).toBe(5);\n });\n});\n\ndescribe('rendering', () => {\n // MathLive is a browser-only custom element; loadMathLive() resolves async and\n // is a no-op-ish under jsdom. These assert the components mount without\n // throwing, which is what regressed most often in the MathQuill version.\n it('KeyPad renders without a live MathLive instance', () => {\n const { container } = render(<KeyPad onPress={() => {}} />);\n\n expect(container.querySelectorAll('button').length).toBeGreaterThan(0);\n });\n\n it('KeyPad falls back to raw latex for labels before MathLive loads', () => {\n const { container } = render(\n <KeyPad onPress={() => {}} baseSet={[[{ name: 'pi', latex: '\\\\pi', category: 'constants' }]]} />,\n );\n\n expect(container.textContent).toContain('\\\\pi');\n });\n\n it('KeyPad fires onPress with the key definition', () => {\n const onPress = jest.fn();\n const key = { name: 'x', label: 'x', write: 'x', category: 'vars' };\n const { container } = render(<KeyPad onPress={onPress} baseSet={[[key]]} />);\n\n container.querySelector('button').click();\n\n expect(onPress).toHaveBeenCalledWith(key);\n });\n\n it('MathInput mounts', () => {\n expect(() => render(<MathInput latex=\"\\\\frac{1}{2}\" onChange={() => {}} />)).not.toThrow();\n });\n\n it('HorizontalKeypad mounts and reports the legacy {value,type} model', () => {\n const onClick = jest.fn();\n\n expect(() => render(<HorizontalKeypad onClick={onClick} />)).not.toThrow();\n });\n\n it('Static renders display-mode latex without a mathfield', () => {\n expect(() => render(<mf.Static latex=\"\\\\frac{1}{2}\" />)).not.toThrow();\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input-imperative.test.js","names":["_latexBridge","require","_input","_interopRequireDefault","stubField","calls","insert","executeCommand","focus","value","getValue","v","push","blur","withField","input","Input","f","mathField","describe","it","_withField","keystroke","expect","toEqual","_withField2","_withField3","Error","not","toThrow","forEach","k","KEYSTROKES","toBeDefined","_withField4","command","_withField5","_withField6","keyToAction","latex","clear","write","setLatex","element","toBeUndefined","_withField7","mqCompat","_withField8","el","toBe"],"sources":["../../src/__tests__/input-imperative.test.jsx"],"sourcesContent":["import { KEYSTROKES, keyToAction } from '../latex-bridge';\nimport Input from '../mf/input';\n\n/**\n * The imperative surface that @pie-lib/math-toolbar drives\n * (editor-and-pad.jsx: clear/command/keystroke/write/latex).\n *\n * These call the methods against a stub mathfield, because a real\n * <math-field> needs a browser. What matters here is the *translation*:\n * MathQuill-era arguments must become valid MathLive operations.\n */\nconst stubField = () => {\n const calls = { insert: [], executeCommand: [], focus: 0 };\n\n return {\n calls,\n value: '',\n getValue: () => '',\n insert(v) {\n calls.insert.push(v);\n },\n executeCommand(v) {\n calls.executeCommand.push(v);\n },\n focus() {\n calls.focus++;\n },\n blur() {},\n };\n};\n\nconst withField = () => {\n const input = new Input({});\n const f = stubField();\n\n input.mathField = f;\n\n return { input, f };\n};\n\ndescribe('Input imperative API (drives math-toolbar)', () => {\n describe('keystroke', () => {\n it('maps MathQuill keystroke names to MathLive selectors', () => {\n const { input, f } = withField();\n\n input.keystroke('Left');\n input.keystroke('Right');\n input.keystroke('Backspace');\n\n expect(f.calls.executeCommand).toEqual(['moveToPreviousChar', 'moveToNextChar', 'deleteBackward']);\n });\n\n it('passes an unknown value through as a selector', () => {\n const { input, f } = withField();\n\n input.keystroke('deleteForward');\n\n expect(f.calls.executeCommand).toEqual(['deleteForward']);\n });\n\n it('does not throw when the engine rejects the selector', () => {\n const { input } = withField();\n\n input.mathField.executeCommand = () => {\n throw new Error('unknown command');\n };\n\n expect(() => input.keystroke('Nonsense')).not.toThrow();\n });\n\n it('covers every keystroke the keypad emits', () => {\n // navigation.js / edit.js only produce these three\n ['Left', 'Right', 'Backspace'].forEach((k) => expect(KEYSTROKES[k]).toBeDefined());\n });\n });\n\n describe('command', () => {\n it('expands argument-taking commands into placeholders', () => {\n const { input, f } = withField();\n\n input.command('\\\\frac');\n\n // a bare \\frac would give no editable slots\n expect(f.calls.insert).toEqual(['\\\\frac{#?}{#?}']);\n });\n\n it('handles array commands', () => {\n const { input, f } = withField();\n\n input.command(['\\\\log', '_']);\n\n expect(f.calls.insert).toEqual(['\\\\log_{#?}']);\n });\n\n it('passes argument-less commands through', () => {\n const { input, f } = withField();\n\n input.command('\\\\pi');\n\n expect(f.calls.insert).toEqual(['\\\\pi']);\n });\n\n it('agrees with keyToAction', () => {\n expect(keyToAction({ command: '\\\\sqrt' }).value).toEqual('\\\\sqrt{#?}');\n });\n });\n\n describe('safety before MathLive loads', () => {\n it('every method is a no-op rather than a crash', () => {\n const input = new Input({});\n\n // mathField is undefined until loadMathLive() resolves\n expect(input.latex()).toEqual('');\n expect(input.clear()).toEqual('');\n expect(input.command('\\\\frac')).toEqual('');\n expect(input.keystroke('Left')).toEqual('');\n expect(input.write('x')).toEqual('');\n expect(() => input.focus()).not.toThrow();\n expect(() => input.blur()).not.toThrow();\n expect(() => input.setLatex('x')).not.toThrow();\n expect(input.element).toBeUndefined();\n });\n });\n\n describe('mqCompat facade', () => {\n // math-toolbar used to call this.input.mathField.latex(); external\n // consumers may still do the same.\n it('exposes latex() as a getter', () => {\n const { input } = withField();\n\n input.mathField.getValue = () => '\\\\frac{1}{2}';\n\n expect(input.mqCompat.latex()).toEqual('\\\\frac{1}{2}');\n });\n\n it('exposes latex(v) as a setter and el()', () => {\n const { input, f } = withField();\n\n input.mqCompat.latex('x+1');\n expect(f.value).toEqual('x+1');\n expect(input.mqCompat.el()).toBe(f);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keypad-label.test.js","names":["_latexBridge","require","describe","it","out","latexForDisplay","expect","not","toEqual","toContain","forEach","latex","geometry","Object","values","key","toMatch","_require","placeholderStyles","position","left","width","marginLeft","cs","name","toBeDefined","style","_typeof2","keys","undefined","keyToAction","value"],"sources":["../../src/__tests__/keypad-label.test.jsx"],"sourcesContent":["import { withVisibleEmptySlots as latexForDisplay } from '../latex-bridge';\nimport { keyToAction } from '../latex-bridge';\n\n/**\n * Keys use empty groups to show a command's shape (`\\frac{}{}`, `x^{}`).\n * MathLive renders `{}` as nothing, so labels need a visible stand-in - but the\n * value that gets *inserted* must stay untouched.\n */\ndescribe('keypad label display normalisation', () => {\n it('gives empty groups a visible glyph', () => {\n const out = latexForDisplay('\\\\frac{}{}');\n\n expect(out).not.toEqual('\\\\frac{}{}');\n // a \\rule, not a glyph: font metrics for a substituted glyph do not match\n // MathLive's, which left stretchy accents narrower than the box\n expect(out).toContain('\\\\rule');\n expect(out).toContain('pie-empty');\n });\n\n it('handles every empty-group key shape', () => {\n ['\\\\frac{}{}', '\\\\overline{}', 'x^{}', 'x_{}', '\\\\sqrt{}', '\\\\sqrt[{}]{}', '\\\\abs{}', '\\\\log_{}', '\\\\longdiv{}'].forEach(\n (latex) => {\n expect(latexForDisplay(latex)).not.toContain('{}');\n },\n );\n });\n\n it('treats a whitespace-only group as empty', () => {\n // e.g. \\frac{x}{ }\n expect(latexForDisplay('\\\\frac{x}{ }')).toContain('pie-empty');\n });\n\n // MathQuill needed a nested \\overline{} to draw the empty box. MathLive\n // renders that as a real line, so those labels showed a spurious bar (a line\n // under the arrows, and a straight line instead of the arc).\n it('accent keys do not carry the nested-overline box hack', () => {\n // eslint-disable-next-line global-require\n const geometry = require('../keys/geometry');\n\n Object.values(geometry).forEach((key) => {\n if (key && typeof key.latex === 'string') {\n expect(key.latex).not.toContain('\\\\overline{}}');\n }\n });\n });\n\n it('an accent over an empty slot still gets a visible box', () => {\n ['\\\\overleftrightarrow{}', '\\\\overarc{}'].forEach((latex) => {\n const out = latexForDisplay(latex);\n\n expect(out).toContain('pie-empty');\n expect(out).not.toContain('\\\\overline');\n });\n });\n\n // A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,\n // so the browser substituted a wider one and stretchy accents came out\n // narrower than the box. A rule has an explicit width.\n it('the empty slot has an explicit width, not font-dependent metrics', () => {\n const out = latexForDisplay('\\\\overarc{}');\n\n expect(out).toContain('\\\\rule');\n expect(out).toMatch(/rule\\{[\\d.]+em\\}\\{[\\d.]+em\\}/);\n expect(out).not.toContain('unicode');\n });\n\n // Measured in the browser: the accent's immediate wrapper computes to 0px\n // (its .ML__stretchy child is absolutely positioned), so the svg width has to\n // resolve against .ML__base - whose width equals the content. Without pinning\n // that, the arc collapsed to a spike and sat right of the box.\n it('pins the accent containing block and drops the centering shift', () => {\n // eslint-disable-next-line global-require\n const { placeholderStyles } = require('../mf/common-styles');\n\n expect(placeholderStyles['& .ML__base'].position).toEqual('relative');\n expect(placeholderStyles['& .ML__stretchy']).toEqual({ position: 'absolute', left: 0, width: '100%' });\n // must be !important: MathLive writes margin-left as an inline style, and a\n // class cannot override that. Leaving it un-important also halved the arc's\n // width, because .ML__center is the stretchy's containing block.\n expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');\n });\n\n it('applies those rules wherever static math renders', () => {\n // eslint-disable-next-line global-require\n const cs = require('../mf/common-styles');\n\n ['commonKeyboardStyles', 'commonMathLiveStyles'].forEach((name) => {\n expect(cs[name]['& .ML__stretchy']).toBeDefined();\n expect(cs[name]['& .ML__base']).toBeDefined();\n });\n });\n\n // A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule\n // is descendant-scoped to .ML__latex .ML__stretchy svg.\n it('does not use a blanket svg rule', () => {\n // eslint-disable-next-line global-require\n const cs = require('../mf/common-styles');\n\n Object.values(cs).forEach((style) => {\n if (style && typeof style === 'object') {\n expect(Object.keys(style)).not.toContain('& svg');\n }\n });\n });\n\n it('leaves latex without empty groups alone', () => {\n ['\\\\pi', '\\\\sin', 'x^2', '\\\\overline{AB}'].forEach((latex) => {\n expect(latexForDisplay(latex)).toEqual(latex);\n });\n });\n\n it('handles nullish input', () => {\n expect(latexForDisplay(undefined)).toEqual('');\n expect(latexForDisplay('')).toEqual('');\n });\n\n it('does NOT affect what gets inserted into the field', () => {\n // the action must use the key's own latex, never the display form\n const key = { name: 'frac', latex: '\\\\frac{}{}' };\n\n expect(keyToAction(key).value).toEqual('\\\\frac{}{}');\n expect(keyToAction(key).value).not.toContain('pie-empty');\n });\n});\n"],"mappings":";;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACA;AACAC,QAAQ,CAAC,oCAAoC,EAAE,YAAM;EACnDC,EAAE,CAAC,oCAAoC,EAAE,YAAM;IAC7C,IAAMC,GAAG,GAAG,IAAAC,kCAAe,EAAC,YAAY,CAAC;IAEzCC,MAAM,CAACF,GAAG,CAAC,CAACG,GAAG,CAACC,OAAO,CAAC,YAAY,CAAC;IACrC;IACA;IACAF,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,QAAQ,CAAC;IAC/BH,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,WAAW,CAAC;EACpC,CAAC,CAAC;EAEFN,EAAE,CAAC,qCAAqC,EAAE,YAAM;IAC9C,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAACO,OAAO,CACtH,UAACC,KAAK,EAAK;MACTL,MAAM,CAAC,IAAAD,kCAAe,EAACM,KAAK,CAAC,CAAC,CAACJ,GAAG,CAACE,SAAS,CAAC,IAAI,CAAC;IACpD,CACF,CAAC;EACH,CAAC,CAAC;EAEFN,EAAE,CAAC,yCAAyC,EAAE,YAAM;IAClD;IACAG,MAAM,CAAC,IAAAD,kCAAe,EAAC,cAAc,CAAC,CAAC,CAACI,SAAS,CAAC,WAAW,CAAC;EAChE,CAAC,CAAC;;EAEF;EACA;EACA;EACAN,EAAE,CAAC,uDAAuD,EAAE,YAAM;IAChE;IACA,IAAMS,QAAQ,GAAGX,OAAO,CAAC,kBAAkB,CAAC;IAE5CY,MAAM,CAACC,MAAM,CAACF,QAAQ,CAAC,CAACF,OAAO,CAAC,UAACK,GAAG,EAAK;MACvC,IAAIA,GAAG,IAAI,OAAOA,GAAG,CAACJ,KAAK,KAAK,QAAQ,EAAE;QACxCL,MAAM,CAACS,GAAG,CAACJ,KAAK,CAAC,CAACJ,GAAG,CAACE,SAAS,CAAC,eAAe,CAAC;MAClD;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFN,EAAE,CAAC,uDAAuD,EAAE,YAAM;IAChE,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAACO,OAAO,CAAC,UAACC,KAAK,EAAK;MAC3D,IAAMP,GAAG,GAAG,IAAAC,kCAAe,EAACM,KAAK,CAAC;MAElCL,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,WAAW,CAAC;MAClCH,MAAM,CAACF,GAAG,CAAC,CAACG,GAAG,CAACE,SAAS,CAAC,YAAY,CAAC;IACzC,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;EACA;EACA;EACAN,EAAE,CAAC,kEAAkE,EAAE,YAAM;IAC3E,IAAMC,GAAG,GAAG,IAAAC,kCAAe,EAAC,aAAa,CAAC;IAE1CC,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,QAAQ,CAAC;IAC/BH,MAAM,CAACF,GAAG,CAAC,CAACY,OAAO,CAAC,8BAA8B,CAAC;IACnDV,MAAM,CAACF,GAAG,CAAC,CAACG,GAAG,CAACE,SAAS,CAAC,SAAS,CAAC;EACtC,CAAC,CAAC;;EAEF;EACA;EACA;EACA;EACAN,EAAE,CAAC,gEAAgE,EAAE,YAAM;IACzE;IACA,IAAAc,QAAA,GAA8BhB,OAAO,CAAC,qBAAqB,CAAC;MAApDiB,iBAAiB,GAAAD,QAAA,CAAjBC,iBAAiB;IAEzBZ,MAAM,CAACY,iBAAiB,CAAC,aAAa,CAAC,CAACC,QAAQ,CAAC,CAACX,OAAO,CAAC,UAAU,CAAC;IACrEF,MAAM,CAACY,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAACV,OAAO,CAAC;MAAEW,QAAQ,EAAE,UAAU;MAAEC,IAAI,EAAE,CAAC;MAAEC,KAAK,EAAE;IAAO,CAAC,CAAC;IACtG;IACA;IACA;IACAf,MAAM,CAACY,iBAAiB,CAAC,kCAAkC,CAAC,CAACI,UAAU,CAAC,CAACd,OAAO,CAAC,cAAc,CAAC;EAClG,CAAC,CAAC;EAEFL,EAAE,CAAC,kDAAkD,EAAE,YAAM;IAC3D;IACA,IAAMoB,EAAE,GAAGtB,OAAO,CAAC,qBAAqB,CAAC;IAEzC,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,CAACS,OAAO,CAAC,UAACc,IAAI,EAAK;MACjElB,MAAM,CAACiB,EAAE,CAACC,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;MACjDnB,MAAM,CAACiB,EAAE,CAACC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAC/C,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;EACA;EACAtB,EAAE,CAAC,iCAAiC,EAAE,YAAM;IAC1C;IACA,IAAMoB,EAAE,GAAGtB,OAAO,CAAC,qBAAqB,CAAC;IAEzCY,MAAM,CAACC,MAAM,CAACS,EAAE,CAAC,CAACb,OAAO,CAAC,UAACgB,KAAK,EAAK;MACnC,IAAIA,KAAK,IAAI,IAAAC,QAAA,aAAOD,KAAK,MAAK,QAAQ,EAAE;QACtCpB,MAAM,CAACO,MAAM,CAACe,IAAI,CAACF,KAAK,CAAC,CAAC,CAACnB,GAAG,CAACE,SAAS,CAAC,OAAO,CAAC;MACnD;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFN,EAAE,CAAC,yCAAyC,EAAE,YAAM;IAClD,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAACO,OAAO,CAAC,UAACC,KAAK,EAAK;MAC5DL,MAAM,CAAC,IAAAD,kCAAe,EAACM,KAAK,CAAC,CAAC,CAACH,OAAO,CAACG,KAAK,CAAC;IAC/C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,uBAAuB,EAAE,YAAM;IAChCG,MAAM,CAAC,IAAAD,kCAAe,EAACwB,SAAS,CAAC,CAAC,CAACrB,OAAO,CAAC,EAAE,CAAC;IAC9CF,MAAM,CAAC,IAAAD,kCAAe,EAAC,EAAE,CAAC,CAAC,CAACG,OAAO,CAAC,EAAE,CAAC;EACzC,CAAC,CAAC;EAEFL,EAAE,CAAC,mDAAmD,EAAE,YAAM;IAC5D;IACA,IAAMY,GAAG,GAAG;MAAES,IAAI,EAAE,MAAM;MAAEb,KAAK,EAAE;IAAa,CAAC;IAEjDL,MAAM,CAAC,IAAAwB,wBAAW,EAACf,GAAG,CAAC,CAACgB,KAAK,CAAC,CAACvB,OAAO,CAAC,YAAY,CAAC;IACpDF,MAAM,CAAC,IAAAwB,wBAAW,EAACf,GAAG,CAAC,CAACgB,KAAK,CAAC,CAACxB,GAAG,CAACE,SAAS,CAAC,WAAW,CAAC;EAC3D,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keypad-render.test.js","names":["_react","_interopRequireDefault","require","_react2","_keypad","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","describe","it","_render","render","createElement","LatexLabel","latex","container","expect","textContent","toContain","_render2","rerender","_asyncToGenerator2","_regenerator","mark","_callee","a","b","wrap","_context","prev","next","warned","state","markup","setState","componentDidMount","toBe","stop","key","over","undefined","name","label","write","category","_render3","onPress","baseSet","querySelectorAll","jest","fn","k","_render4","querySelector","click","toHaveBeenCalledWith","_render5","dot","comma","_render6","noDecimal","disabled","Array","from","_render7","not","toThrow","setKeypadInteraction","_render8","firstChild","dispatchEvent","MouseEvent","bubbles","_render9","mode","className","_render0","additionalKeys","_render1","controlledKeypadMode","unmount"],"sources":["../../src/__tests__/keypad-render.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport KeyPad, { LatexLabel } from '../keypad';\n\n/**\n * Keypad behaviour that is new in this package: labels are static markup from\n * convertLatexToMarkup (the MathQuill version created a live StaticMath per\n * button), with a raw-latex fallback when the engine is unavailable.\n */\ndescribe('LatexLabel', () => {\n it('falls back to raw latex when MathLive is unavailable', () => {\n // jsdom cannot load MathLive, so latexToMarkup returns '' - the button must\n // still show something rather than render blank.\n const { container } = render(<LatexLabel latex={'\\\\pi'} />);\n\n expect(container.textContent).toContain('\\\\pi');\n });\n\n it('re-renders when the latex prop changes', () => {\n const { container, rerender } = render(<LatexLabel latex={'\\\\pi'} />);\n\n rerender(<LatexLabel latex={'\\\\theta'} />);\n\n expect(container.textContent).toContain('\\\\theta');\n });\n\n it('does not warn more than once about a missing engine', async () => {\n LatexLabel.warned = false;\n\n const a = new LatexLabel({ latex: '\\\\pi' });\n const b = new LatexLabel({ latex: '\\\\theta' });\n\n a.state = { markup: '' };\n b.state = { markup: '' };\n a.setState = () => {};\n b.setState = () => {};\n\n await a.componentDidMount();\n await b.componentDidMount();\n\n expect(LatexLabel.warned).toBe(true);\n });\n});\n\ndescribe('KeyPad', () => {\n const key = (over = {}) => ({ name: 'x', label: 'x', write: 'x', category: 'vars', ...over });\n\n it('renders a button per key', () => {\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[key(), key({ name: 'y', label: 'y' })]]} />);\n\n expect(container.querySelectorAll('button').length).toBe(2);\n });\n\n it('calls onPress with the whole key definition', () => {\n const onPress = jest.fn();\n const k = key();\n const { container } = render(<KeyPad onPress={onPress} baseSet={[[k]]} />);\n\n container.querySelector('button').click();\n\n expect(onPress).toHaveBeenCalledWith(k);\n });\n\n it('renders a latex key through LatexLabel', () => {\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[{ name: 'pi', latex: '\\\\pi' }]]} />);\n\n expect(container.textContent).toContain('\\\\pi');\n });\n\n it('disables the decimal separators when noDecimal is set', () => {\n const dot = key({ name: '.', label: '.', write: '.' });\n const comma = key({ name: ',', label: ',', write: ',' });\n const { container } = render(<KeyPad onPress={() => {}} noDecimal baseSet={[[dot, comma]]} />);\n\n const disabled = Array.from(container.querySelectorAll('button')).filter((b) => b.disabled);\n\n expect(disabled.length).toBe(2);\n });\n\n it('leaves the separators enabled otherwise', () => {\n const dot = key({ name: '.', label: '.', write: '.' });\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[dot]]} />);\n\n expect(container.querySelector('button').disabled).toBe(false);\n });\n\n it('renders a placeholder for empty grid slots', () => {\n expect(() => render(<KeyPad onPress={() => {}} baseSet={[[null]]} />)).not.toThrow();\n });\n\n it('notifies setKeypadInteraction on pointer interaction', () => {\n const setKeypadInteraction = jest.fn();\n const { container } = render(\n <KeyPad onPress={() => {}} setKeypadInteraction={setKeypadInteraction} baseSet={[[key()]]} />,\n );\n\n container.firstChild.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));\n\n expect(setKeypadInteraction).toHaveBeenCalledWith(true);\n });\n\n it('uses the mode as a class so mode-specific styling applies', () => {\n const { container } = render(<KeyPad onPress={() => {}} mode=\"language\" baseSet={[[key()]]} />);\n\n expect(container.firstChild.className).toContain('language');\n });\n\n it('drops the base set for the modes that supply their own keys', () => {\n const { container } = render(\n <KeyPad onPress={() => {}} mode=\"language\" baseSet={[[key(), key()]]} additionalKeys={[[key()]]} />,\n );\n\n // base set ignored, only the additional key renders\n expect(container.querySelectorAll('button').length).toBe(1);\n });\n\n it('unmounts without throwing', () => {\n const { unmount } = render(<KeyPad onPress={() => {}} controlledKeypadMode baseSet={[[key()]]} />);\n\n expect(() => unmount()).not.toThrow();\n });\n});\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAC,uBAAA,CAAAH,OAAA;AAA+C,SAAAG,wBAAAC,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAH,uBAAA,YAAAA,wBAAAC,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,mBAAAT,CAAA,iBAAAA,CAAA,gBAAAU,OAAA,CAAAV,CAAA,0BAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,cAAAM,EAAA,IAAAd,CAAA,gBAAAc,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,EAAA,OAAAP,CAAA,IAAAD,CAAA,GAAAW,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAc,EAAA,OAAAP,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAM,EAAA,EAAAP,CAAA,IAAAC,CAAA,CAAAM,EAAA,IAAAd,CAAA,CAAAc,EAAA,WAAAN,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAAA,SAAAmB,QAAApB,CAAA,EAAAG,CAAA,QAAAF,CAAA,GAAAgB,MAAA,CAAAI,IAAA,CAAArB,CAAA,OAAAiB,MAAA,CAAAK,qBAAA,QAAAhB,CAAA,GAAAW,MAAA,CAAAK,qBAAA,CAAAtB,CAAA,GAAAG,CAAA,KAAAG,CAAA,GAAAA,CAAA,CAAAiB,MAAA,WAAApB,CAAA,WAAAc,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAG,CAAA,EAAAqB,UAAA,OAAAvB,CAAA,CAAAwB,IAAA,CAAAC,KAAA,CAAAzB,CAAA,EAAAK,CAAA,YAAAL,CAAA;AAAA,SAAA0B,cAAA3B,CAAA,aAAAG,CAAA,MAAAA,CAAA,GAAAyB,SAAA,CAAAC,MAAA,EAAA1B,CAAA,UAAAF,CAAA,WAAA2B,SAAA,CAAAzB,CAAA,IAAAyB,SAAA,CAAAzB,CAAA,QAAAA,CAAA,OAAAiB,OAAA,CAAAH,MAAA,CAAAhB,CAAA,OAAA6B,OAAA,WAAA3B,CAAA,QAAA4B,gBAAA,aAAA/B,CAAA,EAAAG,CAAA,EAAAF,CAAA,CAAAE,CAAA,SAAAc,MAAA,CAAAe,yBAAA,GAAAf,MAAA,CAAAgB,gBAAA,CAAAjC,CAAA,EAAAiB,MAAA,CAAAe,yBAAA,CAAA/B,CAAA,KAAAmB,OAAA,CAAAH,MAAA,CAAAhB,CAAA,GAAA6B,OAAA,WAAA3B,CAAA,IAAAc,MAAA,CAAAC,cAAA,CAAAlB,CAAA,EAAAG,CAAA,EAAAc,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAE,CAAA,iBAAAH,CAAA;AAE/C;AACA;AACA;AACA;AACA;AACAkC,QAAQ,CAAC,YAAY,EAAE,YAAM;EAC3BC,EAAE,CAAC,sDAAsD,EAAE,YAAM;IAC/D;IACA;IACA,IAAAC,OAAA,GAAsB,IAAAC,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,CAAAyC,UAAU;QAACC,KAAK,EAAE;MAAO,CAAE,CAAC,CAAC;MAAnDC,SAAS,GAAAL,OAAA,CAATK,SAAS;IAEjBC,MAAM,CAACD,SAAS,CAACE,WAAW,CAAC,CAACC,SAAS,CAAC,MAAM,CAAC;EACjD,CAAC,CAAC;EAEFT,EAAE,CAAC,wCAAwC,EAAE,YAAM;IACjD,IAAAU,QAAA,GAAgC,IAAAR,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,CAAAyC,UAAU;QAACC,KAAK,EAAE;MAAO,CAAE,CAAC,CAAC;MAA7DC,SAAS,GAAAI,QAAA,CAATJ,SAAS;MAAEK,QAAQ,GAAAD,QAAA,CAARC,QAAQ;IAE3BA,QAAQ,cAACpD,MAAA,YAAA4C,aAAA,CAACxC,OAAA,CAAAyC,UAAU;MAACC,KAAK,EAAE;IAAU,CAAE,CAAC,CAAC;IAE1CE,MAAM,CAACD,SAAS,CAACE,WAAW,CAAC,CAACC,SAAS,CAAC,SAAS,CAAC;EACpD,CAAC,CAAC;EAEFT,EAAE,CAAC,qDAAqD,mBAAAY,kBAAA,0BAAAC,YAAA,YAAAC,IAAA,CAAE,SAAAC,QAAA;IAAA,IAAAC,CAAA,EAAAC,CAAA;IAAA,OAAAJ,YAAA,YAAAK,IAAA,WAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;QAAA;UACxDjB,kBAAU,CAACkB,MAAM,GAAG,KAAK;UAEnBN,CAAC,GAAG,IAAIZ,kBAAU,CAAC;YAAEC,KAAK,EAAE;UAAO,CAAC,CAAC;UACrCY,CAAC,GAAG,IAAIb,kBAAU,CAAC;YAAEC,KAAK,EAAE;UAAU,CAAC,CAAC;UAE9CW,CAAC,CAACO,KAAK,GAAG;YAAEC,MAAM,EAAE;UAAG,CAAC;UACxBP,CAAC,CAACM,KAAK,GAAG;YAAEC,MAAM,EAAE;UAAG,CAAC;UACxBR,CAAC,CAACS,QAAQ,GAAG,YAAM,CAAC,CAAC;UACrBR,CAAC,CAACQ,QAAQ,GAAG,YAAM,CAAC,CAAC;UAACN,QAAA,CAAAE,IAAA;UAAA,OAEhBL,CAAC,CAACU,iBAAiB,CAAC,CAAC;QAAA;UAAAP,QAAA,CAAAE,IAAA;UAAA,OACrBJ,CAAC,CAACS,iBAAiB,CAAC,CAAC;QAAA;UAE3BnB,MAAM,CAACH,kBAAU,CAACkB,MAAM,CAAC,CAACK,IAAI,CAAC,IAAI,CAAC;QAAC;QAAA;UAAA,OAAAR,QAAA,CAAAS,IAAA;MAAA;IAAA,GAAAb,OAAA;EAAA,CACtC,GAAC;AACJ,CAAC,CAAC;AAEFhB,QAAQ,CAAC,QAAQ,EAAE,YAAM;EACvB,IAAM8B,GAAG,GAAG,SAANA,GAAGA,CAAA;IAAA,IAAIC,IAAI,GAAArC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAsC,SAAA,GAAAtC,SAAA,MAAG,CAAC,CAAC;IAAA,OAAAD,aAAA;MAAQwC,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAE,GAAG;MAAEC,KAAK,EAAE,GAAG;MAAEC,QAAQ,EAAE;IAAM,GAAKL,IAAI;EAAA,CAAG;EAE7F9B,EAAE,CAAC,0BAA0B,EAAE,YAAM;IACnC,IAAAoC,QAAA,GAAsB,IAAAlC,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAACC,OAAO,EAAE,CAAC,CAACT,GAAG,CAAC,CAAC,EAAEA,GAAG,CAAC;UAAEG,IAAI,EAAE,GAAG;UAAEC,KAAK,EAAE;QAAI,CAAC,CAAC,CAAC;MAAE,CAAE,CAAC,CAAC;MAAvG3B,SAAS,GAAA8B,QAAA,CAAT9B,SAAS;IAEjBC,MAAM,CAACD,SAAS,CAACiC,gBAAgB,CAAC,QAAQ,CAAC,CAAC7C,MAAM,CAAC,CAACiC,IAAI,CAAC,CAAC,CAAC;EAC7D,CAAC,CAAC;EAEF3B,EAAE,CAAC,6CAA6C,EAAE,YAAM;IACtD,IAAMqC,OAAO,GAAGG,IAAI,CAACC,EAAE,CAAC,CAAC;IACzB,IAAMC,CAAC,GAAGb,GAAG,CAAC,CAAC;IACf,IAAAc,QAAA,GAAsB,IAAAzC,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAEA,OAAQ;QAACC,OAAO,EAAE,CAAC,CAACI,CAAC,CAAC;MAAE,CAAE,CAAC,CAAC;MAAlEpC,SAAS,GAAAqC,QAAA,CAATrC,SAAS;IAEjBA,SAAS,CAACsC,aAAa,CAAC,QAAQ,CAAC,CAACC,KAAK,CAAC,CAAC;IAEzCtC,MAAM,CAAC8B,OAAO,CAAC,CAACS,oBAAoB,CAACJ,CAAC,CAAC;EACzC,CAAC,CAAC;EAEF1C,EAAE,CAAC,wCAAwC,EAAE,YAAM;IACjD,IAAA+C,QAAA,GAAsB,IAAA7C,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAACC,OAAO,EAAE,CAAC,CAAC;UAAEN,IAAI,EAAE,IAAI;UAAE3B,KAAK,EAAE;QAAO,CAAC,CAAC;MAAE,CAAE,CAAC,CAAC;MAA/FC,SAAS,GAAAyC,QAAA,CAATzC,SAAS;IAEjBC,MAAM,CAACD,SAAS,CAACE,WAAW,CAAC,CAACC,SAAS,CAAC,MAAM,CAAC;EACjD,CAAC,CAAC;EAEFT,EAAE,CAAC,uDAAuD,EAAE,YAAM;IAChE,IAAMgD,GAAG,GAAGnB,GAAG,CAAC;MAAEG,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAE,GAAG;MAAEC,KAAK,EAAE;IAAI,CAAC,CAAC;IACtD,IAAMe,KAAK,GAAGpB,GAAG,CAAC;MAAEG,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAE,GAAG;MAAEC,KAAK,EAAE;IAAI,CAAC,CAAC;IACxD,IAAAgB,QAAA,GAAsB,IAAAhD,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAACc,SAAS;QAACb,OAAO,EAAE,CAAC,CAACU,GAAG,EAAEC,KAAK,CAAC;MAAE,CAAE,CAAC,CAAC;MAAtF3C,SAAS,GAAA4C,QAAA,CAAT5C,SAAS;IAEjB,IAAM8C,QAAQ,GAAGC,KAAK,CAACC,IAAI,CAAChD,SAAS,CAACiC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAACnD,MAAM,CAAC,UAAC6B,CAAC;MAAA,OAAKA,CAAC,CAACmC,QAAQ;IAAA,EAAC;IAE3F7C,MAAM,CAAC6C,QAAQ,CAAC1D,MAAM,CAAC,CAACiC,IAAI,CAAC,CAAC,CAAC;EACjC,CAAC,CAAC;EAEF3B,EAAE,CAAC,yCAAyC,EAAE,YAAM;IAClD,IAAMgD,GAAG,GAAGnB,GAAG,CAAC;MAAEG,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAE,GAAG;MAAEC,KAAK,EAAE;IAAI,CAAC,CAAC;IACtD,IAAAqB,QAAA,GAAsB,IAAArD,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAACC,OAAO,EAAE,CAAC,CAACU,GAAG,CAAC;MAAE,CAAE,CAAC,CAAC;MAArE1C,SAAS,GAAAiD,QAAA,CAATjD,SAAS;IAEjBC,MAAM,CAACD,SAAS,CAACsC,aAAa,CAAC,QAAQ,CAAC,CAACQ,QAAQ,CAAC,CAACzB,IAAI,CAAC,KAAK,CAAC;EAChE,CAAC,CAAC;EAEF3B,EAAE,CAAC,4CAA4C,EAAE,YAAM;IACrDO,MAAM,CAAC;MAAA,OAAM,IAAAL,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAACC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC;MAAE,CAAE,CAAC,CAAC;IAAA,EAAC,CAACkB,GAAG,CAACC,OAAO,CAAC,CAAC;EACtF,CAAC,CAAC;EAEFzD,EAAE,CAAC,sDAAsD,EAAE,YAAM;IAC/D,IAAM0D,oBAAoB,GAAGlB,IAAI,CAACC,EAAE,CAAC,CAAC;IACtC,IAAAkB,QAAA,GAAsB,IAAAzD,cAAM,eAC1B3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAACqB,oBAAoB,EAAEA,oBAAqB;QAACpB,OAAO,EAAE,CAAC,CAACT,GAAG,CAAC,CAAC,CAAC;MAAE,CAAE,CAC9F,CAAC;MAFOvB,SAAS,GAAAqD,QAAA,CAATrD,SAAS;IAIjBA,SAAS,CAACsD,UAAU,CAACC,aAAa,CAAC,IAAIC,UAAU,CAAC,WAAW,EAAE;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC;IAElFxD,MAAM,CAACmD,oBAAoB,CAAC,CAACZ,oBAAoB,CAAC,IAAI,CAAC;EACzD,CAAC,CAAC;EAEF9C,EAAE,CAAC,2DAA2D,EAAE,YAAM;IACpE,IAAAgE,QAAA,GAAsB,IAAA9D,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAAC4B,IAAI,EAAC,UAAU;QAAC3B,OAAO,EAAE,CAAC,CAACT,GAAG,CAAC,CAAC,CAAC;MAAE,CAAE,CAAC,CAAC;MAAvFvB,SAAS,GAAA0D,QAAA,CAAT1D,SAAS;IAEjBC,MAAM,CAACD,SAAS,CAACsD,UAAU,CAACM,SAAS,CAAC,CAACzD,SAAS,CAAC,UAAU,CAAC;EAC9D,CAAC,CAAC;EAEFT,EAAE,CAAC,6DAA6D,EAAE,YAAM;IACtE,IAAAmE,QAAA,GAAsB,IAAAjE,cAAM,eAC1B3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAAC4B,IAAI,EAAC,UAAU;QAAC3B,OAAO,EAAE,CAAC,CAACT,GAAG,CAAC,CAAC,EAAEA,GAAG,CAAC,CAAC,CAAC,CAAE;QAACuC,cAAc,EAAE,CAAC,CAACvC,GAAG,CAAC,CAAC,CAAC;MAAE,CAAE,CACpG,CAAC;MAFOvB,SAAS,GAAA6D,QAAA,CAAT7D,SAAS;;IAIjB;IACAC,MAAM,CAACD,SAAS,CAACiC,gBAAgB,CAAC,QAAQ,CAAC,CAAC7C,MAAM,CAAC,CAACiC,IAAI,CAAC,CAAC,CAAC;EAC7D,CAAC,CAAC;EAEF3B,EAAE,CAAC,2BAA2B,EAAE,YAAM;IACpC,IAAAqE,QAAA,GAAoB,IAAAnE,cAAM,eAAC3C,MAAA,YAAA4C,aAAA,CAACxC,OAAA,WAAM;QAAC0E,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAACiC,oBAAoB;QAAChC,OAAO,EAAE,CAAC,CAACT,GAAG,CAAC,CAAC,CAAC;MAAE,CAAE,CAAC,CAAC;MAA1F0C,OAAO,GAAAF,QAAA,CAAPE,OAAO;IAEfhE,MAAM,CAAC;MAAA,OAAMgE,OAAO,CAAC,CAAC;IAAA,EAAC,CAACf,GAAG,CAACC,OAAO,CAAC,CAAC;EACvC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"latex-bridge.test.js","names":["_latexBridge","require","describe","it","expect","toMathLive","toEqual","undefined","concat","NEWLINE_EMBED","DEFAULT_FIELD_ID","fromMathLive","stored","forEach","l","not","toContain","toNativeCommands","out","toMatch","fieldIds","latex","keyToAction","write","type","value","command","_require","xOverBlank","k","_typeof2","toBe","keystroke","toBeUndefined"],"sources":["../../src/__tests__/latex-bridge.test.js"],"sourcesContent":["import {\n toMathLive,\n fromMathLive,\n fieldIds,\n keyToAction,\n toNativeCommands,\n NEWLINE_EMBED,\n DEFAULT_FIELD_ID,\n} from '../latex-bridge';\n\ndescribe('latex-bridge', () => {\n describe('toMathLive', () => {\n it('passes plain latex through', () => {\n expect(toMathLive('\\\\frac{1}{2}')).toEqual('\\\\frac{1}{2}');\n });\n\n it('handles empty/nullish', () => {\n expect(toMathLive('')).toEqual('');\n expect(toMathLive(undefined)).toEqual('');\n expect(toMathLive(null)).toEqual('');\n });\n\n it('converts a newLine embed to a multiline environment', () => {\n expect(toMathLive(`a${NEWLINE_EMBED}b`)).toEqual('\\\\displaylines{a \\\\\\\\ b}');\n });\n\n it('converts multiple newLine embeds', () => {\n expect(toMathLive(`a${NEWLINE_EMBED}b${NEWLINE_EMBED}c`)).toEqual('\\\\displaylines{a \\\\\\\\ b \\\\\\\\ c}');\n });\n\n it('converts MathQuill answer blocks to placeholders', () => {\n expect(toMathLive('x=\\\\MathQuillMathField[r1]{}')).toEqual('x=\\\\placeholder[r1]{}');\n });\n\n it('preserves answer block content', () => {\n expect(toMathLive('\\\\MathQuillMathField[r2]{7}')).toEqual('\\\\placeholder[r2]{7}');\n });\n\n it('defaults an unnamed answer block id', () => {\n expect(toMathLive('\\\\MathQuillMathField[]{}')).toEqual(`\\\\placeholder[${DEFAULT_FIELD_ID}]{}`);\n });\n\n it('handles answer blocks and newlines together', () => {\n expect(toMathLive(`\\\\MathQuillMathField[r1]{}${NEWLINE_EMBED}x`)).toEqual(\n '\\\\displaylines{\\\\placeholder[r1]{} \\\\\\\\ x}',\n );\n });\n });\n\n describe('fromMathLive', () => {\n it('passes plain latex through', () => {\n expect(fromMathLive('\\\\frac{1}{2}')).toEqual('\\\\frac{1}{2}');\n });\n\n it('unwraps displaylines back to newLine embeds', () => {\n expect(fromMathLive('\\\\displaylines{a \\\\\\\\ b}')).toEqual(`a${NEWLINE_EMBED}b`);\n });\n\n it('converts placeholders back to MathQuill answer blocks', () => {\n expect(fromMathLive('x=\\\\placeholder[r1]{}')).toEqual('x=\\\\MathQuillMathField[r1]{}');\n });\n\n it('round-trips a newline document', () => {\n const stored = `a${NEWLINE_EMBED}b${NEWLINE_EMBED}c`;\n\n expect(fromMathLive(toMathLive(stored))).toEqual(stored);\n });\n\n it('round-trips an answer-block document', () => {\n const stored = 'x=\\\\MathQuillMathField[r1]{}+\\\\MathQuillMathField[r2]{3}';\n\n expect(fromMathLive(toMathLive(stored))).toEqual(stored);\n });\n\n // MathLive serialises empty slots as \\placeholder{}, which MathJax (used by\n // @pie-lib/math-rendering for prompts/previews) renders as red error text.\n it('strips unnamed placeholders that MathLive adds', () => {\n expect(fromMathLive('\\\\longdiv{\\\\placeholder{}}')).toEqual('\\\\longdiv{}');\n expect(fromMathLive('\\\\frac{\\\\placeholder{}}{\\\\placeholder{}}')).toEqual('\\\\frac{}{}');\n });\n\n it('keeps content inside an unnamed placeholder', () => {\n expect(fromMathLive('\\\\sqrt{\\\\placeholder{7}}')).toEqual('\\\\sqrt{7}');\n });\n\n it('handles a bare \\\\placeholder with no argument', () => {\n expect(fromMathLive('\\\\longdiv{\\\\placeholder}')).toEqual('\\\\longdiv{}');\n });\n\n it('never leaks the token \\\\placeholder', () => {\n ['\\\\longdiv{\\\\placeholder{}}', '\\\\frac{\\\\placeholder{}}{x}', '\\\\placeholder{}'].forEach((l) => {\n expect(fromMathLive(l)).not.toContain('\\\\placeholder');\n });\n });\n\n it('still maps NAMED placeholders to answer blocks', () => {\n // named ones are answer blocks and must survive\n expect(fromMathLive('\\\\placeholder[r1]{}')).toEqual('\\\\MathQuillMathField[r1]{}');\n });\n\n it('round-trips answer blocks combined with newlines', () => {\n const stored = `\\\\MathQuillMathField[r1]{}${NEWLINE_EMBED}y`;\n\n expect(fromMathLive(toMathLive(stored))).toEqual(stored);\n });\n });\n\n // A MathLive macro serialises from the arguments it was created with, so text\n // typed inside its expansion never comes back out of getValue('latex').\n // Argument-taking pie commands must therefore become native constructs before\n // they reach a mathfield.\n describe('toNativeCommands', () => {\n it('expands \\\\longdiv to native \\\\enclose', () => {\n expect(toNativeCommands('\\\\longdiv{1234}')).toEqual('\\\\enclose{longdiv}{1234}');\n expect(toNativeCommands('\\\\longdiv{}')).toEqual('\\\\enclose{longdiv}{}');\n });\n\n it('expands \\\\overarc to native \\\\overparen', () => {\n expect(toNativeCommands('\\\\overarc{AB}')).toEqual('\\\\overparen{AB}');\n });\n\n it('expands \\\\abs to native \\\\left|..\\\\right|', () => {\n expect(toNativeCommands('\\\\abs{x}')).toEqual('\\\\left|x\\\\right|');\n expect(toNativeCommands('\\\\abs{}')).toEqual('\\\\left|\\\\right|');\n });\n\n it('handles nested braces inside \\\\abs', () => {\n expect(toNativeCommands('\\\\abs{\\\\frac{1}{2}}')).toEqual('\\\\left|\\\\frac{1}{2}\\\\right|');\n });\n\n it('handles several occurrences', () => {\n expect(toNativeCommands('\\\\abs{a}+\\\\abs{b}')).toEqual('\\\\left|a\\\\right|+\\\\left|b\\\\right|');\n expect(toNativeCommands('\\\\longdiv{1}\\\\longdiv{2}')).toEqual('\\\\enclose{longdiv}{1}\\\\enclose{longdiv}{2}');\n });\n\n it('leaves other latex untouched', () => {\n ['\\\\frac{1}{2}', '\\\\pi', '\\\\sqrt{x}', '\\\\overline{AB}'].forEach((l) => {\n expect(toNativeCommands(l)).toEqual(l);\n });\n });\n\n it('handles nullish input', () => {\n expect(toNativeCommands(undefined)).toEqual('');\n expect(toNativeCommands('')).toEqual('');\n });\n\n it('is applied by toMathLive', () => {\n expect(toMathLive('\\\\longdiv{5}')).toEqual('\\\\enclose{longdiv}{5}');\n });\n\n it('does not leave a pie macro in what reaches the field', () => {\n ['\\\\longdiv{7}', '\\\\abs{7}', '\\\\overarc{7}'].forEach((l) => {\n const out = toMathLive(l);\n\n expect(out).not.toMatch(/\\\\longdiv|\\\\abs|\\\\overarc/);\n });\n });\n });\n\n describe('fieldIds', () => {\n it('returns ids in document order', () => {\n expect(fieldIds('\\\\MathQuillMathField[r1]{}+\\\\MathQuillMathField[r2]{}')).toEqual(['r1', 'r2']);\n });\n\n it('returns [] when there are none', () => {\n expect(fieldIds('x+y')).toEqual([]);\n expect(fieldIds(undefined)).toEqual([]);\n });\n\n it('is repeatable (regex lastIndex is reset)', () => {\n const latex = '\\\\MathQuillMathField[r1]{}';\n\n expect(fieldIds(latex)).toEqual(['r1']);\n expect(fieldIds(latex)).toEqual(['r1']);\n });\n });\n\n describe('keyToAction', () => {\n it('prefers latex when there is no command', () => {\n expect(keyToAction({ latex: '\\\\pi', write: 'p' })).toEqual({ type: 'insert', value: '\\\\pi' });\n });\n\n it('uses write', () => {\n expect(keyToAction({ write: 'x' })).toEqual({ type: 'insert', value: 'x' });\n });\n\n it('expands commands that take arguments into placeholders', () => {\n expect(keyToAction({ command: '\\\\frac' })).toEqual({ type: 'insert', value: '\\\\frac{#?}{#?}' });\n expect(keyToAction({ command: '\\\\sqrt' })).toEqual({ type: 'insert', value: '\\\\sqrt{#?}' });\n expect(keyToAction({ command: '^' })).toEqual({ type: 'insert', value: '^{#?}' });\n });\n\n // MathQuill's `/` turned the preceding expression into the numerator: type\n // 5, press the key, get 5/_ with the caret in the denominator. `#@` is\n // MathLive's \"selection, or the item before the cursor\" token, and is what\n // MathLive binds to `/` itself.\n it('division takes the preceding item as the numerator', () => {\n expect(keyToAction({ command: '/' })).toEqual({ type: 'insert', value: '\\\\frac{#@}{#?}' });\n });\n\n it('an explicit blank-over-blank fraction stays empty', () => {\n // distinct from `/`: this key is meant to insert two empty slots\n expect(keyToAction({ command: '\\\\frac' })).toEqual({ type: 'insert', value: '\\\\frac{#?}{#?}' });\n });\n\n it('the x-over-blank key routes through division', () => {\n // eslint-disable-next-line global-require\n const { xOverBlank } = require('../keys/fractions');\n\n expect(xOverBlank.command).toEqual('/');\n expect(keyToAction(xOverBlank).value).toEqual('\\\\frac{#@}{#?}');\n });\n\n it('passes argument-less commands through', () => {\n expect(keyToAction({ command: '\\\\pi' })).toEqual({ type: 'insert', value: '\\\\pi' });\n });\n\n it('concatenates array commands (MathQuill cmd() applied them in sequence)', () => {\n // Measured Angle\n expect(keyToAction({ command: ['m', '\\\\angle'] })).toEqual({ type: 'insert', value: 'm\\\\angle' });\n // log base n - the `_` part must still expand to a placeholder\n expect(keyToAction({ command: ['\\\\log', '_'] })).toEqual({ type: 'insert', value: '\\\\log_{#?}' });\n });\n\n it('always returns a string value for insert actions', () => {\n [{ command: ['m', '\\\\angle'] }, { command: '\\\\frac' }, { write: 'x' }, { latex: '\\\\pi' }].forEach((k) => {\n expect(typeof keyToAction(k).value).toBe('string');\n });\n });\n\n it('maps keystrokes to MathLive selectors', () => {\n expect(keyToAction({ keystroke: 'Left' })).toEqual({ type: 'command', value: 'moveToPreviousChar' });\n expect(keyToAction({ keystroke: 'Right' })).toEqual({ type: 'command', value: 'moveToNextChar' });\n expect(keyToAction({ keystroke: 'Backspace' })).toEqual({ type: 'command', value: 'deleteBackward' });\n });\n\n it('returns undefined for unknown/empty input', () => {\n expect(keyToAction(undefined)).toBeUndefined();\n expect(keyToAction({})).toBeUndefined();\n expect(keyToAction({ keystroke: 'Nope' })).toBeUndefined();\n });\n\n it('latex wins over command only when command is absent', () => {\n // a key with both should use the command path (matches MathInput.keypadPress)\n expect(keyToAction({ latex: '\\\\frac{}{}', command: '\\\\frac' })).toEqual({\n type: 'insert',\n value: '\\\\frac{#?}{#?}',\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mathlive-instance.test.js","names":["describe","instance","beforeEach","jest","resetModules","require","__resetEmbeds","it","registerEmbed","htmlString","latex","expect","registeredEmbeds","toEqual","getMacros","answerBlock","newLine","somethingCustom","mathliveLatex","custom","Error","not","toThrow","undefined","macros","parallelogram","toBeDefined","longdiv","napprox","forEach","name","_typeof2","PIE_MACROS","toBe","toContain","applyStaticMath","toBeUndefined","el","document","createElement","__setMathLiveForTest","convertLatexToMarkup","l","concat","innerHTML","textContent","configureFonts","MathfieldElement","fontsDirectory","baseURI","replace","startsWith","version","mathlive","toBeNull","host","attachShadow","mode","applyShadowStyles","viaSheet","shadowRoot","__pieAccentSheet","viaStyle","querySelector","css","toBeTruthy","styles","querySelectorAll","length","latexToMarkup"],"sources":["../../src/__tests__/mathlive-instance.test.js"],"sourcesContent":["describe('mathlive-instance', () => {\n let instance;\n\n beforeEach(() => {\n jest.resetModules();\n // eslint-disable-next-line global-require\n instance = require('../mathlive-instance');\n instance.__resetEmbeds();\n });\n\n describe('registerEmbed', () => {\n it('registers a known embed and exposes it as a macro', () => {\n instance.registerEmbed('answerBlock', () => ({\n htmlString: '<div class=\"answerBlock\"></div>',\n latex: () => '\\\\embed{answerBlock}[]',\n }));\n\n expect(instance.registeredEmbeds()).toEqual(['answerBlock']);\n // The macro tags output with data-embed so CSS can target it, replacing\n // MathQuill's htmlString hook.\n expect(instance.getMacros().answerBlock).toEqual('\\\\htmlData{embed=answerBlock}{\\\\placeholder{}}');\n });\n\n it('registers newLine as a harmless macro (it is handled by latex-bridge)', () => {\n instance.registerEmbed('newLine', () => ({ latex: () => '\\\\embed{newLine}[]' }));\n\n expect(instance.getMacros().newLine).toEqual('\\\\htmlData{embed=newLine}{}');\n });\n\n it('falls back to a placeholder for an unknown embed', () => {\n instance.registerEmbed('somethingCustom', () => ({ htmlString: '<b>x</b>' }));\n\n expect(instance.getMacros().somethingCustom).toEqual('\\\\htmlData{embed=somethingCustom}{\\\\placeholder{}}');\n });\n\n it('honours an explicit mathliveLatex from the factory', () => {\n instance.registerEmbed('custom', () => ({ mathliveLatex: '\\\\alpha' }));\n\n expect(instance.getMacros().custom).toEqual('\\\\htmlData{embed=custom}{\\\\alpha}');\n });\n\n it('does not throw when the factory throws', () => {\n expect(() =>\n instance.registerEmbed('bad', () => {\n throw new Error('boom');\n }),\n ).not.toThrow();\n\n expect(instance.registeredEmbeds()).toEqual(['bad']);\n });\n\n it('ignores bad arguments', () => {\n instance.registerEmbed(undefined, () => ({}));\n instance.registerEmbed('noFactory', undefined);\n\n expect(instance.registeredEmbeds()).toEqual([]);\n });\n\n it('always includes the pie macro set', () => {\n const macros = instance.getMacros();\n\n expect(macros.parallelogram).toBeDefined();\n expect(macros.longdiv).toBeDefined();\n expect(macros.napprox).toEqual('\\\\not\\\\approx');\n });\n\n // Argument-taking macros exist only so previously authored latex parses.\n // Editing never goes through them: MathLive serialises a macro from its\n // original arguments, so typed content never comes back out.\n it('argument-taking macros are plain parse-only definitions', () => {\n ['longdiv', 'overarc', 'abs'].forEach((name) => {\n expect(typeof instance.PIE_MACROS[name]).toBe('string');\n expect(instance.PIE_MACROS[name]).toContain('#1');\n });\n });\n\n it('argument-less symbols stay atomic', () => {\n ['perpendicular', 'square', 'degree', 'napprox', 'parallelogram'].forEach((name) => {\n expect(typeof instance.PIE_MACROS[name]).toBe('string');\n });\n });\n\n it('longdiv matches the MathJax macro used by math-rendering', () => {\n expect(instance.PIE_MACROS.longdiv).toEqual('\\\\enclose{longdiv}{#1}');\n });\n });\n\n describe('applyStaticMath', () => {\n it('returns undefined without an element', () => {\n expect(instance.applyStaticMath(null, 'x')).toBeUndefined();\n });\n\n it('defers (returns undefined) when MathLive has not loaded', () => {\n const el = document.createElement('div');\n\n expect(instance.applyStaticMath(el, 'x')).toBeUndefined();\n });\n\n it('renders synchronously once MathLive is available', () => {\n const el = document.createElement('div');\n\n instance.__setMathLiveForTest({ convertLatexToMarkup: (l) => `<span>${l}</span>` });\n\n expect(instance.applyStaticMath(el, '\\\\pi')).toBe(el);\n expect(el.innerHTML).toEqual('<span>\\\\pi</span>');\n });\n\n it('falls back to the element textContent when no latex is passed', () => {\n const el = document.createElement('div');\n\n el.textContent = '\\\\theta';\n instance.__setMathLiveForTest({ convertLatexToMarkup: (l) => `<i>${l}</i>` });\n instance.applyStaticMath(el);\n\n expect(el.innerHTML).toEqual('<i>\\\\theta</i>');\n });\n\n it('bridges stored latex (newLine embed) before rendering', () => {\n const el = document.createElement('div');\n\n instance.__setMathLiveForTest({ convertLatexToMarkup: (l) => l });\n instance.applyStaticMath(el, 'a\\\\embed{newLine}[]b');\n\n // \\embed{newLine}[] must become a multiline environment\n expect(el.innerHTML).toContain('displaylines');\n });\n });\n\n describe('configureFonts', () => {\n // MathLive's default fontsDirectory is the relative './fonts/', which it\n // resolves against its own (empty, when bundled) script url and throws\n // \"Invalid base URL\" from loadFonts. Paths must become absolute.\n it('is exported and callable before MathLive loads', () => {\n expect(typeof instance.configureFonts).toBe('function');\n expect(() => instance.configureFonts('/mathlive-fonts')).not.toThrow();\n });\n\n it('accepts null to disable font loading', () => {\n expect(() => instance.configureFonts(null)).not.toThrow();\n });\n\n it('applies an absolute url to an already-loaded MathfieldElement', () => {\n const MathfieldElement = {};\n\n // simulate a loaded instance\n instance.__setMathLiveForTest({ MathfieldElement });\n instance.configureFonts('/mathlive-fonts');\n\n expect(MathfieldElement.fontsDirectory).toEqual(`${document.baseURI.replace(/\\/$/, '')}/mathlive-fonts`);\n expect(MathfieldElement.fontsDirectory.startsWith('http')).toBe(true);\n });\n\n // \\neq, \\nsim and \\ncong are built from Private Use Area glyphs that only\n // the KaTeX fonts contain, so \"no fonts\" renders garbage rather than\n // degrading gracefully - hence a CDN fallback by default.\n it('falls back to a version-pinned CDN when nothing is configured', () => {\n const MathfieldElement = {};\n\n instance.__setMathLiveForTest({ MathfieldElement, version: { mathlive: '9.9.9' } });\n instance.configureFonts(undefined);\n\n expect(MathfieldElement.fontsDirectory).toEqual('https://unpkg.com/mathlive@9.9.9/fonts');\n });\n\n it('uses /fonts, not /dist/fonts (the latter 404s on unpkg)', () => {\n const MathfieldElement = {};\n\n instance.__setMathLiveForTest({ MathfieldElement, version: { mathlive: '0.110.0' } });\n instance.configureFonts(undefined);\n\n expect(MathfieldElement.fontsDirectory).toEqual('https://unpkg.com/mathlive@0.110.0/fonts');\n expect(MathfieldElement.fontsDirectory).not.toContain('/dist/');\n });\n\n it('a configured path wins over the CDN', () => {\n const MathfieldElement = {};\n\n instance.__setMathLiveForTest({ MathfieldElement, version: { mathlive: '0.110.0' } });\n instance.configureFonts('/mathlive-fonts');\n\n expect(MathfieldElement.fontsDirectory).not.toContain('unpkg.com');\n });\n\n it('null still opts out entirely', () => {\n const MathfieldElement = {};\n\n instance.__setMathLiveForTest({ MathfieldElement, version: { mathlive: '0.110.0' } });\n instance.configureFonts(null);\n\n expect(MathfieldElement.fontsDirectory).toBeNull();\n });\n\n it('leaves a fully-qualified url untouched', () => {\n const MathfieldElement = {};\n\n instance.__setMathLiveForTest({ MathfieldElement });\n instance.configureFonts('https://cdn.example.com/fonts');\n\n expect(MathfieldElement.fontsDirectory).toEqual('https://cdn.example.com/fonts');\n });\n\n it('passes null through rather than resolving it', () => {\n const MathfieldElement = {};\n\n instance.__setMathLiveForTest({ MathfieldElement });\n instance.configureFonts(null);\n\n expect(MathfieldElement.fontsDirectory).toBeNull();\n });\n });\n\n // A live <math-field> renders in shadow DOM, so nothing in the page's\n // stylesheets reaches it - the stretchy-accent fix has to be injected there.\n describe('applyShadowStyles', () => {\n const host = () => {\n const el = document.createElement('div');\n\n el.attachShadow({ mode: 'open' });\n\n return el;\n };\n\n it('is a no-op without a shadow root', () => {\n expect(() => instance.applyShadowStyles(undefined)).not.toThrow();\n expect(() => instance.applyShadowStyles(document.createElement('div'))).not.toThrow();\n });\n\n it('injects the accent fix into the shadow root', () => {\n const el = host();\n\n instance.applyShadowStyles(el);\n\n const viaSheet = el.shadowRoot.__pieAccentSheet;\n const viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');\n const css = viaSheet ? 'adopted' : (viaStyle && viaStyle.textContent) || '';\n\n expect(viaSheet || viaStyle).toBeTruthy();\n\n if (viaStyle) {\n expect(css).toContain('margin-left:0 !important');\n // scoped so single-glyph accents keep their centring offset\n expect(css).toContain(':has(.ML__stretchy)');\n }\n });\n\n it('does not inject twice', () => {\n const el = host();\n\n instance.applyShadowStyles(el);\n instance.applyShadowStyles(el);\n\n const styles = el.shadowRoot.querySelectorAll('style[data-pie-accent]');\n\n // either one adopted sheet, or exactly one style node\n expect(el.shadowRoot.__pieAccentSheet ? 1 : styles.length).toBe(1);\n });\n });\n\n describe('latexToMarkup', () => {\n it('returns empty string when MathLive is not loaded', () => {\n expect(instance.latexToMarkup('\\\\pi')).toEqual('');\n });\n\n it('returns empty string for empty latex', () => {\n expect(instance.latexToMarkup('')).toEqual('');\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mount-race.test.js","names":["_input","_interopRequireDefault","require","jest","mock","FakeMathfieldElement","_createClass2","_classCallCheck2","el","global","document","createElement","value","getValue","loadMathLive","Promise","resolve","MathfieldElement","getMacros","MATH_MODE_SPACE","applyShadowStyles","latexToMarkup","l","concat","holderFor","cmp","holderRef","current","fieldCount","Array","from","childNodes","filter","n","tagName","length","describe","it","_asyncToGenerator2","_regenerator","mark","_callee","input","first","second","wrap","_context","prev","next","Input","componentDidMount","componentWillUnmount","all","expect","toBe","mathField","toBeDefined","stop","_callee2","pending","_context2","toBeUndefined","_callee3","_context3","_callee4","_context4","_callee5","_context5","mathModeSpace","toEqual","not","_callee6","innerRef","_context6","fn","toHaveBeenCalledWith","toHaveBeenLastCalledWith"],"sources":["../../src/__tests__/mount-race.test.jsx"],"sourcesContent":["/**\n * MathLive loads asynchronously, so `componentDidMount` resumes after an await\n * before appending a <math-field>. Two orderings must both hold:\n *\n * - StrictMode dev double-mount (mount -> unmount -> mount on the SAME\n * instance) must end up with exactly ONE field. A boolean \"unmounted\" flag\n * latches here and blocks the remount entirely - which is why this uses a\n * generation counter.\n * - A genuine unmount while the load is in flight must append nothing.\n *\n * MathLive cannot load under jsdom, so it is mocked with a minimal stub in\n * order to actually count appended fields.\n */\njest.mock('../mathlive-instance', () => {\n // Must be a real DOM node: the component uses replaceChildren(), which\n // rejects anything that is not a Node. Returning an element from the\n // constructor replaces `this`, so callers get a genuine <math-field>.\n class FakeMathfieldElement {\n constructor() {\n // `global` rather than `document`: jest forbids out-of-scope variables in\n // a mock factory, and `global` is on its allow-list.\n const el = global.document.createElement('math-field');\n\n el.value = '';\n el.getValue = () => el.value;\n\n return el;\n }\n }\n\n return {\n loadMathLive: () => Promise.resolve({ MathfieldElement: FakeMathfieldElement }),\n getMacros: () => ({}),\n // must mirror the real export, otherwise the component sets `undefined`\n MATH_MODE_SPACE: '\\\\ ',\n applyShadowStyles: () => {},\n latexToMarkup: (l) => `<span>${l}</span>`,\n };\n});\n\n// eslint-disable-next-line import/first\nimport Input from '../mf/input';\n\nconst holderFor = (cmp) => {\n const el = document.createElement('span');\n\n cmp.holderRef = { current: el };\n\n return el;\n};\n\nconst fieldCount = (el) => Array.from(el.childNodes).filter((n) => n.tagName === 'MATH-FIELD').length;\n\ndescribe('async mount race', () => {\n it('StrictMode mount -> unmount -> mount yields exactly one field', async () => {\n const input = new Input({});\n const el = holderFor(input);\n\n const first = input.componentDidMount();\n\n input.componentWillUnmount();\n\n const second = input.componentDidMount();\n\n await Promise.all([first, second]);\n\n expect(fieldCount(el)).toBe(1);\n expect(input.mathField).toBeDefined();\n });\n\n it('appends nothing when unmounted while the load is in flight', async () => {\n const input = new Input({});\n const el = holderFor(input);\n\n const pending = input.componentDidMount();\n\n input.componentWillUnmount();\n\n await pending;\n\n expect(fieldCount(el)).toBe(0);\n expect(input.mathField).toBeUndefined();\n });\n\n it('a normal single mount creates the field', async () => {\n const input = new Input({});\n const el = holderFor(input);\n\n await input.componentDidMount();\n\n expect(fieldCount(el)).toBe(1);\n });\n\n it('repeated mounts never accumulate fields', async () => {\n const input = new Input({});\n const el = holderFor(input);\n\n await input.componentDidMount();\n await input.componentDidMount();\n await input.componentDidMount();\n\n expect(fieldCount(el)).toBe(1);\n });\n\n // MathLive's mathModeSpace defaults to '', which makes the spacebar a no-op.\n it('configures the spacebar so a space can be typed', async () => {\n const input = new Input({});\n\n holderFor(input);\n await input.componentDidMount();\n\n // a LaTeX control space - what MathQuill produced, and MathJax understands\n expect(input.mathField.mathModeSpace).toEqual('\\\\ ');\n expect(input.mathField.mathModeSpace).not.toEqual('');\n });\n\n it('reports itself through innerRef on mount and clears it on unmount', async () => {\n const innerRef = jest.fn();\n const input = new Input({ innerRef });\n\n holderFor(input);\n await input.componentDidMount();\n\n expect(innerRef).toHaveBeenCalledWith(input);\n\n input.componentWillUnmount();\n\n expect(innerRef).toHaveBeenLastCalledWith(null);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|