@pie-lib/editable-html-tip-tap 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/MenuBar.js +7 -7
- package/lib/constants.js +2 -5
- package/package.json +1 -1
- package/src/components/MenuBar.jsx +1 -1
- package/src/constants.js +0 -2
- package/lib/__tests__/editor.test.js +0 -470
- package/lib/__tests__/serialization.test.js +0 -246
- package/lib/block-tags.js +0 -25
- package/lib/components/CharacterPicker.js.map +0 -1
- package/lib/components/EditableHtml.js.map +0 -1
- package/lib/components/MenuBar.js.map +0 -1
- package/lib/components/TiptapContainer.js.map +0 -1
- package/lib/components/buttons/done-button.js +0 -53
- package/lib/components/characters/characterUtils.js.map +0 -1
- package/lib/components/characters/custom-popper.js.map +0 -1
- package/lib/components/common/done-button.js.map +0 -1
- package/lib/components/icons/CssIcon.js.map +0 -1
- package/lib/components/icons/RespArea.js.map +0 -1
- package/lib/components/icons/TableIcons.js.map +0 -1
- package/lib/components/icons/TextAlign.js.map +0 -1
- package/lib/components/icons/index.js +0 -194
- package/lib/components/image/ImageToolbar.js.map +0 -1
- package/lib/components/image/InsertImageHandler.js.map +0 -1
- package/lib/components/image/alt-dialog.js +0 -2
- package/lib/components/media/MediaDialog.js.map +0 -1
- package/lib/components/media/MediaToolbar.js.map +0 -1
- package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +0 -1
- package/lib/components/respArea/DragInTheBlank/choice.js.map +0 -1
- package/lib/components/respArea/DragInTheBlank.js +0 -94
- package/lib/components/respArea/ExplicitConstructedResponse.js.map +0 -1
- package/lib/components/respArea/InlineDropdown.js.map +0 -1
- package/lib/components/respArea/ToolbarIcon.js.map +0 -1
- package/lib/components/respArea/choice.js +0 -2
- package/lib/constants.js.map +0 -1
- package/lib/editor.js +0 -1356
- package/lib/extensions/MediaView.js +0 -112
- package/lib/extensions/characters.js +0 -65
- package/lib/extensions/component.js.map +0 -1
- package/lib/extensions/css.js.map +0 -1
- package/lib/extensions/custom-toolbar-wrapper.js.map +0 -1
- package/lib/extensions/extended-table.js.map +0 -1
- package/lib/extensions/image.js.map +0 -1
- package/lib/extensions/index.js.map +0 -1
- package/lib/extensions/math.js.map +0 -1
- package/lib/extensions/media.js.map +0 -1
- package/lib/extensions/responseArea.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/old-index.js +0 -269
- package/lib/parse-html.js +0 -16
- package/lib/plugins/characters/custom-popper.js +0 -73
- package/lib/plugins/characters/index.js +0 -305
- package/lib/plugins/characters/utils.js +0 -381
- package/lib/plugins/css/icons/index.js +0 -37
- package/lib/plugins/css/index.js +0 -390
- package/lib/plugins/customPlugin/index.js +0 -114
- package/lib/plugins/html/icons/index.js +0 -38
- package/lib/plugins/html/index.js +0 -81
- package/lib/plugins/image/__tests__/component.test.js +0 -51
- package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +0 -56
- package/lib/plugins/image/__tests__/image-toolbar.test.js +0 -26
- package/lib/plugins/image/__tests__/index.test.js +0 -98
- package/lib/plugins/image/__tests__/insert-image-handler.test.js +0 -125
- package/lib/plugins/image/__tests__/mock-change.js +0 -25
- package/lib/plugins/image/alt-dialog.js +0 -129
- package/lib/plugins/image/component.js +0 -419
- package/lib/plugins/image/image-toolbar.js +0 -177
- package/lib/plugins/image/index.js +0 -263
- package/lib/plugins/image/insert-image-handler.js +0 -117
- package/lib/plugins/index.js +0 -341
- package/lib/plugins/list/__tests__/index.test.js +0 -79
- package/lib/plugins/list/index.js +0 -334
- package/lib/plugins/math/__tests__/index.test.js +0 -300
- package/lib/plugins/math/index.js +0 -454
- package/lib/plugins/media/__tests__/index.test.js +0 -71
- package/lib/plugins/media/index.js +0 -387
- package/lib/plugins/media/media-dialog.js +0 -709
- package/lib/plugins/media/media-toolbar.js +0 -101
- package/lib/plugins/media/media-wrapper.js +0 -93
- package/lib/plugins/rendering/index.js +0 -46
- package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -289
- package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -94
- package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -120
- package/lib/plugins/respArea/icons/index.js +0 -95
- package/lib/plugins/respArea/index.js +0 -341
- package/lib/plugins/respArea/inline-dropdown/index.js +0 -126
- package/lib/plugins/respArea/math-templated/index.js +0 -130
- package/lib/plugins/respArea/utils.js +0 -125
- package/lib/plugins/table/CustomTablePlugin.js +0 -133
- package/lib/plugins/table/__tests__/index.test.js +0 -442
- package/lib/plugins/table/__tests__/table-toolbar.test.js +0 -54
- package/lib/plugins/table/icons/index.js +0 -69
- package/lib/plugins/table/index.js +0 -483
- package/lib/plugins/table/table-toolbar.js +0 -187
- package/lib/plugins/textAlign/icons/index.js +0 -194
- package/lib/plugins/textAlign/index.js +0 -34
- package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +0 -128
- package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +0 -51
- package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +0 -54
- package/lib/plugins/toolbar/__tests__/toolbar.test.js +0 -120
- package/lib/plugins/toolbar/default-toolbar.js +0 -229
- package/lib/plugins/toolbar/done-button.js +0 -53
- package/lib/plugins/toolbar/editor-and-toolbar.js +0 -286
- package/lib/plugins/toolbar/index.js +0 -34
- package/lib/plugins/toolbar/toolbar-buttons.js +0 -194
- package/lib/plugins/toolbar/toolbar.js +0 -376
- package/lib/plugins/utils.js +0 -62
- package/lib/serialization.js +0 -677
- package/lib/shared/alert-dialog.js +0 -75
- package/lib/styles/editorContainerStyles.js.map +0 -1
- package/lib/theme.js.map +0 -1
- package/lib/utils/size.js.map +0 -1
|
@@ -1,454 +0,0 @@
|
|
|
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 < sign instead
|
|
255
|
-
*/
|
|
256
|
-
return input.replace(/<([a-zA-Z]*)/g, '<$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>⁡</mo> and <mo ...>⁡</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(?: [^>]*)?>⁡<\/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(' ', ' ');
|
|
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==
|
|
@@ -1,71 +0,0 @@
|
|
|
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==
|