Skip to content

Commit c0d0090

Browse files
committed
fix: Support HTML toc labels with Python-Markdown 3.6+
1 parent ccbbbf1 commit c0d0090

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

src/mkdocstrings/extension.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def _process_block(
228228
return rendered, handler, data
229229

230230

231-
class _PostProcessor(Treeprocessor):
231+
class _HeadingsPostProcessor(Treeprocessor):
232232
def run(self, root: Element) -> None:
233233
self._remove_duplicated_headings(root)
234234

@@ -249,6 +249,17 @@ def _remove_duplicated_headings(self, parent: Element) -> None:
249249
parent.text = (parent.text or "") + carry_text
250250

251251

252+
class _TocLabelsTreeProcessor(Treeprocessor):
253+
def run(self, root: Element) -> None: # noqa: ARG002
254+
self._override_toc_labels(self.md.toc_tokens) # type: ignore[attr-defined]
255+
256+
def _override_toc_labels(self, tokens: list[dict[str, Any]]) -> None:
257+
for token in tokens:
258+
if (label := token.get("data-toc-label")) and token["name"] != label:
259+
token["name"] = label
260+
self._override_toc_labels(token["children"])
261+
262+
252263
class MkdocstringsExtension(Extension):
253264
"""Our Markdown extension.
254265
@@ -284,7 +295,12 @@ def extendMarkdown(self, md: Markdown) -> None: # noqa: N802 (casing: parent me
284295
priority=75, # Right before markdown.blockprocessors.HashHeaderProcessor
285296
)
286297
md.treeprocessors.register(
287-
_PostProcessor(md),
288-
"mkdocstrings_post",
298+
_HeadingsPostProcessor(md),
299+
"mkdocstrings_post_headings",
289300
priority=4, # Right after 'toc'.
290301
)
302+
# md.treeprocessors.register(
303+
# _TocLabelsTreeProcessor(md),
304+
# "mkdocstrings_post_toc_labels",
305+
# priority=4, # Right after 'toc'.
306+
# )

tests/test_extension.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,26 +105,46 @@ def test_no_double_toc(ext_markdown: Markdown, expect_permalink: str) -> None:
105105
{
106106
"level": 1,
107107
"id": "aa",
108+
"html": "aa",
108109
"name": "aa",
110+
"data-toc-label": "",
109111
"children": [
110112
{
111113
"level": 2,
112114
"id": "tests.fixtures.headings--foo",
115+
"html": "Foo",
113116
"name": "Foo",
117+
"data-toc-label": "",
114118
"children": [
115119
{
116120
"level": 4,
117121
"id": "tests.fixtures.headings--bar",
122+
"html": "Bar",
118123
"name": "Bar",
124+
"data-toc-label": "",
119125
"children": [
120-
{"level": 6, "id": "tests.fixtures.headings--baz", "name": "Baz", "children": []},
126+
{
127+
"level": 6,
128+
"id": "tests.fixtures.headings--baz",
129+
"html": "Baz",
130+
"name": "Baz",
131+
"data-toc-label": "",
132+
"children": [],
133+
},
121134
],
122135
},
123136
],
124137
},
125138
],
126139
},
127-
{"level": 1, "id": "bb", "name": "bb", "children": []},
140+
{
141+
"level": 1,
142+
"id": "bb",
143+
"html": "bb",
144+
"name": "bb",
145+
"data-toc-label": "",
146+
"children": [],
147+
},
128148
]
129149

130150

0 commit comments

Comments
 (0)