/* @flow */
|
|
function getVNodeType (vnode: VNode): string {
|
if (!vnode.tag) {
|
return ''
|
}
|
return vnode.tag.replace(/vue\-component\-(\d+\-)?/, '')
|
}
|
|
function isSimpleSpan (vnode: VNode): boolean {
|
return vnode.children &&
|
vnode.children.length === 1 &&
|
!vnode.children[0].tag
|
}
|
|
function parseStyle (vnode: VNode): Object | void {
|
if (!vnode || !vnode.data) {
|
return
|
}
|
const { staticStyle, staticClass } = vnode.data
|
if (vnode.data.style || vnode.data.class || staticStyle || staticClass) {
|
const styles = Object.assign({}, staticStyle, vnode.data.style)
|
const cssMap = vnode.context.$options.style || {}
|
const classList = [].concat(staticClass, vnode.data.class)
|
classList.forEach(name => {
|
if (name && cssMap[name]) {
|
Object.assign(styles, cssMap[name])
|
}
|
})
|
return styles
|
}
|
}
|
|
function convertVNodeChildren (children: Array<VNode>): Array<VNode> | void {
|
if (!children.length) {
|
return
|
}
|
|
return children.map(vnode => {
|
const type: string = getVNodeType(vnode)
|
const props: Object = { type }
|
|
// convert raw text node
|
if (!type) {
|
props.type = 'span'
|
props.attr = {
|
value: (vnode.text || '').trim()
|
}
|
} else {
|
props.style = parseStyle(vnode)
|
if (vnode.data) {
|
props.attr = vnode.data.attrs
|
if (vnode.data.on) {
|
props.events = vnode.data.on
|
}
|
}
|
if (type === 'span' && isSimpleSpan(vnode)) {
|
props.attr = props.attr || {}
|
props.attr.value = vnode.children[0].text.trim()
|
return props
|
}
|
}
|
|
if (vnode.children && vnode.children.length) {
|
props.children = convertVNodeChildren(vnode.children)
|
}
|
|
return props
|
})
|
}
|
|
export default {
|
name: 'richtext',
|
render (h: Function) {
|
return h('weex:richtext', {
|
on: this._events,
|
attrs: {
|
value: convertVNodeChildren(this.$options._renderChildren || [])
|
}
|
})
|
}
|
}
|