Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小浣熊撸代码
uni-app
提交
936382fa
U
uni-app
项目概览
小浣熊撸代码
/
uni-app
与 Fork 源项目一致
Fork自
DCloud / uni-app
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
936382fa
编写于
9月 26, 2021
作者:
M
mehaotian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(h5): 修复 rich-text 组件无法渲染 section 等标签的问题
上级
f9f2e773
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
155 addition
and
133 deletion
+155
-133
packages/uni-components/src/components/rich-text/nodes-parser.js
...s/uni-components/src/components/rich-text/nodes-parser.js
+155
-133
未找到文件。
packages/uni-components/src/components/rich-text/nodes-parser.js
浏览文件 @
936382fa
import
{
hasOwn
,
isPlainObject
}
from
'
@vue/shared
'
const
TAGS
=
{
a
:
''
,
abbr
:
''
,
b
:
''
,
blockquote
:
''
,
br
:
''
,
code
:
''
,
col
:
[
'
span
'
,
'
width
'
],
colgroup
:
[
'
span
'
,
'
width
'
],
dd
:
''
,
del
:
''
,
div
:
''
,
dl
:
''
,
dt
:
''
,
em
:
''
,
fieldset
:
''
,
h1
:
''
,
h2
:
''
,
h3
:
''
,
h4
:
''
,
h5
:
''
,
h6
:
''
,
hr
:
''
,
i
:
''
,
img
:
[
'
alt
'
,
'
src
'
,
'
height
'
,
'
width
'
],
ins
:
''
,
label
:
''
,
legend
:
''
,
li
:
''
,
ol
:
[
'
start
'
,
'
type
'
],
p
:
''
,
q
:
''
,
span
:
''
,
strong
:
''
,
sub
:
''
,
sup
:
''
,
table
:
[
'
width
'
],
tbody
:
''
,
td
:
[
'
colspan
'
,
'
rowspan
'
,
'
height
'
,
'
width
'
],
tfoot
:
''
,
th
:
[
'
colspan
'
,
'
rowspan
'
,
'
height
'
,
'
width
'
],
thead
:
''
,
tr
:
''
,
ul
:
''
}
const
CHARS
=
{
amp
:
'
&
'
,
gt
:
'
>
'
,
lt
:
'
<
'
,
nbsp
:
'
'
,
quot
:
'
"
'
,
apos
:
"
'
"
}
function
decodeEntities
(
htmlString
)
{
return
htmlString
.
replace
(
/&
(([
a-zA-Z
]
+
)
|
(
#x
{0,1}[\d
a-zA-Z
]
+
))
;/gi
,
function
(
match
,
stage
)
{
if
(
hasOwn
(
CHARS
,
stage
)
&&
CHARS
[
stage
])
{
return
CHARS
[
stage
]
}
if
(
/^#
[
0-9
]{1,4}
$/
.
test
(
stage
))
{
return
String
.
fromCharCode
(
stage
.
slice
(
1
))
}
if
(
/^#x
[
0-9a-f
]{1,4}
$/i
.
test
(
stage
))
{
return
String
.
fromCharCode
(
'
0
'
+
stage
.
slice
(
1
))
}
const
wrap
=
document
.
createElement
(
'
div
'
)
wrap
.
innerHTML
=
match
return
wrap
.
innerText
||
wrap
.
textContent
})
}
export
default
function
parseNodes
(
nodes
,
parentNode
)
{
nodes
.
forEach
(
function
(
node
)
{
if
(
!
isPlainObject
(
node
))
{
return
}
if
(
!
hasOwn
(
node
,
'
type
'
)
||
node
.
type
===
'
node
'
)
{
if
(
!
(
typeof
node
.
name
===
'
string
'
&&
node
.
name
))
{
return
}
const
tagName
=
node
.
name
.
toLowerCase
()
if
(
!
hasOwn
(
TAGS
,
tagName
))
{
return
}
const
elem
=
document
.
createElement
(
tagName
)
if
(
!
elem
)
{
return
}
const
attrs
=
node
.
attrs
if
(
isPlainObject
(
attrs
))
{
const
tagAttrs
=
TAGS
[
tagName
]
||
[]
Object
.
keys
(
attrs
).
forEach
(
function
(
name
)
{
let
value
=
attrs
[
name
]
switch
(
name
)
{
case
'
class
'
:
/* eslint-disable no-fallthrough */
Array
.
isArray
(
value
)
&&
(
value
=
value
.
join
(
'
'
))
case
'
style
'
:
elem
.
setAttribute
(
name
,
value
)
break
default
:
if
(
tagAttrs
.
indexOf
(
name
)
!==
-
1
)
{
elem
.
setAttribute
(
name
,
value
)
}
}
})
}
const
children
=
node
.
children
if
(
Array
.
isArray
(
children
)
&&
children
.
length
)
{
parseNodes
(
node
.
children
,
elem
)
}
parentNode
.
appendChild
(
elem
)
}
else
{
if
(
node
.
type
===
'
text
'
&&
typeof
node
.
text
===
'
string
'
&&
node
.
text
!==
''
)
{
parentNode
.
appendChild
(
document
.
createTextNode
(
decodeEntities
(
node
.
text
))
)
}
}
})
return
parentNode
}
import
{
hasOwn
,
isPlainObject
}
from
'
@vue/shared
'
const
TAGS
=
{
a
:
''
,
abbr
:
''
,
address
:
''
,
article
:
''
,
aside
:
''
,
b
:
''
,
bdi
:
''
,
bdo
:
[
'
dir
'
],
big
:
''
,
blockquote
:
''
,
br
:
''
,
caption
:
''
,
center
:
''
,
cite
:
''
,
code
:
''
,
col
:
[
'
span
'
,
'
width
'
],
colgroup
:
[
'
span
'
,
'
width
'
],
dd
:
''
,
del
:
''
,
div
:
''
,
dl
:
''
,
dt
:
''
,
em
:
''
,
fieldset
:
''
,
font
:
''
,
footer
:
''
,
h1
:
''
,
h2
:
''
,
h3
:
''
,
h4
:
''
,
h5
:
''
,
h6
:
''
,
header
:
''
,
hr
:
''
,
i
:
''
,
img
:
[
'
alt
'
,
'
src
'
,
'
height
'
,
'
width
'
],
ins
:
''
,
label
:
''
,
legend
:
''
,
li
:
''
,
mark
:
''
,
nav
:
''
,
ol
:
[
'
start
'
,
'
type
'
],
p
:
''
,
pre
:
''
,
q
:
''
,
rt
:
''
,
ruby
:
''
,
s
:
''
,
section
:
''
,
small
:
''
,
span
:
''
,
strong
:
''
,
sub
:
''
,
sup
:
''
,
table
:
[
'
width
'
],
tbody
:
''
,
td
:
[
'
colspan
'
,
'
height
'
,
'
rowspan
'
,
'
width
'
],
tfoot
:
''
,
th
:
[
'
colspan
'
,
'
height
'
,
'
rowspan
'
,
'
width
'
],
thead
:
''
,
tr
:
[
'
colspan
'
,
'
height
'
,
'
rowspan
'
,
'
width
'
],
tt
:
''
,
u
:
''
,
ul
:
''
,
}
const
CHARS
=
{
amp
:
'
&
'
,
gt
:
'
>
'
,
lt
:
'
<
'
,
nbsp
:
'
'
,
quot
:
'
"
'
,
apos
:
"
'
"
,
}
function
decodeEntities
(
htmlString
)
{
return
htmlString
.
replace
(
/&
(([
a-zA-Z
]
+
)
|
(
#x
{0,1}[\d
a-zA-Z
]
+
))
;/gi
,
function
(
match
,
stage
)
{
if
(
hasOwn
(
CHARS
,
stage
)
&&
CHARS
[
stage
])
{
return
CHARS
[
stage
]
}
if
(
/^#
[
0-9
]{1,4}
$/
.
test
(
stage
))
{
return
String
.
fromCharCode
(
stage
.
slice
(
1
))
}
if
(
/^#x
[
0-9a-f
]{1,4}
$/i
.
test
(
stage
))
{
return
String
.
fromCharCode
(
'
0
'
+
stage
.
slice
(
1
))
}
const
wrap
=
document
.
createElement
(
'
div
'
)
wrap
.
innerHTML
=
match
return
wrap
.
innerText
||
wrap
.
textContent
}
)
}
export
default
function
parseNodes
(
nodes
,
parentNode
)
{
nodes
.
forEach
(
function
(
node
)
{
if
(
!
isPlainObject
(
node
))
{
return
}
if
(
!
hasOwn
(
node
,
'
type
'
)
||
node
.
type
===
'
node
'
)
{
if
(
!
(
typeof
node
.
name
===
'
string
'
&&
node
.
name
))
{
return
}
const
tagName
=
node
.
name
.
toLowerCase
()
if
(
!
hasOwn
(
TAGS
,
tagName
))
{
return
}
const
elem
=
document
.
createElement
(
tagName
)
if
(
!
elem
)
{
return
}
const
attrs
=
node
.
attrs
if
(
isPlainObject
(
attrs
))
{
const
tagAttrs
=
TAGS
[
tagName
]
||
[]
Object
.
keys
(
attrs
).
forEach
(
function
(
name
)
{
let
value
=
attrs
[
name
]
switch
(
name
)
{
case
'
class
'
:
/* eslint-disable no-fallthrough */
Array
.
isArray
(
value
)
&&
(
value
=
value
.
join
(
'
'
))
case
'
style
'
:
elem
.
setAttribute
(
name
,
value
)
break
default
:
if
(
tagAttrs
.
indexOf
(
name
)
!==
-
1
)
{
elem
.
setAttribute
(
name
,
value
)
}
}
})
}
const
children
=
node
.
children
if
(
Array
.
isArray
(
children
)
&&
children
.
length
)
{
parseNodes
(
node
.
children
,
elem
)
}
parentNode
.
appendChild
(
elem
)
}
else
{
if
(
node
.
type
===
'
text
'
&&
typeof
node
.
text
===
'
string
'
&&
node
.
text
!==
''
)
{
parentNode
.
appendChild
(
document
.
createTextNode
(
decodeEntities
(
node
.
text
))
)
}
}
})
return
parentNode
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录