fix(web): disable setext header syntax (#5314)

Add custom remark plugin to prevent setext headers (headers using === or --- underlines) from being recognized by the markdown parser. The plugin disables the setextUnderline construct at the micromark parser level.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Steven 2025-12-09 09:07:54 +08:00
parent 1cf047707b
commit 48ce4ccc26
2 changed files with 32 additions and 1 deletions

View File

@ -11,6 +11,7 @@ import useCurrentUser from "@/hooks/useCurrentUser";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { memoStore } from "@/store"; import { memoStore } from "@/store";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
import { remarkDisableSetext } from "@/utils/remark-plugins/remark-disable-setext";
import { remarkPreserveType } from "@/utils/remark-plugins/remark-preserve-type"; import { remarkPreserveType } from "@/utils/remark-plugins/remark-preserve-type";
import { remarkTag } from "@/utils/remark-plugins/remark-tag"; import { remarkTag } from "@/utils/remark-plugins/remark-tag";
import { isSuperUser } from "@/utils/user"; import { isSuperUser } from "@/utils/user";
@ -59,7 +60,7 @@ const MemoContent = observer((props: MemoContentProps) => {
onDoubleClick={onDoubleClick} onDoubleClick={onDoubleClick}
> >
<ReactMarkdown <ReactMarkdown
remarkPlugins={[remarkGfm, remarkBreaks, remarkMath, remarkTag, remarkPreserveType]} remarkPlugins={[remarkDisableSetext, remarkGfm, remarkBreaks, remarkMath, remarkTag, remarkPreserveType]}
rehypePlugins={[rehypeRaw, rehypeKatex, [rehypeSanitize, SANITIZE_SCHEMA]]} rehypePlugins={[rehypeRaw, rehypeKatex, [rehypeSanitize, SANITIZE_SCHEMA]]}
components={{ components={{
// Conditionally render custom components based on AST node type // Conditionally render custom components based on AST node type

View File

@ -0,0 +1,30 @@
/**
* Remark plugin to disable setext header syntax.
*
* Setext headers use underlines (=== or ---) to create headings:
* Heading 1
* =========
*
* Heading 2
* ---------
*
* This plugin disables the setext heading construct at the micromark parser level,
* preventing these patterns from being recognized as headers.
*/
export function remarkDisableSetext(this: any) {
const data = this.data();
add("micromarkExtensions", {
disable: {
null: ["setextUnderline"],
},
});
/**
* Add a micromark extension to the parser configuration.
*/
function add(field: string, value: any) {
const list = data[field] ? data[field] : (data[field] = []);
list.push(value);
}
}