@pie-lib/math-rendering 3.2.2-next.4 → 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.
@@ -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 _package = _interopRequireDefault(require("../package.json"));
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
- var key = "".concat(_package["default"].name, "@").concat(_package["default"].version.split('.')[0]);
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 = _mathjax.mathjax.document(docProvided, {
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
- options: {
233
- enableAssistiveMml: true,
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 updatedDocument = this.html.findMath(elements.length ? {
270
- elements: elements
271
- } : {}).compile().getMetrics().typeset().updateDocument();
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
- try {
274
- var list = updatedDocument.math.list;
321
+ var updatedDocument = _this.html.findMath(elements.length ? {
322
+ elements: elements
323
+ } : {}).compile();
275
324
 
276
- for (var item = list.next; (0, _typeof2["default"])(item.data) !== 'symbol'; item = item.next) {
277
- var mathMl = toMMl(item.data.root);
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
- } catch (e) {
282
- // eslint-disable-next-line no-console
283
- console.error(e.toString());
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
- updatedDocument.clear();
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$instance;
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$instance = getGlobal().instance).Typeset.apply(_getGlobal$instance, (0, _toConsumableArray2["default"])(arr));
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.2.2-next.4+23991a09",
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": "23991a09b77492c24dcb5235049667cdcc211d80",
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>&#xA0;</mtext> <mo>&#x2264;</mo> <mn>4</mn> <mi>y</mi> <mtext>&#xA0;</mtext> <mo>+</mo> <mtext>&#xA0;</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
+ });
@@ -1,2 +1,2 @@
1
- import Mathml2latex from 'mathml-to-latex';
2
- export default (mathml) => Mathml2latex.convert(mathml);
1
+ import { MathMLToLaTeX } from '@pie-framework/mathml-to-latex';
2
+ export default (mathml) => MathMLToLaTeX.convert(mathml);