@@ -41,43 +41,40 @@ def escape(self, input_string: str) -> str:
41
41
return "" .join (result )
42
42
43
43
def unescape (self , input_string : str ) -> str :
44
- if not input_string :
45
- return input_string
46
-
47
- result = []
48
- i = 0
49
-
50
- while i < len (input_string ):
51
- if ord (input_string [i ]) == self .__escape_code_point :
52
- if i + 1 < len (input_string ):
53
- next_char = input_string [i + 1 ]
54
- next_codepoint = ord (next_char )
55
-
56
- if next_codepoint == self .__escape_code_point :
57
- result .append (chr (next_codepoint ))
58
- i += 2
59
- else :
60
- try :
61
- idx = self .__escaped_by_code_points .index (next_codepoint )
62
- result .append (chr (self .__escaped_code_points [idx ]))
63
- i += 2
64
- continue
65
- except ValueError :
66
- result .append (next_char )
67
- i += 2
68
- else :
69
- raise ValueError (
70
- f"Escape character '{ chr (self .__escape_code_point )} ' can't be the last character in a string."
71
- )
72
- else :
73
- result .append (input_string [i ])
74
- i += 1
44
+ if input_string .endswith (
45
+ chr (self .__escape_code_point )
46
+ ) and not input_string .endswith (chr (self .__escape_code_point ) * 2 ):
47
+ raise ValueError (
48
+ "Escape character '{}' can't be the last character in a string." .format (
49
+ chr (self .__escape_code_point )
50
+ )
51
+ )
75
52
76
- processed_string = "" . join ( result )
77
- if processed_string == input_string :
53
+ no_escapes = self . __first_offset_needing_escape ( input_string )
54
+ if no_escapes == - 1 :
78
55
return input_string
79
56
else :
80
- return processed_string
57
+ result = [input_string [:no_escapes ]]
58
+ skip_next = False
59
+ for i in range (no_escapes , len (input_string )):
60
+ if skip_next :
61
+ skip_next = False
62
+ continue
63
+ codepoint = ord (input_string [i ])
64
+ if codepoint == self .__escape_code_point and (i + 1 ) < len (
65
+ input_string
66
+ ):
67
+ next_codepoint = ord (input_string [i + 1 ])
68
+ if next_codepoint in self .__escaped_by_code_points :
69
+ idx = self .__escaped_by_code_points .index (next_codepoint )
70
+ result .append (chr (self .__escaped_code_points [idx ]))
71
+ skip_next = True
72
+ else :
73
+ result .append (input_string [i + 1 ])
74
+ skip_next = True
75
+ else :
76
+ result .append (chr (codepoint ))
77
+ return "" .join (result )
81
78
82
79
@classmethod
83
80
def self_escape (cls , escape_policy ):
0 commit comments