summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/markdown_it/rules_inline/escape.py
blob: 9f68b5dfad17fdcfe164ab4a8ef0761051b46efb (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
"""
Process escaped chars and hardbreaks
"""
from ..common.utils import isStrSpace
from .state_inline import StateInline


def escape(state: StateInline, silent: bool) -> bool:
    """Process escaped chars and hardbreaks."""
    pos = state.pos
    maximum = state.posMax

    if state.src[pos] != "\\":
        return False

    pos += 1

    # '\' at the end of the inline block
    if pos >= maximum:
        return False

    ch1 = state.src[pos]
    ch1_ord = ord(ch1)
    if ch1 == "\n":
        if not silent:
            state.push("hardbreak", "br", 0)
        pos += 1
        # skip leading whitespaces from next line
        while pos < maximum:
            ch = state.src[pos]
            if not isStrSpace(ch):
                break
            pos += 1

        state.pos = pos
        return True

    escapedStr = state.src[pos]

    if ch1_ord >= 0xD800 and ch1_ord <= 0xDBFF and pos + 1 < maximum:
        ch2 = state.src[pos + 1]
        ch2_ord = ord(ch2)
        if ch2_ord >= 0xDC00 and ch2_ord <= 0xDFFF:
            escapedStr += ch2
            pos += 1

    origStr = "\\" + escapedStr

    if not silent:
        token = state.push("text_special", "", 0)
        token.content = escapedStr if ch1 in _ESCAPED else origStr
        token.markup = origStr
        token.info = "escape"

    state.pos = pos + 1
    return True


_ESCAPED = {
    "!",
    '"',
    "#",
    "$",
    "%",
    "&",
    "'",
    "(",
    ")",
    "*",
    "+",
    ",",
    "-",
    ".",
    "/",
    ":",
    ";",
    "<",
    "=",
    ">",
    "?",
    "@",
    "[",
    "\\",
    "]",
    "^",
    "_",
    "`",
    "{",
    "|",
    "}",
    "~",
}