diff --git a/astro.config.mjs b/astro.config.mjs index ba28ceb..4155157 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -5,30 +5,17 @@ import mdx from "@astrojs/mdx" import { pluginCollapsibleSections } from "@expressive-code/plugin-collapsible-sections" import { pluginLineNumbers } from "@expressive-code/plugin-line-numbers" import expressiveCode from "astro-expressive-code" -import rehypeAutolinkHeadings from "rehype-autolink-headings" -import rehypeComponents from "rehype-components" -import rehypeKatex from "rehype-katex" -import rehypeSlug from "rehype-slug" -import remarkDirective from "remark-directive" -import remarkGithubAdmonitionsToDirectives from "remark-github-admonitions-to-directives" -import remarkMath from "remark-math" -import remarkSectionize from "remark-sectionize" -import { remarkShiftHeadings } from "./src/plugins/remark-shift-headings.mjs" -import { AdmonitionComponent } from "./src/plugins/rehype-component-admonition.mjs" -import { parseDirectiveNode } from "./src/plugins/remark-directive-rehype.js" -import { remarkExcerpt } from "./src/plugins/remark-excerpt.js" -import { remarkReadingTime } from "./src/plugins/remark-reading-time.mjs" import { pluginLanguageBadge } from "./src/plugins/expressive-code/language-badge" import { pluginCustomCopyButton } from "./src/plugins/expressive-code/custom-copy-button" -import { unified } from "@astrojs/markdown-remark" -import { rehypeImageLightbox } from "./src/plugins/rehype-image-lightbox.mjs" +import { satteri, satteriHeadingIdsPlugin } from "@astrojs/markdown-satteri" +import { excerpt } from "./src/plugins/satteri/excerpt.mjs" +import { readingTime } from "./src/plugins/satteri/reading-time.mjs" +import { sectionize } from "./src/plugins/satteri/sectionize.mjs" +import { shiftHeadings } from "./src/plugins/satteri/shift-headings.mjs" +import { autolinkHeadings } from "./src/plugins/satteri/autolink-headings.mjs" +import { imageLightbox } from "./src/plugins/satteri/image-lightbox.mjs" import { site } from "./src/data/site" -const createAdmonitionComponent = (type) => (properties = {}, children = []) => { - const normalizedChildren = Array.isArray(children) ? children : [] - return AdmonitionComponent(properties, normalizedChildren, type) -} - export default defineConfig({ srcDir: "./src", output: "static", @@ -88,56 +75,24 @@ export default defineConfig({ ], compressHTML: true, markdown: { - processor: unified({ - remarkPlugins: [ - remarkMath, - remarkReadingTime, - remarkExcerpt, - remarkShiftHeadings, - remarkGithubAdmonitionsToDirectives, - remarkDirective, - remarkSectionize, - parseDirectiveNode, + // Astro 7 的 Sätteri 管线。以下插件是 unified 时期 remark/rehype 插件的对应移植, + // 见 src/plugins/satteri/。 + // + // 注意:math 只负责「解析」,渲染成 KaTeX 需要额外的 HAST 插件 —— 尚未迁移。 + processor: satteri({ + // dashes: false 是为了和迁移前的输出逐字一致:Astro 的 unified 管线 + // 会把直引号排成弯引号,但不转换 --- (Sätteri 默认会转成破折号)。 + features: { math: true, smartPunctuation: { dashes: false } }, + mdastPlugins: [ + readingTime, + excerpt, + shiftHeadings(), + sectionize(), ], - rehypePlugins: [ - rehypeKatex, - rehypeSlug, - [ - rehypeComponents, - { - components: { - note: createAdmonitionComponent("note"), - tip: createAdmonitionComponent("tip"), - important: createAdmonitionComponent("important"), - caution: createAdmonitionComponent("caution"), - warning: createAdmonitionComponent("warning"), - }, - }, - ], - [ - rehypeAutolinkHeadings, - { - behavior: "append", - properties: { - className: ["anchor"], - }, - content: { - type: "element", - tagName: "span", - properties: { - className: ["anchor-icon"], - "data-pagefind-ignore": true, - }, - children: [ - { - type: "text", - value: "#", - }, - ], - }, - }, - ], - rehypeImageLightbox, + hastPlugins: [ + satteriHeadingIdsPlugin(), + autolinkHeadings, + imageLightbox, ], }), }, diff --git a/package.json b/package.json index 3d20272..ffd0597 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "@astrojs/markdown-remark": "^7.3.1", + "@astrojs/markdown-satteri": "^0.4.1", "@astrojs/mdx": "^8.0.1", "@astrojs/react": "^6.0.6", "@astrojs/rss": "^4.0.19", @@ -86,6 +87,7 @@ "remark-math": "^6.0.0", "remark-sectionize": "^2.1.0", "sanitize-html": "^2.17.0", + "satteri": "^0.10.5", "sonner": "^1.7.4", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28d1e7c..ffcd4fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@astrojs/markdown-remark': specifier: ^7.3.1 version: 7.3.1 + '@astrojs/markdown-satteri': + specifier: ^0.4.1 + version: 0.4.1 '@astrojs/mdx': specifier: ^8.0.1 version: 8.0.1(@astrojs/markdown-remark@7.3.1)(@astrojs/markdown-satteri@0.4.1)(astro@7.3.3(@astrojs/markdown-remark@7.3.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@22.19.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) @@ -224,6 +227,9 @@ importers: sanitize-html: specifier: ^2.17.0 version: 2.17.7 + satteri: + specifier: ^0.10.5 + version: 0.10.5 sonner: specifier: ^1.7.4 version: 1.7.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) diff --git a/src/components/ImageLightbox.astro b/src/components/ImageLightbox.astro index ef6a162..68c3112 100644 --- a/src/components/ImageLightbox.astro +++ b/src/components/ImageLightbox.astro @@ -4,7 +4,7 @@ * * 任何带 `data-lightbox-src` 的元素点击即可放大: * - 相册页的 `