sepia-search-motore-di-rice.../client/src/components/SafeHTML.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>