diff --git a/src/renderer/src/components/editor/rich-markdown-toc-heading-target.test.ts b/src/renderer/src/components/editor/rich-markdown-toc-heading-target.test.ts
index d1c4355f714..3683dd528fc 100644
--- a/src/renderer/src/components/editor/rich-markdown-toc-heading-target.test.ts
+++ b/src/renderer/src/components/editor/rich-markdown-toc-heading-target.test.ts
@@ -14,6 +14,14 @@ function makeTocItem(
}
describe('findRichMarkdownTocHeadingTarget', () => {
+ it('returns undefined when the requested duplicate occurrence is missing', () => {
+ const container = document.createElement('div')
+ container.innerHTML = '
Repeat
Other
'
+ const items = [makeTocItem('repeat', 2, 'Repeat'), makeTocItem('repeat-1', 2, 'Repeat')]
+ expect(findRichMarkdownTocHeadingTarget(container, items, 'repeat-1')).toBeUndefined()
+ expect(findRichMarkdownTocHeadingTarget(container, items, 'missing')).toBeUndefined()
+ })
+
it('finds deep headings that the table of contents exposes', () => {
const container = document.createElement('div')
container.innerHTML = `
diff --git a/src/renderer/src/components/editor/rich-markdown-toc-heading-target.ts b/src/renderer/src/components/editor/rich-markdown-toc-heading-target.ts
index 20a77a0b7c6..fa8ac517b92 100644
--- a/src/renderer/src/components/editor/rich-markdown-toc-heading-target.ts
+++ b/src/renderer/src/components/editor/rich-markdown-toc-heading-target.ts
@@ -18,9 +18,16 @@ export function findRichMarkdownTocHeadingTarget(
const sameTitleIndex = items
.filter((item) => item.title === target.title)
.findIndex((item) => item.id === target.id)
- const matchingHeadings = Array.from(
- container.querySelectorAll(RICH_MARKDOWN_TOC_HEADING_SELECTOR)
- ).filter((candidate) => candidate.textContent?.trim() === target.title)
-
- return matchingHeadings.at(Math.max(0, sameTitleIndex))
+ let remaining = Math.max(0, sameTitleIndex)
+ for (const candidate of container.querySelectorAll(
+ RICH_MARKDOWN_TOC_HEADING_SELECTOR
+ )) {
+ if (candidate.textContent?.trim() === target.title) {
+ if (remaining === 0) {
+ return candidate
+ }
+ remaining -= 1
+ }
+ }
+ return undefined
}