summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfujiwarat <takao.fujiwara1@gmail.com>2010-10-15 16:50:21 +0900
committerfujiwarat <takao.fujiwara1@gmail.com>2010-10-15 16:50:21 +0900
commit609de132807b7c36b9db3ad16905b908f877f67e (patch)
tree764b4efc0c5c33f99a53abeadbd9333b6dc4917b
parentddaf0a50acde55db87ff007c92ced28be1550cfd (diff)
downloadibus-anthy-609de132807b7c36b9db3ad16905b908f877f67e.tar.gz
Fixed commit_nth_segment
http://www.mail-archive.com/anthy-dev@lists.sourceforge.jp/msg00264.html
-rw-r--r--engine/engine.py16
-rw-r--r--engine/jastring.py71
2 files changed, 84 insertions, 3 deletions
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 @@ class Engine(ibus.EngineBase):
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 @@ class Engine(ibus.EngineBase):
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 @@ class Engine(ibus.EngineBase):
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 @@ class JaString:
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')