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
| 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}`)),
| )
| }
|
|