mirror of
https://github.com/bendtherules/react-to-markdown.git
synced 2026-08-18 13:53:11 +00:00
renderer - Add basic separation logic for diff types of element
This commit is contained in:
@@ -0,0 +1,60 @@
|
|||||||
|
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 };
|
||||||
Reference in New Issue
Block a user