@pie-lib/math-input-mathlive 1.1.5-beta.8 → 1.1.5-beta.9
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/latex-bridge.js +67 -4
- package/lib/latex-bridge.js.map +1 -1
- package/lib/mf/input.js +0 -8
- package/lib/mf/input.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/latex-bridge.test.js +30 -0
- package/src/latex-bridge.js +80 -5
- package/src/mf/input.jsx +0 -9
- package/lib/__tests__/input-selection.test.js +0 -103
- package/lib/__tests__/selection.test.js +0 -195
- package/lib/selection.js +0 -148
- package/lib/selection.js.map +0 -1
- package/src/__tests__/input-selection.test.jsx +0 -64
- package/src/__tests__/selection.test.js +0 -212
- package/src/selection.js +0 -146
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
6
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
7
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
8
|
-
var _input = _interopRequireDefault(require("../mf/input"));
|
|
9
|
-
var _selection = require("../selection");
|
|
10
|
-
/**
|
|
11
|
-
* The editable Input keeps its selection snapped to whole atoms (see
|
|
12
|
-
* selection.js). This checks the wiring: attached on mount, removed on unmount.
|
|
13
|
-
*/
|
|
14
|
-
jest.mock('../mathlive-instance', function () {
|
|
15
|
-
var FakeMathfieldElement = /*#__PURE__*/(0, _createClass2["default"])(function FakeMathfieldElement() {
|
|
16
|
-
(0, _classCallCheck2["default"])(this, FakeMathfieldElement);
|
|
17
|
-
var el = global.document.createElement('math-field');
|
|
18
|
-
el.value = '';
|
|
19
|
-
el.getValue = function () {
|
|
20
|
-
return el.value;
|
|
21
|
-
};
|
|
22
|
-
return el;
|
|
23
|
-
});
|
|
24
|
-
return {
|
|
25
|
-
loadMathLive: function loadMathLive() {
|
|
26
|
-
return Promise.resolve({
|
|
27
|
-
MathfieldElement: FakeMathfieldElement
|
|
28
|
-
});
|
|
29
|
-
},
|
|
30
|
-
getMacros: function getMacros() {
|
|
31
|
-
return {};
|
|
32
|
-
},
|
|
33
|
-
MATH_MODE_SPACE: '\\ ',
|
|
34
|
-
applyShadowStyles: function applyShadowStyles() {},
|
|
35
|
-
trackPlaceholderCaret: function trackPlaceholderCaret() {
|
|
36
|
-
return function () {};
|
|
37
|
-
},
|
|
38
|
-
latexToMarkup: function latexToMarkup(l) {
|
|
39
|
-
return "<span>".concat(l, "</span>");
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
});
|
|
43
|
-
var mockUntrack = jest.fn();
|
|
44
|
-
jest.mock('../selection', function () {
|
|
45
|
-
return {
|
|
46
|
-
trackWholeAtomSelection: jest.fn(function () {
|
|
47
|
-
return mockUntrack;
|
|
48
|
-
})
|
|
49
|
-
};
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// eslint-disable-next-line import/first
|
|
53
|
-
|
|
54
|
-
// eslint-disable-next-line import/first
|
|
55
|
-
|
|
56
|
-
describe('Input: whole-atom selection', function () {
|
|
57
|
-
beforeEach(function () {
|
|
58
|
-
_selection.trackWholeAtomSelection.mockClear();
|
|
59
|
-
mockUntrack.mockClear();
|
|
60
|
-
});
|
|
61
|
-
it('attaches the tracker to the mathfield on mount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
62
|
-
var input;
|
|
63
|
-
return _regenerator["default"].wrap(function (_context) {
|
|
64
|
-
while (1) switch (_context.prev = _context.next) {
|
|
65
|
-
case 0:
|
|
66
|
-
input = new _input["default"]({});
|
|
67
|
-
input.holderRef = {
|
|
68
|
-
current: document.createElement('span')
|
|
69
|
-
};
|
|
70
|
-
_context.next = 1;
|
|
71
|
-
return input.componentDidMount();
|
|
72
|
-
case 1:
|
|
73
|
-
expect(_selection.trackWholeAtomSelection).toHaveBeenCalledTimes(1);
|
|
74
|
-
expect(_selection.trackWholeAtomSelection).toHaveBeenCalledWith(input.mathField);
|
|
75
|
-
case 2:
|
|
76
|
-
case "end":
|
|
77
|
-
return _context.stop();
|
|
78
|
-
}
|
|
79
|
-
}, _callee);
|
|
80
|
-
})));
|
|
81
|
-
it('removes it on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
82
|
-
var input;
|
|
83
|
-
return _regenerator["default"].wrap(function (_context2) {
|
|
84
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
85
|
-
case 0:
|
|
86
|
-
input = new _input["default"]({});
|
|
87
|
-
input.holderRef = {
|
|
88
|
-
current: document.createElement('span')
|
|
89
|
-
};
|
|
90
|
-
_context2.next = 1;
|
|
91
|
-
return input.componentDidMount();
|
|
92
|
-
case 1:
|
|
93
|
-
input.componentWillUnmount();
|
|
94
|
-
expect(mockUntrack).toHaveBeenCalledTimes(1);
|
|
95
|
-
expect(input.untrackSelection).toBeUndefined();
|
|
96
|
-
case 2:
|
|
97
|
-
case "end":
|
|
98
|
-
return _context2.stop();
|
|
99
|
-
}
|
|
100
|
-
}, _callee2);
|
|
101
|
-
})));
|
|
102
|
-
});
|
|
103
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5wdXQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zZWxlY3Rpb24iLCJqZXN0IiwibW9jayIsIkZha2VNYXRoZmllbGRFbGVtZW50IiwiX2NyZWF0ZUNsYXNzMiIsIl9jbGFzc0NhbGxDaGVjazIiLCJlbCIsImdsb2JhbCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInZhbHVlIiwiZ2V0VmFsdWUiLCJsb2FkTWF0aExpdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1hdGhmaWVsZEVsZW1lbnQiLCJnZXRNYWNyb3MiLCJNQVRIX01PREVfU1BBQ0UiLCJhcHBseVNoYWRvd1N0eWxlcyIsInRyYWNrUGxhY2Vob2xkZXJDYXJldCIsImxhdGV4VG9NYXJrdXAiLCJsIiwiY29uY2F0IiwibW9ja1VudHJhY2siLCJmbiIsInRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uIiwiZGVzY3JpYmUiLCJiZWZvcmVFYWNoIiwibW9ja0NsZWFyIiwiaXQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImlucHV0Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJJbnB1dCIsImhvbGRlclJlZiIsImN1cnJlbnQiLCJjb21wb25lbnREaWRNb3VudCIsImV4cGVjdCIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibWF0aEZpZWxkIiwic3RvcCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bnRyYWNrU2VsZWN0aW9uIiwidG9CZVVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5wdXQtc2VsZWN0aW9uLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGVkaXRhYmxlIElucHV0IGtlZXBzIGl0cyBzZWxlY3Rpb24gc25hcHBlZCB0byB3aG9sZSBhdG9tcyAoc2VlXG4gKiBzZWxlY3Rpb24uanMpLiBUaGlzIGNoZWNrcyB0aGUgd2lyaW5nOiBhdHRhY2hlZCBvbiBtb3VudCwgcmVtb3ZlZCBvbiB1bm1vdW50LlxuICovXG5qZXN0Lm1vY2soJy4uL21hdGhsaXZlLWluc3RhbmNlJywgKCkgPT4ge1xuICBjbGFzcyBGYWtlTWF0aGZpZWxkRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBjb25zdCBlbCA9IGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtYXRoLWZpZWxkJyk7XG5cbiAgICAgIGVsLnZhbHVlID0gJyc7XG4gICAgICBlbC5nZXRWYWx1ZSA9ICgpID0+IGVsLnZhbHVlO1xuXG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkTWF0aExpdmU6ICgpID0+IFByb21pc2UucmVzb2x2ZSh7IE1hdGhmaWVsZEVsZW1lbnQ6IEZha2VNYXRoZmllbGRFbGVtZW50IH0pLFxuICAgIGdldE1hY3JvczogKCkgPT4gKHt9KSxcbiAgICBNQVRIX01PREVfU1BBQ0U6ICdcXFxcICcsXG4gICAgYXBwbHlTaGFkb3dTdHlsZXM6ICgpID0+IHt9LFxuICAgIHRyYWNrUGxhY2Vob2xkZXJDYXJldDogKCkgPT4gKCkgPT4ge30sXG4gICAgbGF0ZXhUb01hcmt1cDogKGwpID0+IGA8c3Bhbj4ke2x9PC9zcGFuPmAsXG4gIH07XG59KTtcblxuY29uc3QgbW9ja1VudHJhY2sgPSBqZXN0LmZuKCk7XG5cbmplc3QubW9jaygnLi4vc2VsZWN0aW9uJywgKCkgPT4gKHtcbiAgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb246IGplc3QuZm4oKCkgPT4gbW9ja1VudHJhY2spLFxufSkpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L2ZpcnN0XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vbWYvaW5wdXQnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9maXJzdFxuaW1wb3J0IHsgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24gfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuXG5kZXNjcmliZSgnSW5wdXQ6IHdob2xlLWF0b20gc2VsZWN0aW9uJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0cmFja1dob2xlQXRvbVNlbGVjdGlvbi5tb2NrQ2xlYXIoKTtcbiAgICBtb2NrVW50cmFjay5tb2NrQ2xlYXIoKTtcbiAgfSk7XG5cbiAgaXQoJ2F0dGFjaGVzIHRoZSB0cmFja2VyIHRvIHRoZSBtYXRoZmllbGQgb24gbW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgSW5wdXQoe30pO1xuXG4gICAgaW5wdXQuaG9sZGVyUmVmID0geyBjdXJyZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykgfTtcbiAgICBhd2FpdCBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgZXhwZWN0KHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgZXhwZWN0KHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChpbnB1dC5tYXRoRmllbGQpO1xuICB9KTtcblxuICBpdCgncmVtb3ZlcyBpdCBvbiB1bm1vdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gbmV3IElucHV0KHt9KTtcblxuICAgIGlucHV0LmhvbGRlclJlZiA9IHsgY3VycmVudDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpIH07XG4gICAgYXdhaXQgaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICBpbnB1dC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXG4gICAgZXhwZWN0KG1vY2tVbnRyYWNrKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgZXhwZWN0KGlucHV0LnVudHJhY2tTZWxlY3Rpb24pLnRvQmVVbmRlZmluZWQoKTtcbiAg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
|
|
@@ -1,195 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2VsZWN0aW9uIiwicmVxdWlyZSIsInRhYmxlIiwicm93cyIsImkiLCJkZXB0aCIsImxhdGV4IiwidW5kZWZpbmVkIiwiUE9MWSIsIlBPTFlfTEFTVCIsIlJPT1QiLCJORVNURUQiLCJkZXNjcmliZSIsInBvbHkiLCJhIiwiYiIsImV4cGFuZFJhbmdlIiwiaXQiLCJleHBlY3QiLCJ0b0VxdWFsIiwic3R1YkZpZWxkIiwicmFuZ2UiLCJkaXJlY3Rpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJsaXN0ZW5lcnMiLCJzZWxlY3Rpb24iLCJyYW5nZXMiLCJzZWxlY3Rpb25Jc0NvbGxhcHNlZCIsImxhc3RPZmZzZXQiLCJnZXRFbGVtZW50SW5mbyIsInNldHMiLCJhZGRFdmVudExpc3RlbmVyIiwidHlwZSIsImZuIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZpcmUiLCJoYXMiLCJ0cmFjayIsImZpZWxkIiwiY3VycmVudCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0Iiwic2V0IiwidiIsInRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uIiwidG9CZSIsIkVycm9yIiwibm90IiwidG9UaHJvdyIsInVudHJhY2siLCJ0b0JlVW5kZWZpbmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9zZWxlY3Rpb24udGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBhbmRSYW5nZSwgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24gfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuXG4vKipcbiAqIE9mZnNldCB0YWJsZXMgY2FwdHVyZWQgZnJvbSBNYXRoTGl2ZSAwLjExMC4wIGBnZXRFbGVtZW50SW5mbyhpKWAgaW4gQ2hyb21lLFxuICogYXMgW2RlcHRoLCBsYXRleF0gcGVyIG9mZnNldC4gT2Zmc2V0IGBpYCBpcyB0aGUgYXRvbSBlbmRpbmcgYXQgY2FyZXQgYGlgLlxuICovXG5jb25zdCB0YWJsZSA9IChyb3dzKSA9PiAoaSkgPT4gKHJvd3NbaV0gPyB7IGRlcHRoOiByb3dzW2ldWzBdLCBsYXRleDogcm93c1tpXVsxXSB9IDogdW5kZWZpbmVkKTtcblxuLy8gNXheMisyeCtcXGZyYWN7XFxwaX17Mn0tNFxuY29uc3QgUE9MWSA9IHRhYmxlKFtcbiAgWzAsICcnXSwgWzAsICc1J10sIFswLCAneCddLCBbMSwgJyddLCBbMSwgJzInXSwgWzAsICdeMiddLCBbMCwgJysnXSwgWzAsICcyJ10sIFswLCAneCddLCBbMCwgJysnXSxcbiAgWzEsICcnXSwgWzEsICdcXFxccGknXSwgWzEsICcnXSwgWzEsICcyJ10sIFswLCAnXFxcXGZyYWN7XFxcXHBpfXsyfSddLCBbMCwgJy0nXSwgWzAsICc0J10sXG5dKTtcbmNvbnN0IFBPTFlfTEFTVCA9IDE2O1xuXG4vLyBhK1xcc3FydHt4KzF9K2JcbmNvbnN0IFJPT1QgPSB0YWJsZShbWzAsICcnXSwgWzAsICdhJ10sIFswLCAnKyddLCBbMSwgJyddLCBbMSwgJ3gnXSwgWzEsICcrJ10sIFsxLCAnMSddLCBbMCwgJ1xcXFxzcXJ0e3grMX0nXSwgWzAsICcrJ10sIFswLCAnYiddXSk7XG5cbi8vIFxcZnJhY3tcXGZyYWN7YX17Yn19e2N9XG5jb25zdCBORVNURUQgPSB0YWJsZShbXG4gIFswLCAnJ10sIFsxLCAnJ10sIFsyLCAnJ10sIFsyLCAnYSddLCBbMiwgJyddLCBbMiwgJ2InXSwgWzEsICdcXFxcZnJhY3thfXtifSddLCBbMSwgJyddLCBbMSwgJ2MnXSwgWzAsICdcXFxcZnJhY3tcXFxcZnJhY3thfXtifX17Y30nXSxcbl0pO1xuXG5kZXNjcmliZSgnZXhwYW5kUmFuZ2UnLCAoKSA9PiB7XG4gIGNvbnN0IHBvbHkgPSAoYSwgYikgPT4gZXhwYW5kUmFuZ2UoYSwgYiwgUE9MWSwgUE9MWV9MQVNUKTtcblxuICBpdCgnbGVhdmVzIGEgc2VsZWN0aW9uIG9mIHdob2xlIHNpYmxpbmcgYXRvbXMgYWxvbmUnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoNiwgNykpLnRvRXF1YWwoWzYsIDddKTsgLy8gMlxuICAgIGV4cGVjdChwb2x5KDYsIDkpKS50b0VxdWFsKFs2LCA5XSk7IC8vIDJ4K1xuICAgIGV4cGVjdChwb2x5KDYsIDE1KSkudG9FcXVhbChbNiwgMTVdKTsgLy8gMngrXFxmcmFje1xccGl9ezJ9LVxuICAgIGV4cGVjdChwb2x5KDAsIDE2KSkudG9FcXVhbChbMCwgMTZdKTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJlcG9ydGVkIGNhc2U6IGZpdmUgU2hpZnQrUmlnaHQgcHJlc3NlcyBmcm9tIGJlZm9yZSBgMnhgIGdhdmUgYDJ4K1xccGlgLlxuICBpdCgndGFrZXMgdGhlIHdob2xlIGZyYWN0aW9uIHdoZW4gdGhlIHNlbGVjdGlvbiByZWFjaGVzIGludG8gaXQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoNiwgMTApKS50b0VxdWFsKFs2LCAxNF0pO1xuICAgIGV4cGVjdChwb2x5KDYsIDExKSkudG9FcXVhbChbNiwgMTRdKTtcbiAgICBleHBlY3QocG9seSg2LCAxMykpLnRvRXF1YWwoWzYsIDE0XSk7XG4gIH0pO1xuXG4gIGl0KCd0YWtlcyB0aGUgd2hvbGUgZnJhY3Rpb24gd2hlbiB0aGUgc2VsZWN0aW9uIGxlYXZlcyBpdCcsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgxMSwgMTUpKS50b0VxdWFsKFs5LCAxNV0pOyAvLyBmcm9tIHRoZSBwaSB0byBhZnRlciB0aGUgbWludXNcbiAgfSk7XG5cbiAgaXQoJ2Nyb3NzaW5nIGZyb20gbnVtZXJhdG9yIHRvIGRlbm9taW5hdG9yIHNlbGVjdHMgdGhlIGZyYWN0aW9uJywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDExLCAxMykpLnRvRXF1YWwoWzksIDE0XSk7XG4gICAgZXhwZWN0KHBvbHkoMTEsIDEyKSkudG9FcXVhbChbOSwgMTRdKTtcbiAgfSk7XG5cbiAgaXQoJ2Egc2VsZWN0aW9uIGluc2lkZSBvbmUgYnJhbmNoIHN0YXlzIGluc2lkZSBpdCcsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgxMCwgMTEpKS50b0VxdWFsKFsxMCwgMTFdKTsgLy8gXFxwaVxuICAgIGV4cGVjdChwb2x5KDEyLCAxMykpLnRvRXF1YWwoWzEyLCAxM10pOyAvLyB0aGUgMiBvZiB0aGUgZGVub21pbmF0b3JcbiAgfSk7XG5cbiAgLy8gTWF0aExpdmUgc3RvcmVzIHheMiBhcyBgeGAgdGhlbiBhIHNlcGFyYXRlIGBeMmAgYXRvbS5cbiAgaXQoJ2tlZXBzIGEgc3VwZXJzY3JpcHQgd2l0aCBpdHMgYmFzZScsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgzLCA3KSkudG9FcXVhbChbMSwgN10pOyAvLyB4XjIrMiwgbm90IF4yKzJcbiAgICBleHBlY3QocG9seSg0LCA2KSkudG9FcXVhbChbMSwgNl0pOyAvLyB4XjIrXG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGEgcmV2ZXJzZWQgcmFuZ2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoMTEsIDYpKS50b0VxdWFsKFs2LCAxNF0pO1xuICB9KTtcblxuICBpdCgnbGVhdmVzIGEgY29sbGFwc2VkIHJhbmdlIGFsb25lJywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDExLCAxMSkpLnRvRXF1YWwoWzExLCAxMV0pO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyByb290cyB0aGUgc2FtZSB3YXknLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDIsIDQsIFJPT1QsIDkpKS50b0VxdWFsKFsyLCA3XSk7XG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDQsIDYsIFJPT1QsIDkpKS50b0VxdWFsKFs0LCA2XSk7IC8vICsxIGluc2lkZSB0aGUgcmFkaWNhbmRcbiAgfSk7XG5cbiAgaXQoJ2NsaW1icyBhcyBtYW55IGxldmVscyBhcyBuZWVkZWQgaW4gbmVzdGVkIGZyYWN0aW9ucycsICgpID0+IHtcbiAgICBleHBlY3QoZXhwYW5kUmFuZ2UoMiwgMywgTkVTVEVELCA5KSkudG9FcXVhbChbMiwgM10pOyAvLyBhXG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDMsIDUsIE5FU1RFRCwgOSkpLnRvRXF1YWwoWzEsIDZdKTsgLy8gYS9iIGNyb3NzaW5nIC0+IGlubmVyIGZyYWN0aW9uXG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDYsIDcsIE5FU1RFRCwgOSkpLnRvRXF1YWwoWzAsIDldKTsgLy8gaW5uZXIgLT4gb3V0ZXIgZGVub21pbmF0b3JcbiAgfSk7XG5cbiAgaXQoJ3RvbGVyYXRlcyBtaXNzaW5nIGluZm8nLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDEsIDMsICgpID0+IHVuZGVmaW5lZCwgNSkpLnRvRXF1YWwoWzEsIDNdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3RyYWNrV2hvbGVBdG9tU2VsZWN0aW9uJywgKCkgPT4ge1xuICBjb25zdCBzdHViRmllbGQgPSAocmFuZ2UsIGRpcmVjdGlvbiA9ICdmb3J3YXJkJykgPT4ge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdGlvbjogeyByYW5nZXM6IFtyYW5nZV0sIGRpcmVjdGlvbiB9LFxuICAgICAgZ2V0IHNlbGVjdGlvbklzQ29sbGFwc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24ucmFuZ2VzWzBdWzBdID09PSB0aGlzLnNlbGVjdGlvbi5yYW5nZXNbMF1bMV07XG4gICAgICB9LFxuICAgICAgbGFzdE9mZnNldDogUE9MWV9MQVNULFxuICAgICAgZ2V0RWxlbWVudEluZm86IFBPTFksXG4gICAgICBzZXRzOiAwLFxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbikge1xuICAgICAgICBsaXN0ZW5lcnNbdHlwZV0gPSBmbjtcbiAgICAgIH0sXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZuKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lcnNbdHlwZV0gPT09IGZuKSB7XG4gICAgICAgICAgZGVsZXRlIGxpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpcmUodHlwZSkge1xuICAgICAgICBpZiAobGlzdGVuZXJzW3R5cGVdKSB7XG4gICAgICAgICAgbGlzdGVuZXJzW3R5cGVdKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYXModHlwZSkge1xuICAgICAgICByZXR1cm4gISFsaXN0ZW5lcnNbdHlwZV07XG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgdHJhY2sgPSAoZmllbGQpID0+IHtcbiAgICAvLyBjb3VudCBhc3NpZ25tZW50cyB3aXRob3V0IGJyZWFraW5nIHRoZSBnZXR0ZXJcbiAgICBsZXQgY3VycmVudCA9IGZpZWxkLnNlbGVjdGlvbjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWVsZCwgJ3NlbGVjdGlvbicsIHtcbiAgICAgIGdldDogKCkgPT4gY3VycmVudCxcbiAgICAgIHNldDogKHYpID0+IHtcbiAgICAgICAgZmllbGQuc2V0cyArPSAxO1xuICAgICAgICBjdXJyZW50ID0gdjtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24oZmllbGQpO1xuICB9O1xuXG4gIGl0KCd3aWRlbnMgdGhlIHNlbGVjdGlvbiBvbiBzZWxlY3Rpb24tY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCAxMV0pO1xuXG4gICAgdHJhY2soZmllbGQpO1xuICAgIGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKTtcblxuICAgIGV4cGVjdChmaWVsZC5zZWxlY3Rpb24ucmFuZ2VzKS50b0VxdWFsKFtbNiwgMTRdXSk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgdGhlIGRpcmVjdGlvbiwgc28gU2hpZnQrQXJyb3cga2VlcHMgZXh0ZW5kaW5nIHRoZSBzYW1lIGVuZCcsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbMTEsIDE2XSwgJ2JhY2t3YXJkJyk7XG5cbiAgICB0cmFjayhmaWVsZCk7XG4gICAgZmllbGQuZmlyZSgnc2VsZWN0aW9uLWNoYW5nZScpO1xuXG4gICAgZXhwZWN0KGZpZWxkLnNlbGVjdGlvbikudG9FcXVhbCh7IHJhbmdlczogW1s5LCAxNl1dLCBkaXJlY3Rpb246ICdiYWNrd2FyZCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCB0b3VjaCBhIHNlbGVjdGlvbiB0aGF0IGlzIGFscmVhZHkgd2hvbGUnLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSBzdHViRmllbGQoWzYsIDldKTtcblxuICAgIHRyYWNrKGZpZWxkKTtcbiAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG5cbiAgICBleHBlY3QoZmllbGQuc2V0cykudG9CZSgwKTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMgYSBjb2xsYXBzZWQgY2FyZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSBzdHViRmllbGQoWzExLCAxMV0pO1xuXG4gICAgdHJhY2soZmllbGQpO1xuICAgIGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKTtcblxuICAgIGV4cGVjdChmaWVsZC5zZXRzKS50b0JlKDApO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgcmVjdXJzZSB3aGVuIGl0cyBvd24gYXNzaWdubWVudCBmaXJlcyBzZWxlY3Rpb24tY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCAxMV0pO1xuICAgIGxldCBjdXJyZW50ID0gZmllbGQuc2VsZWN0aW9uO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkLCAnc2VsZWN0aW9uJywge1xuICAgICAgZ2V0OiAoKSA9PiBjdXJyZW50LFxuICAgICAgc2V0OiAodikgPT4ge1xuICAgICAgICBmaWVsZC5zZXRzICs9IDE7XG4gICAgICAgIGN1cnJlbnQgPSB2O1xuICAgICAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24oZmllbGQpO1xuICAgIGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKTtcblxuICAgIGV4cGVjdChmaWVsZC5zZXRzKS50b0JlKDEpO1xuICAgIGV4cGVjdChmaWVsZC5zZWxlY3Rpb24ucmFuZ2VzKS50b0VxdWFsKFtbNiwgMTRdXSk7XG4gIH0pO1xuXG4gIGl0KCdzdXJ2aXZlcyBhIGZpZWxkIHRoYXQgdGhyb3dzJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCAxMV0pO1xuXG4gICAgZmllbGQuZ2V0RWxlbWVudEluZm8gPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jvb20nKTtcbiAgICB9O1xuXG4gICAgdHJhY2soZmllbGQpO1xuXG4gICAgZXhwZWN0KCgpID0+IGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoJ3RlYXJzIGRvd24gaXRzIGxpc3RlbmVyJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCAxMV0pO1xuICAgIGNvbnN0IHVudHJhY2sgPSB0cmFjayhmaWVsZCk7XG5cbiAgICBleHBlY3QoZmllbGQuaGFzKCdzZWxlY3Rpb24tY2hhbmdlJykpLnRvQmUodHJ1ZSk7XG4gICAgdW50cmFjaygpO1xuICAgIGV4cGVjdChmaWVsZC5oYXMoJ3NlbGVjdGlvbi1jaGFuZ2UnKSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdpcyBhIG5vLW9wIHdpdGhvdXQgYSBmaWVsZCcsICgpID0+IHtcbiAgICBleHBlY3QodHJhY2tXaG9sZUF0b21TZWxlY3Rpb24odW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdCh0cmFja1dob2xlQXRvbVNlbGVjdGlvbih7fSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1DLEtB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QUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcENELE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDRCxNQUFNLENBQUNMLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQ00sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0Q0QsTUFBTSxDQUFDTCxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUNNLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztFQUN0QyxDQUFDLENBQUM7O0VBRUY7RUFDQUYsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLFlBQU07SUFDdEVDLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcENELE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcENELE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7RUFDdEMsQ0FBQyxDQUFDO0VBRUZGLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxZQUFNO0lBQ2hFQyxNQUFNLENBQUNMLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQ00sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN6QyxDQUFDLENBQUM7RUFFRkYsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLFlBQU07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
|
package/lib/selection.js
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.trackWholeAtomSelection = exports.expandRange = void 0;
|
|
8
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
10
|
-
var log = (0, _debug["default"])('pie-lib:math-input-mathlive:selection');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Widen a selection so it covers whole atoms of a single parent.
|
|
14
|
-
*
|
|
15
|
-
* MathLive extends a selection over *flat offsets*, so Shift+Arrow walks into
|
|
16
|
-
* a fraction instead of over it: from before `2x` in `5x^2+2x+\frac{\pi}{2}-4`,
|
|
17
|
-
* five presses select `2x+` plus the `\pi` of the numerator, and copying gives
|
|
18
|
-
* `2x+\pi`. MathQuill treated a fraction (root, superscript...) as one unit,
|
|
19
|
-
* which is what authors expect.
|
|
20
|
-
*
|
|
21
|
-
* The tree is recovered from MathLive's public `getElementInfo(offset)`, where
|
|
22
|
-
* offset `i` describes the atom ending at caret position `i`:
|
|
23
|
-
*
|
|
24
|
-
* - a composite atom (fraction, root, script) owns the offset right *after*
|
|
25
|
-
* its children; the children are one level deeper;
|
|
26
|
-
* - each branch (numerator, denominator, radicand) opens with an empty-latex
|
|
27
|
-
* "start" atom.
|
|
28
|
-
*
|
|
29
|
-
* The rule: find the shallowest depth the selection touches, counting the caret
|
|
30
|
-
* it starts from. If the range crosses into a sibling branch at that depth, the
|
|
31
|
-
* real common parent is one level up. Then push both ends out of anything
|
|
32
|
-
* deeper. A script atom (`^2`) is kept with its base, since MathLive stores
|
|
33
|
-
* `x^2` as `x` followed by a separate `^2` atom.
|
|
34
|
-
*
|
|
35
|
-
* Pure, so it can be tested without a browser.
|
|
36
|
-
*
|
|
37
|
-
* @param {number} start
|
|
38
|
-
* @param {number} end
|
|
39
|
-
* @param {function(number): {depth?: number, latex?: string}} info
|
|
40
|
-
* @param {number} lastOffset
|
|
41
|
-
* @returns {[number, number]} the widened range, start <= end
|
|
42
|
-
*/
|
|
43
|
-
var expandRange = exports.expandRange = function expandRange(start, end, info, lastOffset) {
|
|
44
|
-
var at = function at(i) {
|
|
45
|
-
return info(i) || {};
|
|
46
|
-
};
|
|
47
|
-
var depth = function depth(i) {
|
|
48
|
-
return at(i).depth || 0;
|
|
49
|
-
};
|
|
50
|
-
var isBranchStart = function isBranchStart(i) {
|
|
51
|
-
return depth(i) > 0 && at(i).latex === '';
|
|
52
|
-
};
|
|
53
|
-
if (end < start) {
|
|
54
|
-
var _ref = [end, start];
|
|
55
|
-
start = _ref[0];
|
|
56
|
-
end = _ref[1];
|
|
57
|
-
}
|
|
58
|
-
if (end - start < 1) {
|
|
59
|
-
return [start, end];
|
|
60
|
-
}
|
|
61
|
-
var target = Infinity;
|
|
62
|
-
for (var i = start; i <= end; i++) {
|
|
63
|
-
target = Math.min(target, depth(i));
|
|
64
|
-
}
|
|
65
|
-
for (var _i = start + 1; _i <= end; _i++) {
|
|
66
|
-
if (depth(_i) === target && isBranchStart(_i)) {
|
|
67
|
-
target -= 1;
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
target = Math.max(target, 0);
|
|
72
|
-
while (start > 0 && depth(start) > target) {
|
|
73
|
-
start -= 1;
|
|
74
|
-
}
|
|
75
|
-
while (end < lastOffset && depth(end) > target) {
|
|
76
|
-
end += 1;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Keep a superscript / subscript with its base.
|
|
80
|
-
var first = start + 1;
|
|
81
|
-
while (first <= end && depth(first) > target) {
|
|
82
|
-
first += 1;
|
|
83
|
-
}
|
|
84
|
-
if (start > 0 && first <= end && /^[\^_]/.test(at(first).latex || '') && depth(start) === target) {
|
|
85
|
-
start -= 1;
|
|
86
|
-
}
|
|
87
|
-
return [start, end];
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Keep a mathfield's selection snapped to whole atoms (see {@link expandRange}).
|
|
92
|
-
*
|
|
93
|
-
* This fixes both what the user sees highlighted and what copy/cut put on the
|
|
94
|
-
* clipboard, since both come from the selection. The selection direction is
|
|
95
|
-
* preserved, so further Shift+Arrow presses keep extending the same end.
|
|
96
|
-
*
|
|
97
|
-
* @param {HTMLElement} mathField a MathLive `<math-field>`
|
|
98
|
-
* @returns {function|undefined} teardown, to call on unmount
|
|
99
|
-
*/
|
|
100
|
-
var trackWholeAtomSelection = exports.trackWholeAtomSelection = function trackWholeAtomSelection(mathField) {
|
|
101
|
-
if (!mathField || typeof mathField.addEventListener !== 'function') {
|
|
102
|
-
return undefined;
|
|
103
|
-
}
|
|
104
|
-
var applying = false;
|
|
105
|
-
var update = function update() {
|
|
106
|
-
if (applying) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
if (mathField.selectionIsCollapsed || typeof mathField.getElementInfo !== 'function') {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
var selection = mathField.selection;
|
|
114
|
-
var range = selection && selection.ranges && selection.ranges[0];
|
|
115
|
-
if (!range) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
var _range = (0, _slicedToArray2["default"])(range, 2),
|
|
119
|
-
start = _range[0],
|
|
120
|
-
end = _range[1];
|
|
121
|
-
var lo = Math.min(start, end);
|
|
122
|
-
var hi = Math.max(start, end);
|
|
123
|
-
var _expandRange = expandRange(lo, hi, function (i) {
|
|
124
|
-
return mathField.getElementInfo(i);
|
|
125
|
-
}, mathField.lastOffset),
|
|
126
|
-
_expandRange2 = (0, _slicedToArray2["default"])(_expandRange, 2),
|
|
127
|
-
nextStart = _expandRange2[0],
|
|
128
|
-
nextEnd = _expandRange2[1];
|
|
129
|
-
if (nextStart === lo && nextEnd === hi) {
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
applying = true;
|
|
133
|
-
mathField.selection = {
|
|
134
|
-
ranges: [[nextStart, nextEnd]],
|
|
135
|
-
direction: selection.direction
|
|
136
|
-
};
|
|
137
|
-
} catch (e) {
|
|
138
|
-
log('could not normalise the selection: %s', e && e.message);
|
|
139
|
-
} finally {
|
|
140
|
-
applying = false;
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
mathField.addEventListener('selection-change', update);
|
|
144
|
-
return function () {
|
|
145
|
-
return mathField.removeEventListener('selection-change', update);
|
|
146
|
-
};
|
|
147
|
-
};
|
|
148
|
-
//# sourceMappingURL=selection.js.map
|
package/lib/selection.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","names":["_debug","_interopRequireDefault","require","log","debug","expandRange","exports","start","end","info","lastOffset","at","i","depth","isBranchStart","latex","_ref","target","Infinity","Math","min","max","first","test","trackWholeAtomSelection","mathField","addEventListener","undefined","applying","update","selectionIsCollapsed","getElementInfo","selection","range","ranges","_range","_slicedToArray2","lo","hi","_expandRange","_expandRange2","nextStart","nextEnd","direction","e","message","removeEventListener"],"sources":["../src/selection.js"],"sourcesContent":["import debug from 'debug';\n\nconst log = debug('pie-lib:math-input-mathlive:selection');\n\n/**\n * Widen a selection so it covers whole atoms of a single parent.\n *\n * MathLive extends a selection over *flat offsets*, so Shift+Arrow walks into\n * a fraction instead of over it: from before `2x` in `5x^2+2x+\\frac{\\pi}{2}-4`,\n * five presses select `2x+` plus the `\\pi` of the numerator, and copying gives\n * `2x+\\pi`. MathQuill treated a fraction (root, superscript...) as one unit,\n * which is what authors expect.\n *\n * The tree is recovered from MathLive's public `getElementInfo(offset)`, where\n * offset `i` describes the atom ending at caret position `i`:\n *\n * - a composite atom (fraction, root, script) owns the offset right *after*\n * its children; the children are one level deeper;\n * - each branch (numerator, denominator, radicand) opens with an empty-latex\n * \"start\" atom.\n *\n * The rule: find the shallowest depth the selection touches, counting the caret\n * it starts from. If the range crosses into a sibling branch at that depth, the\n * real common parent is one level up. Then push both ends out of anything\n * deeper. A script atom (`^2`) is kept with its base, since MathLive stores\n * `x^2` as `x` followed by a separate `^2` atom.\n *\n * Pure, so it can be tested without a browser.\n *\n * @param {number} start\n * @param {number} end\n * @param {function(number): {depth?: number, latex?: string}} info\n * @param {number} lastOffset\n * @returns {[number, number]} the widened range, start <= end\n */\nexport const expandRange = (start, end, info, lastOffset) => {\n const at = (i) => info(i) || {};\n const depth = (i) => at(i).depth || 0;\n const isBranchStart = (i) => depth(i) > 0 && at(i).latex === '';\n\n if (end < start) {\n [start, end] = [end, start];\n }\n\n if (end - start < 1) {\n return [start, end];\n }\n\n let target = Infinity;\n\n for (let i = start; i <= end; i++) {\n target = Math.min(target, depth(i));\n }\n\n for (let i = start + 1; i <= end; i++) {\n if (depth(i) === target && isBranchStart(i)) {\n target -= 1;\n break;\n }\n }\n\n target = Math.max(target, 0);\n\n while (start > 0 && depth(start) > target) {\n start -= 1;\n }\n\n while (end < lastOffset && depth(end) > target) {\n end += 1;\n }\n\n // Keep a superscript / subscript with its base.\n let first = start + 1;\n\n while (first <= end && depth(first) > target) {\n first += 1;\n }\n\n if (start > 0 && first <= end && /^[\\^_]/.test(at(first).latex || '') && depth(start) === target) {\n start -= 1;\n }\n\n return [start, end];\n};\n\n/**\n * Keep a mathfield's selection snapped to whole atoms (see {@link expandRange}).\n *\n * This fixes both what the user sees highlighted and what copy/cut put on the\n * clipboard, since both come from the selection. The selection direction is\n * preserved, so further Shift+Arrow presses keep extending the same end.\n *\n * @param {HTMLElement} mathField a MathLive `<math-field>`\n * @returns {function|undefined} teardown, to call on unmount\n */\nexport const trackWholeAtomSelection = (mathField) => {\n if (!mathField || typeof mathField.addEventListener !== 'function') {\n return undefined;\n }\n\n let applying = false;\n\n const update = () => {\n if (applying) {\n return;\n }\n\n try {\n if (mathField.selectionIsCollapsed || typeof mathField.getElementInfo !== 'function') {\n return;\n }\n\n const selection = mathField.selection;\n const range = selection && selection.ranges && selection.ranges[0];\n\n if (!range) {\n return;\n }\n\n const [start, end] = range;\n const lo = Math.min(start, end);\n const hi = Math.max(start, end);\n const [nextStart, nextEnd] = expandRange(\n lo,\n hi,\n (i) => mathField.getElementInfo(i),\n mathField.lastOffset,\n );\n\n if (nextStart === lo && nextEnd === hi) {\n return;\n }\n\n applying = true;\n mathField.selection = { ranges: [[nextStart, nextEnd]], direction: selection.direction };\n } catch (e) {\n log('could not normalise the selection: %s', e && e.message);\n } finally {\n applying = false;\n }\n };\n\n mathField.addEventListener('selection-change', update);\n\n return () => mathField.removeEventListener('selection-change', update);\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The editable Input keeps its selection snapped to whole atoms (see
|
|
3
|
-
* selection.js). This checks the wiring: attached on mount, removed on unmount.
|
|
4
|
-
*/
|
|
5
|
-
jest.mock('../mathlive-instance', () => {
|
|
6
|
-
class FakeMathfieldElement {
|
|
7
|
-
constructor() {
|
|
8
|
-
const el = global.document.createElement('math-field');
|
|
9
|
-
|
|
10
|
-
el.value = '';
|
|
11
|
-
el.getValue = () => el.value;
|
|
12
|
-
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return {
|
|
18
|
-
loadMathLive: () => Promise.resolve({ MathfieldElement: FakeMathfieldElement }),
|
|
19
|
-
getMacros: () => ({}),
|
|
20
|
-
MATH_MODE_SPACE: '\\ ',
|
|
21
|
-
applyShadowStyles: () => {},
|
|
22
|
-
trackPlaceholderCaret: () => () => {},
|
|
23
|
-
latexToMarkup: (l) => `<span>${l}</span>`,
|
|
24
|
-
};
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const mockUntrack = jest.fn();
|
|
28
|
-
|
|
29
|
-
jest.mock('../selection', () => ({
|
|
30
|
-
trackWholeAtomSelection: jest.fn(() => mockUntrack),
|
|
31
|
-
}));
|
|
32
|
-
|
|
33
|
-
// eslint-disable-next-line import/first
|
|
34
|
-
import Input from '../mf/input';
|
|
35
|
-
// eslint-disable-next-line import/first
|
|
36
|
-
import { trackWholeAtomSelection } from '../selection';
|
|
37
|
-
|
|
38
|
-
describe('Input: whole-atom selection', () => {
|
|
39
|
-
beforeEach(() => {
|
|
40
|
-
trackWholeAtomSelection.mockClear();
|
|
41
|
-
mockUntrack.mockClear();
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('attaches the tracker to the mathfield on mount', async () => {
|
|
45
|
-
const input = new Input({});
|
|
46
|
-
|
|
47
|
-
input.holderRef = { current: document.createElement('span') };
|
|
48
|
-
await input.componentDidMount();
|
|
49
|
-
|
|
50
|
-
expect(trackWholeAtomSelection).toHaveBeenCalledTimes(1);
|
|
51
|
-
expect(trackWholeAtomSelection).toHaveBeenCalledWith(input.mathField);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('removes it on unmount', async () => {
|
|
55
|
-
const input = new Input({});
|
|
56
|
-
|
|
57
|
-
input.holderRef = { current: document.createElement('span') };
|
|
58
|
-
await input.componentDidMount();
|
|
59
|
-
input.componentWillUnmount();
|
|
60
|
-
|
|
61
|
-
expect(mockUntrack).toHaveBeenCalledTimes(1);
|
|
62
|
-
expect(input.untrackSelection).toBeUndefined();
|
|
63
|
-
});
|
|
64
|
-
});
|