|
1 | 1 | import { Author, Feed } from "feed"; |
| 2 | +import container from "markdown-it-container"; |
| 3 | +import type Token from "markdown-it/lib/token.mjs"; |
2 | 4 | import { mkdirSync, writeFileSync } from "node:fs"; |
3 | 5 | import path from "node:path"; |
4 | | -import { createContentLoader, defineConfig, type SiteConfig } from "vitepress"; |
| 6 | +import { createContentLoader, createMarkdownRenderer, defineConfig, type SiteConfig } from "vitepress"; |
5 | 7 | import { TEAM_MEMBERS_MAP } from "../theme/constants/team"; |
6 | 8 | import { sharedConfig } from "./shared"; |
7 | 9 |
|
@@ -37,6 +39,39 @@ export const rssConfig = defineConfig({ |
37 | 39 | copyright: sharedConfig.themeConfig!.footer!.copyright!, |
38 | 40 | }); |
39 | 41 |
|
| 42 | + const md = await createMarkdownRenderer( |
| 43 | + config.srcDir, |
| 44 | + config.markdown, |
| 45 | + config.site.base, |
| 46 | + config.logger, |
| 47 | + ); |
| 48 | + // Wrap code groups with <table>s |
| 49 | + // Reference: https://github.com/vuejs/vitepress/blob/179ee6/src/node/markdown/plugins/preWrapper.ts#L8 |
| 50 | + md.use(md => { |
| 51 | + const fence = md.renderer.rules.fence!; |
| 52 | + md.renderer.rules.fence = (...args) => { |
| 53 | + const [tokens, idx] = args; |
| 54 | + const token = tokens[idx]; |
| 55 | + |
| 56 | + const title = token.info.match(/\[(.*)\]/)?.[1]; |
| 57 | + // Code blocks in a code group have titles |
| 58 | + return title == null |
| 59 | + ? fence(...args) |
| 60 | + : ( |
| 61 | + "<tr>" |
| 62 | + + `<td>${title}</td>` |
| 63 | + + `<td>${fence(...args)}</td>` |
| 64 | + + "</tr>" |
| 65 | + ); |
| 66 | + }; |
| 67 | + }); |
| 68 | + // Override https://github.com/vuejs/vitepress/blob/179ee6/src/node/markdown/plugins/containers.ts#L26 |
| 69 | + md.use(container, "code-group", { |
| 70 | + render(tokens: Token[], idx: number) { |
| 71 | + return tokens[idx].nesting === 1 ? "<table><tbody>" : "</tbody></table>\n"; |
| 72 | + }, |
| 73 | + }); |
| 74 | + // `createMarkdownRenderer` returns a cached global renderer, so the above modifications will be applied to the next rendering |
40 | 75 | const posts = await createContentLoader("blog/*.md", { |
41 | 76 | excerpt: true, |
42 | 77 | render: true, |
|
0 commit comments