/* * build.ts * Copyright (C) 2024 veypi * 2024-10-23 15:54 * Distributed under terms of the GPL license. */ import proxy from "./proxy" interface buildOpts { id?: string typ?: string class?: string style?: string innerHtml?: string onclick?: any children?: HTMLElement[] updator?: (p: HTMLElement) => void } const typs = ['div', 'img', 'span', 'p', 'a'] export default (opts: buildOpts | string, inner?: string | HTMLElement[], updator?: (p: HTMLElement) => void) => { if (typeof opts === 'string') { if (typs.indexOf(opts) >= 0) { opts = { typ: opts } } else { opts = { class: opts } } } if (inner) { if (typeof inner == 'string') { opts.innerHtml = inner } else { opts.children = inner } } if (opts.updator) { updator = opts.updator } let dom = document.createElement(opts.typ || 'div') if (opts.id) { dom.id = opts.id } if (opts.class) { dom.classList.add(...opts.class.split(' ')) } if (opts.innerHtml) { dom.innerHTML = opts.innerHtml } if (opts.onclick) { dom.onclick = opts.onclick } if (opts.children) { for (let c in opts.children) { dom.appendChild(opts.children[c]) } } if (opts.style) { const regex = /([a-zA-Z-]+)\s*:\s*([^;]+);?/g; let match: any while ((match = regex.exec(opts.style)) !== null) { const key = match[1].trim(); const value = match[2].trim(); dom.style.setProperty(key, value) } } dom.setAttribute('voa', '1') if (updator) { proxy.Listen(() => { updator(dom) }) } return dom }