Skip to content

Instantly share code, notes, and snippets.

@ddimtirov
Created November 2, 2013 06:56
Show Gist options
  • Save ddimtirov/7276353 to your computer and use it in GitHub Desktop.
Save ddimtirov/7276353 to your computer and use it in GitHub Desktop.
Transliterating Cyrillic text and preparing it for publishing to mailing lists. Useful for crappy non-Unicode mailing lists like Yahoo Groups. Easy to customize.
#!/usr/bin/python
# -*- coding: utf-8 -*-
r"""
:Authors: Dimitar A. Dimitrov
:Contact: dimiter[at]blue[dash]edge[dot]bg
:Dedication: To the I18N team at Yahoo! Inc.
:Copyright: This work is licensed under the X license.
For the full text of the license see http://www.opensource.org/licenses/xnet.php
:Version: 0.1
:Status: Experimental
:Date: 2004-08-22
:Abstract: This script adds latin characters transliteration to
a cyrillic text placed in the windows clipboard.
Увод
====
От известно време ми се налага да ползвам пощата на Yahoo и се сблъсках с
един доста досаден проблем. Когато пусна съобщение на кирилица, понякога
излиза нормално, понякога излиза само "маймуница"...
Тази малка програмка е предназначена за тези от нас, които искат да ползват
родната си азбука, и в същото време искат да са сигурни, че съобщението
им ще може да бъде прочетено от всички. Може да я ползвате и
във всякакви други случаи когато ви се налага да "преведете" кирилски текст
на латиница.
ЗАБЕЛЕЖКА:
----------
За да пращате мейлове на кирилица ви е необходима e-mail програма който да ви
позволява да задавате кодирането (encoding) на мейла (от рода на Outlook Express,
Mozilla, Eudora и т.н.)
Преди да изпратите e-mail на кирилица до yahoo, трябва да изберете от менюто
'View > Character Encoding > Cyrillic (Windows-1251)'
Ако имате системен администратор подръка, помолете го да ви настрои това
като стандартното кодиране. Тази настройка не променя по никакъв начин
възможността да пишете на латиница.
Инструкции за инсталация:
=========================
1. За да можете да стартирате програмата, трябва да имате инсталиран
Python с PithonWin extension. Python е безплатен програмен език,
който е лесен за инсталиране, но не е част от Windows-a.
Ако нямате Python или не знаете дали имате, препоръчвам да си
инсталирате дистрибуцията на ActiveState, която включва всичко
необходимо. Адрес - http://www.activestate.com/Products/ActivePython
ActiveState е поделение на Sophos, чийто основен бизнес
са антивирусни и анти-спам продукти.
2. Запишете този файл на хард дискът си (предполагам, че вече сте го направили).
Ако правилно сте инсталирали Python, иконката трябва да бъде едно симпатично питонче.
Отсега натам когато споменавам "програмата" имам предвид този файл.
3. По желание можете завлечете файла на десктоп-а или в редът с малки
иконки до Start бутона na Windows (Windows Quick Launch toolbar).
Инструкции за ползване:
=======================
1. Въведете текста на кирилица и го копирайте в clipboard-а
(маркирайте го с мишката и натиснете ctrl+C).
2. Кликнете върху иконката на програмата.
3. Готово! Преведения текст е вече в clipboard-а ви. Можете да го
paste-нете където си поискате.
4. Идете на любимия си сайт за електронни картички и ми изпратете
най-хубавата на адрес dimiter[кльомба]blue[тире]edge[точка]bg :-)
ОЩЕ:
----
- Можете да завлачвате текстови файлове върху иконката на програмата
и това ще постави резултатът в clipboard-а ви.
- Ако ползвате Unix shell конзола или Windows command prompt, можете да
конвертирате директно цели файлове, без да минавате през clipboard-а.
Инструкции за напреднали:
=========================
- За да промените транслитерацията за определена буква,
намерете mapping entry-то в таблицата 'transliterations' и
променете дясната част.
- За да промените вида на текста, който се поставя в clipboard-а,
променете 'template' променливата. Стринговете '#cyr#' и '#lat#'
ще бъдат заместени респективно с кирилската и латинската версия
на първоначалния текст.
"""
# -- от тук натам започва програмата. ---------------------------
import os, sys
from optparse import OptionParser
VERSION = "0.1"
template = u"""
===============================================================================
== Za latinica, vizh po-dolu ==================================================
===============================================================================
#cyr#
===============================================================================
== Latin Transliteration ======================================================
===============================================================================
#lat#
===============================================================================
== Kraj =======================================================================
===============================================================================
"""
transliterations = {
u"А":"A", u"Б":"B", u"В":"V", u"Г":"G", u"Д":"D",
u"Е":"E", u"Ж":"Zh", u"З":"Z", u"И":"I", u"Й":"J",
u"К":"K", u"Л":"L", u"М":"M", u"Н":"N", u"О":"O",
u"П":"P", u"Р":"R", u"С":"S", u"Т":"T", u"У":"U",
u"Ф":"F", u"Х":"H", u"Ц":"C", u"Ч":"Ch", u"Ш":"Sh",
u"Щ":"Sht", u"Ъ":"A", u"Ь":"", u"Ю":"Ju", u"Я":"Ja",
u"а":"a", u"б":"b", u"в":"v", u"г":"g", u"д":"d",
u"е":"e", u"ж":"zh", u"з":"z", u"и":"i", u"й":"j",
u"к":"k", u"л":"l", u"м":"m", u"н":"n", u"о":"o",
u"п":"p", u"р":"r", u"с":"s", u"т":"t", u"у":"u",
u"ф":"f", u"х":"h", u"ц":"c", u"ч":"ch", u"ш":"sh",
u"щ":"sht", u"ъ":"a", u"ь":"j", u"ю":"ju", u"я":"ja"
}
def transliterate(text):
"""Returns the transliterated content of the 'text' variable."""
transliterated = ""
for character in text:
if character in transliterations:
character = transliterations[character]
transliterated += character
return transliterated
def build_output(txt):
output = template
output = output.replace("#cyr#", txt)
output = output.replace("#lat#", transliterate(txt))
return output
class UnicodeClipboard:
def __init__(self):
import win32clipboard
self.__dict__ = win32clipboard.__dict__
try: self.OpenClipboard(0)
except: self.message("Greshka pri otvarjane na clipboarda!", is_error = True)
def __del__(self):
try: self.CloseClipboard()
except: self.message("Greshka pri zatvarjane na clipboarda!", is_error = True)
def getText(self):
try: return self.GetClipboardData(clip.CF_UNICODETEXT)
except: self.message("Greshka pri vzimane na teksta ot clipboarda!", is_error = True)
def setText(self, txt):
try:
self.EmptyClipboard()
self.SetClipboardData(clip.CF_UNICODETEXT, txt)
except: self.msg("Greshka pri slagane na teksta v clipboarda!", is_error=True)
def message(self, msg, is_error=False):
from win32ui import MessageBox
if is_error:
MessageBox("%s\n\nType: %s\nMessage: %s" % (msg, sys.exc_type, sys.exc_value))
raise
else:
MessageBox(msg, "Latinizator v%s" % VERSION)
if __name__ == "__main__":
src_opts = ["stdin", "file"]
dest_opts = ["stdout", "file"]
if sys.platform == "win32":
src_opts.insert(0, "clipboard")
dest_opts.insert(0, "clipboard")
opt_parser = OptionParser(usage="usage: %prog [options] [srcfile] [destfile]", version="%%prog %s" % VERSION)
opt_parser.add_option("-s", "--source", dest="src", metavar="SRC", choices=src_opts + ["default"], default="default",
help= "From where to get the source text. One of %s. The default value is 'file' if 'srcfile' is present or '%s' if not)." % (src_opts, src_opts[0]))
opt_parser.add_option("-d", "--destination", dest="dest", metavar="DEST", choices=dest_opts, default=dest_opts[0],
help= """Where to put the transliterated text. One of %s (default is '%s').""" % (dest_opts, dest_opts[0]))
opt_parser.add_option("-r", "--reverse", action="store_false", default=True,
help="If specified, perform reverse transliteration (from latin to cyrillic.)NOTE: works well only with latin input generated by this program.")
options, args = opt_parser.parse_args()
if options.src == "default":
if (len(args)==0) or (len(args)==1 and options.dest=="file"):
options.src = src_opts[0]
else :
options.src = "file"
#prepare inputs and outputs
if options.src == "file": sys.stdin = open(args[0], "r")
if options.dest == "file":
if options.src == "file":
sys.stdout = open(args[1], "cw")
else:
sys.stdout = open(args[0], "cw")
clip = None # will create it when we need it
# get source text
if options.src=="clipboard":
if clip==None: clip = UnicodeClipboard()
txt = clip.getText()
else:
txt = sys.stdin.read()
sys.stdin.close()
# transliterate text
txt = build_output(txt)
# write output text
if options.src=="clipboard" or options.dest=="clipboard" :
if clip==None: clip = UnicodeClipboard()
txt = clip.setText(txt)
clip.message("Tekstat e preweden uspeshno!\n\n"+
"Izberete 'Edit > Paste' ili natisnete Ctrl+V za da go izpolzvate.")
else:
txt = sys.stdout.read(txt)
sys.stdout.close()
print sys.stderr >> "blah"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment