@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/src/serialization.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { jsx } from 'slate-hyperscript';
|
|
1
|
+
import Html from 'slate-html-serializer';
|
|
3
2
|
import { object as toStyleObject } from 'to-style';
|
|
4
3
|
import debug from 'debug';
|
|
5
4
|
|
|
6
|
-
import Html from './test-serializer';
|
|
7
|
-
|
|
8
5
|
const log = debug('@pie-lib:mask-markup:serialization');
|
|
9
6
|
|
|
10
7
|
const INLINE = ['span'];
|
|
@@ -12,7 +9,7 @@ const MARK = ['em', 'strong', 'u'];
|
|
|
12
9
|
const TEXT_NODE = 3;
|
|
13
10
|
const COMMENT_NODE = 8;
|
|
14
11
|
|
|
15
|
-
const attr = el => {
|
|
12
|
+
const attr = (el) => {
|
|
16
13
|
if (!el.attributes || el.attributes.length <= 0) {
|
|
17
14
|
return undefined;
|
|
18
15
|
}
|
|
@@ -29,7 +26,7 @@ const attr = el => {
|
|
|
29
26
|
return out;
|
|
30
27
|
};
|
|
31
28
|
|
|
32
|
-
const getObject = type => {
|
|
29
|
+
const getObject = (type) => {
|
|
33
30
|
if (INLINE.includes(type)) {
|
|
34
31
|
return 'inline';
|
|
35
32
|
} else if (MARK.includes(type)) {
|
|
@@ -38,7 +35,7 @@ const getObject = type => {
|
|
|
38
35
|
return 'block';
|
|
39
36
|
};
|
|
40
37
|
|
|
41
|
-
export const parseStyleString = s => {
|
|
38
|
+
export const parseStyleString = (s) => {
|
|
42
39
|
const regex = /([\w-]*)\s*:\s*([^;]*)/g;
|
|
43
40
|
let match;
|
|
44
41
|
const result = {};
|
|
@@ -48,7 +45,7 @@ export const parseStyleString = s => {
|
|
|
48
45
|
return result;
|
|
49
46
|
};
|
|
50
47
|
|
|
51
|
-
export const reactAttributes = o => toStyleObject(o, { camelize: true, addUnits: false });
|
|
48
|
+
export const reactAttributes = (o) => toStyleObject(o, { camelize: true, addUnits: false });
|
|
52
49
|
|
|
53
50
|
const handleStyles = (el, attribute) => {
|
|
54
51
|
const styleString = el.getAttribute(attribute);
|
|
@@ -64,7 +61,7 @@ const handleClass = (el, acc, attribute) => {
|
|
|
64
61
|
return classNames;
|
|
65
62
|
};
|
|
66
63
|
|
|
67
|
-
const attributesToMap = el => (acc, attribute) => {
|
|
64
|
+
const attributesToMap = (el) => (acc, attribute) => {
|
|
68
65
|
if (!el.getAttribute) {
|
|
69
66
|
return acc;
|
|
70
67
|
}
|
|
@@ -102,20 +99,20 @@ export const MARK_TAGS = {
|
|
|
102
99
|
u: 'underline',
|
|
103
100
|
s: 'strikethrough',
|
|
104
101
|
code: 'code',
|
|
105
|
-
strong: 'strong'
|
|
102
|
+
strong: 'strong',
|
|
106
103
|
};
|
|
107
104
|
|
|
108
105
|
const marks = {
|
|
109
106
|
deserialize(el, next) {
|
|
110
107
|
const mark = MARK_TAGS[el.tagName.toLowerCase()];
|
|
111
|
-
|
|
112
|
-
if (!mark) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
|
|
108
|
+
if (!mark) return;
|
|
116
109
|
log('[deserialize] mark: ', mark);
|
|
117
|
-
return
|
|
118
|
-
|
|
110
|
+
return {
|
|
111
|
+
object: 'mark',
|
|
112
|
+
type: mark,
|
|
113
|
+
nodes: next(el.childNodes),
|
|
114
|
+
};
|
|
115
|
+
},
|
|
119
116
|
};
|
|
120
117
|
|
|
121
118
|
const rules = [
|
|
@@ -130,42 +127,38 @@ const rules = [
|
|
|
130
127
|
}
|
|
131
128
|
|
|
132
129
|
if (el.nodeType === TEXT_NODE) {
|
|
133
|
-
return
|
|
130
|
+
return {
|
|
131
|
+
object: 'text',
|
|
132
|
+
leaves: [{ text: el.textContent }],
|
|
133
|
+
};
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
const type = el.tagName.toLowerCase();
|
|
137
137
|
|
|
138
138
|
const normalAttrs = attr(el) || {};
|
|
139
|
-
const allAttrs = attributes.reduce(attributesToMap(el), { ...normalAttrs });
|
|
140
139
|
|
|
141
|
-
if (
|
|
142
|
-
|
|
143
|
-
type: 'mathml',
|
|
144
|
-
data: {
|
|
145
|
-
html: el.innerHTML
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// return {
|
|
150
|
-
// isMath: true,
|
|
151
|
-
// nodes: [el]
|
|
152
|
-
// };
|
|
140
|
+
if (type == 'audio' && normalAttrs.controls == '') {
|
|
141
|
+
normalAttrs.controls = true;
|
|
153
142
|
}
|
|
154
143
|
|
|
155
|
-
|
|
156
|
-
|
|
144
|
+
const allAttrs = attributes.reduce(attributesToMap(el), { ...normalAttrs });
|
|
145
|
+
const object = getObject(type);
|
|
146
|
+
|
|
147
|
+
if (el.tagName.toLowerCase() === 'math') {
|
|
148
|
+
return {
|
|
149
|
+
isMath: true,
|
|
150
|
+
nodes: [el],
|
|
151
|
+
};
|
|
157
152
|
}
|
|
158
153
|
|
|
159
|
-
return
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
}
|
|
154
|
+
return {
|
|
155
|
+
object,
|
|
156
|
+
type,
|
|
157
|
+
data: { dataset: { ...el.dataset }, attributes: { ...allAttrs } },
|
|
158
|
+
nodes: next(el.childNodes),
|
|
159
|
+
};
|
|
160
|
+
},
|
|
161
|
+
},
|
|
169
162
|
];
|
|
170
163
|
|
|
171
164
|
/**
|
|
@@ -174,4 +167,4 @@ const rules = [
|
|
|
174
167
|
*/
|
|
175
168
|
const html = new Html({ rules, defaultBlock: 'span' });
|
|
176
169
|
|
|
177
|
-
export const deserialize = s => html.deserialize(s, { toJSON: true });
|
|
170
|
+
export const deserialize = (s) => html.deserialize(s, { toJSON: true });
|
package/src/with-mask.jsx
CHANGED
|
@@ -7,7 +7,7 @@ import { deserialize } from './serialization';
|
|
|
7
7
|
export const buildLayoutFromMarkup = (markup, type) => {
|
|
8
8
|
const { markup: processed } = componentize(markup, type);
|
|
9
9
|
const value = deserialize(processed);
|
|
10
|
-
return value;
|
|
10
|
+
return value.document;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export const withMask = (type, renderChildren) => {
|
|
@@ -22,15 +22,48 @@ export const withMask = (type, renderChildren) => {
|
|
|
22
22
|
*/
|
|
23
23
|
layout: PropTypes.object,
|
|
24
24
|
value: PropTypes.object,
|
|
25
|
-
onChange: PropTypes.func
|
|
25
|
+
onChange: PropTypes.func,
|
|
26
|
+
customMarkMarkupComponent: PropTypes.func,
|
|
27
|
+
elementType: PropTypes.string,
|
|
26
28
|
};
|
|
27
29
|
|
|
30
|
+
constructor(props) {
|
|
31
|
+
super(props);
|
|
32
|
+
this.containerRef = React.createRef();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
componentDidUpdate(prevProps) {
|
|
36
|
+
if (this.props.markup !== prevProps.markup) {
|
|
37
|
+
const domNode = this.containerRef.current;
|
|
38
|
+
const mathElements = domNode && domNode.querySelectorAll('[data-latex][data-math-handled="true"]');
|
|
39
|
+
|
|
40
|
+
// Clean up for fresh MathJax processing
|
|
41
|
+
(mathElements || []).forEach((el) => {
|
|
42
|
+
// Remove the MathJax container to allow for clean updates
|
|
43
|
+
const mjxContainer = el.querySelector('mjx-container');
|
|
44
|
+
|
|
45
|
+
if (mjxContainer) {
|
|
46
|
+
el.removeChild(mjxContainer);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Update the innerHTML to match the raw LaTeX data, ensuring it is reprocessed correctly
|
|
50
|
+
const latexCode = el.getAttribute('data-raw');
|
|
51
|
+
el.innerHTML = latexCode;
|
|
52
|
+
|
|
53
|
+
// Remove the attribute to signal that MathJax should reprocess this element
|
|
54
|
+
el.removeAttribute('data-math-handled');
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
28
59
|
render() {
|
|
29
|
-
const { markup, layout, value, onChange } = this.props;
|
|
60
|
+
const { markup, layout, value, onChange, elementType } = this.props;
|
|
30
61
|
|
|
31
62
|
const maskLayout = layout ? layout : buildLayoutFromMarkup(markup, type);
|
|
32
63
|
return (
|
|
33
64
|
<Mask
|
|
65
|
+
containerRef={this.containerRef}
|
|
66
|
+
elementType={elementType}
|
|
34
67
|
layout={maskLayout}
|
|
35
68
|
value={value}
|
|
36
69
|
onChange={onChange}
|
package/README.md
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# mask-markup
|
|
2
|
-
|
|
3
|
-
## issues
|
|
4
|
-
|
|
5
|
-
- dnd
|
|
6
|
-
- simple approach loses context due to stepping out of react tree to run a ReactDOM.render().
|
|
7
|
-
- Would need to pass drag parts as props (no context)
|
|
8
|
-
- Or do the entire tree render in react - like a simple slate
|
|
9
|
-
- HTML5Backend - ? going to be a an issue w/ multiple items using dnd?
|
|
10
|
-
|
|
11
|
-
* hey diddle sample
|
|
12
|
-
* add feedback
|
|
13
|
-
* check perf
|
|
14
|
-
* more complex html
|
package/lib/new-serialization.js
DELETED
|
@@ -1,320 +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.valueToHtml = exports.reactAttributes = exports.parseStyleString = exports.htmlToValue = exports.getBase64 = exports.TEXT_RULE = exports.BLOCK_TAGS = void 0;
|
|
9
|
-
|
|
10
|
-
var _testSerializer = _interopRequireDefault(require("./test-serializer"));
|
|
11
|
-
|
|
12
|
-
var _react = _interopRequireDefault(require("react"));
|
|
13
|
-
|
|
14
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
15
|
-
|
|
16
|
-
var _toStyle = require("to-style");
|
|
17
|
-
|
|
18
|
-
var _image = require("./plugins/image");
|
|
19
|
-
|
|
20
|
-
var _math = require("./plugins/math");
|
|
21
|
-
|
|
22
|
-
var _media = require("./plugins/media");
|
|
23
|
-
|
|
24
|
-
var _list = require("./plugins/list");
|
|
25
|
-
|
|
26
|
-
var _table = require("./plugins/table");
|
|
27
|
-
|
|
28
|
-
var _respArea = require("./plugins/respArea");
|
|
29
|
-
|
|
30
|
-
var _slate = require("slate");
|
|
31
|
-
|
|
32
|
-
var _slateHyperscript = require("slate-hyperscript");
|
|
33
|
-
|
|
34
|
-
var log = (0, _debug["default"])('@pie-lib:editable-html:serialization');
|
|
35
|
-
/**
|
|
36
|
-
* Tags to blocks.
|
|
37
|
-
*
|
|
38
|
-
* @type {Object}
|
|
39
|
-
*/
|
|
40
|
-
|
|
41
|
-
var BLOCK_TAGS = {
|
|
42
|
-
div: 'div',
|
|
43
|
-
span: 'span',
|
|
44
|
-
p: 'paragraph',
|
|
45
|
-
blockquote: 'quote',
|
|
46
|
-
pre: 'code',
|
|
47
|
-
h1: 'heading-one',
|
|
48
|
-
h2: 'heading-two',
|
|
49
|
-
h3: 'heading-three',
|
|
50
|
-
h4: 'heading-four',
|
|
51
|
-
h5: 'heading-five',
|
|
52
|
-
h6: 'heading-six'
|
|
53
|
-
};
|
|
54
|
-
/**
|
|
55
|
-
* Tags to marks.
|
|
56
|
-
*
|
|
57
|
-
* @type {Object}
|
|
58
|
-
*/
|
|
59
|
-
|
|
60
|
-
exports.BLOCK_TAGS = BLOCK_TAGS;
|
|
61
|
-
var MARK_TAGS = {
|
|
62
|
-
b: 'bold',
|
|
63
|
-
em: 'italic',
|
|
64
|
-
u: 'underline',
|
|
65
|
-
s: 'strikethrough',
|
|
66
|
-
code: 'code',
|
|
67
|
-
strong: 'bold'
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
var parseStyleString = function parseStyleString(s) {
|
|
71
|
-
var regex = /([\w-]*)\s*:\s*([^;]*)/g;
|
|
72
|
-
var match;
|
|
73
|
-
var result = {};
|
|
74
|
-
|
|
75
|
-
while (match = regex.exec(s)) {
|
|
76
|
-
result[match[1]] = match[2].trim();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return result;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
exports.parseStyleString = parseStyleString;
|
|
83
|
-
|
|
84
|
-
var getBase64 = function getBase64(file) {
|
|
85
|
-
return new Promise(function (resolve, reject) {
|
|
86
|
-
var reader = new FileReader();
|
|
87
|
-
reader.readAsDataURL(file);
|
|
88
|
-
|
|
89
|
-
reader.onload = function () {
|
|
90
|
-
return resolve(reader.result);
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
reader.onerror = function (error) {
|
|
94
|
-
return reject(error);
|
|
95
|
-
};
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
exports.getBase64 = getBase64;
|
|
100
|
-
|
|
101
|
-
var reactAttributes = function reactAttributes(o) {
|
|
102
|
-
return (0, _toStyle.object)(o, {
|
|
103
|
-
camelize: true,
|
|
104
|
-
addUnits: false
|
|
105
|
-
});
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
exports.reactAttributes = reactAttributes;
|
|
109
|
-
|
|
110
|
-
var attributesToMap = function attributesToMap(el) {
|
|
111
|
-
return function (acc, attribute) {
|
|
112
|
-
var value = el.getAttribute(attribute);
|
|
113
|
-
|
|
114
|
-
if (value) {
|
|
115
|
-
if (attribute === 'style') {
|
|
116
|
-
var styleString = el.getAttribute(attribute);
|
|
117
|
-
var reactStyleObject = reactAttributes(parseStyleString(styleString));
|
|
118
|
-
acc['style'] = reactStyleObject;
|
|
119
|
-
} else {
|
|
120
|
-
acc[attribute] = el.getAttribute(attribute);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return acc;
|
|
125
|
-
};
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
var attributes = ['border', 'cellpadding', 'cellspacing', 'class', 'style'];
|
|
129
|
-
/**
|
|
130
|
-
* Serializer rules.
|
|
131
|
-
*
|
|
132
|
-
* @type {Array}
|
|
133
|
-
*/
|
|
134
|
-
|
|
135
|
-
var blocks = {
|
|
136
|
-
deserialize: function deserialize(el, next) {
|
|
137
|
-
log('[blocks:deserialize] block: ', el);
|
|
138
|
-
var block = BLOCK_TAGS[el.tagName.toLowerCase()];
|
|
139
|
-
if (!block) return;
|
|
140
|
-
log('[blocks:deserialize] block: ', block);
|
|
141
|
-
|
|
142
|
-
if (el.childNodes.length === 1) {
|
|
143
|
-
var cn = el.childNodes[0];
|
|
144
|
-
|
|
145
|
-
if (cn && cn.tagName && cn.tagName.toLowerCase() === block) {
|
|
146
|
-
log('[we have a child node of the same]...');
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
152
|
-
type: block,
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Here for rendering styles for all block elements
|
|
156
|
-
*/
|
|
157
|
-
data: {
|
|
158
|
-
attributes: attributes.reduce(attributesToMap(el), {})
|
|
159
|
-
}
|
|
160
|
-
}, next(el.childNodes));
|
|
161
|
-
},
|
|
162
|
-
serialize: function serialize(object, children) {
|
|
163
|
-
if (object.object !== 'block') return;
|
|
164
|
-
var jsonData = object.data.toJSON();
|
|
165
|
-
log('[blocks:serialize] object: ', object, children);
|
|
166
|
-
var key;
|
|
167
|
-
|
|
168
|
-
for (key in BLOCK_TAGS) {
|
|
169
|
-
if (BLOCK_TAGS[key] === object.type) {
|
|
170
|
-
var Tag = key;
|
|
171
|
-
return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
var marks = {
|
|
177
|
-
deserialize: function deserialize(el, next) {
|
|
178
|
-
var mark = MARK_TAGS[el.tagName.toLowerCase()];
|
|
179
|
-
|
|
180
|
-
if (!mark) {
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
log('[deserialize] mark: ', mark);
|
|
185
|
-
return (0, _slateHyperscript.jsx)('element', {
|
|
186
|
-
type: mark
|
|
187
|
-
}, next(el.childNodes));
|
|
188
|
-
},
|
|
189
|
-
serialize: function serialize(object, children) {
|
|
190
|
-
/*if (Mark.isMark(object)) {
|
|
191
|
-
for (var key in MARK_TAGS) {
|
|
192
|
-
if (MARK_TAGS[key] === object.type) {
|
|
193
|
-
const Tag = key;
|
|
194
|
-
return <Tag>{children}</Tag>;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}*/
|
|
198
|
-
}
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
var findPreviousText = function findPreviousText(el) {
|
|
202
|
-
if (el.nodeName === '#text') {
|
|
203
|
-
return el;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
if (el.previousSibling) {
|
|
207
|
-
return findPreviousText(el.previousSibling);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return null;
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
var TEXT_RULE = {
|
|
214
|
-
deserialize: function deserialize(el) {
|
|
215
|
-
/**
|
|
216
|
-
* This needs to be called on the dom element in order to merge the adjacent text nodes together
|
|
217
|
-
* */
|
|
218
|
-
el.normalize();
|
|
219
|
-
|
|
220
|
-
if (el.tagName && el.tagName.toLowerCase() === 'br') {
|
|
221
|
-
return (0, _slateHyperscript.jsx)('text', {});
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if (el.nodeName === '#text') {
|
|
225
|
-
if (el.nodeValue && el.nodeValue.match(/<!--.*?-->/)) return;
|
|
226
|
-
log('[text:deserialize] return text object..');
|
|
227
|
-
return (0, _slateHyperscript.jsx)('text', {}, el.nodeValue);
|
|
228
|
-
}
|
|
229
|
-
},
|
|
230
|
-
serialize: function serialize(obj, children) {
|
|
231
|
-
if (obj.object === 'string') {
|
|
232
|
-
return children.split('\n').reduce(function (array, text, i) {
|
|
233
|
-
if (i !== 0) array.push( /*#__PURE__*/_react["default"].createElement("br", null));
|
|
234
|
-
array.push(text);
|
|
235
|
-
return array;
|
|
236
|
-
}, []);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
};
|
|
240
|
-
exports.TEXT_RULE = TEXT_RULE;
|
|
241
|
-
var RULES = [_list.serialization, _math.serialization, _media.serialization, _image.serialization, _table.serialization, _respArea.serialization, TEXT_RULE, blocks, marks];
|
|
242
|
-
|
|
243
|
-
function allWhitespace(node) {
|
|
244
|
-
// Use ECMA-262 Edition 3 String and RegExp features
|
|
245
|
-
return !/[^\t\n\r ]/.test(node.textContent);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function defaultParseHtml(html) {
|
|
249
|
-
if (typeof DOMParser === 'undefined') {
|
|
250
|
-
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.');
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
var parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
254
|
-
var body = parsed.body;
|
|
255
|
-
var textNodes = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, null);
|
|
256
|
-
var n = textNodes.nextNode();
|
|
257
|
-
|
|
258
|
-
while (n) {
|
|
259
|
-
if (allWhitespace(n) || n.nodeValue === "\u200B") {
|
|
260
|
-
n.parentNode.removeChild(n);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
n = textNodes.nextNode();
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
return body;
|
|
267
|
-
}
|
|
268
|
-
/** If this lib is used on the server side, we need to bypass using the DOMParser - just put in a stub. */
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
var parseHtml = typeof window === 'undefined' ? function () {
|
|
272
|
-
return {
|
|
273
|
-
childNodes: []
|
|
274
|
-
};
|
|
275
|
-
} : defaultParseHtml;
|
|
276
|
-
var serializer = new _testSerializer["default"]({
|
|
277
|
-
defaultBlock: 'div',
|
|
278
|
-
rules: RULES,
|
|
279
|
-
parseHtml: parseHtml
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
var _extends = Object.assign || function (target) {
|
|
283
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
284
|
-
var source = arguments[i];
|
|
285
|
-
|
|
286
|
-
for (var key in source) {
|
|
287
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
288
|
-
target[key] = source[key];
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
return target;
|
|
294
|
-
};
|
|
295
|
-
|
|
296
|
-
var htmlToValue = function htmlToValue(html) {
|
|
297
|
-
try {
|
|
298
|
-
return serializer.deserialize(html);
|
|
299
|
-
} catch (e) {
|
|
300
|
-
console.log("Couldn't parse html: ", e);
|
|
301
|
-
return {};
|
|
302
|
-
}
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
exports.htmlToValue = htmlToValue;
|
|
306
|
-
|
|
307
|
-
var valueToHtml = function valueToHtml(value) {
|
|
308
|
-
return serializer.serialize(value);
|
|
309
|
-
};
|
|
310
|
-
/**
|
|
311
|
-
*
|
|
312
|
-
* <div><div>a</div></div> -> <div>a</div>
|
|
313
|
-
*
|
|
314
|
-
* <div><div>a</div><div>b</div></div> -> <div>a</div><div>b</div>
|
|
315
|
-
* <div><div>a</div>4444<div>b</div></div> -> <div>a</div>4444<div>b</div>
|
|
316
|
-
*/
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
exports.valueToHtml = valueToHtml;
|
|
320
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJkZWJ1ZyIsIkJMT0NLX1RBR1MiLCJkaXYiLCJzcGFuIiwicCIsImJsb2NrcXVvdGUiLCJwcmUiLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJNQVJLX1RBR1MiLCJiIiwiZW0iLCJ1IiwicyIsImNvZGUiLCJzdHJvbmciLCJwYXJzZVN0eWxlU3RyaW5nIiwicmVnZXgiLCJtYXRjaCIsInJlc3VsdCIsImV4ZWMiLCJ0cmltIiwiZ2V0QmFzZTY0IiwiZmlsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJvbmxvYWQiLCJvbmVycm9yIiwiZXJyb3IiLCJyZWFjdEF0dHJpYnV0ZXMiLCJvIiwidG9TdHlsZU9iamVjdCIsImNhbWVsaXplIiwiYWRkVW5pdHMiLCJhdHRyaWJ1dGVzVG9NYXAiLCJlbCIsImFjYyIsImF0dHJpYnV0ZSIsInZhbHVlIiwiZ2V0QXR0cmlidXRlIiwic3R5bGVTdHJpbmciLCJyZWFjdFN0eWxlT2JqZWN0IiwiYXR0cmlidXRlcyIsImJsb2NrcyIsImRlc2VyaWFsaXplIiwibmV4dCIsImJsb2NrIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNuIiwianN4IiwidHlwZSIsImRhdGEiLCJyZWR1Y2UiLCJzZXJpYWxpemUiLCJvYmplY3QiLCJjaGlsZHJlbiIsImpzb25EYXRhIiwidG9KU09OIiwia2V5IiwiVGFnIiwibWFya3MiLCJtYXJrIiwiZmluZFByZXZpb3VzVGV4dCIsIm5vZGVOYW1lIiwicHJldmlvdXNTaWJsaW5nIiwiVEVYVF9SVUxFIiwibm9ybWFsaXplIiwibm9kZVZhbHVlIiwib2JqIiwic3BsaXQiLCJhcnJheSIsInRleHQiLCJpIiwicHVzaCIsIlJVTEVTIiwibGlzdFNlcmlhbGl6YXRpb24iLCJtYXRoU2VyaWFsaXphdGlvbiIsIm1lZGlhU2VyaWFsaXphdGlvbiIsImltZ1NlcmlhbGl6YXRpb24iLCJ0YWJsZVNlcmlhbGl6YXRpb24iLCJyZXNwb25zZUFyZWFTZXJpYWxpemF0aW9uIiwiYWxsV2hpdGVzcGFjZSIsIm5vZGUiLCJ0ZXN0IiwidGV4dENvbnRlbnQiLCJkZWZhdWx0UGFyc2VIdG1sIiwiaHRtbCIsIkRPTVBhcnNlciIsIkVycm9yIiwicGFyc2VkIiwicGFyc2VGcm9tU3RyaW5nIiwiYm9keSIsInRleHROb2RlcyIsImRvY3VtZW50IiwiY3JlYXRlVHJlZVdhbGtlciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJuIiwibmV4dE5vZGUiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJwYXJzZUh0bWwiLCJ3aW5kb3ciLCJzZXJpYWxpemVyIiwiVGVzdFNlcmlhbGl6ZXIiLCJkZWZhdWx0QmxvY2siLCJydWxlcyIsIl9leHRlbmRzIiwiT2JqZWN0IiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwic291cmNlIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaHRtbFRvVmFsdWUiLCJlIiwiY29uc29sZSIsInZhbHVlVG9IdG1sIl0sInNvdXJjZXMiOlsiLi4vc3JjL25ldy1zZXJpYWxpemF0aW9uLmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVzdFNlcmlhbGl6ZXIgZnJvbSAnLi90ZXN0LXNlcmlhbGl6ZXInO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyBvYmplY3QgYXMgdG9TdHlsZU9iamVjdCB9IGZyb20gJ3RvLXN0eWxlJztcblxuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiBhcyBpbWdTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi9wbHVnaW5zL2ltYWdlJztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgbWF0aFNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvbWF0aCc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIG1lZGlhU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy9tZWRpYSc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIGxpc3RTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi9wbHVnaW5zL2xpc3QnO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiBhcyB0YWJsZVNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvdGFibGUnO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiBhcyByZXNwb25zZUFyZWFTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi9wbHVnaW5zL3Jlc3BBcmVhJztcbmltcG9ydCB7IE1hcmssIFZhbHVlIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInNsYXRlLWh5cGVyc2NyaXB0XCI7XG5cbmNvbnN0IGxvZyA9IGRlYnVnKCdAcGllLWxpYjplZGl0YWJsZS1odG1sOnNlcmlhbGl6YXRpb24nKTtcblxuLyoqXG4gKiBUYWdzIHRvIGJsb2Nrcy5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbmV4cG9ydCBjb25zdCBCTE9DS19UQUdTID0ge1xuICBkaXY6ICdkaXYnLFxuICBzcGFuOiAnc3BhbicsXG4gIHA6ICdwYXJhZ3JhcGgnLFxuICBibG9ja3F1b3RlOiAncXVvdGUnLFxuICBwcmU6ICdjb2RlJyxcbiAgaDE6ICdoZWFkaW5nLW9uZScsXG4gIGgyOiAnaGVhZGluZy10d28nLFxuICBoMzogJ2hlYWRpbmctdGhyZWUnLFxuICBoNDogJ2hlYWRpbmctZm91cicsXG4gIGg1OiAnaGVhZGluZy1maXZlJyxcbiAgaDY6ICdoZWFkaW5nLXNpeCdcbn07XG5cbi8qKlxuICogVGFncyB0byBtYXJrcy5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbmNvbnN0IE1BUktfVEFHUyA9IHtcbiAgYjogJ2JvbGQnLFxuICBlbTogJ2l0YWxpYycsXG4gIHU6ICd1bmRlcmxpbmUnLFxuICBzOiAnc3RyaWtldGhyb3VnaCcsXG4gIGNvZGU6ICdjb2RlJyxcbiAgc3Ryb25nOiAnYm9sZCdcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZVN0eWxlU3RyaW5nID0gcyA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gLyhbXFx3LV0qKVxccyo6XFxzKihbXjtdKikvZztcbiAgbGV0IG1hdGNoO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMocykpKSB7XG4gICAgcmVzdWx0W21hdGNoWzFdXSA9IG1hdGNoWzJdLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJhc2U2NCA9IGZpbGUgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCk7XG4gICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWFjdEF0dHJpYnV0ZXMgPSBvID0+IHRvU3R5bGVPYmplY3QobywgeyBjYW1lbGl6ZTogdHJ1ZSwgYWRkVW5pdHM6IGZhbHNlIH0pO1xuXG5jb25zdCBhdHRyaWJ1dGVzVG9NYXAgPSBlbCA9PiAoYWNjLCBhdHRyaWJ1dGUpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ3N0eWxlJykge1xuICAgICAgY29uc3Qgc3R5bGVTdHJpbmcgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IHJlYWN0U3R5bGVPYmplY3QgPSByZWFjdEF0dHJpYnV0ZXMocGFyc2VTdHlsZVN0cmluZyhzdHlsZVN0cmluZykpO1xuICAgICAgYWNjWydzdHlsZSddID0gcmVhY3RTdHlsZU9iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2F0dHJpYnV0ZV0gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjYztcbn07XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2JvcmRlcicsICdjZWxscGFkZGluZycsICdjZWxsc3BhY2luZycsICdjbGFzcycsICdzdHlsZSddO1xuXG4vKipcbiAqIFNlcmlhbGl6ZXIgcnVsZXMuXG4gKlxuICogQHR5cGUge0FycmF5fVxuICovXG5cbmNvbnN0IGJsb2NrcyA9IHtcbiAgZGVzZXJpYWxpemUoZWwsIG5leHQpIHtcbiAgICBsb2coJ1tibG9ja3M6ZGVzZXJpYWxpemVdIGJsb2NrOiAnLCBlbCk7XG4gICAgY29uc3QgYmxvY2sgPSBCTE9DS19UQUdTW2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFibG9jaykgcmV0dXJuO1xuICAgIGxvZygnW2Jsb2NrczpkZXNlcmlhbGl6ZV0gYmxvY2s6ICcsIGJsb2NrKTtcblxuICAgIGlmIChlbC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgY24gPSBlbC5jaGlsZE5vZGVzWzBdO1xuICAgICAgaWYgKGNuICYmIGNuLnRhZ05hbWUgJiYgY24udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBibG9jaykge1xuICAgICAgICBsb2coJ1t3ZSBoYXZlIGEgY2hpbGQgbm9kZSBvZiB0aGUgc2FtZV0uLi4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqc3goXG4gICAgICAnZWxlbWVudCcsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IGJsb2NrLFxuICAgICAgICAvKipcbiAgICAgICAgICogSGVyZSBmb3IgcmVuZGVyaW5nIHN0eWxlcyBmb3IgYWxsIGJsb2NrIGVsZW1lbnRzXG4gICAgICAgICAqL1xuICAgICAgICBkYXRhOiB7IGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMucmVkdWNlKGF0dHJpYnV0ZXNUb01hcChlbCksIHt9KSB9XG4gICAgICB9LFxuICAgICAgbmV4dChlbC5jaGlsZE5vZGVzKVxuICAgICk7XG4gIH0sXG4gIHNlcmlhbGl6ZTogKG9iamVjdCwgY2hpbGRyZW4pID0+IHtcbiAgICBpZiAob2JqZWN0Lm9iamVjdCAhPT0gJ2Jsb2NrJykgcmV0dXJuO1xuXG4gICAgY29uc3QganNvbkRhdGEgPSBvYmplY3QuZGF0YS50b0pTT04oKTtcblxuICAgIGxvZygnW2Jsb2NrczpzZXJpYWxpemVdIG9iamVjdDogJywgb2JqZWN0LCBjaGlsZHJlbik7XG4gICAgbGV0IGtleTtcblxuICAgIGZvciAoa2V5IGluIEJMT0NLX1RBR1MpIHtcbiAgICAgIGlmIChCTE9DS19UQUdTW2tleV0gPT09IG9iamVjdC50eXBlKSB7XG4gICAgICAgIGNvbnN0IFRhZyA9IGtleTtcblxuICAgICAgICByZXR1cm4gPFRhZyB7Li4uanNvbkRhdGEuYXR0cmlidXRlc30+e2NoaWxkcmVufTwvVGFnPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IG1hcmtzID0ge1xuICBkZXNlcmlhbGl6ZShlbCwgbmV4dCkge1xuICAgIGNvbnN0IG1hcmsgPSBNQVJLX1RBR1NbZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoIW1hcmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9nKCdbZGVzZXJpYWxpemVdIG1hcms6ICcsIG1hcmspO1xuXG4gICAgcmV0dXJuIGpzeCgnZWxlbWVudCcsIHsgdHlwZTogbWFyayB9LCBuZXh0KGVsLmNoaWxkTm9kZXMpKTtcbiAgfSxcbiAgc2VyaWFsaXplKG9iamVjdCwgY2hpbGRyZW4pIHtcbiAgICAvKmlmIChNYXJrLmlzTWFyayhvYmplY3QpKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gTUFSS19UQUdTKSB7XG4gICAgICAgIGlmIChNQVJLX1RBR1Nba2V5XSA9PT0gb2JqZWN0LnR5cGUpIHtcbiAgICAgICAgICBjb25zdCBUYWcgPSBrZXk7XG4gICAgICAgICAgcmV0dXJuIDxUYWc+e2NoaWxkcmVufTwvVGFnPjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0qL1xuICB9XG59O1xuXG5jb25zdCBmaW5kUHJldmlvdXNUZXh0ID0gZWwgPT4ge1xuICBpZiAoZWwubm9kZU5hbWUgPT09ICcjdGV4dCcpIHtcbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICBpZiAoZWwucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgcmV0dXJuIGZpbmRQcmV2aW91c1RleHQoZWwucHJldmlvdXNTaWJsaW5nKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IFRFWFRfUlVMRSA9IHtcbiAgZGVzZXJpYWxpemUoZWwpIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBvbiB0aGUgZG9tIGVsZW1lbnQgaW4gb3JkZXIgdG8gbWVyZ2UgdGhlIGFkamFjZW50IHRleHQgbm9kZXMgdG9nZXRoZXJcbiAgICAgKiAqL1xuICAgIGVsLm5vcm1hbGl6ZSgpO1xuXG4gICAgaWYgKGVsLnRhZ05hbWUgJiYgZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYnInKSB7XG4gICAgICByZXR1cm4ganN4KCd0ZXh0Jywge30pO1xuICAgIH1cblxuICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKGVsLm5vZGVWYWx1ZSAmJiBlbC5ub2RlVmFsdWUubWF0Y2goLzwhLS0uKj8tLT4vKSkgcmV0dXJuO1xuXG4gICAgICBsb2coJ1t0ZXh0OmRlc2VyaWFsaXplXSByZXR1cm4gdGV4dCBvYmplY3QuLicpO1xuICAgICAgcmV0dXJuIGpzeCgndGV4dCcsIHt9LCBlbC5ub2RlVmFsdWUpO1xuICAgIH1cbiAgfSxcblxuICBzZXJpYWxpemUob2JqLCBjaGlsZHJlbikge1xuICAgIGlmIChvYmoub2JqZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNwbGl0KCdcXG4nKS5yZWR1Y2UoKGFycmF5LCB0ZXh0LCBpKSA9PiB7XG4gICAgICAgIGlmIChpICE9PSAwKSBhcnJheS5wdXNoKDxiciAvPik7XG4gICAgICAgIGFycmF5LnB1c2godGV4dCk7XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0sIFtdKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IFJVTEVTID0gW1xuICBsaXN0U2VyaWFsaXphdGlvbixcbiAgbWF0aFNlcmlhbGl6YXRpb24sXG4gIG1lZGlhU2VyaWFsaXphdGlvbixcbiAgaW1nU2VyaWFsaXphdGlvbixcbiAgdGFibGVTZXJpYWxpemF0aW9uLFxuICByZXNwb25zZUFyZWFTZXJpYWxpemF0aW9uLFxuICBURVhUX1JVTEUsXG4gIGJsb2NrcyxcbiAgbWFya3Ncbl07XG5cbmZ1bmN0aW9uIGFsbFdoaXRlc3BhY2Uobm9kZSkge1xuICAvLyBVc2UgRUNNQS0yNjIgRWRpdGlvbiAzIFN0cmluZyBhbmQgUmVnRXhwIGZlYXR1cmVzXG4gIHJldHVybiAhL1teXFx0XFxuXFxyIF0vLnRlc3Qobm9kZS50ZXh0Q29udGVudCk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQYXJzZUh0bWwoaHRtbCkge1xuICBpZiAodHlwZW9mIERPTVBhcnNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnVGhlIG5hdGl2ZSBgRE9NUGFyc2VyYCBnbG9iYWwgd2hpY2ggdGhlIGBIdG1sYCBzZXJpYWxpemVyIHVzZXMgYnkgZGVmYXVsdCBpcyBub3QgcHJlc2VudCBpbiB0aGlzIGVudmlyb25tZW50LiBZb3UgbXVzdCBzdXBwbHkgdGhlIGBvcHRpb25zLnBhcnNlSHRtbGAgZnVuY3Rpb24gaW5zdGVhZC4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuXG4gIGNvbnN0IHsgYm9keSB9ID0gcGFyc2VkO1xuICBjb25zdCB0ZXh0Tm9kZXMgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGJvZHksIE5vZGVGaWx0ZXIuU0hPV19URVhULCBudWxsLCBudWxsKTtcbiAgbGV0IG4gPSB0ZXh0Tm9kZXMubmV4dE5vZGUoKTtcblxuICB3aGlsZSAobikge1xuICAgIGlmIChhbGxXaGl0ZXNwYWNlKG4pIHx8IG4ubm9kZVZhbHVlID09PSAnXFx1MjAwQicpIHtcbiAgICAgIG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTtcbiAgICB9XG4gICAgbiA9IHRleHROb2Rlcy5uZXh0Tm9kZSgpO1xuICB9XG5cbiAgcmV0dXJuIGJvZHk7XG59XG5cbi8qKiBJZiB0aGlzIGxpYiBpcyB1c2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZSwgd2UgbmVlZCB0byBieXBhc3MgdXNpbmcgdGhlIERPTVBhcnNlciAtIGp1c3QgcHV0IGluIGEgc3R1Yi4gKi9cbmNvbnN0IHBhcnNlSHRtbCA9XG4gIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnXG4gICAgPyAoKSA9PiAoe1xuICAgICAgICBjaGlsZE5vZGVzOiBbXVxuICAgICAgfSlcbiAgICA6IGRlZmF1bHRQYXJzZUh0bWw7XG5cbmNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgVGVzdFNlcmlhbGl6ZXIoe1xuICBkZWZhdWx0QmxvY2s6ICdkaXYnLFxuICBydWxlczogUlVMRVMsXG4gIHBhcnNlSHRtbFxufSk7XG5cbmNvbnN0IF9leHRlbmRzID1cbiAgT2JqZWN0LmFzc2lnbiB8fFxuICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG5leHBvcnQgY29uc3QgaHRtbFRvVmFsdWUgPSBodG1sID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShodG1sKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKFwiQ291bGRuJ3QgcGFyc2UgaHRtbDogXCIsIGUpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlVG9IdG1sID0gdmFsdWUgPT4gc2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUpO1xuXG4vKipcbiAqXG4gKiA8ZGl2PjxkaXY+YTwvZGl2PjwvZGl2PiAtPiA8ZGl2PmE8L2Rpdj5cbiAqXG4gKiA8ZGl2PjxkaXY+YTwvZGl2PjxkaXY+YjwvZGl2PjwvZGl2PiAtPiA8ZGl2PmE8L2Rpdj48ZGl2PmI8L2Rpdj5cbiAqIDxkaXY+PGRpdj5hPC9kaXY+NDQ0NDxkaXY+YjwvZGl2PjwvZGl2PiAtPiA8ZGl2PmE8L2Rpdj40NDQ0PGRpdj5iPC9kaXY+XG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBTUEsR0FBRyxHQUFHLElBQUFDLGlCQUFBLEVBQU0sc0NBQU4sQ0FBWjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sSUFBTUMsVUFBVSxHQUFHO0VBQ3hCQyxHQUFHLEVBQUUsS0FEbUI7RUFFeEJDLElBQUksRUFBRSxNQUZrQjtFQUd4QkMsQ0FBQyxFQUFFLFdBSHFCO0VBSXhCQyxVQUFVLEVBQUUsT0FKWTtFQUt4QkMsR0FBRyxFQUFFLE1BTG1CO0VBTXhCQyxFQUFFLEVBQUUsYUFOb0I7RUFPeEJDLEVBQUUsRUFBRSxhQVBvQjtFQVF4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
|
package/lib/parse-html.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.parseDegrees = void 0;
|
|
7
|
-
|
|
8
|
-
var parseDegrees = function parseDegrees(html) {
|
|
9
|
-
return html // removes \( use case: 50°
|
|
10
|
-
.replace(/\\[(]/g, '') // removes \) use case: 50°+m<1
|
|
11
|
-
.replace(/\\[)]/g, '') // removes \degree use case: 50°
|
|
12
|
-
.replace(/\\degree/g, '°');
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
exports.parseDegrees = parseDegrees;
|
|
16
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZURlZ3JlZXMiLCJodG1sIiwicmVwbGFjZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZS1odG1sLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBwYXJzZURlZ3JlZXMgPSBodG1sID0+XG4gIGh0bWxcbiAgICAvLyByZW1vdmVzIFxcKCAgIHVzZSBjYXNlOiA1MMKwXG4gICAgLnJlcGxhY2UoL1xcXFxbKF0vZywgJycpXG4gICAgLy8gcmVtb3ZlcyBcXCkgICB1c2UgY2FzZTogNTDCsCttPDFcbiAgICAucmVwbGFjZSgvXFxcXFspXS9nLCAnJylcbiAgICAvLyByZW1vdmVzIFxcZGVncmVlICB1c2UgY2FzZTogNTDCsFxuICAgIC5yZXBsYWNlKC9cXFxcZGVncmVlL2csICcmZGVnOycpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQU8sSUFBTUEsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQUMsSUFBSTtFQUFBLE9BQzlCQSxJQUFJLENBQ0Y7RUFERSxDQUVEQyxPQUZILENBRVcsUUFGWCxFQUVxQixFQUZyQixFQUdFO0VBSEYsQ0FJR0EsT0FKSCxDQUlXLFFBSlgsRUFJcUIsRUFKckIsRUFLRTtFQUxGLENBTUdBLE9BTkgsQ0FNVyxXQU5YLEVBTXdCLE9BTnhCLENBRDhCO0FBQUEsQ0FBekIifQ==
|