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 }