Coverage for slidge/util/jid_escaping.py: 68%
19 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-04 08:17 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-04 08:17 +0000
1from functools import lru_cache
3JID_ESCAPE_SEQUENCES = {
4 "\\20",
5 "\\22",
6 "\\26",
7 "\\27",
8 "\\2f",
9 "\\3a",
10 "\\3c",
11 "\\3e",
12 "\\40",
13 "\\5c",
14}
17JID_UNESCAPE_TRANSFORMATIONS = {
18 "\\20": " ",
19 "\\22": '"',
20 "\\26": "&",
21 "\\27": "'",
22 "\\2f": "/",
23 "\\3a": ":",
24 "\\3c": "<",
25 "\\3e": ">",
26 "\\40": "@",
27 "\\5c": "\\",
28}
31@lru_cache(1000)
32def unescape_node(node: str) -> str:
33 """Unescape a local portion of a JID."""
34 unescaped = []
35 seq = ""
36 for i, char in enumerate(node):
37 if char == "\\":
38 seq = node[i : i + 3]
39 if seq not in JID_ESCAPE_SEQUENCES:
40 seq = ""
41 if seq:
42 if len(seq) == 3:
43 unescaped.append(JID_UNESCAPE_TRANSFORMATIONS.get(seq, char))
45 # Pop character off the escape sequence, and ignore it
46 seq = seq[1:]
47 else:
48 unescaped.append(char)
49 return "".join(unescaped)
52ESCAPE_TABLE = "".maketrans({v: k for k, v in JID_UNESCAPE_TRANSFORMATIONS.items()})