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