@pie-lib/math-input-mathlive 1.1.5-beta.10 → 1.1.5-beta.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/__tests__/input-selection.test.js +103 -0
- package/lib/__tests__/keypad-label.test.js +13 -1
- package/lib/__tests__/latex-bridge.test.js +29 -1
- package/lib/__tests__/longdiv-wiring.test.js +215 -0
- package/lib/__tests__/longdiv.test.js +281 -0
- package/lib/__tests__/selection.test.js +195 -0
- package/lib/keypad/index.js +9 -1
- package/lib/keypad/index.js.map +1 -1
- package/lib/longdiv.js +173 -0
- package/lib/longdiv.js.map +1 -0
- package/lib/mathlive-instance.js +4 -0
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/input.js +16 -0
- package/lib/mf/input.js.map +1 -1
- package/lib/mf/static.js +13 -1
- package/lib/mf/static.js.map +1 -1
- package/lib/selection.js +148 -0
- package/lib/selection.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/input-selection.test.jsx +64 -0
- package/src/__tests__/longdiv-wiring.test.jsx +137 -0
- package/src/__tests__/longdiv.test.js +259 -0
- package/src/__tests__/selection.test.js +247 -0
- package/src/keypad/index.jsx +14 -2
- package/src/longdiv.js +172 -0
- package/src/mathlive-instance.js +4 -0
- package/src/mf/input.jsx +18 -0
- package/src/mf/static.jsx +15 -1
- package/src/selection.js +141 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _selection = require("../selection");
|
|
4
|
+
/**
|
|
5
|
+
* Offset tables captured from MathLive 0.110.0 `getElementInfo(i)` in Chrome,
|
|
6
|
+
* as [depth, latex] per offset. Offset `i` is the atom ending at caret `i`.
|
|
7
|
+
*/
|
|
8
|
+
var table = function table(rows) {
|
|
9
|
+
return function (i) {
|
|
10
|
+
return rows[i] ? {
|
|
11
|
+
depth: rows[i][0],
|
|
12
|
+
latex: rows[i][1]
|
|
13
|
+
} : undefined;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// 5x^2+2x+\frac{\pi}{2}-4
|
|
18
|
+
var POLY = table([[0, ''], [0, '5'], [0, 'x'], [1, ''], [1, '2'], [0, '^2'], [0, '+'], [0, '2'], [0, 'x'], [0, '+'], [1, ''], [1, '\\pi'], [1, ''], [1, '2'], [0, '\\frac{\\pi}{2}'], [0, '-'], [0, '4']]);
|
|
19
|
+
var POLY_LAST = 16;
|
|
20
|
+
|
|
21
|
+
// a+\sqrt{x+1}+b
|
|
22
|
+
var ROOT = table([[0, ''], [0, 'a'], [0, '+'], [1, ''], [1, 'x'], [1, '+'], [1, '1'], [0, '\\sqrt{x+1}'], [0, '+'], [0, 'b']]);
|
|
23
|
+
|
|
24
|
+
// \frac{\frac{a}{b}}{c}
|
|
25
|
+
var NESTED = table([[0, ''], [1, ''], [2, ''], [2, 'a'], [2, ''], [2, 'b'], [1, '\\frac{a}{b}'], [1, ''], [1, 'c'], [0, '\\frac{\\frac{a}{b}}{c}']]);
|
|
26
|
+
describe('expandRange', function () {
|
|
27
|
+
var poly = function poly(a, b) {
|
|
28
|
+
return (0, _selection.expandRange)(a, b, POLY, POLY_LAST);
|
|
29
|
+
};
|
|
30
|
+
it('leaves a selection of whole sibling atoms alone', function () {
|
|
31
|
+
expect(poly(6, 7)).toEqual([6, 7]); // 2
|
|
32
|
+
expect(poly(6, 9)).toEqual([6, 9]); // 2x+
|
|
33
|
+
expect(poly(6, 15)).toEqual([6, 15]); // 2x+\frac{\pi}{2}-
|
|
34
|
+
expect(poly(0, 16)).toEqual([0, 16]);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// The reported case: five Shift+Right presses from before `2x` gave `2x+\pi`.
|
|
38
|
+
it('takes the whole fraction when the selection reaches into it', function () {
|
|
39
|
+
expect(poly(6, 10)).toEqual([6, 14]);
|
|
40
|
+
expect(poly(6, 11)).toEqual([6, 14]);
|
|
41
|
+
expect(poly(6, 13)).toEqual([6, 14]);
|
|
42
|
+
});
|
|
43
|
+
it('takes the whole fraction when the selection leaves it', function () {
|
|
44
|
+
expect(poly(11, 15)).toEqual([9, 15]); // from the pi to after the minus
|
|
45
|
+
});
|
|
46
|
+
it('crossing from numerator to denominator selects the fraction', function () {
|
|
47
|
+
expect(poly(11, 13)).toEqual([9, 14]);
|
|
48
|
+
expect(poly(11, 12)).toEqual([9, 14]);
|
|
49
|
+
});
|
|
50
|
+
it('a selection inside one branch stays inside it', function () {
|
|
51
|
+
expect(poly(10, 11)).toEqual([10, 11]); // \pi
|
|
52
|
+
expect(poly(12, 13)).toEqual([12, 13]); // the 2 of the denominator
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// MathLive stores x^2 as `x` then a separate `^2` atom.
|
|
56
|
+
it('keeps a superscript with its base', function () {
|
|
57
|
+
expect(poly(3, 7)).toEqual([1, 7]); // x^2+2, not ^2+2
|
|
58
|
+
expect(poly(4, 6)).toEqual([1, 6]); // x^2+
|
|
59
|
+
});
|
|
60
|
+
it('accepts a reversed range', function () {
|
|
61
|
+
expect(poly(11, 6)).toEqual([6, 14]);
|
|
62
|
+
});
|
|
63
|
+
it('leaves a collapsed range alone', function () {
|
|
64
|
+
expect(poly(11, 11)).toEqual([11, 11]);
|
|
65
|
+
});
|
|
66
|
+
it('handles roots the same way', function () {
|
|
67
|
+
expect((0, _selection.expandRange)(2, 4, ROOT, 9)).toEqual([2, 7]);
|
|
68
|
+
expect((0, _selection.expandRange)(4, 6, ROOT, 9)).toEqual([4, 6]); // +1 inside the radicand
|
|
69
|
+
});
|
|
70
|
+
it('climbs as many levels as needed in nested fractions', function () {
|
|
71
|
+
expect((0, _selection.expandRange)(2, 3, NESTED, 9)).toEqual([2, 3]); // a
|
|
72
|
+
expect((0, _selection.expandRange)(3, 5, NESTED, 9)).toEqual([1, 6]); // a/b crossing -> inner fraction
|
|
73
|
+
expect((0, _selection.expandRange)(6, 7, NESTED, 9)).toEqual([0, 9]); // inner -> outer denominator
|
|
74
|
+
});
|
|
75
|
+
it('tolerates missing info', function () {
|
|
76
|
+
expect((0, _selection.expandRange)(1, 3, function () {
|
|
77
|
+
return undefined;
|
|
78
|
+
}, 5)).toEqual([1, 3]);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('trackWholeAtomSelection', function () {
|
|
82
|
+
var stubField = function stubField(range) {
|
|
83
|
+
var direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'forward';
|
|
84
|
+
var listeners = {};
|
|
85
|
+
return {
|
|
86
|
+
selection: {
|
|
87
|
+
ranges: [range],
|
|
88
|
+
direction: direction
|
|
89
|
+
},
|
|
90
|
+
get selectionIsCollapsed() {
|
|
91
|
+
return this.selection.ranges[0][0] === this.selection.ranges[0][1];
|
|
92
|
+
},
|
|
93
|
+
lastOffset: POLY_LAST,
|
|
94
|
+
getElementInfo: POLY,
|
|
95
|
+
sets: 0,
|
|
96
|
+
addEventListener: function addEventListener(type, fn) {
|
|
97
|
+
listeners[type] = fn;
|
|
98
|
+
},
|
|
99
|
+
removeEventListener: function removeEventListener(type, fn) {
|
|
100
|
+
if (listeners[type] === fn) {
|
|
101
|
+
delete listeners[type];
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
fire: function fire(type) {
|
|
105
|
+
if (listeners[type]) {
|
|
106
|
+
listeners[type]();
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
has: function has(type) {
|
|
110
|
+
return !!listeners[type];
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
var track = function track(field) {
|
|
115
|
+
// count assignments without breaking the getter
|
|
116
|
+
var current = field.selection;
|
|
117
|
+
Object.defineProperty(field, 'selection', {
|
|
118
|
+
get: function get() {
|
|
119
|
+
return current;
|
|
120
|
+
},
|
|
121
|
+
set: function set(v) {
|
|
122
|
+
field.sets += 1;
|
|
123
|
+
current = v;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return (0, _selection.trackWholeAtomSelection)(field);
|
|
127
|
+
};
|
|
128
|
+
it('widens the selection on selection-change', function () {
|
|
129
|
+
var field = stubField([6, 11]);
|
|
130
|
+
track(field);
|
|
131
|
+
field.fire('selection-change');
|
|
132
|
+
expect(field.selection.ranges).toEqual([[6, 14]]);
|
|
133
|
+
});
|
|
134
|
+
it('preserves the direction, so Shift+Arrow keeps extending the same end', function () {
|
|
135
|
+
var field = stubField([11, 16], 'backward');
|
|
136
|
+
track(field);
|
|
137
|
+
field.fire('selection-change');
|
|
138
|
+
expect(field.selection).toEqual({
|
|
139
|
+
ranges: [[9, 16]],
|
|
140
|
+
direction: 'backward'
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
it('does not touch a selection that is already whole', function () {
|
|
144
|
+
var field = stubField([6, 9]);
|
|
145
|
+
track(field);
|
|
146
|
+
field.fire('selection-change');
|
|
147
|
+
expect(field.sets).toBe(0);
|
|
148
|
+
});
|
|
149
|
+
it('ignores a collapsed caret', function () {
|
|
150
|
+
var field = stubField([11, 11]);
|
|
151
|
+
track(field);
|
|
152
|
+
field.fire('selection-change');
|
|
153
|
+
expect(field.sets).toBe(0);
|
|
154
|
+
});
|
|
155
|
+
it('does not recurse when its own assignment fires selection-change', function () {
|
|
156
|
+
var field = stubField([6, 11]);
|
|
157
|
+
var current = field.selection;
|
|
158
|
+
Object.defineProperty(field, 'selection', {
|
|
159
|
+
get: function get() {
|
|
160
|
+
return current;
|
|
161
|
+
},
|
|
162
|
+
set: function set(v) {
|
|
163
|
+
field.sets += 1;
|
|
164
|
+
current = v;
|
|
165
|
+
field.fire('selection-change');
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
(0, _selection.trackWholeAtomSelection)(field);
|
|
169
|
+
field.fire('selection-change');
|
|
170
|
+
expect(field.sets).toBe(1);
|
|
171
|
+
expect(field.selection.ranges).toEqual([[6, 14]]);
|
|
172
|
+
});
|
|
173
|
+
it('survives a field that throws', function () {
|
|
174
|
+
var field = stubField([6, 11]);
|
|
175
|
+
field.getElementInfo = function () {
|
|
176
|
+
throw new Error('boom');
|
|
177
|
+
};
|
|
178
|
+
track(field);
|
|
179
|
+
expect(function () {
|
|
180
|
+
return field.fire('selection-change');
|
|
181
|
+
}).not.toThrow();
|
|
182
|
+
});
|
|
183
|
+
it('tears down its listener', function () {
|
|
184
|
+
var field = stubField([6, 11]);
|
|
185
|
+
var untrack = track(field);
|
|
186
|
+
expect(field.has('selection-change')).toBe(true);
|
|
187
|
+
untrack();
|
|
188
|
+
expect(field.has('selection-change')).toBe(false);
|
|
189
|
+
});
|
|
190
|
+
it('is a no-op without a field', function () {
|
|
191
|
+
expect((0, _selection.trackWholeAtomSelection)(undefined)).toBeUndefined();
|
|
192
|
+
expect((0, _selection.trackWholeAtomSelection)({})).toBeUndefined();
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2VsZWN0aW9uIiwicmVxdWlyZSIsInRhYmxlIiwicm93cyIsImkiLCJkZXB0aCIsImxhdGV4IiwidW5kZWZpbmVkIiwiUE9MWSIsIlBPTFlfTEFTVCIsIlJPT1QiLCJORVNURUQiLCJkZXNjcmliZSIsInBvbHkiLCJhIiwiYiIsImV4cGFuZFJhbmdlIiwiaXQiLCJleHBlY3QiLCJ0b0VxdWFsIiwic3R1YkZpZWxkIiwicmFuZ2UiLCJkaXJlY3Rpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJsaXN0ZW5lcnMiLCJzZWxlY3Rpb24iLCJyYW5nZXMiLCJzZWxlY3Rpb25Jc0NvbGxhcHNlZCIsImxhc3RPZmZzZXQiLCJnZXRFbGVtZW50SW5mbyIsInNldHMiLCJhZGRFdmVudExpc3RlbmVyIiwidHlwZSIsImZuIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZpcmUiLCJoYXMiLCJ0cmFjayIsImZpZWxkIiwiY3VycmVudCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0Iiwic2V0IiwidiIsInRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uIiwidG9CZSIsIkVycm9yIiwibm90IiwidG9UaHJvdyIsInVudHJhY2siLCJ0b0JlVW5kZWZpbmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9zZWxlY3Rpb24udGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBhbmRSYW5nZSwgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24gfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuXG4vKipcbiAqIE9mZnNldCB0YWJsZXMgY2FwdHVyZWQgZnJvbSBNYXRoTGl2ZSAwLjExMC4wIGBnZXRFbGVtZW50SW5mbyhpKWAgaW4gQ2hyb21lLFxuICogYXMgW2RlcHRoLCBsYXRleF0gcGVyIG9mZnNldC4gT2Zmc2V0IGBpYCBpcyB0aGUgYXRvbSBlbmRpbmcgYXQgY2FyZXQgYGlgLlxuICovXG5jb25zdCB0YWJsZSA9IChyb3dzKSA9PiAoaSkgPT4gKHJvd3NbaV0gPyB7IGRlcHRoOiByb3dzW2ldWzBdLCBsYXRleDogcm93c1tpXVsxXSB9IDogdW5kZWZpbmVkKTtcblxuLy8gNXheMisyeCtcXGZyYWN7XFxwaX17Mn0tNFxuY29uc3QgUE9MWSA9IHRhYmxlKFtcbiAgWzAsICcnXSxcbiAgWzAsICc1J10sXG4gIFswLCAneCddLFxuICBbMSwgJyddLFxuICBbMSwgJzInXSxcbiAgWzAsICdeMiddLFxuICBbMCwgJysnXSxcbiAgWzAsICcyJ10sXG4gIFswLCAneCddLFxuICBbMCwgJysnXSxcbiAgWzEsICcnXSxcbiAgWzEsICdcXFxccGknXSxcbiAgWzEsICcnXSxcbiAgWzEsICcyJ10sXG4gIFswLCAnXFxcXGZyYWN7XFxcXHBpfXsyfSddLFxuICBbMCwgJy0nXSxcbiAgWzAsICc0J10sXG5dKTtcbmNvbnN0IFBPTFlfTEFTVCA9IDE2O1xuXG4vLyBhK1xcc3FydHt4KzF9K2JcbmNvbnN0IFJPT1QgPSB0YWJsZShbXG4gIFswLCAnJ10sXG4gIFswLCAnYSddLFxuICBbMCwgJysnXSxcbiAgWzEsICcnXSxcbiAgWzEsICd4J10sXG4gIFsxLCAnKyddLFxuICBbMSwgJzEnXSxcbiAgWzAsICdcXFxcc3FydHt4KzF9J10sXG4gIFswLCAnKyddLFxuICBbMCwgJ2InXSxcbl0pO1xuXG4vLyBcXGZyYWN7XFxmcmFje2F9e2J9fXtjfVxuY29uc3QgTkVTVEVEID0gdGFibGUoW1xuICBbMCwgJyddLFxuICBbMSwgJyddLFxuICBbMiwgJyddLFxuICBbMiwgJ2EnXSxcbiAgWzIsICcnXSxcbiAgWzIsICdiJ10sXG4gIFsxLCAnXFxcXGZyYWN7YX17Yn0nXSxcbiAgWzEsICcnXSxcbiAgWzEsICdjJ10sXG4gIFswLCAnXFxcXGZyYWN7XFxcXGZyYWN7YX17Yn19e2N9J10sXG5dKTtcblxuZGVzY3JpYmUoJ2V4cGFuZFJhbmdlJywgKCkgPT4ge1xuICBjb25zdCBwb2x5ID0gKGEsIGIpID0+IGV4cGFuZFJhbmdlKGEsIGIsIFBPTFksIFBPTFlfTEFTVCk7XG5cbiAgaXQoJ2xlYXZlcyBhIHNlbGVjdGlvbiBvZiB3aG9sZSBzaWJsaW5nIGF0b21zIGFsb25lJywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDYsIDcpKS50b0VxdWFsKFs2LCA3XSk7IC8vIDJcbiAgICBleHBlY3QocG9seSg2LCA5KSkudG9FcXVhbChbNiwgOV0pOyAvLyAyeCtcbiAgICBleHBlY3QocG9seSg2LCAxNSkpLnRvRXF1YWwoWzYsIDE1XSk7IC8vIDJ4K1xcZnJhY3tcXHBpfXsyfS1cbiAgICBleHBlY3QocG9seSgwLCAxNikpLnRvRXF1YWwoWzAsIDE2XSk7XG4gIH0pO1xuXG4gIC8vIFRoZSByZXBvcnRlZCBjYXNlOiBmaXZlIFNoaWZ0K1JpZ2h0IHByZXNzZXMgZnJvbSBiZWZvcmUgYDJ4YCBnYXZlIGAyeCtcXHBpYC5cbiAgaXQoJ3Rha2VzIHRoZSB3aG9sZSBmcmFjdGlvbiB3aGVuIHRoZSBzZWxlY3Rpb24gcmVhY2hlcyBpbnRvIGl0JywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDYsIDEwKSkudG9FcXVhbChbNiwgMTRdKTtcbiAgICBleHBlY3QocG9seSg2LCAxMSkpLnRvRXF1YWwoWzYsIDE0XSk7XG4gICAgZXhwZWN0KHBvbHkoNiwgMTMpKS50b0VxdWFsKFs2LCAxNF0pO1xuICB9KTtcblxuICBpdCgndGFrZXMgdGhlIHdob2xlIGZyYWN0aW9uIHdoZW4gdGhlIHNlbGVjdGlvbiBsZWF2ZXMgaXQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoMTEsIDE1KSkudG9FcXVhbChbOSwgMTVdKTsgLy8gZnJvbSB0aGUgcGkgdG8gYWZ0ZXIgdGhlIG1pbnVzXG4gIH0pO1xuXG4gIGl0KCdjcm9zc2luZyBmcm9tIG51bWVyYXRvciB0byBkZW5vbWluYXRvciBzZWxlY3RzIHRoZSBmcmFjdGlvbicsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgxMSwgMTMpKS50b0VxdWFsKFs5LCAxNF0pO1xuICAgIGV4cGVjdChwb2x5KDExLCAxMikpLnRvRXF1YWwoWzksIDE0XSk7XG4gIH0pO1xuXG4gIGl0KCdhIHNlbGVjdGlvbiBpbnNpZGUgb25lIGJyYW5jaCBzdGF5cyBpbnNpZGUgaXQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoMTAsIDExKSkudG9FcXVhbChbMTAsIDExXSk7IC8vIFxccGlcbiAgICBleHBlY3QocG9seSgxMiwgMTMpKS50b0VxdWFsKFsxMiwgMTNdKTsgLy8gdGhlIDIgb2YgdGhlIGRlbm9taW5hdG9yXG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlIHN0b3JlcyB4XjIgYXMgYHhgIHRoZW4gYSBzZXBhcmF0ZSBgXjJgIGF0b20uXG4gIGl0KCdrZWVwcyBhIHN1cGVyc2NyaXB0IHdpdGggaXRzIGJhc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoMywgNykpLnRvRXF1YWwoWzEsIDddKTsgLy8geF4yKzIsIG5vdCBeMisyXG4gICAgZXhwZWN0KHBvbHkoNCwgNikpLnRvRXF1YWwoWzEsIDZdKTsgLy8geF4yK1xuICB9KTtcblxuICBpdCgnYWNjZXB0cyBhIHJldmVyc2VkIHJhbmdlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDExLCA2KSkudG9FcXVhbChbNiwgMTRdKTtcbiAgfSk7XG5cbiAgaXQoJ2xlYXZlcyBhIGNvbGxhcHNlZCByYW5nZSBhbG9uZScsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgxMSwgMTEpKS50b0VxdWFsKFsxMSwgMTFdKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgcm9vdHMgdGhlIHNhbWUgd2F5JywgKCkgPT4ge1xuICAgIGV4cGVjdChleHBhbmRSYW5nZSgyLCA0LCBST09ULCA5KSkudG9FcXVhbChbMiwgN10pO1xuICAgIGV4cGVjdChleHBhbmRSYW5nZSg0LCA2LCBST09ULCA5KSkudG9FcXVhbChbNCwgNl0pOyAvLyArMSBpbnNpZGUgdGhlIHJhZGljYW5kXG4gIH0pO1xuXG4gIGl0KCdjbGltYnMgYXMgbWFueSBsZXZlbHMgYXMgbmVlZGVkIGluIG5lc3RlZCBmcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDIsIDMsIE5FU1RFRCwgOSkpLnRvRXF1YWwoWzIsIDNdKTsgLy8gYVxuICAgIGV4cGVjdChleHBhbmRSYW5nZSgzLCA1LCBORVNURUQsIDkpKS50b0VxdWFsKFsxLCA2XSk7IC8vIGEvYiBjcm9zc2luZyAtPiBpbm5lciBmcmFjdGlvblxuICAgIGV4cGVjdChleHBhbmRSYW5nZSg2LCA3LCBORVNURUQsIDkpKS50b0VxdWFsKFswLCA5XSk7IC8vIGlubmVyIC0+IG91dGVyIGRlbm9taW5hdG9yXG4gIH0pO1xuXG4gIGl0KCd0b2xlcmF0ZXMgbWlzc2luZyBpbmZvJywgKCkgPT4ge1xuICAgIGV4cGVjdChleHBhbmRSYW5nZSgxLCAzLCAoKSA9PiB1bmRlZmluZWQsIDUpKS50b0VxdWFsKFsxLCAzXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd0cmFja1dob2xlQXRvbVNlbGVjdGlvbicsICgpID0+IHtcbiAgY29uc3Qgc3R1YkZpZWxkID0gKHJhbmdlLCBkaXJlY3Rpb24gPSAnZm9yd2FyZCcpID0+IHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3Rpb246IHsgcmFuZ2VzOiBbcmFuZ2VdLCBkaXJlY3Rpb24gfSxcbiAgICAgIGdldCBzZWxlY3Rpb25Jc0NvbGxhcHNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLnJhbmdlc1swXVswXSA9PT0gdGhpcy5zZWxlY3Rpb24ucmFuZ2VzWzBdWzFdO1xuICAgICAgfSxcbiAgICAgIGxhc3RPZmZzZXQ6IFBPTFlfTEFTVCxcbiAgICAgIGdldEVsZW1lbnRJbmZvOiBQT0xZLFxuICAgICAgc2V0czogMCxcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZm4pIHtcbiAgICAgICAgbGlzdGVuZXJzW3R5cGVdID0gZm47XG4gICAgICB9LFxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbikge1xuICAgICAgICBpZiAobGlzdGVuZXJzW3R5cGVdID09PSBmbikge1xuICAgICAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaXJlKHR5cGUpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyc1t0eXBlXSkge1xuICAgICAgICAgIGxpc3RlbmVyc1t0eXBlXSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFzKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuICEhbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IHRyYWNrID0gKGZpZWxkKSA9PiB7XG4gICAgLy8gY291bnQgYXNzaWdubWVudHMgd2l0aG91dCBicmVha2luZyB0aGUgZ2V0dGVyXG4gICAgbGV0IGN1cnJlbnQgPSBmaWVsZC5zZWxlY3Rpb247XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmllbGQsICdzZWxlY3Rpb24nLCB7XG4gICAgICBnZXQ6ICgpID0+IGN1cnJlbnQsXG4gICAgICBzZXQ6ICh2KSA9PiB7XG4gICAgICAgIGZpZWxkLnNldHMgKz0gMTtcbiAgICAgICAgY3VycmVudCA9IHY7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKGZpZWxkKTtcbiAgfTtcblxuICBpdCgnd2lkZW5zIHRoZSBzZWxlY3Rpb24gb24gc2VsZWN0aW9uLWNoYW5nZScsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbNiwgMTFdKTtcblxuICAgIHRyYWNrKGZpZWxkKTtcbiAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG5cbiAgICBleHBlY3QoZmllbGQuc2VsZWN0aW9uLnJhbmdlcykudG9FcXVhbChbWzYsIDE0XV0pO1xuICB9KTtcblxuICBpdCgncHJlc2VydmVzIHRoZSBkaXJlY3Rpb24sIHNvIFNoaWZ0K0Fycm93IGtlZXBzIGV4dGVuZGluZyB0aGUgc2FtZSBlbmQnLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSBzdHViRmllbGQoWzExLCAxNl0sICdiYWNrd2FyZCcpO1xuXG4gICAgdHJhY2soZmllbGQpO1xuICAgIGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKTtcblxuICAgIGV4cGVjdChmaWVsZC5zZWxlY3Rpb24pLnRvRXF1YWwoeyByYW5nZXM6IFtbOSwgMTZdXSwgZGlyZWN0aW9uOiAnYmFja3dhcmQnIH0pO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgdG91Y2ggYSBzZWxlY3Rpb24gdGhhdCBpcyBhbHJlYWR5IHdob2xlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCA5XSk7XG5cbiAgICB0cmFjayhmaWVsZCk7XG4gICAgZmllbGQuZmlyZSgnc2VsZWN0aW9uLWNoYW5nZScpO1xuXG4gICAgZXhwZWN0KGZpZWxkLnNldHMpLnRvQmUoMCk7XG4gIH0pO1xuXG4gIGl0KCdpZ25vcmVzIGEgY29sbGFwc2VkIGNhcmV0JywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFsxMSwgMTFdKTtcblxuICAgIHRyYWNrKGZpZWxkKTtcbiAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG5cbiAgICBleHBlY3QoZmllbGQuc2V0cykudG9CZSgwKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IHJlY3Vyc2Ugd2hlbiBpdHMgb3duIGFzc2lnbm1lbnQgZmlyZXMgc2VsZWN0aW9uLWNoYW5nZScsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbNiwgMTFdKTtcbiAgICBsZXQgY3VycmVudCA9IGZpZWxkLnNlbGVjdGlvbjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWVsZCwgJ3NlbGVjdGlvbicsIHtcbiAgICAgIGdldDogKCkgPT4gY3VycmVudCxcbiAgICAgIHNldDogKHYpID0+IHtcbiAgICAgICAgZmllbGQuc2V0cyArPSAxO1xuICAgICAgICBjdXJyZW50ID0gdjtcbiAgICAgICAgZmllbGQuZmlyZSgnc2VsZWN0aW9uLWNoYW5nZScpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKGZpZWxkKTtcbiAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG5cbiAgICBleHBlY3QoZmllbGQuc2V0cykudG9CZSgxKTtcbiAgICBleHBlY3QoZmllbGQuc2VsZWN0aW9uLnJhbmdlcykudG9FcXVhbChbWzYsIDE0XV0pO1xuICB9KTtcblxuICBpdCgnc3Vydml2ZXMgYSBmaWVsZCB0aGF0IHRocm93cycsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbNiwgMTFdKTtcblxuICAgIGZpZWxkLmdldEVsZW1lbnRJbmZvID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdib29tJyk7XG4gICAgfTtcblxuICAgIHRyYWNrKGZpZWxkKTtcblxuICAgIGV4cGVjdCgoKSA9PiBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJykpLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0KCd0ZWFycyBkb3duIGl0cyBsaXN0ZW5lcicsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbNiwgMTFdKTtcbiAgICBjb25zdCB1bnRyYWNrID0gdHJhY2soZmllbGQpO1xuXG4gICAgZXhwZWN0KGZpZWxkLmhhcygnc2VsZWN0aW9uLWNoYW5nZScpKS50b0JlKHRydWUpO1xuICAgIHVudHJhY2soKTtcbiAgICBleHBlY3QoZmllbGQuaGFzKCdzZWxlY3Rpb24tY2hhbmdlJykpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnaXMgYSBuby1vcCB3aXRob3V0IGEgZmllbGQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKHVuZGVmaW5lZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QodHJhY2tXaG9sZUF0b21TZWxlY3Rpb24oe30pKS50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
|
package/lib/keypad/index.js
CHANGED
|
@@ -27,6 +27,7 @@ var _keys = require("../keys");
|
|
|
27
27
|
var _keysLayout = require("./keys-layout");
|
|
28
28
|
var _commonStyles = require("../mf/common-styles");
|
|
29
29
|
var _mathliveInstance = require("../mathlive-instance");
|
|
30
|
+
var _longdiv = require("../longdiv");
|
|
30
31
|
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
31
32
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
32
33
|
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; }
|
|
@@ -104,6 +105,7 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
|
|
|
104
105
|
_this.state = {
|
|
105
106
|
markup: (0, _mathliveInstance.latexToMarkup)(props.latex)
|
|
106
107
|
};
|
|
108
|
+
_this.labelRef = /*#__PURE__*/_react["default"].createRef();
|
|
107
109
|
return _this;
|
|
108
110
|
}
|
|
109
111
|
(0, _inherits2["default"])(LatexLabel, _React$Component);
|
|
@@ -119,6 +121,8 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
|
|
|
119
121
|
_context.next = 1;
|
|
120
122
|
break;
|
|
121
123
|
}
|
|
124
|
+
// The long-division key's label needs MathLive's drawing corrected.
|
|
125
|
+
(0, _longdiv.fixLongDivisionWhenReady)(this.labelRef.current);
|
|
122
126
|
return _context.abrupt("return");
|
|
123
127
|
case 1:
|
|
124
128
|
_context.next = 2;
|
|
@@ -160,12 +164,15 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
|
|
|
160
164
|
}()
|
|
161
165
|
}, {
|
|
162
166
|
key: "componentDidUpdate",
|
|
163
|
-
value: function componentDidUpdate(prevProps) {
|
|
167
|
+
value: function componentDidUpdate(prevProps, prevState) {
|
|
164
168
|
if (prevProps.latex !== this.props.latex) {
|
|
165
169
|
this.setState({
|
|
166
170
|
markup: (0, _mathliveInstance.latexToMarkup)(this.props.latex)
|
|
167
171
|
});
|
|
168
172
|
}
|
|
173
|
+
if (this.state.markup !== (prevState && prevState.markup)) {
|
|
174
|
+
(0, _longdiv.fixLongDivisionWhenReady)(this.labelRef.current);
|
|
175
|
+
}
|
|
169
176
|
}
|
|
170
177
|
}, {
|
|
171
178
|
key: "componentWillUnmount",
|
|
@@ -182,6 +189,7 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
|
|
|
182
189
|
/*#__PURE__*/
|
|
183
190
|
// eslint-disable-next-line react/no-danger
|
|
184
191
|
_react["default"].createElement(LabelHolder, {
|
|
192
|
+
ref: this.labelRef,
|
|
185
193
|
slanted: SLANTED_LABELS.includes(this.props.latex),
|
|
186
194
|
dangerouslySetInnerHTML: {
|
|
187
195
|
__html: markup
|
package/lib/keypad/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_propTypes","_Button","_IconButton","_styles","_debug","_lodashEs","_renderUi","_keys","_keysLayout","_commonStyles","_mathliveInstance","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","ownKeys","r","Object","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","log","debug","SLANTED_LABELS","SLANT","SLANTED_STROKE","SLANTED_SCALE_Y","LabelHolder","styled","shouldForwardProp","prop","_ref","slanted","transform","concat","WebkitTextStroke","pointerEvents","textTransform","color","text","display","textAlign","lineHeight","maxWidth","overflow","backgroundColor","keypadEmptyPlaceholder","undefined","opacity","rootIndexStyles","LatexLabel","exports","_React$Component","props","_this","_classCallCheck2","state","markup","latexToMarkup","latex","_inherits2","_createClass2","key","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","abrupt","loadMathLive","unmounted","setState","warned","stop","componentDidMount","componentDidUpdate","prevProps","componentWillUnmount","render","createElement","includes","dangerouslySetInnerHTML","__html","React","Component","PropTypes","string","isRequired","createCustomLayout","layoutObj","gridTemplateColumns","columns","gridTemplateRows","rows","gridAutoFlow","KeyPadContainer","commonKeyboardStyles","width","gridRowGap","gridColumnGap","fontFamily","buttonBackground","category","keypadButtonOperator","keypadButton","keypadButtonOperatorHover","keypadButtonHover","StyledButton","Button","_ref2","isDelete","isComma","isDot","minWidth","fontSize","borderRadius","StyledLatexButtonWrapper","_ref3","padding","margin","StyledIconButton","IconButton","_ref4","height","KeyPad","_React$Component2","_this2","setKeypadInteraction","onPress","base","extras","flatten","_toConsumableArray2","sortKeys","noDecimal","write","label","keypadRef","createRef","_this$keypadRef","keyPadElement","current","mainContainer","closest","currentToolbar","controlledKeypadMode","mainContainerPosition","getBoundingClientRect","currentToolbarPosition","difference","top","totalHeight","style","addEventListener","handleKeypadInteraction","_this$keypadRef2","removeEventListener","_this3","_this$props","className","baseSet","additionalKeys","layoutForKeyPad","onFocus","mode","noBaseSet","keysWithoutBaseSet","allKeys","flowKeys","shift","Math","floor","ref","join","map","k","index","command","extra","actions","extraProps","onClick","buttonClick","bind","disabled","keyIsNotAllowed","ariaLabel","name","_extends2","Icon","icon","tabIndex","size","bool","array","object","func","oneOfType","number","_default"],"sources":["../../src/keypad/index.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport { flatten } from 'lodash-es';\nimport { color } from '@pie-lib/render-ui';\n\nimport { baseSet } from '../keys';\nimport { sortKeys } from './keys-layout';\nimport { commonKeyboardStyles, rootIndexStyles } from '../mf/common-styles';\nimport { loadMathLive, latexToMarkup } from '../mathlive-instance';\n\nconst log = debug('pie-lib:math-input-mathlive:keypad');\n\n/**\n * A LaTeX keypad label.\n *\n * The MathQuill implementation rendered every LaTeX label as its own\n * `MQ.StaticMath` instance. Here each label is static HTML produced once by\n * `convertLatexToMarkup`, so a 40-key keypad no longer creates 40 live math\n * instances.\n */\n// Labels that the legacy keypad drew slanted. MathQuill styled `\\parallel` as\n// italic, which slants the two bars; MathLive draws it upright. A skew is used\n// rather than `font-style: italic` so the slant does not depend on the font\n// having an italic face for this glyph.\nconst SLANTED_LABELS = ['\\\\parallel'];\nconst SLANT = 'skewX(-15deg)';\n// MathLive's `∥` has hairline bars next to the radical sign and the other keys, so\n// they are thickened with a text stroke and stretched a little taller.\nconst SLANTED_STROKE = '0.03em currentColor';\nconst SLANTED_SCALE_Y = 1.25;\n\n// The `color.*()` helpers must be called lazily, inside the styled callback.\n// Evaluating them in a plain object literal runs them at module load, which\n// breaks any consumer that mocks a subset of @pie-lib/render-ui.\nconst LabelHolder = styled('span', { shouldForwardProp: (prop) => prop !== 'slanted' })(({ slanted }) => ({\n ...(slanted && {\n transform: `${SLANT} scaleY(${SLANTED_SCALE_Y})`,\n '& *': { WebkitTextStroke: SLANTED_STROKE },\n }),\n pointerEvents: 'none',\n textTransform: 'none',\n color: color.text(),\n // Deliberately inline-block, NOT inline-flex: MathLive's markup relies on\n // normal inline flow. Making its spans flex items collapses their width, and\n // stretchy accents render an <svg width=\"100%\" preserveAspectRatio=\"none\">\n // that then squeezes into a spike instead of spanning the content.\n display: 'inline-block',\n textAlign: 'center',\n lineHeight: 1,\n // Keep a label from sizing its grid column. `overflow: hidden` also collapses\n // the label's min-content contribution, so a wide accent cannot drag the\n // column across the screen. The svg's own positioning is left to\n // mathlive-static.css (injected by the package) - duplicating it here broke\n // the accent's containing block.\n maxWidth: '100%',\n overflow: 'hidden',\n // Answer-block / empty-slot boxes inside a label.\n '& .ML__placeholder': {\n backgroundColor: color.keypadEmptyPlaceholder ? color.keypadEmptyPlaceholder() : undefined,\n },\n // The stand-in glyph for an empty argument slot (see EMPTY_SLOT). Muted so it\n // reads as \"a slot goes here\" rather than as part of the symbol, matching how\n // MathQuill shaded `.mq-empty`.\n '& [data-pie-empty]': {\n opacity: 0.5,\n },\n // A readable index on the nth-root key. Carried by the label itself, not only\n // by the keypad container, so it holds wherever a LatexLabel is mounted.\n ...rootIndexStyles,\n}));\n\nexport class LatexLabel extends React.Component {\n static propTypes = {\n latex: PropTypes.string.isRequired,\n };\n\n constructor(props) {\n super(props);\n this.state = { markup: latexToMarkup(props.latex) };\n }\n\n async componentDidMount() {\n // MathLive may not have finished loading when the keypad first mounts.\n if (this.state.markup) {\n return;\n }\n\n await loadMathLive();\n\n if (this.unmounted) {\n return;\n }\n\n const markup = latexToMarkup(this.props.latex);\n\n if (markup) {\n this.setState({ markup });\n return;\n }\n\n // Still nothing: the engine is genuinely unavailable (a missing chunk, a\n // blocked request). Keep the raw-latex fallback visible rather than an\n // empty button, and log once so this is diagnosable.\n if (!LatexLabel.warned) {\n LatexLabel.warned = true;\n log('MathLive unavailable - keypad labels are falling back to raw latex');\n }\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.latex !== this.props.latex) {\n this.setState({ markup: latexToMarkup(this.props.latex) });\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n render() {\n const { markup } = this.state;\n\n // Fall back to the raw latex so a button is never blank.\n return markup ? (\n // eslint-disable-next-line react/no-danger\n <LabelHolder slanted={SLANTED_LABELS.includes(this.props.latex)} dangerouslySetInnerHTML={{ __html: markup }} />\n ) : (\n <LabelHolder slanted={SLANTED_LABELS.includes(this.props.latex)}>{this.props.latex}</LabelHolder>\n );\n }\n}\n\nconst createCustomLayout = (layoutObj) => {\n if (layoutObj) {\n return {\n gridTemplateColumns: `repeat(${layoutObj.columns}, minmax(min-content, 150px))`,\n gridTemplateRows: `repeat(${layoutObj.rows}, minmax(40px, 60px))`,\n gridAutoFlow: 'initial',\n };\n }\n\n return {};\n};\n\nconst KeyPadContainer = styled('div')(() => ({\n ...commonKeyboardStyles,\n width: '100%',\n display: 'grid',\n gridTemplateRows: 'repeat(5, minmax(40px, 60px))',\n gridRowGap: '0px',\n gridColumnGap: '0px',\n gridAutoFlow: 'column',\n '&.character': {\n textTransform: 'initial !important',\n gridTemplateRows: 'repeat(5, minmax(40px, 50px)) !important',\n },\n '&.language': {\n gridTemplateRows: 'repeat(4, minmax(40px, 50px)) !important',\n '& *': {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n },\n },\n}));\n\nconst buttonBackground = (category) => ({\n backgroundColor: category === 'operators' ? color.keypadButtonOperator() : color.keypadButton(),\n '&:hover': {\n backgroundColor: category === 'operators' ? color.keypadButtonOperatorHover() : color.keypadButtonHover(),\n },\n});\n\nconst StyledButton = styled(Button)(({ category, isDelete, isComma, isDot }) => ({\n minWidth: 'auto',\n textTransform: 'none',\n fontSize: isComma || isDot ? '200% !important' : '140% !important',\n lineHeight: isComma || isDot ? '100%' : 'normal',\n color: color.text(),\n ...buttonBackground(category),\n borderRadius: 0,\n ...(isDelete && {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n }),\n}));\n\nconst StyledLatexButtonWrapper = styled(Button)(({ category }) => ({\n textTransform: 'none',\n padding: 0,\n margin: 0,\n fontSize: '110% !important',\n minWidth: 'auto',\n borderRadius: 0,\n ...buttonBackground(category),\n}));\n\nconst StyledIconButton = styled(IconButton)(({ category }) => ({\n minWidth: 'auto',\n ...buttonBackground(category),\n borderRadius: 0,\n '& .icon': {\n height: '30px',\n },\n}));\n\nexport class KeyPad extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n controlledKeypadMode: PropTypes.bool,\n baseSet: PropTypes.array,\n additionalKeys: PropTypes.array,\n layoutForKeyPad: PropTypes.object,\n onPress: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n noDecimal: PropTypes.bool,\n setKeypadInteraction: PropTypes.func,\n mode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n static defaultProps = {\n baseSet: baseSet,\n noDecimal: false,\n };\n\n constructor(props) {\n super(props);\n this.keypadRef = React.createRef();\n }\n\n componentDidMount() {\n // Ensure MathLive is available for the LaTeX labels.\n loadMathLive();\n\n const keyPadElement = this.keypadRef?.current;\n const mainContainer = keyPadElement?.closest('.main-container');\n const currentToolbar = keyPadElement?.closest('.pie-toolbar');\n\n // need only for math keyboard so we need also controlledKeypadMode\n if (this.props.controlledKeypadMode && mainContainer && currentToolbar) {\n const mainContainerPosition = mainContainer.getBoundingClientRect();\n const currentToolbarPosition = currentToolbar.getBoundingClientRect();\n const difference =\n mainContainerPosition.top +\n mainContainerPosition.height -\n (currentToolbarPosition.top + currentToolbarPosition.height);\n\n if (difference < 0) {\n const totalHeight = mainContainerPosition.height + mainContainerPosition.top - difference;\n\n mainContainer.style.height = `${totalHeight}px`;\n }\n }\n\n if (keyPadElement) {\n keyPadElement.addEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.addEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n componentWillUnmount() {\n const keyPadElement = this.keypadRef?.current;\n\n if (this.props.controlledKeypadMode && keyPadElement) {\n const mainContainer = keyPadElement.closest('.main-container');\n\n if (mainContainer) {\n mainContainer.style.height = 'unset';\n }\n }\n\n if (keyPadElement) {\n keyPadElement.removeEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.removeEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n handleKeypadInteraction = () => {\n if (this.props.setKeypadInteraction) {\n this.props.setKeypadInteraction(true);\n }\n };\n\n buttonClick = (key) => {\n log('[buttonClick]', key);\n this.props.onPress(key);\n };\n\n flowKeys = (base, extras) => flatten([...sortKeys(base), ...sortKeys(extras)]);\n\n keyIsNotAllowed = (key) => {\n const { noDecimal } = this.props;\n\n return !!(((key.write === '.' && key.label === '.') || (key.write === ',' && key.label === ',')) && noDecimal);\n };\n\n render() {\n const { className, baseSet: base, additionalKeys, layoutForKeyPad, onFocus, mode } = this.props;\n\n const noBaseSet = ['non-negative-integers', 'integers', 'decimals', 'fractions', 'item-authoring', 'language'];\n const keysWithoutBaseSet = noBaseSet.includes(mode);\n const allKeys = keysWithoutBaseSet\n ? this.flowKeys([], additionalKeys || [])\n : this.flowKeys(base, additionalKeys || []);\n\n const shift = allKeys.length % 5 ? 1 : 0;\n const style = {\n gridTemplateColumns: `repeat(${Math.floor(allKeys.length / 5) + shift}, minmax(min-content, 150px))`,\n ...createCustomLayout(layoutForKeyPad),\n };\n\n return (\n <KeyPadContainer\n ref={this.keypadRef}\n className={[className, mode].filter(Boolean).join(' ')}\n style={style}\n onFocus={onFocus}\n >\n {allKeys.map((k, index) => {\n if (!k) {\n return <span key={`empty-${index}`} />;\n }\n\n const key = `${k.label || k.latex || k.command}-${index}`;\n const category = !keysWithoutBaseSet ? k.category : undefined;\n const extra = { ...(k.actions || {}), ...(k.extraProps || {}) };\n const onClick = this.buttonClick.bind(this, k);\n const disabled = this.keyIsNotAllowed(k);\n const ariaLabel = k.ariaLabel ? k.ariaLabel : k.name || k.label;\n\n if (k.latex) {\n return (\n <StyledLatexButtonWrapper\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n aria-label={ariaLabel}\n {...extra}\n >\n <LatexLabel latex={k.latex} />\n </StyledLatexButtonWrapper>\n );\n }\n\n if (k.label) {\n return (\n <StyledButton\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n isDelete={k.label === '⌫'}\n isComma={k.label === ','}\n isDot={k.label === '.'}\n aria-label={ariaLabel}\n {...extra}\n >\n {k.label}\n </StyledButton>\n );\n }\n\n const Icon = k.icon ? k.icon : 'div';\n\n return (\n <StyledIconButton\n key={key}\n tabIndex={'-1'}\n onClick={onClick}\n disabled={disabled}\n category={category}\n size=\"large\"\n {...extra}\n >\n <Icon className=\"icon\" />\n </StyledIconButton>\n );\n })}\n </KeyPadContainer>\n );\n }\n}\n\nexport default KeyPad;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_propTypes","_Button","_IconButton","_styles","_debug","_lodashEs","_renderUi","_keys","_keysLayout","_commonStyles","_mathliveInstance","_longdiv","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","ownKeys","r","Object","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","log","debug","SLANTED_LABELS","SLANT","SLANTED_STROKE","SLANTED_SCALE_Y","LabelHolder","styled","shouldForwardProp","prop","_ref","slanted","transform","concat","WebkitTextStroke","pointerEvents","textTransform","color","text","display","textAlign","lineHeight","maxWidth","overflow","backgroundColor","keypadEmptyPlaceholder","undefined","opacity","rootIndexStyles","LatexLabel","exports","_React$Component","props","_this","_classCallCheck2","state","markup","latexToMarkup","latex","labelRef","React","createRef","_inherits2","_createClass2","key","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","fixLongDivisionWhenReady","current","abrupt","loadMathLive","unmounted","setState","warned","stop","componentDidMount","componentDidUpdate","prevProps","prevState","componentWillUnmount","render","createElement","ref","includes","dangerouslySetInnerHTML","__html","Component","PropTypes","string","isRequired","createCustomLayout","layoutObj","gridTemplateColumns","columns","gridTemplateRows","rows","gridAutoFlow","KeyPadContainer","commonKeyboardStyles","width","gridRowGap","gridColumnGap","fontFamily","buttonBackground","category","keypadButtonOperator","keypadButton","keypadButtonOperatorHover","keypadButtonHover","StyledButton","Button","_ref2","isDelete","isComma","isDot","minWidth","fontSize","borderRadius","StyledLatexButtonWrapper","_ref3","padding","margin","StyledIconButton","IconButton","_ref4","height","KeyPad","_React$Component2","_this2","setKeypadInteraction","onPress","base","extras","flatten","_toConsumableArray2","sortKeys","noDecimal","write","label","keypadRef","_this$keypadRef","keyPadElement","mainContainer","closest","currentToolbar","controlledKeypadMode","mainContainerPosition","getBoundingClientRect","currentToolbarPosition","difference","top","totalHeight","style","addEventListener","handleKeypadInteraction","_this$keypadRef2","removeEventListener","_this3","_this$props","className","baseSet","additionalKeys","layoutForKeyPad","onFocus","mode","noBaseSet","keysWithoutBaseSet","allKeys","flowKeys","shift","Math","floor","join","map","k","index","command","extra","actions","extraProps","onClick","buttonClick","bind","disabled","keyIsNotAllowed","ariaLabel","name","_extends2","Icon","icon","tabIndex","size","bool","array","object","func","oneOfType","number","_default"],"sources":["../../src/keypad/index.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport { flatten } from 'lodash-es';\nimport { color } from '@pie-lib/render-ui';\n\nimport { baseSet } from '../keys';\nimport { sortKeys } from './keys-layout';\nimport { commonKeyboardStyles, rootIndexStyles } from '../mf/common-styles';\nimport { loadMathLive, latexToMarkup } from '../mathlive-instance';\nimport { fixLongDivisionWhenReady } from '../longdiv';\n\nconst log = debug('pie-lib:math-input-mathlive:keypad');\n\n/**\n * A LaTeX keypad label.\n *\n * The MathQuill implementation rendered every LaTeX label as its own\n * `MQ.StaticMath` instance. Here each label is static HTML produced once by\n * `convertLatexToMarkup`, so a 40-key keypad no longer creates 40 live math\n * instances.\n */\n// Labels that the legacy keypad drew slanted. MathQuill styled `\\parallel` as\n// italic, which slants the two bars; MathLive draws it upright. A skew is used\n// rather than `font-style: italic` so the slant does not depend on the font\n// having an italic face for this glyph.\nconst SLANTED_LABELS = ['\\\\parallel'];\nconst SLANT = 'skewX(-15deg)';\n// MathLive's `∥` has hairline bars next to the radical sign and the other keys, so\n// they are thickened with a text stroke and stretched a little taller.\nconst SLANTED_STROKE = '0.03em currentColor';\nconst SLANTED_SCALE_Y = 1.25;\n\n// The `color.*()` helpers must be called lazily, inside the styled callback.\n// Evaluating them in a plain object literal runs them at module load, which\n// breaks any consumer that mocks a subset of @pie-lib/render-ui.\nconst LabelHolder = styled('span', { shouldForwardProp: (prop) => prop !== 'slanted' })(({ slanted }) => ({\n ...(slanted && {\n transform: `${SLANT} scaleY(${SLANTED_SCALE_Y})`,\n '& *': { WebkitTextStroke: SLANTED_STROKE },\n }),\n pointerEvents: 'none',\n textTransform: 'none',\n color: color.text(),\n // Deliberately inline-block, NOT inline-flex: MathLive's markup relies on\n // normal inline flow. Making its spans flex items collapses their width, and\n // stretchy accents render an <svg width=\"100%\" preserveAspectRatio=\"none\">\n // that then squeezes into a spike instead of spanning the content.\n display: 'inline-block',\n textAlign: 'center',\n lineHeight: 1,\n // Keep a label from sizing its grid column. `overflow: hidden` also collapses\n // the label's min-content contribution, so a wide accent cannot drag the\n // column across the screen. The svg's own positioning is left to\n // mathlive-static.css (injected by the package) - duplicating it here broke\n // the accent's containing block.\n maxWidth: '100%',\n overflow: 'hidden',\n // Answer-block / empty-slot boxes inside a label.\n '& .ML__placeholder': {\n backgroundColor: color.keypadEmptyPlaceholder ? color.keypadEmptyPlaceholder() : undefined,\n },\n // The stand-in glyph for an empty argument slot (see EMPTY_SLOT). Muted so it\n // reads as \"a slot goes here\" rather than as part of the symbol, matching how\n // MathQuill shaded `.mq-empty`.\n '& [data-pie-empty]': {\n opacity: 0.5,\n },\n // A readable index on the nth-root key. Carried by the label itself, not only\n // by the keypad container, so it holds wherever a LatexLabel is mounted.\n ...rootIndexStyles,\n}));\n\nexport class LatexLabel extends React.Component {\n static propTypes = {\n latex: PropTypes.string.isRequired,\n };\n\n constructor(props) {\n super(props);\n this.state = { markup: latexToMarkup(props.latex) };\n this.labelRef = React.createRef();\n }\n\n async componentDidMount() {\n // MathLive may not have finished loading when the keypad first mounts.\n if (this.state.markup) {\n // The long-division key's label needs MathLive's drawing corrected.\n fixLongDivisionWhenReady(this.labelRef.current);\n return;\n }\n\n await loadMathLive();\n\n if (this.unmounted) {\n return;\n }\n\n const markup = latexToMarkup(this.props.latex);\n\n if (markup) {\n this.setState({ markup });\n return;\n }\n\n // Still nothing: the engine is genuinely unavailable (a missing chunk, a\n // blocked request). Keep the raw-latex fallback visible rather than an\n // empty button, and log once so this is diagnosable.\n if (!LatexLabel.warned) {\n LatexLabel.warned = true;\n log('MathLive unavailable - keypad labels are falling back to raw latex');\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.latex !== this.props.latex) {\n this.setState({ markup: latexToMarkup(this.props.latex) });\n }\n\n if (this.state.markup !== (prevState && prevState.markup)) {\n fixLongDivisionWhenReady(this.labelRef.current);\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n render() {\n const { markup } = this.state;\n\n // Fall back to the raw latex so a button is never blank.\n return markup ? (\n // eslint-disable-next-line react/no-danger\n <LabelHolder\n ref={this.labelRef}\n slanted={SLANTED_LABELS.includes(this.props.latex)}\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n ) : (\n <LabelHolder slanted={SLANTED_LABELS.includes(this.props.latex)}>{this.props.latex}</LabelHolder>\n );\n }\n}\n\nconst createCustomLayout = (layoutObj) => {\n if (layoutObj) {\n return {\n gridTemplateColumns: `repeat(${layoutObj.columns}, minmax(min-content, 150px))`,\n gridTemplateRows: `repeat(${layoutObj.rows}, minmax(40px, 60px))`,\n gridAutoFlow: 'initial',\n };\n }\n\n return {};\n};\n\nconst KeyPadContainer = styled('div')(() => ({\n ...commonKeyboardStyles,\n width: '100%',\n display: 'grid',\n gridTemplateRows: 'repeat(5, minmax(40px, 60px))',\n gridRowGap: '0px',\n gridColumnGap: '0px',\n gridAutoFlow: 'column',\n '&.character': {\n textTransform: 'initial !important',\n gridTemplateRows: 'repeat(5, minmax(40px, 50px)) !important',\n },\n '&.language': {\n gridTemplateRows: 'repeat(4, minmax(40px, 50px)) !important',\n '& *': {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n },\n },\n}));\n\nconst buttonBackground = (category) => ({\n backgroundColor: category === 'operators' ? color.keypadButtonOperator() : color.keypadButton(),\n '&:hover': {\n backgroundColor: category === 'operators' ? color.keypadButtonOperatorHover() : color.keypadButtonHover(),\n },\n});\n\nconst StyledButton = styled(Button)(({ category, isDelete, isComma, isDot }) => ({\n minWidth: 'auto',\n textTransform: 'none',\n fontSize: isComma || isDot ? '200% !important' : '140% !important',\n lineHeight: isComma || isDot ? '100%' : 'normal',\n color: color.text(),\n ...buttonBackground(category),\n borderRadius: 0,\n ...(isDelete && {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n }),\n}));\n\nconst StyledLatexButtonWrapper = styled(Button)(({ category }) => ({\n textTransform: 'none',\n padding: 0,\n margin: 0,\n fontSize: '110% !important',\n minWidth: 'auto',\n borderRadius: 0,\n ...buttonBackground(category),\n}));\n\nconst StyledIconButton = styled(IconButton)(({ category }) => ({\n minWidth: 'auto',\n ...buttonBackground(category),\n borderRadius: 0,\n '& .icon': {\n height: '30px',\n },\n}));\n\nexport class KeyPad extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n controlledKeypadMode: PropTypes.bool,\n baseSet: PropTypes.array,\n additionalKeys: PropTypes.array,\n layoutForKeyPad: PropTypes.object,\n onPress: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n noDecimal: PropTypes.bool,\n setKeypadInteraction: PropTypes.func,\n mode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n static defaultProps = {\n baseSet: baseSet,\n noDecimal: false,\n };\n\n constructor(props) {\n super(props);\n this.keypadRef = React.createRef();\n }\n\n componentDidMount() {\n // Ensure MathLive is available for the LaTeX labels.\n loadMathLive();\n\n const keyPadElement = this.keypadRef?.current;\n const mainContainer = keyPadElement?.closest('.main-container');\n const currentToolbar = keyPadElement?.closest('.pie-toolbar');\n\n // need only for math keyboard so we need also controlledKeypadMode\n if (this.props.controlledKeypadMode && mainContainer && currentToolbar) {\n const mainContainerPosition = mainContainer.getBoundingClientRect();\n const currentToolbarPosition = currentToolbar.getBoundingClientRect();\n const difference =\n mainContainerPosition.top +\n mainContainerPosition.height -\n (currentToolbarPosition.top + currentToolbarPosition.height);\n\n if (difference < 0) {\n const totalHeight = mainContainerPosition.height + mainContainerPosition.top - difference;\n\n mainContainer.style.height = `${totalHeight}px`;\n }\n }\n\n if (keyPadElement) {\n keyPadElement.addEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.addEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n componentWillUnmount() {\n const keyPadElement = this.keypadRef?.current;\n\n if (this.props.controlledKeypadMode && keyPadElement) {\n const mainContainer = keyPadElement.closest('.main-container');\n\n if (mainContainer) {\n mainContainer.style.height = 'unset';\n }\n }\n\n if (keyPadElement) {\n keyPadElement.removeEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.removeEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n handleKeypadInteraction = () => {\n if (this.props.setKeypadInteraction) {\n this.props.setKeypadInteraction(true);\n }\n };\n\n buttonClick = (key) => {\n log('[buttonClick]', key);\n this.props.onPress(key);\n };\n\n flowKeys = (base, extras) => flatten([...sortKeys(base), ...sortKeys(extras)]);\n\n keyIsNotAllowed = (key) => {\n const { noDecimal } = this.props;\n\n return !!(((key.write === '.' && key.label === '.') || (key.write === ',' && key.label === ',')) && noDecimal);\n };\n\n render() {\n const { className, baseSet: base, additionalKeys, layoutForKeyPad, onFocus, mode } = this.props;\n\n const noBaseSet = ['non-negative-integers', 'integers', 'decimals', 'fractions', 'item-authoring', 'language'];\n const keysWithoutBaseSet = noBaseSet.includes(mode);\n const allKeys = keysWithoutBaseSet\n ? this.flowKeys([], additionalKeys || [])\n : this.flowKeys(base, additionalKeys || []);\n\n const shift = allKeys.length % 5 ? 1 : 0;\n const style = {\n gridTemplateColumns: `repeat(${Math.floor(allKeys.length / 5) + shift}, minmax(min-content, 150px))`,\n ...createCustomLayout(layoutForKeyPad),\n };\n\n return (\n <KeyPadContainer\n ref={this.keypadRef}\n className={[className, mode].filter(Boolean).join(' ')}\n style={style}\n onFocus={onFocus}\n >\n {allKeys.map((k, index) => {\n if (!k) {\n return <span key={`empty-${index}`} />;\n }\n\n const key = `${k.label || k.latex || k.command}-${index}`;\n const category = !keysWithoutBaseSet ? k.category : undefined;\n const extra = { ...(k.actions || {}), ...(k.extraProps || {}) };\n const onClick = this.buttonClick.bind(this, k);\n const disabled = this.keyIsNotAllowed(k);\n const ariaLabel = k.ariaLabel ? k.ariaLabel : k.name || k.label;\n\n if (k.latex) {\n return (\n <StyledLatexButtonWrapper\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n aria-label={ariaLabel}\n {...extra}\n >\n <LatexLabel latex={k.latex} />\n </StyledLatexButtonWrapper>\n );\n }\n\n if (k.label) {\n return (\n <StyledButton\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n isDelete={k.label === '⌫'}\n isComma={k.label === ','}\n isDot={k.label === '.'}\n aria-label={ariaLabel}\n {...extra}\n >\n {k.label}\n </StyledButton>\n );\n }\n\n const Icon = k.icon ? k.icon : 'div';\n\n return (\n <StyledIconButton\n key={key}\n tabIndex={'-1'}\n onClick={onClick}\n disabled={disabled}\n category={category}\n size=\"large\"\n {...extra}\n >\n <Icon className=\"icon\" />\n </StyledIconButton>\n );\n })}\n </KeyPadContainer>\n );\n }\n}\n\nexport default KeyPad;\n"],"mappings":"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","ignoreList":[]}
|
package/lib/longdiv.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.trackLongDivision = exports.fixLongDivisionWhenReady = exports.fixLongDivision = void 0;
|
|
8
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
+
var log = (0, _debug["default"])('pie-lib:math-input-mathlive:longdiv');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Long division (`\enclose{longdiv}{...}`, which `\longdiv` is mapped to).
|
|
13
|
+
*
|
|
14
|
+
* MathLive 0.110 draws it wrong in three ways, all in `EncloseAtom.render`:
|
|
15
|
+
*
|
|
16
|
+
* 1. It lowers the dividend by `padding + clearance` (0.45em) with
|
|
17
|
+
* `position: relative; top`, which moves it off the baseline, so the divisor
|
|
18
|
+
* looks too high.
|
|
19
|
+
* 2. The notation box's CSS width leaves out the room it made for the `)`,
|
|
20
|
+
* while the SVG's viewBox includes it. The SVG is stretched to 100% of the
|
|
21
|
+
* box, so the whole drawing is scaled down (to about 86%).
|
|
22
|
+
* 3. The bar is drawn `base.width` long from the `)`, but the dividend itself
|
|
23
|
+
* starts after the `)` and its gap, so the bar stops short of the end of
|
|
24
|
+
* the dividend. `base.width` also leaves out the spacing MathLive puts
|
|
25
|
+
* around `,` and `+`, so even the right length would come up short.
|
|
26
|
+
*
|
|
27
|
+
* This reads back the numbers MathLive wrote into inline styles and the SVG,
|
|
28
|
+
* and corrects them, so the rest of MathLive's drawing (the arc, the stroke
|
|
29
|
+
* weight) is kept. The bar's end is measured from the rendered dividend when
|
|
30
|
+
* the markup is laid out, and computed from MathLive's numbers otherwise.
|
|
31
|
+
*
|
|
32
|
+
* Every value set here is absolute, so running it again is harmless - it has
|
|
33
|
+
* to run after every render of a live field anyway.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/** A length MathLive wrote as `prop:<n>em` in an inline style, or 0. */
|
|
37
|
+
var inlineEm = function inlineEm(style, prop) {
|
|
38
|
+
var match = new RegExp("(?:^|;)\\s*".concat(prop, ":\\s*(-?[\\d.]+)em")).exec(style || '');
|
|
39
|
+
return match ? parseFloat(match[1]) : 0;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Direct child with a given tag. Not `querySelector(':scope > tag')`: jsdom's
|
|
44
|
+
* selector engine does not support `:scope` inside SVG elements.
|
|
45
|
+
*/
|
|
46
|
+
var childTag = function childTag(el, tag) {
|
|
47
|
+
return el && Array.from(el.children || []).find(function (c) {
|
|
48
|
+
return c.tagName.toLowerCase() === tag;
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** Right edge of what is actually drawn inside an element, ignoring the caret. */
|
|
53
|
+
var drawnRight = function drawnRight(el) {
|
|
54
|
+
var right = -Infinity;
|
|
55
|
+
el.querySelectorAll('*').forEach(function (child) {
|
|
56
|
+
if (child.children.length || child.classList && child.classList.contains('ML__caret')) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
var rect = child.getBoundingClientRect();
|
|
60
|
+
if (rect.width > 0) {
|
|
61
|
+
right = Math.max(right, rect.right);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return right;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Correct every long division under `root`.
|
|
69
|
+
*
|
|
70
|
+
* @param {ParentNode} root a mathfield's shadow root, or an element holding
|
|
71
|
+
* static MathLive markup
|
|
72
|
+
* @returns {number} how many were corrected
|
|
73
|
+
*/
|
|
74
|
+
var fixLongDivision = exports.fixLongDivision = function fixLongDivision(root) {
|
|
75
|
+
if (!root || typeof root.querySelectorAll !== 'function') {
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
var fixed = 0;
|
|
79
|
+
root.querySelectorAll('.ML__notation').forEach(function (notation) {
|
|
80
|
+
try {
|
|
81
|
+
var svg = childTag(notation, 'svg');
|
|
82
|
+
var line = childTag(svg, 'line');
|
|
83
|
+
|
|
84
|
+
// Long division is the only notation MathLive draws with an arc (<path>).
|
|
85
|
+
if (!line || !childTag(svg, 'path')) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
var dividend = notation.nextElementSibling;
|
|
89
|
+
var style = dividend && dividend.getAttribute('style');
|
|
90
|
+
var width = inlineEm(style, 'width');
|
|
91
|
+
var gap = inlineEm(style, 'margin-left');
|
|
92
|
+
var drop = inlineEm(style, 'top');
|
|
93
|
+
var viewBox = (svg.getAttribute('viewBox') || '').trim().split(/\s+/).map(Number);
|
|
94
|
+
var start = parseFloat(line.getAttribute('x1'));
|
|
95
|
+
if (!width || viewBox.length !== 4 || Number.isNaN(start)) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 2. size the box to the viewBox, so the drawing is not scaled down
|
|
100
|
+
notation.style.width = "calc(".concat(viewBox[2], "em + 1px)");
|
|
101
|
+
|
|
102
|
+
// 1. put the dividend back on the baseline. Growing the box upwards by the
|
|
103
|
+
// same amount keeps the drawing where it was relative to the dividend, and
|
|
104
|
+
// makes the line tall enough that the field does not clip the bar.
|
|
105
|
+
if (drop && notation.parentElement) {
|
|
106
|
+
dividend.style.top = '0';
|
|
107
|
+
notation.parentElement.style.paddingTop = "".concat(drop, "em");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 3. run the bar from the ")" to the end of the dividend
|
|
111
|
+
var end = start + gap + width;
|
|
112
|
+
var svgRect = svg.getBoundingClientRect();
|
|
113
|
+
var right = drawnRight(dividend);
|
|
114
|
+
if (svgRect.width > 0 && Number.isFinite(right)) {
|
|
115
|
+
end = (right - svgRect.left) * (viewBox[2] / svgRect.width);
|
|
116
|
+
}
|
|
117
|
+
line.setAttribute('x2', String(end));
|
|
118
|
+
fixed += 1;
|
|
119
|
+
} catch (e) {
|
|
120
|
+
log('could not correct a long division: %s', e && e.message);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return fixed;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Correct static markup now, and again once web fonts have loaded: the bar's
|
|
128
|
+
* end is measured, and glyph widths change when the math fonts arrive.
|
|
129
|
+
*
|
|
130
|
+
* @param {Element} element
|
|
131
|
+
*/
|
|
132
|
+
var fixLongDivisionWhenReady = exports.fixLongDivisionWhenReady = function fixLongDivisionWhenReady(element) {
|
|
133
|
+
fixLongDivision(element);
|
|
134
|
+
if (typeof document !== 'undefined' && document.fonts && document.fonts.ready) {
|
|
135
|
+
document.fonts.ready.then(function () {
|
|
136
|
+
return fixLongDivision(element);
|
|
137
|
+
})["catch"](function () {});
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Keep a live mathfield's long divisions corrected. MathLive rebuilds its shadow
|
|
143
|
+
* DOM on every render (each keystroke, a resize, the fonts loading), which
|
|
144
|
+
* discards the corrections, so they are reapplied whenever it does.
|
|
145
|
+
*
|
|
146
|
+
* @param {HTMLElement} mathField a MathLive `<math-field>`
|
|
147
|
+
* @returns {function|undefined} teardown, to call on unmount
|
|
148
|
+
*/
|
|
149
|
+
var trackLongDivision = exports.trackLongDivision = function trackLongDivision(mathField) {
|
|
150
|
+
var root = mathField && mathField.shadowRoot;
|
|
151
|
+
if (!root) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
var run = function run() {
|
|
155
|
+
return fixLongDivision(root);
|
|
156
|
+
};
|
|
157
|
+
run();
|
|
158
|
+
if (typeof MutationObserver === 'undefined') {
|
|
159
|
+
return function () {};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Only childList: the corrections themselves change attributes, so they do
|
|
163
|
+
// not retrigger this.
|
|
164
|
+
var observer = new MutationObserver(run);
|
|
165
|
+
observer.observe(root, {
|
|
166
|
+
childList: true,
|
|
167
|
+
subtree: true
|
|
168
|
+
});
|
|
169
|
+
return function () {
|
|
170
|
+
return observer.disconnect();
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
//# sourceMappingURL=longdiv.js.map
|