import clsx from "clsx"; import copy from "copy-to-clipboard"; import DOMPurify from "dompurify"; import hljs from "highlight.js"; import { useCallback, useMemo } from "react"; import toast from "react-hot-toast"; import Icon from "../Icon"; import MermaidBlock from "./MermaidBlock"; import { BaseProps } from "./types"; // Special languages that are rendered differently. enum SpecialLanguage { HTML = "__html", MERMAID = "mermaid", } interface Props extends BaseProps { language: string; content: string; } const CodeBlock: React.FC = ({ language, content }: Props) => { const formatedLanguage = useMemo(() => (language || "").toLowerCase() || "text", [language]); // Users can set Markdown code blocks as `__html` to render HTML directly. if (formatedLanguage === SpecialLanguage.HTML) { const purify = DOMPurify(window); return
; } else if (formatedLanguage === SpecialLanguage.MERMAID) { return ; } const highlightedCode: string = useMemo(() => { try { const lang = hljs.getLanguage(formatedLanguage); if (lang) { return hljs.highlight(content, { language: formatedLanguage, }).value; } } catch (error) { // Skip error and use default highlighted code. } return content; }, [formatedLanguage, content]); const handleCopyButtonClick = useCallback(() => { copy(content); toast.success("Copied to clipboard!"); }, [content]); return (
{formatedLanguage}
          
        
); }; export default CodeBlock;