51 lines
1.4 KiB
Vue
51 lines
1.4 KiB
Vue
<script lang="ts">
|
|
import { defineComponent, h } from 'vue'
|
|
import { RouterLink } from 'vue-router'
|
|
import { parseHTML, getChildNodes, getAttribute, getText, nodeIs, getClass } from '../shared/html-parser'
|
|
|
|
export default defineComponent({
|
|
render () {
|
|
const parsed = parseHTML(this.$slots.default()[0].children as string)
|
|
const toRender = []
|
|
|
|
getChildNodes(parsed).forEach(node => {
|
|
if (nodeIs(node, 'TEXT')) {
|
|
toRender.push(getText(node))
|
|
return
|
|
}
|
|
|
|
if (nodeIs(node, 'STRONG')) {
|
|
toRender.push(h('strong', getText(node)))
|
|
return
|
|
}
|
|
|
|
if (nodeIs(node, 'EM')) {
|
|
toRender.push(h('em', getText(node)))
|
|
return
|
|
}
|
|
|
|
if (nodeIs(node, 'ROUTER-LINK')) {
|
|
toRender.push(h(RouterLink, { to: getAttribute(node, 'to'), className: getClass(node) }, () => getText(node)))
|
|
return
|
|
}
|
|
|
|
if (nodeIs(node, 'BR')) {
|
|
toRender.push(h('br'))
|
|
return
|
|
}
|
|
|
|
if (nodeIs(node, 'A')) {
|
|
toRender.push(h('a', {
|
|
target: getAttribute(node, 'target'),
|
|
href: getAttribute(node, 'href'),
|
|
rel: getAttribute(node, 'rel'),
|
|
className: getAttribute(node, 'class')
|
|
}, getText(node)))
|
|
}
|
|
})
|
|
|
|
return h('span', toRender)
|
|
}
|
|
})
|
|
</script>
|