const addAttributes = (target, values: (x: any) => { name: string, type: string, display: string }[]) => { Object.defineProperty(target.prototype, "editableAttributes", { enumerable: true, configurable: true, get() { return values(this); } }); }; const common = [ { name: "title", type: "string", display: "Tool Tip" }, { name: "lang", type: "lang", display: "Language" }, { name: "style", type: "string", display: "Style"} ]; addAttributes(HTMLElement, (x: HTMLElement) => /video/i.test(x.tagName) ? [ ... common, { name: "src", type: "video", display: "Video"} ] : common); addAttributes(HTMLAnchorElement, () => [ ... common, { name: "href", type: "link", display: "Link" }, { name: "target", type: "string", suggestions: [ { label: "_blank",value: "_blank" }, { label: "_top",value: "_top" }, { label: "_self",value: "_self" }, ], display: "Target" }, ]); addAttributes(HTMLImageElement, () => [ ... common, { name: "src", type: "image", display: "Image" }, { name: "alt", type: "string", display: "Alt" }, { name: "render-size", type: "number", display: "Render Size" }, { name: "width", type: "number", display: "Width" }, { name: "height", type: "number", display: "Height" }, ]); addAttributes(HTMLVideoElement, () => [ ... common, { name: "src", type: "video", display: "Video" }, { name: "poster", type: "image", display: "Poster" }, { name: "original-autoplay", type: "boolean", display: "Auto Play" }, { name: "preload", type: "enum", display: "Preload", values: ["auto", "metadata", "none"] }, { name: "loop", type: "boolean", display: "Loop" }, { name: "muted", type: "boolean", display: "Muted" } ]);