def apply_transformation(self, ti: TransformationInput) -> Transformation: tabstop = to_int(self.tabstop) style = self.style # Create separator for tabs. separator1 = to_str(self.char1) separator2 = to_str(self.char2) # Transform fragments. fragments = explode_text_fragments(ti.fragments) position_mappings = {} result_fragments: StyleAndTextTuples = [] pos = 0 for i, fragment_and_text in enumerate(fragments): position_mappings[i] = pos if fragment_and_text[1] == "\t": # Calculate how many characters we have to insert. count = tabstop - (pos % tabstop) if count == 0: count = tabstop # Insert tab. result_fragments.append((style, separator1)) result_fragments.append((style, separator2 * (count - 1))) pos += count else: result_fragments.append(fragment_and_text) pos += 1 position_mappings[len(fragments)] = pos # Add `pos+1` to mapping, because the cursor can be right after the # line as well. position_mappings[len(fragments) + 1] = pos + 1 def source_to_display(from_position: int) -> int: "Maps original cursor position to the new one." return position_mappings[from_position] def display_to_source(display_pos: int) -> int: "Maps display cursor position to the original one." position_mappings_reversed = { v: k for k, v in position_mappings.items() } while display_pos >= 0: try: return position_mappings_reversed[display_pos] except KeyError: display_pos -= 1 return 0 return Transformation( result_fragments, source_to_display=source_to_display, display_to_source=display_to_source, )
def apply_transformation(self, ti): tabstop = to_int(self.tabstop) style = self.style # Create separator for tabs. separator1 = to_str(self.char1) separator2 = to_str(self.char2) # Transform fragments. fragments = explode_text_fragments(ti.fragments) position_mappings = {} result_fragments = [] pos = 0 for i, fragment_and_text in enumerate(fragments): position_mappings[i] = pos if fragment_and_text[1] == '\t': # Calculate how many characters we have to insert. count = tabstop - (pos % tabstop) if count == 0: count = tabstop # Insert tab. result_fragments.append((style, separator1)) result_fragments.append((style, separator2 * (count - 1))) pos += count else: result_fragments.append(fragment_and_text) pos += 1 position_mappings[len(fragments)] = pos def source_to_display(from_position): " Maps original cursor position to the new one. " try: return position_mappings[from_position] except KeyError: return 0 def display_to_source(display_pos): " Maps display cursor position to the original one. " position_mappings_reversed = dict((v, k) for k, v in position_mappings.items()) while display_pos >= 0: try: return position_mappings_reversed[display_pos] except KeyError: display_pos -= 1 return 0 return Transformation( result_fragments, source_to_display=source_to_display, display_to_source=display_to_source)
def apply_transformation(self, ti: TransformationInput) -> Transformation: tabstop = to_int(self.tabstop) style = self.style # Create separator for tabs. separator1 = to_str(self.char1) separator2 = to_str(self.char2) # Transform fragments. fragments = explode_text_fragments(ti.fragments) position_mappings = {} result_fragments: StyleAndTextTuples = [] pos = 0 for i, fragment_and_text in enumerate(fragments): position_mappings[i] = pos if fragment_and_text[1] == '\t': # Calculate how many characters we have to insert. count = tabstop - (pos % tabstop) if count == 0: count = tabstop # Insert tab. result_fragments.append((style, separator1)) result_fragments.append((style, separator2 * (count - 1))) pos += count else: result_fragments.append(fragment_and_text) pos += 1 position_mappings[len(fragments)] = pos # Add `pos+1` to mapping, because the cursor can be right after the # line as well. position_mappings[len(fragments) + 1] = pos + 1 def source_to_display(from_position: int) -> int: " Maps original cursor position to the new one. " return position_mappings[from_position] def display_to_source(display_pos: int) -> int: " Maps display cursor position to the original one. " position_mappings_reversed = {v: k for k, v in position_mappings.items()} while display_pos >= 0: try: return position_mappings_reversed[display_pos] except KeyError: display_pos -= 1 return 0 return Transformation( result_fragments, source_to_display=source_to_display, display_to_source=display_to_source)