summaryrefslogtreecommitdiffstats
path: root/markdown_it/utils.py
blob: 2ba2995a4b882e9df38616b26718fafcedc8d1f5 (plain)
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from __future__ import annotations

from collections.abc import Callable
from pathlib import Path


class OptionsDict(dict):
    """A dictionary, with attribute access to core markdownit configuration options."""

    @property
    def maxNesting(self) -> int:
        """Internal protection, recursion limit."""
        return self["maxNesting"]

    @maxNesting.setter
    def maxNesting(self, value: int):
        self["maxNesting"] = value

    @property
    def html(self) -> bool:
        """Enable HTML tags in source."""
        return self["html"]

    @html.setter
    def html(self, value: bool):
        self["html"] = value

    @property
    def linkify(self) -> bool:
        """Enable autoconversion of URL-like texts to links."""
        return self["linkify"]

    @linkify.setter
    def linkify(self, value: bool):
        self["linkify"] = value

    @property
    def typographer(self) -> bool:
        """Enable smartquotes and replacements."""
        return self["typographer"]

    @typographer.setter
    def typographer(self, value: bool):
        self["typographer"] = value

    @property
    def quotes(self) -> str:
        """Quote characters."""
        return self["quotes"]

    @quotes.setter
    def quotes(self, value: str):
        self["quotes"] = value

    @property
    def xhtmlOut(self) -> bool:
        """Use '/' to close single tags (<br />)."""
        return self["xhtmlOut"]

    @xhtmlOut.setter
    def xhtmlOut(self, value: bool):
        self["xhtmlOut"] = value

    @property
    def breaks(self) -> bool:
        """Convert newlines in paragraphs into <br>."""
        return self["breaks"]

    @breaks.setter
    def breaks(self, value: bool):
        self["breaks"] = value

    @property
    def langPrefix(self) -> str:
        """CSS language prefix for fenced blocks."""
        return self["langPrefix"]

    @langPrefix.setter
    def langPrefix(self, value: str):
        self["langPrefix"] = value

    @property
    def highlight(self) -> Callable[[str, str, str], str] | None:
        """Highlighter function: (content, langName, langAttrs) -> escaped HTML."""
        return self["highlight"]

    @highlight.setter
    def highlight(self, value: Callable[[str, str, str], str] | None):
        self["highlight"] = value


def read_fixture_file(path: str | Path) -> list[list]:
    text = Path(path).read_text(encoding="utf-8")
    tests = []
    section = 0
    last_pos = 0
    lines = text.splitlines(keepends=True)
    for i in range(len(lines)):
        if lines[i].rstrip() == ".":
            if section == 0:
                tests.append([i, lines[i - 1].strip()])
                section = 1
            elif section == 1:
                tests[-1].append("".join(lines[last_pos + 1 : i]))
                section = 2
            elif section == 2:
                tests[-1].append("".join(lines[last_pos + 1 : i]))
                section = 0

            last_pos = i
    return tests


def _removesuffix(string: str, suffix: str) -> str:
    """Remove a suffix from a string.

    Replace this with str.removesuffix() from stdlib when minimum Python
    version is 3.9.
    """
    if suffix and string.endswith(suffix):
        return string[: -len(suffix)]
    return string