-
-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Expand file tree
/
Copy pathparse-elem-html.ts
More file actions
70 lines (63 loc) · 1.93 KB
/
parse-elem-html.ts
File metadata and controls
70 lines (63 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/**
* @description parse node html
* @author wangfupeng
*/
import $, { Dom7Array } from 'dom7'
import { Descendant } from 'slate'
import { IDomEditor } from '../editor/interface'
import parseCommonElemHtml from './parse-common-elem-html'
import parseTextElemHtml from './parse-text-elem-html'
import { getTagName } from '../utils/dom'
import { PRE_PARSE_HTML_CONF_LIST, TEXT_TAGS } from '../index'
/**
* 处理 DOM Elem html
* @param $elem $elem
* @param editor editor
* @returns slate Descendant
*/
function parseElemHtml($elem: Dom7Array, editor: IDomEditor): Descendant | Descendant[] {
// pre-parse
PRE_PARSE_HTML_CONF_LIST.forEach(conf => {
const { selector, preParseHtml } = conf
if ($elem[0].matches(selector)) {
$elem = $(preParseHtml($elem[0]))
}
})
const tagName = getTagName($elem)
// <span> 判断有没有 data-w-e-type 属性。有则是 elem ,没有则是 text
if (tagName === 'span') {
if ($elem.attr('data-w-e-type')) {
return parseCommonElemHtml($elem, editor)
} else {
if ($elem[0].childNodes.length > 1) {
const childNodes = $elem[0].childNodes
return Array.from(childNodes).map(child => {
$($elem[0]).empty()
$($elem[0]).append($(child))
return parseTextElemHtml($($elem[0]), editor)
})
}
return parseTextElemHtml($elem, editor)
}
}
// <code> 特殊处理
if (tagName === 'code') {
const parentTagName = getTagName($elem.parent())
if (parentTagName === 'pre') {
// <code> 在 <pre> 内,则是 elem
return parseCommonElemHtml($elem, editor)
} else {
// <code> 不在 <pre> 内,则是 text
return parseTextElemHtml($elem, editor)
}
}
// 非 <code> ,正常处理
if (TEXT_TAGS.includes(tagName)) {
// text node
return parseTextElemHtml($elem, editor)
} else {
// elem node
return parseCommonElemHtml($elem, editor)
}
}
export default parseElemHtml