diff --git a/src/app/(dashboard)/admin/ai-chat/page.tsx b/src/app/(dashboard)/admin/ai-chat/page.tsx index e233808..bae2c42 100644 --- a/src/app/(dashboard)/admin/ai-chat/page.tsx +++ b/src/app/(dashboard)/admin/ai-chat/page.tsx @@ -6,6 +6,43 @@ import { cn } from "@/lib/utils"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; +// Strip HTML tags and convert common HTML constructs to Markdown equivalents +function htmlToMarkdown(text: string): string { + return text + // Block-level → markdown + .replace(/]*>(.*?)<\/h\1>/gis, (_, level, content) => `${"#".repeat(Number(level))} ${content.replace(/<[^>]+>/g, "")}\n`) + .replace(/]*>(.*?)<\/strong>/gis, "**$1**") + .replace(/]*>(.*?)<\/b>/gis, "**$1**") + .replace(/]*>(.*?)<\/em>/gis, "*$1*") + .replace(/]*>(.*?)<\/i>/gis, "*$1*") + .replace(/]*>(.*?)<\/code>/gis, "`$1`") + .replace(/]*>(.*?)<\/pre>/gis, (_, c) => "```\n" + c.replace(/<[^>]+>/g, "") + "\n```") + .replace(/]*>(.*?)<\/li>/gis, "- $1") + .replace(/]*>|<\/ul>/gis, "") + .replace(/]*>|<\/ol>/gis, "") + .replace(/]*>/gis, "") + .replace(/<\/tr>/gis, "\n") + .replace(/]*>(.*?)<\/th>/gis, "| **$1** ") + .replace(/]*>(.*?)<\/td>/gis, "| $1 ") + .replace(/]*>|<\/table>|]*>|<\/thead>|]*>|<\/tbody>/gis, "") + .replace(//gis, "\n") + .replace(/]*>(.*?)<\/p>/gis, "$1\n\n") + .replace(/]*>(.*?)<\/div>/gis, "$1\n") + .replace(/]*href="([^"]*)"[^>]*>(.*?)<\/a>/gis, "[$2]($1)") + // Strip any remaining tags + .replace(/<[^>]+>/g, "") + // Decode HTML entities + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/ /g, " ") + // Clean up excessive blank lines + .replace(/\n{3,}/g, "\n\n") + .trim(); +} + interface ModelInfo { id: string; name: string; @@ -135,7 +172,7 @@ function MessageBubble({ msg }: { msg: Message }) { a: ({ href, children }) => {children}, }} > - {msg.content} + {htmlToMarkdown(msg.content)} )}