@pie-lib/mask-markup 2.0.0-beta.1 → 2.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +1 -871
- package/CHANGELOG.md +434 -32
- package/LICENSE.md +5 -0
- package/NEXT.CHANGELOG.json +1 -0
- package/lib/choices/choice.js +101 -129
- package/lib/choices/choice.js.map +1 -1
- package/lib/choices/index.js +28 -48
- package/lib/choices/index.js.map +1 -1
- package/lib/componentize.js +2 -6
- package/lib/componentize.js.map +1 -1
- package/lib/components/blank.js +315 -246
- package/lib/components/blank.js.map +1 -1
- package/lib/components/correct-input.js +47 -66
- package/lib/components/correct-input.js.map +1 -1
- package/lib/components/dropdown.js +399 -156
- package/lib/components/dropdown.js.map +1 -1
- package/lib/components/input.js +15 -19
- package/lib/components/input.js.map +1 -1
- package/lib/constructed-response.js +81 -28
- package/lib/constructed-response.js.map +1 -1
- package/lib/customizable.js +44 -0
- package/lib/customizable.js.map +1 -0
- package/lib/drag-in-the-blank.js +160 -96
- package/lib/drag-in-the-blank.js.map +1 -1
- package/lib/index.js +8 -7
- package/lib/index.js.map +1 -1
- package/lib/inline-dropdown.js +10 -14
- package/lib/inline-dropdown.js.map +1 -1
- package/lib/mask.js +93 -101
- package/lib/mask.js.map +1 -1
- package/lib/serialization.js +36 -81
- package/lib/serialization.js.map +1 -1
- package/lib/with-mask.js +53 -49
- package/lib/with-mask.js.map +1 -1
- package/package.json +26 -15
- package/src/__tests__/drag-in-the-blank.test.js +111 -0
- package/src/__tests__/index.test.js +39 -0
- package/src/__tests__/mask.test.js +187 -0
- package/src/__tests__/serialization.test.js +54 -0
- package/src/__tests__/utils.js +1 -0
- package/src/__tests__/with-mask.test.js +76 -0
- package/src/choices/__tests__/index.test.js +75 -0
- package/src/choices/choice.jsx +84 -83
- package/src/choices/index.jsx +25 -15
- package/src/components/__tests__/blank.test.js +138 -0
- package/src/components/__tests__/correct-input.test.js +90 -0
- package/src/components/__tests__/dropdown.test.js +93 -0
- package/src/components/__tests__/input.test.js +102 -0
- package/src/components/blank.jsx +319 -195
- package/src/components/correct-input.jsx +45 -46
- package/src/components/dropdown.jsx +374 -139
- package/src/components/input.jsx +6 -3
- package/src/constructed-response.jsx +81 -18
- package/src/customizable.jsx +35 -0
- package/src/drag-in-the-blank.jsx +159 -47
- package/src/index.js +3 -1
- package/src/inline-dropdown.jsx +6 -3
- package/src/mask.jsx +75 -30
- package/src/serialization.js +37 -44
- package/src/with-mask.jsx +36 -3
- package/README.md +0 -14
- package/lib/new-serialization.js +0 -320
- package/lib/parse-html.js +0 -16
- package/lib/test-serializer.js +0 -215
- package/src/new-serialization.jsx +0 -291
- package/src/parse-html.js +0 -8
- package/src/test-serializer.js +0 -163
package/lib/test-serializer.js
DELETED
|
@@ -1,215 +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["default"] = void 0;
|
|
9
|
-
|
|
10
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
11
|
-
|
|
12
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
-
|
|
14
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
-
|
|
16
|
-
var _react = _interopRequireDefault(require("react"));
|
|
17
|
-
|
|
18
|
-
var _server = _interopRequireDefault(require("react-dom/server"));
|
|
19
|
-
|
|
20
|
-
var _escapeHtml = _interopRequireDefault(require("escape-html"));
|
|
21
|
-
|
|
22
|
-
var _slate = require("slate");
|
|
23
|
-
|
|
24
|
-
var _slateHyperscript = require("slate-hyperscript");
|
|
25
|
-
|
|
26
|
-
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; }
|
|
27
|
-
|
|
28
|
-
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; }
|
|
29
|
-
|
|
30
|
-
function allWhitespace(node) {
|
|
31
|
-
// Use ECMA-262 Edition 3 String and RegExp features
|
|
32
|
-
return !/[^\t\n\r ]/.test(node.textContent);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function defaultParseHtml(html) {
|
|
36
|
-
if (typeof DOMParser === 'undefined') {
|
|
37
|
-
throw new Error('The native `DOMParser` global which the `Html` serializer uses by default is not present in this environment. You must supply the `options.parseHtml` function instead.');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
var parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
41
|
-
var body = parsed.body;
|
|
42
|
-
var textNodes = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, null);
|
|
43
|
-
var n = textNodes.nextNode();
|
|
44
|
-
|
|
45
|
-
while (n) {
|
|
46
|
-
if (allWhitespace(n) || n.nodeValue === "\u200B") {
|
|
47
|
-
n.parentNode.removeChild(n);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
n = textNodes.nextNode();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return body;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
var Html = /*#__PURE__*/(0, _createClass2["default"])(function Html(props) {
|
|
57
|
-
var _this = this;
|
|
58
|
-
|
|
59
|
-
(0, _classCallCheck2["default"])(this, Html);
|
|
60
|
-
(0, _defineProperty2["default"])(this, "serializeEls", function (node) {
|
|
61
|
-
if (_slate.Text.isText(node)) {
|
|
62
|
-
var string = (0, _escapeHtml["default"])(node.text);
|
|
63
|
-
|
|
64
|
-
if (node.bold) {
|
|
65
|
-
string = /*#__PURE__*/_react["default"].createElement("strong", null, string);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return string;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
var children = (node.children || []).map(function (n) {
|
|
72
|
-
return _this.serializeEls(n);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
var correctRule = _this.rules.reduce(function (res, rule) {
|
|
76
|
-
return res || rule.serialize(node, children);
|
|
77
|
-
}, null);
|
|
78
|
-
|
|
79
|
-
if (correctRule) {
|
|
80
|
-
return correctRule;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
switch (node.type) {
|
|
84
|
-
case 'quote':
|
|
85
|
-
return /*#__PURE__*/_react["default"].createElement("blockquote", null, /*#__PURE__*/_react["default"].createElement("p", null, children));
|
|
86
|
-
|
|
87
|
-
case 'paragraph':
|
|
88
|
-
return /*#__PURE__*/_react["default"].createElement("p", null, children);
|
|
89
|
-
|
|
90
|
-
case 'link':
|
|
91
|
-
return /*#__PURE__*/_react["default"].createElement("a", {
|
|
92
|
-
href: (0, _escapeHtml["default"])(node.url)
|
|
93
|
-
}, children);
|
|
94
|
-
|
|
95
|
-
default:
|
|
96
|
-
return children;
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
(0, _defineProperty2["default"])(this, "serialize", function (node) {
|
|
100
|
-
var deserialized = _this.serializeEls(node);
|
|
101
|
-
|
|
102
|
-
var html = _server["default"].renderToStaticMarkup( /*#__PURE__*/_react["default"].createElement('body', null, deserialized));
|
|
103
|
-
|
|
104
|
-
var inner = html.slice(6, -7);
|
|
105
|
-
return inner;
|
|
106
|
-
});
|
|
107
|
-
(0, _defineProperty2["default"])(this, "deserialize", function (html) {
|
|
108
|
-
var body = _this.parseHtml(html);
|
|
109
|
-
|
|
110
|
-
if (body.firstChild && body.firstChild.nodeType === Node.TEXT_NODE) {
|
|
111
|
-
body = _this.parseHtml("<p>".concat(html, "</p>"));
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return _this.deserializeEls(body);
|
|
115
|
-
});
|
|
116
|
-
(0, _defineProperty2["default"])(this, "deserializeEls", function (element) {
|
|
117
|
-
var markAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
118
|
-
|
|
119
|
-
if (element.nodeType === Node.TEXT_NODE) {
|
|
120
|
-
return (0, _slateHyperscript.jsx)('text', markAttributes, element.textContent);
|
|
121
|
-
} else if (element.nodeType !== Node.ELEMENT_NODE) {
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
var nodeAttributes = _objectSpread({}, markAttributes); // define attributes for text nodes
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (element.nodeName === 'STRONG') {
|
|
129
|
-
nodeAttributes.bold = true;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
var nextFn = function nextFn(nodes) {
|
|
133
|
-
var childNodes = Array.from(nodes);
|
|
134
|
-
var children = Array.from(childNodes).map(function (node) {
|
|
135
|
-
return _this.deserializeEls(node, nodeAttributes);
|
|
136
|
-
}).flat();
|
|
137
|
-
|
|
138
|
-
if (children.length === 0) {
|
|
139
|
-
children.push((0, _slateHyperscript.jsx)('text', nodeAttributes, ''));
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
return children;
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
var correctRule = _this.rules.reduce(function (res, rule) {
|
|
146
|
-
return res || rule.deserialize(element, nextFn);
|
|
147
|
-
}, null);
|
|
148
|
-
|
|
149
|
-
if (correctRule) {
|
|
150
|
-
return correctRule;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
var childNodes = Array.from(element.childNodes);
|
|
154
|
-
var children = Array.from(childNodes).map(function (node) {
|
|
155
|
-
return _this.deserializeEls(node, nodeAttributes);
|
|
156
|
-
}).flat();
|
|
157
|
-
|
|
158
|
-
if (children.length === 0) {
|
|
159
|
-
children.push((0, _slateHyperscript.jsx)('text', nodeAttributes, ''));
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
switch (element.nodeName) {
|
|
163
|
-
case 'TABLE':
|
|
164
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
165
|
-
type: 'table'
|
|
166
|
-
}, children);
|
|
167
|
-
|
|
168
|
-
case 'TBODY':
|
|
169
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
170
|
-
type: 'tbody'
|
|
171
|
-
}, children);
|
|
172
|
-
|
|
173
|
-
case 'TR':
|
|
174
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
175
|
-
type: 'tr'
|
|
176
|
-
}, children);
|
|
177
|
-
|
|
178
|
-
case 'TD':
|
|
179
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
180
|
-
type: 'td'
|
|
181
|
-
}, children);
|
|
182
|
-
|
|
183
|
-
case 'BODY':
|
|
184
|
-
return (0, _slateHyperscript.jsx)('fragment', {}, children);
|
|
185
|
-
|
|
186
|
-
case 'BR':
|
|
187
|
-
return '\n';
|
|
188
|
-
|
|
189
|
-
case 'BLOCKQUOTE':
|
|
190
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
191
|
-
type: 'quote'
|
|
192
|
-
}, children);
|
|
193
|
-
|
|
194
|
-
case 'P':
|
|
195
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
196
|
-
type: 'paragraph'
|
|
197
|
-
}, children);
|
|
198
|
-
|
|
199
|
-
case 'A':
|
|
200
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
201
|
-
type: 'link',
|
|
202
|
-
url: element.getAttribute('href')
|
|
203
|
-
}, children);
|
|
204
|
-
|
|
205
|
-
default:
|
|
206
|
-
return children;
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
this.defaultBlock = props.defaultBlock;
|
|
210
|
-
this.parseHtml = defaultParseHtml;
|
|
211
|
-
this.rules = props.rules;
|
|
212
|
-
});
|
|
213
|
-
var _default = Html;
|
|
214
|
-
exports["default"] = _default;
|
|
215
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhbGxXaGl0ZXNwYWNlIiwibm9kZSIsInRlc3QiLCJ0ZXh0Q29udGVudCIsImRlZmF1bHRQYXJzZUh0bWwiLCJodG1sIiwiRE9NUGFyc2VyIiwiRXJyb3IiLCJwYXJzZWQiLCJwYXJzZUZyb21TdHJpbmciLCJib2R5IiwidGV4dE5vZGVzIiwiZG9jdW1lbnQiLCJjcmVhdGVUcmVlV2Fsa2VyIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsIm4iLCJuZXh0Tm9kZSIsIm5vZGVWYWx1ZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIkh0bWwiLCJwcm9wcyIsIlRleHQiLCJpc1RleHQiLCJzdHJpbmciLCJlc2NhcGVIdG1sIiwidGV4dCIsImJvbGQiLCJjaGlsZHJlbiIsIm1hcCIsInNlcmlhbGl6ZUVscyIsImNvcnJlY3RSdWxlIiwicnVsZXMiLCJyZWR1Y2UiLCJyZXMiLCJydWxlIiwic2VyaWFsaXplIiwidHlwZSIsInVybCIsImRlc2VyaWFsaXplZCIsIlJlYWN0U2VydmVyIiwicmVuZGVyVG9TdGF0aWNNYXJrdXAiLCJSZWFjdCIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lciIsInNsaWNlIiwicGFyc2VIdG1sIiwiZmlyc3RDaGlsZCIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsImRlc2VyaWFsaXplRWxzIiwiZWxlbWVudCIsIm1hcmtBdHRyaWJ1dGVzIiwianN4IiwiRUxFTUVOVF9OT0RFIiwibm9kZUF0dHJpYnV0ZXMiLCJub2RlTmFtZSIsIm5leHRGbiIsIm5vZGVzIiwiY2hpbGROb2RlcyIsIkFycmF5IiwiZnJvbSIsImZsYXQiLCJsZW5ndGgiLCJwdXNoIiwiZGVzZXJpYWxpemUiLCJnZXRBdHRyaWJ1dGUiLCJkZWZhdWx0QmxvY2siXSwic291cmNlcyI6WyIuLi9zcmMvdGVzdC1zZXJpYWxpemVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RTZXJ2ZXIgZnJvbSAncmVhY3QtZG9tL3NlcnZlcic7XG5pbXBvcnQgZXNjYXBlSHRtbCBmcm9tICdlc2NhcGUtaHRtbCc7XG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsganN4IH0gZnJvbSAnc2xhdGUtaHlwZXJzY3JpcHQnO1xuXG5mdW5jdGlvbiBhbGxXaGl0ZXNwYWNlKG5vZGUpIHtcbiAgLy8gVXNlIEVDTUEtMjYyIEVkaXRpb24gMyBTdHJpbmcgYW5kIFJlZ0V4cCBmZWF0dXJlc1xuICByZXR1cm4gIS9bXlxcdFxcblxcciBdLy50ZXN0KG5vZGUudGV4dENvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0UGFyc2VIdG1sKGh0bWwpIHtcbiAgaWYgKHR5cGVvZiBET01QYXJzZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1RoZSBuYXRpdmUgYERPTVBhcnNlcmAgZ2xvYmFsIHdoaWNoIHRoZSBgSHRtbGAgc2VyaWFsaXplciB1c2VzIGJ5IGRlZmF1bHQgaXMgbm90IHByZXNlbnQgaW4gdGhpcyBlbnZpcm9ubWVudC4gWW91IG11c3Qgc3VwcGx5IHRoZSBgb3B0aW9ucy5wYXJzZUh0bWxgIGZ1bmN0aW9uIGluc3RlYWQuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcblxuICBjb25zdCB7IGJvZHkgfSA9IHBhcnNlZDtcbiAgY29uc3QgdGV4dE5vZGVzID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihib2R5LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgbnVsbCk7XG4gIGxldCBuID0gdGV4dE5vZGVzLm5leHROb2RlKCk7XG5cbiAgd2hpbGUgKG4pIHtcbiAgICBpZiAoYWxsV2hpdGVzcGFjZShuKSB8fCBuLm5vZGVWYWx1ZSA9PT0gJ1xcdTIwMEInKSB7XG4gICAgICBuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7XG4gICAgfVxuICAgIG4gPSB0ZXh0Tm9kZXMubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBib2R5O1xufVxuXG5jbGFzcyBIdG1sIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICB0aGlzLmRlZmF1bHRCbG9jayA9IHByb3BzLmRlZmF1bHRCbG9jaztcbiAgICB0aGlzLnBhcnNlSHRtbCA9IGRlZmF1bHRQYXJzZUh0bWw7XG4gICAgdGhpcy5ydWxlcyA9IHByb3BzLnJ1bGVzO1xuICB9XG5cbiAgc2VyaWFsaXplRWxzID0gbm9kZSA9PiB7XG4gICAgaWYgKFRleHQuaXNUZXh0KG5vZGUpKSB7XG4gICAgICBsZXQgc3RyaW5nID0gZXNjYXBlSHRtbChub2RlLnRleHQpO1xuICAgICAgaWYgKG5vZGUuYm9sZCkge1xuICAgICAgICBzdHJpbmcgPSA8c3Ryb25nPntzdHJpbmd9PC9zdHJvbmc+O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICBsZXQgY2hpbGRyZW4gPSAobm9kZS5jaGlsZHJlbiB8fCBbXSkubWFwKG4gPT4gdGhpcy5zZXJpYWxpemVFbHMobikpO1xuXG4gICAgY29uc3QgY29ycmVjdFJ1bGUgPSB0aGlzLnJ1bGVzLnJlZHVjZSgocmVzLCBydWxlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzIHx8IHJ1bGUuc2VyaWFsaXplKG5vZGUsIGNoaWxkcmVuKTtcbiAgICB9LCBudWxsKTtcblxuICAgIGlmIChjb3JyZWN0UnVsZSkge1xuICAgICAgcmV0dXJuIGNvcnJlY3RSdWxlO1xuICAgIH1cblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdxdW90ZSc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGJsb2NrcXVvdGU+XG4gICAgICAgICAgICA8cD57Y2hpbGRyZW59PC9wPlxuICAgICAgICAgIDwvYmxvY2txdW90ZT5cbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3BhcmFncmFwaCc6XG4gICAgICAgIHJldHVybiA8cD57Y2hpbGRyZW59PC9wPjtcbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICByZXR1cm4gPGEgaHJlZj17ZXNjYXBlSHRtbChub2RlLnVybCl9PntjaGlsZHJlbn08L2E+O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cbiAgfTtcblxuICBzZXJpYWxpemUgPSBub2RlID0+IHtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZUVscyhub2RlKTtcbiAgICBjb25zdCBodG1sID0gUmVhY3RTZXJ2ZXIucmVuZGVyVG9TdGF0aWNNYXJrdXAoUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICdib2R5JyxcbiAgICAgIG51bGwsXG4gICAgICBkZXNlcmlhbGl6ZWRcbiAgICApKTtcbiAgICBjb25zdCBpbm5lciA9IGh0bWwuc2xpY2UoNiwgLTcpO1xuICAgIHJldHVybiBpbm5lcjtcbiAgfTtcblxuICBkZXNlcmlhbGl6ZSA9IGh0bWwgPT4ge1xuICAgIGxldCBib2R5ID0gdGhpcy5wYXJzZUh0bWwoaHRtbCk7XG5cbiAgICBpZiAoYm9keS5maXJzdENoaWxkICYmIGJvZHkuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgIGJvZHkgPSB0aGlzLnBhcnNlSHRtbChgPHA+JHtodG1sfTwvcD5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZUVscyhib2R5KTtcbiAgfTtcblxuICBkZXNlcmlhbGl6ZUVscyA9IChlbGVtZW50LCBtYXJrQXR0cmlidXRlcyA9IHt9KSA9PiB7XG4gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICByZXR1cm4ganN4KCd0ZXh0JywgbWFya0F0dHJpYnV0ZXMsIGVsZW1lbnQudGV4dENvbnRlbnQpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVBdHRyaWJ1dGVzID0geyAuLi5tYXJrQXR0cmlidXRlcyB9O1xuXG4gICAgLy8gZGVmaW5lIGF0dHJpYnV0ZXMgZm9yIHRleHQgbm9kZXNcbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1NUUk9ORycpIHtcbiAgICAgIG5vZGVBdHRyaWJ1dGVzLmJvbGQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRGbiA9IG5vZGVzID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBBcnJheS5mcm9tKG5vZGVzKTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShjaGlsZE5vZGVzKVxuICAgICAgICAubWFwKG5vZGUgPT4gdGhpcy5kZXNlcmlhbGl6ZUVscyhub2RlLCBub2RlQXR0cmlidXRlcykpXG4gICAgICAgIC5mbGF0KCk7XG5cbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChqc3goJ3RleHQnLCBub2RlQXR0cmlidXRlcywgJycpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH07XG5cbiAgICBjb25zdCBjb3JyZWN0UnVsZSA9IHRoaXMucnVsZXMucmVkdWNlKChyZXMsIHJ1bGUpID0+IHtcbiAgICAgIHJldHVybiByZXMgfHwgcnVsZS5kZXNlcmlhbGl6ZShlbGVtZW50LCBuZXh0Rm4pO1xuICAgIH0sIG51bGwpO1xuXG4gICAgaWYgKGNvcnJlY3RSdWxlKSB7XG4gICAgICByZXR1cm4gY29ycmVjdFJ1bGU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oY2hpbGROb2RlcylcbiAgICAgIC5tYXAobm9kZSA9PiB0aGlzLmRlc2VyaWFsaXplRWxzKG5vZGUsIG5vZGVBdHRyaWJ1dGVzKSlcbiAgICAgIC5mbGF0KCk7XG5cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGpzeCgndGV4dCcsIG5vZGVBdHRyaWJ1dGVzLCAnJykpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZWxlbWVudC5ub2RlTmFtZSkge1xuICAgICAgY2FzZSAnVEFCTEUnOlxuICAgICAgICByZXR1cm4ganN4KCdlbGVtZW50JywgeyB0eXBlOiAndGFibGUnIH0sIGNoaWxkcmVuKTtcbiAgICAgIGNhc2UgJ1RCT0RZJzpcbiAgICAgICAgcmV0dXJuIGpzeCgnZWxlbWVudCcsIHsgdHlwZTogJ3Rib2R5JyB9LCBjaGlsZHJlbik7XG4gICAgICBjYXNlICdUUic6XG4gICAgICAgIHJldHVybiBqc3goJ2VsZW1lbnQnLCB7IHR5cGU6ICd0cicgfSwgY2hpbGRyZW4pO1xuICAgICAgY2FzZSAnVEQnOlxuICAgICAgICByZXR1cm4ganN4KCdlbGVtZW50JywgeyB0eXBlOiAndGQnIH0sIGNoaWxkcmVuKTtcbiAgICAgIGNhc2UgJ0JPRFknOlxuICAgICAgICByZXR1cm4ganN4KCdmcmFnbWVudCcsIHt9LCBjaGlsZHJlbik7XG4gICAgICBjYXNlICdCUic6XG4gICAgICAgIHJldHVybiAnXFxuJztcbiAgICAgIGNhc2UgJ0JMT0NLUVVPVEUnOlxuICAgICAgICByZXR1cm4ganN4KCdlbGVtZW50JywgeyB0eXBlOiAncXVvdGUnIH0sIGNoaWxkcmVuKTtcbiAgICAgIGNhc2UgJ1AnOlxuICAgICAgICByZXR1cm4ganN4KCdlbGVtZW50JywgeyB0eXBlOiAncGFyYWdyYXBoJyB9LCBjaGlsZHJlbik7XG4gICAgICBjYXNlICdBJzpcbiAgICAgICAgcmV0dXJuIGpzeCgnZWxlbWVudCcsIHsgdHlwZTogJ2xpbmsnLCB1cmw6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJykgfSwgY2hpbGRyZW4pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJu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
|
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
import TestSerializer from './test-serializer';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import debug from 'debug';
|
|
4
|
-
import { object as toStyleObject } from 'to-style';
|
|
5
|
-
|
|
6
|
-
import { serialization as imgSerialization } from './plugins/image';
|
|
7
|
-
import { serialization as mathSerialization } from './plugins/math';
|
|
8
|
-
import { serialization as mediaSerialization } from './plugins/media';
|
|
9
|
-
import { serialization as listSerialization } from './plugins/list';
|
|
10
|
-
import { serialization as tableSerialization } from './plugins/table';
|
|
11
|
-
import { serialization as responseAreaSerialization } from './plugins/respArea';
|
|
12
|
-
import { Mark, Value } from 'slate';
|
|
13
|
-
import { jsx } from 'slate-hyperscript';
|
|
14
|
-
|
|
15
|
-
const log = debug('@pie-lib:editable-html:serialization');
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Tags to blocks.
|
|
19
|
-
*
|
|
20
|
-
* @type {Object}
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
export const BLOCK_TAGS = {
|
|
24
|
-
div: 'div',
|
|
25
|
-
span: 'span',
|
|
26
|
-
p: 'paragraph',
|
|
27
|
-
blockquote: 'quote',
|
|
28
|
-
pre: 'code',
|
|
29
|
-
h1: 'heading-one',
|
|
30
|
-
h2: 'heading-two',
|
|
31
|
-
h3: 'heading-three',
|
|
32
|
-
h4: 'heading-four',
|
|
33
|
-
h5: 'heading-five',
|
|
34
|
-
h6: 'heading-six'
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Tags to marks.
|
|
39
|
-
*
|
|
40
|
-
* @type {Object}
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
const MARK_TAGS = {
|
|
44
|
-
b: 'bold',
|
|
45
|
-
em: 'italic',
|
|
46
|
-
u: 'underline',
|
|
47
|
-
s: 'strikethrough',
|
|
48
|
-
code: 'code',
|
|
49
|
-
strong: 'bold'
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
export const parseStyleString = s => {
|
|
53
|
-
const regex = /([\w-]*)\s*:\s*([^;]*)/g;
|
|
54
|
-
let match;
|
|
55
|
-
const result = {};
|
|
56
|
-
while ((match = regex.exec(s))) {
|
|
57
|
-
result[match[1]] = match[2].trim();
|
|
58
|
-
}
|
|
59
|
-
return result;
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export const getBase64 = file => {
|
|
63
|
-
return new Promise((resolve, reject) => {
|
|
64
|
-
const reader = new FileReader();
|
|
65
|
-
reader.readAsDataURL(file);
|
|
66
|
-
reader.onload = () => resolve(reader.result);
|
|
67
|
-
reader.onerror = error => reject(error);
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export const reactAttributes = o => toStyleObject(o, { camelize: true, addUnits: false });
|
|
72
|
-
|
|
73
|
-
const attributesToMap = el => (acc, attribute) => {
|
|
74
|
-
const value = el.getAttribute(attribute);
|
|
75
|
-
if (value) {
|
|
76
|
-
if (attribute === 'style') {
|
|
77
|
-
const styleString = el.getAttribute(attribute);
|
|
78
|
-
const reactStyleObject = reactAttributes(parseStyleString(styleString));
|
|
79
|
-
acc['style'] = reactStyleObject;
|
|
80
|
-
} else {
|
|
81
|
-
acc[attribute] = el.getAttribute(attribute);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return acc;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const attributes = ['border', 'cellpadding', 'cellspacing', 'class', 'style'];
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Serializer rules.
|
|
91
|
-
*
|
|
92
|
-
* @type {Array}
|
|
93
|
-
*/
|
|
94
|
-
|
|
95
|
-
const blocks = {
|
|
96
|
-
deserialize(el, next) {
|
|
97
|
-
log('[blocks:deserialize] block: ', el);
|
|
98
|
-
const block = BLOCK_TAGS[el.tagName.toLowerCase()];
|
|
99
|
-
if (!block) return;
|
|
100
|
-
log('[blocks:deserialize] block: ', block);
|
|
101
|
-
|
|
102
|
-
if (el.childNodes.length === 1) {
|
|
103
|
-
const cn = el.childNodes[0];
|
|
104
|
-
if (cn && cn.tagName && cn.tagName.toLowerCase() === block) {
|
|
105
|
-
log('[we have a child node of the same]...');
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return jsx(
|
|
111
|
-
'element',
|
|
112
|
-
{
|
|
113
|
-
type: block,
|
|
114
|
-
/**
|
|
115
|
-
* Here for rendering styles for all block elements
|
|
116
|
-
*/
|
|
117
|
-
data: { attributes: attributes.reduce(attributesToMap(el), {}) }
|
|
118
|
-
},
|
|
119
|
-
next(el.childNodes)
|
|
120
|
-
);
|
|
121
|
-
},
|
|
122
|
-
serialize: (object, children) => {
|
|
123
|
-
if (object.object !== 'block') return;
|
|
124
|
-
|
|
125
|
-
const jsonData = object.data.toJSON();
|
|
126
|
-
|
|
127
|
-
log('[blocks:serialize] object: ', object, children);
|
|
128
|
-
let key;
|
|
129
|
-
|
|
130
|
-
for (key in BLOCK_TAGS) {
|
|
131
|
-
if (BLOCK_TAGS[key] === object.type) {
|
|
132
|
-
const Tag = key;
|
|
133
|
-
|
|
134
|
-
return <Tag {...jsonData.attributes}>{children}</Tag>;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
const marks = {
|
|
141
|
-
deserialize(el, next) {
|
|
142
|
-
const mark = MARK_TAGS[el.tagName.toLowerCase()];
|
|
143
|
-
if (!mark) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
log('[deserialize] mark: ', mark);
|
|
147
|
-
|
|
148
|
-
return jsx('element', { type: mark }, next(el.childNodes));
|
|
149
|
-
},
|
|
150
|
-
serialize(object, children) {
|
|
151
|
-
/*if (Mark.isMark(object)) {
|
|
152
|
-
for (var key in MARK_TAGS) {
|
|
153
|
-
if (MARK_TAGS[key] === object.type) {
|
|
154
|
-
const Tag = key;
|
|
155
|
-
return <Tag>{children}</Tag>;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}*/
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
const findPreviousText = el => {
|
|
163
|
-
if (el.nodeName === '#text') {
|
|
164
|
-
return el;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
if (el.previousSibling) {
|
|
168
|
-
return findPreviousText(el.previousSibling);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return null;
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
export const TEXT_RULE = {
|
|
175
|
-
deserialize(el) {
|
|
176
|
-
/**
|
|
177
|
-
* This needs to be called on the dom element in order to merge the adjacent text nodes together
|
|
178
|
-
* */
|
|
179
|
-
el.normalize();
|
|
180
|
-
|
|
181
|
-
if (el.tagName && el.tagName.toLowerCase() === 'br') {
|
|
182
|
-
return jsx('text', {});
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (el.nodeName === '#text') {
|
|
186
|
-
if (el.nodeValue && el.nodeValue.match(/<!--.*?-->/)) return;
|
|
187
|
-
|
|
188
|
-
log('[text:deserialize] return text object..');
|
|
189
|
-
return jsx('text', {}, el.nodeValue);
|
|
190
|
-
}
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
serialize(obj, children) {
|
|
194
|
-
if (obj.object === 'string') {
|
|
195
|
-
return children.split('\n').reduce((array, text, i) => {
|
|
196
|
-
if (i !== 0) array.push(<br />);
|
|
197
|
-
array.push(text);
|
|
198
|
-
return array;
|
|
199
|
-
}, []);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
const RULES = [
|
|
205
|
-
listSerialization,
|
|
206
|
-
mathSerialization,
|
|
207
|
-
mediaSerialization,
|
|
208
|
-
imgSerialization,
|
|
209
|
-
tableSerialization,
|
|
210
|
-
responseAreaSerialization,
|
|
211
|
-
TEXT_RULE,
|
|
212
|
-
blocks,
|
|
213
|
-
marks
|
|
214
|
-
];
|
|
215
|
-
|
|
216
|
-
function allWhitespace(node) {
|
|
217
|
-
// Use ECMA-262 Edition 3 String and RegExp features
|
|
218
|
-
return !/[^\t\n\r ]/.test(node.textContent);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
function defaultParseHtml(html) {
|
|
222
|
-
if (typeof DOMParser === 'undefined') {
|
|
223
|
-
throw new Error(
|
|
224
|
-
'The native `DOMParser` global which the `Html` serializer uses by default is not present in this environment. You must supply the `options.parseHtml` function instead.'
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
const parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
229
|
-
|
|
230
|
-
const { body } = parsed;
|
|
231
|
-
const textNodes = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, null);
|
|
232
|
-
let n = textNodes.nextNode();
|
|
233
|
-
|
|
234
|
-
while (n) {
|
|
235
|
-
if (allWhitespace(n) || n.nodeValue === '\u200B') {
|
|
236
|
-
n.parentNode.removeChild(n);
|
|
237
|
-
}
|
|
238
|
-
n = textNodes.nextNode();
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return body;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/** If this lib is used on the server side, we need to bypass using the DOMParser - just put in a stub. */
|
|
245
|
-
const parseHtml =
|
|
246
|
-
typeof window === 'undefined'
|
|
247
|
-
? () => ({
|
|
248
|
-
childNodes: []
|
|
249
|
-
})
|
|
250
|
-
: defaultParseHtml;
|
|
251
|
-
|
|
252
|
-
const serializer = new TestSerializer({
|
|
253
|
-
defaultBlock: 'div',
|
|
254
|
-
rules: RULES,
|
|
255
|
-
parseHtml
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
const _extends =
|
|
259
|
-
Object.assign ||
|
|
260
|
-
function(target) {
|
|
261
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
262
|
-
var source = arguments[i];
|
|
263
|
-
|
|
264
|
-
for (var key in source) {
|
|
265
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
266
|
-
target[key] = source[key];
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
return target;
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
export const htmlToValue = html => {
|
|
275
|
-
try {
|
|
276
|
-
return serializer.deserialize(html);
|
|
277
|
-
} catch (e) {
|
|
278
|
-
console.log("Couldn't parse html: ", e);
|
|
279
|
-
return {};
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
export const valueToHtml = value => serializer.serialize(value);
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
*
|
|
287
|
-
* <div><div>a</div></div> -> <div>a</div>
|
|
288
|
-
*
|
|
289
|
-
* <div><div>a</div><div>b</div></div> -> <div>a</div><div>b</div>
|
|
290
|
-
* <div><div>a</div>4444<div>b</div></div> -> <div>a</div>4444<div>b</div>
|
|
291
|
-
*/
|
package/src/parse-html.js
DELETED
package/src/test-serializer.js
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import ReactServer from 'react-dom/server';
|
|
3
|
-
import escapeHtml from 'escape-html';
|
|
4
|
-
import { Text } from 'slate';
|
|
5
|
-
import { jsx } from 'slate-hyperscript';
|
|
6
|
-
|
|
7
|
-
function allWhitespace(node) {
|
|
8
|
-
// Use ECMA-262 Edition 3 String and RegExp features
|
|
9
|
-
return !/[^\t\n\r ]/.test(node.textContent);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function defaultParseHtml(html) {
|
|
13
|
-
if (typeof DOMParser === 'undefined') {
|
|
14
|
-
throw new Error(
|
|
15
|
-
'The native `DOMParser` global which the `Html` serializer uses by default is not present in this environment. You must supply the `options.parseHtml` function instead.'
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
20
|
-
|
|
21
|
-
const { body } = parsed;
|
|
22
|
-
const textNodes = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, null);
|
|
23
|
-
let n = textNodes.nextNode();
|
|
24
|
-
|
|
25
|
-
while (n) {
|
|
26
|
-
if (allWhitespace(n) || n.nodeValue === '\u200B') {
|
|
27
|
-
n.parentNode.removeChild(n);
|
|
28
|
-
}
|
|
29
|
-
n = textNodes.nextNode();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return body;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
class Html {
|
|
36
|
-
constructor(props) {
|
|
37
|
-
this.defaultBlock = props.defaultBlock;
|
|
38
|
-
this.parseHtml = defaultParseHtml;
|
|
39
|
-
this.rules = props.rules;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
serializeEls = node => {
|
|
43
|
-
if (Text.isText(node)) {
|
|
44
|
-
let string = escapeHtml(node.text);
|
|
45
|
-
if (node.bold) {
|
|
46
|
-
string = <strong>{string}</strong>;
|
|
47
|
-
}
|
|
48
|
-
return string;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
let children = (node.children || []).map(n => this.serializeEls(n));
|
|
52
|
-
|
|
53
|
-
const correctRule = this.rules.reduce((res, rule) => {
|
|
54
|
-
return res || rule.serialize(node, children);
|
|
55
|
-
}, null);
|
|
56
|
-
|
|
57
|
-
if (correctRule) {
|
|
58
|
-
return correctRule;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
switch (node.type) {
|
|
62
|
-
case 'quote':
|
|
63
|
-
return (
|
|
64
|
-
<blockquote>
|
|
65
|
-
<p>{children}</p>
|
|
66
|
-
</blockquote>
|
|
67
|
-
);
|
|
68
|
-
case 'paragraph':
|
|
69
|
-
return <p>{children}</p>;
|
|
70
|
-
case 'link':
|
|
71
|
-
return <a href={escapeHtml(node.url)}>{children}</a>;
|
|
72
|
-
default:
|
|
73
|
-
return children;
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
serialize = node => {
|
|
78
|
-
const deserialized = this.serializeEls(node);
|
|
79
|
-
const html = ReactServer.renderToStaticMarkup(React.createElement('body', null, deserialized));
|
|
80
|
-
const inner = html.slice(6, -7);
|
|
81
|
-
return inner;
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
deserialize = html => {
|
|
85
|
-
let body = this.parseHtml(html);
|
|
86
|
-
|
|
87
|
-
if (body.firstChild && body.firstChild.nodeType === Node.TEXT_NODE) {
|
|
88
|
-
body = this.parseHtml(`<p>${html}</p>`);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return this.deserializeEls(body);
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
deserializeEls = (element, markAttributes = {}) => {
|
|
95
|
-
if (element.nodeType === Node.TEXT_NODE) {
|
|
96
|
-
return jsx('text', markAttributes, element.textContent);
|
|
97
|
-
} else if (element.nodeType !== Node.ELEMENT_NODE) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const nodeAttributes = { ...markAttributes };
|
|
102
|
-
|
|
103
|
-
// define attributes for text nodes
|
|
104
|
-
if (element.nodeName === 'STRONG') {
|
|
105
|
-
nodeAttributes.bold = true;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const nextFn = nodes => {
|
|
109
|
-
const childNodes = Array.from(nodes);
|
|
110
|
-
const children = Array.from(childNodes)
|
|
111
|
-
.map(node => this.deserializeEls(node, nodeAttributes))
|
|
112
|
-
.flat();
|
|
113
|
-
|
|
114
|
-
if (children.length === 0) {
|
|
115
|
-
children.push(jsx('text', nodeAttributes, ''));
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return children;
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
const correctRule = this.rules.reduce((res, rule) => {
|
|
122
|
-
return res || rule.deserialize(element, nextFn);
|
|
123
|
-
}, null);
|
|
124
|
-
|
|
125
|
-
if (correctRule) {
|
|
126
|
-
return correctRule;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const childNodes = Array.from(element.childNodes);
|
|
130
|
-
const children = Array.from(childNodes)
|
|
131
|
-
.map(node => this.deserializeEls(node, nodeAttributes))
|
|
132
|
-
.flat();
|
|
133
|
-
|
|
134
|
-
if (children.length === 0) {
|
|
135
|
-
children.push(jsx('text', nodeAttributes, ''));
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
switch (element.nodeName) {
|
|
139
|
-
case 'TABLE':
|
|
140
|
-
return jsx('element', { type: 'table' }, children);
|
|
141
|
-
case 'TBODY':
|
|
142
|
-
return jsx('element', { type: 'tbody' }, children);
|
|
143
|
-
case 'TR':
|
|
144
|
-
return jsx('element', { type: 'tr' }, children);
|
|
145
|
-
case 'TD':
|
|
146
|
-
return jsx('element', { type: 'td' }, children);
|
|
147
|
-
case 'BODY':
|
|
148
|
-
return jsx('fragment', {}, children);
|
|
149
|
-
case 'BR':
|
|
150
|
-
return '\n';
|
|
151
|
-
case 'BLOCKQUOTE':
|
|
152
|
-
return jsx('element', { type: 'quote' }, children);
|
|
153
|
-
case 'P':
|
|
154
|
-
return jsx('element', { type: 'paragraph' }, children);
|
|
155
|
-
case 'A':
|
|
156
|
-
return jsx('element', { type: 'link', url: element.getAttribute('href') }, children);
|
|
157
|
-
default:
|
|
158
|
-
return children;
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export default Html;
|