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