aboutsummaryrefslogtreecommitdiffstats
path: root/docs/sphinx/nikola_titles_for_sphinx.py
blob: 06b76dca75aed46001ad3deaf89185952c3099e7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import sphinx.parsers
from docutils.statemachine import StringList
from typing import TYPE_CHECKING, Any, Dict, List, Type, Union

if TYPE_CHECKING:
    from sphinx.application import Sphinx

TITLE_MARKER = ".. title:"


class NikolaTitlesRSTParser(sphinx.parsers.RSTParser):
    def decorate(self, content: StringList) -> None:
        """Preprocess reST content before parsing."""
        super().decorate(content)
        for line in content[:20]:
            if line.startswith(TITLE_MARKER):
                title = line[len(TITLE_MARKER) :].strip()
                fence = "=" * len(title)
                content.insert(0, "", "<generated>", 0)
                content.insert(0, fence, "<generated>", 0)
                content.insert(0, title, "<generated>", 0)
                content.insert(0, fence, "<generated>", 0)


def setup(app: "Sphinx") -> Dict[str, Any]:
    app.add_source_parser(NikolaTitlesRSTParser, override=True)

    return {
        "version": "0.1.0",
        "parallel_read_safe": True,
        "parallel_write_safe": True,
    }