From fcd0fdd7a4c116efafa7576a293c767c4fe11361 Mon Sep 17 00:00:00 2001 From: eezd Date: Wed, 21 Oct 2026 11:32:48 +0800 Subject: [PATCH] Recognize sibling ordered list items when rewriting asset links --- internal/vault/links.go | 11 ++++++++++- internal/vault/links_test.go | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/internal/vault/links.go b/internal/vault/links.go index 4329eda..bd8caf6 100644 --- a/internal/vault/links.go +++ b/internal/vault/links.go @@ -44,6 +44,14 @@ func RewriteAssetLinks(content []byte, oldBase, newBase string) []byte { matched++ } if matched < len(containers) { + rest := bytes.TrimLeft(body, " ") + if marker := listMarker.Find(rest); len(body)-len(rest) <= 3 && marker != nil { + mark := bytes.TrimRight(marker, " ") + // 同级列表的新条目结束上一项段落,不受“只能以 1 打断段落”的限制。 + if mark[len(mark)-1] == containers[matched].marker { + paragraph = false + } + } containers = containers[:matched] fence = nil // 容器结束时,其内部未闭合的代码块也结束。 // 段落允许省略引用或列表前缀的续行,不能把其缩进误认成代码。 @@ -81,7 +89,7 @@ func RewriteAssetLinks(content []byte, oldBase, newBase string) []byte { padding = 1 } width := indent + len(mark) + padding - containers = append(containers, linkContainer{indent: width}) + containers = append(containers, linkContainer{indent: width, marker: mark[len(mark)-1]}) body = body[min(width, len(body)):] } else { break @@ -112,6 +120,7 @@ func RewriteAssetLinks(content []byte, oldBase, newBase string) []byte { type linkContainer struct { quote bool indent int + marker byte } var listMarker = regexp.MustCompile(`^(?:[-+*]|[0-9]{1,9}[.)])(?: +|$)`) diff --git a/internal/vault/links_test.go b/internal/vault/links_test.go index aa686af..90a7d10 100644 --- a/internal/vault/links_test.go +++ b/internal/vault/links_test.go @@ -15,6 +15,10 @@ func TestRewriteAssetLinksPreservesCodeBlocks(t *testing.T) { {"引用围栏", "> ```markdown\n> ![](a.assets/code.png)\n> ```\n"}, {"引用缩进", "> ![](a.assets/code.png)\n"}, {"列表围栏", "- ```markdown\n ![](a.assets/code.png)\n ```\n"}, + {"有序列表第二项围栏", "1. 项目\n2. ```markdown\n ![](a.assets/code.png)\n ```\n"}, + {"右括号列表第二项围栏", "1) 项目\n2) ```markdown\n ![](a.assets/code.png)\n ```\n"}, + {"引用内有序列表第二项围栏", "> 1. 项目\n> 2. ```markdown\n> ![](a.assets/code.png)\n> ```\n"}, + {"嵌套有序列表第二项围栏", "- 1. 项目\n 2. ```markdown\n ![](a.assets/code.png)\n ```\n"}, {"列表缩进", "- 项目\n\n ![](a.assets/code.png)\n"}, {"有序列表缩进", "10. 项目\n\n ![](a.assets/code.png)\n"}, {"引用内嵌列表", "> - ```markdown\n> ![](a.assets/code.png)\n> ```\n"}, @@ -39,6 +43,7 @@ func TestRewriteAssetLinksInContainersAndParagraphs(t *testing.T) { "- 项目\n\n ![](a.assets/real.png)\n", "- 项目\n - 子项\n ![](a.assets/real.png)\n", "段落\n ![](a.assets/real.png)\n", + "段落\n2. 项目\n ![](a.assets/real.png)\n", "> 段落\n ![](a.assets/real.png)\n", "- 段落\n![](a.assets/real.png)\n ![](a.assets/real.png)\n", "10. 项目\n\n ![](a.assets/real.png)\n",