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

1from functools import lru_cache 

2 

3JID_ESCAPE_SEQUENCES = { 

4 "\\20", 

5 "\\22", 

6 "\\26", 

7 "\\27", 

8 "\\2f", 

9 "\\3a", 

10 "\\3c", 

11 "\\3e", 

12 "\\40", 

13 "\\5c", 

14} 

15 

16 

17JID_UNESCAPE_TRANSFORMATIONS = { 

18 "\\20": " ", 

19 "\\22": '"', 

20 "\\26": "&", 

21 "\\27": "'", 

22 "\\2f": "/", 

23 "\\3a": ":", 

24 "\\3c": "<", 

25 "\\3e": ">", 

26 "\\40": "@", 

27 "\\5c": "\\", 

28} 

29 

30 

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)) 

44 

45 # Pop character off the escape sequence, and ignore it 

46 seq = seq[1:] 

47 else: 

48 unescaped.append(char) 

49 return "".join(unescaped) 

50 

51 

52ESCAPE_TABLE = "".maketrans({v: k for k, v in JID_UNESCAPE_TRANSFORMATIONS.items()})