const Block = require("@/components/miniprogram_npm/widget-ui/index.js"); const { splitLineToCamelCase } = require("./utils.js"); class Element extends Block { constructor(prop) { super(prop.style); this.name = prop.name; this.attributes = prop.attributes; } } class Widget { constructor(xom, style) { this.xom = xom; this.style = style; this.inheritProps = ['fontSize', 'lineHeight', 'textAlign', 'verticalAlign', 'color']; } init() { this.container = this.create(this.xom); this.container.layout(); this.inheritStyle(this.container); return this.container; } // 继承父节点的样式 inheritStyle(node) { const parent = node.parent || null; const children = node.children || {}; const computedStyle = node.computedStyle; if (parent) { this.inheritProps.forEach(prop => { computedStyle[prop] = computedStyle[prop] || parent.computedStyle[prop]; }); } Object.values(children).forEach(child => { this.inheritStyle(child); }); } create(node) { let classNames = (node.attributes.class || '').split(' '); classNames = classNames.map(item => splitLineToCamelCase(item.trim())); const style = {}; classNames.forEach(item => { Object.assign(style, this.style[item] || {}); }); const args = { name: node.name, style }; const attrs = Object.keys(node.attributes); const attributes = {}; for (const attr of attrs) { const value = node.attributes[attr]; const CamelAttr = splitLineToCamelCase(attr); if (value === '' || value === 'true') { attributes[CamelAttr] = true; } else if (value === 'false') { attributes[CamelAttr] = false; } else { attributes[CamelAttr] = value; } } attributes.text = node.content; args.attributes = attributes; const element = new Element(args); node.children.forEach(childNode => { const childElement = this.create(childNode); element.add(childElement); }); return element; } } module.exports = { Widget };