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