Skip to content
This repository was archived by the owner on Apr 4, 2024. It is now read-only.

Commit 45a7e26

Browse files
committed
Change the unescape function to the old logic
1 parent 236bd6b commit 45a7e26

File tree

1 file changed

+31
-34
lines changed

1 file changed

+31
-34
lines changed

python/selfie-lib/selfie_lib/PerCharacterEscaper.py

+31-34
Original file line numberDiff line numberDiff line change
@@ -41,43 +41,40 @@ def escape(self, input_string: str) -> str:
4141
return "".join(result)
4242

4343
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+
)
7552

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:
7855
return input_string
7956
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)
8178

8279
@classmethod
8380
def self_escape(cls, escape_policy):

0 commit comments

Comments
 (0)