module StringTools::Transliteration

Constants

LAYOUT_EN_TO_RU_MAP
LAYOUT_PERSISTENT
LAYOUT_RU_TO_EN_MAP
TRANSLIT_RU_TO_EN_MAP

Public Instance Methods

transliteration_variations(str) click to toggle source

Public: варианты строки с учетом смены раскладки и/или транслитерации для Русского и Английского языков

Смена раскладки выполняется в обе стороны, транслитерация - с Русского на Английский.

str - String

Examples

transliteration_variations('Ruby')
  => ['Ruby', 'Кгин', 'kgin']
transliteration_variations('Слово')
  => ['Слово', 'ckjdj', 'slovo']
transliteration_variations('КомпанияPro')
  => ['КомпанияPro']
transliteration_variations('ويكيبيدي')
  => ['ويكيبيدي']

returns Array of String

# File lib/string_tools.rb, line 430
def transliteration_variations(str)
  str_as_chars = str.chars
  converted = convert_layout(str_as_chars)

  layout_swap = converted[:chars].try(:join)
  tranliterated = (converted[:was_ru] ? transliterate(str_as_chars) : transliterate(converted[:chars])).try(:join)

  [str, layout_swap, tranliterated].tap(&:compact!)
end

Private Instance Methods

convert_layout(splitted_string) click to toggle source

Internal: Смена раскладки массива символов, ru <-> en.

Возвращает Hash с двумя ключами:
  :chars  - Array, символы в другой раскладке(nil если не удалось сменить раскладку)
  :was_ru - Bool, принадлежали ли все символы русскому языку.

splitted_string - Array of String

Example:

convert_layout(['a', 'b', 'c']) =>
  {chars: ['ф', 'и', 'с'], was_ru: false}
convert_layout(['а', 'б', 'в']) =>
  {chars: ['f', ',', 'd'], was_ru: true}
convert_layout(['ﻮ', 'ﻴ', 'ﻜ']) =>
  {chars: nil, was_ru: false}

returns Array

# File lib/string_tools.rb, line 458
def convert_layout(splitted_string)
  str_arr = splitted_string.map do |char|
    LAYOUT_RU_TO_EN_MAP[char] || LAYOUT_PERSISTENT[char] || break
  end

  return {chars: str_arr, was_ru: true} if str_arr

  {chars: splitted_string.map { |char| LAYOUT_EN_TO_RU_MAP[char] || LAYOUT_PERSISTENT[char] || break },
   was_ru: false}
end
transliterate(splitted_string) click to toggle source

Internal: Транслитерация массива символов, ru -> en

Если символа нет в словаре, не изменяет его.

splitted string - Array of String

Returns Array

# File lib/string_tools.rb, line 475
def transliterate(splitted_string)
  return unless splitted_string

  splitted_string.map { |char| TRANSLIT_RU_TO_EN_MAP[char] || char }
end