chore: improve crawling logic

This commit is contained in:
zernonia 2024-03-14 18:22:57 +08:00
parent 00edec21aa
commit 017fbc1e1f

View File

@ -1,6 +1,17 @@
import { type VNode, cloneVNode, defineComponent } from 'vue' import { type VNode, type VNodeArrayChildren, cloneVNode, defineComponent } from 'vue'
import { useConfigStore } from '@/stores/config' import { useConfigStore } from '@/stores/config'
function crawlSpan(children: VNodeArrayChildren, cb: (vnode: VNode) => void) {
children.forEach((childNode) => {
if (!Array.isArray(childNode) && typeof childNode === 'object') {
if (typeof childNode?.children === 'string')
cb(childNode)
else
crawlSpan(childNode?.children as VNodeArrayChildren ?? [], cb)
}
})
}
export default defineComponent( export default defineComponent(
(props, { slots }) => { (props, { slots }) => {
const { codeConfig } = useConfigStore() const { codeConfig } = useConfigStore()
@ -16,21 +27,14 @@ export default defineComponent(
const preVNode = [...clonedVNode?.children].find((node: VNode) => node.type === 'pre') as VNode const preVNode = [...clonedVNode?.children].find((node: VNode) => node.type === 'pre') as VNode
// @ts-expect-error cloneVNode // @ts-expect-error cloneVNode
const codeVNode = preVNode.children?.at(0) as VNode const codeVNode = preVNode.children?.at(0) as VNode
if (codeVNode) { if (codeVNode) {
// @ts-expect-error cloneVNode crawlSpan(codeVNode.children as VNodeArrayChildren, (vnode) => {
[...codeVNode.children] if (typeof vnode.children === 'string') {
.filter((node: VNode) => node.type === 'span') vnode.children = vnode.children.replaceAll('@/components', codeConfig.value.componentsPath)
.forEach((node: VNode) => { vnode.children = vnode.children.replaceAll('@/libs', codeConfig.value.utilsPath)
if (node.children) { }
// @ts-expect-error cloneVNode })
[...node.children].forEach((childNode: VNode) => {
if (typeof childNode.children === 'string') {
childNode.children = childNode.children.replaceAll('@/components', codeConfig.value.componentsPath)
childNode.children = childNode.children.replaceAll('@/libs', codeConfig.value.utilsPath)
}
})
}
})
return clonedVNode return clonedVNode
} }