mirror of
https://github.com/bendtherules/react-to-markdown.git
synced 2026-08-18 13:53:11 +00:00
61 lines
1.3 KiB
TypeScript
61 lines
1.3 KiB
TypeScript
import { Children as ReactChildren } from "react";
|
|
import {
|
|
ReactElementSubset,
|
|
ReactElementSubsetWithPrimitive,
|
|
isFunctionalComponent,
|
|
isClassComponent
|
|
} from "./helpers";
|
|
|
|
function render(
|
|
node: ReactElementSubsetWithPrimitive,
|
|
parentNode?: ReactElementSubset
|
|
) {
|
|
// Skip null and undefined nodes
|
|
if (node === null || node === undefined) {
|
|
return;
|
|
}
|
|
|
|
// Render string and number nodes
|
|
if (typeof node === "string" || typeof node === "number") {
|
|
return;
|
|
}
|
|
|
|
// Render Fragment nodes
|
|
if (Array.isArray(node)) {
|
|
node.forEach(fragmentEle => render(fragmentEle));
|
|
return;
|
|
}
|
|
|
|
const { props, type: elementType } = node;
|
|
const { children } = props;
|
|
|
|
if (isFunctionalComponent(elementType)) {
|
|
const renderOutput = elementType.call(
|
|
null,
|
|
props
|
|
) as ReactElementSubsetWithPrimitive;
|
|
|
|
render(renderOutput);
|
|
return;
|
|
}
|
|
|
|
if (isClassComponent(elementType)) {
|
|
const elementInstance = new elementType(props);
|
|
const renderOutputRaw = elementInstance.render();
|
|
const renderOutput = ReactChildren.toArray(
|
|
renderOutputRaw
|
|
) as ReactElementSubsetWithPrimitive[];
|
|
|
|
// Render array of children, just like fragments
|
|
render(renderOutput);
|
|
|
|
return;
|
|
}
|
|
|
|
// Handle intrinsic types of element like div, h1
|
|
{
|
|
}
|
|
}
|
|
|
|
export { render };
|