@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.
Files changed (33) hide show
  1. package/dist/assets/icons/divider.svg +1 -0
  2. package/dist/editor/index.js +2 -1
  3. package/dist/editor/main/index.js +3 -1
  4. package/dist/extension/constants/element-default-style.js +9 -2
  5. package/dist/extension/constants/element-types.js +2 -1
  6. package/dist/extension/constants/menus-config.js +10 -1
  7. package/dist/extension/plugins/code-block/menu/index.js +15 -12
  8. package/dist/extension/plugins/divider/helper.js +38 -0
  9. package/dist/extension/plugins/divider/index.js +17 -0
  10. package/dist/extension/plugins/divider/menu/index.js +61 -0
  11. package/dist/extension/plugins/divider/plugin.js +87 -0
  12. package/dist/extension/plugins/divider/render-elem/index.css +4 -0
  13. package/dist/extension/plugins/divider/render-elem/index.js +44 -0
  14. package/dist/extension/plugins/image/menu/index.js +15 -12
  15. package/dist/extension/plugins/image/render-element/image-previewer.js +4 -1
  16. package/dist/extension/plugins/image/render-element/index.js +7 -2
  17. package/dist/extension/plugins/index.js +8 -1
  18. package/dist/extension/plugins/table/helper.js +0 -1
  19. package/dist/extension/plugins/table/menu/index.js +15 -12
  20. package/dist/extension/plugins/text-style/menu/index.js +7 -9
  21. package/dist/extension/render/render-element.js +5 -0
  22. package/dist/extension/toolbar/insert-toolbar.js +3 -0
  23. package/dist/locale/lang/en.json +3 -1
  24. package/dist/slate-convert/html-to-slate/constants.js +7 -1
  25. package/dist/slate-convert/html-to-slate/rules/hr.js +23 -0
  26. package/dist/slate-convert/html-to-slate/rules/index.js +2 -1
  27. package/dist/slate-convert/html-to-slate/rules/list.js +39 -13
  28. package/dist/slate-convert/index.js +8 -1
  29. package/dist/slate-convert/md-to-slate/index.js +49 -0
  30. package/dist/slate-convert/md-to-slate/transform.js +451 -0
  31. package/dist/slate-convert/slate-to-html/index.js +6 -3
  32. package/dist/utils/common.js +1 -0
  33. 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
- const rules = [_blockquote.default, _codeBlock.default, _header.default, _image.default, _link.default, _list.default, _table.default, _paragraph.default, _text.default, _br.default, _p.default];
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' && firstChild && PARAGRAPH_TAGS.includes(firstChild.nodeName)) {
37
- const node = {
38
- id: _slugid.default.nice(),
39
- type: _constants.LIST_ITEM,
40
- children: parseChild(childNodes)
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
- return (0, _helper.mergeElementOther2SlateNode)(element, node);
43
- }
44
- if (nodeName === 'LI' && firstChild && !PARAGRAPH_TAGS.includes(firstChild.nodeName)) {
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 (tag === 'img') {
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;
@@ -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.5",
3
+ "version": "0.0.7",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "dependencies": {
7
- "@seafile/react-image-lightbox": "4.0.2",
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",