#!/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()