mirror of
https://github.com/langgenius/dify.git
synced 2026-06-17 23:21:12 +08:00
Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: jyong <718720800@qq.com> Co-authored-by: Yansong Zhang <916125788@qq.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: hj24 <mambahj24@gmail.com> Co-authored-by: hj24 <huangjian@dify.ai> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Co-authored-by: CodingOnStar <hanxujiang@dify.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Ayush Baluni <73417844+aayushbaluni@users.noreply.github.com> Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com> Co-authored-by: jimcody1995 <jjimcody@gmail.com> Co-authored-by: James <63717587+jamesrayammons@users.noreply.github.com> Co-authored-by: Yunlu Wen <yunlu.wen@dify.ai> Co-authored-by: Stephen Zhou <hi@hyoban.cc> Co-authored-by: Coding On Star <447357187@qq.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: jerryzai <jerryzh8710@protonmail.com> Co-authored-by: NVIDIAN <speedy.hpc@hotmail.com> Co-authored-by: ai-hpc <ai-hpc@users.noreply.github.com> Co-authored-by: Asuka Minato <i@asukaminato.eu.org> Co-authored-by: Junghwan <70629228+shaun0927@users.noreply.github.com> Co-authored-by: HeYinKazune <70251095+HeYin-OS@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: Jingyi <jingyi.qi@dify.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: sxxtony <166789813+sxxtony@users.noreply.github.com>
89 lines
2.1 KiB
TypeScript
89 lines
2.1 KiB
TypeScript
import * as React from 'react'
|
|
|
|
export type AbstractNode = {
|
|
name: string
|
|
attributes: {
|
|
[key: string]: string | undefined
|
|
}
|
|
children?: AbstractNode[]
|
|
}
|
|
|
|
type Attrs = {
|
|
[key: string]: string | undefined
|
|
}
|
|
|
|
export function normalizeAttrs(attrs: Attrs = {}): Attrs {
|
|
return Object.keys(attrs).reduce((acc: Attrs, key) => {
|
|
// Filter out editor metadata attributes before processing
|
|
if (key.startsWith('inkscape:')
|
|
|| key.startsWith('sodipodi:')
|
|
|| key.startsWith('xmlns:inkscape')
|
|
|| key.startsWith('xmlns:sodipodi')
|
|
|| key.startsWith('xmlns:svg')
|
|
|| key === 'data-name') {
|
|
return acc
|
|
}
|
|
|
|
const val = attrs[key]
|
|
if (val === undefined)
|
|
return acc
|
|
|
|
key = key.replace(/(-\w)/g, (g: string) => g[1]!.toUpperCase())
|
|
key = key.replace(/(:\w)/g, (g: string) => g[1]!.toUpperCase())
|
|
|
|
// Additional filter after camelCase conversion
|
|
if (key === 'xmlnsInkscape'
|
|
|| key === 'xmlnsSodipodi'
|
|
|| key === 'xmlnsSvg'
|
|
|| key === 'dataName') {
|
|
return acc
|
|
}
|
|
|
|
switch (key) {
|
|
case 'class':
|
|
acc.className = val
|
|
delete acc.class
|
|
break
|
|
case 'style':
|
|
(acc.style as any) = val.split(';').reduce((prev, next) => {
|
|
const pairs = next?.split(':')
|
|
|
|
if (pairs[0] && pairs[1]) {
|
|
const k = pairs[0].replace(/(-\w)/g, (g: string) => g[1]!.toUpperCase())
|
|
prev[k] = pairs[1]
|
|
}
|
|
|
|
return prev
|
|
}, {} as Attrs)
|
|
break
|
|
default:
|
|
acc[key] = val
|
|
}
|
|
return acc
|
|
}, {})
|
|
}
|
|
|
|
export function generate(
|
|
node: AbstractNode,
|
|
key: string,
|
|
rootProps?: { [key: string]: any } | false,
|
|
): any {
|
|
if (!rootProps) {
|
|
return React.createElement(
|
|
node.name,
|
|
{ key, ...normalizeAttrs(node.attributes) },
|
|
(node.children || []).map((child, index) => generate(child, `${key}-${node.name}-${index}`)),
|
|
)
|
|
}
|
|
|
|
return React.createElement(
|
|
node.name,
|
|
{
|
|
key,
|
|
...normalizeAttrs(node.attributes),
|
|
...rootProps,
|
|
},
|
|
(node.children || []).map((child, index) => generate(child, `${key}-${node.name}-${index}`)),
|
|
)
|
|
}
|