使用typedoc-plugin-markdown时,如何修改扁平化输出的相对链接格式?
修改TypeDoc+typedoc-plugin-markdown扁平化输出的链接格式为./xxx.md
方案1:自定义Markdown主题(推荐,原生优雅)
通过继承typedoc-plugin-markdown的MarkdownTheme类,重写链接生成方法,为本地.md链接统一添加./前缀:
- 创建自定义主题类:
import { MarkdownTheme } from 'typedoc-plugin-markdown'; import type { PageEvent } from 'typedoc'; export class CustomMarkdownTheme extends MarkdownTheme { override getRelativeUrl(from: PageEvent, to: PageEvent | string): string { const originalUrl = super.getRelativeUrl(from, to); // 仅处理本地.md文件链接,跳过外部链接、锚点和已带./的链接 if ( originalUrl && !originalUrl.startsWith('http') && !originalUrl.startsWith('#') && !originalUrl.startsWith('./') && originalUrl.endsWith('.md') ) { return `./${originalUrl}`; } return originalUrl; } }
- 在编程式调用TypeDoc时注册并使用该主题:
import { Application } from 'typedoc'; import { CustomMarkdownTheme } from './path/to/custom-theme'; const app = await Application.bootstrapWithPlugins( { entryPoints: ['./src/index.ts'], out: './docs', plugin: ['typedoc-plugin-markdown'], flattenOutputFiles: true, theme: 'custom-local-link', // 自定义主题标识名 }, [] ); // 注册自定义主题到TypeDoc渲染器 app.renderer.defineTheme('custom-local-link', CustomMarkdownTheme); await app.generateDocs();
方案2:使用渲染后钩子修改内容
利用TypeDoc的page.rendered钩子,在页面渲染完成后替换链接格式:
import { Application } from 'typedoc'; const app = await Application.bootstrapWithPlugins( { entryPoints: ['./src/index.ts'], out: './docs', plugin: ['typedoc-plugin-markdown'], flattenOutputFiles: true, }, [] ); // 注册页面渲染完成钩子,替换链接 app.renderer.hooks.on('page.rendered', (page) => { page.contents = page.contents.replace( // 匹配未带./、http、#的.md链接 /\[([^\]]+)\]\((?!http|#|\.\/)([^)]+\.md)\)/g, '[$1](./$2)' ); }); await app.generateDocs();
说明
- 方案1从链接生成的根源修改,覆盖所有TypeDoc生成的内部链接,兼容性和可靠性更强,是最推荐的原生方案。
- 方案2属于文本替换,适合快速需求,但需注意正则表达式的匹配范围,避免误改其他链接。
内容的提问来源于stack exchange,提问作者GaddBox
相关产品推荐
相关产品推荐

