feat: Enhance markdown's anti-shake

This commit is contained in:
Henry Li 2025-05-11 00:06:07 +08:00 committed by Willem Jiang
parent 69d6e16111
commit 28b65d7a93
2 changed files with 61 additions and 1 deletions

View File

@ -13,6 +13,7 @@ import "katex/dist/katex.min.css";
import { Button } from "~/components/ui/button";
import { rehypeSplitWordsIntoSpans } from "~/core/rehype";
import { autoFixMarkdown } from "~/core/utils/markdown";
import { cn } from "~/lib/utils";
import Image from "./image";
@ -62,7 +63,9 @@ export function Markdown({
}}
{...props}
>
{dropMarkdownQuote(processKatexInMarkdown(children))}
{autoFixMarkdown(
dropMarkdownQuote(processKatexInMarkdown(children ?? "")) ?? "",
)}
</ReactMarkdown>
{enableCopy && typeof children === "string" && (
<div className="flex">

View File

@ -0,0 +1,57 @@
export function autoFixMarkdown(markdown: string): string {
return autoCloseTrailingLink(markdown);
}
function autoCloseTrailingLink(markdown: string): string {
// Fix unclosed Markdown links or images
let fixedMarkdown: string = markdown;
// Fix unclosed image syntax ![...](...)
fixedMarkdown = fixedMarkdown.replace(
/!\[([^\]]*)\]\(([^)]*)$/g,
(match: string, altText: string, url: string): string => {
return `![${altText}](${url})`;
},
);
// Fix unclosed link syntax [...](...)
fixedMarkdown = fixedMarkdown.replace(
/\[([^\]]*)\]\(([^)]*)$/g,
(match: string, linkText: string, url: string): string => {
return `[${linkText}](${url})`;
},
);
// Fix unclosed image syntax ![...]
fixedMarkdown = fixedMarkdown.replace(
/!\[([^\]]*)$/g,
(match: string, altText: string): string => {
return `![${altText}]`;
},
);
// Fix unclosed link syntax [...]
fixedMarkdown = fixedMarkdown.replace(
/\[([^\]]*)$/g,
(match: string, linkText: string): string => {
return `[${linkText}]`;
},
);
// Fix unclosed images or links missing ")"
fixedMarkdown = fixedMarkdown.replace(
/!\[([^\]]*)\]\(([^)]*)$/g,
(match: string, altText: string, url: string): string => {
return `![${altText}](${url})`;
},
);
fixedMarkdown = fixedMarkdown.replace(
/\[([^\]]*)\]\(([^)]*)$/g,
(match: string, linkText: string, url: string): string => {
return `[${linkText}](${url})`;
},
);
return fixedMarkdown;
}