|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 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) => {
- // Filter out editor metadata attributes before processing
- if (key.startsWith('inkscape:')
- || key.startsWith('sodipodi:')
- || key.startsWith('xmlns:inkscape')
- || key.startsWith('xmlns:sodipodi')
- || key.startsWith('xmlns:svg')
- || key === 'data-name')
- return acc
-
- const val = attrs[key]
- key = key.replace(/([-]\w)/g, (g: string) => g[1].toUpperCase())
- key = key.replace(/([:]\w)/g, (g: string) => g[1].toUpperCase())
-
- // Additional filter after camelCase conversion
- if (key === 'xmlnsInkscape'
- || key === 'xmlnsSodipodi'
- || key === 'xmlnsSvg'
- || key === 'dataName')
- return acc
-
- 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}`)),
- )
- }
|