@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/serialization.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.js","names":["log","debug","INLINE","MARK","TEXT_NODE","COMMENT_NODE","attr","el","attributes","length","undefined","out","i","a","name","value","getObject","type","includes","parseStyleString","s","regex","match","result","exec","trim","reactAttributes","o","toStyleObject","camelize","addUnits","handleStyles","attribute","styleString","getAttribute","handleClass","acc","classNames","attributesToMap","style","className","MARK_TAGS","b","em","u","code","strong","marks","deserialize","next","mark","tagName","toLowerCase","object","nodes","childNodes","rules","nodeType","leaves","text","textContent","normalAttrs","allAttrs","reduce","isMath","data","dataset","html","Html","defaultBlock","toJSON"],"sources":["../src/serialization.js"],"sourcesContent":["import React from 'react';\nimport Html from './html-serializer';\nimport { object as toStyleObject } from 'to-style';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:mask-markup:serialization');\n\nconst INLINE = ['span'];\nconst MARK = ['em', 'strong', 'u'];\nconst TEXT_NODE = 3;\nconst COMMENT_NODE = 8;\n\nconst attr = el => {\n if (!el.attributes || el.attributes.length <= 0) {\n return undefined;\n }\n\n const out = {};\n let i;\n\n for (i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n\n out[a.name] = a.value;\n }\n\n return out;\n};\n\nconst getObject = type => {\n if (INLINE.includes(type)) {\n return 'inline';\n } else if (MARK.includes(type)) {\n return 'mark';\n }\n return 'block';\n};\n\nexport const parseStyleString = s => {\n const regex = /([\\w-]*)\\s*:\\s*([^;]*)/g;\n let match;\n const result = {};\n while ((match = regex.exec(s))) {\n result[match[1]] = match[2].trim();\n }\n return result;\n};\n\nexport const reactAttributes = o => toStyleObject(o, { camelize: true, addUnits: false });\n\nconst handleStyles = (el, attribute) => {\n const styleString = el.getAttribute(attribute);\n\n return reactAttributes(parseStyleString(styleString));\n};\n\nconst handleClass = (el, acc, attribute) => {\n const classNames = el.getAttribute(attribute);\n\n delete acc.class;\n\n return classNames;\n};\n\nconst attributesToMap = el => (acc, attribute) => {\n if (!el.getAttribute) {\n return acc;\n }\n\n const value = el.getAttribute(attribute);\n\n if (value) {\n switch (attribute) {\n case 'style':\n acc.style = handleStyles(el, attribute);\n break;\n case 'class':\n acc.className = handleClass(el, acc, attribute);\n break;\n default:\n acc[attribute] = el.getAttribute(attribute);\n break;\n }\n }\n\n return acc;\n};\n\nconst attributes = ['border', 'class', 'style'];\n\n/**\n * Tags to marks.\n *\n * @type {Object}\n */\n\nexport const MARK_TAGS = {\n b: 'bold',\n em: 'italic',\n u: 'underline',\n s: 'strikethrough',\n code: 'code',\n strong: 'strong'\n};\n\nconst marks = {\n deserialize(el, next) {\n const mark = MARK_TAGS[el.tagName.toLowerCase()];\n if (!mark) return;\n log('[deserialize] mark: ', mark);\n return {\n object: 'mark',\n type: mark,\n nodes: next(el.childNodes)\n };\n }\n};\n\nconst rules = [\n marks,\n {\n /**\n * deserialize everything, we're not fussy about the dom structure for now.\n */\n deserialize: (el, next) => {\n if (el.nodeType === COMMENT_NODE) {\n return undefined;\n }\n\n if (el.nodeType === TEXT_NODE) {\n return {\n object: 'text',\n leaves: [{ text: el.textContent }]\n };\n }\n\n const type = el.tagName.toLowerCase();\n\n const normalAttrs = attr(el) || {};\n const allAttrs = attributes.reduce(attributesToMap(el), { ...normalAttrs });\n const object = getObject(type);\n\n if (el.tagName.toLowerCase() === 'math') {\n return {\n isMath: true,\n nodes: [el]\n };\n }\n\n return {\n object,\n type,\n data: { dataset: { ...el.dataset }, attributes: { ...allAttrs } },\n nodes: next(el.childNodes)\n };\n }\n }\n];\n\n/**\n * Create a new serializer instance with our `rules` from above.\n * Having a default div block will just put every div on it's own line, which is not ideal.\n */\nconst html = new Html({ rules, defaultBlock: 'span' });\n\nexport const deserialize = s => html.deserialize(s, { toJSON: true });\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serialization.js","names":["_slateHtmlSerializer","_interopRequireDefault","require","_toStyle","_debug","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","log","debug","INLINE","MARK","TEXT_NODE","COMMENT_NODE","attr","el","attributes","undefined","out","i","a","name","value","getObject","type","includes","parseStyleString","exports","s","regex","match","result","exec","trim","reactAttributes","toStyleObject","camelize","addUnits","handleStyles","attribute","styleString","getAttribute","handleClass","acc","classNames","attributesToMap","style","className","MARK_TAGS","b","em","u","code","strong","marks","deserialize","next","mark","tagName","toLowerCase","object","nodes","childNodes","rules","nodeType","leaves","text","textContent","normalAttrs","controls","allAttrs","reduce","isMath","data","dataset","html","Html","defaultBlock","toJSON"],"sources":["../src/serialization.js"],"sourcesContent":["import Html from 'slate-html-serializer';\nimport { object as toStyleObject } from 'to-style';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:mask-markup:serialization');\n\nconst INLINE = ['span'];\nconst MARK = ['em', 'strong', 'u'];\nconst TEXT_NODE = 3;\nconst COMMENT_NODE = 8;\n\nconst attr = (el) => {\n if (!el.attributes || el.attributes.length <= 0) {\n return undefined;\n }\n\n const out = {};\n let i;\n\n for (i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n\n out[a.name] = a.value;\n }\n\n return out;\n};\n\nconst getObject = (type) => {\n if (INLINE.includes(type)) {\n return 'inline';\n } else if (MARK.includes(type)) {\n return 'mark';\n }\n return 'block';\n};\n\nexport const parseStyleString = (s) => {\n const regex = /([\\w-]*)\\s*:\\s*([^;]*)/g;\n let match;\n const result = {};\n while ((match = regex.exec(s))) {\n result[match[1]] = match[2].trim();\n }\n return result;\n};\n\nexport const reactAttributes = (o) => toStyleObject(o, { camelize: true, addUnits: false });\n\nconst handleStyles = (el, attribute) => {\n const styleString = el.getAttribute(attribute);\n\n return reactAttributes(parseStyleString(styleString));\n};\n\nconst handleClass = (el, acc, attribute) => {\n const classNames = el.getAttribute(attribute);\n\n delete acc.class;\n\n return classNames;\n};\n\nconst attributesToMap = (el) => (acc, attribute) => {\n if (!el.getAttribute) {\n return acc;\n }\n\n const value = el.getAttribute(attribute);\n\n if (value) {\n switch (attribute) {\n case 'style':\n acc.style = handleStyles(el, attribute);\n break;\n case 'class':\n acc.className = handleClass(el, acc, attribute);\n break;\n default:\n acc[attribute] = el.getAttribute(attribute);\n break;\n }\n }\n\n return acc;\n};\n\nconst attributes = ['border', 'class', 'style'];\n\n/**\n * Tags to marks.\n *\n * @type {Object}\n */\n\nexport const MARK_TAGS = {\n b: 'bold',\n em: 'italic',\n u: 'underline',\n s: 'strikethrough',\n code: 'code',\n strong: 'strong',\n};\n\nconst marks = {\n deserialize(el, next) {\n const mark = MARK_TAGS[el.tagName.toLowerCase()];\n if (!mark) return;\n log('[deserialize] mark: ', mark);\n return {\n object: 'mark',\n type: mark,\n nodes: next(el.childNodes),\n };\n },\n};\n\nconst rules = [\n marks,\n {\n /**\n * deserialize everything, we're not fussy about the dom structure for now.\n */\n deserialize: (el, next) => {\n if (el.nodeType === COMMENT_NODE) {\n return undefined;\n }\n\n if (el.nodeType === TEXT_NODE) {\n return {\n object: 'text',\n leaves: [{ text: el.textContent }],\n };\n }\n\n const type = el.tagName.toLowerCase();\n\n const normalAttrs = attr(el) || {};\n\n if (type == 'audio' && normalAttrs.controls == '') {\n normalAttrs.controls = true;\n }\n\n const allAttrs = attributes.reduce(attributesToMap(el), { ...normalAttrs });\n const object = getObject(type);\n\n if (el.tagName.toLowerCase() === 'math') {\n return {\n isMath: true,\n nodes: [el],\n };\n }\n\n return {\n object,\n type,\n data: { dataset: { ...el.dataset }, attributes: { ...allAttrs } },\n nodes: next(el.childNodes),\n };\n },\n },\n];\n\n/**\n * Create a new serializer instance with our `rules` from above.\n * Having a default div block will just put every div on it's own line, which is not ideal.\n */\nconst html = new Html({ rules, defaultBlock: 'span' });\n\nexport const deserialize = (s) => html.deserialize(s, { toJSON: true });\n"],"mappings":"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","ignoreList":[]}
|
package/lib/with-mask.js
CHANGED
|
@@ -1,71 +1,77 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.withMask = exports.buildLayoutFromMarkup = void 0;
|
|
9
|
-
|
|
10
8
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
-
|
|
12
9
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
-
|
|
14
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
15
|
-
|
|
16
10
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
17
|
-
|
|
18
11
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
19
|
-
|
|
12
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
20
13
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
21
|
-
|
|
22
14
|
var _react = _interopRequireDefault(require("react"));
|
|
23
|
-
|
|
24
15
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
25
|
-
|
|
26
16
|
var _mask = _interopRequireDefault(require("./mask"));
|
|
27
|
-
|
|
28
17
|
var _componentize2 = _interopRequireDefault(require("./componentize"));
|
|
29
|
-
|
|
30
18
|
var _serialization = require("./serialization");
|
|
31
|
-
|
|
32
|
-
function
|
|
33
|
-
|
|
34
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
35
|
-
|
|
36
|
-
var buildLayoutFromMarkup = function buildLayoutFromMarkup(markup, type) {
|
|
19
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
20
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
21
|
+
var buildLayoutFromMarkup = exports.buildLayoutFromMarkup = function buildLayoutFromMarkup(markup, type) {
|
|
37
22
|
var _componentize = (0, _componentize2["default"])(markup, type),
|
|
38
|
-
|
|
39
|
-
|
|
23
|
+
processed = _componentize.markup;
|
|
40
24
|
var value = (0, _serialization.deserialize)(processed);
|
|
41
|
-
return value;
|
|
25
|
+
return value.document;
|
|
42
26
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return _class = /*#__PURE__*/function (_React$Component) {
|
|
50
|
-
(0, _inherits2["default"])(WithMask, _React$Component);
|
|
51
|
-
|
|
52
|
-
var _super = _createSuper(WithMask);
|
|
53
|
-
|
|
54
|
-
function WithMask() {
|
|
27
|
+
var withMask = exports.withMask = function withMask(type, renderChildren) {
|
|
28
|
+
var _WithMask;
|
|
29
|
+
return _WithMask = /*#__PURE__*/function (_React$Component) {
|
|
30
|
+
function WithMask(props) {
|
|
31
|
+
var _this;
|
|
55
32
|
(0, _classCallCheck2["default"])(this, WithMask);
|
|
56
|
-
|
|
33
|
+
_this = _callSuper(this, WithMask, [props]);
|
|
34
|
+
_this.containerRef = /*#__PURE__*/_react["default"].createRef();
|
|
35
|
+
return _this;
|
|
57
36
|
}
|
|
58
|
-
|
|
59
|
-
(0, _createClass2["default"])(WithMask, [{
|
|
37
|
+
(0, _inherits2["default"])(WithMask, _React$Component);
|
|
38
|
+
return (0, _createClass2["default"])(WithMask, [{
|
|
39
|
+
key: "componentDidUpdate",
|
|
40
|
+
value: function componentDidUpdate(prevProps) {
|
|
41
|
+
if (this.props.markup !== prevProps.markup) {
|
|
42
|
+
var domNode = this.containerRef.current;
|
|
43
|
+
var mathElements = domNode && domNode.querySelectorAll('[data-latex][data-math-handled="true"]');
|
|
44
|
+
|
|
45
|
+
// Clean up for fresh MathJax processing
|
|
46
|
+
(mathElements || []).forEach(function (el) {
|
|
47
|
+
// Remove the MathJax container to allow for clean updates
|
|
48
|
+
var mjxContainer = el.querySelector('mjx-container');
|
|
49
|
+
if (mjxContainer) {
|
|
50
|
+
el.removeChild(mjxContainer);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Update the innerHTML to match the raw LaTeX data, ensuring it is reprocessed correctly
|
|
54
|
+
var latexCode = el.getAttribute('data-raw');
|
|
55
|
+
el.innerHTML = latexCode;
|
|
56
|
+
|
|
57
|
+
// Remove the attribute to signal that MathJax should reprocess this element
|
|
58
|
+
el.removeAttribute('data-math-handled');
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}, {
|
|
60
63
|
key: "render",
|
|
61
64
|
value: function render() {
|
|
62
65
|
var _this$props = this.props,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
markup = _this$props.markup,
|
|
67
|
+
layout = _this$props.layout,
|
|
68
|
+
value = _this$props.value,
|
|
69
|
+
onChange = _this$props.onChange,
|
|
70
|
+
elementType = _this$props.elementType;
|
|
67
71
|
var maskLayout = layout ? layout : buildLayoutFromMarkup(markup, type);
|
|
68
72
|
return /*#__PURE__*/_react["default"].createElement(_mask["default"], {
|
|
73
|
+
containerRef: this.containerRef,
|
|
74
|
+
elementType: elementType,
|
|
69
75
|
layout: maskLayout,
|
|
70
76
|
value: value,
|
|
71
77
|
onChange: onChange,
|
|
@@ -73,21 +79,19 @@ var withMask = function withMask(type, renderChildren) {
|
|
|
73
79
|
});
|
|
74
80
|
}
|
|
75
81
|
}]);
|
|
76
|
-
|
|
77
|
-
}(_react["default"].Component), (0, _defineProperty2["default"])(_class, "propTypes", {
|
|
82
|
+
}(_react["default"].Component), (0, _defineProperty2["default"])(_WithMask, "propTypes", {
|
|
78
83
|
/**
|
|
79
84
|
* At the start we'll probably work with markup
|
|
80
85
|
*/
|
|
81
86
|
markup: _propTypes["default"].string,
|
|
82
|
-
|
|
83
87
|
/**
|
|
84
88
|
* Once we start authoring, it may make sense for use to us layout, which will be a simple js object that maps to `slate.Value`.
|
|
85
89
|
*/
|
|
86
90
|
layout: _propTypes["default"].object,
|
|
87
91
|
value: _propTypes["default"].object,
|
|
88
|
-
onChange: _propTypes["default"].func
|
|
89
|
-
|
|
92
|
+
onChange: _propTypes["default"].func,
|
|
93
|
+
customMarkMarkupComponent: _propTypes["default"].func,
|
|
94
|
+
elementType: _propTypes["default"].string
|
|
95
|
+
}), _WithMask;
|
|
90
96
|
};
|
|
91
|
-
|
|
92
|
-
exports.withMask = withMask;
|
|
93
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJidWlsZExheW91dEZyb21NYXJrdXAiLCJtYXJrdXAiLCJ0eXBlIiwiY29tcG9uZW50aXplIiwicHJvY2Vzc2VkIiwidmFsdWUiLCJkZXNlcmlhbGl6ZSIsIndpdGhNYXNrIiwicmVuZGVyQ2hpbGRyZW4iLCJwcm9wcyIsImxheW91dCIsIm9uQ2hhbmdlIiwibWFza0xheW91dCIsIlJlYWN0IiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwic3RyaW5nIiwib2JqZWN0IiwiZnVuYyJdLCJzb3VyY2VzIjpbIi4uL3NyYy93aXRoLW1hc2suanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IE1hc2sgZnJvbSAnLi9tYXNrJztcbmltcG9ydCBjb21wb25lbnRpemUgZnJvbSAnLi9jb21wb25lbnRpemUnO1xuaW1wb3J0IHsgZGVzZXJpYWxpemUgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG5leHBvcnQgY29uc3QgYnVpbGRMYXlvdXRGcm9tTWFya3VwID0gKG1hcmt1cCwgdHlwZSkgPT4ge1xuICBjb25zdCB7IG1hcmt1cDogcHJvY2Vzc2VkIH0gPSBjb21wb25lbnRpemUobWFya3VwLCB0eXBlKTtcbiAgY29uc3QgdmFsdWUgPSBkZXNlcmlhbGl6ZShwcm9jZXNzZWQpO1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3Qgd2l0aE1hc2sgPSAodHlwZSwgcmVuZGVyQ2hpbGRyZW4pID0+IHtcbiAgcmV0dXJuIGNsYXNzIFdpdGhNYXNrIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBBdCB0aGUgc3RhcnQgd2UnbGwgcHJvYmFibHkgd29yayB3aXRoIG1hcmt1cFxuICAgICAgICovXG4gICAgICBtYXJrdXA6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAvKipcbiAgICAgICAqIE9uY2Ugd2Ugc3RhcnQgYXV0aG9yaW5nLCBpdCBtYXkgbWFrZSBzZW5zZSBmb3IgdXNlIHRvIHVzIGxheW91dCwgd2hpY2ggd2lsbCBiZSBhIHNpbXBsZSBqcyBvYmplY3QgdGhhdCBtYXBzIHRvIGBzbGF0ZS5WYWx1ZWAuXG4gICAgICAgKi9cbiAgICAgIGxheW91dDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIHZhbHVlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jXG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHsgbWFya3VwLCBsYXlvdXQsIHZhbHVlLCBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgY29uc3QgbWFza0xheW91dCA9IGxheW91dCA/IGxheW91dCA6IGJ1aWxkTGF5b3V0RnJvbU1hcmt1cChtYXJrdXAsIHR5cGUpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE1hc2tcbiAgICAgICAgICBsYXlvdXQ9e21hc2tMYXlvdXR9XG4gICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICByZW5kZXJDaGlsZHJlbj17cmVuZGVyQ2hpbGRyZW4odGhpcy5wcm9wcyl9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFTyxJQUFNQSxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCLENBQUNDLE1BQUQsRUFBU0MsSUFBVCxFQUFrQjtFQUNyRCxvQkFBOEIsSUFBQUMseUJBQUEsRUFBYUYsTUFBYixFQUFxQkMsSUFBckIsQ0FBOUI7RUFBQSxJQUFnQkUsU0FBaEIsaUJBQVFILE1BQVI7O0VBQ0EsSUFBTUksS0FBSyxHQUFHLElBQUFDLDBCQUFBLEVBQVlGLFNBQVosQ0FBZDtFQUNBLE9BQU9DLEtBQVA7QUFDRCxDQUpNOzs7O0FBTUEsSUFBTUUsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBQ0wsSUFBRCxFQUFPTSxjQUFQLEVBQTBCO0VBQUE7O0VBQ2hEO0lBQUE7O0lBQUE7O0lBQUE7TUFBQTtNQUFBO0lBQUE7O0lBQUE7TUFBQTtNQUFBLE9BY0Usa0JBQVM7UUFDUCxrQkFBNEMsS0FBS0MsS0FBakQ7UUFBQSxJQUFRUixNQUFSLGVBQVFBLE1BQVI7UUFBQSxJQUFnQlMsTUFBaEIsZUFBZ0JBLE1BQWhCO1FBQUEsSUFBd0JMLEtBQXhCLGVBQXdCQSxLQUF4QjtRQUFBLElBQStCTSxRQUEvQixlQUErQkEsUUFBL0I7UUFFQSxJQUFNQyxVQUFVLEdBQUdGLE1BQU0sR0FBR0EsTUFBSCxHQUFZVixxQkFBcUIsQ0FBQ0MsTUFBRCxFQUFTQyxJQUFULENBQTFEO1FBQ0Esb0JBQ0UsZ0NBQUMsZ0JBQUQ7VUFDRSxNQUFNLEVBQUVVLFVBRFY7VUFFRSxLQUFLLEVBQUVQLEtBRlQ7VUFHRSxRQUFRLEVBQUVNLFFBSFo7VUFJRSxjQUFjLEVBQUVILGNBQWMsQ0FBQyxLQUFLQyxLQUFOO1FBSmhDLEVBREY7TUFRRDtJQTFCSDtJQUFBO0VBQUEsRUFBOEJJLGlCQUFBLENBQU1DLFNBQXBDLHlEQUNxQjtJQUNqQjtBQUNOO0FBQ0E7SUFDTWIsTUFBTSxFQUFFYyxxQkFBQSxDQUFVQyxNQUpEOztJQUtqQjtBQUNOO0FBQ0E7SUFDTU4sTUFBTSxFQUFFSyxxQkFBQSxDQUFVRSxNQVJEO0lBU2pCWixLQUFLLEVBQUVVLHFCQUFBLENBQVVFLE1BVEE7SUFVakJOLFFBQVEsRUFBRUkscUJBQUEsQ0FBVUc7RUFWSCxDQURyQjtBQTRCRCxDQTdCTSJ9
|
|
97
|
+
//# sourceMappingURL=with-mask.js.map
|
package/lib/with-mask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-mask.js","names":["buildLayoutFromMarkup","markup","type","componentize","processed","value","deserialize","document","withMask","renderChildren","props","layout","onChange","maskLayout","
|
|
1
|
+
{"version":3,"file":"with-mask.js","names":["_react","_interopRequireDefault","require","_propTypes","_mask","_componentize2","_serialization","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","buildLayoutFromMarkup","exports","markup","type","_componentize","componentize","processed","value","deserialize","document","withMask","renderChildren","_WithMask","_React$Component","WithMask","props","_this","_classCallCheck2","containerRef","React","createRef","_inherits2","_createClass2","key","componentDidUpdate","prevProps","domNode","current","mathElements","querySelectorAll","forEach","el","mjxContainer","querySelector","removeChild","latexCode","getAttribute","innerHTML","removeAttribute","render","_this$props","layout","onChange","elementType","maskLayout","createElement","Component","_defineProperty2","PropTypes","string","object","func","customMarkMarkupComponent"],"sources":["../src/with-mask.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Mask from './mask';\nimport componentize from './componentize';\nimport { deserialize } from './serialization';\n\nexport const buildLayoutFromMarkup = (markup, type) => {\n const { markup: processed } = componentize(markup, type);\n const value = deserialize(processed);\n return value.document;\n};\n\nexport const withMask = (type, renderChildren) => {\n return class WithMask extends React.Component {\n static propTypes = {\n /**\n * At the start we'll probably work with markup\n */\n markup: PropTypes.string,\n /**\n * Once we start authoring, it may make sense for use to us layout, which will be a simple js object that maps to `slate.Value`.\n */\n layout: PropTypes.object,\n value: PropTypes.object,\n onChange: PropTypes.func,\n customMarkMarkupComponent: PropTypes.func,\n elementType: PropTypes.string,\n };\n\n constructor(props) {\n super(props);\n this.containerRef = React.createRef();\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.markup !== prevProps.markup) {\n const domNode = this.containerRef.current;\n const mathElements = domNode && domNode.querySelectorAll('[data-latex][data-math-handled=\"true\"]');\n\n // Clean up for fresh MathJax processing\n (mathElements || []).forEach((el) => {\n // Remove the MathJax container to allow for clean updates\n const mjxContainer = el.querySelector('mjx-container');\n\n if (mjxContainer) {\n el.removeChild(mjxContainer);\n }\n\n // Update the innerHTML to match the raw LaTeX data, ensuring it is reprocessed correctly\n const latexCode = el.getAttribute('data-raw');\n el.innerHTML = latexCode;\n\n // Remove the attribute to signal that MathJax should reprocess this element\n el.removeAttribute('data-math-handled');\n });\n }\n }\n\n render() {\n const { markup, layout, value, onChange, elementType } = this.props;\n\n const maskLayout = layout ? layout : buildLayoutFromMarkup(markup, type);\n return (\n <Mask\n containerRef={this.containerRef}\n elementType={elementType}\n layout={maskLayout}\n value={value}\n onChange={onChange}\n renderChildren={renderChildren(this.props)}\n />\n );\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-lib/mask-markup",
|
|
3
|
-
"version": "2.0.0-
|
|
3
|
+
"version": "2.0.0-next.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
@@ -8,25 +8,36 @@
|
|
|
8
8
|
"access": "public"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@
|
|
12
|
-
"@
|
|
13
|
-
"@
|
|
14
|
-
"@
|
|
11
|
+
"@emotion/react": "^11.14.0",
|
|
12
|
+
"@emotion/style": "^0.8.0",
|
|
13
|
+
"@mui/icons-material": "^7.3.4",
|
|
14
|
+
"@mui/material": "^7.3.4",
|
|
15
|
+
"@pie-lib/drag": "2.22.3-next.15",
|
|
16
|
+
"@pie-lib/editable-html": "11.21.3-next.15",
|
|
17
|
+
"@pie-lib/math-rendering": "3.22.2-next.16",
|
|
18
|
+
"@pie-lib/render-ui": "4.35.3-next.15",
|
|
15
19
|
"classnames": "^2.2.6",
|
|
16
20
|
"debug": "^4.1.1",
|
|
17
|
-
"
|
|
18
|
-
"immutable": ">=3.8.1",
|
|
21
|
+
"lodash": "^4.17.11",
|
|
19
22
|
"prop-types": "^15.7.2",
|
|
20
|
-
"react": "^
|
|
21
|
-
"react-
|
|
22
|
-
"slate": "^0.
|
|
23
|
-
"slate-html-serializer": "^0.
|
|
24
|
-
"slate-
|
|
25
|
-
"slate-
|
|
26
|
-
"slate-react": "^0.82.1",
|
|
23
|
+
"react": "^18.2.0",
|
|
24
|
+
"react-dom": "^18.2.0",
|
|
25
|
+
"slate": "^0.36.2",
|
|
26
|
+
"slate-html-serializer": "^0.6.12",
|
|
27
|
+
"slate-prop-types": "^0.4.38",
|
|
28
|
+
"slate-react": "^0.14.3",
|
|
27
29
|
"to-style": "^1.3.3"
|
|
28
30
|
},
|
|
29
31
|
"keywords": [],
|
|
30
32
|
"author": "",
|
|
31
|
-
"license": "ISC"
|
|
33
|
+
"license": "ISC",
|
|
34
|
+
"gitHead": "e0f8f2250addd014938f4a631ab86cafe16b2730",
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"require": "./lib/index.js",
|
|
38
|
+
"import": "./src/index.js",
|
|
39
|
+
"default": "./lib/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./esm": "./esm/index.js"
|
|
42
|
+
}
|
|
32
43
|
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import DragInTheBlank from '../drag-in-the-blank';
|
|
4
|
+
|
|
5
|
+
const markup = `<div>
|
|
6
|
+
<img src="https://image.shutterstock.com/image-vector/cow-jumped-over-moon-traditional-260nw-1152899330.jpg"></img>
|
|
7
|
+
<h5>Hey Diddle Diddle <i>by ?</i></h5>
|
|
8
|
+
<p>1: Hey, diddle, diddle,</p>
|
|
9
|
+
<p>2: The cat and the fiddle,</p>
|
|
10
|
+
<p>3: The cow {{0}} over the moon;</p>
|
|
11
|
+
<p>4: The little dog {{1}},</p>
|
|
12
|
+
<p>5: To see such sport,</p>
|
|
13
|
+
<p>6: And the dish ran away with the {{2}}.</p>
|
|
14
|
+
</div>`;
|
|
15
|
+
const choice = (v, id) => ({ value: v, id });
|
|
16
|
+
|
|
17
|
+
// Mock DragProvider and DragDroppablePlaceholder to avoid DndContext requirement
|
|
18
|
+
jest.mock('@pie-lib/drag', () => ({
|
|
19
|
+
DragProvider: ({ children, onDragStart, onDragEnd }) => {
|
|
20
|
+
// Simple wrapper that doesn't require DndContext
|
|
21
|
+
return <div data-testid="drag-provider">{children}</div>;
|
|
22
|
+
},
|
|
23
|
+
DragDroppablePlaceholder: ({ children, disabled, instanceId }) => {
|
|
24
|
+
// Simple wrapper that doesn't require useDroppable
|
|
25
|
+
return <div data-testid="drag-droppable-placeholder">{children}</div>;
|
|
26
|
+
},
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
// Mock @dnd-kit/core components and hooks used by DragInTheBlank and child components
|
|
30
|
+
jest.mock('@dnd-kit/core', () => ({
|
|
31
|
+
DragOverlay: ({ children }) => <div data-testid="drag-overlay">{children}</div>,
|
|
32
|
+
closestCenter: jest.fn(),
|
|
33
|
+
useDraggable: jest.fn(() => ({
|
|
34
|
+
attributes: {},
|
|
35
|
+
listeners: {},
|
|
36
|
+
setNodeRef: jest.fn(),
|
|
37
|
+
transform: null,
|
|
38
|
+
isDragging: false,
|
|
39
|
+
})),
|
|
40
|
+
useDroppable: jest.fn(() => ({
|
|
41
|
+
setNodeRef: jest.fn(),
|
|
42
|
+
isOver: false,
|
|
43
|
+
active: null,
|
|
44
|
+
})),
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
jest.mock('@dnd-kit/utilities', () => ({
|
|
48
|
+
CSS: {
|
|
49
|
+
Translate: {
|
|
50
|
+
toString: jest.fn(() => 'translate3d(0, 0, 0)'),
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
describe('DragInTheBlank', () => {
|
|
56
|
+
const defaultProps = {
|
|
57
|
+
disabled: false,
|
|
58
|
+
feedback: {},
|
|
59
|
+
markup,
|
|
60
|
+
choices: [
|
|
61
|
+
choice('Jumped', '0'),
|
|
62
|
+
choice('Laughed', '1'),
|
|
63
|
+
choice('Spoon', '2'),
|
|
64
|
+
choice('Fork', '3'),
|
|
65
|
+
choice('Bumped', '4'),
|
|
66
|
+
choice('Smiled', '5'),
|
|
67
|
+
],
|
|
68
|
+
|
|
69
|
+
value: {
|
|
70
|
+
0: undefined,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
describe('render', () => {
|
|
75
|
+
it('renders correctly with default props', () => {
|
|
76
|
+
const { container } = render(<DragInTheBlank {...defaultProps} />);
|
|
77
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
78
|
+
// Check that markup content is rendered
|
|
79
|
+
expect(screen.getByText(/Hey Diddle Diddle/)).toBeInTheDocument();
|
|
80
|
+
expect(screen.getByText(/Hey, diddle, diddle,/)).toBeInTheDocument();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('renders correctly with disabled prop as true', () => {
|
|
84
|
+
const { container } = render(<DragInTheBlank {...defaultProps} disabled={true} />);
|
|
85
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('renders correctly with feedback', () => {
|
|
89
|
+
const { container } = render(
|
|
90
|
+
<DragInTheBlank
|
|
91
|
+
{...defaultProps}
|
|
92
|
+
feedback={{
|
|
93
|
+
0: {
|
|
94
|
+
value: 'Jumped',
|
|
95
|
+
correct: 'Jumped',
|
|
96
|
+
},
|
|
97
|
+
1: {
|
|
98
|
+
value: 'Laughed',
|
|
99
|
+
correct: 'Laughed',
|
|
100
|
+
},
|
|
101
|
+
2: {
|
|
102
|
+
value: 'Spoon',
|
|
103
|
+
correct: 'Spoon',
|
|
104
|
+
},
|
|
105
|
+
}}
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import componentize from '../componentize';
|
|
3
|
+
import { deserialize } from '../serialization';
|
|
4
|
+
|
|
5
|
+
describe('index', () => {
|
|
6
|
+
describe('componentize', () => {
|
|
7
|
+
it('should return an array with the appropriate markup', () => {
|
|
8
|
+
const dropDownMarkup = componentize('{{0}} foo {{1}}', 'dropdown');
|
|
9
|
+
|
|
10
|
+
expect(dropDownMarkup).toEqual({
|
|
11
|
+
markup:
|
|
12
|
+
'<span data-component="dropdown" data-id="0"></span> foo <span data-component="dropdown" data-id="1"></span>',
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('serialization', () => {
|
|
18
|
+
it('should have default node a span', () => {
|
|
19
|
+
expect(deserialize('something')).toEqual(
|
|
20
|
+
expect.objectContaining({
|
|
21
|
+
object: 'value',
|
|
22
|
+
document: {
|
|
23
|
+
object: 'document',
|
|
24
|
+
data: {},
|
|
25
|
+
nodes: [
|
|
26
|
+
{
|
|
27
|
+
object: 'block',
|
|
28
|
+
data: {},
|
|
29
|
+
isVoid: false,
|
|
30
|
+
type: 'span',
|
|
31
|
+
nodes: [{ object: 'text', leaves: [{ text: 'something' }] }],
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
}),
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import Mask from '../mask';
|
|
4
|
+
|
|
5
|
+
describe('Mask', () => {
|
|
6
|
+
// Don't mock renderChildren - let the component render naturally
|
|
7
|
+
const onChange = jest.fn();
|
|
8
|
+
const defaultProps = {
|
|
9
|
+
onChange,
|
|
10
|
+
layout: {
|
|
11
|
+
nodes: [
|
|
12
|
+
{
|
|
13
|
+
object: 'text',
|
|
14
|
+
leaves: [
|
|
15
|
+
{
|
|
16
|
+
text: 'Foo',
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
value: {},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
onChange.mockClear();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('rendering', () => {
|
|
30
|
+
it('renders with default props', () => {
|
|
31
|
+
const { container } = render(<Mask {...defaultProps} />);
|
|
32
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('renders text content', () => {
|
|
36
|
+
render(<Mask {...defaultProps} />);
|
|
37
|
+
expect(screen.getByText('Foo')).toBeInTheDocument();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('renders a paragraph element', () => {
|
|
41
|
+
const { container } = render(
|
|
42
|
+
<Mask
|
|
43
|
+
{...defaultProps}
|
|
44
|
+
layout={{
|
|
45
|
+
nodes: [
|
|
46
|
+
{
|
|
47
|
+
type: 'p',
|
|
48
|
+
nodes: [
|
|
49
|
+
{
|
|
50
|
+
object: 'text',
|
|
51
|
+
leaves: [
|
|
52
|
+
{
|
|
53
|
+
text: 'Foo',
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
}}
|
|
61
|
+
/>,
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// Paragraph is rendered as a styled div, not a <p> tag
|
|
65
|
+
expect(screen.getByText('Foo')).toBeInTheDocument();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('renders nested div and paragraph', () => {
|
|
69
|
+
const { container } = render(
|
|
70
|
+
<Mask
|
|
71
|
+
{...defaultProps}
|
|
72
|
+
layout={{
|
|
73
|
+
nodes: [
|
|
74
|
+
{
|
|
75
|
+
type: 'div',
|
|
76
|
+
data: {
|
|
77
|
+
attributes: {},
|
|
78
|
+
},
|
|
79
|
+
nodes: [
|
|
80
|
+
{
|
|
81
|
+
type: 'p',
|
|
82
|
+
data: {
|
|
83
|
+
attributes: {},
|
|
84
|
+
},
|
|
85
|
+
nodes: [
|
|
86
|
+
{
|
|
87
|
+
object: 'text',
|
|
88
|
+
leaves: [
|
|
89
|
+
{
|
|
90
|
+
text: 'Foo',
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
}}
|
|
100
|
+
/>,
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
expect(container.querySelector('div')).toBeInTheDocument();
|
|
104
|
+
// Paragraph is rendered as a styled div, not a <p> tag
|
|
105
|
+
expect(screen.getByText('Foo')).toBeInTheDocument();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('renders text with italic marks', () => {
|
|
109
|
+
const { container } = render(
|
|
110
|
+
<Mask
|
|
111
|
+
{...defaultProps}
|
|
112
|
+
layout={{
|
|
113
|
+
nodes: [
|
|
114
|
+
{
|
|
115
|
+
leaves: [{ text: 'Foo ' }],
|
|
116
|
+
object: 'text',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
leaves: [
|
|
120
|
+
{
|
|
121
|
+
marks: [
|
|
122
|
+
{
|
|
123
|
+
data: undefined,
|
|
124
|
+
type: 'italic',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
text: 'x',
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
object: 'text',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
leaves: [{ text: ' bar' }],
|
|
134
|
+
object: 'text',
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
object: 'block',
|
|
138
|
+
type: 'div',
|
|
139
|
+
}}
|
|
140
|
+
/>,
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
// Text "Foo " is split with spaces, use regex
|
|
144
|
+
expect(screen.getByText(/Foo/)).toBeInTheDocument();
|
|
145
|
+
expect(screen.getByText('x')).toBeInTheDocument();
|
|
146
|
+
expect(screen.getByText(/bar/)).toBeInTheDocument();
|
|
147
|
+
// Check for italic/em element
|
|
148
|
+
const em = container.querySelector('em, i');
|
|
149
|
+
expect(em).toBeInTheDocument();
|
|
150
|
+
expect(em.textContent).toBe('x');
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('renders tbody without extra space', () => {
|
|
154
|
+
const da = () => ({ data: { attributes: {} } });
|
|
155
|
+
const { container } = render(
|
|
156
|
+
<Mask
|
|
157
|
+
{...defaultProps}
|
|
158
|
+
layout={{
|
|
159
|
+
nodes: [
|
|
160
|
+
{
|
|
161
|
+
type: 'table',
|
|
162
|
+
...da(),
|
|
163
|
+
nodes: [
|
|
164
|
+
{
|
|
165
|
+
type: 'tbody',
|
|
166
|
+
...da(),
|
|
167
|
+
nodes: [
|
|
168
|
+
{
|
|
169
|
+
object: 'text',
|
|
170
|
+
leaves: [{ text: ' ' }],
|
|
171
|
+
},
|
|
172
|
+
{ type: 'tr', ...da(), nodes: [] },
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
}}
|
|
179
|
+
/>,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
expect(container.querySelector('table')).toBeInTheDocument();
|
|
183
|
+
expect(container.querySelector('tbody')).toBeInTheDocument();
|
|
184
|
+
expect(container.querySelector('tr')).toBeInTheDocument();
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
});
|