@pie-lib/math-input-mathlive 1.0.11 → 1.0.12

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.
Files changed (41) hide show
  1. package/lib/keys/misc.js +9 -2
  2. package/lib/keys/misc.js.map +1 -1
  3. package/lib/latex-bridge.js +30 -0
  4. package/lib/latex-bridge.js.map +1 -1
  5. package/lib/mathlive-instance.js +67 -3
  6. package/lib/mathlive-instance.js.map +1 -1
  7. package/lib/mf/input.js +7 -0
  8. package/lib/mf/input.js.map +1 -1
  9. package/lib/mf/static.js +82 -1
  10. package/lib/mf/static.js.map +1 -1
  11. package/package.json +1 -1
  12. package/src/__tests__/keypad-label.test.jsx +58 -5
  13. package/src/__tests__/latex-bridge.test.js +22 -0
  14. package/src/__tests__/mathlive-instance.test.js +128 -0
  15. package/src/__tests__/mount-race.test.jsx +1 -0
  16. package/src/__tests__/static-prompts.test.jsx +113 -0
  17. package/src/keys/misc.js +8 -2
  18. package/src/latex-bridge.js +34 -0
  19. package/src/mathlive-instance.js +75 -1
  20. package/src/mf/input.jsx +15 -1
  21. package/src/mf/static.jsx +94 -2
  22. package/lib/__tests__/composites.test.js +0 -255
  23. package/lib/__tests__/composites.test.js.map +0 -1
  24. package/lib/__tests__/drop-in-compat.test.js +0 -133
  25. package/lib/__tests__/drop-in-compat.test.js.map +0 -1
  26. package/lib/__tests__/index.test.js +0 -118
  27. package/lib/__tests__/index.test.js.map +0 -1
  28. package/lib/__tests__/input-imperative.test.js +0 -155
  29. package/lib/__tests__/input-imperative.test.js.map +0 -1
  30. package/lib/__tests__/keypad-label.test.js +0 -118
  31. package/lib/__tests__/keypad-label.test.js.map +0 -1
  32. package/lib/__tests__/keypad-render.test.js +0 -206
  33. package/lib/__tests__/keypad-render.test.js.map +0 -1
  34. package/lib/__tests__/latex-bridge.test.js +0 -280
  35. package/lib/__tests__/latex-bridge.test.js.map +0 -1
  36. package/lib/__tests__/mathlive-instance.test.js +0 -279
  37. package/lib/__tests__/mathlive-instance.test.js.map +0 -1
  38. package/lib/__tests__/mount-race.test.js +0 -195
  39. package/lib/__tests__/mount-race.test.js.map +0 -1
  40. package/lib/__tests__/static-prompts.test.js +0 -282
  41. package/lib/__tests__/static-prompts.test.js.map +0 -1
@@ -1,206 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
- var _react = _interopRequireDefault(require("react"));
9
- var _react2 = require("@testing-library/react");
10
- var _keypad = _interopRequireWildcard(require("../keypad"));
11
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
12
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
- /**
15
- * Keypad behaviour that is new in this package: labels are static markup from
16
- * convertLatexToMarkup (the MathQuill version created a live StaticMath per
17
- * button), with a raw-latex fallback when the engine is unavailable.
18
- */
19
- describe('LatexLabel', function () {
20
- it('falls back to raw latex when MathLive is unavailable', function () {
21
- // jsdom cannot load MathLive, so latexToMarkup returns '' - the button must
22
- // still show something rather than render blank.
23
- var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
24
- latex: '\\pi'
25
- })),
26
- container = _render.container;
27
- expect(container.textContent).toContain('\\pi');
28
- });
29
- it('re-renders when the latex prop changes', function () {
30
- var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
31
- latex: '\\pi'
32
- })),
33
- container = _render2.container,
34
- rerender = _render2.rerender;
35
- rerender(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
36
- latex: '\\theta'
37
- }));
38
- expect(container.textContent).toContain('\\theta');
39
- });
40
- it('does not warn more than once about a missing engine', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
41
- var a, b;
42
- return _regenerator["default"].wrap(function (_context) {
43
- while (1) switch (_context.prev = _context.next) {
44
- case 0:
45
- _keypad.LatexLabel.warned = false;
46
- a = new _keypad.LatexLabel({
47
- latex: '\\pi'
48
- });
49
- b = new _keypad.LatexLabel({
50
- latex: '\\theta'
51
- });
52
- a.state = {
53
- markup: ''
54
- };
55
- b.state = {
56
- markup: ''
57
- };
58
- a.setState = function () {};
59
- b.setState = function () {};
60
- _context.next = 1;
61
- return a.componentDidMount();
62
- case 1:
63
- _context.next = 2;
64
- return b.componentDidMount();
65
- case 2:
66
- expect(_keypad.LatexLabel.warned).toBe(true);
67
- case 3:
68
- case "end":
69
- return _context.stop();
70
- }
71
- }, _callee);
72
- })));
73
- });
74
- describe('KeyPad', function () {
75
- var key = function key() {
76
- var over = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
77
- return _objectSpread({
78
- name: 'x',
79
- label: 'x',
80
- write: 'x',
81
- category: 'vars'
82
- }, over);
83
- };
84
- it('renders a button per key', function () {
85
- var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
86
- onPress: function onPress() {},
87
- baseSet: [[key(), key({
88
- name: 'y',
89
- label: 'y'
90
- })]]
91
- })),
92
- container = _render3.container;
93
- expect(container.querySelectorAll('button').length).toBe(2);
94
- });
95
- it('calls onPress with the whole key definition', function () {
96
- var onPress = jest.fn();
97
- var k = key();
98
- var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
99
- onPress: onPress,
100
- baseSet: [[k]]
101
- })),
102
- container = _render4.container;
103
- container.querySelector('button').click();
104
- expect(onPress).toHaveBeenCalledWith(k);
105
- });
106
- it('renders a latex key through LatexLabel', function () {
107
- var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
108
- onPress: function onPress() {},
109
- baseSet: [[{
110
- name: 'pi',
111
- latex: '\\pi'
112
- }]]
113
- })),
114
- container = _render5.container;
115
- expect(container.textContent).toContain('\\pi');
116
- });
117
- it('disables the decimal separators when noDecimal is set', function () {
118
- var dot = key({
119
- name: '.',
120
- label: '.',
121
- write: '.'
122
- });
123
- var comma = key({
124
- name: ',',
125
- label: ',',
126
- write: ','
127
- });
128
- var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
129
- onPress: function onPress() {},
130
- noDecimal: true,
131
- baseSet: [[dot, comma]]
132
- })),
133
- container = _render6.container;
134
- var disabled = Array.from(container.querySelectorAll('button')).filter(function (b) {
135
- return b.disabled;
136
- });
137
- expect(disabled.length).toBe(2);
138
- });
139
- it('leaves the separators enabled otherwise', function () {
140
- var dot = key({
141
- name: '.',
142
- label: '.',
143
- write: '.'
144
- });
145
- var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
146
- onPress: function onPress() {},
147
- baseSet: [[dot]]
148
- })),
149
- container = _render7.container;
150
- expect(container.querySelector('button').disabled).toBe(false);
151
- });
152
- it('renders a placeholder for empty grid slots', function () {
153
- expect(function () {
154
- return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
155
- onPress: function onPress() {},
156
- baseSet: [[null]]
157
- }));
158
- }).not.toThrow();
159
- });
160
- it('notifies setKeypadInteraction on pointer interaction', function () {
161
- var setKeypadInteraction = jest.fn();
162
- var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
163
- onPress: function onPress() {},
164
- setKeypadInteraction: setKeypadInteraction,
165
- baseSet: [[key()]]
166
- })),
167
- container = _render8.container;
168
- container.firstChild.dispatchEvent(new MouseEvent('mousedown', {
169
- bubbles: true
170
- }));
171
- expect(setKeypadInteraction).toHaveBeenCalledWith(true);
172
- });
173
- it('uses the mode as a class so mode-specific styling applies', function () {
174
- var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
175
- onPress: function onPress() {},
176
- mode: "language",
177
- baseSet: [[key()]]
178
- })),
179
- container = _render9.container;
180
- expect(container.firstChild.className).toContain('language');
181
- });
182
- it('drops the base set for the modes that supply their own keys', function () {
183
- var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
184
- onPress: function onPress() {},
185
- mode: "language",
186
- baseSet: [[key(), key()]],
187
- additionalKeys: [[key()]]
188
- })),
189
- container = _render0.container;
190
-
191
- // base set ignored, only the additional key renders
192
- expect(container.querySelectorAll('button').length).toBe(1);
193
- });
194
- it('unmounts without throwing', function () {
195
- var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
196
- onPress: function onPress() {},
197
- controlledKeypadMode: true,
198
- baseSet: [[key()]]
199
- })),
200
- unmount = _render1.unmount;
201
- expect(function () {
202
- return unmount();
203
- }).not.toThrow();
204
- });
205
- });
206
- //# sourceMappingURL=keypad-render.test.js.map
@@ -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":"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","ignoreList":[]}
@@ -1,280 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
- var _latexBridge = require("../latex-bridge");
6
- describe('latex-bridge', function () {
7
- describe('toMathLive', function () {
8
- it('passes plain latex through', function () {
9
- expect((0, _latexBridge.toMathLive)('\\frac{1}{2}')).toEqual('\\frac{1}{2}');
10
- });
11
- it('handles empty/nullish', function () {
12
- expect((0, _latexBridge.toMathLive)('')).toEqual('');
13
- expect((0, _latexBridge.toMathLive)(undefined)).toEqual('');
14
- expect((0, _latexBridge.toMathLive)(null)).toEqual('');
15
- });
16
- it('converts a newLine embed to a multiline environment', function () {
17
- expect((0, _latexBridge.toMathLive)("a".concat(_latexBridge.NEWLINE_EMBED, "b"))).toEqual('\\displaylines{a \\\\ b}');
18
- });
19
- it('converts multiple newLine embeds', function () {
20
- expect((0, _latexBridge.toMathLive)("a".concat(_latexBridge.NEWLINE_EMBED, "b").concat(_latexBridge.NEWLINE_EMBED, "c"))).toEqual('\\displaylines{a \\\\ b \\\\ c}');
21
- });
22
- it('converts MathQuill answer blocks to placeholders', function () {
23
- expect((0, _latexBridge.toMathLive)('x=\\MathQuillMathField[r1]{}')).toEqual('x=\\placeholder[r1]{}');
24
- });
25
- it('preserves answer block content', function () {
26
- expect((0, _latexBridge.toMathLive)('\\MathQuillMathField[r2]{7}')).toEqual('\\placeholder[r2]{7}');
27
- });
28
- it('defaults an unnamed answer block id', function () {
29
- expect((0, _latexBridge.toMathLive)('\\MathQuillMathField[]{}')).toEqual("\\placeholder[".concat(_latexBridge.DEFAULT_FIELD_ID, "]{}"));
30
- });
31
- it('handles answer blocks and newlines together', function () {
32
- expect((0, _latexBridge.toMathLive)("\\MathQuillMathField[r1]{}".concat(_latexBridge.NEWLINE_EMBED, "x"))).toEqual('\\displaylines{\\placeholder[r1]{} \\\\ x}');
33
- });
34
- });
35
- describe('fromMathLive', function () {
36
- it('passes plain latex through', function () {
37
- expect((0, _latexBridge.fromMathLive)('\\frac{1}{2}')).toEqual('\\frac{1}{2}');
38
- });
39
- it('unwraps displaylines back to newLine embeds', function () {
40
- expect((0, _latexBridge.fromMathLive)('\\displaylines{a \\\\ b}')).toEqual("a".concat(_latexBridge.NEWLINE_EMBED, "b"));
41
- });
42
- it('converts placeholders back to MathQuill answer blocks', function () {
43
- expect((0, _latexBridge.fromMathLive)('x=\\placeholder[r1]{}')).toEqual('x=\\MathQuillMathField[r1]{}');
44
- });
45
- it('round-trips a newline document', function () {
46
- var stored = "a".concat(_latexBridge.NEWLINE_EMBED, "b").concat(_latexBridge.NEWLINE_EMBED, "c");
47
- expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
48
- });
49
- it('round-trips an answer-block document', function () {
50
- var stored = 'x=\\MathQuillMathField[r1]{}+\\MathQuillMathField[r2]{3}';
51
- expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
52
- });
53
-
54
- // MathLive serialises empty slots as \placeholder{}, which MathJax (used by
55
- // @pie-lib/math-rendering for prompts/previews) renders as red error text.
56
- it('strips unnamed placeholders that MathLive adds', function () {
57
- expect((0, _latexBridge.fromMathLive)('\\longdiv{\\placeholder{}}')).toEqual('\\longdiv{}');
58
- expect((0, _latexBridge.fromMathLive)('\\frac{\\placeholder{}}{\\placeholder{}}')).toEqual('\\frac{}{}');
59
- });
60
- it('keeps content inside an unnamed placeholder', function () {
61
- expect((0, _latexBridge.fromMathLive)('\\sqrt{\\placeholder{7}}')).toEqual('\\sqrt{7}');
62
- });
63
- it('handles a bare \\placeholder with no argument', function () {
64
- expect((0, _latexBridge.fromMathLive)('\\longdiv{\\placeholder}')).toEqual('\\longdiv{}');
65
- });
66
- it('never leaks the token \\placeholder', function () {
67
- ['\\longdiv{\\placeholder{}}', '\\frac{\\placeholder{}}{x}', '\\placeholder{}'].forEach(function (l) {
68
- expect((0, _latexBridge.fromMathLive)(l)).not.toContain('\\placeholder');
69
- });
70
- });
71
- it('still maps NAMED placeholders to answer blocks', function () {
72
- // named ones are answer blocks and must survive
73
- expect((0, _latexBridge.fromMathLive)('\\placeholder[r1]{}')).toEqual('\\MathQuillMathField[r1]{}');
74
- });
75
- it('round-trips answer blocks combined with newlines', function () {
76
- var stored = "\\MathQuillMathField[r1]{}".concat(_latexBridge.NEWLINE_EMBED, "y");
77
- expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
78
- });
79
- });
80
-
81
- // A MathLive macro serialises from the arguments it was created with, so text
82
- // typed inside its expansion never comes back out of getValue('latex').
83
- // Argument-taking pie commands must therefore become native constructs before
84
- // they reach a mathfield.
85
- describe('toNativeCommands', function () {
86
- it('expands \\longdiv to native \\enclose', function () {
87
- expect((0, _latexBridge.toNativeCommands)('\\longdiv{1234}')).toEqual('\\enclose{longdiv}{1234}');
88
- expect((0, _latexBridge.toNativeCommands)('\\longdiv{}')).toEqual('\\enclose{longdiv}{}');
89
- });
90
- it('expands \\overarc to native \\overparen', function () {
91
- expect((0, _latexBridge.toNativeCommands)('\\overarc{AB}')).toEqual('\\overparen{AB}');
92
- });
93
- it('expands \\abs to native \\left|..\\right|', function () {
94
- expect((0, _latexBridge.toNativeCommands)('\\abs{x}')).toEqual('\\left|x\\right|');
95
- expect((0, _latexBridge.toNativeCommands)('\\abs{}')).toEqual('\\left|\\right|');
96
- });
97
- it('handles nested braces inside \\abs', function () {
98
- expect((0, _latexBridge.toNativeCommands)('\\abs{\\frac{1}{2}}')).toEqual('\\left|\\frac{1}{2}\\right|');
99
- });
100
- it('handles several occurrences', function () {
101
- expect((0, _latexBridge.toNativeCommands)('\\abs{a}+\\abs{b}')).toEqual('\\left|a\\right|+\\left|b\\right|');
102
- expect((0, _latexBridge.toNativeCommands)('\\longdiv{1}\\longdiv{2}')).toEqual('\\enclose{longdiv}{1}\\enclose{longdiv}{2}');
103
- });
104
- it('leaves other latex untouched', function () {
105
- ['\\frac{1}{2}', '\\pi', '\\sqrt{x}', '\\overline{AB}'].forEach(function (l) {
106
- expect((0, _latexBridge.toNativeCommands)(l)).toEqual(l);
107
- });
108
- });
109
- it('handles nullish input', function () {
110
- expect((0, _latexBridge.toNativeCommands)(undefined)).toEqual('');
111
- expect((0, _latexBridge.toNativeCommands)('')).toEqual('');
112
- });
113
- it('is applied by toMathLive', function () {
114
- expect((0, _latexBridge.toMathLive)('\\longdiv{5}')).toEqual('\\enclose{longdiv}{5}');
115
- });
116
- it('does not leave a pie macro in what reaches the field', function () {
117
- ['\\longdiv{7}', '\\abs{7}', '\\overarc{7}'].forEach(function (l) {
118
- var out = (0, _latexBridge.toMathLive)(l);
119
- expect(out).not.toMatch(/\\longdiv|\\abs|\\overarc/);
120
- });
121
- });
122
- });
123
- describe('fieldIds', function () {
124
- it('returns ids in document order', function () {
125
- expect((0, _latexBridge.fieldIds)('\\MathQuillMathField[r1]{}+\\MathQuillMathField[r2]{}')).toEqual(['r1', 'r2']);
126
- });
127
- it('returns [] when there are none', function () {
128
- expect((0, _latexBridge.fieldIds)('x+y')).toEqual([]);
129
- expect((0, _latexBridge.fieldIds)(undefined)).toEqual([]);
130
- });
131
- it('is repeatable (regex lastIndex is reset)', function () {
132
- var latex = '\\MathQuillMathField[r1]{}';
133
- expect((0, _latexBridge.fieldIds)(latex)).toEqual(['r1']);
134
- expect((0, _latexBridge.fieldIds)(latex)).toEqual(['r1']);
135
- });
136
- });
137
- describe('keyToAction', function () {
138
- it('prefers latex when there is no command', function () {
139
- expect((0, _latexBridge.keyToAction)({
140
- latex: '\\pi',
141
- write: 'p'
142
- })).toEqual({
143
- type: 'insert',
144
- value: '\\pi'
145
- });
146
- });
147
- it('uses write', function () {
148
- expect((0, _latexBridge.keyToAction)({
149
- write: 'x'
150
- })).toEqual({
151
- type: 'insert',
152
- value: 'x'
153
- });
154
- });
155
- it('expands commands that take arguments into placeholders', function () {
156
- expect((0, _latexBridge.keyToAction)({
157
- command: '\\frac'
158
- })).toEqual({
159
- type: 'insert',
160
- value: '\\frac{#?}{#?}'
161
- });
162
- expect((0, _latexBridge.keyToAction)({
163
- command: '\\sqrt'
164
- })).toEqual({
165
- type: 'insert',
166
- value: '\\sqrt{#?}'
167
- });
168
- expect((0, _latexBridge.keyToAction)({
169
- command: '^'
170
- })).toEqual({
171
- type: 'insert',
172
- value: '^{#?}'
173
- });
174
- });
175
-
176
- // MathQuill's `/` turned the preceding expression into the numerator: type
177
- // 5, press the key, get 5/_ with the caret in the denominator. `#@` is
178
- // MathLive's "selection, or the item before the cursor" token, and is what
179
- // MathLive binds to `/` itself.
180
- it('division takes the preceding item as the numerator', function () {
181
- expect((0, _latexBridge.keyToAction)({
182
- command: '/'
183
- })).toEqual({
184
- type: 'insert',
185
- value: '\\frac{#@}{#?}'
186
- });
187
- });
188
- it('an explicit blank-over-blank fraction stays empty', function () {
189
- // distinct from `/`: this key is meant to insert two empty slots
190
- expect((0, _latexBridge.keyToAction)({
191
- command: '\\frac'
192
- })).toEqual({
193
- type: 'insert',
194
- value: '\\frac{#?}{#?}'
195
- });
196
- });
197
- it('the x-over-blank key routes through division', function () {
198
- // eslint-disable-next-line global-require
199
- var _require = require('../keys/fractions'),
200
- xOverBlank = _require.xOverBlank;
201
- expect(xOverBlank.command).toEqual('/');
202
- expect((0, _latexBridge.keyToAction)(xOverBlank).value).toEqual('\\frac{#@}{#?}');
203
- });
204
- it('passes argument-less commands through', function () {
205
- expect((0, _latexBridge.keyToAction)({
206
- command: '\\pi'
207
- })).toEqual({
208
- type: 'insert',
209
- value: '\\pi'
210
- });
211
- });
212
- it('concatenates array commands (MathQuill cmd() applied them in sequence)', function () {
213
- // Measured Angle
214
- expect((0, _latexBridge.keyToAction)({
215
- command: ['m', '\\angle']
216
- })).toEqual({
217
- type: 'insert',
218
- value: 'm\\angle'
219
- });
220
- // log base n - the `_` part must still expand to a placeholder
221
- expect((0, _latexBridge.keyToAction)({
222
- command: ['\\log', '_']
223
- })).toEqual({
224
- type: 'insert',
225
- value: '\\log_{#?}'
226
- });
227
- });
228
- it('always returns a string value for insert actions', function () {
229
- [{
230
- command: ['m', '\\angle']
231
- }, {
232
- command: '\\frac'
233
- }, {
234
- write: 'x'
235
- }, {
236
- latex: '\\pi'
237
- }].forEach(function (k) {
238
- expect((0, _typeof2["default"])((0, _latexBridge.keyToAction)(k).value)).toBe('string');
239
- });
240
- });
241
- it('maps keystrokes to MathLive selectors', function () {
242
- expect((0, _latexBridge.keyToAction)({
243
- keystroke: 'Left'
244
- })).toEqual({
245
- type: 'command',
246
- value: 'moveToPreviousChar'
247
- });
248
- expect((0, _latexBridge.keyToAction)({
249
- keystroke: 'Right'
250
- })).toEqual({
251
- type: 'command',
252
- value: 'moveToNextChar'
253
- });
254
- expect((0, _latexBridge.keyToAction)({
255
- keystroke: 'Backspace'
256
- })).toEqual({
257
- type: 'command',
258
- value: 'deleteBackward'
259
- });
260
- });
261
- it('returns undefined for unknown/empty input', function () {
262
- expect((0, _latexBridge.keyToAction)(undefined)).toBeUndefined();
263
- expect((0, _latexBridge.keyToAction)({})).toBeUndefined();
264
- expect((0, _latexBridge.keyToAction)({
265
- keystroke: 'Nope'
266
- })).toBeUndefined();
267
- });
268
- it('latex wins over command only when command is absent', function () {
269
- // a key with both should use the command path (matches MathInput.keypadPress)
270
- expect((0, _latexBridge.keyToAction)({
271
- latex: '\\frac{}{}',
272
- command: '\\frac'
273
- })).toEqual({
274
- type: 'insert',
275
- value: '\\frac{#?}{#?}'
276
- });
277
- });
278
- });
279
- });
280
- //# sourceMappingURL=latex-bridge.test.js.map
@@ -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":[]}