diff --git a/engine/engine.py b/engine/engine.py index 1978dff..9b5bfa8 100644 --- a/engine/engine.py +++ b/engine/engine.py @@ -2051,6 +2051,16 @@ def __cmd_expand_segment(self, keyval, state): self.__shrink_segment(1) return True + def __move_cursor_char_length(self, length): + if self.__input_mode == INPUT_MODE_HIRAGANA: + self.__preedit_ja_string.move_cursor_hiragana_length(length) + elif self.__input_mode == INPUT_MODE_KATAKANA: + self.__preedit_ja_string.move_cursor_katakana_length(length) + elif self.__input_mode == INPUT_MODE_HALF_WIDTH_KATAKANA: + self.__preedit_ja_string.move_cursor_half_with_katakana_length(length) + else: + self.__preedit_ja_string.move_cursor(length) + def __commit_nth_segment(self, commit_index, keyval, state): if commit_index >= len(self.__segments): @@ -2066,10 +2076,10 @@ def __commit_nth_segment(self, commit_index, keyval, state): for i in xrange(0, commit_index + 1): buf = self.__context.get_segment(i, NTH_UNCONVERTED_CANDIDATE) commit_length += len(unicode(buf, "utf-8")) - self.__preedit_ja_string.move_cursor(commit_length - cursor) + self.__move_cursor_char_length(commit_length - cursor) for i in xrange(0, commit_length): self.__preedit_ja_string.remove_before() - self.__preedit_ja_string.move_cursor(cursor - commit_length) + self.__move_cursor_char_length(cursor - commit_length) del self.__segments[0:commit_index + 1] @@ -2080,7 +2090,7 @@ def __commit_nth_segment(self, commit_index, keyval, state): self.__cursor_pos -= (commit_index + 1) else: self.__cursor_pos = 0 - (seg_index, text) = self.__segments[self.__cursor_pos] + text, cursor = self.__get_preedit() self.__convert_chars = text self.__context.set_string(text.encode ("utf-8")) diff --git a/engine/jastring.py b/engine/jastring.py index 78c281d..2ea6e3f 100644 --- a/engine/jastring.py +++ b/engine/jastring.py @@ -132,6 +132,77 @@ def move_cursor(self, delta): elif self.__cursor > len(self.__segments): self.__cursor = len(self.__segments) + # hiragana segments are not char lengths. + # e.g. 'ya' is 1 segment and 1 char and 'kya' is 1 segment and 2 chars. + def move_cursor_hiragana_length(self, length): + delta = length + if delta < 0: + if self.__cursor >= len(self.__segments): + delta = delta + (self.__cursor - len(self.__segments) + 1) + self.__cursor = len(self.__segments) - 1 + while delta < 0: + text = unicode(self.__segments[self.__cursor].to_hiragana()) + if len(text) > -delta: + break + delta = delta + len(text) + self.__cursor = self.__cursor - 1 + else: + if self.__cursor >= len(self.__segments): + self.__cursor = len(self.__segments) + return + while delta > 0: + text = unicode(self.__segments[self.__cursor].to_hiragana()) + if len(text) > delta: + break + delta = delta - len(text) + self.__cursor = self.__cursor + 1 + + def move_cursor_katakana_length(self, length): + delta = length + if delta < 0: + if self.__cursor >= len(self.__segments): + delta = delta + (self.__cursor - len(self.__segments) + 1) + self.__cursor = len(self.__segments) - 1 + while delta < 0: + text = unicode(self.__segments[self.__cursor].to_katanaka()) + if len(text) > -delta: + break + delta = delta + len(text) + self.__cursor = self.__cursor - 1 + else: + if self.__cursor >= len(self.__segments): + self.__cursor = len(self.__segments) + return + while delta > 0: + text = unicode(self.__segments[self.__cursor].to_katanaka()) + if len(text) > delta: + break + delta = delta - len(text) + self.__cursor = self.__cursor + 1 + + def move_cursor_half_with_katakana_length(self, length): + delta = length + if delta < 0: + if self.__cursor >= len(self.__segments): + delta = delta + (self.__cursor - len(self.__segments) + 1) + self.__cursor = len(self.__segments) - 1 + while delta < 0: + text = unicode(self.__segments[self.__cursor].to_half_width_katakana()) + if len(text) > -delta: + break + delta = delta + len(text) + self.__cursor = self.__cursor - 1 + else: + if self.__cursor >= len(self.__segments): + self.__cursor = len(self.__segments) + return + while delta > 0: + text = unicode(self.__segments[self.__cursor].to_half_width_katakana()) + if len(text) > delta: + break + delta = delta - len(text) + self.__cursor = self.__cursor + 1 + def _chk_text(self, s): period = self._prefs.get_value('common', 'period_style') symbol = self._prefs.get_value('common', 'symbol_style')