@seafile/sea-email-editor 0.0.5 → 0.0.7
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/dist/assets/icons/divider.svg +1 -0
- package/dist/editor/index.js +2 -1
- package/dist/editor/main/index.js +3 -1
- package/dist/extension/constants/element-default-style.js +9 -2
- package/dist/extension/constants/element-types.js +2 -1
- package/dist/extension/constants/menus-config.js +10 -1
- package/dist/extension/plugins/code-block/menu/index.js +15 -12
- package/dist/extension/plugins/divider/helper.js +38 -0
- package/dist/extension/plugins/divider/index.js +17 -0
- package/dist/extension/plugins/divider/menu/index.js +61 -0
- package/dist/extension/plugins/divider/plugin.js +87 -0
- package/dist/extension/plugins/divider/render-elem/index.css +4 -0
- package/dist/extension/plugins/divider/render-elem/index.js +44 -0
- package/dist/extension/plugins/image/menu/index.js +15 -12
- package/dist/extension/plugins/image/render-element/image-previewer.js +4 -1
- package/dist/extension/plugins/image/render-element/index.js +7 -2
- package/dist/extension/plugins/index.js +8 -1
- package/dist/extension/plugins/table/helper.js +0 -1
- package/dist/extension/plugins/table/menu/index.js +15 -12
- package/dist/extension/plugins/text-style/menu/index.js +7 -9
- package/dist/extension/render/render-element.js +5 -0
- package/dist/extension/toolbar/insert-toolbar.js +3 -0
- package/dist/locale/lang/en.json +3 -1
- package/dist/slate-convert/html-to-slate/constants.js +7 -1
- package/dist/slate-convert/html-to-slate/rules/hr.js +23 -0
- package/dist/slate-convert/html-to-slate/rules/index.js +2 -1
- package/dist/slate-convert/html-to-slate/rules/list.js +39 -13
- package/dist/slate-convert/index.js +8 -1
- package/dist/slate-convert/md-to-slate/index.js +49 -0
- package/dist/slate-convert/md-to-slate/transform.js +451 -0
- package/dist/slate-convert/slate-to-html/index.js +6 -3
- package/dist/utils/common.js +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _slugid = _interopRequireDefault(require("slugid"));
|
|
9
|
+
var _constants = require("../constants");
|
|
10
|
+
const hrRule = element => {
|
|
11
|
+
if (element.nodeName === 'HR') {
|
|
12
|
+
return {
|
|
13
|
+
id: _slugid.default.nice(),
|
|
14
|
+
type: _constants.DIVIDER,
|
|
15
|
+
children: [{
|
|
16
|
+
id: _slugid.default.nice(),
|
|
17
|
+
text: ''
|
|
18
|
+
}]
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return;
|
|
22
|
+
};
|
|
23
|
+
var _default = exports.default = hrRule;
|
|
@@ -16,5 +16,6 @@ var _table = _interopRequireDefault(require("./table"));
|
|
|
16
16
|
var _text = _interopRequireDefault(require("./text"));
|
|
17
17
|
var _br = _interopRequireDefault(require("./br"));
|
|
18
18
|
var _p = _interopRequireDefault(require("./p"));
|
|
19
|
-
|
|
19
|
+
var _hr = _interopRequireDefault(require("./hr"));
|
|
20
|
+
const rules = [_blockquote.default, _codeBlock.default, _header.default, _image.default, _link.default, _list.default, _table.default, _paragraph.default, _text.default, _br.default, _p.default, _hr.default];
|
|
20
21
|
var _default = exports.default = rules;
|
|
@@ -33,23 +33,49 @@ const listRule = (element, parseChild) => {
|
|
|
33
33
|
};
|
|
34
34
|
return (0, _helper.mergeElementOther2SlateNode)(element, node);
|
|
35
35
|
}
|
|
36
|
-
if (nodeName === 'LI'
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
if (nodeName === 'LI') {
|
|
37
|
+
const parsedChildren = parseChild(childNodes);
|
|
38
|
+
const normalizedChildren = Array.isArray(parsedChildren) ? parsedChildren : parsedChildren ? [parsedChildren] : [];
|
|
39
|
+
const listItemChildren = [];
|
|
40
|
+
let inlineChildren = [];
|
|
41
|
+
const appendInlineParagraph = () => {
|
|
42
|
+
if (inlineChildren.length === 0) return;
|
|
43
|
+
listItemChildren.push({
|
|
44
|
+
id: _slugid.default.nice(),
|
|
45
|
+
type: _constants.PARAGRAPH,
|
|
46
|
+
children: inlineChildren
|
|
47
|
+
});
|
|
48
|
+
inlineChildren = [];
|
|
41
49
|
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
normalizedChildren.forEach(child => {
|
|
51
|
+
if (!child) return;
|
|
52
|
+
const isInlineNode = !child.type || _constants.INLINE_LEVEL_TYPES.includes(child.type);
|
|
53
|
+
if (isInlineNode) {
|
|
54
|
+
inlineChildren.push(child);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
appendInlineParagraph();
|
|
58
|
+
listItemChildren.push(child);
|
|
59
|
+
});
|
|
60
|
+
appendInlineParagraph();
|
|
61
|
+
if (listItemChildren.length === 0) {
|
|
62
|
+
listItemChildren.push({
|
|
63
|
+
id: _slugid.default.nice(),
|
|
64
|
+
type: _constants.PARAGRAPH,
|
|
65
|
+
children: [(0, _core.generateDefaultText)()]
|
|
66
|
+
});
|
|
67
|
+
} else if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(listItemChildren[0].type)) {
|
|
68
|
+
// Ensure nested list item content starts with a paragraph.
|
|
69
|
+
listItemChildren.unshift({
|
|
70
|
+
id: _slugid.default.nice(),
|
|
71
|
+
type: _constants.PARAGRAPH,
|
|
72
|
+
children: [(0, _core.generateDefaultText)()]
|
|
73
|
+
});
|
|
74
|
+
}
|
|
45
75
|
const node = {
|
|
46
76
|
id: _slugid.default.nice(),
|
|
47
77
|
type: _constants.LIST_ITEM,
|
|
48
|
-
children:
|
|
49
|
-
id: _slugid.default.nice(),
|
|
50
|
-
type: _constants.PARAGRAPH,
|
|
51
|
-
children: parseChild(childNodes)
|
|
52
|
-
}]
|
|
78
|
+
children: listItemChildren
|
|
53
79
|
};
|
|
54
80
|
return (0, _helper.mergeElementOther2SlateNode)(element, node);
|
|
55
81
|
}
|
|
@@ -10,6 +10,12 @@ Object.defineProperty(exports, "deserializeHtml", {
|
|
|
10
10
|
return _htmlToSlate.default;
|
|
11
11
|
}
|
|
12
12
|
});
|
|
13
|
+
Object.defineProperty(exports, "mdStringToSlate", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () {
|
|
16
|
+
return _mdToSlate.default;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
13
19
|
Object.defineProperty(exports, "slateToHtml", {
|
|
14
20
|
enumerable: true,
|
|
15
21
|
get: function () {
|
|
@@ -17,4 +23,5 @@ Object.defineProperty(exports, "slateToHtml", {
|
|
|
17
23
|
}
|
|
18
24
|
});
|
|
19
25
|
var _slateToHtml = _interopRequireDefault(require("./slate-to-html"));
|
|
20
|
-
var _htmlToSlate = _interopRequireDefault(require("./html-to-slate"));
|
|
26
|
+
var _htmlToSlate = _interopRequireDefault(require("./html-to-slate"));
|
|
27
|
+
var _mdToSlate = _interopRequireDefault(require("./md-to-slate"));
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _unified = require("unified");
|
|
9
|
+
var _remarkParse = _interopRequireDefault(require("remark-parse"));
|
|
10
|
+
var _remarkGfm = _interopRequireDefault(require("remark-gfm"));
|
|
11
|
+
var _remarkMath = _interopRequireDefault(require("remark-math"));
|
|
12
|
+
var _core = require("../../extension/core");
|
|
13
|
+
var _transform = require("./transform");
|
|
14
|
+
// md string -> md ast
|
|
15
|
+
const getProcessor = () => {
|
|
16
|
+
const processor = (0, _unified.unified)().use(_remarkParse.default) // Handles markdown basic syntax
|
|
17
|
+
.use(_remarkGfm.default) // Handle markdown extension syntax
|
|
18
|
+
.use(_remarkMath.default); // Handles markdown math formulas
|
|
19
|
+
|
|
20
|
+
return processor;
|
|
21
|
+
};
|
|
22
|
+
const reconciledSlateNodes = nodes => {
|
|
23
|
+
return nodes;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// md string --> md ast --> slate ast
|
|
27
|
+
// https://github.com/syntax-tree/mdast
|
|
28
|
+
const mdStringToSlate = mdString => {
|
|
29
|
+
if (!mdString) return [(0, _core.generateDefaultParagraph)()];
|
|
30
|
+
let content = mdString;
|
|
31
|
+
if (typeof mdString === 'number') {
|
|
32
|
+
content = mdString + '';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// md string --> md ast
|
|
36
|
+
const root = getProcessor().parse(content);
|
|
37
|
+
|
|
38
|
+
// the mdString is '\r\n'
|
|
39
|
+
if (root.children.length === 0) {
|
|
40
|
+
return [(0, _core.generateDefaultParagraph)()];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// md ast --> slate ast
|
|
44
|
+
const slateNodes = (0, _transform.formatMdToSlate)(root.children);
|
|
45
|
+
|
|
46
|
+
// Format the document
|
|
47
|
+
return reconciledSlateNodes(slateNodes);
|
|
48
|
+
};
|
|
49
|
+
var _default = exports.default = mdStringToSlate;
|
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.transformUnorderedList = exports.transformTableRow = exports.transformTableCell = exports.transformTable = exports.transformParagraph = exports.transformOrderedList = exports.transformMath = exports.transformListItem = exports.transformListContent = exports.transformList = exports.transformHtml = exports.transformHr = exports.transformHeader = exports.transformCodeLine = exports.transformCodeBlock = exports.transformCheckListItem = exports.transformCheckList = exports.transformBlockquote = exports.transformBlockHtml = exports.formatMdToSlate = void 0;
|
|
8
|
+
var _slugid = _interopRequireDefault(require("slugid"));
|
|
9
|
+
var _core = require("../../extension/core");
|
|
10
|
+
var _elementTypes = require("../../extension/constants/element-types");
|
|
11
|
+
var _htmlToSlate = _interopRequireDefault(require("../html-to-slate"));
|
|
12
|
+
const INLINE_KEY_MAP = {
|
|
13
|
+
strong: 'bold',
|
|
14
|
+
emphasis: 'italic'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// <strong><em>aa<em>bb<em></strong>
|
|
18
|
+
const applyMarkForInlineItem = function (result, item) {
|
|
19
|
+
let textNode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
20
|
+
const {
|
|
21
|
+
type,
|
|
22
|
+
children,
|
|
23
|
+
value
|
|
24
|
+
} = item;
|
|
25
|
+
if (type === _elementTypes.LINK) {
|
|
26
|
+
const child = children.length === 0 ? {
|
|
27
|
+
type: 'text',
|
|
28
|
+
value: ''
|
|
29
|
+
} : children[0];
|
|
30
|
+
const linkChildren = [{
|
|
31
|
+
id: _slugid.default.nice(),
|
|
32
|
+
text: child.value || ''
|
|
33
|
+
}];
|
|
34
|
+
const link = {
|
|
35
|
+
id: _slugid.default.nice(),
|
|
36
|
+
type: _elementTypes.LINK,
|
|
37
|
+
url: item.url,
|
|
38
|
+
title: item.title,
|
|
39
|
+
children: linkChildren
|
|
40
|
+
};
|
|
41
|
+
result.push([(0, _core.generateDefaultText)(), link, (0, _core.generateDefaultText)()]);
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
if (type === _elementTypes.IMAGE) {
|
|
45
|
+
const data = {
|
|
46
|
+
src: item.url,
|
|
47
|
+
...(item.title && {
|
|
48
|
+
title: item.title
|
|
49
|
+
}),
|
|
50
|
+
...(item.alt && {
|
|
51
|
+
alt: item.alt
|
|
52
|
+
}),
|
|
53
|
+
...(item.width && {
|
|
54
|
+
width: item.width
|
|
55
|
+
}),
|
|
56
|
+
...(item.height && {
|
|
57
|
+
height: item.height
|
|
58
|
+
})
|
|
59
|
+
};
|
|
60
|
+
const image = {
|
|
61
|
+
id: _slugid.default.nice(),
|
|
62
|
+
data: data,
|
|
63
|
+
type: _elementTypes.IMAGE,
|
|
64
|
+
children: [(0, _core.generateDefaultText)()]
|
|
65
|
+
};
|
|
66
|
+
result.push([(0, _core.generateDefaultText)(), image, (0, _core.generateDefaultText)()]);
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Handle special images
|
|
71
|
+
if (type === 'html') {
|
|
72
|
+
const nodes = transformHtml(item);
|
|
73
|
+
result.push(nodes);
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
if (!textNode.id) {
|
|
77
|
+
textNode['id'] = _slugid.default.nice();
|
|
78
|
+
}
|
|
79
|
+
if (type === 'text') {
|
|
80
|
+
// https://symbl.cc/en/200B/
|
|
81
|
+
const formatValue = value && value !== '' ? value : '';
|
|
82
|
+
textNode['text'] = formatValue;
|
|
83
|
+
result.push({
|
|
84
|
+
...textNode
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// reset testNode
|
|
88
|
+
textNode = {};
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (type === 'inlineCode') {
|
|
92
|
+
textNode['code'] = true;
|
|
93
|
+
textNode['text'] = value || '';
|
|
94
|
+
result.push({
|
|
95
|
+
...textNode
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// reset testNode
|
|
99
|
+
textNode = {};
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const attr_key = INLINE_KEY_MAP[type];
|
|
103
|
+
if (!Array.isArray(children) || children.length === 0 || !attr_key) {
|
|
104
|
+
textNode['text'] = value || '';
|
|
105
|
+
result.push({
|
|
106
|
+
...textNode
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// reset testNode
|
|
110
|
+
textNode = {};
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
textNode[attr_key] = true;
|
|
114
|
+
children.forEach(item => {
|
|
115
|
+
applyMarkForInlineItem(result, item, {
|
|
116
|
+
...textNode
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
const transformNodeWithInlineChildren = node => {
|
|
121
|
+
const {
|
|
122
|
+
children
|
|
123
|
+
} = node;
|
|
124
|
+
const defaultChildren = [(0, _core.generateDefaultText)()];
|
|
125
|
+
if (!children || !Array.isArray(children) || children.length === 0) {
|
|
126
|
+
return defaultChildren;
|
|
127
|
+
}
|
|
128
|
+
const result = [];
|
|
129
|
+
children.forEach(item => applyMarkForInlineItem(result, item));
|
|
130
|
+
return result.flat();
|
|
131
|
+
};
|
|
132
|
+
const transformHeader = node => {
|
|
133
|
+
const {
|
|
134
|
+
depth
|
|
135
|
+
} = node;
|
|
136
|
+
const type = `${_elementTypes.HEADER}${depth}`;
|
|
137
|
+
return {
|
|
138
|
+
id: _slugid.default.nice(),
|
|
139
|
+
type: type,
|
|
140
|
+
children: transformNodeWithInlineChildren(node)
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
exports.transformHeader = transformHeader;
|
|
144
|
+
const transformParagraph = node => {
|
|
145
|
+
return {
|
|
146
|
+
id: _slugid.default.nice(),
|
|
147
|
+
type: _elementTypes.PARAGRAPH,
|
|
148
|
+
children: transformNodeWithInlineChildren(node)
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
exports.transformParagraph = transformParagraph;
|
|
152
|
+
const transformBlockquote = node => {
|
|
153
|
+
const {
|
|
154
|
+
children
|
|
155
|
+
} = node;
|
|
156
|
+
return {
|
|
157
|
+
id: _slugid.default.nice(),
|
|
158
|
+
type: _elementTypes.BLOCKQUOTE,
|
|
159
|
+
children: Array.isArray(children) && children.length > 0 ? children.map(child => {
|
|
160
|
+
const handler = elementHandlers[child.type];
|
|
161
|
+
return handler(child); // flat
|
|
162
|
+
}).flat() : [{
|
|
163
|
+
id: _slugid.default.nice(),
|
|
164
|
+
type: _elementTypes.PARAGRAPH,
|
|
165
|
+
children: [{
|
|
166
|
+
id: _slugid.default.nice(),
|
|
167
|
+
text: ''
|
|
168
|
+
}]
|
|
169
|
+
}]
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
exports.transformBlockquote = transformBlockquote;
|
|
173
|
+
const transformListContent = node => {
|
|
174
|
+
return {
|
|
175
|
+
id: _slugid.default.nice(),
|
|
176
|
+
type: _elementTypes.PARAGRAPH,
|
|
177
|
+
children: transformNodeWithInlineChildren(node)
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
exports.transformListContent = transformListContent;
|
|
181
|
+
const transformListItem = node => {
|
|
182
|
+
const {
|
|
183
|
+
children
|
|
184
|
+
} = node;
|
|
185
|
+
if (children.length === 0) {
|
|
186
|
+
return {
|
|
187
|
+
id: _slugid.default.nice(),
|
|
188
|
+
type: _elementTypes.LIST_ITEM,
|
|
189
|
+
// eslint-disable-next-line array-callback-return
|
|
190
|
+
children: [transformListContent({})]
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
id: _slugid.default.nice(),
|
|
195
|
+
type: _elementTypes.LIST_ITEM,
|
|
196
|
+
// eslint-disable-next-line array-callback-return
|
|
197
|
+
children: children.map(child => {
|
|
198
|
+
if (child.type === _elementTypes.PARAGRAPH) {
|
|
199
|
+
return transformListContent(child);
|
|
200
|
+
} else if (child.type === 'code') {
|
|
201
|
+
return transformCodeBlock(child);
|
|
202
|
+
} else if (child.type === 'blockquote') {
|
|
203
|
+
return transformBlockquote(child);
|
|
204
|
+
} else if (child.type === 'list') {
|
|
205
|
+
const hasParent = true;
|
|
206
|
+
return transformList(child, hasParent);
|
|
207
|
+
} else if (child.type === 'heading') {
|
|
208
|
+
return transformParagraph(child);
|
|
209
|
+
} else if (child.type === 'html') {
|
|
210
|
+
// patch
|
|
211
|
+
return transformBlockHtml(child);
|
|
212
|
+
} else if (child.type === 'thematicBreak') {
|
|
213
|
+
// patch
|
|
214
|
+
return transformParagraph(child);
|
|
215
|
+
} else {
|
|
216
|
+
console.warn('Unhandled child type in list item:', child);
|
|
217
|
+
return (0, _core.generateDefaultParagraph)();
|
|
218
|
+
}
|
|
219
|
+
}).flat()
|
|
220
|
+
};
|
|
221
|
+
};
|
|
222
|
+
exports.transformListItem = transformListItem;
|
|
223
|
+
const transformOrderedList = node => {
|
|
224
|
+
const {
|
|
225
|
+
children
|
|
226
|
+
} = node;
|
|
227
|
+
return {
|
|
228
|
+
id: _slugid.default.nice(),
|
|
229
|
+
type: _elementTypes.ORDERED_LIST,
|
|
230
|
+
children: children.map(child => transformListItem(child))
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
exports.transformOrderedList = transformOrderedList;
|
|
234
|
+
const transformUnorderedList = node => {
|
|
235
|
+
const {
|
|
236
|
+
children
|
|
237
|
+
} = node;
|
|
238
|
+
return {
|
|
239
|
+
id: _slugid.default.nice(),
|
|
240
|
+
type: _elementTypes.UNORDERED_LIST,
|
|
241
|
+
children: children.map(child => transformListItem(child))
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
exports.transformUnorderedList = transformUnorderedList;
|
|
245
|
+
const transformCheckListItem = node => {
|
|
246
|
+
const {
|
|
247
|
+
children,
|
|
248
|
+
checked
|
|
249
|
+
} = node;
|
|
250
|
+
if (children.length === 0) {
|
|
251
|
+
return {
|
|
252
|
+
id: _slugid.default.nice(),
|
|
253
|
+
type: _elementTypes.CHECK_LIST_ITEM,
|
|
254
|
+
checked: checked ? true : false,
|
|
255
|
+
children: transformNodeWithInlineChildren({})
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
if (children.length === 1) {
|
|
259
|
+
return {
|
|
260
|
+
id: _slugid.default.nice(),
|
|
261
|
+
type: _elementTypes.CHECK_LIST_ITEM,
|
|
262
|
+
checked: checked ? true : false,
|
|
263
|
+
children: children.map(child => transformNodeWithInlineChildren(child)).flat()
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const [child, ...reset] = children;
|
|
267
|
+
const firstChild = {
|
|
268
|
+
id: _slugid.default.nice(),
|
|
269
|
+
type: _elementTypes.CHECK_LIST_ITEM,
|
|
270
|
+
checked: checked,
|
|
271
|
+
children: transformNodeWithInlineChildren(child)
|
|
272
|
+
};
|
|
273
|
+
const resetChildren = formatMdToSlate(reset);
|
|
274
|
+
return [firstChild, ...resetChildren];
|
|
275
|
+
};
|
|
276
|
+
exports.transformCheckListItem = transformCheckListItem;
|
|
277
|
+
const transformCheckList = node => {
|
|
278
|
+
const {
|
|
279
|
+
children
|
|
280
|
+
} = node;
|
|
281
|
+
return children.map(child => transformCheckListItem(child)).flat();
|
|
282
|
+
};
|
|
283
|
+
exports.transformCheckList = transformCheckList;
|
|
284
|
+
const transformList = (node, hasParent) => {
|
|
285
|
+
const {
|
|
286
|
+
ordered,
|
|
287
|
+
children
|
|
288
|
+
} = node;
|
|
289
|
+
const firstChild = children[0];
|
|
290
|
+
if (ordered === true) {
|
|
291
|
+
return transformOrderedList(node);
|
|
292
|
+
}
|
|
293
|
+
if (ordered === false && firstChild.checked === null) {
|
|
294
|
+
return transformUnorderedList(node);
|
|
295
|
+
}
|
|
296
|
+
// patch tasklist in list
|
|
297
|
+
if (hasParent) {
|
|
298
|
+
return transformUnorderedList(node);
|
|
299
|
+
}
|
|
300
|
+
return transformCheckList(node);
|
|
301
|
+
};
|
|
302
|
+
exports.transformList = transformList;
|
|
303
|
+
const transformTableCell = (cell, align) => {
|
|
304
|
+
return {
|
|
305
|
+
id: _slugid.default.nice(),
|
|
306
|
+
type: _elementTypes.TABLE_CELL,
|
|
307
|
+
children: transformNodeWithInlineChildren(cell)
|
|
308
|
+
};
|
|
309
|
+
};
|
|
310
|
+
exports.transformTableCell = transformTableCell;
|
|
311
|
+
const transformTableRow = row => {
|
|
312
|
+
const {
|
|
313
|
+
children: cells
|
|
314
|
+
} = row;
|
|
315
|
+
return {
|
|
316
|
+
id: _slugid.default.nice(),
|
|
317
|
+
type: _elementTypes.TABLE_ROW,
|
|
318
|
+
children: cells.map(cell => transformTableCell(cell))
|
|
319
|
+
};
|
|
320
|
+
};
|
|
321
|
+
exports.transformTableRow = transformTableRow;
|
|
322
|
+
const transformTable = node => {
|
|
323
|
+
const {
|
|
324
|
+
children: rows,
|
|
325
|
+
align = []
|
|
326
|
+
} = node;
|
|
327
|
+
return {
|
|
328
|
+
id: _slugid.default.nice(),
|
|
329
|
+
type: _elementTypes.TABLE,
|
|
330
|
+
align: align,
|
|
331
|
+
children: rows.map((row, index) => transformTableRow(row))
|
|
332
|
+
};
|
|
333
|
+
};
|
|
334
|
+
exports.transformTable = transformTable;
|
|
335
|
+
const transformCodeLine = text => {
|
|
336
|
+
return {
|
|
337
|
+
id: _slugid.default.nice(),
|
|
338
|
+
type: _elementTypes.CODE_LINE,
|
|
339
|
+
children: [{
|
|
340
|
+
id: _slugid.default.nice(),
|
|
341
|
+
text: text
|
|
342
|
+
}]
|
|
343
|
+
};
|
|
344
|
+
};
|
|
345
|
+
exports.transformCodeLine = transformCodeLine;
|
|
346
|
+
const transformCodeBlock = node => {
|
|
347
|
+
const {
|
|
348
|
+
lang,
|
|
349
|
+
value
|
|
350
|
+
} = node;
|
|
351
|
+
let children = value.split('\n');
|
|
352
|
+
if (children.length === 0) {
|
|
353
|
+
children = [''];
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
id: _slugid.default.nice(),
|
|
357
|
+
type: _elementTypes.CODE_BLOCK,
|
|
358
|
+
lang: lang,
|
|
359
|
+
children: children.map(text => transformCodeLine(text))
|
|
360
|
+
};
|
|
361
|
+
};
|
|
362
|
+
exports.transformCodeBlock = transformCodeBlock;
|
|
363
|
+
const transformHr = node => {
|
|
364
|
+
return {
|
|
365
|
+
id: _slugid.default.nice(),
|
|
366
|
+
type: _elementTypes.DIVIDER,
|
|
367
|
+
children: [(0, _core.generateDefaultText)()]
|
|
368
|
+
};
|
|
369
|
+
};
|
|
370
|
+
exports.transformHr = transformHr;
|
|
371
|
+
const transformHtml = node => {
|
|
372
|
+
const defaultTextNode = (0, _core.generateDefaultText)();
|
|
373
|
+
if (node.value.slice(0, 4).toLowerCase() === '<img') {
|
|
374
|
+
const {
|
|
375
|
+
body
|
|
376
|
+
} = new DOMParser().parseFromString(node.value, 'text/html');
|
|
377
|
+
const img = body.firstChild;
|
|
378
|
+
const src = img.getAttribute('src');
|
|
379
|
+
if (!src) return [defaultTextNode];
|
|
380
|
+
const alt = img.getAttribute('alt');
|
|
381
|
+
const title = img.getAttribute('title');
|
|
382
|
+
const width = img.getAttribute('width');
|
|
383
|
+
const height = img.getAttribute('height');
|
|
384
|
+
const data = {
|
|
385
|
+
src: src,
|
|
386
|
+
...(alt && {
|
|
387
|
+
alt
|
|
388
|
+
}),
|
|
389
|
+
...(title && {
|
|
390
|
+
title
|
|
391
|
+
}),
|
|
392
|
+
...(!isNaN(width) && width > 0 && {
|
|
393
|
+
width
|
|
394
|
+
}),
|
|
395
|
+
...(!isNaN(height) && height > 0 && {
|
|
396
|
+
height
|
|
397
|
+
})
|
|
398
|
+
};
|
|
399
|
+
const image = {
|
|
400
|
+
id: _slugid.default.nice(),
|
|
401
|
+
data: data,
|
|
402
|
+
type: _elementTypes.IMAGE,
|
|
403
|
+
children: [(0, _core.generateDefaultText)()]
|
|
404
|
+
};
|
|
405
|
+
return [(0, _core.generateDefaultText)(), image, (0, _core.generateDefaultText)()];
|
|
406
|
+
}
|
|
407
|
+
return [defaultTextNode];
|
|
408
|
+
};
|
|
409
|
+
exports.transformHtml = transformHtml;
|
|
410
|
+
const transformBlockHtml = node => {
|
|
411
|
+
if (node.value.slice(0, 4).toLowerCase() === '<img') {
|
|
412
|
+
return {
|
|
413
|
+
id: _slugid.default.nice(),
|
|
414
|
+
type: _elementTypes.PARAGRAPH,
|
|
415
|
+
children: transformHtml(node)
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
return (0, _htmlToSlate.default)(node.value);
|
|
419
|
+
};
|
|
420
|
+
exports.transformBlockHtml = transformBlockHtml;
|
|
421
|
+
const transformMath = node => {
|
|
422
|
+
return {
|
|
423
|
+
id: _slugid.default.nice(),
|
|
424
|
+
type: 'formula',
|
|
425
|
+
data: {
|
|
426
|
+
formula: node.value
|
|
427
|
+
},
|
|
428
|
+
children: [(0, _core.generateDefaultText)()]
|
|
429
|
+
};
|
|
430
|
+
};
|
|
431
|
+
exports.transformMath = transformMath;
|
|
432
|
+
const elementHandlers = {
|
|
433
|
+
'paragraph': transformParagraph,
|
|
434
|
+
'heading': transformHeader,
|
|
435
|
+
'blockquote': transformBlockquote,
|
|
436
|
+
'table': transformTable,
|
|
437
|
+
'list': transformList,
|
|
438
|
+
// ordered_list | unordered_list | check_list_item
|
|
439
|
+
'code': transformCodeBlock,
|
|
440
|
+
'thematicBreak': transformHr,
|
|
441
|
+
'math': transformMath,
|
|
442
|
+
'html': transformBlockHtml
|
|
443
|
+
};
|
|
444
|
+
const formatMdToSlate = children => {
|
|
445
|
+
const validChildren = children.filter(child => elementHandlers[child.type]);
|
|
446
|
+
return validChildren.map(child => {
|
|
447
|
+
const handler = elementHandlers[child.type];
|
|
448
|
+
return handler(child);
|
|
449
|
+
}).flat();
|
|
450
|
+
};
|
|
451
|
+
exports.formatMdToSlate = formatMdToSlate;
|
|
@@ -70,7 +70,8 @@ const ELEMENT_HTML_TAG = {
|
|
|
70
70
|
[_constants.ElementTypes.LINK]: 'a',
|
|
71
71
|
[_constants.ElementTypes.TABLE]: 'table',
|
|
72
72
|
[_constants.ElementTypes.TABLE_ROW]: 'tr',
|
|
73
|
-
[_constants.ElementTypes.TABLE_CELL]: 'td'
|
|
73
|
+
[_constants.ElementTypes.TABLE_CELL]: 'td',
|
|
74
|
+
[_constants.ElementTypes.DIVIDER]: 'div'
|
|
74
75
|
};
|
|
75
76
|
const findElementByPath = (value, path) => {
|
|
76
77
|
return path.reduce((element, pathIndex, currentIndex) => currentIndex === 0 ? element[pathIndex] : element === null || element === void 0 ? void 0 : element.children[pathIndex], value);
|
|
@@ -86,10 +87,13 @@ const element2Html = (value, element, path) => {
|
|
|
86
87
|
style,
|
|
87
88
|
children
|
|
88
89
|
} = translateElement(value, element, path);
|
|
89
|
-
if (
|
|
90
|
+
if (type === _constants.ElementTypes.IMAGE) {
|
|
90
91
|
var _element$data, _element$data2;
|
|
91
92
|
return `<img src="${element === null || element === void 0 ? void 0 : (_element$data = element.data) === null || _element$data === void 0 ? void 0 : _element$data.src}" width="${element === null || element === void 0 ? void 0 : element.data.width}" height="${element === null || element === void 0 ? void 0 : element.data.height}" alt="${(element === null || element === void 0 ? void 0 : (_element$data2 = element.data) === null || _element$data2 === void 0 ? void 0 : _element$data2.alt) || ''}" />`;
|
|
92
93
|
}
|
|
94
|
+
if (type === _constants.ElementTypes.DIVIDER) {
|
|
95
|
+
return `<div ${className}${style}><div style="width: 100%; height: 1px; background-color: #ccc; margin: 5px 0;"></div></div>`;
|
|
96
|
+
}
|
|
93
97
|
if (Array.isArray(children) && tag) {
|
|
94
98
|
const childrenDom = children.map((child, index) => element2Html(value, child, [...path, index])).join('');
|
|
95
99
|
if (tag === 'a') return `<${tag}${className}${style} href="${element.url}">${childrenDom}</${tag}>`;
|
|
@@ -143,7 +147,6 @@ const slateToHtml = value => {
|
|
|
143
147
|
value.forEach((element, index) => {
|
|
144
148
|
html += element2Html(value, element, [index]);
|
|
145
149
|
});
|
|
146
|
-
console.log(html);
|
|
147
150
|
return html;
|
|
148
151
|
};
|
|
149
152
|
var _default = exports.default = slateToHtml;
|
package/dist/utils/common.js
CHANGED
|
@@ -15,6 +15,7 @@ exports.isMac = isMac;
|
|
|
15
15
|
const IMAGE_TYPES = exports.IMAGE_TYPES = ['png', 'jpg', 'gif'];
|
|
16
16
|
const isImage = url => {
|
|
17
17
|
if (!url) return false;
|
|
18
|
+
if (url.startsWith('data:image')) return true;
|
|
18
19
|
if (!isUrl(url)) return false;
|
|
19
20
|
const fileName = url.slice(url.lastIndexOf('/') + 1); // http://xx/mm/*.png
|
|
20
21
|
const suffix = fileName.split('.')[1];
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sea-email-editor",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
|
|
7
|
+
"@seafile/react-image-lightbox": "^5.0.4",
|
|
8
8
|
"classnames": "2.3.2",
|
|
9
9
|
"copy-to-clipboard": "3.3.1",
|
|
10
10
|
"deep-copy": "1.4.2",
|