@pie-lib/math-input-mathlive 1.0.7 → 1.0.9-next.6608
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/LICENSE.md +5 -0
- package/README.md +1 -1
- package/package.json +4 -3
- package/src/__tests__/keypad-label.test.jsx +13 -5
- package/lib/__tests__/drop-in-compat.test.js +0 -133
- package/lib/__tests__/drop-in-compat.test.js.map +0 -1
- package/lib/__tests__/index.test.js +0 -118
- package/lib/__tests__/index.test.js.map +0 -1
- package/lib/__tests__/input-imperative.test.js +0 -155
- package/lib/__tests__/input-imperative.test.js.map +0 -1
- package/lib/__tests__/keypad-label.test.js +0 -44
- package/lib/__tests__/keypad-label.test.js.map +0 -1
- package/lib/__tests__/latex-bridge.test.js +0 -251
- package/lib/__tests__/latex-bridge.test.js.map +0 -1
- package/lib/__tests__/mathlive-instance.test.js +0 -188
- package/lib/__tests__/mathlive-instance.test.js.map +0 -1
package/LICENSE.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Copyright 2019 CoreSpring Inc
|
|
2
|
+
|
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
|
4
|
+
|
|
5
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
CHANGED
|
@@ -75,7 +75,7 @@ widget do not port and need a redesign (`mf.getElementInfo()` exposes per-elemen
|
|
|
75
75
|
- **Stylesheets: import both, once, in the host app.**
|
|
76
76
|
|
|
77
77
|
```js
|
|
78
|
-
import 'mathlive/fonts.css';
|
|
78
|
+
import 'mathlive/fonts.css'; // KaTeX @font-face rules
|
|
79
79
|
import 'mathlive/static.css'; // REQUIRED for convertLatexToMarkup output
|
|
80
80
|
```
|
|
81
81
|
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.0.
|
|
6
|
+
"version": "1.0.9-next.6608+1ae0088e3",
|
|
7
7
|
"description": "MathLive-based math input (drop-in alternative to @pie-lib/math-input)",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"module": "src/index.jsx",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"@emotion/styled": "^11.14.1",
|
|
15
15
|
"@mui/icons-material": "^7.3.4",
|
|
16
16
|
"@mui/material": "^7.3.4",
|
|
17
|
-
"@pie-lib/render-ui": "^6.1.
|
|
17
|
+
"@pie-lib/render-ui": "^6.1.3",
|
|
18
18
|
"debug": "^4.1.1",
|
|
19
19
|
"lodash-es": "^4.17.23",
|
|
20
20
|
"mathlive": "^0.110.0",
|
|
@@ -27,5 +27,6 @@
|
|
|
27
27
|
"react": "^18.2.0",
|
|
28
28
|
"react-dom": "^18.2.0"
|
|
29
29
|
},
|
|
30
|
-
"scripts": {}
|
|
30
|
+
"scripts": {},
|
|
31
|
+
"gitHead": "1ae0088e3b8985aa65933d6a35d94f609cfb9420"
|
|
31
32
|
}
|
|
@@ -16,11 +16,19 @@ describe('keypad label display normalisation', () => {
|
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
it('handles every empty-group key shape', () => {
|
|
19
|
-
[
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
},
|
|
23
|
-
|
|
19
|
+
[
|
|
20
|
+
'\\frac{}{}',
|
|
21
|
+
'\\overline{}',
|
|
22
|
+
'x^{}',
|
|
23
|
+
'x_{}',
|
|
24
|
+
'\\sqrt{}',
|
|
25
|
+
'\\sqrt[{}]{}',
|
|
26
|
+
'\\abs{}',
|
|
27
|
+
'\\log_{}',
|
|
28
|
+
'\\longdiv{}',
|
|
29
|
+
].forEach((latex) => {
|
|
30
|
+
expect(latexForDisplay(latex)).not.toContain('{}');
|
|
31
|
+
});
|
|
24
32
|
});
|
|
25
33
|
|
|
26
34
|
it('treats a whitespace-only group as empty', () => {
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
-
var _react = _interopRequireDefault(require("react"));
|
|
6
|
-
var _react2 = require("@testing-library/react");
|
|
7
|
-
var _styles = require("@mui/material/styles");
|
|
8
|
-
var _index = require("../index");
|
|
9
|
-
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; }
|
|
10
|
-
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; }
|
|
11
|
-
/**
|
|
12
|
-
* Exercises the exact call patterns real consumers use against
|
|
13
|
-
* @pie-lib/math-input, to catch drop-in incompatibilities.
|
|
14
|
-
*
|
|
15
|
-
* Sources:
|
|
16
|
-
* - packages/math-toolbar/src/editor-and-pad.jsx:16,185
|
|
17
|
-
* - packages/math-toolbar/src/math-preview.jsx:8,156
|
|
18
|
-
* - packages/editable-html/src/plugins/respArea/math-templated/index.jsx:92
|
|
19
|
-
* - packages/editable-html-tip-tap/src/components/respArea/MathTemplated.jsx:111
|
|
20
|
-
*/
|
|
21
|
-
describe('drop-in compatibility with @pie-lib/math-input consumers', function () {
|
|
22
|
-
describe('mq.CommonMqStyles destructuring', function () {
|
|
23
|
-
it('math-preview.jsx: { commonMqFontStyles, longdivStyles, supsubStyles }', function () {
|
|
24
|
-
var _mq$CommonMqStyles = _index.mq.CommonMqStyles,
|
|
25
|
-
commonMqFontStyles = _mq$CommonMqStyles.commonMqFontStyles,
|
|
26
|
-
longdivStyles = _mq$CommonMqStyles.longdivStyles,
|
|
27
|
-
supsubStyles = _mq$CommonMqStyles.supsubStyles;
|
|
28
|
-
expect(commonMqFontStyles).toBeDefined();
|
|
29
|
-
expect(longdivStyles).toBeDefined();
|
|
30
|
-
expect(supsubStyles).toBeDefined();
|
|
31
|
-
});
|
|
32
|
-
it('editor-and-pad.jsx: also { commonMqKeyboardStyles }', function () {
|
|
33
|
-
var _mq$CommonMqStyles2 = _index.mq.CommonMqStyles,
|
|
34
|
-
commonMqFontStyles = _mq$CommonMqStyles2.commonMqFontStyles,
|
|
35
|
-
commonMqKeyboardStyles = _mq$CommonMqStyles2.commonMqKeyboardStyles,
|
|
36
|
-
longdivStyles = _mq$CommonMqStyles2.longdivStyles,
|
|
37
|
-
supsubStyles = _mq$CommonMqStyles2.supsubStyles;
|
|
38
|
-
expect(commonMqKeyboardStyles).toBeDefined();
|
|
39
|
-
// All four must be spreadable into an emotion style object.
|
|
40
|
-
expect(function () {
|
|
41
|
-
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, commonMqFontStyles), commonMqKeyboardStyles), longdivStyles), supsubStyles);
|
|
42
|
-
}).not.toThrow();
|
|
43
|
-
});
|
|
44
|
-
it('the destructured groups survive being spread into a styled component', function () {
|
|
45
|
-
var _mq$CommonMqStyles3 = _index.mq.CommonMqStyles,
|
|
46
|
-
commonMqFontStyles = _mq$CommonMqStyles3.commonMqFontStyles,
|
|
47
|
-
longdivStyles = _mq$CommonMqStyles3.longdivStyles,
|
|
48
|
-
supsubStyles = _mq$CommonMqStyles3.supsubStyles;
|
|
49
|
-
var Styled = (0, _styles.styled)('div')(_objectSpread(_objectSpread(_objectSpread({}, commonMqFontStyles), longdivStyles), supsubStyles));
|
|
50
|
-
expect(function () {
|
|
51
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, null));
|
|
52
|
-
}).not.toThrow();
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('mq.Input', function () {
|
|
56
|
-
it('editor-and-pad.jsx: styled(mq.Input) renders', function () {
|
|
57
|
-
var MathEditor = (0, _styles.styled)(_index.mq.Input)(function () {
|
|
58
|
-
return {
|
|
59
|
-
width: '100%'
|
|
60
|
-
};
|
|
61
|
-
});
|
|
62
|
-
expect(function () {
|
|
63
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(MathEditor, {
|
|
64
|
-
latex: "\\\\frac{1}{2}",
|
|
65
|
-
onChange: function onChange() {}
|
|
66
|
-
}));
|
|
67
|
-
}).not.toThrow();
|
|
68
|
-
});
|
|
69
|
-
it('accepts the className that styled() injects', function () {
|
|
70
|
-
var Styled = (0, _styles.styled)(_index.mq.Input)({
|
|
71
|
-
padding: 4
|
|
72
|
-
});
|
|
73
|
-
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, {
|
|
74
|
-
latex: "x",
|
|
75
|
-
onChange: function onChange() {}
|
|
76
|
-
})),
|
|
77
|
-
container = _render.container;
|
|
78
|
-
expect(container.firstChild).toBeTruthy();
|
|
79
|
-
expect(container.firstChild.className).toBeTruthy();
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
describe('mq.Static', function () {
|
|
83
|
-
it('math-preview.jsx: <mq.Static latex onFocus onBlur />', function () {
|
|
84
|
-
expect(function () {
|
|
85
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
86
|
-
latex: '\\frac{1}{2}',
|
|
87
|
-
onFocus: function onFocus() {},
|
|
88
|
-
onBlur: function onBlur() {}
|
|
89
|
-
}));
|
|
90
|
-
}).not.toThrow();
|
|
91
|
-
});
|
|
92
|
-
it('math-templated respArea: <mq.Static latex={value} />', function () {
|
|
93
|
-
expect(function () {
|
|
94
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
95
|
-
latex: 'x=1'
|
|
96
|
-
}));
|
|
97
|
-
}).not.toThrow();
|
|
98
|
-
});
|
|
99
|
-
it('renders answer-block latex (the templated-math case) without throwing', function () {
|
|
100
|
-
expect(function () {
|
|
101
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
102
|
-
latex: 'x=\\MathQuillMathField[r1]{}',
|
|
103
|
-
onSubFieldChange: function onSubFieldChange() {}
|
|
104
|
-
}));
|
|
105
|
-
}).not.toThrow();
|
|
106
|
-
});
|
|
107
|
-
it('is styleable, as keypad labels were in math-input', function () {
|
|
108
|
-
var Styled = (0, _styles.styled)(_index.mq.Static)({
|
|
109
|
-
pointerEvents: 'none'
|
|
110
|
-
});
|
|
111
|
-
expect(function () {
|
|
112
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, {
|
|
113
|
-
latex: '\\pi'
|
|
114
|
-
}));
|
|
115
|
-
}).not.toThrow();
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
describe('surface parity', function () {
|
|
119
|
-
it('exposes exactly the names math-input exported', function () {
|
|
120
|
-
// eslint-disable-next-line global-require
|
|
121
|
-
var pkg = require('../index');
|
|
122
|
-
['keysForGrade', 'addBrackets', 'removeBrackets', 'keys', 'HorizontalKeypad', 'mq', 'updateSpans', 'registerEmbed', 'applyStaticMath'].forEach(function (name) {
|
|
123
|
-
expect(pkg[name]).toBeDefined();
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
it('mq exposes Input, Static and CommonMqStyles', function () {
|
|
127
|
-
['Input', 'Static', 'CommonMqStyles'].forEach(function (name) {
|
|
128
|
-
expect(_index.mq[name]).toBeDefined();
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
//# sourceMappingURL=drop-in-compat.test.js.map
|
|
@@ -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,118 +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 _react = _interopRequireDefault(require("react"));
|
|
6
|
-
var _react2 = require("@testing-library/react");
|
|
7
|
-
var _index = require("../index");
|
|
8
|
-
describe('math-input-mathlive public API', function () {
|
|
9
|
-
it('mirrors the @pie-lib/math-input export surface', function () {
|
|
10
|
-
expect((0, _typeof2["default"])(_index.keysForGrade)).toBe('function');
|
|
11
|
-
expect((0, _typeof2["default"])(_index.addBrackets)).toBe('function');
|
|
12
|
-
expect((0, _typeof2["default"])(_index.removeBrackets)).toBe('function');
|
|
13
|
-
expect((0, _typeof2["default"])(_index.registerEmbed)).toBe('function');
|
|
14
|
-
expect((0, _typeof2["default"])(_index.applyStaticMath)).toBe('function');
|
|
15
|
-
expect((0, _typeof2["default"])(_index.updateSpans)).toBe('function');
|
|
16
|
-
expect(_index.keys).toBeDefined();
|
|
17
|
-
expect(_index.keys.baseSet).toBeDefined();
|
|
18
|
-
});
|
|
19
|
-
it('exports the field wrappers under both mf and mq', function () {
|
|
20
|
-
expect(_index.mf.Input).toBeDefined();
|
|
21
|
-
expect(_index.mf.Static).toBeDefined();
|
|
22
|
-
// `mq` alias lets a consumer swap packages by changing only the import.
|
|
23
|
-
expect(_index.mq).toBe(_index.mf);
|
|
24
|
-
});
|
|
25
|
-
it('updateSpans is a safe no-op', function () {
|
|
26
|
-
expect(function () {
|
|
27
|
-
return (0, _index.updateSpans)();
|
|
28
|
-
}).not.toThrow();
|
|
29
|
-
});
|
|
30
|
-
it('CommonMqStyles keeps the shape consumers destructure', function () {
|
|
31
|
-
// math-toolbar does:
|
|
32
|
-
// const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles }
|
|
33
|
-
// = mq.CommonMqStyles;
|
|
34
|
-
var _mf$CommonMqStyles = _index.mf.CommonMqStyles,
|
|
35
|
-
commonMqFontStyles = _mf$CommonMqStyles.commonMqFontStyles,
|
|
36
|
-
commonMqKeyboardStyles = _mf$CommonMqStyles.commonMqKeyboardStyles,
|
|
37
|
-
longdivStyles = _mf$CommonMqStyles.longdivStyles,
|
|
38
|
-
supsubStyles = _mf$CommonMqStyles.supsubStyles;
|
|
39
|
-
[commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles].forEach(function (s) {
|
|
40
|
-
expect(s).toBeDefined();
|
|
41
|
-
expect((0, _typeof2["default"])(s)).toBe('object');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
it('bracket helpers round-trip', function () {
|
|
45
|
-
expect((0, _index.addBrackets)('x')).toEqual('\\(x\\)');
|
|
46
|
-
expect((0, _index.removeBrackets)('\\(x\\)')).toEqual('x');
|
|
47
|
-
expect((0, _index.removeBrackets)((0, _index.addBrackets)('\\frac{1}{2}'))).toEqual('\\frac{1}{2}');
|
|
48
|
-
});
|
|
49
|
-
it('keysForGrade returns a 5-row keyset', function () {
|
|
50
|
-
var set = (0, _index.keysForGrade)('geometry');
|
|
51
|
-
expect(Array.isArray(set)).toBe(true);
|
|
52
|
-
expect(set.length).toBe(5);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('rendering', function () {
|
|
56
|
-
// MathLive is a browser-only custom element; loadMathLive() resolves async and
|
|
57
|
-
// is a no-op-ish under jsdom. These assert the components mount without
|
|
58
|
-
// throwing, which is what regressed most often in the MathQuill version.
|
|
59
|
-
it('KeyPad renders without a live MathLive instance', function () {
|
|
60
|
-
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
61
|
-
onPress: function onPress() {}
|
|
62
|
-
})),
|
|
63
|
-
container = _render.container;
|
|
64
|
-
expect(container.querySelectorAll('button').length).toBeGreaterThan(0);
|
|
65
|
-
});
|
|
66
|
-
it('KeyPad falls back to raw latex for labels before MathLive loads', function () {
|
|
67
|
-
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
68
|
-
onPress: function onPress() {},
|
|
69
|
-
baseSet: [[{
|
|
70
|
-
name: 'pi',
|
|
71
|
-
latex: '\\pi',
|
|
72
|
-
category: 'constants'
|
|
73
|
-
}]]
|
|
74
|
-
})),
|
|
75
|
-
container = _render2.container;
|
|
76
|
-
expect(container.textContent).toContain('\\pi');
|
|
77
|
-
});
|
|
78
|
-
it('KeyPad fires onPress with the key definition', function () {
|
|
79
|
-
var onPress = jest.fn();
|
|
80
|
-
var key = {
|
|
81
|
-
name: 'x',
|
|
82
|
-
label: 'x',
|
|
83
|
-
write: 'x',
|
|
84
|
-
category: 'vars'
|
|
85
|
-
};
|
|
86
|
-
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
87
|
-
onPress: onPress,
|
|
88
|
-
baseSet: [[key]]
|
|
89
|
-
})),
|
|
90
|
-
container = _render3.container;
|
|
91
|
-
container.querySelector('button').click();
|
|
92
|
-
expect(onPress).toHaveBeenCalledWith(key);
|
|
93
|
-
});
|
|
94
|
-
it('MathInput mounts', function () {
|
|
95
|
-
expect(function () {
|
|
96
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.MathInput, {
|
|
97
|
-
latex: "\\\\frac{1}{2}",
|
|
98
|
-
onChange: function onChange() {}
|
|
99
|
-
}));
|
|
100
|
-
}).not.toThrow();
|
|
101
|
-
});
|
|
102
|
-
it('HorizontalKeypad mounts and reports the legacy {value,type} model', function () {
|
|
103
|
-
var onClick = jest.fn();
|
|
104
|
-
expect(function () {
|
|
105
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.HorizontalKeypad, {
|
|
106
|
-
onClick: onClick
|
|
107
|
-
}));
|
|
108
|
-
}).not.toThrow();
|
|
109
|
-
});
|
|
110
|
-
it('Static renders display-mode latex without a mathfield', function () {
|
|
111
|
-
expect(function () {
|
|
112
|
-
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mf.Static, {
|
|
113
|
-
latex: "\\\\frac{1}{2}"
|
|
114
|
-
}));
|
|
115
|
-
}).not.toThrow();
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
//# sourceMappingURL=index.test.js.map
|
|
@@ -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,155 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _latexBridge = require("../latex-bridge");
|
|
5
|
-
var _input = _interopRequireDefault(require("../mf/input"));
|
|
6
|
-
/**
|
|
7
|
-
* The imperative surface that @pie-lib/math-toolbar drives
|
|
8
|
-
* (editor-and-pad.jsx: clear/command/keystroke/write/latex).
|
|
9
|
-
*
|
|
10
|
-
* These call the methods against a stub mathfield, because a real
|
|
11
|
-
* <math-field> needs a browser. What matters here is the *translation*:
|
|
12
|
-
* MathQuill-era arguments must become valid MathLive operations.
|
|
13
|
-
*/
|
|
14
|
-
var stubField = function stubField() {
|
|
15
|
-
var calls = {
|
|
16
|
-
insert: [],
|
|
17
|
-
executeCommand: [],
|
|
18
|
-
focus: 0
|
|
19
|
-
};
|
|
20
|
-
return {
|
|
21
|
-
calls: calls,
|
|
22
|
-
value: '',
|
|
23
|
-
getValue: function getValue() {
|
|
24
|
-
return '';
|
|
25
|
-
},
|
|
26
|
-
insert: function insert(v) {
|
|
27
|
-
calls.insert.push(v);
|
|
28
|
-
},
|
|
29
|
-
executeCommand: function executeCommand(v) {
|
|
30
|
-
calls.executeCommand.push(v);
|
|
31
|
-
},
|
|
32
|
-
focus: function focus() {
|
|
33
|
-
calls.focus++;
|
|
34
|
-
},
|
|
35
|
-
blur: function blur() {}
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
var withField = function withField() {
|
|
39
|
-
var input = new _input["default"]({});
|
|
40
|
-
var f = stubField();
|
|
41
|
-
input.mathField = f;
|
|
42
|
-
return {
|
|
43
|
-
input: input,
|
|
44
|
-
f: f
|
|
45
|
-
};
|
|
46
|
-
};
|
|
47
|
-
describe('Input imperative API (drives math-toolbar)', function () {
|
|
48
|
-
describe('keystroke', function () {
|
|
49
|
-
it('maps MathQuill keystroke names to MathLive selectors', function () {
|
|
50
|
-
var _withField = withField(),
|
|
51
|
-
input = _withField.input,
|
|
52
|
-
f = _withField.f;
|
|
53
|
-
input.keystroke('Left');
|
|
54
|
-
input.keystroke('Right');
|
|
55
|
-
input.keystroke('Backspace');
|
|
56
|
-
expect(f.calls.executeCommand).toEqual(['moveToPreviousChar', 'moveToNextChar', 'deleteBackward']);
|
|
57
|
-
});
|
|
58
|
-
it('passes an unknown value through as a selector', function () {
|
|
59
|
-
var _withField2 = withField(),
|
|
60
|
-
input = _withField2.input,
|
|
61
|
-
f = _withField2.f;
|
|
62
|
-
input.keystroke('deleteForward');
|
|
63
|
-
expect(f.calls.executeCommand).toEqual(['deleteForward']);
|
|
64
|
-
});
|
|
65
|
-
it('does not throw when the engine rejects the selector', function () {
|
|
66
|
-
var _withField3 = withField(),
|
|
67
|
-
input = _withField3.input;
|
|
68
|
-
input.mathField.executeCommand = function () {
|
|
69
|
-
throw new Error('unknown command');
|
|
70
|
-
};
|
|
71
|
-
expect(function () {
|
|
72
|
-
return input.keystroke('Nonsense');
|
|
73
|
-
}).not.toThrow();
|
|
74
|
-
});
|
|
75
|
-
it('covers every keystroke the keypad emits', function () {
|
|
76
|
-
// navigation.js / edit.js only produce these three
|
|
77
|
-
['Left', 'Right', 'Backspace'].forEach(function (k) {
|
|
78
|
-
return expect(_latexBridge.KEYSTROKES[k]).toBeDefined();
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
describe('command', function () {
|
|
83
|
-
it('expands argument-taking commands into placeholders', function () {
|
|
84
|
-
var _withField4 = withField(),
|
|
85
|
-
input = _withField4.input,
|
|
86
|
-
f = _withField4.f;
|
|
87
|
-
input.command('\\frac');
|
|
88
|
-
|
|
89
|
-
// a bare \frac would give no editable slots
|
|
90
|
-
expect(f.calls.insert).toEqual(['\\frac{#?}{#?}']);
|
|
91
|
-
});
|
|
92
|
-
it('handles array commands', function () {
|
|
93
|
-
var _withField5 = withField(),
|
|
94
|
-
input = _withField5.input,
|
|
95
|
-
f = _withField5.f;
|
|
96
|
-
input.command(['\\log', '_']);
|
|
97
|
-
expect(f.calls.insert).toEqual(['\\log_{#?}']);
|
|
98
|
-
});
|
|
99
|
-
it('passes argument-less commands through', function () {
|
|
100
|
-
var _withField6 = withField(),
|
|
101
|
-
input = _withField6.input,
|
|
102
|
-
f = _withField6.f;
|
|
103
|
-
input.command('\\pi');
|
|
104
|
-
expect(f.calls.insert).toEqual(['\\pi']);
|
|
105
|
-
});
|
|
106
|
-
it('agrees with keyToAction', function () {
|
|
107
|
-
expect((0, _latexBridge.keyToAction)({
|
|
108
|
-
command: '\\sqrt'
|
|
109
|
-
}).value).toEqual('\\sqrt{#?}');
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
describe('safety before MathLive loads', function () {
|
|
113
|
-
it('every method is a no-op rather than a crash', function () {
|
|
114
|
-
var input = new _input["default"]({});
|
|
115
|
-
|
|
116
|
-
// mathField is undefined until loadMathLive() resolves
|
|
117
|
-
expect(input.latex()).toEqual('');
|
|
118
|
-
expect(input.clear()).toEqual('');
|
|
119
|
-
expect(input.command('\\frac')).toEqual('');
|
|
120
|
-
expect(input.keystroke('Left')).toEqual('');
|
|
121
|
-
expect(input.write('x')).toEqual('');
|
|
122
|
-
expect(function () {
|
|
123
|
-
return input.focus();
|
|
124
|
-
}).not.toThrow();
|
|
125
|
-
expect(function () {
|
|
126
|
-
return input.blur();
|
|
127
|
-
}).not.toThrow();
|
|
128
|
-
expect(function () {
|
|
129
|
-
return input.setLatex('x');
|
|
130
|
-
}).not.toThrow();
|
|
131
|
-
expect(input.element).toBeUndefined();
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
describe('mqCompat facade', function () {
|
|
135
|
-
// math-toolbar used to call this.input.mathField.latex(); external
|
|
136
|
-
// consumers may still do the same.
|
|
137
|
-
it('exposes latex() as a getter', function () {
|
|
138
|
-
var _withField7 = withField(),
|
|
139
|
-
input = _withField7.input;
|
|
140
|
-
input.mathField.getValue = function () {
|
|
141
|
-
return '\\frac{1}{2}';
|
|
142
|
-
};
|
|
143
|
-
expect(input.mqCompat.latex()).toEqual('\\frac{1}{2}');
|
|
144
|
-
});
|
|
145
|
-
it('exposes latex(v) as a setter and el()', function () {
|
|
146
|
-
var _withField8 = withField(),
|
|
147
|
-
input = _withField8.input,
|
|
148
|
-
f = _withField8.f;
|
|
149
|
-
input.mqCompat.latex('x+1');
|
|
150
|
-
expect(f.value).toEqual('x+1');
|
|
151
|
-
expect(input.mqCompat.el()).toBe(f);
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
//# sourceMappingURL=input-imperative.test.js.map
|
|
@@ -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,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _latexBridge = require("../latex-bridge");
|
|
4
|
-
/**
|
|
5
|
-
* Keys use empty groups to show a command's shape (`\frac{}{}`, `x^{}`).
|
|
6
|
-
* MathLive renders `{}` as nothing, so labels need a visible stand-in - but the
|
|
7
|
-
* value that gets *inserted* must stay untouched.
|
|
8
|
-
*/
|
|
9
|
-
describe('keypad label display normalisation', function () {
|
|
10
|
-
it('gives empty groups a visible glyph', function () {
|
|
11
|
-
var out = (0, _latexBridge.withVisibleEmptySlots)('\\frac{}{}');
|
|
12
|
-
expect(out).not.toEqual('\\frac{}{}');
|
|
13
|
-
expect(out).toContain('25AB'); // white small square
|
|
14
|
-
expect(out).toContain('pie-empty');
|
|
15
|
-
});
|
|
16
|
-
it('handles every empty-group key shape', function () {
|
|
17
|
-
['\\frac{}{}', '\\overline{}', 'x^{}', 'x_{}', '\\sqrt{}', '\\sqrt[{}]{}', '\\abs{}', '\\log_{}', '\\longdiv{}'].forEach(function (latex) {
|
|
18
|
-
expect((0, _latexBridge.withVisibleEmptySlots)(latex)).not.toContain('{}');
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
it('treats a whitespace-only group as empty', function () {
|
|
22
|
-
// e.g. \frac{x}{ }
|
|
23
|
-
expect((0, _latexBridge.withVisibleEmptySlots)('\\frac{x}{ }')).toContain('pie-empty');
|
|
24
|
-
});
|
|
25
|
-
it('leaves latex without empty groups alone', function () {
|
|
26
|
-
['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach(function (latex) {
|
|
27
|
-
expect((0, _latexBridge.withVisibleEmptySlots)(latex)).toEqual(latex);
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
it('handles nullish input', function () {
|
|
31
|
-
expect((0, _latexBridge.withVisibleEmptySlots)(undefined)).toEqual('');
|
|
32
|
-
expect((0, _latexBridge.withVisibleEmptySlots)('')).toEqual('');
|
|
33
|
-
});
|
|
34
|
-
it('does NOT affect what gets inserted into the field', function () {
|
|
35
|
-
// the action must use the key's own latex, never the display form
|
|
36
|
-
var key = {
|
|
37
|
-
name: 'frac',
|
|
38
|
-
latex: '\\frac{}{}'
|
|
39
|
-
};
|
|
40
|
-
expect((0, _latexBridge.keyToAction)(key).value).toEqual('\\frac{}{}');
|
|
41
|
-
expect((0, _latexBridge.keyToAction)(key).value).not.toContain('pie-empty');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=keypad-label.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keypad-label.test.js","names":["_latexBridge","require","describe","it","out","latexForDisplay","expect","not","toEqual","toContain","forEach","latex","undefined","key","name","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 expect(out).toContain('25AB'); // white small square\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 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;IACrCF,MAAM,CAACF,GAAG,CAAC,CAACK,SAAS,CAAC,MAAM,CAAC,CAAC,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;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,EAACO,SAAS,CAAC,CAAC,CAACJ,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,IAAMU,GAAG,GAAG;MAAEC,IAAI,EAAE,MAAM;MAAEH,KAAK,EAAE;IAAa,CAAC;IAEjDL,MAAM,CAAC,IAAAS,wBAAW,EAACF,GAAG,CAAC,CAACG,KAAK,CAAC,CAACR,OAAO,CAAC,YAAY,CAAC;IACpDF,MAAM,CAAC,IAAAS,wBAAW,EAACF,GAAG,CAAC,CAACG,KAAK,CAAC,CAACT,GAAG,CAACE,SAAS,CAAC,WAAW,CAAC;EAC3D,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,251 +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
|
-
it('passes argument-less commands through', function () {
|
|
176
|
-
expect((0, _latexBridge.keyToAction)({
|
|
177
|
-
command: '\\pi'
|
|
178
|
-
})).toEqual({
|
|
179
|
-
type: 'insert',
|
|
180
|
-
value: '\\pi'
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
it('concatenates array commands (MathQuill cmd() applied them in sequence)', function () {
|
|
184
|
-
// Measured Angle
|
|
185
|
-
expect((0, _latexBridge.keyToAction)({
|
|
186
|
-
command: ['m', '\\angle']
|
|
187
|
-
})).toEqual({
|
|
188
|
-
type: 'insert',
|
|
189
|
-
value: 'm\\angle'
|
|
190
|
-
});
|
|
191
|
-
// log base n - the `_` part must still expand to a placeholder
|
|
192
|
-
expect((0, _latexBridge.keyToAction)({
|
|
193
|
-
command: ['\\log', '_']
|
|
194
|
-
})).toEqual({
|
|
195
|
-
type: 'insert',
|
|
196
|
-
value: '\\log_{#?}'
|
|
197
|
-
});
|
|
198
|
-
});
|
|
199
|
-
it('always returns a string value for insert actions', function () {
|
|
200
|
-
[{
|
|
201
|
-
command: ['m', '\\angle']
|
|
202
|
-
}, {
|
|
203
|
-
command: '\\frac'
|
|
204
|
-
}, {
|
|
205
|
-
write: 'x'
|
|
206
|
-
}, {
|
|
207
|
-
latex: '\\pi'
|
|
208
|
-
}].forEach(function (k) {
|
|
209
|
-
expect((0, _typeof2["default"])((0, _latexBridge.keyToAction)(k).value)).toBe('string');
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
it('maps keystrokes to MathLive selectors', function () {
|
|
213
|
-
expect((0, _latexBridge.keyToAction)({
|
|
214
|
-
keystroke: 'Left'
|
|
215
|
-
})).toEqual({
|
|
216
|
-
type: 'command',
|
|
217
|
-
value: 'moveToPreviousChar'
|
|
218
|
-
});
|
|
219
|
-
expect((0, _latexBridge.keyToAction)({
|
|
220
|
-
keystroke: 'Right'
|
|
221
|
-
})).toEqual({
|
|
222
|
-
type: 'command',
|
|
223
|
-
value: 'moveToNextChar'
|
|
224
|
-
});
|
|
225
|
-
expect((0, _latexBridge.keyToAction)({
|
|
226
|
-
keystroke: 'Backspace'
|
|
227
|
-
})).toEqual({
|
|
228
|
-
type: 'command',
|
|
229
|
-
value: 'deleteBackward'
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
it('returns undefined for unknown/empty input', function () {
|
|
233
|
-
expect((0, _latexBridge.keyToAction)(undefined)).toBeUndefined();
|
|
234
|
-
expect((0, _latexBridge.keyToAction)({})).toBeUndefined();
|
|
235
|
-
expect((0, _latexBridge.keyToAction)({
|
|
236
|
-
keystroke: 'Nope'
|
|
237
|
-
})).toBeUndefined();
|
|
238
|
-
});
|
|
239
|
-
it('latex wins over command only when command is absent', function () {
|
|
240
|
-
// a key with both should use the command path (matches MathInput.keypadPress)
|
|
241
|
-
expect((0, _latexBridge.keyToAction)({
|
|
242
|
-
latex: '\\frac{}{}',
|
|
243
|
-
command: '\\frac'
|
|
244
|
-
})).toEqual({
|
|
245
|
-
type: 'insert',
|
|
246
|
-
value: '\\frac{#?}{#?}'
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
});
|
|
251
|
-
//# 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","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 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,188 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
5
|
-
describe('mathlive-instance', function () {
|
|
6
|
-
var instance;
|
|
7
|
-
beforeEach(function () {
|
|
8
|
-
jest.resetModules();
|
|
9
|
-
// eslint-disable-next-line global-require
|
|
10
|
-
instance = require('../mathlive-instance');
|
|
11
|
-
instance.__resetEmbeds();
|
|
12
|
-
});
|
|
13
|
-
describe('registerEmbed', function () {
|
|
14
|
-
it('registers a known embed and exposes it as a macro', function () {
|
|
15
|
-
instance.registerEmbed('answerBlock', function () {
|
|
16
|
-
return {
|
|
17
|
-
htmlString: '<div class="answerBlock"></div>',
|
|
18
|
-
latex: function latex() {
|
|
19
|
-
return '\\embed{answerBlock}[]';
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
expect(instance.registeredEmbeds()).toEqual(['answerBlock']);
|
|
24
|
-
// The macro tags output with data-embed so CSS can target it, replacing
|
|
25
|
-
// MathQuill's htmlString hook.
|
|
26
|
-
expect(instance.getMacros().answerBlock).toEqual('\\htmlData{embed=answerBlock}{\\placeholder{}}');
|
|
27
|
-
});
|
|
28
|
-
it('registers newLine as a harmless macro (it is handled by latex-bridge)', function () {
|
|
29
|
-
instance.registerEmbed('newLine', function () {
|
|
30
|
-
return {
|
|
31
|
-
latex: function latex() {
|
|
32
|
-
return '\\embed{newLine}[]';
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
expect(instance.getMacros().newLine).toEqual('\\htmlData{embed=newLine}{}');
|
|
37
|
-
});
|
|
38
|
-
it('falls back to a placeholder for an unknown embed', function () {
|
|
39
|
-
instance.registerEmbed('somethingCustom', function () {
|
|
40
|
-
return {
|
|
41
|
-
htmlString: '<b>x</b>'
|
|
42
|
-
};
|
|
43
|
-
});
|
|
44
|
-
expect(instance.getMacros().somethingCustom).toEqual('\\htmlData{embed=somethingCustom}{\\placeholder{}}');
|
|
45
|
-
});
|
|
46
|
-
it('honours an explicit mathliveLatex from the factory', function () {
|
|
47
|
-
instance.registerEmbed('custom', function () {
|
|
48
|
-
return {
|
|
49
|
-
mathliveLatex: '\\alpha'
|
|
50
|
-
};
|
|
51
|
-
});
|
|
52
|
-
expect(instance.getMacros().custom).toEqual('\\htmlData{embed=custom}{\\alpha}');
|
|
53
|
-
});
|
|
54
|
-
it('does not throw when the factory throws', function () {
|
|
55
|
-
expect(function () {
|
|
56
|
-
return instance.registerEmbed('bad', function () {
|
|
57
|
-
throw new Error('boom');
|
|
58
|
-
});
|
|
59
|
-
}).not.toThrow();
|
|
60
|
-
expect(instance.registeredEmbeds()).toEqual(['bad']);
|
|
61
|
-
});
|
|
62
|
-
it('ignores bad arguments', function () {
|
|
63
|
-
instance.registerEmbed(undefined, function () {
|
|
64
|
-
return {};
|
|
65
|
-
});
|
|
66
|
-
instance.registerEmbed('noFactory', undefined);
|
|
67
|
-
expect(instance.registeredEmbeds()).toEqual([]);
|
|
68
|
-
});
|
|
69
|
-
it('always includes the pie macro set', function () {
|
|
70
|
-
var macros = instance.getMacros();
|
|
71
|
-
expect(macros.parallelogram).toBeDefined();
|
|
72
|
-
expect(macros.longdiv).toBeDefined();
|
|
73
|
-
expect(macros.napprox).toEqual('\\not\\approx');
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Argument-taking macros exist only so previously authored latex parses.
|
|
77
|
-
// Editing never goes through them: MathLive serialises a macro from its
|
|
78
|
-
// original arguments, so typed content never comes back out.
|
|
79
|
-
it('argument-taking macros are plain parse-only definitions', function () {
|
|
80
|
-
['longdiv', 'overarc', 'abs'].forEach(function (name) {
|
|
81
|
-
expect((0, _typeof2["default"])(instance.PIE_MACROS[name])).toBe('string');
|
|
82
|
-
expect(instance.PIE_MACROS[name]).toContain('#1');
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
it('argument-less symbols stay atomic', function () {
|
|
86
|
-
['perpendicular', 'square', 'degree', 'napprox', 'parallelogram'].forEach(function (name) {
|
|
87
|
-
expect((0, _typeof2["default"])(instance.PIE_MACROS[name])).toBe('string');
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
it('longdiv matches the MathJax macro used by math-rendering', function () {
|
|
91
|
-
expect(instance.PIE_MACROS.longdiv).toEqual('\\enclose{longdiv}{#1}');
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
describe('applyStaticMath', function () {
|
|
95
|
-
it('returns undefined without an element', function () {
|
|
96
|
-
expect(instance.applyStaticMath(null, 'x')).toBeUndefined();
|
|
97
|
-
});
|
|
98
|
-
it('defers (returns undefined) when MathLive has not loaded', function () {
|
|
99
|
-
var el = document.createElement('div');
|
|
100
|
-
expect(instance.applyStaticMath(el, 'x')).toBeUndefined();
|
|
101
|
-
});
|
|
102
|
-
it('renders synchronously once MathLive is available', function () {
|
|
103
|
-
var el = document.createElement('div');
|
|
104
|
-
instance.__setMathLiveForTest({
|
|
105
|
-
convertLatexToMarkup: function convertLatexToMarkup(l) {
|
|
106
|
-
return "<span>".concat(l, "</span>");
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
expect(instance.applyStaticMath(el, '\\pi')).toBe(el);
|
|
110
|
-
expect(el.innerHTML).toEqual('<span>\\pi</span>');
|
|
111
|
-
});
|
|
112
|
-
it('falls back to the element textContent when no latex is passed', function () {
|
|
113
|
-
var el = document.createElement('div');
|
|
114
|
-
el.textContent = '\\theta';
|
|
115
|
-
instance.__setMathLiveForTest({
|
|
116
|
-
convertLatexToMarkup: function convertLatexToMarkup(l) {
|
|
117
|
-
return "<i>".concat(l, "</i>");
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
instance.applyStaticMath(el);
|
|
121
|
-
expect(el.innerHTML).toEqual('<i>\\theta</i>');
|
|
122
|
-
});
|
|
123
|
-
it('bridges stored latex (newLine embed) before rendering', function () {
|
|
124
|
-
var el = document.createElement('div');
|
|
125
|
-
instance.__setMathLiveForTest({
|
|
126
|
-
convertLatexToMarkup: function convertLatexToMarkup(l) {
|
|
127
|
-
return l;
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
instance.applyStaticMath(el, 'a\\embed{newLine}[]b');
|
|
131
|
-
|
|
132
|
-
// \embed{newLine}[] must become a multiline environment
|
|
133
|
-
expect(el.innerHTML).toContain('displaylines');
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
describe('configureFonts', function () {
|
|
137
|
-
// MathLive's default fontsDirectory is the relative './fonts/', which it
|
|
138
|
-
// resolves against its own (empty, when bundled) script url and throws
|
|
139
|
-
// "Invalid base URL" from loadFonts. Paths must become absolute.
|
|
140
|
-
it('is exported and callable before MathLive loads', function () {
|
|
141
|
-
expect((0, _typeof2["default"])(instance.configureFonts)).toBe('function');
|
|
142
|
-
expect(function () {
|
|
143
|
-
return instance.configureFonts('/mathlive-fonts');
|
|
144
|
-
}).not.toThrow();
|
|
145
|
-
});
|
|
146
|
-
it('accepts null to disable font loading', function () {
|
|
147
|
-
expect(function () {
|
|
148
|
-
return instance.configureFonts(null);
|
|
149
|
-
}).not.toThrow();
|
|
150
|
-
});
|
|
151
|
-
it('applies an absolute url to an already-loaded MathfieldElement', function () {
|
|
152
|
-
var MathfieldElement = {};
|
|
153
|
-
|
|
154
|
-
// simulate a loaded instance
|
|
155
|
-
instance.__setMathLiveForTest({
|
|
156
|
-
MathfieldElement: MathfieldElement
|
|
157
|
-
});
|
|
158
|
-
instance.configureFonts('/mathlive-fonts');
|
|
159
|
-
expect(MathfieldElement.fontsDirectory).toEqual("".concat(document.baseURI.replace(/\/$/, ''), "/mathlive-fonts"));
|
|
160
|
-
expect(MathfieldElement.fontsDirectory.startsWith('http')).toBe(true);
|
|
161
|
-
});
|
|
162
|
-
it('leaves a fully-qualified url untouched', function () {
|
|
163
|
-
var MathfieldElement = {};
|
|
164
|
-
instance.__setMathLiveForTest({
|
|
165
|
-
MathfieldElement: MathfieldElement
|
|
166
|
-
});
|
|
167
|
-
instance.configureFonts('https://cdn.example.com/fonts');
|
|
168
|
-
expect(MathfieldElement.fontsDirectory).toEqual('https://cdn.example.com/fonts');
|
|
169
|
-
});
|
|
170
|
-
it('passes null through rather than resolving it', function () {
|
|
171
|
-
var MathfieldElement = {};
|
|
172
|
-
instance.__setMathLiveForTest({
|
|
173
|
-
MathfieldElement: MathfieldElement
|
|
174
|
-
});
|
|
175
|
-
instance.configureFonts(null);
|
|
176
|
-
expect(MathfieldElement.fontsDirectory).toBeNull();
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
describe('latexToMarkup', function () {
|
|
180
|
-
it('returns empty string when MathLive is not loaded', function () {
|
|
181
|
-
expect(instance.latexToMarkup('\\pi')).toEqual('');
|
|
182
|
-
});
|
|
183
|
-
it('returns empty string for empty latex', function () {
|
|
184
|
-
expect(instance.latexToMarkup('')).toEqual('');
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
//# sourceMappingURL=mathlive-instance.test.js.map
|
|
@@ -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","toBeNull","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 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 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":[]}
|