From 13007c8fa4dfc3a1d5d746acbf3bff90a84bd948 Mon Sep 17 00:00:00 2001 From: hypercross Date: Mon, 2 Mar 2026 13:39:36 +0800 Subject: [PATCH] feat: gfm heading id --- package-lock.json | 19 +++++++++++++++++++ package.json | 1 + src/components/FileTree.tsx | 7 +++++-- src/markdown/index.ts | 2 ++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b849086..f6ad7a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "marked": "^17.0.3", "marked-alert": "^2.1.2", "marked-directive": "^1.0.7", + "marked-gfm-heading-id": "^4.1.3", "mermaid": "^11.0.0", "solid-element": "^1.9.1", "solid-js": "^1.9.3" @@ -3569,6 +3570,12 @@ "node": ">=6.9.0" } }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -4054,6 +4061,18 @@ "marked": ">=7.0.0" } }, + "node_modules/marked-gfm-heading-id": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/marked-gfm-heading-id/-/marked-gfm-heading-id-4.1.3.tgz", + "integrity": "sha512-aR0i63LmFbuxU/gAgrgz1Ir+8HK6zAIFXMlckeKHpV+qKbYaOP95L4Ux5Gi+sKmCZU5qnN2rdKpvpb7PnUBIWg==", + "license": "MIT", + "dependencies": { + "github-slugger": "^2.0.0" + }, + "peerDependencies": { + "marked": ">=13 <18" + } + }, "node_modules/mermaid": { "version": "11.12.3", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.3.tgz", diff --git a/package.json b/package.json index 59eecd7..e2f60ca 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "marked": "^17.0.3", "marked-alert": "^2.1.2", "marked-directive": "^1.0.7", + "marked-gfm-heading-id": "^4.1.3", "mermaid": "^11.0.0", "solid-element": "^1.9.1", "solid-js": "^1.9.3" diff --git a/src/components/FileTree.tsx b/src/components/FileTree.tsx index b28b834..11e20c3 100644 --- a/src/components/FileTree.tsx +++ b/src/components/FileTree.tsx @@ -87,11 +87,14 @@ export const HeadingNode: Component<{ const handleClick = (e: MouseEvent) => { e.preventDefault(); navigate(href); - // 滚动到目标元素 + // 滚动到目标元素,考虑导航栏高度偏移 requestAnimationFrame(() => { const element = document.getElementById(anchor); if (element) { - element.scrollIntoView({ behavior: "smooth", block: "start" }); + const navBarHeight = 80; + const elementPosition = element.getBoundingClientRect().top; + const offsetPosition = window.scrollY + elementPosition - navBarHeight; + window.scrollTo({ top: offsetPosition, behavior: "smooth" }); } }); }; diff --git a/src/markdown/index.ts b/src/markdown/index.ts index 0fbe20e..5c66841 100644 --- a/src/markdown/index.ts +++ b/src/markdown/index.ts @@ -3,9 +3,11 @@ import {createDirectives, presetDirectiveConfigs} from 'marked-directive'; import yaml from 'js-yaml'; import markedAlert from "marked-alert"; import markedMermaid from "./mermaid"; +import {gfmHeadingId} from "marked-gfm-heading-id"; // 使用 marked-directive 来支持指令语法 const marked = new Marked() + .use(gfmHeadingId()) .use(markedAlert()) .use(markedMermaid()) .use(createDirectives([