Skip to content

Instantly share code, notes, and snippets.

@reclosedev
Created January 12, 2012 15:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reclosedev/1600988 to your computer and use it in GitHub Desktop.
Save reclosedev/1600988 to your computer and use it in GitHub Desktop.
Implementation of transliteration class, as a simple state machine, with posibility to call it from one-key-prees events. E.g for implementing QTextEdit with translit
#!/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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment