import ReactMarkdown from 'react-markdown'; import rehypeRaw from 'rehype-raw'; import remarkGfm from 'remark-gfm'; import { ScrollArea } from '@/components/ui/scroll-area'; import { MermaidDiagram } from './MermaidDiagram'; import { PlantUMLDiagram } from './PlantUMLDiagram'; interface MarkdownViewerProps { content: string; className?: string; } export function MarkdownViewer({ content, className = '' }: MarkdownViewerProps) { return (
(

{children}

), h2: ({ children }) => (

{children}

), h3: ({ children }) => (

{children}

), h4: ({ children }) => (

{children}

), p: ({ children }) => (

{children}

), ul: ({ children }) => (
    {children}
), ol: ({ children }) => (
    {children}
), li: ({ children }) => (
  • {children}
  • ), code: ({ className, children, ...props }) => { const match = /language-(\w+)/.exec(className || ''); const language = match ? match[1] : ''; const codeContent = String(children).replace(/\n$/, ''); // Handle Mermaid diagrams if (language === 'mermaid') { return ; } // Handle PlantUML diagrams if (language === 'plantuml' || language === 'puml') { return ; } // Inline code (no language specified and short) const isInline = !className && !String(children).includes('\n'); if (isInline) { return ( {children} ); } // Code block return ( {children} ); }, pre: ({ children, ...props }) => { // Check if the child is a Mermaid or PlantUML diagram (already rendered) const childElement = children as React.ReactElement; if (childElement?.type === MermaidDiagram || childElement?.type === PlantUMLDiagram) { return <>{children}; } return (
                      {children}
                    
    ); }, blockquote: ({ children }) => (
    {children}
    ), // Enhanced table support for HTML tables table: ({ children }) => (
    {children}
    ), thead: ({ children }) => ( {children} ), tbody: ({ children }) => ( {children} ), tr: ({ children }) => ( {children} ), th: ({ children, style }) => ( {children} ), td: ({ children, style }) => ( {children} ), hr: () =>
    , a: ({ href, children }) => ( {children} ), strong: ({ children }) => ( {children} ), em: ({ children }) => ( {children} ), // Support for definition lists (HTML) dl: ({ children }) => (
    {children}
    ), dt: ({ children }) => (
    {children}
    ), dd: ({ children }) => (
    {children}
    ), // Support for figures and captions figure: ({ children }) => (
    {children}
    ), figcaption: ({ children }) => (
    {children}
    ), // Support for images img: ({ src, alt, ...props }) => ( {alt ), // Support for details/summary details: ({ children }) => (
    {children}
    ), summary: ({ children }) => ( {children} ), // Div support for custom HTML blocks div: ({ className, children, ...props }) => (
    {children}
    ), // Span support span: ({ className, children, style, ...props }) => ( {children} ), }} > {content}
    ); }