@pie-lib/math-input-mathlive 1.0.10 → 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.
- package/lib/keys/misc.js +9 -2
- package/lib/keys/misc.js.map +1 -1
- package/lib/latex-bridge.js +30 -0
- package/lib/latex-bridge.js.map +1 -1
- package/lib/mathlive-instance.js +67 -3
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/input.js +7 -0
- package/lib/mf/input.js.map +1 -1
- package/lib/mf/static.js +82 -1
- package/lib/mf/static.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/keypad-label.test.jsx +58 -5
- package/src/__tests__/latex-bridge.test.js +22 -0
- package/src/__tests__/mathlive-instance.test.js +128 -0
- package/src/__tests__/mount-race.test.jsx +1 -0
- package/src/__tests__/static-prompts.test.jsx +113 -0
- package/src/keys/misc.js +8 -2
- package/src/latex-bridge.js +34 -0
- package/src/mathlive-instance.js +75 -1
- package/src/mf/input.jsx +15 -1
- package/src/mf/static.jsx +94 -2
- package/lib/__tests__/composites.test.js +0 -255
- package/lib/__tests__/composites.test.js.map +0 -1
- 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 -118
- package/lib/__tests__/keypad-label.test.js.map +0 -1
- package/lib/__tests__/keypad-render.test.js +0 -206
- package/lib/__tests__/keypad-render.test.js.map +0 -1
- package/lib/__tests__/latex-bridge.test.js +0 -280
- package/lib/__tests__/latex-bridge.test.js.map +0 -1
- package/lib/__tests__/mathlive-instance.test.js +0 -279
- package/lib/__tests__/mathlive-instance.test.js.map +0 -1
- package/lib/__tests__/mount-race.test.js +0 -195
- package/lib/__tests__/mount-race.test.js.map +0 -1
- package/lib/__tests__/static-prompts.test.js +0 -282
- package/lib/__tests__/static-prompts.test.js.map +0 -1
|
@@ -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":";;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAEA,IAAAG,MAAA,GAAAH,OAAA;AAA8B,SAAAI,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,MAAA,CAAAC,IAAA,CAAAJ,CAAA,OAAAG,MAAA,CAAAE,qBAAA,QAAAC,CAAA,GAAAH,MAAA,CAAAE,qBAAA,CAAAL,CAAA,GAAAC,CAAA,KAAAK,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAN,CAAA,WAAAE,MAAA,CAAAK,wBAAA,CAAAR,CAAA,EAAAC,CAAA,EAAAQ,UAAA,OAAAP,CAAA,CAAAQ,IAAA,CAAAC,KAAA,CAAAT,CAAA,EAAAI,CAAA,YAAAJ,CAAA;AAAA,SAAAU,cAAAZ,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAY,SAAA,CAAAC,MAAA,EAAAb,CAAA,UAAAC,CAAA,WAAAW,SAAA,CAAAZ,CAAA,IAAAY,SAAA,CAAAZ,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAI,MAAA,CAAAD,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,aAAAhB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAE,MAAA,CAAAc,yBAAA,GAAAd,MAAA,CAAAe,gBAAA,CAAAlB,CAAA,EAAAG,MAAA,CAAAc,yBAAA,CAAAf,CAAA,KAAAH,OAAA,CAAAI,MAAA,CAAAD,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAE,MAAA,CAAAgB,cAAA,CAAAnB,CAAA,EAAAC,CAAA,EAAAE,MAAA,CAAAK,wBAAA,CAAAN,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAoB,QAAQ,CAAC,0DAA0D,EAAE,YAAM;EACzEA,QAAQ,CAAC,iCAAiC,EAAE,YAAM;IAChDC,EAAE,CAAC,uEAAuE,EAAE,YAAM;MAChF,IAAAC,kBAAA,GAA4DC,SAAE,CAACC,cAAc;QAArEC,kBAAkB,GAAAH,kBAAA,CAAlBG,kBAAkB;QAAEC,aAAa,GAAAJ,kBAAA,CAAbI,aAAa;QAAEC,YAAY,GAAAL,kBAAA,CAAZK,YAAY;MAEvDC,MAAM,CAACH,kBAAkB,CAAC,CAACI,WAAW,CAAC,CAAC;MACxCD,MAAM,CAACF,aAAa,CAAC,CAACG,WAAW,CAAC,CAAC;MACnCD,MAAM,CAACD,YAAY,CAAC,CAACE,WAAW,CAAC,CAAC;IACpC,CAAC,CAAC;IAEFR,EAAE,CAAC,qDAAqD,EAAE,YAAM;MAC9D,IAAAS,mBAAA,GAAoFP,SAAE,CAACC,cAAc;QAA7FC,kBAAkB,GAAAK,mBAAA,CAAlBL,kBAAkB;QAAEM,sBAAsB,GAAAD,mBAAA,CAAtBC,sBAAsB;QAAEL,aAAa,GAAAI,mBAAA,CAAbJ,aAAa;QAAEC,YAAY,GAAAG,mBAAA,CAAZH,YAAY;MAE/EC,MAAM,CAACG,sBAAsB,CAAC,CAACF,WAAW,CAAC,CAAC;MAC5C;MACAD,MAAM,CAAC;QAAA,OAAAhB,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAAA,aAAA,KACFa,kBAAkB,GAClBM,sBAAsB,GACtBL,aAAa,GACbC,YAAY;MAAA,CACf,CAAC,CAACK,GAAG,CAACC,OAAO,CAAC,CAAC;IACnB,CAAC,CAAC;IAEFZ,EAAE,CAAC,sEAAsE,EAAE,YAAM;MAC/E,IAAAa,mBAAA,GAA4DX,SAAE,CAACC,cAAc;QAArEC,kBAAkB,GAAAS,mBAAA,CAAlBT,kBAAkB;QAAEC,aAAa,GAAAQ,mBAAA,CAAbR,aAAa;QAAEC,YAAY,GAAAO,mBAAA,CAAZP,YAAY;MACvD,IAAMQ,MAAM,GAAG,IAAAC,cAAM,EAAC,KAAK,CAAC,CAAAxB,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAAMa,kBAAkB,GAAKC,aAAa,GAAKC,YAAY,CAAE,CAAC;MAE1FC,MAAM,CAAC;QAAA,OAAM,IAAAS,cAAM,eAAC5C,MAAA,YAAA6C,aAAA,CAACH,MAAM,MAAE,CAAC,CAAC;MAAA,EAAC,CAACH,GAAG,CAACC,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFb,QAAQ,CAAC,UAAU,EAAE,YAAM;IACzBC,EAAE,CAAC,8CAA8C,EAAE,YAAM;MACvD,IAAMkB,UAAU,GAAG,IAAAH,cAAM,EAACb,SAAE,CAACiB,KAAK,CAAC,CAAC;QAAA,OAAO;UAAEC,KAAK,EAAE;QAAO,CAAC;MAAA,CAAC,CAAC;MAE9Db,MAAM,CAAC;QAAA,OAAM,IAAAS,cAAM,eAAC5C,MAAA,YAAA6C,aAAA,CAACC,UAAU;UAACG,KAAK,EAAC,gBAAc;UAACC,QAAQ,EAAE,SAAVA,QAAQA,CAAA,EAAQ,CAAC;QAAE,CAAE,CAAC,CAAC;MAAA,EAAC,CAACX,GAAG,CAACC,OAAO,CAAC,CAAC;IAC7F,CAAC,CAAC;IAEFZ,EAAE,CAAC,6CAA6C,EAAE,YAAM;MACtD,IAAMc,MAAM,GAAG,IAAAC,cAAM,EAACb,SAAE,CAACiB,KAAK,CAAC,CAAC;QAAEI,OAAO,EAAE;MAAE,CAAC,CAAC;MAC/C,IAAAC,OAAA,GAAsB,IAAAR,cAAM,eAAC5C,MAAA,YAAA6C,aAAA,CAACH,MAAM;UAACO,KAAK,EAAC,GAAG;UAACC,QAAQ,EAAE,SAAVA,QAAQA,CAAA,EAAQ,CAAC;QAAE,CAAE,CAAC,CAAC;QAA9DG,SAAS,GAAAD,OAAA,CAATC,SAAS;MAEjBlB,MAAM,CAACkB,SAAS,CAACC,UAAU,CAAC,CAACC,UAAU,CAAC,CAAC;MACzCpB,MAAM,CAACkB,SAAS,CAACC,UAAU,CAACE,SAAS,CAAC,CAACD,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF5B,QAAQ,CAAC,WAAW,EAAE,YAAM;IAC1BC,EAAE,CAAC,sDAAsD,EAAE,YAAM;MAC/DO,MAAM,CAAC;QAAA,OAAM,IAAAS,cAAM,eAAC5C,MAAA,YAAA6C,aAAA,CAACxC,MAAA,CAAAyB,EAAE,CAAC2B,MAAM;UAACR,KAAK,EAAE,cAAe;UAACS,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;UAACC,MAAM,EAAE,SAARA,MAAMA,CAAA,EAAQ,CAAC;QAAE,CAAE,CAAC,CAAC;MAAA,EAAC,CAACpB,GAAG,CAACC,OAAO,CAAC,CAAC;IAC/G,CAAC,CAAC;IAEFZ,EAAE,CAAC,sDAAsD,EAAE,YAAM;MAC/DO,MAAM,CAAC;QAAA,OAAM,IAAAS,cAAM,eAAC5C,MAAA,YAAA6C,aAAA,CAACxC,MAAA,CAAAyB,EAAE,CAAC2B,MAAM;UAACR,KAAK,EAAE;QAAM,CAAE,CAAC,CAAC;MAAA,EAAC,CAACV,GAAG,CAACC,OAAO,CAAC,CAAC;IACjE,CAAC,CAAC;IAEFZ,EAAE,CAAC,uEAAuE,EAAE,YAAM;MAChFO,MAAM,CAAC;QAAA,OACL,IAAAS,cAAM,eAAC5C,MAAA,YAAA6C,aAAA,CAACxC,MAAA,CAAAyB,EAAE,CAAC2B,MAAM;UAACR,KAAK,EAAE,8BAA+B;UAACW,gBAAgB,EAAE,SAAlBA,gBAAgBA,CAAA,EAAQ,CAAC;QAAE,CAAE,CAAC,CAAC;MAAA,CAC1F,CAAC,CAACrB,GAAG,CAACC,OAAO,CAAC,CAAC;IACjB,CAAC,CAAC;IAEFZ,EAAE,CAAC,mDAAmD,EAAE,YAAM;MAC5D,IAAMc,MAAM,GAAG,IAAAC,cAAM,EAACb,SAAE,CAAC2B,MAAM,CAAC,CAAC;QAAEI,aAAa,EAAE;MAAO,CAAC,CAAC;MAE3D1B,MAAM,CAAC;QAAA,OAAM,IAAAS,cAAM,eAAC5C,MAAA,YAAA6C,aAAA,CAACH,MAAM;UAACO,KAAK,EAAE;QAAO,CAAE,CAAC,CAAC;MAAA,EAAC,CAACV,GAAG,CAACC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFb,QAAQ,CAAC,gBAAgB,EAAE,YAAM;IAC/BC,EAAE,CAAC,+CAA+C,EAAE,YAAM;MACxD;MACA,IAAMkC,GAAG,GAAG5D,OAAO,CAAC,UAAU,CAAC;MAE/B,CACE,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,MAAM,EACN,kBAAkB,EAClB,IAAI,EACJ,aAAa,EACb,eAAe,EACf,iBAAiB,CAClB,CAACoB,OAAO,CAAC,UAACyC,IAAI,EAAK;QAClB5B,MAAM,CAAC2B,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC3B,WAAW,CAAC,CAAC;MACjC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFR,EAAE,CAAC,6CAA6C,EAAE,YAAM;MACtD,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAACN,OAAO,CAAC,UAACyC,IAAI,EAAK;QACtD5B,MAAM,CAACL,SAAE,CAACiC,IAAI,CAAC,CAAC,CAAC3B,WAAW,CAAC,CAAC;MAChC,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","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,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 _latexBridge = require("../latex-bridge");
|
|
6
|
-
/**
|
|
7
|
-
* Keys use empty groups to show a command's shape (`\frac{}{}`, `x^{}`).
|
|
8
|
-
* MathLive renders `{}` as nothing, so labels need a visible stand-in - but the
|
|
9
|
-
* value that gets *inserted* must stay untouched.
|
|
10
|
-
*/
|
|
11
|
-
describe('keypad label display normalisation', function () {
|
|
12
|
-
it('gives empty groups a visible glyph', function () {
|
|
13
|
-
var out = (0, _latexBridge.withVisibleEmptySlots)('\\frac{}{}');
|
|
14
|
-
expect(out).not.toEqual('\\frac{}{}');
|
|
15
|
-
// a \rule, not a glyph: font metrics for a substituted glyph do not match
|
|
16
|
-
// MathLive's, which left stretchy accents narrower than the box
|
|
17
|
-
expect(out).toContain('\\rule');
|
|
18
|
-
expect(out).toContain('pie-empty');
|
|
19
|
-
});
|
|
20
|
-
it('handles every empty-group key shape', function () {
|
|
21
|
-
['\\frac{}{}', '\\overline{}', 'x^{}', 'x_{}', '\\sqrt{}', '\\sqrt[{}]{}', '\\abs{}', '\\log_{}', '\\longdiv{}'].forEach(function (latex) {
|
|
22
|
-
expect((0, _latexBridge.withVisibleEmptySlots)(latex)).not.toContain('{}');
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
it('treats a whitespace-only group as empty', function () {
|
|
26
|
-
// e.g. \frac{x}{ }
|
|
27
|
-
expect((0, _latexBridge.withVisibleEmptySlots)('\\frac{x}{ }')).toContain('pie-empty');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
// MathQuill needed a nested \overline{} to draw the empty box. MathLive
|
|
31
|
-
// renders that as a real line, so those labels showed a spurious bar (a line
|
|
32
|
-
// under the arrows, and a straight line instead of the arc).
|
|
33
|
-
it('accent keys do not carry the nested-overline box hack', function () {
|
|
34
|
-
// eslint-disable-next-line global-require
|
|
35
|
-
var geometry = require('../keys/geometry');
|
|
36
|
-
Object.values(geometry).forEach(function (key) {
|
|
37
|
-
if (key && typeof key.latex === 'string') {
|
|
38
|
-
expect(key.latex).not.toContain('\\overline{}}');
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
it('an accent over an empty slot still gets a visible box', function () {
|
|
43
|
-
['\\overleftrightarrow{}', '\\overarc{}'].forEach(function (latex) {
|
|
44
|
-
var out = (0, _latexBridge.withVisibleEmptySlots)(latex);
|
|
45
|
-
expect(out).toContain('pie-empty');
|
|
46
|
-
expect(out).not.toContain('\\overline');
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,
|
|
51
|
-
// so the browser substituted a wider one and stretchy accents came out
|
|
52
|
-
// narrower than the box. A rule has an explicit width.
|
|
53
|
-
it('the empty slot has an explicit width, not font-dependent metrics', function () {
|
|
54
|
-
var out = (0, _latexBridge.withVisibleEmptySlots)('\\overarc{}');
|
|
55
|
-
expect(out).toContain('\\rule');
|
|
56
|
-
expect(out).toMatch(/rule\{[\d.]+em\}\{[\d.]+em\}/);
|
|
57
|
-
expect(out).not.toContain('unicode');
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// Measured in the browser: the accent's immediate wrapper computes to 0px
|
|
61
|
-
// (its .ML__stretchy child is absolutely positioned), so the svg width has to
|
|
62
|
-
// resolve against .ML__base - whose width equals the content. Without pinning
|
|
63
|
-
// that, the arc collapsed to a spike and sat right of the box.
|
|
64
|
-
it('pins the accent containing block and drops the centering shift', function () {
|
|
65
|
-
// eslint-disable-next-line global-require
|
|
66
|
-
var _require = require('../mf/common-styles'),
|
|
67
|
-
placeholderStyles = _require.placeholderStyles;
|
|
68
|
-
expect(placeholderStyles['& .ML__base'].position).toEqual('relative');
|
|
69
|
-
expect(placeholderStyles['& .ML__stretchy']).toEqual({
|
|
70
|
-
position: 'absolute',
|
|
71
|
-
left: 0,
|
|
72
|
-
width: '100%'
|
|
73
|
-
});
|
|
74
|
-
// must be !important: MathLive writes margin-left as an inline style, and a
|
|
75
|
-
// class cannot override that. Leaving it un-important also halved the arc's
|
|
76
|
-
// width, because .ML__center is the stretchy's containing block.
|
|
77
|
-
expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');
|
|
78
|
-
});
|
|
79
|
-
it('applies those rules wherever static math renders', function () {
|
|
80
|
-
// eslint-disable-next-line global-require
|
|
81
|
-
var cs = require('../mf/common-styles');
|
|
82
|
-
['commonKeyboardStyles', 'commonMathLiveStyles'].forEach(function (name) {
|
|
83
|
-
expect(cs[name]['& .ML__stretchy']).toBeDefined();
|
|
84
|
-
expect(cs[name]['& .ML__base']).toBeDefined();
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
// A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule
|
|
89
|
-
// is descendant-scoped to .ML__latex .ML__stretchy svg.
|
|
90
|
-
it('does not use a blanket svg rule', function () {
|
|
91
|
-
// eslint-disable-next-line global-require
|
|
92
|
-
var cs = require('../mf/common-styles');
|
|
93
|
-
Object.values(cs).forEach(function (style) {
|
|
94
|
-
if (style && (0, _typeof2["default"])(style) === 'object') {
|
|
95
|
-
expect(Object.keys(style)).not.toContain('& svg');
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
it('leaves latex without empty groups alone', function () {
|
|
100
|
-
['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach(function (latex) {
|
|
101
|
-
expect((0, _latexBridge.withVisibleEmptySlots)(latex)).toEqual(latex);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
it('handles nullish input', function () {
|
|
105
|
-
expect((0, _latexBridge.withVisibleEmptySlots)(undefined)).toEqual('');
|
|
106
|
-
expect((0, _latexBridge.withVisibleEmptySlots)('')).toEqual('');
|
|
107
|
-
});
|
|
108
|
-
it('does NOT affect what gets inserted into the field', function () {
|
|
109
|
-
// the action must use the key's own latex, never the display form
|
|
110
|
-
var key = {
|
|
111
|
-
name: 'frac',
|
|
112
|
-
latex: '\\frac{}{}'
|
|
113
|
-
};
|
|
114
|
-
expect((0, _latexBridge.keyToAction)(key).value).toEqual('\\frac{}{}');
|
|
115
|
-
expect((0, _latexBridge.keyToAction)(key).value).not.toContain('pie-empty');
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
//# 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","geometry","Object","values","key","toMatch","_require","placeholderStyles","position","left","width","marginLeft","cs","name","toBeDefined","style","_typeof2","keys","undefined","keyToAction","value"],"sources":["../../src/__tests__/keypad-label.test.jsx"],"sourcesContent":["import { withVisibleEmptySlots as latexForDisplay } from '../latex-bridge';\nimport { keyToAction } from '../latex-bridge';\n\n/**\n * Keys use empty groups to show a command's shape (`\\frac{}{}`, `x^{}`).\n * MathLive renders `{}` as nothing, so labels need a visible stand-in - but the\n * value that gets *inserted* must stay untouched.\n */\ndescribe('keypad label display normalisation', () => {\n it('gives empty groups a visible glyph', () => {\n const out = latexForDisplay('\\\\frac{}{}');\n\n expect(out).not.toEqual('\\\\frac{}{}');\n // a \\rule, not a glyph: font metrics for a substituted glyph do not match\n // MathLive's, which left stretchy accents narrower than the box\n expect(out).toContain('\\\\rule');\n expect(out).toContain('pie-empty');\n });\n\n it('handles every empty-group key shape', () => {\n ['\\\\frac{}{}', '\\\\overline{}', 'x^{}', 'x_{}', '\\\\sqrt{}', '\\\\sqrt[{}]{}', '\\\\abs{}', '\\\\log_{}', '\\\\longdiv{}'].forEach(\n (latex) => {\n expect(latexForDisplay(latex)).not.toContain('{}');\n },\n );\n });\n\n it('treats a whitespace-only group as empty', () => {\n // e.g. \\frac{x}{ }\n expect(latexForDisplay('\\\\frac{x}{ }')).toContain('pie-empty');\n });\n\n // MathQuill needed a nested \\overline{} to draw the empty box. MathLive\n // renders that as a real line, so those labels showed a spurious bar (a line\n // under the arrows, and a straight line instead of the arc).\n it('accent keys do not carry the nested-overline box hack', () => {\n // eslint-disable-next-line global-require\n const geometry = require('../keys/geometry');\n\n Object.values(geometry).forEach((key) => {\n if (key && typeof key.latex === 'string') {\n expect(key.latex).not.toContain('\\\\overline{}}');\n }\n });\n });\n\n it('an accent over an empty slot still gets a visible box', () => {\n ['\\\\overleftrightarrow{}', '\\\\overarc{}'].forEach((latex) => {\n const out = latexForDisplay(latex);\n\n expect(out).toContain('pie-empty');\n expect(out).not.toContain('\\\\overline');\n });\n });\n\n // A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,\n // so the browser substituted a wider one and stretchy accents came out\n // narrower than the box. A rule has an explicit width.\n it('the empty slot has an explicit width, not font-dependent metrics', () => {\n const out = latexForDisplay('\\\\overarc{}');\n\n expect(out).toContain('\\\\rule');\n expect(out).toMatch(/rule\\{[\\d.]+em\\}\\{[\\d.]+em\\}/);\n expect(out).not.toContain('unicode');\n });\n\n // Measured in the browser: the accent's immediate wrapper computes to 0px\n // (its .ML__stretchy child is absolutely positioned), so the svg width has to\n // resolve against .ML__base - whose width equals the content. Without pinning\n // that, the arc collapsed to a spike and sat right of the box.\n it('pins the accent containing block and drops the centering shift', () => {\n // eslint-disable-next-line global-require\n const { placeholderStyles } = require('../mf/common-styles');\n\n expect(placeholderStyles['& .ML__base'].position).toEqual('relative');\n expect(placeholderStyles['& .ML__stretchy']).toEqual({ position: 'absolute', left: 0, width: '100%' });\n // must be !important: MathLive writes margin-left as an inline style, and a\n // class cannot override that. Leaving it un-important also halved the arc's\n // width, because .ML__center is the stretchy's containing block.\n expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');\n });\n\n it('applies those rules wherever static math renders', () => {\n // eslint-disable-next-line global-require\n const cs = require('../mf/common-styles');\n\n ['commonKeyboardStyles', 'commonMathLiveStyles'].forEach((name) => {\n expect(cs[name]['& .ML__stretchy']).toBeDefined();\n expect(cs[name]['& .ML__base']).toBeDefined();\n });\n });\n\n // A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule\n // is descendant-scoped to .ML__latex .ML__stretchy svg.\n it('does not use a blanket svg rule', () => {\n // eslint-disable-next-line global-require\n const cs = require('../mf/common-styles');\n\n Object.values(cs).forEach((style) => {\n if (style && typeof style === 'object') {\n expect(Object.keys(style)).not.toContain('& svg');\n }\n });\n });\n\n it('leaves latex without empty groups alone', () => {\n ['\\\\pi', '\\\\sin', 'x^2', '\\\\overline{AB}'].forEach((latex) => {\n expect(latexForDisplay(latex)).toEqual(latex);\n });\n });\n\n it('handles nullish input', () => {\n expect(latexForDisplay(undefined)).toEqual('');\n expect(latexForDisplay('')).toEqual('');\n });\n\n it('does NOT affect what gets inserted into the field', () => {\n // the action must use the key's own latex, never the display form\n const key = { name: 'frac', latex: '\\\\frac{}{}' };\n\n expect(keyToAction(key).value).toEqual('\\\\frac{}{}');\n expect(keyToAction(key).value).not.toContain('pie-empty');\n });\n});\n"],"mappings":"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","ignoreList":[]}
|