@pie-lib/math-rendering 3.2.1 → 3.4.0-beta.0
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/CHANGELOG.md +16 -0
- package/NEXT.CHANGELOG.json +1 -0
- package/lib/__tests__/mml-to-latex.test.js +18 -0
- package/lib/__tests__/normalization.test.js +54 -0
- package/lib/__tests__/render-math.test.js +170 -0
- package/lib/index.js +1 -1
- package/lib/mml-to-latex.js +3 -5
- package/lib/mstack/__tests__/chtml.test.js +151 -0
- package/lib/mstack/chtml.js +1 -1
- package/lib/mstack/index.js +1 -1
- package/lib/mstack/mml.js +1 -1
- package/lib/normalization.js +1 -1
- package/lib/render-math.js +157 -77
- package/package.json +4 -4
- package/src/__tests__/mml-to-latex.test.js +15 -0
- package/src/__tests__/normalization.test.js +51 -0
- package/src/__tests__/render-math.test.js +155 -0
- package/src/mml-to-latex.js +2 -2
- package/src/mstack/__tests__/__snapshots__/chtml.test.js.snap +9 -0
- package/src/mstack/__tests__/chtml.test.js +104 -0
- package/src/render-math.js +127 -71
- package/lib/index.js.map +0 -1
- package/lib/mml-to-latex.js.map +0 -1
- package/lib/mstack/chtml.js.map +0 -1
- package/lib/mstack/index.js.map +0 -1
- package/lib/mstack/mml.js.map +0 -1
- package/lib/normalization.js.map +0 -1
- package/lib/render-math.js.map +0 -1
- package/playground/demo.html +0 -958
- package/playground/demo.js +0 -108
- package/playground/main.html +0 -158
- package/playground/main.js +0 -16
- package/playground/webpack.config.js +0 -29
package/lib/render-math.js
CHANGED
|
@@ -13,8 +13,30 @@ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
|
13
13
|
|
|
14
14
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
15
|
|
|
16
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
17
|
+
|
|
18
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
19
|
+
|
|
20
|
+
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
21
|
+
|
|
22
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
23
|
+
|
|
24
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
25
|
+
|
|
26
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
27
|
+
|
|
16
28
|
var _mathjax = require("mathjax-full/js/mathjax");
|
|
17
29
|
|
|
30
|
+
var _global = require("mathjax-full/js/components/global");
|
|
31
|
+
|
|
32
|
+
var _assistiveMml = require("mathjax-full/js/a11y/assistive-mml");
|
|
33
|
+
|
|
34
|
+
var _semanticEnrich = require("mathjax-full/js/a11y/semantic-enrich");
|
|
35
|
+
|
|
36
|
+
var _MenuHandler = require("mathjax-full/js/ui/menu/MenuHandler");
|
|
37
|
+
|
|
38
|
+
var _FindMathML2 = require("mathjax-full/js/input/mathml/FindMathML");
|
|
39
|
+
|
|
18
40
|
var _mathml = require("mathjax-full/js/input/mathml");
|
|
19
41
|
|
|
20
42
|
var _tex = require("mathjax-full/js/input/tex");
|
|
@@ -27,7 +49,7 @@ var _browserAdaptor = require("mathjax-full/js/adaptors/browserAdaptor");
|
|
|
27
49
|
|
|
28
50
|
var _AllPackages = require("mathjax-full/js/input/tex/AllPackages");
|
|
29
51
|
|
|
30
|
-
var
|
|
52
|
+
var _system = require("speech-rule-engine/js/common/system");
|
|
31
53
|
|
|
32
54
|
var _mstack = require("./mstack");
|
|
33
55
|
|
|
@@ -43,14 +65,25 @@ var _WrapperFactory = require("mathjax-full/js/output/chtml/WrapperFactory");
|
|
|
43
65
|
|
|
44
66
|
var _mspace = require("mathjax-full/js/output/chtml/Wrappers/mspace");
|
|
45
67
|
|
|
68
|
+
var _HTMLDomStrings = require("mathjax-full/js/handlers/html/HTMLDomStrings");
|
|
69
|
+
|
|
46
70
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
47
71
|
|
|
48
72
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
49
73
|
|
|
74
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
75
|
+
|
|
76
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
77
|
+
|
|
50
78
|
if (typeof window !== 'undefined') {
|
|
51
79
|
(0, _html.RegisterHTMLHandler)((0, _browserAdaptor.browserAdaptor)());
|
|
52
80
|
}
|
|
53
81
|
|
|
82
|
+
var sreReady = false;
|
|
83
|
+
(0, _system.engineReady)().then(function () {
|
|
84
|
+
sreReady = true;
|
|
85
|
+
}); // import pkg from '../../package.json';
|
|
86
|
+
|
|
54
87
|
var visitor = new _SerializedMmlVisitor.SerializedMmlVisitor();
|
|
55
88
|
|
|
56
89
|
var toMMl = function toMMl(node) {
|
|
@@ -62,7 +95,14 @@ var NEWLINE_BLOCK_REGEX = /\\embed\{newLine\}\[\]/g;
|
|
|
62
95
|
var NEWLINE_LATEX = '\\newline ';
|
|
63
96
|
|
|
64
97
|
var getGlobal = function getGlobal() {
|
|
65
|
-
|
|
98
|
+
// TODO does it make sense to use version?
|
|
99
|
+
// const key = `${pkg.name}@${pkg.version.split('.')[0]}`;
|
|
100
|
+
// It looks like Ed made this change when he switched from mathjax3 to mathjax-full
|
|
101
|
+
// I think it was supposed to make sure version 1 (using mathjax3) is not used
|
|
102
|
+
// in combination with version 2 (using mathjax-full)
|
|
103
|
+
// TODO higher level wrappers use this instance of math-rendering, and if 2 different instances are used, math rendering is not working
|
|
104
|
+
// so I will hardcode this for now until a better solution is found
|
|
105
|
+
var key = '@pie-lib/math-rendering@2';
|
|
66
106
|
|
|
67
107
|
if (typeof window !== 'undefined') {
|
|
68
108
|
if (!window[key]) {
|
|
@@ -127,6 +167,35 @@ var adjustMathMLStyle = function adjustMathMLStyle() {
|
|
|
127
167
|
});
|
|
128
168
|
};
|
|
129
169
|
|
|
170
|
+
var myFindMathML = /*#__PURE__*/function (_FindMathML) {
|
|
171
|
+
(0, _inherits2["default"])(myFindMathML, _FindMathML);
|
|
172
|
+
|
|
173
|
+
var _super = _createSuper(myFindMathML);
|
|
174
|
+
|
|
175
|
+
function myFindMathML() {
|
|
176
|
+
(0, _classCallCheck2["default"])(this, myFindMathML);
|
|
177
|
+
return _super.apply(this, arguments);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
(0, _createClass2["default"])(myFindMathML, [{
|
|
181
|
+
key: "processMath",
|
|
182
|
+
value: function processMath(set) {
|
|
183
|
+
var adaptor = this.adaptor;
|
|
184
|
+
|
|
185
|
+
for (var _i = 0, _Array$from = Array.from(set); _i < _Array$from.length; _i++) {
|
|
186
|
+
var mml = _Array$from[_i];
|
|
187
|
+
|
|
188
|
+
if (adaptor.kind(adaptor.parent(mml)) === 'mjx-assistive-mml') {
|
|
189
|
+
set["delete"](mml);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return (0, _get2["default"])((0, _getPrototypeOf2["default"])(myFindMathML.prototype), "processMath", this).call(this, set);
|
|
194
|
+
}
|
|
195
|
+
}]);
|
|
196
|
+
return myFindMathML;
|
|
197
|
+
}(_FindMathML2.FindMathML);
|
|
198
|
+
|
|
130
199
|
var createMathMLInstance = function createMathMLInstance(opts) {
|
|
131
200
|
var docProvided = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
|
|
132
201
|
opts = opts || defaultOpts();
|
|
@@ -154,68 +223,40 @@ var createMathMLInstance = function createMathMLInstance(opts) {
|
|
|
154
223
|
packages: packages,
|
|
155
224
|
macros: macros,
|
|
156
225
|
inlineMath: [['$', '$'], ['\\(', '\\)']],
|
|
157
|
-
processEscapes: true
|
|
158
|
-
options: {
|
|
159
|
-
enableExplorer: true,
|
|
160
|
-
enableAssistiveMml: true,
|
|
161
|
-
a11y: {
|
|
162
|
-
speech: true,
|
|
163
|
-
braille: true,
|
|
164
|
-
subtitles: true
|
|
165
|
-
},
|
|
166
|
-
sre: {
|
|
167
|
-
domain: 'default',
|
|
168
|
-
style: 'default',
|
|
169
|
-
locale: 'en'
|
|
170
|
-
}
|
|
171
|
-
}
|
|
226
|
+
processEscapes: true
|
|
172
227
|
} : {
|
|
173
228
|
packages: packages,
|
|
174
|
-
macros: macros
|
|
175
|
-
options: {
|
|
176
|
-
enableExplorer: true,
|
|
177
|
-
enableAssistiveMml: true,
|
|
178
|
-
a11y: {
|
|
179
|
-
speech: true,
|
|
180
|
-
braille: true,
|
|
181
|
-
subtitles: true
|
|
182
|
-
},
|
|
183
|
-
sre: {
|
|
184
|
-
domain: 'default',
|
|
185
|
-
style: 'default',
|
|
186
|
-
locale: 'en'
|
|
187
|
-
}
|
|
188
|
-
}
|
|
229
|
+
macros: macros
|
|
189
230
|
};
|
|
190
231
|
var mmlConfig = {
|
|
191
|
-
options: {
|
|
192
|
-
a11y: {
|
|
193
|
-
speech: true,
|
|
194
|
-
braille: true,
|
|
195
|
-
subtitles: true
|
|
196
|
-
}
|
|
197
|
-
},
|
|
198
232
|
parseError: function parseError(node) {
|
|
199
233
|
// function to process parsing errors
|
|
200
234
|
// eslint-disable-next-line no-console
|
|
201
235
|
console.log('error:', node);
|
|
202
236
|
this.error(this.adaptor.textContent(node).replace(/\n.*/g, ''));
|
|
203
|
-
}
|
|
237
|
+
},
|
|
238
|
+
FindMathML: new myFindMathML()
|
|
204
239
|
};
|
|
240
|
+
var cachedMathjax;
|
|
241
|
+
|
|
242
|
+
if (_global.MathJax && _global.MathJax.version !== _mathjax.mathjax.version) {
|
|
243
|
+
// handling other MathJax version on the page
|
|
244
|
+
// replacing it temporarily with the version we have
|
|
245
|
+
window.MathJax._ = window.MathJax._ || {};
|
|
246
|
+
window.MathJax.config = window.MathJax.config || {};
|
|
247
|
+
cachedMathjax = window.MathJax;
|
|
248
|
+
Object.assign(_global.MathJax, _mathjax.mathjax);
|
|
249
|
+
}
|
|
250
|
+
|
|
205
251
|
var fontURL = "https://unpkg.com/mathjax-full@".concat(_mathjax.mathjax.version, "/ts/output/chtml/fonts/tex-woff-v2");
|
|
206
252
|
var htmlConfig = {
|
|
207
253
|
fontURL: fontURL,
|
|
208
|
-
wrapperFactory: new _WrapperFactory.CHTMLWrapperFactory(_objectSpread(_objectSpread({}, _WrapperFactory.CHTMLWrapperFactory.defaultNodes), _mstack.chtmlNodes))
|
|
209
|
-
options: {
|
|
210
|
-
renderActions: {
|
|
211
|
-
assistiveMml: [['AssistiveMmlHandler']]
|
|
212
|
-
}
|
|
213
|
-
}
|
|
254
|
+
wrapperFactory: new _WrapperFactory.CHTMLWrapperFactory(_objectSpread(_objectSpread({}, _WrapperFactory.CHTMLWrapperFactory.defaultNodes), _mstack.chtmlNodes))
|
|
214
255
|
};
|
|
215
256
|
var mml = new _mathml.MathML(mmlConfig);
|
|
216
257
|
var customMmlFactory = new _MmlFactory.MmlFactory(_objectSpread(_objectSpread({}, _MmlFactory.MmlFactory.defaultNodes), _mstack.mmlNodes));
|
|
217
|
-
|
|
218
|
-
var html =
|
|
258
|
+
var classFactory = (0, _semanticEnrich.EnrichHandler)((0, _MenuHandler.MenuHandler)((0, _assistiveMml.AssistiveMmlHandler)(_mathjax.mathjax.handlers.handlesDocument(docProvided))), mml);
|
|
259
|
+
var html = classFactory.create(docProvided, {
|
|
219
260
|
compileError: function compileError(mj, math, err) {
|
|
220
261
|
// eslint-disable-next-line no-console
|
|
221
262
|
console.log('bad math?:', math); // eslint-disable-next-line no-console
|
|
@@ -229,25 +270,29 @@ var createMathMLInstance = function createMathMLInstance(opts) {
|
|
|
229
270
|
console.error(err);
|
|
230
271
|
doc.typesetError(math, err);
|
|
231
272
|
},
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
menuOptions: {
|
|
235
|
-
settings: {
|
|
236
|
-
assistiveMml: true,
|
|
237
|
-
collapsible: true,
|
|
238
|
-
explorer: true
|
|
239
|
-
}
|
|
240
|
-
}
|
|
273
|
+
sre: {
|
|
274
|
+
speech: 'deep'
|
|
241
275
|
},
|
|
276
|
+
enrichSpeech: 'deep',
|
|
242
277
|
InputJax: [new _tex.TeX(texConfig), mml],
|
|
243
|
-
OutputJax: new _chtml.CHTML(htmlConfig)
|
|
278
|
+
OutputJax: new _chtml.CHTML(htmlConfig),
|
|
279
|
+
DomStrings: new _HTMLDomStrings.HTMLDomStrings({
|
|
280
|
+
skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code', 'annotation', 'annotation-xml', 'mjx-assistive-mml', 'mjx-container']
|
|
281
|
+
})
|
|
244
282
|
}); // Note: we must set this *after* mathjax.document (no idea why)
|
|
245
283
|
|
|
246
|
-
|
|
247
284
|
mml.setMmlFactory(customMmlFactory);
|
|
285
|
+
|
|
286
|
+
if (cachedMathjax) {
|
|
287
|
+
// if we have a cached version, we replace it here
|
|
288
|
+
window.MathJax = cachedMathjax;
|
|
289
|
+
}
|
|
290
|
+
|
|
248
291
|
return html;
|
|
249
292
|
};
|
|
250
293
|
|
|
294
|
+
var enrichSpeechInitialized = false;
|
|
295
|
+
|
|
251
296
|
var bootstrap = function bootstrap(opts) {
|
|
252
297
|
if (typeof window === 'undefined') {
|
|
253
298
|
return {
|
|
@@ -262,33 +307,68 @@ var bootstrap = function bootstrap(opts) {
|
|
|
262
307
|
version: _mathjax.mathjax.version,
|
|
263
308
|
html: html,
|
|
264
309
|
Typeset: function Typeset() {
|
|
310
|
+
var _this = this;
|
|
311
|
+
|
|
265
312
|
for (var _len = arguments.length, elements = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
266
313
|
elements[_key] = arguments[_key];
|
|
267
314
|
}
|
|
268
315
|
|
|
269
|
-
var
|
|
270
|
-
|
|
271
|
-
|
|
316
|
+
var attemptRender = function attemptRender() {
|
|
317
|
+
var _updatedDocument$math, _updatedDocument$math2;
|
|
318
|
+
|
|
319
|
+
var temporary = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
272
320
|
|
|
273
|
-
|
|
274
|
-
|
|
321
|
+
var updatedDocument = _this.html.findMath(elements.length ? {
|
|
322
|
+
elements: elements
|
|
323
|
+
} : {}).compile();
|
|
275
324
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
var parsedMathMl = mathMl.replaceAll('\n', '');
|
|
279
|
-
item.data.typesetRoot.setAttribute('data-mathml', parsedMathMl);
|
|
325
|
+
if (!temporary && sreReady) {
|
|
326
|
+
updatedDocument = updatedDocument.enrich();
|
|
280
327
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
328
|
+
|
|
329
|
+
updatedDocument = updatedDocument.getMetrics().typeset().assistiveMml().attachSpeech().addMenu().updateDocument();
|
|
330
|
+
|
|
331
|
+
if (!enrichSpeechInitialized && (0, _typeof2["default"])((_updatedDocument$math = updatedDocument.math.list) === null || _updatedDocument$math === void 0 ? void 0 : (_updatedDocument$math2 = _updatedDocument$math.next) === null || _updatedDocument$math2 === void 0 ? void 0 : _updatedDocument$math2.data) === 'object') {
|
|
332
|
+
enrichSpeechInitialized = true;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
try {
|
|
336
|
+
var list = updatedDocument.math.list;
|
|
337
|
+
|
|
338
|
+
if (list) {
|
|
339
|
+
for (var item = list.next; (0, _typeof2["default"])(item.data) !== 'symbol'; item = item.next) {
|
|
340
|
+
var mathMl = toMMl(item.data.root);
|
|
341
|
+
var parsedMathMl = mathMl.replaceAll('\n', '');
|
|
342
|
+
item.data.typesetRoot.setAttribute('data-mathml', parsedMathMl);
|
|
343
|
+
item.data.typesetRoot.setAttribute('tabindex', '-1');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
} catch (e) {
|
|
347
|
+
// eslint-disable-next-line no-console
|
|
348
|
+
console.error(e.toString());
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
updatedDocument.clear();
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
if (!enrichSpeechInitialized) {
|
|
355
|
+
attemptRender(true);
|
|
284
356
|
}
|
|
285
357
|
|
|
286
|
-
|
|
358
|
+
_mathjax.mathjax.handleRetriesFor(function () {
|
|
359
|
+
attemptRender();
|
|
360
|
+
});
|
|
287
361
|
}
|
|
288
362
|
};
|
|
289
363
|
};
|
|
290
364
|
|
|
291
365
|
var renderMath = function renderMath(el, renderOpts) {
|
|
366
|
+
var _getGlobal$instance, _getGlobal$instance2;
|
|
367
|
+
|
|
368
|
+
if (window && window.MathJax && window.MathJax.customKey && window.MathJax.customKey == '@pie-lib/math-rendering-accessible@1') {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
292
372
|
var isString = typeof el === 'string';
|
|
293
373
|
var executeOn = document.body;
|
|
294
374
|
|
|
@@ -325,14 +405,14 @@ var renderMath = function renderMath(el, renderOpts) {
|
|
|
325
405
|
return;
|
|
326
406
|
}
|
|
327
407
|
|
|
328
|
-
if (el instanceof Element) {
|
|
408
|
+
if (el instanceof Element && (_getGlobal$instance = getGlobal().instance) !== null && _getGlobal$instance !== void 0 && _getGlobal$instance.Typeset) {
|
|
329
409
|
getGlobal().instance.Typeset(el);
|
|
330
|
-
} else if (el.length) {
|
|
331
|
-
var _getGlobal$
|
|
410
|
+
} else if (el.length && (_getGlobal$instance2 = getGlobal().instance) !== null && _getGlobal$instance2 !== void 0 && _getGlobal$instance2.Typeset) {
|
|
411
|
+
var _getGlobal$instance3;
|
|
332
412
|
|
|
333
413
|
var arr = Array.from(el);
|
|
334
414
|
|
|
335
|
-
(_getGlobal$
|
|
415
|
+
(_getGlobal$instance3 = getGlobal().instance).Typeset.apply(_getGlobal$instance3, (0, _toConsumableArray2["default"])(arr));
|
|
336
416
|
}
|
|
337
417
|
};
|
|
338
418
|
/**
|
|
@@ -355,4 +435,4 @@ _mspace.CHTMLmspace.styles = {
|
|
|
355
435
|
};
|
|
356
436
|
var _default = renderMath;
|
|
357
437
|
exports["default"] = _default;
|
|
358
|
-
//# sourceMappingURL=render-math.js.map
|
|
438
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZW5kZXItbWF0aC5qcyJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJzcmVSZWFkeSIsInRoZW4iLCJ2aXNpdG9yIiwiU2VyaWFsaXplZE1tbFZpc2l0b3IiLCJ0b01NbCIsIm5vZGUiLCJ2aXNpdFRyZWUiLCJsb2ciLCJORVdMSU5FX0JMT0NLX1JFR0VYIiwiTkVXTElORV9MQVRFWCIsImdldEdsb2JhbCIsImtleSIsImRlZmF1bHRPcHRzIiwib3B0cyIsImZpeE1hdGhFbGVtZW50IiwiZWxlbWVudCIsImRhdGFzZXQiLCJtYXRoSGFuZGxlZCIsInByb3BlcnR5IiwidGV4dENvbnRlbnQiLCJ1bndyYXBwZWQiLCJyZXBsYWNlIiwiZml4TWF0aEVsZW1lbnRzIiwiZWwiLCJkb2N1bWVudCIsIm1hdGhFbGVtZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiaXRlbSIsImFkanVzdE1hdGhNTFN0eWxlIiwibm9kZXMiLCJzZXRBdHRyaWJ1dGUiLCJteUZpbmRNYXRoTUwiLCJzZXQiLCJhZGFwdG9yIiwiQXJyYXkiLCJmcm9tIiwibW1sIiwia2luZCIsInBhcmVudCIsIkZpbmRNYXRoTUwiLCJjcmVhdGVNYXRoTUxJbnN0YW5jZSIsImRvY1Byb3ZpZGVkIiwidXNlU2luZ2xlRG9sbGFyIiwiY29uc29sZSIsIndhcm4iLCJwYWNrYWdlcyIsIkFsbFBhY2thZ2VzIiwiZmlsdGVyIiwibmFtZSIsInB1c2giLCJtYWNyb3MiLCJwYXJhbGxlbG9ncmFtIiwib3ZlcmFyYyIsIm5hcHByb3giLCJsb25nZGl2IiwidGV4Q29uZmlnIiwiaW5saW5lTWF0aCIsInByb2Nlc3NFc2NhcGVzIiwibW1sQ29uZmlnIiwicGFyc2VFcnJvciIsImVycm9yIiwiY2FjaGVkTWF0aGpheCIsImdsb2JhbE1hdGhqYXgiLCJ2ZXJzaW9uIiwibWF0aGpheCIsIk1hdGhKYXgiLCJfIiwiY29uZmlnIiwiT2JqZWN0IiwiYXNzaWduIiwiZm9udFVSTCIsImh0bWxDb25maWciLCJ3cmFwcGVyRmFjdG9yeSIsIkNIVE1MV3JhcHBlckZhY3RvcnkiLCJkZWZhdWx0Tm9kZXMiLCJjaHRtbE5vZGVzIiwiTWF0aE1MIiwiY3VzdG9tTW1sRmFjdG9yeSIsIk1tbEZhY3RvcnkiLCJtbWxOb2RlcyIsImNsYXNzRmFjdG9yeSIsImhhbmRsZXJzIiwiaGFuZGxlc0RvY3VtZW50IiwiaHRtbCIsImNyZWF0ZSIsImNvbXBpbGVFcnJvciIsIm1qIiwibWF0aCIsImVyciIsInR5cGVzZXRFcnJvciIsImRvYyIsInNyZSIsInNwZWVjaCIsImVucmljaFNwZWVjaCIsIklucHV0SmF4IiwiVGVYIiwiT3V0cHV0SmF4IiwiQ0hUTUwiLCJEb21TdHJpbmdzIiwiSFRNTERvbVN0cmluZ3MiLCJza2lwSHRtbFRhZ3MiLCJzZXRNbWxGYWN0b3J5IiwiZW5yaWNoU3BlZWNoSW5pdGlhbGl6ZWQiLCJib290c3RyYXAiLCJUeXBlc2V0IiwiZWxlbWVudHMiLCJhdHRlbXB0UmVuZGVyIiwidGVtcG9yYXJ5IiwidXBkYXRlZERvY3VtZW50IiwiZmluZE1hdGgiLCJsZW5ndGgiLCJjb21waWxlIiwiZW5yaWNoIiwiZ2V0TWV0cmljcyIsInR5cGVzZXQiLCJhc3Npc3RpdmVNbWwiLCJhdHRhY2hTcGVlY2giLCJhZGRNZW51IiwidXBkYXRlRG9jdW1lbnQiLCJsaXN0IiwibmV4dCIsImRhdGEiLCJtYXRoTWwiLCJyb290IiwicGFyc2VkTWF0aE1sIiwicmVwbGFjZUFsbCIsInR5cGVzZXRSb290IiwiZSIsInRvU3RyaW5nIiwiY2xlYXIiLCJoYW5kbGVSZXRyaWVzRm9yIiwicmVuZGVyTWF0aCIsInJlbmRlck9wdHMiLCJjdXN0b21LZXkiLCJpc1N0cmluZyIsImV4ZWN1dGVPbiIsImJvZHkiLCJkaXYiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidW5kZWZpbmVkIiwiaW5zdGFuY2UiLCJFbGVtZW50IiwiYXJyIiwiQ0hUTUxtc3BhY2UiLCJzdHlsZXMiLCJkaXNwbGF5IiwiaGVpZ2h0Il0sIm1hcHBpbmdz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LFNBQVMsR0FBR29JLFFBQWpCLEVBQTJCO0FBQ3pCcEksSUFBQUEsU0FBUyxHQUFHb0ksUUFBWixHQUF1QnRDLFNBQVMsQ0FBQzZCLFVBQUQsQ0FBaEM7QUFDRDs7QUFFRCxNQUFJLENBQUM5RyxFQUFMLEVBQVM7QUFDUGhCLElBQUFBLEdBQUcsQ0FBQyxpQkFBRCxDQUFIO0FBQ0E7QUFDRDs7QUFFRCxNQUFJZ0IsRUFBRSxZQUFZd0gsT0FBZCwyQkFBeUJySSxTQUFTLEdBQUdvSSxRQUFyQyxnREFBeUIsb0JBQXNCckMsT0FBbkQsRUFBNEQ7QUFDMUQvRixJQUFBQSxTQUFTLEdBQUdvSSxRQUFaLENBQXFCckMsT0FBckIsQ0FBNkJsRixFQUE3QjtBQUNELEdBRkQsTUFFTyxJQUFJQSxFQUFFLENBQUN3RixNQUFILDRCQUFhckcsU0FBUyxHQUFHb0ksUUFBekIsaURBQWEscUJBQXNCckMsT0FBdkMsRUFBZ0Q7QUFBQTs7QUFDckQsUUFBTXVDLEdBQUcsR0FBRzdHLEtBQUssQ0FBQ0MsSUFBTixDQUFXYixFQUFYLENBQVo7O0FBQ0EsNEJBQUFiLFNBQVMsR0FBR29JLFFBQVosRUFBcUJyQyxPQUFyQixpRUFBZ0N1QyxHQUFoQztBQUNEO0FBQ0YsQ0E3REQ7QUErREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQUMsb0JBQVlDLE1BQVosR0FBcUI7QUFDbkIsZ0JBQWM7QUFDWkMsSUFBQUEsT0FBTyxFQUFFLE9BREc7QUFFWixrQkFBYyxRQUZGO0FBR1pDLElBQUFBLE1BQU0sRUFBRTtBQUhJO0FBREssQ0FBckI7ZUFRZWhCLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYXRoamF4IH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL21hdGhqYXgnO1xuaW1wb3J0IHsgTWF0aEpheCBhcyBnbG9iYWxNYXRoamF4IH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2NvbXBvbmVudHMvZ2xvYmFsJztcbmltcG9ydCB7IEFzc2lzdGl2ZU1tbEhhbmRsZXIgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvYTExeS9hc3Npc3RpdmUtbW1sJztcbmltcG9ydCB7IEVucmljaEhhbmRsZXIgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvYTExeS9zZW1hbnRpYy1lbnJpY2gnO1xuaW1wb3J0IHsgTWVudUhhbmRsZXIgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvdWkvbWVudS9NZW51SGFuZGxlcic7XG5pbXBvcnQgeyBGaW5kTWF0aE1MIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2lucHV0L21hdGhtbC9GaW5kTWF0aE1MJztcbmltcG9ydCB7IE1hdGhNTCB9IGZyb20gJ21hdGhqYXgtZnVsbC9qcy9pbnB1dC9tYXRobWwnO1xuaW1wb3J0IHsgVGVYIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2lucHV0L3RleCc7XG5cbmltcG9ydCB7IENIVE1MIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL291dHB1dC9jaHRtbCc7XG5pbXBvcnQgeyBSZWdpc3RlckhUTUxIYW5kbGVyIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2hhbmRsZXJzL2h0bWwnO1xuaW1wb3J0IHsgYnJvd3NlckFkYXB0b3IgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvYWRhcHRvcnMvYnJvd3NlckFkYXB0b3InO1xuaW1wb3J0IHsgQWxsUGFja2FnZXMgfSBmcm9tICdtYXRoamF4LWZ1bGwvanMvaW5wdXQvdGV4L0FsbFBhY2thZ2VzJztcbmltcG9ydCB7IGVuZ2luZVJlYWR5IH0gZnJvbSAnc3BlZWNoLXJ1bGUtZW5naW5lL2pzL2NvbW1vbi9zeXN0ZW0nO1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgUmVnaXN0ZXJIVE1MSGFuZGxlcihicm93c2VyQWRhcHRvcigpKTtcbn1cblxubGV0IHNyZVJlYWR5ID0gZmFsc2U7XG5cbmVuZ2luZVJlYWR5KCkudGhlbigoKSA9PiB7XG4gIHNyZVJlYWR5ID0gdHJ1ZTtcbn0pO1xuXG4vLyBpbXBvcnQgcGtnIGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBtbWxOb2RlcywgY2h0bWxOb2RlcyB9IGZyb20gJy4vbXN0YWNrJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyB3cmFwTWF0aCwgdW5XcmFwTWF0aCB9IGZyb20gJy4vbm9ybWFsaXphdGlvbic7XG5pbXBvcnQgeyBNbWxGYWN0b3J5IH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2NvcmUvTW1sVHJlZS9NbWxGYWN0b3J5JztcbmltcG9ydCB7IFNlcmlhbGl6ZWRNbWxWaXNpdG9yIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2NvcmUvTW1sVHJlZS9TZXJpYWxpemVkTW1sVmlzaXRvcic7XG5pbXBvcnQgeyBDSFRNTFdyYXBwZXJGYWN0b3J5IH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL291dHB1dC9jaHRtbC9XcmFwcGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBDSFRNTG1zcGFjZSB9IGZyb20gJ21hdGhqYXgtZnVsbC9qcy9vdXRwdXQvY2h0bWwvV3JhcHBlcnMvbXNwYWNlJztcbmltcG9ydCB7IEhUTUxEb21TdHJpbmdzIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2hhbmRsZXJzL2h0bWwvSFRNTERvbVN0cmluZ3MnO1xuXG5jb25zdCB2aXNpdG9yID0gbmV3IFNlcmlhbGl6ZWRNbWxWaXNpdG9yKCk7XG5jb25zdCB0b01NbCA9IChub2RlKSA9PiB2aXNpdG9yLnZpc2l0VHJlZShub2RlKTtcblxuY29uc3QgbG9nID0gZGVidWcoJ3BpZS1saWI6bWF0aC1yZW5kZXJpbmcnKTtcblxuY29uc3QgTkVXTElORV9CTE9DS19SRUdFWCA9IC9cXFxcZW1iZWRcXHtuZXdMaW5lXFx9XFxbXFxdL2c7XG5jb25zdCBORVdMSU5FX0xBVEVYID0gJ1xcXFxuZXdsaW5lICc7XG5cbmNvbnN0IGdldEdsb2JhbCA9ICgpID0+IHtcbiAgLy8gVE9ETyBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gdXNlIHZlcnNpb24/XG4gIC8vIGNvbnN0IGtleSA9IGAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9uLnNwbGl0KCcuJylbMF19YDtcbiAgLy8gSXQgbG9va3MgbGlrZSBFZCBtYWRlIHRoaXMgY2hhbmdlIHdoZW4gaGUgc3dpdGNoZWQgZnJvbSBtYXRoamF4MyB0byBtYXRoamF4LWZ1bGxcbiAgLy8gSSB0aGluayBpdCB3YXMgc3VwcG9zZWQgdG8gbWFrZSBzdXJlIHZlcnNpb24gMSAodXNpbmcgbWF0aGpheDMpIGlzIG5vdCB1c2VkXG4gIC8vIGluIGNvbWJpbmF0aW9uIHdpdGggdmVyc2lvbiAyICh1c2luZyBtYXRoamF4LWZ1bGwpXG5cbiAgLy8gVE9ETyBoaWdoZXIgbGV2ZWwgd3JhcHBlcnMgdXNlIHRoaXMgaW5zdGFuY2Ugb2YgbWF0aC1yZW5kZXJpbmcsIGFuZCBpZiAyIGRpZmZlcmVudCBpbnN0YW5jZXMgYXJlIHVzZWQsIG1hdGggcmVuZGVyaW5nIGlzIG5vdCB3b3JraW5nXG4gIC8vICBzbyBJIHdpbGwgaGFyZGNvZGUgdGhpcyBmb3Igbm93IHVudGlsIGEgYmV0dGVyIHNvbHV0aW9uIGlzIGZvdW5kXG4gIGNvbnN0IGtleSA9ICdAcGllLWxpYi9tYXRoLXJlbmRlcmluZ0AyJztcblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoIXdpbmRvd1trZXldKSB7XG4gICAgICB3aW5kb3dba2V5XSA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gd2luZG93W2tleV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59O1xuXG4vKiogQWRkIHRlbXBvcmFyeSBzdXBwb3J0IGZvciBhIGdsb2JhbCBzaW5nbGVEb2xsYXIgb3ZlcnJpZGVcbiAqICA8Y29kZT5cbiAqICAgLy8gVGhpcyB3aWxsIGVuYWJsZSBzaW5nbGUgZG9sbGFyIHJlbmRlcmluZ1xuICogICB3aW5kb3cucGllID0gd2luZG93LnBpZSB8fCB7fTtcbiAqICAgd2luZG93LnBpZS5tYXRoUmVuZGVyaW5nID0gIHt1c2VTaW5nbGVEb2xsYXI6IHRydWUgfTtcbiAqICA8L2NvZGU+XG4gKi9cbmNvbnN0IGRlZmF1bHRPcHRzID0gKCkgPT4gZ2V0R2xvYmFsKCkub3B0cyB8fCB7fTtcblxuZXhwb3J0IGNvbnN0IGZpeE1hdGhFbGVtZW50ID0gKGVsZW1lbnQpID0+IHtcbiAgaWYgKGVsZW1lbnQuZGF0YXNldC5tYXRoSGFuZGxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwcm9wZXJ0eSA9ICdpbm5lclRleHQnO1xuXG4gIGlmIChlbGVtZW50LnRleHRDb250ZW50KSB7XG4gICAgcHJvcGVydHkgPSAndGV4dENvbnRlbnQnO1xuICB9XG5cbiAgaWYgKGVsZW1lbnRbcHJvcGVydHldKSB7XG4gICAgZWxlbWVudFtwcm9wZXJ0eV0gPSB3cmFwTWF0aCh1bldyYXBNYXRoKGVsZW1lbnRbcHJvcGVydHldKS51bndyYXBwZWQpO1xuICAgIC8vIGJlY2F1c2UgbWF0aHF1aWxsIGRvZXNuJ3QgdW5kZXJzdGFuZCBsaW5lIGJyZWFrcywgc29tZXRpbWVzIHdlIGVuZCB1cCB3aXRoIGN1c3RvbSBlbGVtZW50cyBvbiBwcm9tcHRzL3JhdGlvbmFsZS9ldGMuXG4gICAgLy8gd2UgbmVlZCB0byByZXBsYWNlIHRoZSBjdXN0b20gZW1iZWRkZWQgZWxlbWVudHMgd2l0aCB2YWxpZCBsYXRleCB0aGF0IE1hdGhqYXggY2FuIHVuZGVyc3RhbmRcbiAgICBlbGVtZW50W3Byb3BlcnR5XSA9IGVsZW1lbnRbcHJvcGVydHldLnJlcGxhY2UoTkVXTElORV9CTE9DS19SRUdFWCwgTkVXTElORV9MQVRFWCk7XG4gICAgZWxlbWVudC5kYXRhc2V0Lm1hdGhIYW5kbGVkID0gdHJ1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGZpeE1hdGhFbGVtZW50cyA9IChlbCA9IGRvY3VtZW50KSA9PiB7XG4gIGNvbnN0IG1hdGhFbGVtZW50cyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWxhdGV4XScpO1xuXG4gIG1hdGhFbGVtZW50cy5mb3JFYWNoKChpdGVtKSA9PiBmaXhNYXRoRWxlbWVudChpdGVtKSk7XG59O1xuXG5jb25zdCBhZGp1c3RNYXRoTUxTdHlsZSA9IChlbCA9IGRvY3VtZW50KSA9PiB7XG4gIGNvbnN0IG5vZGVzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnbWF0aCcpO1xuICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiBub2RlLnNldEF0dHJpYnV0ZSgnZGlzcGxheXN0eWxlJywgJ3RydWUnKSk7XG59O1xuXG5jbGFzcyBteUZpbmRNYXRoTUwgZXh0ZW5kcyBGaW5kTWF0aE1MIHtcbiAgcHJvY2Vzc01hdGgoc2V0KSB7XG4gICAgY29uc3QgYWRhcHRvciA9IHRoaXMuYWRhcHRvcjtcbiAgICBmb3IgKGNvbnN0IG1tbCBvZiBBcnJheS5mcm9tKHNldCkpIHtcbiAgICAgIGlmIChhZGFwdG9yLmtpbmQoYWRhcHRvci5wYXJlbnQobW1sKSkgPT09ICdtangtYXNzaXN0aXZlLW1tbCcpIHtcbiAgICAgICAgc2V0LmRlbGV0ZShtbWwpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIucHJvY2Vzc01hdGgoc2V0KTtcbiAgfVxufVxuXG5jb25zdCBjcmVhdGVNYXRoTUxJbnN0YW5jZSA9IChvcHRzLCBkb2NQcm92aWRlZCA9IGRvY3VtZW50KSA9PiB7XG4gIG9wdHMgPSBvcHRzIHx8IGRlZmF1bHRPcHRzKCk7XG5cbiAgaWYgKG9wdHMudXNlU2luZ2xlRG9sbGFyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgY29uc29sZS53YXJuKCdbbWF0aC1yZW5kZXJpbmddIHVzaW5nICQgaXMgbm90IGFkdmlzYWJsZSwgcGxlYXNlIHVzZSAkJC4uJCQgb3IgXFxcXCguLi5cXFxcKScpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZXMgPSBBbGxQYWNrYWdlcy5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09ICdidXNzcHJvb2ZzJyk7IC8vIEJ1c3Nwcm9vZnMgbmVlZHMgYW4gb3V0cHV0IGpheFxuXG4gIC8vIFRoZSBhdXRvbG9hZCBleHRlbnNpb24gcHJlZGVmaW5lcyBhbGwgdGhlIG1hY3JvcyBmcm9tIHRoZSBleHRlbnNpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIGxvYWRlZCBhbHJlYWR5XG4gIC8vIHNvIHRoYXQgdGhleSBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIG5lZWRlZCBleHRlbnNpb24gd2hlbiB0aGV5IGFyZSBmaXJzdCB1c2VkXG4gIHBhY2thZ2VzLnB1c2goJ2F1dG9sb2FkJyk7XG5cbiAgY29uc3QgbWFjcm9zID0ge1xuICAgIHBhcmFsbGVsb2dyYW06ICdcXFxcbG93ZXIuMmVte1xcXFxIdWdlXFxcXHVuaWNvZGV7eDI1QjF9fScsXG4gICAgb3ZlcmFyYzogJ1xcXFxvdmVycGFyZW4nLFxuICAgIG5hcHByb3g6ICdcXFxcbm90XFxcXGFwcHJveCcsXG4gICAgbG9uZ2RpdjogJ1xcXFxlbmNsb3Nle2xvbmdkaXZ9JyxcbiAgfTtcblxuICBjb25zdCB0ZXhDb25maWcgPSBvcHRzLnVzZVNpbmdsZURvbGxhclxuICAgID8ge1xuICAgICAgICBwYWNrYWdlcyxcbiAgICAgICAgbWFjcm9zLFxuICAgICAgICBpbmxpbmVNYXRoOiBbXG4gICAgICAgICAgWyckJywgJyQnXSxcbiAgICAgICAgICBbJ1xcXFwoJywgJ1xcXFwpJ10sXG4gICAgICAgIF0sXG4gICAgICAgIHByb2Nlc3NFc2NhcGVzOiB0cnVlLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICBwYWNrYWdlcyxcbiAgICAgICAgbWFjcm9zLFxuICAgICAgfTtcblxuICBjb25zdCBtbWxDb25maWcgPSB7XG4gICAgcGFyc2VFcnJvcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgLy8gZnVuY3Rpb24gdG8gcHJvY2VzcyBwYXJzaW5nIGVycm9yc1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKCdlcnJvcjonLCBub2RlKTtcbiAgICAgIHRoaXMuZXJyb3IodGhpcy5hZGFwdG9yLnRleHRDb250ZW50KG5vZGUpLnJlcGxhY2UoL1xcbi4qL2csICcnKSk7XG4gICAgfSxcbiAgICBGaW5kTWF0aE1MOiBuZXcgbXlGaW5kTWF0aE1MKCksXG4gIH07XG5cbiAgbGV0IGNhY2hlZE1hdGhqYXg7XG5cbiAgaWYgKGdsb2JhbE1hdGhqYXggJiYgZ2xvYmFsTWF0aGpheC52ZXJzaW9uICE9PSBtYXRoamF4LnZlcnNpb24pIHtcbiAgICAvLyBoYW5kbGluZyBvdGhlciBNYXRoSmF4IHZlcnNpb24gb24gdGhlIHBhZ2VcbiAgICAvLyByZXBsYWNpbmcgaXQgdGVtcG9yYXJpbHkgd2l0aCB0aGUgdmVyc2lvbiB3ZSBoYXZlXG4gICAgd2luZG93Lk1hdGhKYXguXyA9IHdpbmRvdy5NYXRoSmF4Ll8gfHwge307XG4gICAgd2luZG93Lk1hdGhKYXguY29uZmlnID0gd2luZG93Lk1hdGhKYXguY29uZmlnIHx8IHt9O1xuICAgIGNhY2hlZE1hdGhqYXggPSB3aW5kb3cuTWF0aEpheDtcbiAgICBPYmplY3QuYXNzaWduKGdsb2JhbE1hdGhqYXgsIG1hdGhqYXgpO1xuICB9XG5cbiAgY29uc3QgZm9udFVSTCA9IGBodHRwczovL3VucGtnLmNvbS9tYXRoamF4LWZ1bGxAJHttYXRoamF4LnZlcnNpb259L3RzL291dHB1dC9jaHRtbC9mb250cy90ZXgtd29mZi12MmA7XG4gIGNvbnN0IGh0bWxDb25maWcgPSB7XG4gICAgZm9udFVSTCxcblxuICAgIHdyYXBwZXJGYWN0b3J5OiBuZXcgQ0hUTUxXcmFwcGVyRmFjdG9yeSh7XG4gICAgICAuLi5DSFRNTFdyYXBwZXJGYWN0b3J5LmRlZmF1bHROb2RlcyxcbiAgICAgIC4uLmNodG1sTm9kZXMsXG4gICAgfSksXG4gIH07XG5cbiAgY29uc3QgbW1sID0gbmV3IE1hdGhNTChtbWxDb25maWcpO1xuXG4gIGNvbnN0IGN1c3RvbU1tbEZhY3RvcnkgPSBuZXcgTW1sRmFjdG9yeSh7XG4gICAgLi4uTW1sRmFjdG9yeS5kZWZhdWx0Tm9kZXMsXG4gICAgLi4ubW1sTm9kZXMsXG4gIH0pO1xuICBjb25zdCBjbGFzc0ZhY3RvcnkgPSBFbnJpY2hIYW5kbGVyKFxuICAgIE1lbnVIYW5kbGVyKEFzc2lzdGl2ZU1tbEhhbmRsZXIobWF0aGpheC5oYW5kbGVycy5oYW5kbGVzRG9jdW1lbnQoZG9jUHJvdmlkZWQpKSksXG4gICAgbW1sLFxuICApO1xuXG4gIGNvbnN0IGh0bWwgPSBjbGFzc0ZhY3RvcnkuY3JlYXRlKGRvY1Byb3ZpZGVkLCB7XG4gICAgY29tcGlsZUVycm9yOiAobWosIG1hdGgsIGVycikgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKCdiYWQgbWF0aD86JywgbWF0aCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0sXG4gICAgdHlwZXNldEVycm9yOiBmdW5jdGlvbihkb2MsIG1hdGgsIGVycikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKCd0eXBlc2V0IGVycm9yJyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgZG9jLnR5cGVzZXRFcnJvcihtYXRoLCBlcnIpO1xuICAgIH0sXG5cbiAgICBzcmU6IHtcbiAgICAgIHNwZWVjaDogJ2RlZXAnLFxuICAgIH0sXG4gICAgZW5yaWNoU3BlZWNoOiAnZGVlcCcsXG5cbiAgICBJbnB1dEpheDogW25ldyBUZVgodGV4Q29uZmlnKSwgbW1sXSxcbiAgICBPdXRwdXRKYXg6IG5ldyBDSFRNTChodG1sQ29uZmlnKSxcbiAgICBEb21TdHJpbmdzOiBuZXcgSFRNTERvbVN0cmluZ3Moe1xuICAgICAgc2tpcEh0bWxUYWdzOiBbXG4gICAgICAgICdzY3JpcHQnLFxuICAgICAgICAnbm9zY3JpcHQnLFxuICAgICAgICAnc3R5bGUnLFxuICAgICAgICAndGV4dGFyZWEnLFxuICAgICAgICAncHJlJyxcbiAgICAgICAgJ2NvZGUnLFxuICAgICAgICAnYW5ub3RhdGlvbicsXG4gICAgICAgICdhbm5vdGF0aW9uLXhtbCcsXG4gICAgICAgICdtangtYXNzaXN0aXZlLW1tbCcsXG4gICAgICAgICdtangtY29udGFpbmVyJyxcbiAgICAgIF0sXG4gICAgfSksXG4gIH0pO1xuXG4gIC8vIE5vdGU6IHdlIG11c3Qgc2V0IHRoaXMgKmFmdGVyKiBtYXRoamF4LmRvY3VtZW50IChubyBpZGVhIHdoeSlcbiAgbW1sLnNldE1tbEZhY3RvcnkoY3VzdG9tTW1sRmFjdG9yeSk7XG5cbiAgaWYgKGNhY2hlZE1hdGhqYXgpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgY2FjaGVkIHZlcnNpb24sIHdlIHJlcGxhY2UgaXQgaGVyZVxuICAgIHdpbmRvdy5NYXRoSmF4ID0gY2FjaGVkTWF0aGpheDtcbiAgfVxuXG4gIHJldHVybiBodG1sO1xufTtcblxubGV0IGVucmljaFNwZWVjaEluaXRpYWxpemVkID0gZmFsc2U7XG5cbmNvbnN0IGJvb3RzdHJhcCA9IChvcHRzKSA9PiB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB7IFR5cGVzZXQ6ICgpID0+ICh7fSkgfTtcbiAgfVxuXG4gIGNvbnN0IGh0bWwgPSBjcmVhdGVNYXRoTUxJbnN0YW5jZShvcHRzKTtcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246IG1hdGhqYXgudmVyc2lvbixcbiAgICBodG1sOiBodG1sLFxuICAgIFR5cGVzZXQ6IGZ1bmN0aW9uKC4uLmVsZW1lbnRzKSB7XG4gICAgICBjb25zdCBhdHRlbXB0UmVuZGVyID0gKHRlbXBvcmFyeSA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGxldCB1cGRhdGVkRG9jdW1lbnQgPSB0aGlzLmh0bWwuZmluZE1hdGgoZWxlbWVudHMubGVuZ3RoID8geyBlbGVtZW50cyB9IDoge30pLmNvbXBpbGUoKTtcblxuICAgICAgICBpZiAoIXRlbXBvcmFyeSAmJiBzcmVSZWFkeSkge1xuICAgICAgICAgIHVwZGF0ZWREb2N1bWVudCA9IHVwZGF0ZWREb2N1bWVudC5lbnJpY2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZWREb2N1bWVudCA9IHVwZGF0ZWREb2N1bWVudFxuICAgICAgICAgIC5nZXRNZXRyaWNzKClcbiAgICAgICAgICAudHlwZXNldCgpXG4gICAgICAgICAgLmFzc2lzdGl2ZU1tbCgpXG4gICAgICAgICAgLmF0dGFjaFNwZWVjaCgpXG4gICAgICAgICAgLmFkZE1lbnUoKVxuICAgICAgICAgIC51cGRhdGVEb2N1bWVudCgpO1xuXG4gICAgICAgIGlmICghZW5yaWNoU3BlZWNoSW5pdGlhbGl6ZWQgJiYgdHlwZW9mIHVwZGF0ZWREb2N1bWVudC5tYXRoLmxpc3Q/Lm5leHQ/LmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZW5yaWNoU3BlZWNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsaXN0ID0gdXBkYXRlZERvY3VtZW50Lm1hdGgubGlzdDtcblxuICAgICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtID0gbGlzdC5uZXh0OyB0eXBlb2YgaXRlbS5kYXRhICE9PSAnc3ltYm9sJzsgaXRlbSA9IGl0ZW0ubmV4dCkge1xuICAgICAgICAgICAgICBjb25zdCBtYXRoTWwgPSB0b01NbChpdGVtLmRhdGEucm9vdCk7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnNlZE1hdGhNbCA9IG1hdGhNbC5yZXBsYWNlQWxsKCdcXG4nLCAnJyk7XG5cbiAgICAgICAgICAgICAgaXRlbS5kYXRhLnR5cGVzZXRSb290LnNldEF0dHJpYnV0ZSgnZGF0YS1tYXRobWwnLCBwYXJzZWRNYXRoTWwpO1xuICAgICAgICAgICAgICBpdGVtLmRhdGEudHlwZXNldFJvb3Quc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlZERvY3VtZW50LmNsZWFyKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWVucmljaFNwZWVjaEluaXRpYWxpemVkKSB7XG4gICAgICAgIGF0dGVtcHRSZW5kZXIodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIG1hdGhqYXguaGFuZGxlUmV0cmllc0ZvcigoKSA9PiB7XG4gICAgICAgIGF0dGVtcHRSZW5kZXIoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59O1xuXG5jb25zdCByZW5kZXJNYXRoID0gKGVsLCByZW5kZXJPcHRzKSA9PiB7XG4gIGlmIChcbiAgICB3aW5kb3cgJiZcbiAgICB3aW5kb3cuTWF0aEpheCAmJlxuICAgIHdpbmRvdy5NYXRoSmF4LmN1c3RvbUtleSAmJlxuICAgIHdpbmRvdy5NYXRoSmF4LmN1c3RvbUtleSA9PSAnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmctYWNjZXNzaWJsZUAxJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBlbCA9PT0gJ3N0cmluZyc7XG4gIGxldCBleGVjdXRlT24gPSBkb2N1bWVudC5ib2R5O1xuXG4gIGlmIChpc1N0cmluZykge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgZGl2LmlubmVySFRNTCA9IGVsO1xuICAgIGV4ZWN1dGVPbiA9IGRpdjtcbiAgfVxuXG4gIGZpeE1hdGhFbGVtZW50cyhleGVjdXRlT24pO1xuICBhZGp1c3RNYXRoTUxTdHlsZShleGVjdXRlT24pO1xuXG4gIGlmIChpc1N0cmluZykge1xuICAgIGNvbnN0IGh0bWwgPSBjcmVhdGVNYXRoTUxJbnN0YW5jZSh1bmRlZmluZWQsIGV4ZWN1dGVPbik7XG5cbiAgICBjb25zdCB1cGRhdGVkRG9jdW1lbnQgPSBodG1sXG4gICAgICAuZmluZE1hdGgoKVxuICAgICAgLmNvbXBpbGUoKVxuICAgICAgLmdldE1ldHJpY3MoKVxuICAgICAgLnR5cGVzZXQoKVxuICAgICAgLnVwZGF0ZURvY3VtZW50KCk7XG5cbiAgICBjb25zdCBsaXN0ID0gdXBkYXRlZERvY3VtZW50Lm1hdGgubGlzdDtcbiAgICBjb25zdCBpdGVtID0gbGlzdC5uZXh0O1xuXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0aE1sID0gdG9NTWwoaXRlbS5kYXRhLnJvb3QpO1xuICAgIGNvbnN0IHBhcnNlZE1hdGhNbCA9IG1hdGhNbC5yZXBsYWNlQWxsKCdcXG4nLCAnJyk7XG5cbiAgICByZXR1cm4gcGFyc2VkTWF0aE1sO1xuICB9XG5cbiAgaWYgKCFnZXRHbG9iYWwoKS5pbnN0YW5jZSkge1xuICAgIGdldEdsb2JhbCgpLmluc3RhbmNlID0gYm9vdHN0cmFwKHJlbmRlck9wdHMpO1xuICB9XG5cbiAgaWYgKCFlbCkge1xuICAgIGxvZygnZWwgaXMgdW5kZWZpbmVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGVsIGluc3RhbmNlb2YgRWxlbWVudCAmJiBnZXRHbG9iYWwoKS5pbnN0YW5jZT8uVHlwZXNldCkge1xuICAgIGdldEdsb2JhbCgpLmluc3RhbmNlLlR5cGVzZXQoZWwpO1xuICB9IGVsc2UgaWYgKGVsLmxlbmd0aCAmJiBnZXRHbG9iYWwoKS5pbnN0YW5jZT8uVHlwZXNldCkge1xuICAgIGNvbnN0IGFyciA9IEFycmF5LmZyb20oZWwpO1xuICAgIGdldEdsb2JhbCgpLmluc3RhbmNlLlR5cGVzZXQoLi4uYXJyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIHN0eWxlIGlzIGFkZGVkIHRvIG92ZXJyaWVkIGRlZmF1bHQgc3R5bGluZyBvZiBtangtbXNwYWNlIE1hdGhqYXggdGFnXG4gKiBJbiBtYXRoamF4IHNyYyBjb2RlIFxcbmV3bGluZSBsYXRleCBnZXRzIHBhcnNlZCB0byA8bWp4LW1zcGFjZT48L21qeC1tc3BhY2U+LFxuICogYnV0IGhhcyB0aGUgZGVmYXVsdCBzdHlsZVxuICogJ21qeC1tc3BhY2UnOiB7XG4gIFwiZGlzcGxheVwiOiAnaW4tbGluZScsXG4gIFwidGV4dC1hbGlnblwiOiAnbGVmdCdcbn0gd2hpY2ggcHJldmVudHMgaXQgZnJvbSBzaG93aW5nIGFzIGEgbmV3bGluZSB2YWx1ZVxuICovXG5DSFRNTG1zcGFjZS5zdHlsZXMgPSB7XG4gICdtangtbXNwYWNlJzoge1xuICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyxcbiAgICBoZWlnaHQ6ICc1cHgnLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVuZGVyTWF0aDtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-lib/math-rendering",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0-beta.0",
|
|
4
4
|
"description": "math rendering utilities",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
"author": "pie-framework developers",
|
|
11
11
|
"license": "ISC",
|
|
12
12
|
"dependencies": {
|
|
13
|
+
"@pie-framework/mathml-to-latex": "1.4.4",
|
|
13
14
|
"debug": "^4.1.1",
|
|
14
15
|
"lodash": "^4.17.11",
|
|
15
|
-
"mathjax-full": "3.2.2"
|
|
16
|
-
"mathml-to-latex": "1.2.0"
|
|
16
|
+
"mathjax-full": "3.2.2"
|
|
17
17
|
},
|
|
18
|
-
"gitHead": "
|
|
18
|
+
"gitHead": "3818c24530f62b5bb9be7a2c6aa5428f13a17e0a",
|
|
19
19
|
"scripts": {}
|
|
20
20
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import mmlToLatex from '../mml-to-latex';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
describe('mmlToLatex', () => {
|
|
6
|
+
it('should work', () => {
|
|
7
|
+
const mml =
|
|
8
|
+
'<math xmlns="http://www.w3.org/1998/Math/MathML"> <mn>2</mn> <mi>x</mi> <mtext> </mtext> <mo>≤</mo> <mn>4</mn> <mi>y</mi> <mtext> </mtext> <mo>+</mo> <mtext> </mtext> <mn>8</mn> <msqrt> <mi>h</mi> </msqrt></math>';
|
|
9
|
+
// todo revisit this
|
|
10
|
+
// const latex = '2x\\text{ }\\leq4y\\text{ }+\\text{ }8\\sqrt{h}';
|
|
11
|
+
const latex = '2 x \\textrm{ } \\leq 4 y \\textrm{ } + \\textrm{ } 8 \\sqrt{h}';
|
|
12
|
+
|
|
13
|
+
expect(mmlToLatex(mml)).toEqual(latex);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import debug from 'debug';
|
|
3
|
+
import { Data } from 'slate';
|
|
4
|
+
import { BracketTypes, wrapMath, unWrapMath } from '../normalization';
|
|
5
|
+
|
|
6
|
+
const log = debug('@pie-lib:math-rendering:test:normalization');
|
|
7
|
+
|
|
8
|
+
describe('normalization', () => {
|
|
9
|
+
describe('unWrapMath', () => {
|
|
10
|
+
const assertUnWrap = (html, expected, wrapType) => {
|
|
11
|
+
it(`innerHTML: ${html} is unWrapped to: ${expected} with wrapType: ${wrapType}`, () => {
|
|
12
|
+
const out = unWrapMath(html);
|
|
13
|
+
|
|
14
|
+
expect(out).toEqual({
|
|
15
|
+
unwrapped: expected,
|
|
16
|
+
wrapType: wrapType,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
assertUnWrap('$$<$$', '<', BracketTypes.DOLLAR);
|
|
22
|
+
assertUnWrap('$<$', '<', BracketTypes.DOLLAR);
|
|
23
|
+
assertUnWrap('\\(<\\)', '<', BracketTypes.ROUND_BRACKETS);
|
|
24
|
+
assertUnWrap('\\[<\\]', '<', BracketTypes.ROUND_BRACKETS);
|
|
25
|
+
assertUnWrap('latex', 'latex', BracketTypes.ROUND_BRACKETS);
|
|
26
|
+
assertUnWrap('\\displaystyle foo', 'foo', BracketTypes.ROUND_BRACKETS);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('wrapMath', () => {
|
|
30
|
+
const assertWrap = (latex, expectedHtml, wrapper) => {
|
|
31
|
+
wrapper = wrapper || BracketTypes.ROUND_BRACKETS;
|
|
32
|
+
it(`${latex} is wrapped to: ${expectedHtml}`, () => {
|
|
33
|
+
const out = wrapMath(latex, wrapper);
|
|
34
|
+
|
|
35
|
+
log('out: ', out);
|
|
36
|
+
|
|
37
|
+
expect(out).toEqual(expectedHtml);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
assertWrap('latex', '\\(latex\\)', BracketTypes.ROUND_BRACKETS);
|
|
42
|
+
assertWrap('latex', '\\(latex\\)', BracketTypes.SQUARE_BRACKETS);
|
|
43
|
+
assertWrap('latex', '$latex$', BracketTypes.DOLLAR);
|
|
44
|
+
assertWrap('latex', '$latex$', BracketTypes.DOUBLE_DOLLAR);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Note that when this is converted to html it get's escaped - but that's an issue with the slate html-serializer.
|
|
48
|
+
*/
|
|
49
|
+
assertWrap('<', '\\(<\\)');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { mount } from 'enzyme';
|
|
3
|
+
import renderMath, { fixMathElement } from '../render-math';
|
|
4
|
+
import _ from 'lodash';
|
|
5
|
+
|
|
6
|
+
jest.mock(
|
|
7
|
+
'mathjax-full/js/mathjax',
|
|
8
|
+
() => ({
|
|
9
|
+
mathjax: {
|
|
10
|
+
document: jest.fn().mockReturnThis(),
|
|
11
|
+
findMath: jest.fn().mockReturnThis(),
|
|
12
|
+
compile: jest.fn().mockReturnThis(),
|
|
13
|
+
getMetrics: jest.fn().mockReturnThis(),
|
|
14
|
+
typeset: jest.fn().mockReturnThis(),
|
|
15
|
+
updateDocument: jest.fn().mockReturnThis(),
|
|
16
|
+
clear: jest.fn().mockReturnThis(),
|
|
17
|
+
handlers: {
|
|
18
|
+
handlesDocument: jest.fn().mockReturnThis(),
|
|
19
|
+
},
|
|
20
|
+
handleRetriesFor: jest.fn().mockImplementation((callback) => callback()),
|
|
21
|
+
},
|
|
22
|
+
}),
|
|
23
|
+
{
|
|
24
|
+
virtual: false,
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
jest.mock('mathjax-full/js/input/mathml', () => {
|
|
29
|
+
const mock = jest.fn().mockReturnThis();
|
|
30
|
+
mock.setMmlFactory = jest.fn();
|
|
31
|
+
return {
|
|
32
|
+
MathML: () => mock,
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
jest.mock('mathjax-full/js/input/tex', () => ({
|
|
37
|
+
TeX: jest.fn(),
|
|
38
|
+
}));
|
|
39
|
+
jest.mock('mathjax-full/js/core/MmlTree/MmlFactory', () => {
|
|
40
|
+
const instance = {
|
|
41
|
+
setMmlFactory: jest.fn(),
|
|
42
|
+
defaultNodes: {},
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
MmlFactory: () => instance,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const mockMathInstance = {
|
|
50
|
+
document: jest.fn().mockReturnThis(),
|
|
51
|
+
findMath: jest.fn().mockReturnThis(),
|
|
52
|
+
compile: jest.fn().mockReturnThis(),
|
|
53
|
+
enrich: jest.fn().mockReturnThis(),
|
|
54
|
+
addMenu: jest.fn().mockReturnThis(),
|
|
55
|
+
attachSpeech: jest.fn().mockReturnThis(),
|
|
56
|
+
assistiveMml: jest.fn().mockReturnThis(),
|
|
57
|
+
getMetrics: jest.fn().mockReturnThis(),
|
|
58
|
+
typeset: jest.fn().mockReturnThis(),
|
|
59
|
+
updateDocument: jest.fn().mockReturnValue({
|
|
60
|
+
math: {
|
|
61
|
+
list: undefined,
|
|
62
|
+
},
|
|
63
|
+
clear: jest.fn().mockReturnThis(),
|
|
64
|
+
}),
|
|
65
|
+
clear: jest.fn().mockReturnThis(),
|
|
66
|
+
handlers: {
|
|
67
|
+
handlesDocument: jest.fn().mockReturnThis(),
|
|
68
|
+
},
|
|
69
|
+
handleRetriesFor: jest.fn().mockImplementation((callback) => callback()),
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const mockHtml = {
|
|
73
|
+
findMath: jest.fn().mockReturnValue(mockMathInstance),
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const mockEnrichHandlerInstance = {
|
|
77
|
+
create: jest.fn().mockImplementation(() => mockHtml),
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
jest.mock('mathjax-full/js/a11y/semantic-enrich', () => {
|
|
81
|
+
return {
|
|
82
|
+
EnrichHandler: () => mockEnrichHandlerInstance,
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
jest.mock('mathjax-full/js/a11y/assistive-mml', () => {
|
|
87
|
+
return {
|
|
88
|
+
AssistiveMmlHandler: () => {},
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
jest.mock('mathjax-full/js/ui/menu/MenuHandler', () => {
|
|
93
|
+
return {
|
|
94
|
+
MenuHandler: () => {},
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
jest.mock('mathjax-full/js/output/chtml', () => ({
|
|
99
|
+
CHTML: jest.fn(),
|
|
100
|
+
}));
|
|
101
|
+
|
|
102
|
+
jest.mock('mathjax-full/js/adaptors/browserAdaptor', () => ({
|
|
103
|
+
browserAdaptor: jest.fn(),
|
|
104
|
+
}));
|
|
105
|
+
|
|
106
|
+
jest.mock('mathjax-full/js/handlers/html', () => ({
|
|
107
|
+
RegisterHTMLHandler: jest.fn(),
|
|
108
|
+
}));
|
|
109
|
+
|
|
110
|
+
jest.mock('mathjax-full/js/core/MmlTree/SerializedMmlVisitor', () => ({
|
|
111
|
+
SerializedMmlVisitor: jest.fn(),
|
|
112
|
+
}));
|
|
113
|
+
|
|
114
|
+
describe('render-math', () => {
|
|
115
|
+
it('calls classFactory.create once', () => {
|
|
116
|
+
const div = document.createElement('div');
|
|
117
|
+
|
|
118
|
+
_.times(10).forEach((i) => renderMath(div));
|
|
119
|
+
|
|
120
|
+
expect(mockEnrichHandlerInstance.create).toHaveBeenCalledTimes(1);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('calls MathJax render', () => {
|
|
124
|
+
const div = document.createElement('div');
|
|
125
|
+
|
|
126
|
+
renderMath(div);
|
|
127
|
+
expect(mockEnrichHandlerInstance.create).toHaveBeenCalledTimes(1);
|
|
128
|
+
expect(mockHtml.findMath).toHaveBeenCalledWith({ elements: [div] });
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('call render math for an array of elements', () => {
|
|
132
|
+
const divOne = document.createElement('div');
|
|
133
|
+
const divTwo = document.createElement('div');
|
|
134
|
+
|
|
135
|
+
renderMath([divOne, divTwo]);
|
|
136
|
+
|
|
137
|
+
expect(mockEnrichHandlerInstance.create).toHaveBeenCalledTimes(1);
|
|
138
|
+
expect(mockHtml.findMath).toHaveBeenCalledWith({
|
|
139
|
+
elements: [divOne, divTwo],
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('wraps the math containing element the right way', () => {
|
|
144
|
+
const wrapper = mount(
|
|
145
|
+
<div>
|
|
146
|
+
<span data-latex="">{'420\\text{ cm}=4.2\\text{ meters}'}</span>
|
|
147
|
+
</div>,
|
|
148
|
+
);
|
|
149
|
+
const spanElem = wrapper.instance();
|
|
150
|
+
|
|
151
|
+
fixMathElement(spanElem);
|
|
152
|
+
|
|
153
|
+
expect(spanElem.textContent).toEqual('\\(420\\text{ cm}=4.2\\text{ meters}\\)');
|
|
154
|
+
});
|
|
155
|
+
});
|
package/src/mml-to-latex.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
export default (mathml) =>
|
|
1
|
+
import { MathMLToLaTeX } from '@pie-framework/mathml-to-latex';
|
|
2
|
+
export default (mathml) => MathMLToLaTeX.convert(mathml);
|