nataraj: (Бритый небритый)
[personal profile] nataraj
Написал первую в жизни программу на руби.
Программа необычайна полезная, умеет переводить русский текст в индусский скрипт, ну настолько на сколько это вообще возможно...

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

Date: 2013-02-26 05:41 pm (UTC)
From: [identity profile] slobin.livejournal.com
А что, сделать downcase юникоду она сама не может? (полчаса назад этой части кода ещё не было, я точно помню!). Ну то есть я в курсе, что у японцев вообще и рубистов в частности отношение к юникоду странное, но насколько именно странное?

... Торможение свободного взлетания ...

Date: 2013-02-26 06:25 pm (UTC)
ext_613079: Default userpic (Бритый небритый)
From: [identity profile] shaplov.livejournal.com
Да, я дописал этот фрагмент после публикации поста, вспомнив что забыл...

Да, там с уникодом, судя по всему все совсем странно. Как принудить регекспы быть уникодными я нашел, а вот с tr или downcase я так и не разобрался...

Вроде бы там есть какой-то "модуль" unicode который можно подгрузить, но он из коробки не идет, и я не стал его трогать ибо не знаю как его правильно в дебиане добывать...

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 19th, 2026 08:30 pm
Powered by Dreamwidth Studios