fix(visual_report): ignore fenced headings in TOC extraction

Strip fenced code blocks before extracting visual-report headings so heading-looking lines inside code fences do not desync TOC anchors. Add regression coverage for backtick and tilde fences while preserving normal heading extraction.
This commit is contained in:
Afonso Coutinho
2026-06-27 17:44:32 +01:00
committed by GitHub
parent d5286f926e
commit ad745801c6
2 changed files with 35 additions and 0 deletions
@@ -0,0 +1,28 @@
"""TOC heading extraction must ignore headings inside code fences.
A "## ..." comment inside a ``` or ~~~ block is not rendered as an <h2>, but
_extract_headings counted it, so _apply_heading_ids (which zips TOC headings
against rendered <h2>/<h3> by position) gave later sections the wrong anchor
id and the trailing TOC link went dead.
"""
import pytest
pytest.importorskip("bs4")
from src.visual_report import _extract_headings
def test_backtick_fenced_heading_is_ignored():
md = "## Intro\n\n```bash\n## not a heading\n```\n\n## Conclusion"
assert [h["text"] for h in _extract_headings(md)] == ["Intro", "Conclusion"]
def test_tilde_fenced_heading_is_ignored():
md = "## A\n\n~~~\n## fake\n~~~\n\n## B"
assert [h["text"] for h in _extract_headings(md)] == ["A", "B"]
def test_normal_headings_unaffected():
md = "## One\n\nsome text\n\n### Two"
out = [(h["level"], h["text"]) for h in _extract_headings(md)]
assert out == [(2, "One"), (3, "Two")]