@kids-reporter/draft-editor 0.1.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/README.md +51 -0
- package/lib/.selector/align-selector.js +71 -0
- package/lib/.selector/audio-selector.js +268 -0
- package/lib/.selector/image-selector.js +430 -0
- package/lib/.selector/pagination.js +82 -0
- package/lib/.selector/post-selector.js +311 -0
- package/lib/.selector/search-box.js +46 -0
- package/lib/.selector/video-selector.js +285 -0
- package/lib/block-renderer/background-image-block.js +141 -0
- package/lib/block-renderer/background-video-block.js +151 -0
- package/lib/block-renderer/color-box-block.js +86 -0
- package/lib/block-renderer/info-box-block.js +86 -0
- package/lib/block-renderer/side-index-block.js +90 -0
- package/lib/block-renderer/table-block.js +408 -0
- package/lib/block-renderer-fn.js +131 -0
- package/lib/buttons/annotation.js +117 -0
- package/lib/buttons/audio.js +65 -0
- package/lib/buttons/background-color.js +122 -0
- package/lib/buttons/background-image.js +223 -0
- package/lib/buttons/background-video.js +223 -0
- package/lib/buttons/color-box.js +173 -0
- package/lib/buttons/divider.js +63 -0
- package/lib/buttons/embedded-code.js +109 -0
- package/lib/buttons/enlarge.js +24 -0
- package/lib/buttons/font-color.js +115 -0
- package/lib/buttons/image.js +70 -0
- package/lib/buttons/info-box.js +148 -0
- package/lib/buttons/link.js +107 -0
- package/lib/buttons/media.js +121 -0
- package/lib/buttons/related-post.js +71 -0
- package/lib/buttons/selector/align-selector.js +71 -0
- package/lib/buttons/selector/audio-selector.js +279 -0
- package/lib/buttons/selector/image-selector.js +417 -0
- package/lib/buttons/selector/pagination.js +82 -0
- package/lib/buttons/selector/post-selector.js +317 -0
- package/lib/buttons/selector/search-box.js +46 -0
- package/lib/buttons/selector/video-selector.js +281 -0
- package/lib/buttons/side-index.js +200 -0
- package/lib/buttons/slideshow.js +71 -0
- package/lib/buttons/table.js +67 -0
- package/lib/buttons/text-align.js +88 -0
- package/lib/buttons/video.js +65 -0
- package/lib/buttons/youtube.js +147 -0
- package/lib/const.js +18 -0
- package/lib/draft-converter/api-data-instance.js +58 -0
- package/lib/draft-converter/atomic-block-processor.js +233 -0
- package/lib/draft-converter/entities.js +76 -0
- package/lib/draft-converter/index.js +201 -0
- package/lib/draft-converter/inline-styles-processor.js +236 -0
- package/lib/draft-editor.js +918 -0
- package/lib/entity-decorator.js +20 -0
- package/lib/index.js +15 -0
- package/lib/modifier.js +68 -0
- package/lib/theme/index.js +39 -0
- package/package.json +41 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.AlignCenterButton = AlignCenterButton;
|
|
7
|
+
exports.AlignLeftButton = AlignLeftButton;
|
|
8
|
+
exports.getSelectionBlockData = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _draftJs = require("draft-js");
|
|
13
|
+
|
|
14
|
+
var _modifier = require("../modifier");
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
|
|
18
|
+
const toggleSelectionTextAlign = (editorState, textAlign) => {
|
|
19
|
+
return setSelectionBlockData(editorState, {
|
|
20
|
+
textAlign: getSelectionBlockData(editorState, 'textAlign') !== textAlign ? textAlign : undefined
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const setSelectionBlockData = (editorState, blockData) => {
|
|
25
|
+
return _modifier.Modifier.setBlockData(editorState.getCurrentContent(), editorState.getSelection(), blockData);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const getSelectionBlockData = (editorState, name) => {
|
|
29
|
+
const block = editorState.getCurrentContent().getBlockForKey(editorState.getSelection().getAnchorKey());
|
|
30
|
+
const blockData = block.getData();
|
|
31
|
+
return blockData.get(name);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
exports.getSelectionBlockData = getSelectionBlockData;
|
|
35
|
+
|
|
36
|
+
function AlignCenterButton(props) {
|
|
37
|
+
const {
|
|
38
|
+
isActive,
|
|
39
|
+
editorState,
|
|
40
|
+
onChange
|
|
41
|
+
} = props;
|
|
42
|
+
|
|
43
|
+
const toggleTextAlign = () => {
|
|
44
|
+
const newContentState = toggleSelectionTextAlign(editorState, 'center');
|
|
45
|
+
onChange(_draftJs.EditorState.push(editorState, newContentState, 'change-block-style'));
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
49
|
+
className: props.className,
|
|
50
|
+
onMouseDown: toggleTextAlign
|
|
51
|
+
}, /*#__PURE__*/_react.default.createElement("svg", {
|
|
52
|
+
width: "16",
|
|
53
|
+
height: "16",
|
|
54
|
+
viewBox: "0 0 16 16",
|
|
55
|
+
fill: "none",
|
|
56
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
57
|
+
}, /*#__PURE__*/_react.default.createElement("path", {
|
|
58
|
+
d: "M11.4286 2.28571H4.57143C3.93929 2.28571 3.42857 1.77393 3.42857 1.14286C3.42857 0.511786 3.93929 0 4.57143 0H11.4286C12.0607 0 12.5714 0.511786 12.5714 1.14286C12.5714 1.77393 12.0607 2.28571 11.4286 2.28571ZM14.8571 6.85714H1.14286C0.511786 6.85714 0 6.34643 0 5.71429C0 5.08214 0.511786 4.57143 1.14286 4.57143H14.8571C15.4893 4.57143 16 5.08214 16 5.71429C16 6.34643 15.4893 6.85714 14.8571 6.85714ZM0 14.8571C0 14.225 0.511786 13.7143 1.14286 13.7143H14.8571C15.4893 13.7143 16 14.225 16 14.8571C16 15.4893 15.4893 16 14.8571 16H1.14286C0.511786 16 0 15.4893 0 14.8571ZM11.4286 11.4286H4.57143C3.93929 11.4286 3.42857 10.9179 3.42857 10.2857C3.42857 9.65357 3.93929 9.14286 4.57143 9.14286H11.4286C12.0607 9.14286 12.5714 9.65357 12.5714 10.2857C12.5714 10.9179 12.0607 11.4286 11.4286 11.4286Z",
|
|
59
|
+
fill: isActive ? '#ED8B00' : '#6b7280'
|
|
60
|
+
}))));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function AlignLeftButton(props) {
|
|
64
|
+
const {
|
|
65
|
+
isActive,
|
|
66
|
+
editorState,
|
|
67
|
+
onChange
|
|
68
|
+
} = props;
|
|
69
|
+
|
|
70
|
+
const toggleTextAlign = () => {
|
|
71
|
+
const newContentState = toggleSelectionTextAlign(editorState, 'left');
|
|
72
|
+
onChange(_draftJs.EditorState.push(editorState, newContentState, 'change-block-style'));
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
76
|
+
className: props.className,
|
|
77
|
+
onMouseDown: toggleTextAlign
|
|
78
|
+
}, /*#__PURE__*/_react.default.createElement("svg", {
|
|
79
|
+
width: "16",
|
|
80
|
+
height: "16",
|
|
81
|
+
viewBox: "0 0 16 16",
|
|
82
|
+
fill: "none",
|
|
83
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
84
|
+
}, /*#__PURE__*/_react.default.createElement("path", {
|
|
85
|
+
d: "M9.14286 2.28571H1.14286C0.511786 2.28571 0 1.77393 0 1.14286C0 0.511786 0.511786 0 1.14286 0H9.14286C9.775 0 10.2857 0.511786 10.2857 1.14286C10.2857 1.77393 9.775 2.28571 9.14286 2.28571ZM9.14286 11.4286H1.14286C0.511786 11.4286 0 10.9179 0 10.2857C0 9.65357 0.511786 9.14286 1.14286 9.14286H9.14286C9.775 9.14286 10.2857 9.65357 10.2857 10.2857C10.2857 10.9179 9.775 11.4286 9.14286 11.4286ZM0 5.71429C0 5.08214 0.511786 4.57143 1.14286 4.57143H14.8571C15.4893 4.57143 16 5.08214 16 5.71429C16 6.34643 15.4893 6.85714 14.8571 6.85714H1.14286C0.511786 6.85714 0 6.34643 0 5.71429ZM14.8571 16H1.14286C0.511786 16 0 15.4893 0 14.8571C0 14.225 0.511786 13.7143 1.14286 13.7143H14.8571C15.4893 13.7143 16 14.225 16 14.8571C16 15.4893 15.4893 16 14.8571 16Z",
|
|
86
|
+
fill: isActive ? '#ED8B00' : '#6b7280'
|
|
87
|
+
}))));
|
|
88
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.VideoButton = VideoButton;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _draftJs = require("draft-js");
|
|
11
|
+
|
|
12
|
+
var _videoSelector = require("./selector/video-selector");
|
|
13
|
+
|
|
14
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
|
+
|
|
16
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
+
|
|
18
|
+
function VideoButton(props) {
|
|
19
|
+
const {
|
|
20
|
+
editorState,
|
|
21
|
+
onChange,
|
|
22
|
+
className,
|
|
23
|
+
VideoSelector = _videoSelector.VideoSelector
|
|
24
|
+
} = props;
|
|
25
|
+
const [toShowVideoSelector, setToShowVideoSelector] = (0, _react.useState)(false);
|
|
26
|
+
|
|
27
|
+
const promptForVideoSelector = () => {
|
|
28
|
+
setToShowVideoSelector(true);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const onVideoSelectorChange = selectedVideosWithMeta => {
|
|
32
|
+
var _selectedVideosWithMe;
|
|
33
|
+
|
|
34
|
+
const video = selectedVideosWithMeta === null || selectedVideosWithMeta === void 0 ? void 0 : (_selectedVideosWithMe = selectedVideosWithMeta[0]) === null || _selectedVideosWithMe === void 0 ? void 0 : _selectedVideosWithMe.video;
|
|
35
|
+
|
|
36
|
+
if (!video) {
|
|
37
|
+
setToShowVideoSelector(false);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const contentState = editorState.getCurrentContent();
|
|
42
|
+
const contentStateWithEntity = contentState.createEntity('VIDEO', 'IMMUTABLE', {
|
|
43
|
+
video
|
|
44
|
+
});
|
|
45
|
+
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
|
|
46
|
+
|
|
47
|
+
const newEditorState = _draftJs.EditorState.set(editorState, {
|
|
48
|
+
currentContent: contentStateWithEntity
|
|
49
|
+
}); // The third parameter here is a space string, not an empty string
|
|
50
|
+
// If you set an empty string, you will get an error: Unknown DraftEntity key: null
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
onChange(_draftJs.AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' '));
|
|
54
|
+
setToShowVideoSelector(false);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, toShowVideoSelector && /*#__PURE__*/_react.default.createElement(VideoSelector, {
|
|
58
|
+
onChange: onVideoSelectorChange
|
|
59
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
60
|
+
className: className,
|
|
61
|
+
onClick: promptForVideoSelector
|
|
62
|
+
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
63
|
+
className: "fa fa-video-camera"
|
|
64
|
+
}), /*#__PURE__*/_react.default.createElement("span", null, " Video")));
|
|
65
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.YoutubeButton = YoutubeButton;
|
|
7
|
+
exports.YoutubeInput = YoutubeInput;
|
|
8
|
+
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
|
|
11
|
+
var _draftJs = require("draft-js");
|
|
12
|
+
|
|
13
|
+
var _modals = require("@keystone-ui/modals");
|
|
14
|
+
|
|
15
|
+
var _fields = require("@keystone-ui/fields");
|
|
16
|
+
|
|
17
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
18
|
+
|
|
19
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
|
+
|
|
21
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
22
|
+
|
|
23
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
24
|
+
|
|
25
|
+
const Label = _styledComponents.default.label`
|
|
26
|
+
display: block;
|
|
27
|
+
font-weight: 600;
|
|
28
|
+
margin: 10px 0;
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
function YoutubeInput(props) {
|
|
32
|
+
const {
|
|
33
|
+
isOpen,
|
|
34
|
+
onChange,
|
|
35
|
+
onCancel
|
|
36
|
+
} = props;
|
|
37
|
+
const initialInputValue = {
|
|
38
|
+
description: '',
|
|
39
|
+
youtubeId: ''
|
|
40
|
+
};
|
|
41
|
+
const [inputValue, setInputValue] = (0, _react.useState)(initialInputValue);
|
|
42
|
+
|
|
43
|
+
const clearInputValue = () => {
|
|
44
|
+
setInputValue(initialInputValue);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return /*#__PURE__*/_react.default.createElement(_modals.DrawerController, {
|
|
48
|
+
isOpen: isOpen
|
|
49
|
+
}, /*#__PURE__*/_react.default.createElement(_modals.Drawer, {
|
|
50
|
+
title: `Insert Youtube video`,
|
|
51
|
+
actions: {
|
|
52
|
+
cancel: {
|
|
53
|
+
label: 'Cancel',
|
|
54
|
+
action: () => {
|
|
55
|
+
clearInputValue();
|
|
56
|
+
onCancel();
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
confirm: {
|
|
60
|
+
label: 'Confirm',
|
|
61
|
+
action: () => {
|
|
62
|
+
onChange({
|
|
63
|
+
description: inputValue.description,
|
|
64
|
+
youtubeId: inputValue.youtubeId
|
|
65
|
+
});
|
|
66
|
+
clearInputValue();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}, /*#__PURE__*/_react.default.createElement(Label, {
|
|
71
|
+
htmlFor: "description"
|
|
72
|
+
}, "Youtube Description"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
|
|
73
|
+
onChange: e => setInputValue({
|
|
74
|
+
description: e.target.value,
|
|
75
|
+
youtubeId: inputValue.youtubeId
|
|
76
|
+
}),
|
|
77
|
+
type: "text",
|
|
78
|
+
placeholder: "description",
|
|
79
|
+
id: "description",
|
|
80
|
+
value: inputValue.description
|
|
81
|
+
}), /*#__PURE__*/_react.default.createElement(Label, {
|
|
82
|
+
htmlFor: "youtubeId"
|
|
83
|
+
}, "Youtube Videi Id"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
|
|
84
|
+
onChange: e => setInputValue({
|
|
85
|
+
description: inputValue.description,
|
|
86
|
+
youtubeId: e.target.value
|
|
87
|
+
}),
|
|
88
|
+
type: "text",
|
|
89
|
+
placeholder: "youtubeId",
|
|
90
|
+
id: "youtubeId",
|
|
91
|
+
value: inputValue.youtubeId
|
|
92
|
+
})));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function YoutubeButton(props) {
|
|
96
|
+
const [toShowInput, setToShowInput] = (0, _react.useState)(false);
|
|
97
|
+
const {
|
|
98
|
+
className,
|
|
99
|
+
editorState,
|
|
100
|
+
onChange: onEditorStateChange
|
|
101
|
+
} = props;
|
|
102
|
+
|
|
103
|
+
const onChange = ({
|
|
104
|
+
description,
|
|
105
|
+
youtubeId
|
|
106
|
+
}) => {
|
|
107
|
+
const contentState = editorState.getCurrentContent(); // create an InfoBox entity
|
|
108
|
+
|
|
109
|
+
const contentStateWithEntity = contentState.createEntity('YOUTUBE', 'IMMUTABLE', {
|
|
110
|
+
description,
|
|
111
|
+
youtubeId
|
|
112
|
+
});
|
|
113
|
+
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
|
|
114
|
+
|
|
115
|
+
const newEditorState = _draftJs.EditorState.set(editorState, {
|
|
116
|
+
currentContent: contentStateWithEntity
|
|
117
|
+
}); //The third parameter here is a space string, not an empty string
|
|
118
|
+
//If you set an empty string, you will get an error: Unknown DraftEntity key: null
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
onEditorStateChange(_draftJs.AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' '));
|
|
122
|
+
setToShowInput(false);
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(YoutubeInput, {
|
|
126
|
+
onChange: onChange,
|
|
127
|
+
onCancel: () => {
|
|
128
|
+
setToShowInput(false);
|
|
129
|
+
},
|
|
130
|
+
isOpen: toShowInput
|
|
131
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
132
|
+
className: className,
|
|
133
|
+
onClick: () => {
|
|
134
|
+
setToShowInput(true);
|
|
135
|
+
}
|
|
136
|
+
}, /*#__PURE__*/_react.default.createElement("svg", {
|
|
137
|
+
height: "16px",
|
|
138
|
+
width: "14px",
|
|
139
|
+
version: "1.1",
|
|
140
|
+
id: "Layer_1",
|
|
141
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
142
|
+
viewBox: "0 0 461.001 461.001"
|
|
143
|
+
}, /*#__PURE__*/_react.default.createElement("path", {
|
|
144
|
+
fill: "#6b7280",
|
|
145
|
+
d: "M365.257,67.393H95.744C42.866,67.393,0,110.259,0,163.137v134.728 c0,52.878,42.866,95.744,95.744,95.744h269.513c52.878,0,95.744-42.866,95.744-95.744V163.137 C461.001,110.259,418.135,67.393,365.257,67.393z M300.506,237.056l-126.06,60.123c-3.359,1.602-7.239-0.847-7.239-4.568V168.607 c0-3.774,3.982-6.22,7.348-4.514l126.06,63.881C304.363,229.873,304.298,235.248,300.506,237.056z"
|
|
146
|
+
})), /*#__PURE__*/_react.default.createElement("span", null, "Youtube")));
|
|
147
|
+
}
|
package/lib/const.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _const = require("@kids-reporter/draft-renderer/lib/const");
|
|
8
|
+
|
|
9
|
+
Object.keys(_const).forEach(function (key) {
|
|
10
|
+
if (key === "default" || key === "__esModule") return;
|
|
11
|
+
if (key in exports && exports[key] === _const[key]) return;
|
|
12
|
+
Object.defineProperty(exports, key, {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _const[key];
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _immutable = require("immutable");
|
|
9
|
+
|
|
10
|
+
var _shortid = _interopRequireDefault(require("shortid"));
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
const ApiDataInstanceRecord = (0, _immutable.Record)({
|
|
15
|
+
id: _shortid.default.generate(),
|
|
16
|
+
type: 'paragraph',
|
|
17
|
+
alignment: 'center',
|
|
18
|
+
content: [],
|
|
19
|
+
styles: {},
|
|
20
|
+
textAlign: undefined
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
class ApiDataInstance extends ApiDataInstanceRecord {
|
|
24
|
+
constructor(props) {
|
|
25
|
+
let id = props && props.id || _shortid.default.generate();
|
|
26
|
+
|
|
27
|
+
props.id = id;
|
|
28
|
+
super(props);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
getId() {
|
|
32
|
+
return this.get('id');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
getType() {
|
|
36
|
+
return this.get('type');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
getAlignment() {
|
|
40
|
+
return this.get('alignment');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
getContent() {
|
|
44
|
+
return this.get('content');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
getStyles() {
|
|
48
|
+
return this.get('styles');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
getTextAlign() {
|
|
52
|
+
return this.get('textAlign');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
var _default = ApiDataInstance;
|
|
58
|
+
exports.default = _default;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
|
+
|
|
10
|
+
var _apiDataInstance = _interopRequireDefault(require("./api-data-instance"));
|
|
11
|
+
|
|
12
|
+
var _entities = _interopRequireDefault(require("./entities"));
|
|
13
|
+
|
|
14
|
+
var _server = _interopRequireDefault(require("react-dom/server"));
|
|
15
|
+
|
|
16
|
+
var _draftJs = require("draft-js");
|
|
17
|
+
|
|
18
|
+
var _draftConvert = require("draft-convert");
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
23
|
+
// import sizeOf from 'image-size';
|
|
24
|
+
// eslint-disable-line
|
|
25
|
+
// import htmlparser2 from 'htmlparser2'
|
|
26
|
+
// eslint-disable-next-line no-undef
|
|
27
|
+
const htmlparser2 = require('htmlparser2');
|
|
28
|
+
/**
|
|
29
|
+
* @typedef {Object} DraftEditor.TableEntity.TableStyles
|
|
30
|
+
* @property {Record<string, string>[]} rows
|
|
31
|
+
* @property {Record<string, string>[]} columns
|
|
32
|
+
* @property {Record<string, string>[][]} cells
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @typedef {RawDraftContentState[][]} DraftEditor.TableEntity.TableData
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
const processor = {
|
|
41
|
+
convertBlock(entityMap, block) {
|
|
42
|
+
let alignment = 'center';
|
|
43
|
+
let content;
|
|
44
|
+
let entityRange = block.entityRanges[0];
|
|
45
|
+
let styles = {}; // current block's entity data
|
|
46
|
+
// ex:
|
|
47
|
+
// entity.type = IMAGE, entity.data={id,name,url...}
|
|
48
|
+
|
|
49
|
+
const entity = entityMap[entityRange.key];
|
|
50
|
+
|
|
51
|
+
let type = _lodash.default.get(entity, 'type', ''); // backward compatible. Old entity type might be lower case
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
switch (type && type.toUpperCase()) {
|
|
55
|
+
case _entities.default.INFOBOX.type:
|
|
56
|
+
{
|
|
57
|
+
var _entity$data, _entity$data2;
|
|
58
|
+
|
|
59
|
+
// About INFOBOX atomic block entity data structure,
|
|
60
|
+
// see `../views/editor/info-box.tsx` for more information.
|
|
61
|
+
content = [{
|
|
62
|
+
title: entity === null || entity === void 0 ? void 0 : (_entity$data = entity.data) === null || _entity$data === void 0 ? void 0 : _entity$data.title,
|
|
63
|
+
body: entity === null || entity === void 0 ? void 0 : (_entity$data2 = entity.data) === null || _entity$data2 === void 0 ? void 0 : _entity$data2.body
|
|
64
|
+
}];
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
case _entities.default.COLORBOX.type:
|
|
69
|
+
{
|
|
70
|
+
var _entity$data3, _entity$data4;
|
|
71
|
+
|
|
72
|
+
content = [{
|
|
73
|
+
color: entity === null || entity === void 0 ? void 0 : (_entity$data3 = entity.data) === null || _entity$data3 === void 0 ? void 0 : _entity$data3.color,
|
|
74
|
+
body: entity === null || entity === void 0 ? void 0 : (_entity$data4 = entity.data) === null || _entity$data4 === void 0 ? void 0 : _entity$data4.body
|
|
75
|
+
}];
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
case _entities.default.TABLE.type:
|
|
80
|
+
{
|
|
81
|
+
var _content, _content2;
|
|
82
|
+
|
|
83
|
+
// About TABLE atomic block entity data structure,
|
|
84
|
+
// see `../views/editor/table.tsx` for more information.
|
|
85
|
+
content = entity === null || entity === void 0 ? void 0 : entity.data;
|
|
86
|
+
/** @type DraftEditor.TableEntity.TableStyles */
|
|
87
|
+
|
|
88
|
+
const tableStyles = (_content = content) === null || _content === void 0 ? void 0 : _content.tableStyles;
|
|
89
|
+
/** @type DraftEditor.TableEntity.TableData */
|
|
90
|
+
|
|
91
|
+
const tableData = (_content2 = content) === null || _content2 === void 0 ? void 0 : _content2.tableData;
|
|
92
|
+
const rowsJsx = tableData === null || tableData === void 0 ? void 0 : tableData.map((row, rIndex) => {
|
|
93
|
+
var _tableStyles$rows;
|
|
94
|
+
|
|
95
|
+
const colsJsx = row === null || row === void 0 ? void 0 : row.map((col, cIndex) => {
|
|
96
|
+
var _tableStyles$columns, _tableStyles$cells, _tableStyles$cells$rI;
|
|
97
|
+
|
|
98
|
+
const colStyle = tableStyles === null || tableStyles === void 0 ? void 0 : (_tableStyles$columns = tableStyles.columns) === null || _tableStyles$columns === void 0 ? void 0 : _tableStyles$columns[cIndex];
|
|
99
|
+
const cellStyle = tableStyles === null || tableStyles === void 0 ? void 0 : (_tableStyles$cells = tableStyles.cells) === null || _tableStyles$cells === void 0 ? void 0 : (_tableStyles$cells$rI = _tableStyles$cells[rIndex]) === null || _tableStyles$cells$rI === void 0 ? void 0 : _tableStyles$cells$rI[cIndex];
|
|
100
|
+
return /*#__PURE__*/React.createElement("td", {
|
|
101
|
+
key: `col_${cIndex}`,
|
|
102
|
+
style: Object.assign({}, colStyle, cellStyle),
|
|
103
|
+
dangerouslySetInnerHTML: {
|
|
104
|
+
__html: (0, _draftConvert.convertToHTML)((0, _draftJs.convertFromRaw)(col))
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
return /*#__PURE__*/React.createElement("tr", {
|
|
109
|
+
key: `row_${rIndex}`,
|
|
110
|
+
style: tableStyles === null || tableStyles === void 0 ? void 0 : (_tableStyles$rows = tableStyles.rows) === null || _tableStyles$rows === void 0 ? void 0 : _tableStyles$rows[rIndex]
|
|
111
|
+
}, colsJsx);
|
|
112
|
+
}); // Use `React.renderToStsaticMarkup` to generate plain HTML string
|
|
113
|
+
|
|
114
|
+
const html = _server.default.renderToStaticMarkup( /*#__PURE__*/React.createElement("table", null, /*#__PURE__*/React.createElement("tbody", null, rowsJsx)));
|
|
115
|
+
|
|
116
|
+
content = [{
|
|
117
|
+
html
|
|
118
|
+
}];
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
case _entities.default.DIVIDER.type:
|
|
123
|
+
content = ['<hr>'];
|
|
124
|
+
break;
|
|
125
|
+
|
|
126
|
+
case _entities.default.BLOCKQUOTE.type:
|
|
127
|
+
// this is different from default blockquote of draftjs
|
|
128
|
+
// so we name our specific blockquote as 'quoteby'
|
|
129
|
+
type = 'quoteby';
|
|
130
|
+
alignment = entity.data && entity.data.alignment || alignment;
|
|
131
|
+
content = _lodash.default.get(entity, 'data');
|
|
132
|
+
content = Array.isArray(content) ? content : [content];
|
|
133
|
+
break;
|
|
134
|
+
|
|
135
|
+
case _entities.default.AUDIO.type:
|
|
136
|
+
case _entities.default.IMAGE.type:
|
|
137
|
+
case _entities.default.IMAGEDIFF.type:
|
|
138
|
+
case _entities.default.SLIDESHOW.type:
|
|
139
|
+
case _entities.default['SLIDESHOW-V2'].type:
|
|
140
|
+
case _entities.default.VIDEO.type:
|
|
141
|
+
case _entities.default.YOUTUBE.type:
|
|
142
|
+
case _entities.default.BACKGROUNDIMAGE.type:
|
|
143
|
+
case _entities.default.BACKGROUNDVIDEO.type:
|
|
144
|
+
case _entities.default.RELATEDPOST.type:
|
|
145
|
+
case _entities.default.SIDEINDEX.type:
|
|
146
|
+
alignment = entity.data && entity.data.alignment || alignment;
|
|
147
|
+
content = _lodash.default.get(entity, 'data');
|
|
148
|
+
content = Array.isArray(content) ? content : [content];
|
|
149
|
+
break;
|
|
150
|
+
|
|
151
|
+
case _entities.default.IMAGELINK.type:
|
|
152
|
+
{
|
|
153
|
+
// use Embedded component to dangerouslySetInnerHTML
|
|
154
|
+
type = _entities.default.EMBEDDEDCODE.type;
|
|
155
|
+
alignment = entity.data && entity.data.alignment || alignment;
|
|
156
|
+
|
|
157
|
+
let description = _lodash.default.get(entity, ['data', 'description'], '');
|
|
158
|
+
|
|
159
|
+
let url = _lodash.default.get(entity, ['data', 'url'], '');
|
|
160
|
+
|
|
161
|
+
content = [{
|
|
162
|
+
caption: description,
|
|
163
|
+
embeddedCodeWithoutScript: `<img alt="${description}" src="${url}" class="img-responsive"/>`,
|
|
164
|
+
url: url
|
|
165
|
+
}];
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
case _entities.default.EMBEDDEDCODE.type:
|
|
170
|
+
{
|
|
171
|
+
alignment = entity.data && entity.data.alignment || alignment;
|
|
172
|
+
|
|
173
|
+
let caption = _lodash.default.get(entity, ['data', 'caption'], '');
|
|
174
|
+
|
|
175
|
+
let embeddedCode = _lodash.default.get(entity, ['data', 'embeddedCode'], '');
|
|
176
|
+
|
|
177
|
+
let script = {};
|
|
178
|
+
let scripts = [];
|
|
179
|
+
let scriptTagStart = false;
|
|
180
|
+
let height;
|
|
181
|
+
let width;
|
|
182
|
+
let parser = new htmlparser2.Parser({
|
|
183
|
+
onopentag: (name, attribs) => {
|
|
184
|
+
if (name === 'script') {
|
|
185
|
+
scriptTagStart = true;
|
|
186
|
+
script.attribs = attribs;
|
|
187
|
+
} else if (name === 'iframe') {
|
|
188
|
+
height = _lodash.default.get(attribs, 'height', 0);
|
|
189
|
+
width = _lodash.default.get(attribs, 'width', 0);
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
ontext: text => {
|
|
193
|
+
if (scriptTagStart) {
|
|
194
|
+
script.text = text;
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
onclosetag: tagname => {
|
|
198
|
+
if (tagname === 'script' && scriptTagStart) {
|
|
199
|
+
scriptTagStart = false;
|
|
200
|
+
scripts.push(script);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
parser.write(embeddedCode);
|
|
205
|
+
parser.end();
|
|
206
|
+
content = [{
|
|
207
|
+
caption,
|
|
208
|
+
embeddedCode,
|
|
209
|
+
embeddedCodeWithoutScript: embeddedCode.replace(/<script(.+?)\/script>/g, ''),
|
|
210
|
+
height,
|
|
211
|
+
scripts,
|
|
212
|
+
width
|
|
213
|
+
}];
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
default:
|
|
218
|
+
return;
|
|
219
|
+
} // block type of api data should be lower case
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
return new _apiDataInstance.default({
|
|
223
|
+
id: block.key,
|
|
224
|
+
alignment,
|
|
225
|
+
type: type && type.toLowerCase(),
|
|
226
|
+
content,
|
|
227
|
+
styles
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
};
|
|
232
|
+
var _default = processor;
|
|
233
|
+
exports.default = _default;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
// 'use strict';
|
|
8
|
+
const ENTITY = {
|
|
9
|
+
DIVIDER: {
|
|
10
|
+
type: 'DIVIDER'
|
|
11
|
+
},
|
|
12
|
+
ANNOTATION: {
|
|
13
|
+
type: 'ANNOTATION'
|
|
14
|
+
},
|
|
15
|
+
BLOCKQUOTE: {
|
|
16
|
+
type: 'BLOCKQUOTE'
|
|
17
|
+
},
|
|
18
|
+
LINK: {
|
|
19
|
+
type: 'LINK'
|
|
20
|
+
},
|
|
21
|
+
INFOBOX: {
|
|
22
|
+
type: 'INFOBOX'
|
|
23
|
+
},
|
|
24
|
+
COLORBOX: {
|
|
25
|
+
type: 'COLORBOX'
|
|
26
|
+
},
|
|
27
|
+
EMBEDDEDCODE: {
|
|
28
|
+
type: 'EMBEDDEDCODE'
|
|
29
|
+
},
|
|
30
|
+
AUDIO: {
|
|
31
|
+
type: 'AUDIO'
|
|
32
|
+
},
|
|
33
|
+
VIDEO: {
|
|
34
|
+
type: 'VIDEO'
|
|
35
|
+
},
|
|
36
|
+
IMAGE: {
|
|
37
|
+
type: 'IMAGE'
|
|
38
|
+
},
|
|
39
|
+
STOREDIMAGE: {
|
|
40
|
+
type: 'STOREDIMAGE'
|
|
41
|
+
},
|
|
42
|
+
IMAGEDIFF: {
|
|
43
|
+
type: 'IMAGEDIFF'
|
|
44
|
+
},
|
|
45
|
+
IMAGELINK: {
|
|
46
|
+
type: 'IMAGELINK'
|
|
47
|
+
},
|
|
48
|
+
SLIDESHOW: {
|
|
49
|
+
type: 'SLIDESHOW',
|
|
50
|
+
slideshowSelectionLimit: 30
|
|
51
|
+
},
|
|
52
|
+
['SLIDESHOW-V2']: {
|
|
53
|
+
type: 'SLIDESHOW-V2',
|
|
54
|
+
slideshowSelectionLimit: 30
|
|
55
|
+
},
|
|
56
|
+
YOUTUBE: {
|
|
57
|
+
type: 'YOUTUBE'
|
|
58
|
+
},
|
|
59
|
+
TABLE: {
|
|
60
|
+
type: 'TABLE'
|
|
61
|
+
},
|
|
62
|
+
BACKGROUNDIMAGE: {
|
|
63
|
+
type: 'BACKGROUNDIMAGE'
|
|
64
|
+
},
|
|
65
|
+
BACKGROUNDVIDEO: {
|
|
66
|
+
type: 'BACKGROUNDVIDEO'
|
|
67
|
+
},
|
|
68
|
+
RELATEDPOST: {
|
|
69
|
+
type: 'RELATEDPOST'
|
|
70
|
+
},
|
|
71
|
+
SIDEINDEX: {
|
|
72
|
+
type: 'SIDEINDEX'
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var _default = ENTITY;
|
|
76
|
+
exports.default = _default;
|