diff --git a/javascripts/discourse/services/toc-processor.js b/javascripts/discourse/services/toc-processor.js index 5c6b464..782d043 100644 --- a/javascripts/discourse/services/toc-processor.js +++ b/javascripts/discourse/services/toc-processor.js @@ -77,10 +77,21 @@ export default class TocProcessor extends Service { if (this.containsHeadings(content)) { const parsedPost = new DOMParser().parseFromString(content, "text/html"); - // direct descendants to avoid picking up headings in quotes - const headings = parsedPost.querySelectorAll( - "body > h1,body > h2,body > h3,body > h4,body > h5" - ); + // Find headings that are either: + // 1. Direct descendants of body (to avoid picking up headings in quotes) + // 2. Inside wrap blocks (which are used for email filtering with [wrap=no-email]) + const selector = + "body > :is(h1, h2, h3, h4, h5), body > :is(.wrap, .d-wrap) :is(h1, h2, h3, h4, h5)"; + + const allHeadings = parsedPost.querySelectorAll(selector); + + // Convert NodeList to Array and sort by document order + const headings = Array.from(allHeadings).sort((a, b) => { + // eslint-disable-next-line no-bitwise + return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING + ? -1 + : 1; + }); if (headings.length < settings.TOC_min_heading) { this.setOverlayVisible(false);