@pie-lib/math-rendering-accessible 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.json +1 -0
- package/CHANGELOG.md +16 -0
- package/LICENSE.md +5 -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 +84 -0
- package/lib/index.js +38 -0
- package/lib/mathjax-script.js +2 -0
- package/lib/mml-to-latex.js +15 -0
- package/lib/mstack/__tests__/chtml.test.js +151 -0
- package/lib/mstack/chtml.js +296 -0
- package/lib/mstack/index.js +23 -0
- package/lib/mstack/mml.js +109 -0
- package/lib/normalization.js +95 -0
- package/lib/render-math.js +475 -0
- package/package.json +20 -0
- package/src/__tests__/mml-to-latex.test.js +13 -0
- package/src/__tests__/normalization.test.js +51 -0
- package/src/__tests__/render-math.test.js +76 -0
- package/src/index.js +5 -0
- package/src/mathjax-script.js +0 -0
- package/src/mml-to-latex.js +2 -0
- package/src/mstack/__tests__/__snapshots__/chtml.test.js.snap +9 -0
- package/src/mstack/__tests__/chtml.test.js +104 -0
- package/src/mstack/chtml.js +220 -0
- package/src/mstack/index.js +13 -0
- package/src/mstack/mml.js +24 -0
- package/src/normalization.js +69 -0
- package/src/render-math.js +450 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.initializeMathJax = exports.getGlobal = exports.fixMathElements = exports.fixMathElement = exports["default"] = exports.MathJaxVersion = void 0;
|
|
9
|
+
|
|
10
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
11
|
+
|
|
12
|
+
var _normalization = require("./normalization");
|
|
13
|
+
|
|
14
|
+
var _SerializedMmlVisitor = require("mathjax-full/js/core/MmlTree/SerializedMmlVisitor");
|
|
15
|
+
|
|
16
|
+
var _TexError = _interopRequireDefault(require("mathjax-full/js/input/tex/TexError"));
|
|
17
|
+
|
|
18
|
+
var visitor = new _SerializedMmlVisitor.SerializedMmlVisitor();
|
|
19
|
+
|
|
20
|
+
var toMMl = function toMMl(node) {
|
|
21
|
+
return visitor.visitTree(node);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
var NEWLINE_BLOCK_REGEX = /\\embed\{newLine\}\[\]/g;
|
|
25
|
+
var NEWLINE_LATEX = '\\newline ';
|
|
26
|
+
var mathRenderingKEY = '@pie-lib/math-rendering@2';
|
|
27
|
+
var mathRenderingAccessibleKEY = '@pie-lib/math-rendering-accessible@1';
|
|
28
|
+
var MathJaxVersion = '3.2.2';
|
|
29
|
+
exports.MathJaxVersion = MathJaxVersion;
|
|
30
|
+
|
|
31
|
+
var getGlobal = function getGlobal() {
|
|
32
|
+
// TODO does it make sense to use version?
|
|
33
|
+
// const key = `${pkg.name}@${pkg.version.split('.')[0]}`;
|
|
34
|
+
// It looks like Ed made this change when he switched from mathjax3 to mathjax-full
|
|
35
|
+
// I think it was supposed to make sure version 1 (using mathjax3) is not used
|
|
36
|
+
// in combination with version 2 (using mathjax-full)
|
|
37
|
+
// TODO higher level wrappers use this instance of math-rendering, and if 2 different instances are used, math rendering is not working
|
|
38
|
+
// so I will hardcode this for now until a better solution is found
|
|
39
|
+
if (typeof window !== 'undefined') {
|
|
40
|
+
if (!window[mathRenderingAccessibleKEY]) {
|
|
41
|
+
window[mathRenderingAccessibleKEY] = {};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return window[mathRenderingAccessibleKEY];
|
|
45
|
+
} else {
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
exports.getGlobal = getGlobal;
|
|
51
|
+
|
|
52
|
+
var fixMathElement = function fixMathElement(element) {
|
|
53
|
+
if (element.dataset.mathHandled) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
var property = 'innerText';
|
|
58
|
+
|
|
59
|
+
if (element.textContent) {
|
|
60
|
+
property = 'textContent';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (element[property]) {
|
|
64
|
+
element[property] = (0, _normalization.wrapMath)((0, _normalization.unWrapMath)(element[property]).unwrapped); // because mathquill doesn't understand line breaks, sometimes we end up with custom elements on prompts/rationale/etc.
|
|
65
|
+
// we need to replace the custom embedded elements with valid latex that Mathjax can understand
|
|
66
|
+
|
|
67
|
+
element[property] = element[property].replace(NEWLINE_BLOCK_REGEX, NEWLINE_LATEX);
|
|
68
|
+
element.dataset.mathHandled = true;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
exports.fixMathElement = fixMathElement;
|
|
73
|
+
|
|
74
|
+
var fixMathElements = function fixMathElements() {
|
|
75
|
+
var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
|
|
76
|
+
var mathElements = el.querySelectorAll('[data-latex]');
|
|
77
|
+
mathElements.forEach(function (item) {
|
|
78
|
+
return fixMathElement(item);
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
exports.fixMathElements = fixMathElements;
|
|
83
|
+
|
|
84
|
+
var adjustMathMLStyle = function adjustMathMLStyle() {
|
|
85
|
+
var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
|
|
86
|
+
var nodes = el.querySelectorAll('math');
|
|
87
|
+
nodes.forEach(function (node) {
|
|
88
|
+
return node.setAttribute('displaystyle', 'true');
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
var createPlaceholder = function createPlaceholder(element) {
|
|
93
|
+
var _element$previousSibl;
|
|
94
|
+
|
|
95
|
+
if (!element.previousSibling || !((_element$previousSibl = element.previousSibling.classList) !== null && _element$previousSibl !== void 0 && _element$previousSibl.contains('math-placeholder'))) {
|
|
96
|
+
var _element$parentNode;
|
|
97
|
+
|
|
98
|
+
// Store the original display style before setting it to 'none'
|
|
99
|
+
element.dataset.originalDisplay = element.style.display || '';
|
|
100
|
+
element.style.display = 'none';
|
|
101
|
+
var placeholder = document.createElement('span');
|
|
102
|
+
placeholder.style.cssText = 'height: 10px; width: 50px; display: inline-block; vertical-align: middle; justify-content: center; background: #fafafa; border-radius: 4px;';
|
|
103
|
+
placeholder.classList.add('math-placeholder');
|
|
104
|
+
(_element$parentNode = element.parentNode) === null || _element$parentNode === void 0 ? void 0 : _element$parentNode.insertBefore(placeholder, element);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
var removePlaceholdersAndRestoreDisplay = function removePlaceholdersAndRestoreDisplay() {
|
|
109
|
+
document.querySelectorAll('.math-placeholder').forEach(function (placeholder) {
|
|
110
|
+
var _targetElement$datase;
|
|
111
|
+
|
|
112
|
+
var targetElement = placeholder.nextElementSibling;
|
|
113
|
+
|
|
114
|
+
if (targetElement && ((_targetElement$datase = targetElement.dataset) === null || _targetElement$datase === void 0 ? void 0 : _targetElement$datase.originalDisplay) !== undefined) {
|
|
115
|
+
targetElement.style.display = targetElement.dataset.originalDisplay;
|
|
116
|
+
delete targetElement.dataset.originalDisplay;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
placeholder.remove();
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
var removeExcessMjxContainers = function removeExcessMjxContainers(content) {
|
|
124
|
+
var elements = content.querySelectorAll('[data-latex][data-math-handled="true"]');
|
|
125
|
+
elements.forEach(function (element) {
|
|
126
|
+
var mjxContainers = element.querySelectorAll('mjx-container'); // Check if there are more than one mjx-container children.
|
|
127
|
+
|
|
128
|
+
if (mjxContainers.length > 1) {
|
|
129
|
+
for (var i = 1; i < mjxContainers.length; i++) {
|
|
130
|
+
mjxContainers[i].parentNode.removeChild(mjxContainers[i]);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
var renderContentsWithMathJax = function renderContentsWithMathJax(el) {
|
|
137
|
+
// el sometimes is an array
|
|
138
|
+
// renderMath is used like that in pie-print-support and pie-element-extensions
|
|
139
|
+
// there seems to be no reason for that, however, it's better to handle the case here
|
|
140
|
+
if (el instanceof Array) {
|
|
141
|
+
el.forEach(function (elNode) {
|
|
142
|
+
return renderContentWithMathJax(elNode);
|
|
143
|
+
});
|
|
144
|
+
} else {
|
|
145
|
+
renderContentWithMathJax(el);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
var renderContentWithMathJax = function renderContentWithMathJax(executeOn) {
|
|
150
|
+
executeOn = executeOn || document.body; // this happens for charting - mark-label; we receive a ref which is not yet ready ( el = { current: null })
|
|
151
|
+
// we have to fix this in charting
|
|
152
|
+
|
|
153
|
+
if (!(executeOn instanceof HTMLElement)) return;
|
|
154
|
+
fixMathElements(executeOn);
|
|
155
|
+
adjustMathMLStyle(executeOn);
|
|
156
|
+
var mathJaxInstance = getGlobal().instance;
|
|
157
|
+
|
|
158
|
+
if (mathJaxInstance) {
|
|
159
|
+
// Reset and clear typesetting before processing the new content
|
|
160
|
+
// Reset the tex labels (and automatic equation number).
|
|
161
|
+
mathJaxInstance.texReset(); // Reset the typesetting system (font caches, etc.)
|
|
162
|
+
|
|
163
|
+
mathJaxInstance.typesetClear(); // Use typesetPromise for asynchronous typesetting
|
|
164
|
+
// Using MathJax.typesetPromise() for asynchronous typesetting to handle situations where additional code needs to be loaded (e.g., for certain TeX commands or characters).
|
|
165
|
+
// This ensures typesetting waits for any needed resources to load and complete processing, unlike the synchronous MathJax.typeset() which can't handle such dynamic loading.
|
|
166
|
+
|
|
167
|
+
mathJaxInstance.typesetPromise([executeOn]).then(function () {
|
|
168
|
+
try {
|
|
169
|
+
removePlaceholdersAndRestoreDisplay();
|
|
170
|
+
removeExcessMjxContainers(executeOn);
|
|
171
|
+
var updatedDocument = mathJaxInstance.startup.document;
|
|
172
|
+
var list = updatedDocument.math.list;
|
|
173
|
+
|
|
174
|
+
for (var item = list.next; (0, _typeof2["default"])(item.data) !== 'symbol'; item = item.next) {
|
|
175
|
+
var mathMl = toMMl(item.data.root);
|
|
176
|
+
var parsedMathMl = mathMl.replaceAll('\n', '');
|
|
177
|
+
item.data.typesetRoot.setAttribute('data-mathml', parsedMathMl);
|
|
178
|
+
item.data.typesetRoot.setAttribute('tabindex', '-1');
|
|
179
|
+
} // If the original input was a string, return the parsed MathML
|
|
180
|
+
|
|
181
|
+
} catch (e) {
|
|
182
|
+
console.error('Error post-processing MathJax typesetting:', e.toString());
|
|
183
|
+
} // Clearing the document if needed
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
mathJaxInstance.startup.document.clear();
|
|
187
|
+
})["catch"](function (error) {
|
|
188
|
+
// If there was an internal error, put the message into the output instead
|
|
189
|
+
console.error('Error in typesetting with MathJax:', error);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
var convertMathJax2ToMathJax3 = function convertMathJax2ToMathJax3() {
|
|
195
|
+
// Make MathJax v2 compatible with v3
|
|
196
|
+
// https://docs.mathjax.org/en/v3.2-latest/upgrading/v2.html#version-2-compatibility-example
|
|
197
|
+
// Replace the require command map with a new one that checks for
|
|
198
|
+
// renamed extensions and converts them to the new names.
|
|
199
|
+
var CommandMap = MathJax._.input.tex.SymbolMap.CommandMap;
|
|
200
|
+
var requireMap = MathJax.config.startup.requireMap;
|
|
201
|
+
var RequireLoad = MathJax._.input.tex.require.RequireConfiguration.RequireLoad;
|
|
202
|
+
var RequireMethods = {
|
|
203
|
+
Require: function Require(parser, name) {
|
|
204
|
+
var required = parser.GetArgument(name);
|
|
205
|
+
|
|
206
|
+
if (required.match(/[^_a-zA-Z0-9]/) || required === '') {
|
|
207
|
+
throw new _TexError["default"]('BadPackageName', 'Argument for %1 is not a valid package name', name);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (requireMap.hasOwnProperty(required)) {
|
|
211
|
+
required = requireMap[required];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
RequireLoad(parser, required);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
new CommandMap('require', {
|
|
218
|
+
require: 'Require'
|
|
219
|
+
}, RequireMethods); //
|
|
220
|
+
// Add a replacement for MathJax.Callback command
|
|
221
|
+
//
|
|
222
|
+
|
|
223
|
+
MathJax.Callback = function (args) {
|
|
224
|
+
if (Array.isArray(args)) {
|
|
225
|
+
if (args.length === 1 && typeof args[0] === 'function') {
|
|
226
|
+
return args[0];
|
|
227
|
+
} else if (typeof args[0] === 'string' && args[1] instanceof Object && typeof args[1][args[0]] === 'function') {
|
|
228
|
+
return Function.bind.apply(args[1][args[0]], args.slice(1));
|
|
229
|
+
} else if (typeof args[0] === 'function') {
|
|
230
|
+
return Function.bind.apply(args[0], [window].concat(args.slice(1)));
|
|
231
|
+
} else if (typeof args[1] === 'function') {
|
|
232
|
+
return Function.bind.apply(args[1], [args[0]].concat(args.slice(2)));
|
|
233
|
+
}
|
|
234
|
+
} else if (typeof args === 'function') {
|
|
235
|
+
return args;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
throw Error("Can't make callback from given data");
|
|
239
|
+
}; //
|
|
240
|
+
// Add a replacement for MathJax.Hub commands
|
|
241
|
+
//
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
MathJax.Hub = {
|
|
245
|
+
Queue: function Queue() {
|
|
246
|
+
for (var i = 0, m = arguments.length; i < m; i++) {
|
|
247
|
+
var fn = MathJax.Callback(arguments[i]);
|
|
248
|
+
MathJax.startup.promise = MathJax.startup.promise.then(fn);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return MathJax.startup.promise;
|
|
252
|
+
},
|
|
253
|
+
Typeset: function Typeset(elements, callback) {
|
|
254
|
+
var promise = MathJax.typesetPromise(elements);
|
|
255
|
+
|
|
256
|
+
if (callback) {
|
|
257
|
+
promise = promise.then(callback);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return promise;
|
|
261
|
+
},
|
|
262
|
+
Register: {
|
|
263
|
+
MessageHook: function MessageHook() {
|
|
264
|
+
console.log('MessageHooks are not supported in version 3');
|
|
265
|
+
},
|
|
266
|
+
StartupHook: function StartupHook() {
|
|
267
|
+
console.log('StartupHooks are not supported in version 3');
|
|
268
|
+
},
|
|
269
|
+
LoadHook: function LoadHook() {
|
|
270
|
+
console.log('LoadHooks are not supported in version 3');
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
Config: function Config() {
|
|
274
|
+
console.log('MathJax configurations should be converted for version 3');
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
var initializeMathJax = function initializeMathJax(callback) {
|
|
280
|
+
if (window.mathjaxLoadedP) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
var PreviousMathJaxIsUsed = window.MathJax && window.MathJax.version && window.MathJax.version !== MathJaxVersion && window.MathJax.version[0] === '2';
|
|
285
|
+
var texConfig = {
|
|
286
|
+
macros: {
|
|
287
|
+
parallelogram: "\\lower.2em{\\Huge\\unicode{x25B1}}",
|
|
288
|
+
overarc: '\\overparen',
|
|
289
|
+
napprox: '\\not\\approx',
|
|
290
|
+
longdiv: '\\enclose{longdiv}'
|
|
291
|
+
},
|
|
292
|
+
displayMath: [['$$', '$$'], ['\\[', '\\]']]
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
if (PreviousMathJaxIsUsed) {
|
|
296
|
+
texConfig.autoload = {
|
|
297
|
+
color: [],
|
|
298
|
+
// don't autoload the color extension
|
|
299
|
+
colorv2: ['color'] // do autoload the colorv2 extension
|
|
300
|
+
|
|
301
|
+
};
|
|
302
|
+
} // Create a new promise that resolves when MathJax is ready
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
window.mathjaxLoadedP = new Promise(function (resolve) {
|
|
306
|
+
// Set up the MathJax configuration
|
|
307
|
+
window.MathJax = {
|
|
308
|
+
startup: {
|
|
309
|
+
//
|
|
310
|
+
// Mapping of old extension names to new ones
|
|
311
|
+
//
|
|
312
|
+
requireMap: PreviousMathJaxIsUsed ? {
|
|
313
|
+
AMSmath: 'ams',
|
|
314
|
+
AMSsymbols: 'ams',
|
|
315
|
+
AMScd: 'amscd',
|
|
316
|
+
HTML: 'html',
|
|
317
|
+
noErrors: 'noerrors',
|
|
318
|
+
noUndefined: 'noundefined'
|
|
319
|
+
} : {},
|
|
320
|
+
typeset: false,
|
|
321
|
+
ready: function ready() {
|
|
322
|
+
if (PreviousMathJaxIsUsed) {
|
|
323
|
+
convertMathJax2ToMathJax3();
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
var mathjax = MathJax._.mathjax.mathjax;
|
|
327
|
+
var STATE = MathJax._.core.MathItem.STATE;
|
|
328
|
+
var Menu = MathJax._.ui.menu.Menu.Menu;
|
|
329
|
+
var rerender = Menu.prototype.rerender;
|
|
330
|
+
|
|
331
|
+
Menu.prototype.rerender = function () {
|
|
332
|
+
var _this = this;
|
|
333
|
+
|
|
334
|
+
var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : STATE.TYPESET;
|
|
335
|
+
mathjax.handleRetriesFor(function () {
|
|
336
|
+
return rerender.call(_this, start);
|
|
337
|
+
});
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
MathJax.startup.defaultReady(); // Set the MathJax instance in the global object
|
|
341
|
+
|
|
342
|
+
var globalObj = getGlobal();
|
|
343
|
+
globalObj.instance = MathJax;
|
|
344
|
+
window.mathjaxLoadedComplete = true;
|
|
345
|
+
console.log('MathJax has initialised!', new Date().toString()); // in this file, initializeMathJax is called with a callback that has to be executed when MathJax was loaded
|
|
346
|
+
|
|
347
|
+
if (callback) {
|
|
348
|
+
callback();
|
|
349
|
+
} // but previous versions of math-rendering-accessible they're expecting window.mathjaxLoadedP to be a Promise, so we also keep the
|
|
350
|
+
// resolve here;
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
resolve();
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
loader: {
|
|
357
|
+
load: ['input/mml'],
|
|
358
|
+
// I just added preLoad: () => {} to prevent the console error: "MathJax.loader.preLoad is not a function",
|
|
359
|
+
// which is being called because in math-rendering-accessible/render-math we're having this line:
|
|
360
|
+
// import * as mr from '@pie-lib/math-rendering';
|
|
361
|
+
// which takes us to: import { AllPackages } from 'mathjax-full/js/input/tex/AllPackages';
|
|
362
|
+
// which tries to call MathJax.loader.preLoad.
|
|
363
|
+
// Understand that AllPackages is NOT needed in math-rendering-accessible, so it is not a problem if we hardcode this function.
|
|
364
|
+
// The better solution would be for math-rendering-accessible to import math-rendering only IF needed,
|
|
365
|
+
// but that's actually complicated and could cause other issues.
|
|
366
|
+
preLoad: function preLoad() {},
|
|
367
|
+
// function to call if a component fails to load
|
|
368
|
+
// eslint-disable-next-line no-console
|
|
369
|
+
failed: function failed(error) {
|
|
370
|
+
return console.log("MathJax(".concat(error["package"] || '?', "): ").concat(error.message));
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
tex: texConfig,
|
|
374
|
+
chtml: {
|
|
375
|
+
fontURL: 'https://unpkg.com/mathjax-full@3.2.2/ts/output/chtml/fonts/tex-woff-v2',
|
|
376
|
+
displayAlign: 'center'
|
|
377
|
+
},
|
|
378
|
+
customKey: '@pie-lib/math-rendering-accessible@1',
|
|
379
|
+
options: {
|
|
380
|
+
enableEnrichment: true,
|
|
381
|
+
sre: {
|
|
382
|
+
speech: 'deep'
|
|
383
|
+
},
|
|
384
|
+
menuOptions: {
|
|
385
|
+
settings: {
|
|
386
|
+
assistiveMml: true,
|
|
387
|
+
collapsible: false,
|
|
388
|
+
explorer: false
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}; // Load the MathJax script
|
|
393
|
+
|
|
394
|
+
var script = document.createElement('script');
|
|
395
|
+
script.type = 'text/javascript';
|
|
396
|
+
script.src = "https://cdn.jsdelivr.net/npm/mathjax@".concat(MathJaxVersion, "/es5/tex-chtml-full.js");
|
|
397
|
+
script.async = true;
|
|
398
|
+
document.head.appendChild(script); // at this time of the execution, there's no document.body; setTimeout does the trick
|
|
399
|
+
|
|
400
|
+
setTimeout(function () {
|
|
401
|
+
if (!window.mathjaxLoadedComplete) {
|
|
402
|
+
var _document, _document$body;
|
|
403
|
+
|
|
404
|
+
var mathElements = (_document = document) === null || _document === void 0 ? void 0 : (_document$body = _document.body) === null || _document$body === void 0 ? void 0 : _document$body.querySelectorAll('[data-latex]');
|
|
405
|
+
(mathElements || []).forEach(createPlaceholder);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
exports.initializeMathJax = initializeMathJax;
|
|
412
|
+
|
|
413
|
+
var renderMath = function renderMath(el, renderOpts) {
|
|
414
|
+
var usedForMmlOutput = typeof el === 'string';
|
|
415
|
+
var executeOn = document.body;
|
|
416
|
+
|
|
417
|
+
if (!usedForMmlOutput) {
|
|
418
|
+
// If math-rendering was not available, then:
|
|
419
|
+
// If window.mathjaxLoadedComplete, it means that we initialised MathJax using the function from this file,
|
|
420
|
+
// and it means MathJax is successfully completed, so we can already use it
|
|
421
|
+
if (window.mathjaxLoadedComplete) {
|
|
422
|
+
renderContentsWithMathJax(el);
|
|
423
|
+
} else if (window.mathjaxLoadedP) {
|
|
424
|
+
// However, because there is a small chance that MathJax was initialised by a previous version of math-rendering-accessible,
|
|
425
|
+
// we need to keep the old handling method, which means adding the .then.catch on window.mathjaxLoadedP Promise.
|
|
426
|
+
// We still want to set window.mathjaxLoadedComplete, to prevent adding .then.catch after the first initialization
|
|
427
|
+
// (again, in case MathJax was initialised by a previous math-rendering-accessible version)
|
|
428
|
+
window.mathjaxLoadedP.then(function () {
|
|
429
|
+
window.mathjaxLoadedComplete = true;
|
|
430
|
+
renderContentsWithMathJax(el);
|
|
431
|
+
})["catch"](function (error) {
|
|
432
|
+
return console.error('Error in initializing MathJax:', error);
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
} else {
|
|
436
|
+
// Here we're handling the case when renderMath is being called for mmlOutput
|
|
437
|
+
if (window.MathJax && window.mathjaxLoadedP) {
|
|
438
|
+
var div = document.createElement('div');
|
|
439
|
+
div.innerHTML = el;
|
|
440
|
+
executeOn = div;
|
|
441
|
+
|
|
442
|
+
try {
|
|
443
|
+
MathJax.texReset();
|
|
444
|
+
MathJax.typesetClear();
|
|
445
|
+
window.MathJax.typeset([executeOn]);
|
|
446
|
+
var updatedDocument = window.MathJax.startup.document;
|
|
447
|
+
var list = updatedDocument.math.list;
|
|
448
|
+
var item = list.next;
|
|
449
|
+
var mathMl = toMMl(item.data.root);
|
|
450
|
+
var parsedMathMl = mathMl.replaceAll('\n', '');
|
|
451
|
+
return parsedMathMl;
|
|
452
|
+
} catch (error) {
|
|
453
|
+
console.error('Error rendering math:', error.message);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
return el;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
return el;
|
|
460
|
+
}
|
|
461
|
+
}; // this function calls itself
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
(function () {
|
|
465
|
+
initializeMathJax(renderContentWithMathJax);
|
|
466
|
+
window[mathRenderingKEY] = {
|
|
467
|
+
instance: {
|
|
468
|
+
Typeset: renderMath
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
})();
|
|
472
|
+
|
|
473
|
+
var _default = renderMath;
|
|
474
|
+
exports["default"] = _default;
|
|
475
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZW5kZXItbWF0aC5qcyJdLCJuYW1lcyI6WyJ2aXNpdG9yIiwiU2VyaWFsaXplZE1tbFZpc2l0b3IiLCJ0b01NbCIsIm5vZGUiLCJ2aXNpdFRyZWUiLCJORVdMSU5FX0JMT0NLX1JFR0VYIiwiTkVXTElORV9MQVRFWCIsIm1hdGhSZW5kZXJpbmdLRVkiLCJtYXRoUmVuZGVyaW5nQWNjZXNzaWJsZUtFWSIsIk1hdGhKYXhWZXJzaW9uIiwiZ2V0R2xvYmFsIiwid2luZG93IiwiZml4TWF0aEVsZW1lbnQiLCJlbGVtZW50IiwiZGF0YXNldCIsIm1hdGhIYW5kbGVkIiwicHJvcGVydHkiLCJ0ZXh0Q29udGVudCIsInVud3JhcHBlZCIsInJlcGxhY2UiLCJmaXhNYXRoRWxlbWVudHMiLCJlbCIsImRvY3VtZW50IiwibWF0aEVsZW1lbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJpdGVtIiwiYWRqdXN0TWF0aE1MU3R5bGUiLCJub2RlcyIsInNldEF0dHJpYnV0ZSIsImNyZWF0ZVBsYWNlaG9sZGVyIiwicHJldmlvdXNTaWJsaW5nIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJvcmlnaW5hbERpc3BsYXkiLCJzdHlsZSIsImRpc3BsYXkiLCJwbGFjZWhvbGRlciIsImNyZWF0ZUVsZW1lbnQiLCJjc3NUZXh0IiwiYWRkIiwicGFyZW50Tm9kZSIsImluc2VydEJlZm9yZSIsInJlbW92ZVBsYWNlaG9sZGVyc0FuZFJlc3RvcmVEaXNwbGF5IiwidGFyZ2V0RWxlbWVudCIsIm5leHRFbGVtZW50U2libGluZyIsInVuZGVmaW5lZCIsInJlbW92ZSIsInJlbW92ZUV4Y2Vzc01qeENvbnRhaW5lcnMiLCJjb250ZW50IiwiZWxlbWVudHMiLCJtanhDb250YWluZXJzIiwibGVuZ3RoIiwiaSIsInJlbW92ZUNoaWxkIiwicmVuZGVyQ29udGVudHNXaXRoTWF0aEpheCIsIkFycmF5IiwiZWxOb2RlIiwicmVuZGVyQ29udGVudFdpdGhNYXRoSmF4IiwiZXhlY3V0ZU9uIiwiYm9keSIsIkhUTUxFbGVtZW50IiwibWF0aEpheEluc3RhbmNlIiwiaW5zdGFuY2UiLCJ0ZXhSZXNldCIsInR5cGVzZXRDbGVhciIsInR5cGVzZXRQcm9taXNlIiwidGhlbiIsInVwZGF0ZWREb2N1bWVudCIsInN0YXJ0dXAiLCJsaXN0IiwibWF0aCIsIm5leHQiLCJkYXRhIiwibWF0aE1sIiwicm9vdCIsInBhcnNlZE1hdGhNbCIsInJlcGxhY2VBbGwiLCJ0eXBlc2V0Um9vdCIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJ0b1N0cmluZyIsImNsZWFyIiwiY29udmVydE1hdGhKYXgyVG9NYXRoSmF4MyIsIkNvbW1hbmRNYXAiLCJNYXRoSmF4IiwiXyIsImlucHV0IiwidGV4IiwiU3ltYm9sTWFwIiwicmVxdWlyZU1hcCIsImNvbmZpZyIsIlJlcXVpcmVMb2FkIiwicmVxdWlyZSIsIlJlcXVpcmVDb25maWd1cmF0aW9uIiwiUmVxdWlyZU1ldGhvZHMiLCJSZXF1aXJlIiwicGFyc2VyIiwibmFtZSIsInJlcXVpcmVkIiwiR2V0QXJndW1lbnQiLCJtYXRjaCIsIlRleEVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJDYWxsYmFjayIsImFyZ3MiLCJpc0FycmF5IiwiT2JqZWN0IiwiRnVuY3Rpb24iLCJiaW5kIiwiYXBwbHkiLCJzbGljZSIsImNvbmNhdCIsIkVycm9yIiwiSHViIiwiUXVldWUiLCJtIiwiYXJndW1lbnRzIiwiZm4iLCJwcm9taXNlIiwiVHlwZXNldCIsImNhbGxiYWNrIiwiUmVnaXN0ZXIiLCJNZXNzYWdlSG9vayIsImxvZyIsIlN0YXJ0dXBIb29rIiwiTG9hZEhvb2siLCJDb25maWciLCJpbml0aWFsaXplTWF0aEpheCIsIm1hdGhqYXhMb2FkZWRQIiwiUHJldmlvdXNNYXRoSmF4SXNVc2VkIiwidmVyc2lvbiIsInRleENvbmZpZyIsIm1hY3JvcyIsInBhcmFsbGVsb2dyYW0iLCJvdmVyYXJjIiwibmFwcHJveCIsImxvbmdkaXYiLCJkaXNwbGF5TWF0aCIsImF1dG9sb2FkIiwiY29sb3IiLCJjb2xvcnYyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJBTVNtYXRoIiwiQU1Tc3ltYm9scyIsIkFNU2NkIiwiSFRNTCIsIm5vRXJyb3JzIiwibm9VbmRlZmluZWQiLCJ0eXBlc2V0IiwicmVhZHkiLCJtYXRoamF4IiwiU1RBVEUiLCJjb3JlIiwiTWF0aEl0ZW0iLCJNZW51IiwidWkiLCJtZW51IiwicmVyZW5kZXIiLCJwcm90b3R5cGUiLCJzdGFydCIsIlRZUEVTRVQiLCJoYW5kbGVSZXRyaWVzRm9yIiwiY2FsbCIsImRlZmF1bHRSZWFkeSIsImdsb2JhbE9iaiIsIm1hdGhqYXhMb2FkZWRDb21wbGV0ZSIsIkRhdGUiLCJsb2FkZXIiLCJsb2FkIiwicHJlTG9hZCIsImZhaWxlZCIsIm1lc3NhZ2UiLCJjaHRtbCIsImZvbnRVUkwiLCJkaXNwbGF5QWxpZ24iLCJjdXN0b21LZXkiLCJvcHRpb25zIiwiZW5hYmxlRW5yaWNobWVudCIsInNyZSIsInNwZWVjaCIsIm1lbnVPcHRpb25zIiwic2V0dGluZ3MiLCJhc3Npc3RpdmVNbWwiLCJjb2xsYXBzaWJsZSIsImV4cGxvcmVyIiwic2NyaXB0IiwidHlwZSIsInNyYyIsImFzeW5jIiwiaGVhZCIsImFwcGVuZENoaWxkIiwic2V0VGltZW91dCIsInJlbmRlck1hdGgiLCJyZW5kZXJPcHRzIiwidXNlZEZvck1tbE91dHB1dCIsImRpdiIsImlubmVySFRNTCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFNQSxPQUFPLEdBQUcsSUFBSUMsMENBQUosRUFBaEI7O0FBQ0EsSUFBTUMsS0FBSyxHQUFHLFNBQVJBLEtBQVEsQ0FBQ0MsSUFBRDtBQUFBLFNBQVVILE9BQU8sQ0FBQ0ksU0FBUixDQUFrQkQsSUFBbEIsQ0FBVjtBQUFBLENBQWQ7O0FBRUEsSUFBTUUsbUJBQW1CLEdBQUcseUJBQTVCO0FBQ0EsSUFBTUMsYUFBYSxHQUFHLFlBQXRCO0FBRUEsSUFBTUMsZ0JBQWdCLEdBQUcsMkJBQXpCO0FBQ0Es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QUFQLENBQWVpRSxPQUFmLENBQXVCLENBQUM1RixTQUFELENBQXZCO0FBQ0EsWUFBTVMsZUFBZSxHQUFHekQsTUFBTSxDQUFDMkUsT0FBUCxDQUFlakIsT0FBZixDQUF1Qi9DLFFBQS9DO0FBQ0EsWUFBTWdELElBQUksR0FBR0YsZUFBZSxDQUFDRyxJQUFoQixDQUFxQkQsSUFBbEM7QUFDQSxZQUFNNUMsSUFBSSxHQUFHNEMsSUFBSSxDQUFDRSxJQUFsQjtBQUNBLFlBQU1FLE1BQU0sR0FBR3hFLEtBQUssQ0FBQ3dCLElBQUksQ0FBQytDLElBQUwsQ0FBVUUsSUFBWCxDQUFwQjtBQUVBLFlBQU1DLFlBQVksR0FBR0YsTUFBTSxDQUFDRyxVQUFQLENBQWtCLElBQWxCLEVBQXdCLEVBQXhCLENBQXJCO0FBRUEsZUFBT0QsWUFBUDtBQUNELE9BWkQsQ0FZRSxPQUFPSyxLQUFQLEVBQWM7QUFDZEQsUUFBQUEsT0FBTyxDQUFDQyxLQUFSLENBQWMsdUJBQWQsRUFBdUNBLEtBQUssQ0FBQzZGLE9BQTdDO0FBQ0Q7O0FBRUQsYUFBT3pKLEVBQVA7QUFDRDs7QUFFRCxXQUFPQSxFQUFQO0FBQ0Q7QUFDRixDQW5ERCxDLENBcURBOzs7QUFDQSxDQUFDLFlBQVc7QUFDVjRHLEVBQUFBLGlCQUFpQixDQUFDdkUsd0JBQUQsQ0FBakI7QUFFQS9DLEVBQUFBLE1BQU0sQ0FBQ0osZ0JBQUQsQ0FBTixHQUEyQjtBQUN6QndELElBQUFBLFFBQVEsRUFBRTtBQUNSMEQsTUFBQUEsT0FBTyxFQUFFMEU7QUFERDtBQURlLEdBQTNCO0FBS0QsQ0FSRDs7ZUFVZUEsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdyYXBNYXRoLCB1bldyYXBNYXRoIH0gZnJvbSAnLi9ub3JtYWxpemF0aW9uJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRNbWxWaXNpdG9yIH0gZnJvbSAnbWF0aGpheC1mdWxsL2pzL2NvcmUvTW1sVHJlZS9TZXJpYWxpemVkTW1sVmlzaXRvcic7XG5pbXBvcnQgVGV4RXJyb3IgZnJvbSAnbWF0aGpheC1mdWxsL2pzL2lucHV0L3RleC9UZXhFcnJvcic7XG5cbmNvbnN0IHZpc2l0b3IgPSBuZXcgU2VyaWFsaXplZE1tbFZpc2l0b3IoKTtcbmNvbnN0IHRvTU1sID0gKG5vZGUpID0+IHZpc2l0b3IudmlzaXRUcmVlKG5vZGUpO1xuXG5jb25zdCBORVdMSU5FX0JMT0NLX1JFR0VYID0gL1xcXFxlbWJlZFxce25ld0xpbmVcXH1cXFtcXF0vZztcbmNvbnN0IE5FV0xJTkVfTEFURVggPSAnXFxcXG5ld2xpbmUgJztcblxuY29uc3QgbWF0aFJlbmRlcmluZ0tFWSA9ICdAcGllLWxpYi9tYXRoLXJlbmRlcmluZ0AyJztcbmNvbnN0IG1hdGhSZW5kZXJpbmdBY2Nlc3NpYmxlS0VZID0gJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nLWFjY2Vzc2libGVAMSc7XG5cbmV4cG9ydCBjb25zdCBNYXRoSmF4VmVyc2lvbiA9ICczLjIuMic7XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWwgPSAoKSA9PiB7XG4gIC8vIFRPRE8gZG9lcyBpdCBtYWtlIHNlbnNlIHRvIHVzZSB2ZXJzaW9uP1xuICAvLyBjb25zdCBrZXkgPSBgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbi5zcGxpdCgnLicpWzBdfWA7XG4gIC8vIEl0IGxvb2tzIGxpa2UgRWQgbWFkZSB0aGlzIGNoYW5nZSB3aGVuIGhlIHN3aXRjaGVkIGZyb20gbWF0aGpheDMgdG8gbWF0aGpheC1mdWxsXG4gIC8vIEkgdGhpbmsgaXQgd2FzIHN1cHBvc2VkIHRvIG1ha2Ugc3VyZSB2ZXJzaW9uIDEgKHVzaW5nIG1hdGhqYXgzKSBpcyBub3QgdXNlZFxuICAvLyBpbiBjb21iaW5hdGlvbiB3aXRoIHZlcnNpb24gMiAodXNpbmcgbWF0aGpheC1mdWxsKVxuICAvLyBUT0RPIGhpZ2hlciBsZXZlbCB3cmFwcGVycyB1c2UgdGhpcyBpbnN0YW5jZSBvZiBtYXRoLXJlbmRlcmluZywgYW5kIGlmIDIgZGlmZmVyZW50IGluc3RhbmNlcyBhcmUgdXNlZCwgbWF0aCByZW5kZXJpbmcgaXMgbm90IHdvcmtpbmdcbiAgLy8gIHNvIEkgd2lsbCBoYXJkY29kZSB0aGlzIGZvciBub3cgdW50aWwgYSBiZXR0ZXIgc29sdXRpb24gaXMgZm91bmRcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKCF3aW5kb3dbbWF0aFJlbmRlcmluZ0FjY2Vzc2libGVLRVldKSB7XG4gICAgICB3aW5kb3dbbWF0aFJlbmRlcmluZ0FjY2Vzc2libGVLRVldID0ge307XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3dbbWF0aFJlbmRlcmluZ0FjY2Vzc2libGVLRVldO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGZpeE1hdGhFbGVtZW50ID0gKGVsZW1lbnQpID0+IHtcbiAgaWYgKGVsZW1lbnQuZGF0YXNldC5tYXRoSGFuZGxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwcm9wZXJ0eSA9ICdpbm5lclRleHQnO1xuXG4gIGlmIChlbGVtZW50LnRleHRDb250ZW50KSB7XG4gICAgcHJvcGVydHkgPSAndGV4dENvbnRlbnQnO1xuICB9XG5cbiAgaWYgKGVsZW1lbnRbcHJvcGVydHldKSB7XG4gICAgZWxlbWVudFtwcm9wZXJ0eV0gPSB3cmFwTWF0aCh1bldyYXBNYXRoKGVsZW1lbnRbcHJvcGVydHldKS51bndyYXBwZWQpO1xuICAgIC8vIGJlY2F1c2UgbWF0aHF1aWxsIGRvZXNuJ3QgdW5kZXJzdGFuZCBsaW5lIGJyZWFrcywgc29tZXRpbWVzIHdlIGVuZCB1cCB3aXRoIGN1c3RvbSBlbGVtZW50cyBvbiBwcm9tcHRzL3JhdGlvbmFsZS9ldGMuXG4gICAgLy8gd2UgbmVlZCB0byByZXBsYWNlIHRoZSBjdXN0b20gZW1iZWRkZWQgZWxlbWVudHMgd2l0aCB2YWxpZCBsYXRleCB0aGF0IE1hdGhqYXggY2FuIHVuZGVyc3RhbmRcbiAgICBlbGVtZW50W3Byb3BlcnR5XSA9IGVsZW1lbnRbcHJvcGVydHldLnJlcGxhY2UoTkVXTElORV9CTE9DS19SRUdFWCwgTkVXTElORV9MQVRFWCk7XG4gICAgZWxlbWVudC5kYXRhc2V0Lm1hdGhIYW5kbGVkID0gdHJ1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGZpeE1hdGhFbGVtZW50cyA9IChlbCA9IGRvY3VtZW50KSA9PiB7XG4gIGNvbnN0IG1hdGhFbGVtZW50cyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWxhdGV4XScpO1xuXG4gIG1hdGhFbGVtZW50cy5mb3JFYWNoKChpdGVtKSA9PiBmaXhNYXRoRWxlbWVudChpdGVtKSk7XG59O1xuXG5jb25zdCBhZGp1c3RNYXRoTUxTdHlsZSA9IChlbCA9IGRvY3VtZW50KSA9PiB7XG4gIGNvbnN0IG5vZGVzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnbWF0aCcpO1xuICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiBub2RlLnNldEF0dHJpYnV0ZSgnZGlzcGxheXN0eWxlJywgJ3RydWUnKSk7XG59O1xuXG5jb25zdCBjcmVhdGVQbGFjZWhvbGRlciA9IChlbGVtZW50KSA9PiB7XG4gIGlmICghZWxlbWVudC5wcmV2aW91c1NpYmxpbmcgfHwgIWVsZW1lbnQucHJldmlvdXNTaWJsaW5nLmNsYXNzTGlzdD8uY29udGFpbnMoJ21hdGgtcGxhY2Vob2xkZXInKSkge1xuICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHN0eWxlIGJlZm9yZSBzZXR0aW5nIGl0IHRvICdub25lJ1xuICAgIGVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXkgPSBlbGVtZW50LnN0eWxlLmRpc3BsYXkgfHwgJyc7XG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgcGxhY2Vob2xkZXIuc3R5bGUuY3NzVGV4dCA9XG4gICAgICAnaGVpZ2h0OiAxMHB4OyB3aWR0aDogNTBweDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgYmFja2dyb3VuZDogI2ZhZmFmYTsgYm9yZGVyLXJhZGl1czogNHB4Oyc7XG4gICAgcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZCgnbWF0aC1wbGFjZWhvbGRlcicpO1xuICAgIGVsZW1lbnQucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKHBsYWNlaG9sZGVyLCBlbGVtZW50KTtcbiAgfVxufTtcblxuY29uc3QgcmVtb3ZlUGxhY2Vob2xkZXJzQW5kUmVzdG9yZURpc3BsYXkgPSAoKSA9PiB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXRoLXBsYWNlaG9sZGVyJykuZm9yRWFjaCgocGxhY2Vob2xkZXIpID0+IHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gcGxhY2Vob2xkZXIubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgdGFyZ2V0RWxlbWVudC5kYXRhc2V0Py5vcmlnaW5hbERpc3BsYXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGFyZ2V0RWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsRGlzcGxheTtcbiAgICAgIGRlbGV0ZSB0YXJnZXRFbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuICAgIH1cblxuICAgIHBsYWNlaG9sZGVyLnJlbW92ZSgpO1xuICB9KTtcbn07XG5jb25zdCByZW1vdmVFeGNlc3NNanhDb250YWluZXJzID0gKGNvbnRlbnQpID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWxhdGV4XVtkYXRhLW1hdGgtaGFuZGxlZD1cInRydWVcIl0nKTtcblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgbWp4Q29udGFpbmVycyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbWp4LWNvbnRhaW5lcicpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgbWp4LWNvbnRhaW5lciBjaGlsZHJlbi5cbiAgICBpZiAobWp4Q29udGFpbmVycy5sZW5ndGggPiAxKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1qeENvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWp4Q29udGFpbmVyc1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1qeENvbnRhaW5lcnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCByZW5kZXJDb250ZW50c1dpdGhNYXRoSmF4ID0gKGVsKSA9PiB7XG4gIC8vIGVsIHNvbWV0aW1lcyBpcyBhbiBhcnJheVxuICAvLyByZW5kZXJNYXRoIGlzIHVzZWQgbGlrZSB0aGF0IGluIHBpZS1wcmludC1zdXBwb3J0IGFuZCBwaWUtZWxlbWVudC1leHRlbnNpb25zXG4gIC8vIHRoZXJlIHNlZW1zIHRvIGJlIG5vIHJlYXNvbiBmb3IgdGhhdCwgaG93ZXZlciwgaXQncyBiZXR0ZXIgdG8gaGFuZGxlIHRoZSBjYXNlIGhlcmVcbiAgaWYgKGVsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBlbC5mb3JFYWNoKChlbE5vZGUpID0+IHJlbmRlckNvbnRlbnRXaXRoTWF0aEpheChlbE5vZGUpKTtcbiAgfSBlbHNlIHtcbiAgICByZW5kZXJDb250ZW50V2l0aE1hdGhKYXgoZWwpO1xuICB9XG59O1xuXG5jb25zdCByZW5kZXJDb250ZW50V2l0aE1hdGhKYXggPSAoZXhlY3V0ZU9uKSA9PiB7XG4gIGV4ZWN1dGVPbiA9IGV4ZWN1dGVPbiB8fCBkb2N1bWVudC5ib2R5O1xuXG4gIC8vIHRoaXMgaGFwcGVucyBmb3IgY2hhcnRpbmcgLSBtYXJrLWxhYmVsOyB3ZSByZWNlaXZlIGEgcmVmIHdoaWNoIGlzIG5vdCB5ZXQgcmVhZHkgKCBlbCA9IHsgY3VycmVudDogbnVsbCB9KVxuICAvLyAgd2UgaGF2ZSB0byBmaXggdGhpcyBpbiBjaGFydGluZ1xuICBpZiAoIShleGVjdXRlT24gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHJldHVybjtcblxuICBmaXhNYXRoRWxlbWVudHMoZXhlY3V0ZU9uKTtcbiAgYWRqdXN0TWF0aE1MU3R5bGUoZXhlY3V0ZU9uKTtcblxuICBjb25zdCBtYXRoSmF4SW5zdGFuY2UgPSBnZXRHbG9iYWwoKS5pbnN0YW5jZTtcblxuICBpZiAobWF0aEpheEluc3RhbmNlKSB7XG4gICAgLy8gUmVzZXQgYW5kIGNsZWFyIHR5cGVzZXR0aW5nIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBuZXcgY29udGVudFxuICAgIC8vIFJlc2V0IHRoZSB0ZXggbGFiZWxzIChhbmQgYXV0b21hdGljIGVxdWF0aW9uIG51bWJlcikuXG5cbiAgICBtYXRoSmF4SW5zdGFuY2UudGV4UmVzZXQoKTtcblxuICAgIC8vICBSZXNldCB0aGUgdHlwZXNldHRpbmcgc3lzdGVtIChmb250IGNhY2hlcywgZXRjLilcbiAgICBtYXRoSmF4SW5zdGFuY2UudHlwZXNldENsZWFyKCk7XG5cbiAgICAvLyBVc2UgdHlwZXNldFByb21pc2UgZm9yIGFzeW5jaHJvbm91cyB0eXBlc2V0dGluZ1xuICAgIC8vIFVzaW5nIE1hdGhKYXgudHlwZXNldFByb21pc2UoKSBmb3IgYXN5bmNocm9ub3VzIHR5cGVzZXR0aW5nIHRvIGhhbmRsZSBzaXR1YXRpb25zIHdoZXJlIGFkZGl0aW9uYWwgY29kZSBuZWVkcyB0byBiZSBsb2FkZWQgKGUuZy4sIGZvciBjZXJ0YWluIFRlWCBjb21tYW5kcyBvciBjaGFyYWN0ZXJzKS5cbiAgICAvLyBUaGlzIGVuc3VyZXMgdHlwZXNldHRpbmcgd2FpdHMgZm9yIGFueSBuZWVkZWQgcmVzb3VyY2VzIHRvIGxvYWQgYW5kIGNvbXBsZXRlIHByb2Nlc3NpbmcsIHVubGlrZSB0aGUgc3luY2hyb25vdXMgTWF0aEpheC50eXBlc2V0KCkgd2hpY2ggY2FuJ3QgaGFuZGxlIHN1Y2ggZHluYW1pYyBsb2FkaW5nLlxuICAgIG1hdGhKYXhJbnN0YW5jZVxuICAgICAgLnR5cGVzZXRQcm9taXNlKFtleGVjdXRlT25dKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlbW92ZVBsYWNlaG9sZGVyc0FuZFJlc3RvcmVEaXNwbGF5KCk7XG4gICAgICAgICAgcmVtb3ZlRXhjZXNzTWp4Q29udGFpbmVycyhleGVjdXRlT24pO1xuXG4gICAgICAgICAgY29uc3QgdXBkYXRlZERvY3VtZW50ID0gbWF0aEpheEluc3RhbmNlLnN0YXJ0dXAuZG9jdW1lbnQ7XG4gICAgICAgICAgY29uc3QgbGlzdCA9IHVwZGF0ZWREb2N1bWVudC5tYXRoLmxpc3Q7XG5cbiAgICAgICAgICBmb3IgKGxldCBpdGVtID0gbGlzdC5uZXh0OyB0eXBlb2YgaXRlbS5kYXRhICE9PSAnc3ltYm9sJzsgaXRlbSA9IGl0ZW0ubmV4dCkge1xuICAgICAgICAgICAgY29uc3QgbWF0aE1sID0gdG9NTWwoaXRlbS5kYXRhLnJvb3QpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkTWF0aE1sID0gbWF0aE1sLnJlcGxhY2VBbGwoJ1xcbicsICcnKTtcblxuICAgICAgICAgICAgaXRlbS5kYXRhLnR5cGVzZXRSb290LnNldEF0dHJpYnV0ZSgnZGF0YS1tYXRobWwnLCBwYXJzZWRNYXRoTWwpO1xuICAgICAgICAgICAgaXRlbS5kYXRhLnR5cGVzZXRSb290LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgaW5wdXQgd2FzIGEgc3RyaW5nLCByZXR1cm4gdGhlIHBhcnNlZCBNYXRoTUxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBvc3QtcHJvY2Vzc2luZyBNYXRoSmF4IHR5cGVzZXR0aW5nOicsIGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhcmluZyB0aGUgZG9jdW1lbnQgaWYgbmVlZGVkXG4gICAgICAgIG1hdGhKYXhJbnN0YW5jZS5zdGFydHVwLmRvY3VtZW50LmNsZWFyKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAvLyAgSWYgdGhlcmUgd2FzIGFuIGludGVybmFsIGVycm9yLCBwdXQgdGhlIG1lc3NhZ2UgaW50byB0aGUgb3V0cHV0IGluc3RlYWRcblxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiB0eXBlc2V0dGluZyB3aXRoIE1hdGhKYXg6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGNvbnZlcnRNYXRoSmF4MlRvTWF0aEpheDMgPSAoKSA9PiB7XG4gIC8vIE1ha2UgTWF0aEpheCB2MiBjb21wYXRpYmxlIHdpdGggdjNcbiAgLy8gIGh0dHBzOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi92My4yLWxhdGVzdC91cGdyYWRpbmcvdjIuaHRtbCN2ZXJzaW9uLTItY29tcGF0aWJpbGl0eS1leGFtcGxlXG4gIC8vICBSZXBsYWNlIHRoZSByZXF1aXJlIGNvbW1hbmQgbWFwIHdpdGggYSBuZXcgb25lIHRoYXQgY2hlY2tzIGZvclxuICAvLyAgICByZW5hbWVkIGV4dGVuc2lvbnMgYW5kIGNvbnZlcnRzIHRoZW0gdG8gdGhlIG5ldyBuYW1lcy5cbiAgY29uc3QgQ29tbWFuZE1hcCA9IE1hdGhKYXguXy5pbnB1dC50ZXguU3ltYm9sTWFwLkNvbW1hbmRNYXA7XG4gIGNvbnN0IHJlcXVpcmVNYXAgPSBNYXRoSmF4LmNvbmZpZy5zdGFydHVwLnJlcXVpcmVNYXA7XG4gIGNvbnN0IFJlcXVpcmVMb2FkID0gTWF0aEpheC5fLmlucHV0LnRleC5yZXF1aXJlLlJlcXVpcmVDb25maWd1cmF0aW9uLlJlcXVpcmVMb2FkO1xuICBjb25zdCBSZXF1aXJlTWV0aG9kcyA9IHtcbiAgICBSZXF1aXJlOiBmdW5jdGlvbihwYXJzZXIsIG5hbWUpIHtcbiAgICAgIGxldCByZXF1aXJlZCA9IHBhcnNlci5HZXRBcmd1bWVudChuYW1lKTtcbiAgICAgIGlmIChyZXF1aXJlZC5tYXRjaCgvW15fYS16QS1aMC05XS8pIHx8IHJlcXVpcmVkID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgVGV4RXJyb3IoJ0JhZFBhY2thZ2VOYW1lJywgJ0FyZ3VtZW50IGZvciAlMSBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWUnLCBuYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXF1aXJlTWFwLmhhc093blByb3BlcnR5KHJlcXVpcmVkKSkge1xuICAgICAgICByZXF1aXJlZCA9IHJlcXVpcmVNYXBbcmVxdWlyZWRdO1xuICAgICAgfVxuICAgICAgUmVxdWlyZUxvYWQocGFyc2VyLCByZXF1aXJlZCk7XG4gICAgfSxcbiAgfTtcblxuICBuZXcgQ29tbWFuZE1hcCgncmVxdWlyZScsIHsgcmVxdWlyZTogJ1JlcXVpcmUnIH0sIFJlcXVpcmVNZXRob2RzKTtcblxuICAvL1xuICAvLyBBZGQgYSByZXBsYWNlbWVudCBmb3IgTWF0aEpheC5DYWxsYmFjayBjb21tYW5kXG4gIC8vXG4gIE1hdGhKYXguQ2FsbGJhY2sgPSBmdW5jdGlvbihhcmdzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncykpIHtcbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gYXJnc1swXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgdHlwZW9mIGFyZ3NbMV1bYXJnc1swXV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLmJpbmQuYXBwbHkoYXJnc1sxXVthcmdzWzBdXSwgYXJncy5zbGljZSgxKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbi5iaW5kLmFwcGx5KGFyZ3NbMF0sIFt3aW5kb3ddLmNvbmNhdChhcmdzLnNsaWNlKDEpKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbi5iaW5kLmFwcGx5KGFyZ3NbMV0sIFthcmdzWzBdXS5jb25jYXQoYXJncy5zbGljZSgyKSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cbiAgICB0aHJvdyBFcnJvcihcIkNhbid0IG1ha2UgY2FsbGJhY2sgZnJvbSBnaXZlbiBkYXRhXCIpO1xuICB9O1xuXG4gIC8vXG4gIC8vIEFkZCBhIHJlcGxhY2VtZW50IGZvciBNYXRoSmF4Lkh1YiBjb21tYW5kc1xuICAvL1xuICBNYXRoSmF4Lkh1YiA9IHtcbiAgICBRdWV1ZTogZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbSA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgY29uc3QgZm4gPSBNYXRoSmF4LkNhbGxiYWNrKGFyZ3VtZW50c1tpXSk7XG4gICAgICAgIE1hdGhKYXguc3RhcnR1cC5wcm9taXNlID0gTWF0aEpheC5zdGFydHVwLnByb21pc2UudGhlbihmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gTWF0aEpheC5zdGFydHVwLnByb21pc2U7XG4gICAgfSxcbiAgICBUeXBlc2V0OiBmdW5jdGlvbihlbGVtZW50cywgY2FsbGJhY2spIHtcbiAgICAgIGxldCBwcm9taXNlID0gTWF0aEpheC50eXBlc2V0UHJvbWlzZShlbGVtZW50cyk7XG5cbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH0sXG4gICAgUmVnaXN0ZXI6IHtcbiAgICAgIE1lc3NhZ2VIb29rOiBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ01lc3NhZ2VIb29rcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDMnKTtcbiAgICAgIH0sXG4gICAgICBTdGFydHVwSG9vazogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdGFydHVwSG9va3MgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAzJyk7XG4gICAgICB9LFxuICAgICAgTG9hZEhvb2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnTG9hZEhvb2tzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHZlcnNpb24gMycpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIENvbmZpZzogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zb2xlLmxvZygnTWF0aEpheCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUgY29udmVydGVkIGZvciB2ZXJzaW9uIDMnKTtcbiAgICB9LFxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBpbml0aWFsaXplTWF0aEpheCA9IChjYWxsYmFjaykgPT4ge1xuICBpZiAod2luZG93Lm1hdGhqYXhMb2FkZWRQKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgUHJldmlvdXNNYXRoSmF4SXNVc2VkID1cbiAgICB3aW5kb3cuTWF0aEpheCAmJlxuICAgIHdpbmRvdy5NYXRoSmF4LnZlcnNpb24gJiZcbiAgICB3aW5kb3cuTWF0aEpheC52ZXJzaW9uICE9PSBNYXRoSmF4VmVyc2lvbiAmJlxuICAgIHdpbmRvdy5NYXRoSmF4LnZlcnNpb25bMF0gPT09ICcyJztcblxuICBjb25zdCB0ZXhDb25maWcgPSB7XG4gICAgbWFjcm9zOiB7XG4gICAgICBwYXJhbGxlbG9ncmFtOiAnXFxcXGxvd2VyLjJlbXtcXFxcSHVnZVxcXFx1bmljb2Rle3gyNUIxfX0nLFxuICAgICAgb3ZlcmFyYzogJ1xcXFxvdmVycGFyZW4nLFxuICAgICAgbmFwcHJveDogJ1xcXFxub3RcXFxcYXBwcm94JyxcbiAgICAgIGxvbmdkaXY6ICdcXFxcZW5jbG9zZXtsb25nZGl2fScsXG4gICAgfSxcbiAgICBkaXNwbGF5TWF0aDogW1xuICAgICAgWyckJCcsICckJCddLFxuICAgICAgWydcXFxcWycsICdcXFxcXSddLFxuICAgIF0sXG4gIH07XG5cbiAgaWYgKFByZXZpb3VzTWF0aEpheElzVXNlZCkge1xuICAgIHRleENvbmZpZy5hdXRvbG9hZCA9IHtcbiAgICAgIGNvbG9yOiBbXSwgLy8gZG9uJ3QgYXV0b2xvYWQgdGhlIGNvbG9yIGV4dGVuc2lvblxuICAgICAgY29sb3J2MjogWydjb2xvciddLCAvLyBkbyBhdXRvbG9hZCB0aGUgY29sb3J2MiBleHRlbnNpb25cbiAgICB9O1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIE1hdGhKYXggaXMgcmVhZHlcbiAgd2luZG93Lm1hdGhqYXhMb2FkZWRQID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAvLyBTZXQgdXAgdGhlIE1hdGhKYXggY29uZmlndXJhdGlvblxuICAgIHdpbmRvdy5NYXRoSmF4ID0ge1xuICAgICAgc3RhcnR1cDoge1xuICAgICAgICAvL1xuICAgICAgICAvLyAgTWFwcGluZyBvZiBvbGQgZXh0ZW5zaW9uIG5hbWVzIHRvIG5ldyBvbmVzXG4gICAgICAgIC8vXG4gICAgICAgIHJlcXVpcmVNYXA6IFByZXZpb3VzTWF0aEpheElzVXNlZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBBTVNtYXRoOiAnYW1zJyxcbiAgICAgICAgICAgICAgQU1Tc3ltYm9sczogJ2FtcycsXG4gICAgICAgICAgICAgIEFNU2NkOiAnYW1zY2QnLFxuICAgICAgICAgICAgICBIVE1MOiAnaHRtbCcsXG4gICAgICAgICAgICAgIG5vRXJyb3JzOiAnbm9lcnJvcnMnLFxuICAgICAgICAgICAgICBub1VuZGVmaW5lZDogJ25vdW5kZWZpbmVkJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9LFxuICAgICAgICB0eXBlc2V0OiBmYWxzZSxcbiAgICAgICAgcmVhZHk6ICgpID0+IHtcbiAgICAgICAgICBpZiAoUHJldmlvdXNNYXRoSmF4SXNVc2VkKSB7XG4gICAgICAgICAgICBjb252ZXJ0TWF0aEpheDJUb01hdGhKYXgzKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgeyBtYXRoamF4IH0gPSBNYXRoSmF4Ll8ubWF0aGpheDtcbiAgICAgICAgICBjb25zdCB7IFNUQVRFIH0gPSBNYXRoSmF4Ll8uY29yZS5NYXRoSXRlbTtcbiAgICAgICAgICBjb25zdCB7IE1lbnUgfSA9IE1hdGhKYXguXy51aS5tZW51Lk1lbnU7XG4gICAgICAgICAgY29uc3QgcmVyZW5kZXIgPSBNZW51LnByb3RvdHlwZS5yZXJlbmRlcjtcbiAgICAgICAgICBNZW51LnByb3RvdHlwZS5yZXJlbmRlciA9IGZ1bmN0aW9uKHN0YXJ0ID0gU1RBVEUuVFlQRVNFVCkge1xuICAgICAgICAgICAgbWF0aGpheC5oYW5kbGVSZXRyaWVzRm9yKCgpID0+IHJlcmVuZGVyLmNhbGwodGhpcywgc3RhcnQpKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIE1hdGhKYXguc3RhcnR1cC5kZWZhdWx0UmVhZHkoKTtcbiAgICAgICAgICAvLyBTZXQgdGhlIE1hdGhKYXggaW5zdGFuY2UgaW4gdGhlIGdsb2JhbCBvYmplY3RcblxuICAgICAgICAgIGNvbnN0IGdsb2JhbE9iaiA9IGdldEdsb2JhbCgpO1xuICAgICAgICAgIGdsb2JhbE9iai5pbnN0YW5jZSA9IE1hdGhKYXg7XG5cbiAgICAgICAgICB3aW5kb3cubWF0aGpheExvYWRlZENvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnTWF0aEpheCBoYXMgaW5pdGlhbGlzZWQhJywgbmV3IERhdGUoKS50b1N0cmluZygpKTtcblxuICAgICAgICAgIC8vIGluIHRoaXMgZmlsZSwgaW5pdGlhbGl6ZU1hdGhKYXggaXMgY2FsbGVkIHdpdGggYSBjYWxsYmFjayB0aGF0IGhhcyB0byBiZSBleGVjdXRlZCB3aGVuIE1hdGhKYXggd2FzIGxvYWRlZFxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBidXQgcHJldmlvdXMgdmVyc2lvbnMgb2YgbWF0aC1yZW5kZXJpbmctYWNjZXNzaWJsZSB0aGV5J3JlIGV4cGVjdGluZyB3aW5kb3cubWF0aGpheExvYWRlZFAgdG8gYmUgYSBQcm9taXNlLCBzbyB3ZSBhbHNvIGtlZXAgdGhlXG4gICAgICAgICAgLy8gIHJlc29sdmUgaGVyZTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbG9hZGVyOiB7XG4gICAgICAgIGxvYWQ6IFsnaW5wdXQvbW1sJ10sXG4gICAgICAgIC8vIEkganVzdCBhZGRlZCBwcmVMb2FkOiAoKSA9PiB7fSB0byBwcmV2ZW50IHRoZSBjb25zb2xlIGVycm9yOiBcIk1hdGhKYXgubG9hZGVyLnByZUxvYWQgaXMgbm90IGEgZnVuY3Rpb25cIixcbiAgICAgICAgLy8gIHdoaWNoIGlzIGJlaW5nIGNhbGxlZCBiZWNhdXNlIGluIG1hdGgtcmVuZGVyaW5nLWFjY2Vzc2libGUvcmVuZGVyLW1hdGggd2UncmUgaGF2aW5nIHRoaXMgbGluZTpcbiAgICAgICAgLy8gIGltcG9ydCAqIGFzIG1yIGZyb20gJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nJztcbiAgICAgICAgLy8gIHdoaWNoIHRha2VzIHVzIHRvOiBpbXBvcnQgeyBBbGxQYWNrYWdlcyB9IGZyb20gJ21hdGhqYXgtZnVsbC9qcy9pbnB1dC90ZXgvQWxsUGFja2FnZXMnO1xuICAgICAgICAvLyAgd2hpY2ggdHJpZXMgdG8gY2FsbCBNYXRoSmF4LmxvYWRlci5wcmVMb2FkLlxuICAgICAgICAvLyBVbmRlcnN0YW5kIHRoYXQgQWxsUGFja2FnZXMgaXMgTk9UIG5lZWRlZCBpbiBtYXRoLXJlbmRlcmluZy1hY2Nlc3NpYmxlLCBzbyBpdCBpcyBub3QgYSBwcm9ibGVtIGlmIHdlIGhhcmRjb2RlIHRoaXMgZnVuY3Rpb24uXG4gICAgICAgIC8vIFRoZSBiZXR0ZXIgc29sdXRpb24gd291bGQgYmUgZm9yIG1hdGgtcmVuZGVyaW5nLWFjY2Vzc2libGUgdG8gaW1wb3J0IG1hdGgtcmVuZGVyaW5nIG9ubHkgSUYgbmVlZGVkLFxuICAgICAgICAvLyAgYnV0IHRoYXQncyBhY3R1YWxseSBjb21wbGljYXRlZCBhbmQgY291bGQgY2F1c2Ugb3RoZXIgaXNzdWVzLlxuICAgICAgICBwcmVMb2FkOiAoKSA9PiB7fSxcbiAgICAgICAgLy8gZnVuY3Rpb24gdG8gY2FsbCBpZiBhIGNvbXBvbmVudCBmYWlscyB0byBsb2FkXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGZhaWxlZDogKGVycm9yKSA9PiBjb25zb2xlLmxvZyhgTWF0aEpheCgke2Vycm9yLnBhY2thZ2UgfHwgJz8nfSk6ICR7ZXJyb3IubWVzc2FnZX1gKSxcbiAgICAgIH0sXG4gICAgICB0ZXg6IHRleENvbmZpZyxcbiAgICAgIGNodG1sOiB7XG4gICAgICAgIGZvbnRVUkw6ICdodHRwczovL3VucGtnLmNvbS9tYXRoamF4LWZ1bGxAMy4yLjIvdHMvb3V0cHV0L2NodG1sL2ZvbnRzL3RleC13b2ZmLXYyJyxcbiAgICAgICAgZGlzcGxheUFsaWduOiAnY2VudGVyJyxcbiAgICAgIH0sXG4gICAgICBjdXN0b21LZXk6ICdAcGllLWxpYi9tYXRoLXJlbmRlcmluZy1hY2Nlc3NpYmxlQDEnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBlbmFibGVFbnJpY2htZW50OiB0cnVlLFxuICAgICAgICBzcmU6IHtcbiAgICAgICAgICBzcGVlY2g6ICdkZWVwJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVudU9wdGlvbnM6IHtcbiAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgYXNzaXN0aXZlTW1sOiB0cnVlLFxuICAgICAgICAgICAgY29sbGFwc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgZXhwbG9yZXI6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTG9hZCB0aGUgTWF0aEpheCBzY3JpcHRcbiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgIHNjcmlwdC5zcmMgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9tYXRoamF4QCR7TWF0aEpheFZlcnNpb259L2VzNS90ZXgtY2h0bWwtZnVsbC5qc2A7XG4gICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAvLyBhdCB0aGlzIHRpbWUgb2YgdGhlIGV4ZWN1dGlvbiwgdGhlcmUncyBubyBkb2N1bWVudC5ib2R5OyBzZXRUaW1lb3V0IGRvZXMgdGhlIHRyaWNrXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXdpbmRvdy5tYXRoamF4TG9hZGVkQ29tcGxldGUpIHtcbiAgICAgICAgY29uc3QgbWF0aEVsZW1lbnRzID0gZG9jdW1lbnQ/LmJvZHk/LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWxhdGV4XScpO1xuICAgICAgICAobWF0aEVsZW1lbnRzIHx8IFtdKS5mb3JFYWNoKGNyZWF0ZVBsYWNlaG9sZGVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5jb25zdCByZW5kZXJNYXRoID0gKGVsLCByZW5kZXJPcHRzKSA9PiB7XG4gIGNvbnN0IHVzZWRGb3JNbWxPdXRwdXQgPSB0eXBlb2YgZWwgPT09ICdzdHJpbmcnO1xuICBsZXQgZXhlY3V0ZU9uID0gZG9jdW1lbnQuYm9keTtcblxuICBpZiAoIXVzZWRGb3JNbWxPdXRwdXQpIHtcbiAgICAvLyBJZiBtYXRoLXJlbmRlcmluZyB3YXMgbm90IGF2YWlsYWJsZSwgdGhlbjpcbiAgICAvLyAgSWYgd2luZG93Lm1hdGhqYXhMb2FkZWRDb21wbGV0ZSwgaXQgbWVhbnMgdGhhdCB3ZSBpbml0aWFsaXNlZCBNYXRoSmF4IHVzaW5nIHRoZSBmdW5jdGlvbiBmcm9tIHRoaXMgZmlsZSxcbiAgICAvLyAgYW5kIGl0IG1lYW5zIE1hdGhKYXggaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCwgc28gd2UgY2FuIGFscmVhZHkgdXNlIGl0XG4gICAgaWYgKHdpbmRvdy5tYXRoamF4TG9hZGVkQ29tcGxldGUpIHtcbiAgICAgIHJlbmRlckNvbnRlbnRzV2l0aE1hdGhKYXgoZWwpO1xuICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGhqYXhMb2FkZWRQKSB7XG4gICAgICAvLyAgSG93ZXZlciwgYmVjYXVzZSB0aGVyZSBpcyBhIHNtYWxsIGNoYW5jZSB0aGF0IE1hdGhKYXggd2FzIGluaXRpYWxpc2VkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiBvZiBtYXRoLXJlbmRlcmluZy1hY2Nlc3NpYmxlLFxuICAgICAgLy8gICAgd2UgbmVlZCB0byBrZWVwIHRoZSBvbGQgaGFuZGxpbmcgbWV0aG9kLCB3aGljaCBtZWFucyBhZGRpbmcgdGhlIC50aGVuLmNhdGNoIG9uIHdpbmRvdy5tYXRoamF4TG9hZGVkUCBQcm9taXNlLlxuICAgICAgLy8gV2Ugc3RpbGwgd2FudCB0byBzZXQgd2luZG93Lm1hdGhqYXhMb2FkZWRDb21wbGV0ZSwgdG8gcHJldmVudCBhZGRpbmcgLnRoZW4uY2F0Y2ggYWZ0ZXIgdGhlIGZpcnN0IGluaXRpYWxpemF0aW9uXG4gICAgICAvLyAgKGFnYWluLCBpbiBjYXNlIE1hdGhKYXggd2FzIGluaXRpYWxpc2VkIGJ5IGEgcHJldmlvdXMgbWF0aC1yZW5kZXJpbmctYWNjZXNzaWJsZSB2ZXJzaW9uKVxuICAgICAgd2luZG93Lm1hdGhqYXhMb2FkZWRQXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICB3aW5kb3cubWF0aGpheExvYWRlZENvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICByZW5kZXJDb250ZW50c1dpdGhNYXRoSmF4KGVsKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gY29uc29sZS5lcnJvcignRXJyb3IgaW4gaW5pdGlhbGl6aW5nIE1hdGhKYXg6JywgZXJyb3IpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSGVyZSB3ZSdyZSBoYW5kbGluZyB0aGUgY2FzZSB3aGVuIHJlbmRlck1hdGggaXMgYmVpbmcgY2FsbGVkIGZvciBtbWxPdXRwdXRcbiAgICBpZiAod2luZG93Lk1hdGhKYXggJiYgd2luZG93Lm1hdGhqYXhMb2FkZWRQKSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZGl2LmlubmVySFRNTCA9IGVsO1xuICAgICAgZXhlY3V0ZU9uID0gZGl2O1xuXG4gICAgICB0cnkge1xuICAgICAgICBNYXRoSmF4LnRleFJlc2V0KCk7XG4gICAgICAgIE1hdGhKYXgudHlwZXNldENsZWFyKCk7XG4gICAgICAgIHdpbmRvdy5NYXRoSmF4LnR5cGVzZXQoW2V4ZWN1dGVPbl0pO1xuICAgICAgICBjb25zdCB1cGRhdGVkRG9jdW1lbnQgPSB3aW5kb3cuTWF0aEpheC5zdGFydHVwLmRvY3VtZW50O1xuICAgICAgICBjb25zdCBsaXN0ID0gdXBkYXRlZERvY3VtZW50Lm1hdGgubGlzdDtcbiAgICAgICAgY29uc3QgaXRlbSA9IGxpc3QubmV4dDtcbiAgICAgICAgY29uc3QgbWF0aE1sID0gdG9NTWwoaXRlbS5kYXRhLnJvb3QpO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZE1hdGhNbCA9IG1hdGhNbC5yZXBsYWNlQWxsKCdcXG4nLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIHBhcnNlZE1hdGhNbDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlbmRlcmluZyBtYXRoOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsO1xuICB9XG59O1xuXG4vLyB0aGlzIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZlxuKGZ1bmN0aW9uKCkge1xuICBpbml0aWFsaXplTWF0aEpheChyZW5kZXJDb250ZW50V2l0aE1hdGhKYXgpO1xuXG4gIHdpbmRvd1ttYXRoUmVuZGVyaW5nS0VZXSA9IHtcbiAgICBpbnN0YW5jZToge1xuICAgICAgVHlwZXNldDogcmVuZGVyTWF0aCxcbiAgICB9LFxuICB9O1xufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgcmVuZGVyTWF0aDtcbiJdfQ==
|
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pie-lib/math-rendering-accessible",
|
|
3
|
+
"version": "3.4.0-beta.0",
|
|
4
|
+
"description": "math rendering utilities",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"main": "lib/index.js",
|
|
9
|
+
"module": "src/index.js",
|
|
10
|
+
"author": "pie-framework developers",
|
|
11
|
+
"license": "ISC",
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"debug": "^4.1.1",
|
|
14
|
+
"lodash": "^4.17.11",
|
|
15
|
+
"mathjax-full": "3.2.2",
|
|
16
|
+
"mathml-to-latex": "1.2.0"
|
|
17
|
+
},
|
|
18
|
+
"gitHead": "3818c24530f62b5bb9be7a2c6aa5428f13a17e0a",
|
|
19
|
+
"scripts": {}
|
|
20
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import mmlToLatex from '../mml-to-latex';
|
|
3
|
+
describe('mmlToLatex', () => {
|
|
4
|
+
it('should work', () => {
|
|
5
|
+
const mml =
|
|
6
|
+
'<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>';
|
|
7
|
+
// todo revisit this
|
|
8
|
+
// const latex = '2x\\text{ }\\leq4y\\text{ }+\\text{ }8\\sqrt{h}';
|
|
9
|
+
const latex = '2 x \\textrm{ } \\leq 4 y \\textrm{ } + \\textrm{ } 8 \\sqrt{h}';
|
|
10
|
+
|
|
11
|
+
expect(mmlToLatex(mml)).toEqual(latex);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -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
|
+
});
|