summaryrefslogtreecommitdiff
path: root/engine/python3/kana.py
diff options
context:
space:
mode:
Diffstat (limited to 'engine/python3/kana.py')
-rw-r--r--engine/python3/kana.py170
1 files changed, 170 insertions, 0 deletions
diff --git a/engine/python3/kana.py b/engine/python3/kana.py
new file mode 100644
index 0000000..10e1b96
--- /dev/null
+++ b/engine/python3/kana.py
@@ -0,0 +1,170 @@
+# vim:set et sts=4 sw=4:
+# -*- coding: utf-8 -*-
+#
+# ibus-anthy - The Anthy engine for IBus
+#
+# Copyright (c) 2007-2008 Peng Huang <shawn.p.huang@gmail.com>
+# Copyright (c) 2010-2014 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2007-2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import sys
+
+from tables import *
+import segment
+
+_UNFINISHED_HIRAGANA = set('かきくけこさしすせそたちつてとはひふへほ')
+
+class KanaSegment(segment.Segment):
+ _prefs = None
+ _kana_typing_rule_section = None
+ _kana_voiced_consonant_rule = None
+
+ def __init__(self, enchars='', jachars=''):
+ if not jachars:
+ jachars = self.__get_kana_typing_rule(enchars, '')
+ super(KanaSegment, self).__init__(enchars, jachars)
+
+ @classmethod
+ def INIT_KANA_TYPING_RULE(cls, prefs):
+ cls._prefs = prefs
+ if prefs == None:
+ cls._kana_typing_rule_section = None
+ return
+ if cls._kana_typing_rule_section == None:
+ cls._init_kana_typing_method()
+ if cls._kana_voiced_consonant_rule == None and \
+ cls._kana_typing_rule_section != None:
+ cls._init_kana_voiced_consonant_rule()
+
+ @classmethod
+ def _init_kana_typing_method(cls, method=None):
+ prefs = cls._prefs
+ if method == None:
+ method = prefs.get_value('kana_typing_rule', 'method')
+ if method == None:
+ method = 'jp'
+ cls._kana_typing_rule_section = 'kana_typing_rule/' + method
+ if cls._kana_typing_rule_section not in prefs.sections():
+ cls._kana_typing_rule_section = None
+
+ @classmethod
+ def _init_kana_voiced_consonant_rule(cls):
+ prefs = cls._prefs
+ # Create kana_voiced_consonant_rule dynamically.
+ # E.g. 't' + '@' on jp kbd becomes Hiragana GA
+ # 't' + '[' on us kbd becomes Hiragana GA
+ # If the customized table provides U+309b with other chars,
+ # it needs to be detected dynamically.
+ cls._kana_voiced_consonant_rule = {}
+ section = cls._kana_typing_rule_section
+ for gkey in prefs.keys(section):
+ value = prefs.get_value(section, gkey)
+ key = prefs.typing_from_config_key(gkey)
+ if key == '':
+ continue
+ if value == chr(0x309b):
+ for no_voiced, voiced in \
+ list(kana_voiced_consonant_no_rule.items()):
+ rule = no_voiced + key
+ cls._kana_voiced_consonant_rule[rule] = voiced
+ if value == chr(0x309c):
+ for no_voiced, voiced in \
+ list(kana_semi_voiced_consonant_no_rule.items()):
+ rule = no_voiced + key
+ cls._kana_voiced_consonant_rule[rule] = voiced
+
+ @classmethod
+ def RESET(cls, prefs, section, name, value):
+ cls._prefs = prefs
+ if section == 'kana_typing_rule' and name == 'method' and \
+ value != None:
+ cls._kana_typing_rule_section = None
+ cls._kana_voiced_consonant_rule = None
+ cls._init_kana_typing_method(value)
+ elif section.startswith('kana_typing_rule/'):
+ # Probably it's better to restart ibus by manual
+ # instead of saving the emitted values from config.
+ cls._kana_voiced_consonant_rule = None
+
+ def __get_kana_typing_rule(self, enchars, retval=None):
+ prefs = self._prefs
+ value = None
+ section = self._kana_typing_rule_section
+ if section != None:
+ # Need to send Unicode to typing_to_config_key instead of UTF-8
+ # not to separate U+A5
+ gkey = prefs.typing_to_config_key(enchars)
+ if gkey == '':
+ return None
+ enchars = gkey
+ if enchars in prefs.keys(section):
+ value = prefs.str(prefs.str(prefs.get_value(section, enchars)))
+ else:
+ prefs.set_no_key_warning(True)
+ value = prefs.get_value_direct(section, enchars)
+ prefs.set_no_key_warning(False)
+ if value != None:
+ value = prefs.str(prefs.str(value))
+ if value == '':
+ value = None
+ if value == None:
+ value = retval
+ else:
+ value = kana_typing_rule_static.get(enchars, retval)
+ return value
+
+ def is_finished(self):
+ return not (self._jachars in _UNFINISHED_HIRAGANA)
+
+ def append(self, enchar):
+ if enchar == '\0' or enchar == '':
+ return []
+ if self._jachars:
+ text = self._jachars + enchar
+ if self._kana_voiced_consonant_rule != None:
+ jachars = self._kana_voiced_consonant_rule.get(text, None)
+ if jachars:
+ self._enchars = self._enchars + enchar
+ self._jachars = jachars
+ return []
+ return [KanaSegment(enchar)]
+ self._enchars = self._enchars + enchar
+ self._jachars = self.__get_kana_typing_rule(self._enchars, '')
+ return []
+
+ def prepend(self, enchar):
+ if enchar == '\0' or enchar == '':
+ return []
+ if self._enchars == '':
+ self._enchars = enchar
+ self._jachars = self.__get_kana_typing_rule(self._enchars, '')
+ return []
+ return [KanaSegment(enchar)]
+
+ def pop(self, index=-1):
+ if index == -1:
+ index = len(self._enchars) - 1
+ if index < 0 or index >= len(self._enchars):
+ raise IndexError('Out of bound')
+ if self.is_finished():
+ self._enchars = ''
+ self._jachars = ''
+ else:
+ enchars = list(self._enchars)
+ del enchars[index]
+ self._enchars = ''.join(enchars)
+ self._jachars = self.__get_kana_typing_rule(self._enchars, '')