summaryrefslogtreecommitdiff
path: root/packages/integrations/react/vnode-children.js
blob: 0c9d5e08da662a5774b60ef22d98fdacb947d506 (plain) (blame)
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
import { parse, walkSync, DOCUMENT_NODE, ELEMENT_NODE, TEXT_NODE } from 'ultrahtml'
import { createElement, Fragment } from 'react';

export default function convert(children) {
    const nodeMap = new WeakMap();
    let doc = parse(children.toString().trim());
    let root = createElement(Fragment, { children: [] });

    walkSync(doc, (node, parent, index) => {
        let newNode = {};
        if (node.type === DOCUMENT_NODE) {
            nodeMap.set(node, root);
        } else if (node.type === ELEMENT_NODE) {
            const { class: className, ...props } = node.attributes;
            newNode = createElement(node.name, { ...props, className, children: [] });
            nodeMap.set(node, newNode);
            if (parent) {
                const newParent = nodeMap.get(parent);
                newParent.props.children[index] = newNode;
                
            }
        } else if (node.type === TEXT_NODE) {
            newNode = node.value.trim();
            if (newNode.trim()) {
                if (parent) {
                    const newParent = nodeMap.get(parent);
                    if (parent.children.length === 1) {
                        newParent.props.children[0] = newNode;
                    } else {
                        newParent.props.children[index] = newNode;
                    }
                }
            }
        }
    });

    return root.props.children;
}