/python/engine/PinYin/ShuangPin.py
Python | 204 lines | 176 code | 3 blank | 25 comment | 0 complexity | 99a9f80bd8f659db8365c5a80701d0dd MD5 | raw file
- # -*- coding: utf-8 -*-
- # vim: set noet ts=4:
- #
- # scim-python
- #
- # Copyright (c) 2007-2008 Yu Fan <yufanyufan@gmail.com>
- #
- #
- # This library is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Lesser General Public
- # License as published by the Free Software Foundation; either
- # version 2 of the License, or (at your option) any later version.
- #
- # This library 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 Lesser General Public License for more details.
- #
- # You should have received a copy of the GNU Lesser General Public
- # License along with this program; if not, write to the
- # Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- # Boston, MA 02111-1307 USA
- #
- # $Id: $
- #
- from ZhengJu import *
- import scim
- import os
- from scim import KeyCode
- from scim import KeyMask
- from scim import Property
- import traceback
- import sys
- from PYDict import *
- from gettext import dgettext
- _ = lambda a : dgettext ("scim-python", a)
- class ShuangPinEngine (Engine):
- def __init__ (self, factory, config, encoding, id):
- Engine.__init__(self, factory, config, encoding, id)
-
- def clear(self):
- self.extra_string = []
- Engine.clear(self)
- def get_extra_string(self):
- return "".join(self.extra_string)
- def reload_config(self,config):
- self.reset()
- self.schema = config.read ("/IMEngine/Python/ZhengJu/ShuangPinSchema", "MSPY")
- #~ print self.schema
- if not self.schema in SHUANGPIN_SCHEMAS.keys ():
- self.schima = "MSPY"
- (self.shengmu_schema, self.yunmu_schema) = SHUANGPIN_SCHEMAS[self.schema]
- Engine.reload_config(self,config)
-
- def translate(self,key):
- if(self._editor.current () == None or self._editor.current ().is_complete ()):
- if unichr (key.code) in self.shengmu_schema:
- self._editor.pinyinlist.append (PinYinWord(self.shengmu_schema[unichr (key.code)],""))
- if not self.progresivepromp:
- return
- else:
- raise InputException()
- else:
- if unichr(key.code) in self.yunmu_schema:
- yunmu = self.yunmu_schema[unichr(key.code)]
- p = None
- for i in yunmu:
- pinyin = self._editor.current ().get_shengmu () + i
- if pinyin in PINYIN_LIST:
- p = i
- break
- if p == None:
- raise InputException ()
- self._editor.current().set_yunmu (p)
- else:
- raise InputException
- self._editor.auto_convert ()
-
- def chinese_process_key_event (self, key):
- if (self.schema=="MSPY" or self.schema=="ZGPY") and key.mask == KeyMask.NullMask and (\
- (key.code >= KeyCode.KEY_a and key.code <= KeyCode.KEY_z) or \
- key.code == KeyCode.KEY_semicolon):
- self.translate(key)
- return True
- elif key.mask == KeyMask.NullMask \
- and (key.code >= KeyCode.KEY_a and key.code <= KeyCode.KEY_z):
- self.translate(key)
- return True
- elif self._editor.pinyinlist and key.code == KeyCode.KEY_BackSpace:
- if self._editor.pinyinlist[-1].is_complete ():
- self._editor.pinyinlist[-1].set_yunmu ("")
- if not self.progresivepromp:
- return True
- else:
- del self._editor.pinyinlist[-1]
- self._editor.update ()
- return True
- elif (self.extra_string or self._editor.pinyinlist) and (key.code == KeyCode.KEY_Left or key.code == KeyCode.KEY_f and key.mask & KeyMask.ControlMask):
- if self._editor.pinyinlist:
- p = self._editor.pinyinlist[-1].get_screen_pinyin()
- self.extra_string = [p] + self.extra_string
- del self._editor.pinyinlist[-1]
- self._editor.update ()
- return True
- elif (self._editor.pinyinlist or self.extra_string ) and (key.code == KeyCode.KEY_Right or key.code == KeyCode.KEY_b and key.mask & KeyMask.ControlMask):
- if self.extra_string:
- self._editor.pinyinlist.append(PinYinWord(pinyin=self.extra_string[0]))
- del self.extra_string[0]
- self._editor.update ()
- return True
- else:
- raise InputException()
- elif (self._editor.pinyinlist or self.extra_string ) and key.code == KeyCode.KEY_Delete:
- if self.extra_string:
- del self.extra_string[0]
- return True
- else:
- raise InputException()
- elif self.extra_string and key.code in (KeyCode.KEY_KP_Space, KeyCode.KEY_space):
- while self.extra_string:
- self._editor.pinyinlist.append(PinYinWord(pinyin=self.extra_string[0]))
- del self.extra_string[0]
- self._editor.auto_convert ()
- return True
- elif Engine.chinese_process_key_event (self,key):
- return True;
- return False
- class ShuangPinFactory (IMEngineFactory):
- def __init__ (self, config):
- IMEngineFactory.__init__ (self, config)
- self.name = _(u"ShuangPin")
- self.uuid = "5d2ceb47-7567-4d74-980f-26d5d300ea66"
- self.authors = u"Yu Fan <yufanyufan@gmail.com>"
- self.icon_file = "/usr/share/scim/icons/scim-python.png"
- self.credits = u"GPL"
- self.help = _(u"Help For ShuangPin")
- self.set_languages ("zh")
- self._config = config
- def create_instance (self, encoding, id):
- engine = ShuangPinEngine (self, self._config, encoding, id)
- return engine
- def reload_config (self, config):
- pass
- def test_add_char(editor, char):
- if(editor.current () == None or editor.current ().is_complete ()):
- editor.pinyinlist.append(PinYinWord(MSPY_SHUANGPIN_SHENGMU_DICT[char],""))
- else:
- yunmu = MSPY_SHUANGPIN_YUNMU_DICT[char]
- p = None
- for i in yunmu:
- pinyin = editor.current ().get_shengmu() + i
- if pinyin in PINYIN_LIST:
- p = i
- break
- if p == None:
- raise Exception ()
- editor.current ().set_yunmu (p)
- editor.auto_convert ()
- def test_case(pinyin,modify = None, sentence=None):
- editor = Editor ()
- editor.schema = "MSPY"
- editor.userword = True
- editor.userphrase = True
- editor.adjustfreq = True
-
- (editor.shengmu_schema, editor.yunmu_schema) = SHUANGPIN_SCHEMAS [editor.schema]
- for i in pinyin:
- test_add_char (editor,i)
- editor.convert_all ()
- if modify:
- for i in range (0,len(modify)):
- editor.wordlist[i].char=modify[i]
- result = editor.commit ()
- print result
- if sentence:
- assert editor.commit () == sentence
- def test():
- test_case("fhdiijklfauhdedstmjqykllle")
- test_case("woxihr")
- test_case("hvbuhvybufme")
- test_case("zfmehvuioa")
- test_case("kklydkde")
- test_case("devild")
- test_case("veybvuyu")
- if __name__ == "__main__":
- #~ import timeit
- #~ t = timeit.Timer("ShuangPin.test()","import ShuangPin")
- #~ print t.repeat(1,1)
- import cProfile
- cProfile.run("test()","fooprof")
- import pstats
- p = pstats.Stats("fooprof")
- p.strip_dirs().sort_stats("cumulative").print_stats()