Created
January 12, 2012 15:00
-
-
Save reclosedev/1600988 to your computer and use it in GitHub Desktop.
Revisions
-
reclosedev created this gist
Jan 12, 2012 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,81 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # http://stackoverflow.com/a/8785689/1052325 class SMTransliterator(object): two_letters = {u'Ch': u'Ч', u'yo': u'ё', u'Yo': u'Ё', u'Ya': u'Я', u'yu': u'ю', u'sh': u'щ', u'ch': u'ч', u'ya': u'я', u'Sh': u'Щ', u'zh': u'ж', u'Yu': u'Ю', } two_letters_set = set([s[0] for s in two_letters]) single_letters = {u'A': u'А', u'C': u'Ц', u'B': u'Б', u'E': u'Е', u'D': u'Д', u'G': u'Г', u'F': u'Ф', u'I': u'И', u'H': u'Х', u'K': u'К', u'M': u'М', u'L': u'Л', u'O': u'О', u'N': u'Н', u'P': u'П', u'S': u'С', u'R': u'Р', u'U': u'У', u'T': u'Т', u'V': u'В', u'Y': u'Й', u'Z': u'З', u'a': u'а', u'c': u'ц', u'b': u'б', u'e': u'е', u'd': u'д', u'g': u'г', u'f': u'ф', u'i': u'и', u'h': u'х', u'k': u'к', u'm': u'м', u'l': u'л', u'o': u'о', u'n': u'н', u'p': u'п', u's': u'с', u'r': u'р', u'u': u'у', u't': u'т', u'v': u'в', u'y': u'й', u'z': u'з', u'J': u'Ж', u'j': u'ж'} def __init__(self): self._buffer = u'' self._result = u'' def add_letter(self, letter): if letter not in self.two_letters_set and letter not in self.single_letters: self._result = self.single_letters.get(self._buffer, u'') self._buffer = u'' return False if self.need_next: s = self._buffer + letter if s in self.two_letters: self._result = self.two_letters[s] else: self._result = self.single_letters[self._buffer] + self.single_letters[letter] self._buffer = u'' return True if letter in self.two_letters_set: self._buffer += letter return True if letter in self.single_letters: self._buffer = u'' self._result = self.single_letters[letter] return True return False @property def need_next(self): return len(self._buffer) > 0 @property def result(self): return self._result def demo(): tr = SMTransliterator() def on_key_press(text): if not tr.add_letter(text): print 'Pass:', text return if tr.need_next: print 'Next:', text return print 'Add:', tr.result # import trans # text = u'Тестирование работы транслитераторатора с шипящими звуками и алфавитом АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧЩ'.encode('trans') + u' А это без замены' # print text text = u'Testirovanie raboty transliteratoratora s shipyashimi zvukami i alfavitom ABVGDEYoZhZIYKLMNOPRSTUFHCChSh А это без замены' for letter in text: on_key_press(letter) if __name__ == '__main__': demo()