Spaces:
Build error
Build error
File size: 1,599 Bytes
a8b3f00 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import React from 'react'
export type AbstractNode = {
name: string
attributes: {
[key: string]: string
}
children?: AbstractNode[]
}
export type Attrs = {
[key: string]: string
}
export function normalizeAttrs(attrs: Attrs = {}): Attrs {
return Object.keys(attrs).reduce((acc: Attrs, key) => {
const val = attrs[key]
key = key.replace(/([-]\w)/g, (g: string) => g[1].toUpperCase())
key = key.replace(/([:]\w)/g, (g: string) => g[1].toUpperCase())
switch (key) {
case 'class':
acc.className = val
delete acc.class
break
case 'style':
(acc.style as any) = val.split(';').reduce((prev, next) => {
const pairs = next?.split(':')
if (pairs[0] && pairs[1]) {
const k = pairs[0].replace(/([-]\w)/g, (g: string) => g[1].toUpperCase())
prev[k] = pairs[1]
}
return prev
}, {} as Attrs)
break
default:
acc[key] = val
}
return acc
}, {})
}
export function generate(
node: AbstractNode,
key: string,
rootProps?: { [key: string]: any } | false,
): any {
if (!rootProps) {
return React.createElement(
node.name,
{ key, ...normalizeAttrs(node.attributes) },
(node.children || []).map((child, index) => generate(child, `${key}-${node.name}-${index}`)),
)
}
return React.createElement(
node.name,
{
key,
...normalizeAttrs(node.attributes),
...rootProps,
},
(node.children || []).map((child, index) => generate(child, `${key}-${node.name}-${index}`)),
)
}
|