diff --git a/src/plugins/extractHeadings.ts b/src/plugins/extractHeadings.ts index 6da1e5df8d7..526653f7a8f 100644 --- a/src/plugins/extractHeadings.ts +++ b/src/plugins/extractHeadings.ts @@ -31,6 +31,10 @@ export default function extractHeadings(doc: Node) { } doc.descendants((node, offset) => { + // Don't descent into details/blockquote nodes - their headings are hidden + if (node.type.name === 'details' || node.type.name === 'blockquote') { + return false + } if (node.type.name !== 'heading') { return } diff --git a/src/tests/plugins/extractHeadings.spec.js b/src/tests/plugins/extractHeadings.spec.js index 5adaf5cbb74..75e67ce6f84 100644 --- a/src/tests/plugins/extractHeadings.spec.js +++ b/src/tests/plugins/extractHeadings.spec.js @@ -3,6 +3,8 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +import { Blockquote } from '@tiptap/extension-blockquote' +import Details from '../../nodes/Details.js' import Heading from '../../nodes/Heading.js' import extractHeadings from '../../plugins/extractHeadings.ts' import createCustomEditor from '../testHelpers/createCustomEditor.ts' @@ -35,6 +37,33 @@ describe('extractHeadings', () => { expect(headings).toEqual([]) }) + it('ignores headings inside a details block', () => { + const content = ` +
++ ` + const doc = prepareDoc(content, [Blockquote]) + const headings = extractHeadings(doc) + expect(headings).toHaveLength(1) + expect(headings[0].text).toBe('Visible heading') + }) + it('creates unique ids with a counter', () => { const content = `Quoted heading
+