From 22bdfc259f3fc54980c84f041300d253ac825ce3 Mon Sep 17 00:00:00 2001 From: seaHi Date: Wed, 16 Sep 2026 20:44:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=20Hugo=20=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E6=A1=86=E7=9F=AD=E4=BB=A3=E7=A0=81=E7=9A=84=E5=86=85?= =?UTF-8?q?=E8=81=94=E5=86=99=E6=B3=95=E5=8F=8A=E5=A4=9A=E8=A1=8C=E6=AD=A3?= =?UTF-8?q?=E6=96=87=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/markdown/rendering.test.ts | 18 ++++++++++++++++++ src/lib/markdown/rendering.ts | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/lib/markdown/rendering.test.ts b/src/lib/markdown/rendering.test.ts index 6c8e703..028532f 100644 --- a/src/lib/markdown/rendering.test.ts +++ b/src/lib/markdown/rendering.test.ts @@ -67,6 +67,24 @@ describe('replaceHugoAdmonitions', () => { ); expect(singleQuoted).toContain(''); }); + + it('handles shortcodes written inline with the body', () => { + const inline = replaceHugoAdmonitions( + '{{< admonition abstract >}}在使用 Docker 时,可以配置镜像加速器。{{< /admonition >}}', + render + ); + expect(inline).toContain( + '' + ); + }); + + it('handles multi-line bodies that start on the same line as the open tag', () => { + const multiline = replaceHugoAdmonitions( + '{{< admonition note >}}第一行\n\n第二段\n{{< /admonition >}}', + render + ); + expect(multiline).toContain(''); + }); }); describe('heading IDs', () => { diff --git a/src/lib/markdown/rendering.ts b/src/lib/markdown/rendering.ts index ddd6d0a..290ab3a 100644 --- a/src/lib/markdown/rendering.ts +++ b/src/lib/markdown/rendering.ts @@ -57,8 +57,9 @@ export function replaceGithubAdmonitions(markdown: string, render: AdmonitionRen * 标题可选,且可以是 `"标题"`、`'标题'` 或裸文本。 */ export function replaceHugoAdmonitions(html: string, render: AdmonitionRenderer): string { + // 开/闭标签与正文之间允许任意空白(含同一行紧挨着写的情况) const pattern = - /\{\{<\s*admonition\s+([a-zA-Z][\w-]*)([^>]*?)>\}\}\r?\n([\s\S]*?)\{\{<\s*\/admonition\s*>\}\}/gi; + /\{\{<\s*admonition\s+([a-zA-Z][\w-]*)([^>]*?)>\}\}\s*([\s\S]*?)\s*\{\{<\s*\/admonition\s*>\}\}/gi; return html.replace(pattern, (_match, type: string, rawTitle: string, content: string) => render(type, rawTitle.trim(), content)