/* @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): Array | 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 || []) } }) } }