Руби: мои первые книжки
Feb. 26th, 2013 08:48 pmНаписал первую в жизни программу на руби.
Программа необычайна полезная, умеет переводить русский текст в индусский скрипт, ну настолько на сколько это вообще возможно...
Программа необычайна полезная, умеет переводить русский текст в индусский скрипт, ну настолько на сколько это вообще возможно...
#!/usr/bin/ruby
def hindiize(s)
downcase =
{
'А' => 'а',
'Б' => 'б',
'В' => 'в',
'Г' => 'г',
'Д' => 'д',
'Е' => 'е',
'Ё' => 'ё',
'Ж' => 'ж',
'З' => 'з',
'И' => 'и',
'Й' => 'й',
'К' => 'к',
'Л' => 'л',
'М' => 'м',
'Н' => 'н',
'О' => 'о',
'П' => 'п',
'Р' => 'р',
'С' => 'с',
'Т' => 'т',
'У' => 'у',
'Ф' => 'ф',
'Х' => 'х',
'Ц' => 'ц',
'Ч' => 'ч',
'Ш' => 'ш',
'Щ' => 'щ',
'Ь' => 'ь',
'Ъ' => 'ъ',
'Ы' => 'ы',
'Э' => 'э',
'Ю' => 'ю',
'Я' => 'я',
}
first_vowels =
{
'а' => 'आ',
'е' => 'ए',
# 'ё' => '',
'и' => 'इ',
'о' => 'औ',
'у' => 'उ',
'ы' => 'ई', # ई -- строго говоря длинная "и", звука ы в хинди нету совсем :-(
'э' => 'अ'
# 'ю' => '',
# 'я' => ''
}
middle_vowels =
{
'а' => 'ा',
'е' => 'े',
# 'ё' => '',
'и' => 'ि',
'о' => 'ो',
'у' => 'ु',
'ы' => 'ी', # 'ी'- - строго говоря длинная "и", звука ы в хинди нету совсем :-(
'э' => '' # звук э между согласным вообще не подлежит "огласовке"
# 'ю' => '',
# 'я' => ''
}
consonants =
{
'б' => 'ब',
# 'бх' => 'भ',
'в' => 'व',
'г' => 'ग',
# 'гх' => 'घ',
'д' => 'द',
# 'дх' => 'ध',
'ж' => 'ज',
'з' => 'ज़',
'й' => 'य',
'к' => 'क',
'л' => 'ल',
'м' => 'म',
'н' => 'न',
'п' => 'प',
# 'пх' => 'फ',
'р' => 'र',
'с' => 'स',
'т' => 'त',
# 'тх' => 'थ',
'ф' => 'फ़',
'х' => 'ह',
'ц' => 'ट्स',
'ч' => 'छ',
'ш' => 'श',
'щ' => 'ष',
}
numbers =
{
'0' => '०',
'1' => '१',
'2' => '२',
'3' => '३',
'4' => '४',
'5' => '५',
'6' => '६',
'7' => '७',
'8' => '८',
'9' => '९',
}
s = s.gsub('ё','йо');
s = s.gsub('ю','йу');
s = s.gsub('я','йа');
s = s.gsub('ь',"'");
s = s.gsub('ъ',"'");
is_first = true
is_prev_consonant = false
res = ""
s.split(//u).each do |l|
l = downcase[l] || l # FIXME Я не знаю как сделать downcase по-русски
if l.match(/[аеиоуыэ]/u)
if is_first || ! is_prev_consonant
l = first_vowels[l];
else
l = middle_vowels[l];
end
is_prev_consonant = false;
elsif l.match(/[бвгджзйклмнпрстфхцчшщ]/u)
l = consonants[l];
if (is_prev_consonant)
l = "्" + l
end
is_prev_consonant = true
elsif l.match(/[0-9]/u)
l = numbers[l];
is_prev_consonant = false
is_first = true
else
is_prev_consonant = false
is_first = true
end
res=res+l
is_first = false
end
res
end
puts hindiize("АХТУНГ-АХТУНГ руссиш патртизанен")
puts hindiize("здесь сидел ты, валет, тебе счастия нет, тебе карта всегда не в цвет")
puts hindiize("грааль понаотдавал")
puts hindiize("ооо 'ааа'")
puts hindiize("год 1997")
no subject
Date: 2013-02-26 05:41 pm (UTC)... Торможение свободного взлетания ...
no subject
Date: 2013-02-26 06:25 pm (UTC)Да, там с уникодом, судя по всему все совсем странно. Как принудить регекспы быть уникодными я нашел, а вот с tr или downcase я так и не разобрался...
Вроде бы там есть какой-то "модуль" unicode который можно подгрузить, но он из коробки не идет, и я не стал его трогать ибо не знаю как его правильно в дебиане добывать...