import React from "react";
import { Components } from "react-markdown";
import CodeBlock from "@/components/Markdown/CodeBlock";
const createHeadingComponent = (level: number): Components["h1"] => {
const HeadingComponent: Components["h1"] = ({ children, ...props }) => {
const Tag = `h${level}` as keyof JSX.IntrinsicElements;
const className = `text-${6 - level}xl font-bold mb-4`;
return React.createElement(Tag, { className, ...props }, children);
};
return Object.assign(HeadingComponent, { displayName: `Heading${level}` });
};
const extractTextContent = (node: React.ReactNode): string => {
if (typeof node === "string") return node;
if (typeof node === "number") return String(node);
if (Array.isArray(node)) return node.map(extractTextContent).join("");
if (React.isValidElement(node)) {
return extractTextContent(node.props.children);
}
return "";
};
const CodeComponent: Components["code"] = ({
className,
children,
...props
}) => {
const match = /language-(\w+)/.exec(className || "");
const lang = (match && match[1]) || "text";
const codeString = extractTextContent(children);
return ;
};
const ParagraphComponent: Components["p"] = ({ children, ...props }) => {
return (
{children}
);
};
const UnorderedListComponent: Components["ul"] = ({ children, ...props }) => {
return (
);
};
const OrderedListComponent: Components["ol"] = ({ children, ...props }) => {
return (
{children}
);
};
const ListItemComponent: Components["li"] = ({ children, ...props }) => {
return (
{children}
);
};
const HorizontalRuleComponent: Components["hr"] = (props) => {
return
;
};
const LinkComponent: Components["a"] = ({ children, ...props }) => {
return (
{children}
);
};
const TableHeaderComponent: Components["th"] = ({ children, ...props }) => {
return (
{children}
|
);
};
const TableCellComponent: Components["td"] = ({ children, ...props }) => {
return (
{children}
|
);
};
export const components: Partial = {
h1: createHeadingComponent(1),
h2: createHeadingComponent(2),
h3: createHeadingComponent(3),
h4: createHeadingComponent(4),
h5: createHeadingComponent(5),
h6: createHeadingComponent(6),
code: Object.assign(CodeComponent, { displayName: "CodeComponent" }),
p: Object.assign(ParagraphComponent, { displayName: "ParagraphComponent" }),
ul: Object.assign(UnorderedListComponent, {
displayName: "UnorderedListComponent",
}),
ol: Object.assign(OrderedListComponent, {
displayName: "OrderedListComponent",
}),
li: Object.assign(ListItemComponent, { displayName: "ListItemComponent" }),
hr: Object.assign(HorizontalRuleComponent, {
displayName: "HorizontalRuleComponent",
}),
a: Object.assign(LinkComponent, { displayName: "LinkComponent" }),
th: Object.assign(TableHeaderComponent, {
displayName: "TableHeaderComponent",
}),
td: Object.assign(TableCellComponent, { displayName: "TableCellComponent" }),
};