@pie-lib/editable-html-tip-tap 1.0.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.
Files changed (167) hide show
  1. package/CHANGELOG.json +32 -0
  2. package/CHANGELOG.md +2280 -0
  3. package/lib/__tests__/editor.test.js +470 -0
  4. package/lib/__tests__/serialization.test.js +246 -0
  5. package/lib/__tests__/utils.js +106 -0
  6. package/lib/block-tags.js +25 -0
  7. package/lib/constants.js +16 -0
  8. package/lib/editor.js +1356 -0
  9. package/lib/extensions/MediaView.js +112 -0
  10. package/lib/extensions/characters.js +65 -0
  11. package/lib/extensions/component.js +325 -0
  12. package/lib/extensions/css.js +252 -0
  13. package/lib/extensions/custom-toolbar-wrapper.js +124 -0
  14. package/lib/extensions/image.js +106 -0
  15. package/lib/extensions/math.js +330 -0
  16. package/lib/extensions/media.js +276 -0
  17. package/lib/extensions/responseArea.js +278 -0
  18. package/lib/index.js +1213 -0
  19. package/lib/old-index.js +269 -0
  20. package/lib/parse-html.js +16 -0
  21. package/lib/plugins/characters/custom-popper.js +73 -0
  22. package/lib/plugins/characters/index.js +305 -0
  23. package/lib/plugins/characters/utils.js +381 -0
  24. package/lib/plugins/css/icons/index.js +37 -0
  25. package/lib/plugins/css/index.js +390 -0
  26. package/lib/plugins/customPlugin/index.js +114 -0
  27. package/lib/plugins/html/icons/index.js +38 -0
  28. package/lib/plugins/html/index.js +81 -0
  29. package/lib/plugins/image/__tests__/component.test.js +51 -0
  30. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
  31. package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
  32. package/lib/plugins/image/__tests__/index.test.js +98 -0
  33. package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
  34. package/lib/plugins/image/__tests__/mock-change.js +25 -0
  35. package/lib/plugins/image/alt-dialog.js +129 -0
  36. package/lib/plugins/image/component.js +419 -0
  37. package/lib/plugins/image/image-toolbar.js +177 -0
  38. package/lib/plugins/image/index.js +263 -0
  39. package/lib/plugins/image/insert-image-handler.js +117 -0
  40. package/lib/plugins/index.js +413 -0
  41. package/lib/plugins/list/__tests__/index.test.js +79 -0
  42. package/lib/plugins/list/index.js +334 -0
  43. package/lib/plugins/math/__tests__/index.test.js +300 -0
  44. package/lib/plugins/math/index.js +454 -0
  45. package/lib/plugins/media/__tests__/index.test.js +71 -0
  46. package/lib/plugins/media/index.js +387 -0
  47. package/lib/plugins/media/media-dialog.js +709 -0
  48. package/lib/plugins/media/media-toolbar.js +101 -0
  49. package/lib/plugins/media/media-wrapper.js +93 -0
  50. package/lib/plugins/rendering/index.js +46 -0
  51. package/lib/plugins/respArea/drag-in-the-blank/choice.js +289 -0
  52. package/lib/plugins/respArea/drag-in-the-blank/index.js +94 -0
  53. package/lib/plugins/respArea/explicit-constructed-response/index.js +120 -0
  54. package/lib/plugins/respArea/icons/index.js +95 -0
  55. package/lib/plugins/respArea/index.js +341 -0
  56. package/lib/plugins/respArea/inline-dropdown/index.js +126 -0
  57. package/lib/plugins/respArea/math-templated/index.js +130 -0
  58. package/lib/plugins/respArea/utils.js +125 -0
  59. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  60. package/lib/plugins/table/__tests__/index.test.js +442 -0
  61. package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
  62. package/lib/plugins/table/icons/index.js +69 -0
  63. package/lib/plugins/table/index.js +483 -0
  64. package/lib/plugins/table/table-toolbar.js +187 -0
  65. package/lib/plugins/textAlign/icons/index.js +194 -0
  66. package/lib/plugins/textAlign/index.js +34 -0
  67. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
  68. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
  69. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
  70. package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
  71. package/lib/plugins/toolbar/default-toolbar.js +229 -0
  72. package/lib/plugins/toolbar/done-button.js +53 -0
  73. package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
  74. package/lib/plugins/toolbar/index.js +34 -0
  75. package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
  76. package/lib/plugins/toolbar/toolbar.js +376 -0
  77. package/lib/plugins/utils.js +62 -0
  78. package/lib/serialization.js +677 -0
  79. package/lib/shared/alert-dialog.js +75 -0
  80. package/lib/theme.js +9 -0
  81. package/package.json +69 -0
  82. package/src/__tests__/editor.test.jsx +363 -0
  83. package/src/__tests__/serialization.test.js +291 -0
  84. package/src/__tests__/utils.js +36 -0
  85. package/src/block-tags.js +17 -0
  86. package/src/constants.js +7 -0
  87. package/src/editor.jsx +1197 -0
  88. package/src/extensions/characters.js +46 -0
  89. package/src/extensions/component.jsx +294 -0
  90. package/src/extensions/css.js +217 -0
  91. package/src/extensions/custom-toolbar-wrapper.jsx +100 -0
  92. package/src/extensions/image.js +55 -0
  93. package/src/extensions/math.js +259 -0
  94. package/src/extensions/media.js +182 -0
  95. package/src/extensions/responseArea.js +205 -0
  96. package/src/index.jsx +1462 -0
  97. package/src/old-index.jsx +162 -0
  98. package/src/parse-html.js +8 -0
  99. package/src/plugins/README.md +27 -0
  100. package/src/plugins/characters/custom-popper.js +48 -0
  101. package/src/plugins/characters/index.jsx +284 -0
  102. package/src/plugins/characters/utils.js +447 -0
  103. package/src/plugins/css/icons/index.jsx +17 -0
  104. package/src/plugins/css/index.jsx +340 -0
  105. package/src/plugins/customPlugin/index.jsx +85 -0
  106. package/src/plugins/html/icons/index.jsx +19 -0
  107. package/src/plugins/html/index.jsx +72 -0
  108. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
  109. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
  110. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
  111. package/src/plugins/image/__tests__/component.test.jsx +41 -0
  112. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
  113. package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
  114. package/src/plugins/image/__tests__/index.test.js +95 -0
  115. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  116. package/src/plugins/image/__tests__/mock-change.js +15 -0
  117. package/src/plugins/image/alt-dialog.jsx +82 -0
  118. package/src/plugins/image/component.jsx +343 -0
  119. package/src/plugins/image/image-toolbar.jsx +100 -0
  120. package/src/plugins/image/index.jsx +227 -0
  121. package/src/plugins/image/insert-image-handler.js +79 -0
  122. package/src/plugins/index.jsx +377 -0
  123. package/src/plugins/list/__tests__/index.test.js +54 -0
  124. package/src/plugins/list/index.jsx +305 -0
  125. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
  126. package/src/plugins/math/__tests__/index.test.jsx +245 -0
  127. package/src/plugins/math/index.jsx +379 -0
  128. package/src/plugins/media/__tests__/index.test.js +75 -0
  129. package/src/plugins/media/index.jsx +325 -0
  130. package/src/plugins/media/media-dialog.js +624 -0
  131. package/src/plugins/media/media-toolbar.jsx +56 -0
  132. package/src/plugins/media/media-wrapper.jsx +43 -0
  133. package/src/plugins/rendering/index.js +31 -0
  134. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +215 -0
  135. package/src/plugins/respArea/drag-in-the-blank/index.jsx +70 -0
  136. package/src/plugins/respArea/explicit-constructed-response/index.jsx +92 -0
  137. package/src/plugins/respArea/icons/index.jsx +71 -0
  138. package/src/plugins/respArea/index.jsx +299 -0
  139. package/src/plugins/respArea/inline-dropdown/index.jsx +108 -0
  140. package/src/plugins/respArea/math-templated/index.jsx +104 -0
  141. package/src/plugins/respArea/utils.jsx +90 -0
  142. package/src/plugins/table/CustomTablePlugin.js +113 -0
  143. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
  144. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  145. package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
  146. package/src/plugins/table/icons/index.jsx +53 -0
  147. package/src/plugins/table/index.jsx +427 -0
  148. package/src/plugins/table/table-toolbar.jsx +136 -0
  149. package/src/plugins/textAlign/icons/index.jsx +114 -0
  150. package/src/plugins/textAlign/index.jsx +23 -0
  151. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
  152. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
  153. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
  154. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
  155. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
  156. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
  157. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
  158. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
  159. package/src/plugins/toolbar/default-toolbar.jsx +206 -0
  160. package/src/plugins/toolbar/done-button.jsx +38 -0
  161. package/src/plugins/toolbar/editor-and-toolbar.jsx +257 -0
  162. package/src/plugins/toolbar/index.jsx +23 -0
  163. package/src/plugins/toolbar/toolbar-buttons.jsx +138 -0
  164. package/src/plugins/toolbar/toolbar.jsx +338 -0
  165. package/src/plugins/utils.js +31 -0
  166. package/src/serialization.jsx +621 -0
  167. package/src/theme.js +1 -0
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.CustomToolbarComp = void 0;
9
+ exports["default"] = MathPlugin;
10
+ exports.serialization = exports.inlineMath = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _Functions = _interopRequireDefault(require("@material-ui/icons/Functions"));
17
+
18
+ var _slate = require("slate");
19
+
20
+ var _mathToolbar = require("@pie-lib/math-toolbar");
21
+
22
+ var _mathRendering = require("@pie-lib/math-rendering");
23
+
24
+ var _react = _interopRequireDefault(require("react"));
25
+
26
+ var _debug = _interopRequireDefault(require("debug"));
27
+
28
+ var _slatePropTypes = _interopRequireDefault(require("slate-prop-types"));
29
+
30
+ var _propTypes = _interopRequireDefault(require("prop-types"));
31
+
32
+ var _blockTags = require("../../block-tags");
33
+
34
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
35
+
36
+ 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; }
37
+
38
+ 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; }
39
+
40
+ var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:math');
41
+ var TEXT_NODE = 3;
42
+
43
+ function generateAdditionalKeys() {
44
+ var keyData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
45
+ return keyData.map(function (key) {
46
+ return {
47
+ name: key,
48
+ latex: key,
49
+ write: key,
50
+ label: key
51
+ };
52
+ });
53
+ } // eslint-disable-next-line react/display-name
54
+
55
+
56
+ var CustomToolbarComp = /*#__PURE__*/_react["default"].memo(function (props) {
57
+ var node = props.node,
58
+ value = props.value,
59
+ onFocus = props.onFocus,
60
+ onBlur = props.onBlur,
61
+ onClick = props.onClick;
62
+
63
+ var _ref = props || {},
64
+ pluginProps = _ref.pluginProps;
65
+
66
+ var _ref2 = pluginProps || {},
67
+ math = _ref2.math;
68
+
69
+ var _ref3 = math || {},
70
+ keypadMode = _ref3.keypadMode,
71
+ customKeys = _ref3.customKeys,
72
+ _ref3$controlledKeypa = _ref3.controlledKeypadMode,
73
+ controlledKeypadMode = _ref3$controlledKeypa === void 0 ? true : _ref3$controlledKeypa;
74
+
75
+ var onDone = function onDone(latex) {
76
+ var update = _objectSpread(_objectSpread({}, node.data.toObject()), {}, {
77
+ latex: latex
78
+ });
79
+
80
+ var change = value.change().setNodeByKey(node.key, {
81
+ data: update
82
+ });
83
+ var nextText = value.document.getNextText(node.key);
84
+ change.moveFocusTo(nextText.key, 0).moveAnchorTo(nextText.key, 0);
85
+ props.onToolbarDone(change, false);
86
+ };
87
+
88
+ var onChange = function onChange(latex) {
89
+ var update = _objectSpread(_objectSpread({}, node.data.toObject()), {}, {
90
+ latex: latex
91
+ });
92
+
93
+ var change = value.change().setNodeByKey(node.key, {
94
+ data: update
95
+ });
96
+ log('call onToolbarChange:', change);
97
+ props.onDataChange(node.key, update);
98
+ };
99
+
100
+ var latex = node.data.get('latex');
101
+ return /*#__PURE__*/_react["default"].createElement(_mathToolbar.MathToolbar, {
102
+ autoFocus: true,
103
+ additionalKeys: generateAdditionalKeys(customKeys),
104
+ latex: latex,
105
+ onChange: onChange,
106
+ onDone: onDone,
107
+ onBlur: onBlur,
108
+ onFocus: onFocus,
109
+ onClick: onClick,
110
+ keypadMode: keypadMode,
111
+ controlledKeypadMode: controlledKeypadMode
112
+ });
113
+ }, function (prev, next) {
114
+ var node = prev.node,
115
+ _prev$pluginProps = prev.pluginProps;
116
+ _prev$pluginProps = _prev$pluginProps === void 0 ? {} : _prev$pluginProps;
117
+ var _prev$pluginProps$mat = _prev$pluginProps.math;
118
+ _prev$pluginProps$mat = _prev$pluginProps$mat === void 0 ? {} : _prev$pluginProps$mat;
119
+ var keypadMode = _prev$pluginProps$mat.keypadMode,
120
+ controlledKeypadMode = _prev$pluginProps$mat.controlledKeypadMode;
121
+ var nodeNext = next.node,
122
+ _next$pluginProps = next.pluginProps;
123
+ _next$pluginProps = _next$pluginProps === void 0 ? {} : _next$pluginProps;
124
+ var _next$pluginProps$mat = _next$pluginProps.math;
125
+ _next$pluginProps$mat = _next$pluginProps$mat === void 0 ? {} : _next$pluginProps$mat;
126
+ var keypadModeNext = _next$pluginProps$mat.keypadMode,
127
+ controlledKeypadModeNext = _next$pluginProps$mat.controlledKeypadMode;
128
+ var keypadModeChanged = keypadMode !== keypadModeNext;
129
+ var controlledKeypadModeChanged = controlledKeypadMode !== controlledKeypadModeNext;
130
+ var equal = node.equals(nodeNext);
131
+ return equal && !keypadModeChanged && !controlledKeypadModeChanged;
132
+ });
133
+
134
+ exports.CustomToolbarComp = CustomToolbarComp;
135
+ CustomToolbarComp.propTypes = {
136
+ node: _slatePropTypes["default"].node.isRequired,
137
+ value: _slatePropTypes["default"].value,
138
+ onToolbarDone: _propTypes["default"].func,
139
+ onDataChange: _propTypes["default"].func,
140
+ onFocus: _propTypes["default"].func,
141
+ onClick: _propTypes["default"].func,
142
+ onBlur: _propTypes["default"].func
143
+ };
144
+
145
+ function MathPlugin(opts) {
146
+ MathPlugin.mathMlOptions = {
147
+ mmlOutput: opts.mmlOutput,
148
+ mmlEditing: opts.mmlEditing
149
+ };
150
+ return {
151
+ name: 'math',
152
+ toolbar: {
153
+ ariaLabel: 'Math Toolbar',
154
+ icon: /*#__PURE__*/_react["default"].createElement(_Functions["default"], null),
155
+ onClick: function onClick(value, onChange) {
156
+ log('[insertMath]');
157
+ var math = inlineMath();
158
+ var change = value.change().insertInline(math);
159
+ onChange(change);
160
+ },
161
+ supports: function supports(node) {
162
+ return node && node.object === 'inline' && node.type === 'math';
163
+ },
164
+
165
+ /**
166
+ * Return a react component function
167
+ * @param node {Slate.Node}
168
+ * @param value {Slate.Value}
169
+ * @param onDone {(change?: Slate.Change, finishEditing :boolea) => void} - a function to call once the toolbar
170
+ * has made any changes, call with the node.key and a data object.
171
+ */
172
+ CustomToolbarComp: CustomToolbarComp
173
+ },
174
+ schema: {
175
+ document: {
176
+ match: [{
177
+ type: 'math'
178
+ }]
179
+ }
180
+ },
181
+ pluginStyles: function pluginStyles(node, parentNode, p) {
182
+ if (p) {
183
+ return {
184
+ position: 'absolute',
185
+ top: 'initial'
186
+ };
187
+ }
188
+ },
189
+ renderNode: function renderNode(props) {
190
+ if (props.node.type === 'math') {
191
+ log('[renderNode]: data:', props.node.data);
192
+ return /*#__PURE__*/_react["default"].createElement(_mathToolbar.MathPreview, props);
193
+ }
194
+ /**
195
+ * Here for rendering mathml content
196
+ */
197
+
198
+
199
+ if (props.node.type === 'mathml') {
200
+ var html = props.node.data.get('html');
201
+ return /*#__PURE__*/_react["default"].createElement("span", (0, _extends2["default"])({}, props.attributes, {
202
+ dangerouslySetInnerHTML: {
203
+ __html: html
204
+ }
205
+ }));
206
+ }
207
+ }
208
+ };
209
+ }
210
+
211
+ MathPlugin.ROUND_BRACKETS = 'round_brackets';
212
+ MathPlugin.SQUARE_BRACKETS = 'square_brackets';
213
+ MathPlugin.DOLLAR = 'dollar';
214
+ MathPlugin.DOUBLE_DOLLAR = 'double_dollar';
215
+ MathPlugin.mathMlOptions = {};
216
+ MathPlugin.propTypes = {
217
+ attributes: _propTypes["default"].object,
218
+ node: _slatePropTypes["default"].node
219
+ };
220
+
221
+ var inlineMath = function inlineMath() {
222
+ return _slate.Inline.create({
223
+ object: 'inline',
224
+ type: 'math',
225
+ isVoid: true,
226
+ data: {
227
+ latex: ''
228
+ }
229
+ });
230
+ };
231
+
232
+ exports.inlineMath = inlineMath;
233
+
234
+ var htmlDecode = function htmlDecode(input) {
235
+ var doc = new DOMParser().parseFromString(input, 'text/html');
236
+ return doc.documentElement.textContent;
237
+ };
238
+
239
+ var getTagName = function getTagName(el) {
240
+ return (el && el.tagName || '').toLowerCase();
241
+ };
242
+ /**
243
+ * Makes sure that strings that contain stuff like:
244
+ * x<y are not transformed into x by the DOMParser because it thinks
245
+ * that <y is the start of a dom element tag
246
+ * @param input
247
+ * @returns {*}
248
+ */
249
+
250
+
251
+ var arrowHandlingCase = function arrowHandlingCase(input) {
252
+ /*
253
+ If we have a < character followed by a letter
254
+ we make sure to replace it with a &lt; sign instead
255
+ */
256
+ return input.replace(/<([a-zA-Z]*)/g, '&lt;$1');
257
+ };
258
+
259
+ function replaceLeftRight(latexInput) {
260
+ // for some reason, mmlToLatex parses () incorrectly - or at least in a way that our interpreter can not use them
261
+ // Replace '\\left.' and '\\right.' with an empty string
262
+ return latexInput.replace(/\\left\.\s*|\\right\.\s*/g, '');
263
+ }
264
+
265
+ var convertLatexToMathMl = function convertLatexToMathMl(_ref4) {
266
+ var latex = _ref4.latex,
267
+ decoded = _ref4.decoded,
268
+ wrapper = _ref4.wrapper;
269
+
270
+ var removeEmptyMos = function removeEmptyMos(mmlFromLatex) {
271
+ // Regular expression to match <mo>&#x2061;</mo> and <mo ...>&#x2061;</mo>, which get added when using log with base
272
+ // not sure why they get added, but they add an extra space which is not needed
273
+ var regex = /<mo(?: [^>]*)?>&#x2061;<\/mo>/g; // Replace all occurrences of the matched patterns
274
+
275
+ return mmlFromLatex.replace(regex, '');
276
+ };
277
+
278
+ var handled = arrowHandlingCase(decoded);
279
+ var latexToConvert = "<span data-latex=\"\" data-raw=\"".concat(handled, "\">").concat((0, _mathRendering.wrapMath)(handled, wrapper), "</span>"); // use math rendering (MathJax) to convert latex to mathMl
280
+
281
+ var mathMlFromLatex = (0, _mathRendering.renderMath)(latexToConvert, {
282
+ skipWaitForMathRenderingLib: true
283
+ }); // if renderMath returned the exact same string that we sent, it just means that the conversion could not be done
284
+
285
+ var conversionDidNotWork = (0, _isEqual["default"])(latexToConvert, mathMlFromLatex);
286
+ mathMlFromLatex = removeEmptyMos(mathMlFromLatex); // we convert resulted mathml to latex to check if the resulted mathMl can be converted back to latex if user wants to edit it later
287
+
288
+ var latexFromMathMl = mathMlFromLatex ? (0, _mathRendering.mmlToLatex)(mathMlFromLatex) : ''; // we need to remove all the spaces from the latex to be able to compare it
289
+
290
+ var strippedL = latex.replace(/\s/g, '');
291
+ var strippedNewL = latexFromMathMl.replace(/\s/g, ''); // we check if the latex keeps his form after being converted to mathml and back to latex
292
+ // if it does, we can safely convert it to mathml
293
+
294
+ if (!(0, _isEqual["default"])(strippedL, strippedNewL)) {
295
+ var correctedLatex = replaceLeftRight(latexFromMathMl); // As George requested in PD-3167, I will set the new mathML anyway, and also log differences
296
+ // if it doesn't, we keep the latex version
297
+ // eslint-disable-next-line no-console
298
+
299
+ console.log('This latex can not be safely converted to mathml so we will keep the latex version!!!', {
300
+ initialLatex: latex,
301
+ newLatex: latexFromMathMl,
302
+ correctedLatex: correctedLatex,
303
+ mathML: mathMlFromLatex,
304
+ conversionDidNotWork: conversionDidNotWork
305
+ });
306
+ }
307
+
308
+ return {
309
+ mathMlFromLatex: mathMlFromLatex,
310
+ conversionDidNotWork: conversionDidNotWork
311
+ };
312
+ };
313
+
314
+ var convertMathMlToLatex = function convertMathMlToLatex(mathMl) {
315
+ var htmlWithRemovedSpaces = mathMl.replaceAll('&nbsp;', ' ');
316
+ var htmlToUse = (0, _mathRendering.mmlToLatex)(htmlWithRemovedSpaces);
317
+ var latex = htmlDecode(htmlToUse); // todo fix this in mathml-to-latex
318
+
319
+ return replaceLeftRight(latex);
320
+ };
321
+
322
+ var serialization = {
323
+ deserialize: function deserialize(el) {
324
+ var tagName = getTagName(el);
325
+ /**
326
+ * This is used for when there's a wrapper over the mathml element.
327
+ * Because of this slate rule: "Only allow block nodes or inline and text nodes in blocks."
328
+ * The element that contains only the mathml is removed (along with the math) because it has
329
+ * an inline child and the block is of type block
330
+ * This is for legacy content only since our math rendering is valid for the core slate rules
331
+ */
332
+
333
+ var hasMathChild = _blockTags.BLOCK_TAGS[tagName] && el.childNodes.length === 1 && getTagName(el.firstChild) === 'math';
334
+ log('[deserialize] name: ', tagName);
335
+ /**
336
+ * This is here in order to be able to render mathml content
337
+ */
338
+
339
+ if (tagName === 'math' || el.dataset && el.dataset.type === 'mathml' || hasMathChild) {
340
+ var mathMl = hasMathChild ? el.innerHTML : el.outerHTML;
341
+
342
+ if (MathPlugin.mathMlOptions.mmlEditing) {
343
+ var _unWrapMath = (0, _mathRendering.unWrapMath)(convertMathMlToLatex(mathMl)),
344
+ unwrapped = _unWrapMath.unwrapped,
345
+ wrapType = _unWrapMath.wrapType;
346
+
347
+ return {
348
+ object: 'inline',
349
+ type: 'math',
350
+ isVoid: true,
351
+ nodes: [],
352
+ data: {
353
+ latex: unwrapped,
354
+ wrapper: wrapType
355
+ }
356
+ };
357
+ }
358
+
359
+ return {
360
+ object: 'inline',
361
+ isVoid: true,
362
+ type: 'mathml',
363
+ data: {
364
+ html: mathMl
365
+ }
366
+ };
367
+ }
368
+
369
+ if (el.nodeType === TEXT_NODE) {
370
+ return;
371
+ }
372
+
373
+ if (tagName !== 'span') {
374
+ return;
375
+ }
376
+
377
+ var hasLatex = el.hasAttribute('data-latex') || el.hasAttribute('latex');
378
+
379
+ if (hasLatex) {
380
+ var latex = htmlDecode(el.innerHTML);
381
+
382
+ var _unWrapMath2 = (0, _mathRendering.unWrapMath)(latex),
383
+ _unwrapped = _unWrapMath2.unwrapped,
384
+ _wrapType = _unWrapMath2.wrapType;
385
+
386
+ log('[deserialize]: noBrackets: ', _unwrapped, _wrapType);
387
+ return {
388
+ object: 'inline',
389
+ type: 'math',
390
+ isVoid: true,
391
+ nodes: [],
392
+ data: {
393
+ latex: _unwrapped,
394
+ wrapper: _wrapType
395
+ }
396
+ };
397
+ }
398
+ },
399
+ serialize: function serialize(object) {
400
+ if (object.type === 'math') {
401
+ var latex = object.data.get('latex');
402
+ var wrapper = object.data.get('wrapper');
403
+ var decoded = htmlDecode(arrowHandlingCase(latex));
404
+ log('[serialize] latex: ', latex);
405
+
406
+ if (MathPlugin.mathMlOptions.mmlOutput) {
407
+ var _convertLatexToMathMl = convertLatexToMathMl({
408
+ latex: latex,
409
+ decoded: decoded,
410
+ wrapper: wrapper
411
+ }),
412
+ mathMlFromLatex = _convertLatexToMathMl.mathMlFromLatex,
413
+ conversionDidNotWork = _convertLatexToMathMl.conversionDidNotWork;
414
+
415
+ if (conversionDidNotWork) {
416
+ // this means we could not convert latex to mathMl, so just return the latex version,
417
+ // same as we would do if mmlOutput would not be enabled
418
+ return /*#__PURE__*/_react["default"].createElement("span", {
419
+ "data-latex": "",
420
+ "data-raw": decoded
421
+ }, (0, _mathRendering.wrapMath)(decoded, wrapper));
422
+ }
423
+
424
+ return /*#__PURE__*/_react["default"].createElement("span", {
425
+ "data-type": "mathml",
426
+ dangerouslySetInnerHTML: {
427
+ __html: mathMlFromLatex
428
+ }
429
+ });
430
+ }
431
+
432
+ return /*#__PURE__*/_react["default"].createElement("span", {
433
+ "data-latex": "",
434
+ "data-raw": decoded
435
+ }, (0, _mathRendering.wrapMath)(decoded, wrapper));
436
+ }
437
+ /**
438
+ * Here for rendering mathml content
439
+ */
440
+
441
+
442
+ if (object.type === 'mathml') {
443
+ var html = object.data.get('html');
444
+ return /*#__PURE__*/_react["default"].createElement("span", {
445
+ "data-type": "mathml",
446
+ dangerouslySetInnerHTML: {
447
+ __html: html
448
+ }
449
+ });
450
+ }
451
+ }
452
+ };
453
+ exports.serialization = serialization;
454
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW5zL21hdGgvaW5kZXguanN4Il0sIm5hbWVzIjpbImxvZyIsIlRFWFRfTk9ERSIsImdlbmVyYXRlQWRkaXRpb25hbEtleXMiLCJrZXlEYXRhIiwibWFwIiwia2V5IiwibmFtZSIsImxhdGV4Iiwid3JpdGUiLCJsYWJlbCIsIkN1c3RvbVRvb2xiYXJDb21wIiwiUmVhY3QiLCJtZW1vIiwicHJvcHMiLCJub2RlIiwidmFsdWUiLCJvbkZvY3VzIiwib25CbHVyIiwib25DbGljayIsInBsdWdpblByb3BzIiwibWF0aCIsImtleXBhZE1vZGUiLCJjdXN0b21LZXlzIiwiY29udHJvbGxlZEtleXBhZE1vZGUiLCJvbkRvbmUiLCJ1cGRhdGUiLCJkYXRhIiwidG9PYmplY3QiLCJjaGFuZ2UiLCJzZXROb2RlQnlLZXkiLCJuZXh0VGV4dCIsImRvY3VtZW50IiwiZ2V0TmV4dFRleHQiLCJtb3ZlRm9jdXNUbyIsIm1vdmVBbmNob3JUbyIsIm9uVG9vbGJhckRvbmUiLCJvbkNoYW5nZSIsIm9uRGF0YUNoYW5nZSIsImdldCIsInByZXYiLCJuZXh0Iiwibm9kZU5leHQiLCJrZXlwYWRNb2RlTmV4dCIsImNvbnRyb2xsZWRLZXlwYWRNb2RlTmV4dCIsImtleXBhZE1vZGVDaGFuZ2VkIiwiY29udHJvbGxlZEtleXBhZE1vZGVDaGFuZ2VkIiwiZXF1YWwiLCJlcXVhbHMiLCJwcm9wVHlwZXMiLCJTbGF0ZVByb3BUeXBlcyIsImlzUmVxdWlyZWQiLCJQcm9wVHlwZXMiLCJmdW5jIiwiTWF0aFBsdWdpbiIsIm9wdHMiLCJtYXRoTWxPcHRpb25zIiwibW1sT3V0cHV0IiwibW1sRWRpdGluZyIsInRvb2xiYXIiLCJhcmlhTGFiZWwiLCJpY29uIiwiaW5saW5lTWF0aCIsImluc2VydElubGluZSIsInN1cHBvcnRzIiwib2JqZWN0IiwidHlwZSIsInNjaGVtYSIsIm1hdGNoIiwicGx1Z2luU3R5bGVzIiwicGFyZW50Tm9kZSIsInAiLCJwb3NpdGlvbiIsInRvcCIsInJlbmRlck5vZGUiLCJodG1sIiwiYXR0cmlidXRlcyIsIl9faHRtbCIsIlJPVU5EX0JSQUNLRVRTIiwiU1FVQVJFX0JSQUNLRVRTIiwiRE9MTEFSIiwiRE9VQkxFX0RPTExBUiIsIklubGluZSIsImNyZWF0ZSIsImlzVm9pZCIsImh0bWxEZWNvZGUiLCJpbnB1dCIsImRvYyIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImRvY3VtZW50RWxlbWVudCIsInRleHRDb250ZW50IiwiZ2V0VGFnTmFtZSIsImVsIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiYXJyb3dIYW5kbGluZ0Nhc2UiLCJyZXBsYWNlIiwicmVwbGFjZUxlZnRSaWdodCIsImxhdGV4SW5wdXQiLCJjb252ZXJ0TGF0ZXhUb01hdGhNbCIsImRlY29kZWQiLCJ3cmFwcGVyIiwicmVtb3ZlRW1wdHlNb3MiLCJtbWxGcm9tTGF0ZXgiLCJyZWdleCIsImhhbmRsZWQiLCJsYXRleFRvQ29udmVydCIsIm1hdGhNbEZyb21MYXRleCIsInNraXBXYWl0Rm9yTWF0aFJlbmRlcmluZ0xpYiIsImNvbnZlcnNpb25EaWROb3RXb3JrIiwibGF0ZXhGcm9tTWF0aE1sIiwic3RyaXBwZWRMIiwic3RyaXBwZWROZXdMIiwiY29ycmVjdGVkTGF0ZXgiLCJjb25zb2xlIiwiaW5pdGlhbExhdGV4IiwibmV3TGF0ZXgiLCJtYXRoTUwiLCJjb252ZXJ0TWF0aE1sVG9MYXRleCIsIm1hdGhNbCIsImh0bWxXaXRoUmVtb3ZlZFNwYWNlcyIsInJlcGxhY2VBbGwiLCJodG1sVG9Vc2UiLCJzZXJpYWxpemF0aW9uIiwiZGVzZXJpYWxpemUiLCJoYXNNYXRoQ2hpbGQiLCJCTE9DS19UQUdTIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImZpcnN0Q2hpbGQiLCJkYXRhc2V0IiwiaW5uZXJIVE1MIiwib3V0ZXJIVE1MIiwidW53cmFwcGVkIiwid3JhcFR5cGUiLCJub2RlcyIsIm5vZGVUeXBlIiwiaGFzTGF0ZXgiLCJoYXNBdHRyaWJ1dGUiLCJzZXJpYWxp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QixVQUFBLHVCQUF1QixFQUFFO0FBQUV6QixZQUFBQSxNQUFNLEVBQUUrQjtBQUFWO0FBQWxELFVBQVA7QUFDRDs7QUFFRCwwQkFDRTtBQUFNLHNCQUFXLEVBQWpCO0FBQW9CLG9CQUFVUDtBQUE5QixTQUNHLDZCQUFTQSxPQUFULEVBQWtCQyxPQUFsQixDQURILENBREY7QUFLRDtBQUVEO0FBQ0o7QUFDQTs7O0FBQ0ksUUFBSXJDLE1BQU0sQ0FBQ0MsSUFBUCxLQUFnQixRQUFwQixFQUE4QjtBQUM1QixVQUFNUyxJQUFJLEdBQUdWLE1BQU0sQ0FBQ3RDLElBQVAsQ0FBWVksR0FBWixDQUFnQixNQUFoQixDQUFiO0FBRUEsMEJBQU87QUFBTSxxQkFBVSxRQUFoQjtBQUF5QixRQUFBLHVCQUF1QixFQUFFO0FBQUVzQyxVQUFBQSxNQUFNLEVBQUVGO0FBQVY7QUFBbEQsUUFBUDtBQUNEO0FBQ0Y7QUE3RzBCLENBQXRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZ1bmN0aW9ucyBmcm9tICdAbWF0ZXJpYWwtdWkvaWNvbnMvRnVuY3Rpb25zJztcbmltcG9ydCB7IElubGluZSB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IE1hdGhQcmV2aWV3LCBNYXRoVG9vbGJhciB9IGZyb20gJ0BwaWUtbGliL21hdGgtdG9vbGJhcic7XG5pbXBvcnQgeyB3cmFwTWF0aCwgdW5XcmFwTWF0aCwgbW1sVG9MYXRleCwgcmVuZGVyTWF0aCB9IGZyb20gJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IFNsYXRlUHJvcFR5cGVzIGZyb20gJ3NsYXRlLXByb3AtdHlwZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuaW1wb3J0IHsgQkxPQ0tfVEFHUyB9IGZyb20gJy4uLy4uL2Jsb2NrLXRhZ3MnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuXG5jb25zdCBsb2cgPSBkZWJ1ZygnQHBpZS1saWI6ZWRpdGFibGUtaHRtbDpwbHVnaW5zOm1hdGgnKTtcblxuY29uc3QgVEVYVF9OT0RFID0gMztcblxuZnVuY3Rpb24gZ2VuZXJhdGVBZGRpdGlvbmFsS2V5cyhrZXlEYXRhID0gW10pIHtcbiAgcmV0dXJuIGtleURhdGEubWFwKChrZXkpID0+ICh7XG4gICAgbmFtZToga2V5LFxuICAgIGxhdGV4OiBrZXksXG4gICAgd3JpdGU6IGtleSxcbiAgICBsYWJlbDoga2V5LFxuICB9KSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9kaXNwbGF5LW5hbWVcbmV4cG9ydCBjb25zdCBDdXN0b21Ub29sYmFyQ29tcCA9IFJlYWN0Lm1lbW8oXG4gIChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgbm9kZSwgdmFsdWUsIG9uRm9jdXMsIG9uQmx1ciwgb25DbGljayB9ID0gcHJvcHM7XG4gICAgY29uc3QgeyBwbHVnaW5Qcm9wcyB9ID0gcHJvcHMgfHwge307XG4gICAgY29uc3QgeyBtYXRoIH0gPSBwbHVnaW5Qcm9wcyB8fCB7fTtcbiAgICBjb25zdCB7IGtleXBhZE1vZGUsIGN1c3RvbUtleXMsIGNvbnRyb2xsZWRLZXlwYWRNb2RlID0gdHJ1ZSB9ID0gbWF0aCB8fCB7fTtcblxuICAgIGNvbnN0IG9uRG9uZSA9IChsYXRleCkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgICAuLi5ub2RlLmRhdGEudG9PYmplY3QoKSxcbiAgICAgICAgbGF0ZXgsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjaGFuZ2UgPSB2YWx1ZS5jaGFuZ2UoKS5zZXROb2RlQnlLZXkobm9kZS5rZXksIHsgZGF0YTogdXBkYXRlIH0pO1xuXG4gICAgICBjb25zdCBuZXh0VGV4dCA9IHZhbHVlLmRvY3VtZW50LmdldE5leHRUZXh0KG5vZGUua2V5KTtcblxuICAgICAgY2hhbmdlLm1vdmVGb2N1c1RvKG5leHRUZXh0LmtleSwgMCkubW92ZUFuY2hvclRvKG5leHRUZXh0LmtleSwgMCk7XG5cbiAgICAgIHByb3BzLm9uVG9vbGJhckRvbmUoY2hhbmdlLCBmYWxzZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uQ2hhbmdlID0gKGxhdGV4KSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGUgPSB7XG4gICAgICAgIC4uLm5vZGUuZGF0YS50b09iamVjdCgpLFxuICAgICAgICBsYXRleCxcbiAgICAgIH07XG4gICAgICBjb25zdCBjaGFuZ2UgPSB2YWx1ZS5jaGFuZ2UoKS5zZXROb2RlQnlLZXkobm9kZS5rZXksIHsgZGF0YTogdXBkYXRlIH0pO1xuICAgICAgbG9nKCdjYWxsIG9uVG9vbGJhckNoYW5nZTonLCBjaGFuZ2UpO1xuICAgICAgcHJvcHMub25EYXRhQ2hhbmdlKG5vZGUua2V5LCB1cGRhdGUpO1xuICAgIH07XG5cbiAgICBjb25zdCBsYXRleCA9IG5vZGUuZGF0YS5nZXQoJ2xhdGV4Jyk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPE1hdGhUb29sYmFyXG4gICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICBhZGRpdGlvbmFsS2V5cz17Z2VuZXJhdGVBZGRpdGlvbmFsS2V5cyhjdXN0b21LZXlzKX1cbiAgICAgICAgbGF0ZXg9e2xhdGV4fVxuICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIG9uRG9uZT17b25Eb25lfVxuICAgICAgICBvbkJsdXI9e29uQmx1cn1cbiAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAga2V5cGFkTW9kZT17a2V5cGFkTW9kZX1cbiAgICAgICAgY29udHJvbGxlZEtleXBhZE1vZGU9e2NvbnRyb2xsZWRLZXlwYWRNb2RlfVxuICAgICAgLz5cbiAgICApO1xuICB9LFxuICAocHJldiwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHsgbm9kZSwgcGx1Z2luUHJvcHM6IHsgbWF0aDogeyBrZXlwYWRNb2RlLCBjb250cm9sbGVkS2V5cGFkTW9kZSB9ID0ge30gfSA9IHt9IH0gPSBwcmV2O1xuICAgIGNvbnN0IHtcbiAgICAgIG5vZGU6IG5vZGVOZXh0LFxuICAgICAgcGx1Z2luUHJvcHM6IHsgbWF0aDogeyBrZXlwYWRNb2RlOiBrZXlwYWRNb2RlTmV4dCwgY29udHJvbGxlZEtleXBhZE1vZGU6IGNvbnRyb2xsZWRLZXlwYWRNb2RlTmV4dCB9ID0ge30gfSA9IHt9LFxuICAgIH0gPSBuZXh0O1xuICAgIGNvbnN0IGtleXBhZE1vZGVDaGFuZ2VkID0ga2V5cGFkTW9kZSAhPT0ga2V5cGFkTW9kZU5leHQ7XG4gICAgY29uc3QgY29udHJvbGxlZEtleXBhZE1vZGVDaGFuZ2VkID0gY29udHJvbGxlZEtleXBhZE1vZGUgIT09IGNvbnRyb2xsZWRLZXlwYWRNb2RlTmV4dDtcblxuICAgIGNvbnN0IGVxdWFsID0gbm9kZS5lcXVhbHMobm9kZU5leHQpO1xuICAgIHJldHVybiBlcXVhbCAmJiAha2V5cGFkTW9kZUNoYW5nZWQgJiYgIWNvbnRyb2xsZWRLZXlwYWRNb2RlQ2hhbmdlZDtcbiAgfSxcbik7XG5cbkN1c3RvbVRvb2xiYXJDb21wLnByb3BUeXBlcyA9IHtcbiAgbm9kZTogU2xhdGVQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICB2YWx1ZTogU2xhdGVQcm9wVHlwZXMudmFsdWUsXG4gIG9uVG9vbGJhckRvbmU6IFByb3BUeXBlcy5mdW5jLFxuICBvbkRhdGFDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYXRoUGx1Z2luKG9wdHMpIHtcbiAgTWF0aFBsdWdpbi5tYXRoTWxPcHRpb25zID0ge1xuICAgIG1tbE91dHB1dDogb3B0cy5tbWxPdXRwdXQsXG4gICAgbW1sRWRpdGluZzogb3B0cy5tbWxFZGl0aW5nLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ21hdGgnLFxuICAgIHRvb2xiYXI6IHtcbiAgICAgIGFyaWFMYWJlbDogJ01hdGggVG9vbGJhcicsXG4gICAgICBpY29uOiA8RnVuY3Rpb25zIC8+LFxuICAgICAgb25DbGljazogKHZhbHVlLCBvbkNoYW5nZSkgPT4ge1xuICAgICAgICBsb2coJ1tpbnNlcnRNYXRoXScpO1xuICAgICAgICBjb25zdCBtYXRoID0gaW5saW5lTWF0aCgpO1xuICAgICAgICBjb25zdCBjaGFuZ2UgPSB2YWx1ZS5jaGFuZ2UoKS5pbnNlcnRJbmxpbmUobWF0aCk7XG4gICAgICAgIG9uQ2hhbmdlKGNoYW5nZSk7XG4gICAgICB9LFxuICAgICAgc3VwcG9ydHM6IChub2RlKSA9PiBub2RlICYmIG5vZGUub2JqZWN0ID09PSAnaW5saW5lJyAmJiBub2RlLnR5cGUgPT09ICdtYXRoJyxcbiAgICAgIC8qKlxuICAgICAgICogUmV0dXJuIGEgcmVhY3QgY29tcG9uZW50IGZ1bmN0aW9uXG4gICAgICAgKiBAcGFyYW0gbm9kZSB7U2xhdGUuTm9kZX1cbiAgICAgICAqIEBwYXJhbSB2YWx1ZSB7U2xhdGUuVmFsdWV9XG4gICAgICAgKiBAcGFyYW0gb25Eb25lIHsoY2hhbmdlPzogU2xhdGUuQ2hhbmdlLCBmaW5pc2hFZGl0aW5nIDpib29sZWEpID0+IHZvaWR9IC0gYSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIHRvb2xiYXJcbiAgICAgICAqICAgaGFzIG1hZGUgYW55IGNoYW5nZXMsIGNhbGwgd2l0aCB0aGUgbm9kZS5rZXkgYW5kIGEgZGF0YSBvYmplY3QuXG4gICAgICAgKi9cbiAgICAgIEN1c3RvbVRvb2xiYXJDb21wLFxuICAgIH0sXG4gICAgc2NoZW1hOiB7XG4gICAgICBkb2N1bWVudDogeyBtYXRjaDogW3sgdHlwZTogJ21hdGgnIH1dIH0sXG4gICAgfSxcblxuICAgIHBsdWdpblN0eWxlczogKG5vZGUsIHBhcmVudE5vZGUsIHApID0+IHtcbiAgICAgIGlmIChwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgdG9wOiAnaW5pdGlhbCcsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlck5vZGU6IChwcm9wcykgPT4ge1xuICAgICAgaWYgKHByb3BzLm5vZGUudHlwZSA9PT0gJ21hdGgnKSB7XG4gICAgICAgIGxvZygnW3JlbmRlck5vZGVdOiBkYXRhOicsIHByb3BzLm5vZGUuZGF0YSk7XG4gICAgICAgIHJldHVybiA8TWF0aFByZXZpZXcgey4uLnByb3BzfSAvPjtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBIZXJlIGZvciByZW5kZXJpbmcgbWF0aG1sIGNvbnRlbnRcbiAgICAgICAqL1xuICAgICAgaWYgKHByb3BzLm5vZGUudHlwZSA9PT0gJ21hdGhtbCcpIHtcbiAgICAgICAgY29uc3QgaHRtbCA9IHByb3BzLm5vZGUuZGF0YS5nZXQoJ2h0bWwnKTtcblxuICAgICAgICByZXR1cm4gPHNwYW4gey4uLnByb3BzLmF0dHJpYnV0ZXN9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogaHRtbCB9fSAvPjtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5NYXRoUGx1Z2luLlJPVU5EX0JSQUNLRVRTID0gJ3JvdW5kX2JyYWNrZXRzJztcbk1hdGhQbHVnaW4uU1FVQVJFX0JSQUNLRVRTID0gJ3NxdWFyZV9icmFja2V0cyc7XG5NYXRoUGx1Z2luLkRPTExBUiA9ICdkb2xsYXInO1xuTWF0aFBsdWdpbi5ET1VCTEVfRE9MTEFSID0gJ2RvdWJsZV9kb2xsYXInO1xuTWF0aFBsdWdpbi5tYXRoTWxPcHRpb25zID0ge307XG5cbk1hdGhQbHVnaW4ucHJvcFR5cGVzID0ge1xuICBhdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBub2RlOiBTbGF0ZVByb3BUeXBlcy5ub2RlLFxufTtcblxuZXhwb3J0IGNvbnN0IGlubGluZU1hdGggPSAoKSA9PlxuICBJbmxpbmUuY3JlYXRlKHtcbiAgICBvYmplY3Q6ICdpbmxpbmUnLFxuICAgIHR5cGU6ICdtYXRoJyxcbiAgICBpc1ZvaWQ6IHRydWUsXG4gICAgZGF0YToge1xuICAgICAgbGF0ZXg6ICcnLFxuICAgIH0sXG4gIH0pO1xuXG5jb25zdCBodG1sRGVjb2RlID0gKGlucHV0KSA9PiB7XG4gIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaW5wdXQsICd0ZXh0L2h0bWwnKTtcblxuICByZXR1cm4gZG9jLmRvY3VtZW50RWxlbWVudC50ZXh0Q29udGVudDtcbn07XG5cbmNvbnN0IGdldFRhZ05hbWUgPSAoZWwpID0+IHtcbiAgcmV0dXJuICgoZWwgJiYgZWwudGFnTmFtZSkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCBzdHJpbmdzIHRoYXQgY29udGFpbiBzdHVmZiBsaWtlOlxuICogeDx5IGFyZSBub3QgdHJhbnNmb3JtZWQgaW50byB4IGJ5IHRoZSBET01QYXJzZXIgYmVjYXVzZSBpdCB0aGlua3NcbiAqIHRoYXQgPHkgaXMgdGhlIHN0YXJ0IG9mIGEgZG9tIGVsZW1lbnQgdGFnXG4gKiBAcGFyYW0gaW5wdXRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBhcnJvd0hhbmRsaW5nQ2FzZSA9IChpbnB1dCkgPT4ge1xuICAvKlxuICBJZiB3ZSBoYXZlIGEgPCBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgYSBsZXR0ZXJcbiAgd2UgbWFrZSBzdXJlIHRvIHJlcGxhY2UgaXQgd2l0aCBhICZsdDsgc2lnbiBpbnN0ZWFkXG4gICAqL1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvPChbYS16QS1aXSopL2csICcmbHQ7JDEnKTtcbn07XG5cbmZ1bmN0aW9uIHJlcGxhY2VMZWZ0UmlnaHQobGF0ZXhJbnB1dCkge1xuICAvLyBmb3Igc29tZSByZWFzb24sIG1tbFRvTGF0ZXggcGFyc2VzICgpIGluY29ycmVjdGx5IC0gb3IgYXQgbGVhc3QgaW4gYSB3YXkgdGhhdCBvdXIgaW50ZXJwcmV0ZXIgY2FuIG5vdCB1c2UgdGhlbVxuICAvLyBSZXBsYWNlICdcXFxcbGVmdC4nIGFuZCAnXFxcXHJpZ2h0Licgd2l0aCBhbiBlbXB0eSBzdHJpbmdcbiAgcmV0dXJuIGxhdGV4SW5wdXQucmVwbGFjZSgvXFxcXGxlZnRcXC5cXHMqfFxcXFxyaWdodFxcLlxccyovZywgJycpO1xufVxuXG5jb25zdCBjb252ZXJ0TGF0ZXhUb01hdGhNbCA9ICh7IGxhdGV4LCBkZWNvZGVkLCB3cmFwcGVyIH0pID0+IHtcbiAgY29uc3QgcmVtb3ZlRW1wdHlNb3MgPSAobW1sRnJvbUxhdGV4KSA9PiB7XG4gICAgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIDxtbz4mI3gyMDYxOzwvbW8+IGFuZCA8bW8gLi4uPiYjeDIwNjE7PC9tbz4sIHdoaWNoIGdldCBhZGRlZCB3aGVuIHVzaW5nIGxvZyB3aXRoIGJhc2VcbiAgICAvLyBub3Qgc3VyZSB3aHkgdGhleSBnZXQgYWRkZWQsIGJ1dCB0aGV5IGFkZCBhbiBleHRyYSBzcGFjZSB3aGljaCBpcyBub3QgbmVlZGVkXG4gICAgY29uc3QgcmVnZXggPSAvPG1vKD86IFtePl0qKT8+JiN4MjA2MTs8XFwvbW8+L2c7XG5cbiAgICAvLyBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgbWF0Y2hlZCBwYXR0ZXJuc1xuICAgIHJldHVybiBtbWxGcm9tTGF0ZXgucmVwbGFjZShyZWdleCwgJycpO1xuICB9O1xuICBjb25zdCBoYW5kbGVkID0gYXJyb3dIYW5kbGluZ0Nhc2UoZGVjb2RlZCk7XG5cbiAgY29uc3QgbGF0ZXhUb0NvbnZlcnQgPSBgPHNwYW4gZGF0YS1sYXRleD1cIlwiIGRhdGEtcmF3PVwiJHtoYW5kbGVkfVwiPiR7d3JhcE1hdGgoaGFuZGxlZCwgd3JhcHBlcil9PC9zcGFuPmA7XG5cbiAgLy8gdXNlIG1hdGggcmVuZGVyaW5nIChNYXRoSmF4KSB0byBjb252ZXJ0IGxhdGV4IHRvIG1hdGhNbFxuICBsZXQgbWF0aE1sRnJvbUxhdGV4ID0gcmVuZGVyTWF0aChsYXRleFRvQ29udmVydCwge1xuICAgIHNraXBXYWl0Rm9yTWF0aFJlbmRlcmluZ0xpYjogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gaWYgcmVuZGVyTWF0aCByZXR1cm5lZCB0aGUgZXhhY3Qgc2FtZSBzdHJpbmcgdGhhdCB3ZSBzZW50LCBpdCBqdXN0IG1lYW5zIHRoYXQgdGhlIGNvbnZlcnNpb24gY291bGQgbm90IGJlIGRvbmVcbiAgY29uc3QgY29udmVyc2lvbkRpZE5vdFdvcmsgPSBpc0VxdWFsKGxhdGV4VG9Db252ZXJ0LCBtYXRoTWxGcm9tTGF0ZXgpO1xuXG4gIG1hdGhNbEZyb21MYXRleCA9IHJlbW92ZUVtcHR5TW9zKG1hdGhNbEZyb21MYXRleCk7XG5cbiAgLy8gd2UgY29udmVydCByZXN1bHRlZCBtYXRobWwgdG8gbGF0ZXggdG8gY2hlY2sgaWYgdGhlIHJlc3VsdGVkIG1hdGhNbCBjYW4gYmUgY29udmVydGVkIGJhY2sgdG8gbGF0ZXggaWYgdXNlciB3YW50cyB0byBlZGl0IGl0IGxhdGVyXG4gIGNvbnN0IGxhdGV4RnJvbU1hdGhNbCA9IG1hdGhNbEZyb21MYXRleCA/IG1tbFRvTGF0ZXgobWF0aE1sRnJvbUxhdGV4KSA6ICcnO1xuXG4gIC8vIHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCB0aGUgc3BhY2VzIGZyb20gdGhlIGxhdGV4IHRvIGJlIGFibGUgdG8gY29tcGFyZSBpdFxuICBjb25zdCBzdHJpcHBlZEwgPSBsYXRleC5yZXBsYWNlKC9cXHMvZywgJycpO1xuICBjb25zdCBzdHJpcHBlZE5ld0wgPSBsYXRleEZyb21NYXRoTWwucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAvLyB3ZSBjaGVjayBpZiB0aGUgbGF0ZXgga2VlcHMgaGlzIGZvcm0gYWZ0ZXIgYmVpbmcgY29udmVydGVkIHRvIG1hdGhtbCBhbmQgYmFjayB0byBsYXRleFxuICAvLyBpZiBpdCBkb2VzLCB3ZSBjYW4gc2FmZWx5IGNvbnZlcnQgaXQgdG8gbWF0aG1sXG4gIGlmICghaXNFcXVhbChzdHJpcHBlZEwsIHN0cmlwcGVkTmV3TCkpIHtcbiAgICBjb25zdCBjb3JyZWN0ZWRMYXRleCA9IHJlcGxhY2VMZWZ0UmlnaHQobGF0ZXhGcm9tTWF0aE1sKTtcblxuICAgIC8vIEFzIEdlb3JnZSByZXF1ZXN0ZWQgaW4gUEQtMzE2NywgSSB3aWxsIHNldCB0aGUgbmV3IG1hdGhNTCBhbnl3YXksIGFuZCBhbHNvIGxvZyBkaWZmZXJlbmNlc1xuICAgIC8vIGlmIGl0IGRvZXNuJ3QsIHdlIGtlZXAgdGhlIGxhdGV4IHZlcnNpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdUaGlzIGxhdGV4IGNhbiBub3QgYmUgc2FmZWx5IGNvbnZlcnRlZCB0byBtYXRobWwgc28gd2Ugd2lsbCBrZWVwIHRoZSBsYXRleCB2ZXJzaW9uISEhJywge1xuICAgICAgaW5pdGlhbExhdGV4OiBsYXRleCxcbiAgICAgIG5ld0xhdGV4OiBsYXRleEZyb21NYXRoTWwsXG4gICAgICBjb3JyZWN0ZWRMYXRleCxcbiAgICAgIG1hdGhNTDogbWF0aE1sRnJvbUxhdGV4LFxuICAgICAgY29udmVyc2lvbkRpZE5vdFdvcmssXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4geyBtYXRoTWxGcm9tTGF0ZXgsIGNvbnZlcnNpb25EaWROb3RXb3JrIH07XG59O1xuXG5jb25zdCBjb252ZXJ0TWF0aE1sVG9MYXRleCA9IChtYXRoTWwpID0+IHtcbiAgY29uc3QgaHRtbFdpdGhSZW1vdmVkU3BhY2VzID0gbWF0aE1sLnJlcGxhY2VBbGwoJyZuYnNwOycsICcgJyk7XG4gIGNvbnN0IGh0bWxUb1VzZSA9IG1tbFRvTGF0ZXgoaHRtbFdpdGhSZW1vdmVkU3BhY2VzKTtcbiAgY29uc3QgbGF0ZXggPSBodG1sRGVjb2RlKGh0bWxUb1VzZSk7XG5cbiAgLy8gdG9kbyBmaXggdGhpcyBpbiBtYXRobWwtdG8tbGF0ZXhcbiAgcmV0dXJuIHJlcGxhY2VMZWZ0UmlnaHQobGF0ZXgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6YXRpb24gPSB7XG4gIGRlc2VyaWFsaXplKGVsKSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGdldFRhZ05hbWUoZWwpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdXNlZCBmb3Igd2hlbiB0aGVyZSdzIGEgd3JhcHBlciBvdmVyIHRoZSBtYXRobWwgZWxlbWVudC5cbiAgICAgKiBCZWNhdXNlIG9mIHRoaXMgc2xhdGUgcnVsZTogXCJPbmx5IGFsbG93IGJsb2NrIG5vZGVzIG9yIGlubGluZSBhbmQgdGV4dCBub2RlcyBpbiBibG9ja3MuXCJcbiAgICAgKiBUaGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIG1hdGhtbCBpcyByZW1vdmVkIChhbG9uZyB3aXRoIHRoZSBtYXRoKSBiZWNhdXNlIGl0IGhhc1xuICAgICAqIGFuIGlubGluZSBjaGlsZCBhbmQgdGhlIGJsb2NrIGlzIG9mIHR5cGUgYmxvY2tcbiAgICAgKiBUaGlzIGlzIGZvciBsZWdhY3kgY29udGVudCBvbmx5IHNpbmNlIG91ciBtYXRoIHJlbmRlcmluZyBpcyB2YWxpZCBmb3IgdGhlIGNvcmUgc2xhdGUgcnVsZXNcbiAgICAgKi9cbiAgICBjb25zdCBoYXNNYXRoQ2hpbGQgPSBCTE9DS19UQUdTW3RhZ05hbWVdICYmIGVsLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGdldFRhZ05hbWUoZWwuZmlyc3RDaGlsZCkgPT09ICdtYXRoJztcbiAgICBsb2coJ1tkZXNlcmlhbGl6ZV0gbmFtZTogJywgdGFnTmFtZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGhlcmUgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byByZW5kZXIgbWF0aG1sIGNvbnRlbnRcbiAgICAgKi9cbiAgICBpZiAodGFnTmFtZSA9PT0gJ21hdGgnIHx8IChlbC5kYXRhc2V0ICYmIGVsLmRhdGFzZXQudHlwZSA9PT0gJ21hdGhtbCcpIHx8IGhhc01hdGhDaGlsZCkge1xuICAgICAgY29uc3QgbWF0aE1sID0gaGFzTWF0aENoaWxkID8gZWwuaW5uZXJIVE1MIDogZWwub3V0ZXJIVE1MO1xuXG4gICAgICBpZiAoTWF0aFBsdWdpbi5tYXRoTWxPcHRpb25zLm1tbEVkaXRpbmcpIHtcbiAgICAgICAgY29uc3QgeyB1bndyYXBwZWQsIHdyYXBUeXBlIH0gPSB1bldyYXBNYXRoKGNvbnZlcnRNYXRoTWxUb0xhdGV4KG1hdGhNbCkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2JqZWN0OiAnaW5saW5lJyxcbiAgICAgICAgICB0eXBlOiAnbWF0aCcsXG4gICAgICAgICAgaXNWb2lkOiB0cnVlLFxuICAgICAgICAgIG5vZGVzOiBbXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBsYXRleDogdW53cmFwcGVkLFxuICAgICAgICAgICAgd3JhcHBlcjogd3JhcFR5cGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2JqZWN0OiAnaW5saW5lJyxcbiAgICAgICAgaXNWb2lkOiB0cnVlLFxuICAgICAgICB0eXBlOiAnbWF0aG1sJyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGh0bWw6IG1hdGhNbCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVsLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGFnTmFtZSAhPT0gJ3NwYW4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTGF0ZXggPSBlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtbGF0ZXgnKSB8fCBlbC5oYXNBdHRyaWJ1dGUoJ2xhdGV4Jyk7XG5cbiAgICBpZiAoaGFzTGF0ZXgpIHtcbiAgICAgIGNvbnN0IGxhdGV4ID0gaHRtbERlY29kZShlbC5pbm5lckhUTUwpO1xuICAgICAgY29uc3QgeyB1bndyYXBwZWQsIHdyYXBUeXBlIH0gPSB1bldyYXBNYXRoKGxhdGV4KTtcbiAgICAgIGxvZygnW2Rlc2VyaWFsaXplXTogbm9CcmFja2V0czogJywgdW53cmFwcGVkLCB3cmFwVHlwZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvYmplY3Q6ICdpbmxpbmUnLFxuICAgICAgICB0eXBlOiAnbWF0aCcsXG4gICAgICAgIGlzVm9pZDogdHJ1ZSxcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbGF0ZXg6IHVud3JhcHBlZCxcbiAgICAgICAgICB3cmFwcGVyOiB3cmFwVHlwZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9LFxuICBzZXJpYWxpemUob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC50eXBlID09PSAnbWF0aCcpIHtcbiAgICAgIGNvbnN0IGxhdGV4ID0gb2JqZWN0LmRhdGEuZ2V0KCdsYXRleCcpO1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG9iamVjdC5kYXRhLmdldCgnd3JhcHBlcicpO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGh0bWxEZWNvZGUoYXJyb3dIYW5kbGluZ0Nhc2UobGF0ZXgpKTtcblxuICAgICAgbG9nKCdbc2VyaWFsaXplXSBsYXRleDogJywgbGF0ZXgpO1xuXG4gICAgICBpZiAoTWF0aFBsdWdpbi5tYXRoTWxPcHRpb25zLm1tbE91dHB1dCkge1xuICAgICAgICBjb25zdCB7IG1hdGhNbEZyb21MYXRleCwgY29udmVyc2lvbkRpZE5vdFdvcmsgfSA9IGNvbnZlcnRMYXRleFRvTWF0aE1sKHsgbGF0ZXgsIGRlY29kZWQsIHdyYXBwZXIgfSk7XG5cbiAgICAgICAgaWYgKGNvbnZlcnNpb25EaWROb3RXb3JrKSB7XG4gICAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSBjb3VsZCBub3QgY29udmVydCBsYXRleCB0byBtYXRoTWwsIHNvIGp1c3QgcmV0dXJuIHRoZSBsYXRleCB2ZXJzaW9uLFxuICAgICAgICAgIC8vIHNhbWUgYXMgd2Ugd291bGQgZG8gaWYgbW1sT3V0cHV0IHdvdWxkIG5vdCBiZSBlbmFibGVkXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtbGF0ZXg9XCJcIiBkYXRhLXJhdz17ZGVjb2RlZH0+XG4gICAgICAgICAgICAgIHt3cmFwTWF0aChkZWNvZGVkLCB3cmFwcGVyKX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDxzcGFuIGRhdGEtdHlwZT1cIm1hdGhtbFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogbWF0aE1sRnJvbUxhdGV4IH19IC8+O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c3BhbiBkYXRhLWxhdGV4PVwiXCIgZGF0YS1yYXc9e2RlY29kZWR9PlxuICAgICAgICAgIHt3cmFwTWF0aChkZWNvZGVkLCB3cmFwcGVyKX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZXJlIGZvciByZW5kZXJpbmcgbWF0aG1sIGNvbnRlbnRcbiAgICAgKi9cbiAgICBpZiAob2JqZWN0LnR5cGUgPT09ICdtYXRobWwnKSB7XG4gICAgICBjb25zdCBodG1sID0gb2JqZWN0LmRhdGEuZ2V0KCdodG1sJyk7XG5cbiAgICAgIHJldHVybiA8c3BhbiBkYXRhLXR5cGU9XCJtYXRobWxcIiBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6IGh0bWwgfX0gLz47XG4gICAgfVxuICB9LFxufTtcbiJdfQ==
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _ = _interopRequireDefault(require("../"));
6
+
7
+ describe('media plugin', function () {
8
+ var imagePlugin = (0, _["default"])('video');
9
+ describe('normalizeNode', function () {
10
+ it('should exit the function if the node is not of type document', function () {
11
+ var returnValue = imagePlugin.normalizeNode({
12
+ object: 'image'
13
+ });
14
+ expect(returnValue).toEqual(undefined);
15
+ });
16
+ it('should exit there are no changes needed', function () {
17
+ var nodes = [{
18
+ object: 'text',
19
+ text: 'Before Media'
20
+ }, {
21
+ type: 'video'
22
+ }, {
23
+ object: 'text',
24
+ text: 'After Media'
25
+ }];
26
+ var returnValue = imagePlugin.normalizeNode({
27
+ object: 'document',
28
+ findDescendant: jest.fn(function (callback) {
29
+ nodes.forEach(function (n) {
30
+ return callback(n);
31
+ });
32
+ })
33
+ });
34
+ expect(returnValue).toEqual(undefined);
35
+ });
36
+ it('should return a function if there is a node with an empty text before a media element', function () {
37
+ var nodes = [{
38
+ object: 'text',
39
+ text: '',
40
+ key: '1'
41
+ }, {
42
+ type: 'video',
43
+ key: '2'
44
+ }, {
45
+ object: 'text',
46
+ text: 'After Media',
47
+ key: '3'
48
+ }];
49
+ var findDescendant = jest.fn(function (callback) {
50
+ nodes.forEach(function (n) {
51
+ return callback(n);
52
+ });
53
+ });
54
+ var change = {
55
+ withoutNormalization: jest.fn(function (callback) {
56
+ callback();
57
+ }),
58
+ insertTextByKey: jest.fn()
59
+ };
60
+ var returnValue = imagePlugin.normalizeNode({
61
+ object: 'document',
62
+ findDescendant: findDescendant
63
+ });
64
+ expect(returnValue).toEqual(expect.any(Function));
65
+ returnValue(change);
66
+ expect(change.withoutNormalization).toHaveBeenCalledWith(expect.any(Function));
67
+ expect(change.insertTextByKey).toHaveBeenCalledWith('1', 0, ' ');
68
+ });
69
+ });
70
+ });
71
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW5zL21lZGlhL19fdGVzdHNfXy9pbmRleC50ZXN0LmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaW1hZ2VQbHVnaW4iLCJpdCIsInJldHVyblZhbHVlIiwibm9ybWFsaXplTm9kZSIsIm9iamVjdCIsImV4cGVjdCIsInRvRXF1YWwiLCJ1bmRlZmluZWQiLCJub2RlcyIsInRleHQiLCJ0eXBlIiwiZmluZERlc2NlbmRhbnQiLCJqZXN0IiwiZm4iLCJjYWxsYmFjayIsImZvckVhY2giLCJuIiwia2V5IiwiY2hhbmdlIiwid2l0aG91dE5vcm1hbGl6YXRpb24iLCJpbnNlcnRUZXh0QnlLZXkiLCJhbnkiLCJGdW5jdGlvbiIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7O0FBRUFBLFFBQVEsQ0FBQyxjQUFELEVBQWlCLFlBQU07QUFDN0IsTUFBTUMsV0FBVyxHQUFHLGtCQUFZLE9BQVosQ0FBcEI7QUFFQUQsRUFBQUEsUUFBUSxDQUFDLGVBQUQsRUFBa0IsWUFBTTtBQUM5QkUsSUFBQUEsRUFBRSxDQUFDLDhEQUFELEVBQWlFLFlBQU07QUFDdkUsVUFBTUMsV0FBVyxHQUFHRixXQUFXLENBQUNHLGFBQVosQ0FBMEI7QUFBRUMsUUFBQUEsTUFBTSxFQUFFO0FBQVYsT0FBMUIsQ0FBcEI7QUFFQUMsTUFBQUEsTUFBTSxDQUFDSCxXQUFELENBQU4sQ0FBb0JJLE9BQXBCLENBQTRCQyxTQUE1QjtBQUNELEtBSkMsQ0FBRjtBQU1BTixJQUFBQSxFQUFFLENBQUMseUNBQUQsRUFBNEMsWUFBTTtBQUNsRCxVQUFNTyxLQUFLLEdBQUcsQ0FDWjtBQUNFSixRQUFBQSxNQUFNLEVBQUUsTUFEVjtBQUVFSyxRQUFBQSxJQUFJLEVBQUU7QUFGUixPQURZLEVBS1o7QUFDRUMsUUFBQUEsSUFBSSxFQUFFO0FBRFIsT0FMWSxFQVFaO0FBQ0VOLFFBQUFBLE1BQU0sRUFBRSxNQURWO0FBRUVLLFFBQUFBLElBQUksRUFBRTtBQUZSLE9BUlksQ0FBZDtBQWFBLFVBQU1QLFdBQVcsR0FBR0YsV0FBVyxDQUFDRyxhQUFaLENBQTBCO0FBQzVDQyxRQUFBQSxNQUFNLEVBQUUsVUFEb0M7QUFFNUNPLFFBQUFBLGNBQWMsRUFBRUMsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsUUFBRCxFQUFjO0FBQ3BDTixVQUFBQSxLQUFLLENBQUNPLE9BQU4sQ0FBYyxVQUFDQyxDQUFEO0FBQUEsbUJBQU9GLFFBQVEsQ0FBQ0UsQ0FBRCxDQUFmO0FBQUEsV0FBZDtBQUNELFNBRmU7QUFGNEIsT0FBMUIsQ0FBcEI7QUFNQVgsTUFBQUEsTUFBTSxDQUFDSCxXQUFELENBQU4sQ0FBb0JJLE9BQXBCLENBQTRCQyxTQUE1QjtBQUNELEtBckJDLENBQUY7QUF1QkFOLElBQUFBLEVBQUUsQ0FBQyx1RkFBRCxFQUEwRixZQUFNO0FBQ2hHLFVBQU1PLEtBQUssR0FBRyxDQUNaO0FBQ0VKLFFBQUFBLE1BQU0sRUFBRSxNQURWO0FBRUVLLFFBQUFBLElBQUksRUFBRSxFQUZSO0FBR0VRLFFBQUFBLEdBQUcsRUFBRTtBQUhQLE9BRFksRUFNWjtBQUNFUCxRQUFBQSxJQUFJLEVBQUUsT0FEUjtBQUVFTyxRQUFBQSxHQUFHLEVBQUU7QUFGUCxPQU5ZLEVBVVo7QUFDRWIsUUFBQUEsTUFBTSxFQUFFLE1BRFY7QUFFRUssUUFBQUEsSUFBSSxFQUFFLGFBRlI7QUFHRVEsUUFBQUEsR0FBRyxFQUFFO0FBSFAsT0FWWSxDQUFkO0FBZ0JBLFVBQU1OLGNBQWMsR0FBR0MsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsUUFBRCxFQUFjO0FBQzNDTixRQUFBQSxLQUFLLENBQUNPLE9BQU4sQ0FBYyxVQUFDQyxDQUFEO0FBQUEsaUJBQU9GLFFBQVEsQ0FBQ0UsQ0FBRCxDQUFmO0FBQUEsU0FBZDtBQUNELE9BRnNCLENBQXZCO0FBR0EsVUFBTUUsTUFBTSxHQUFHO0FBQ2JDLFFBQUFBLG9CQUFvQixFQUFFUCxJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxRQUFELEVBQWM7QUFDMUNBLFVBQUFBLFFBQVE7QUFDVCxTQUZxQixDQURUO0FBSWJNLFFBQUFBLGVBQWUsRUFBRVIsSUFBSSxDQUFDQyxFQUFMO0FBSkosT0FBZjtBQU1BLFVBQU1YLFdBQVcsR0FBR0YsV0FBVyxDQUFDRyxhQUFaLENBQTBCO0FBQzVDQyxRQUFBQSxNQUFNLEVBQUUsVUFEb0M7QUFFNUNPLFFBQUFBLGNBQWMsRUFBZEE7QUFGNEMsT0FBMUIsQ0FBcEI7QUFLQU4sTUFBQUEsTUFBTSxDQUFDSCxXQUFELENBQU4sQ0FBb0JJLE9BQXBCLENBQTRCRCxNQUFNLENBQUNnQixHQUFQLENBQVdDLFFBQVgsQ0FBNUI7QUFFQXBCLE1BQUFBLFdBQVcsQ0FBQ2dCLE1BQUQsQ0FBWDtBQUVBYixNQUFBQSxNQUFNLENBQUNhLE1BQU0sQ0FBQ0Msb0JBQVIsQ0FBTixDQUFvQ0ksb0JBQXBDLENBQXlEbEIsTUFBTSxDQUFDZ0IsR0FBUCxDQUFXQyxRQUFYLENBQXpEO0FBQ0FqQixNQUFBQSxNQUFNLENBQUNhLE1BQU0sQ0FBQ0UsZUFBUixDQUFOLENBQStCRyxvQkFBL0IsQ0FBb0QsR0FBcEQsRUFBeUQsQ0FBekQsRUFBNEQsR0FBNUQ7QUFDRCxLQXJDQyxDQUFGO0FBc0NELEdBcEVPLENBQVI7QUFxRUQsQ0F4RU8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNZWRpYVBsdWdpbiBmcm9tICcuLi8nO1xuXG5kZXNjcmliZSgnbWVkaWEgcGx1Z2luJywgKCkgPT4ge1xuICBjb25zdCBpbWFnZVBsdWdpbiA9IE1lZGlhUGx1Z2luKCd2aWRlbycpO1xuXG4gIGRlc2NyaWJlKCdub3JtYWxpemVOb2RlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhpdCB0aGUgZnVuY3Rpb24gaWYgdGhlIG5vZGUgaXMgbm90IG9mIHR5cGUgZG9jdW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGltYWdlUGx1Z2luLm5vcm1hbGl6ZU5vZGUoeyBvYmplY3Q6ICdpbWFnZScgfSk7XG5cbiAgICAgIGV4cGVjdChyZXR1cm5WYWx1ZSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleGl0IHRoZXJlIGFyZSBubyBjaGFuZ2VzIG5lZWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGVzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb2JqZWN0OiAndGV4dCcsXG4gICAgICAgICAgdGV4dDogJ0JlZm9yZSBNZWRpYScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb2JqZWN0OiAndGV4dCcsXG4gICAgICAgICAgdGV4dDogJ0FmdGVyIE1lZGlhJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGltYWdlUGx1Z2luLm5vcm1hbGl6ZU5vZGUoe1xuICAgICAgICBvYmplY3Q6ICdkb2N1bWVudCcsXG4gICAgICAgIGZpbmREZXNjZW5kYW50OiBqZXN0LmZuKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIG5vZGVzLmZvckVhY2goKG4pID0+IGNhbGxiYWNrKG4pKTtcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChyZXR1cm5WYWx1ZSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmdW5jdGlvbiBpZiB0aGVyZSBpcyBhIG5vZGUgd2l0aCBhbiBlbXB0eSB0ZXh0IGJlZm9yZSBhIG1lZGlhIGVsZW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBub2RlcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG9iamVjdDogJ3RleHQnLFxuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIGtleTogJzEnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgICBrZXk6ICcyJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9iamVjdDogJ3RleHQnLFxuICAgICAgICAgIHRleHQ6ICdBZnRlciBNZWRpYScsXG4gICAgICAgICAga2V5OiAnMycsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZmluZERlc2NlbmRhbnQgPSBqZXN0LmZuKChjYWxsYmFjaykgPT4ge1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChuKSA9PiBjYWxsYmFjayhuKSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNoYW5nZSA9IHtcbiAgICAgICAgd2l0aG91dE5vcm1hbGl6YXRpb246IGplc3QuZm4oKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSksXG4gICAgICAgIGluc2VydFRleHRCeUtleTogamVzdC5mbigpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gaW1hZ2VQbHVnaW4ubm9ybWFsaXplTm9kZSh7XG4gICAgICAgIG9iamVjdDogJ2RvY3VtZW50JyxcbiAgICAgICAgZmluZERlc2NlbmRhbnQsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJldHVyblZhbHVlKS50b0VxdWFsKGV4cGVjdC5hbnkoRnVuY3Rpb24pKTtcblxuICAgICAgcmV0dXJuVmFsdWUoY2hhbmdlKTtcblxuICAgICAgZXhwZWN0KGNoYW5nZS53aXRob3V0Tm9ybWFsaXphdGlvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LmFueShGdW5jdGlvbikpO1xuICAgICAgZXhwZWN0KGNoYW5nZS5pbnNlcnRUZXh0QnlLZXkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCcxJywgMCwgJyAnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==