| 20 | |
| 21 | |
| 22 | class UTF16Handler: |
| 23 | def __init__(self, default_bang_char: str = "R"): |
| 24 | logger.trace( |
| 25 | f"Initializing UTF16Handler with default_bang_char: {default_bang_char}" |
| 26 | ) |
| 27 | self._default_bang_char = default_bang_char |
| 28 | |
| 29 | def pre_utf_16_bang( |
| 30 | self, string: str, string_pos_matrix: list |
| 31 | ) -> tuple[str, list, list[tuple[int, int, int]]]: |
| 32 | logger.trace("Starting pre_utf_16_bang method") |
| 33 | utf_16_bang_list: list[tuple[int, int, int]] = [] |
| 34 | string_len_utf_16 = len(string.encode("utf-16-le")) // 2 |
| 35 | logger.debug(f"UTF-16 length of string: {string_len_utf_16}") |
| 36 | if string_len_utf_16 == len(string): |
| 37 | logger.trace("String doesn't contain multibyte characters") |
| 38 | return string, string_pos_matrix, utf_16_bang_list |
| 39 | |
| 40 | i = 0 |
| 41 | while len(string) - 1 > i: |
| 42 | logger.debug(f"Processing character at index {i}") |
| 43 | new_i = string_pos_matrix[i] |
| 44 | char = string[new_i] |
| 45 | char_len = len(char.encode("utf-16-le")) // 2 |
| 46 | if char_len == 2: |
| 47 | logger.debug(f"Multibyte character found at index {i}") |
| 48 | char_len_dif = char_len - 1 |
| 49 | char_present = self._default_bang_char * char_len_dif |
| 50 | string, string_pos_matrix = self._paste_char( |
| 51 | string, string_pos_matrix, new_i + 1, char_present |
| 52 | ) |
| 53 | logger.trace( |
| 54 | f"Mutation: Inserted '{char_present}' at index {new_i + 1}" |
| 55 | ) |
| 56 | i += 1 |
| 57 | utf_16_bang_list.append((i, char_len_dif, i)) |
| 58 | i += 1 |
| 59 | |
| 60 | logger.trace("Finished pre_utf_16_bang method") |
| 61 | return string, string_pos_matrix, utf_16_bang_list |
| 62 | |
| 63 | def post_utf_16_bang( |
| 64 | self, |
| 65 | string: StringAssignmentMixin, |
| 66 | string_pos_matrix: list, |
| 67 | utf_16_bang_list: list, |
| 68 | ): |
| 69 | logger.trace("Starting post_utf_16_bang method") |
| 70 | string = StringAssignmentMixin(str(string)) |
| 71 | post_transbang = 0 |
| 72 | for bang_pos, char_len, old_pos in utf_16_bang_list: |
| 73 | logger.debug(f"Processing bang at position {bang_pos}") |
| 74 | string, string_pos_matrix = self._delete_char( |
| 75 | string, |
| 76 | string_pos_matrix, |
| 77 | bang_pos - post_transbang, |
| 78 | char_len, |
| 79 | old_pos - post_transbang, |
no outgoing calls