Module: Cyrillic

Defined in:
lib/cyrillic.rb,
lib/cyrillic/de.rb,
lib/cyrillic/iso9.rb,
lib/cyrillic/serbian.rb,
lib/cyrillic/version.rb,
lib/cyrillic/bgn_pcgn.rb,
lib/cyrillic/gost779b.rb,
lib/cyrillic/bulgarian.rb,
lib/cyrillic/mongolian.rb,
lib/cyrillic/ukrainian.rb,
lib/cyrillic/belarusian.rb,
lib/cyrillic/ua_passport.rb

Defined Under Namespace

Modules: Belarusian, BgnPcgn, Bulgarian, De, Gost779b, Iso9, Mongolian, Serbian, UaPassport, Ukrainian

Constant Summary collapse

CHARACTER_TABLE =
k.zip(v).to_h.freeze
REGEXP =
Regexp.union(CHARACTER_TABLE.keys).freeze
SCHEMES =
{
  cyrillic: [CHARACTER_TABLE, REGEXP].freeze,
  default: [CHARACTER_TABLE, REGEXP].freeze,
  iso9: [Iso9::CHARACTER_TABLE, Iso9::REGEXP].freeze,
  mongolian: [Mongolian::CHARACTER_TABLE, Mongolian::REGEXP].freeze,
  ukrainian: [Ukrainian::CHARACTER_TABLE, Ukrainian::REGEXP].freeze,
  ua_passport: :ua_passport,
  de: [De::CHARACTER_TABLE, De::REGEXP].freeze,
  serbian: [Serbian::CHARACTER_TABLE, Serbian::REGEXP].freeze,
  gost779b: [Gost779b::CHARACTER_TABLE, Gost779b::REGEXP].freeze,
  bgn_pcgn: [BgnPcgn::CHARACTER_TABLE, BgnPcgn::REGEXP].freeze,
  bulgarian: [Bulgarian::CHARACTER_TABLE, Bulgarian::REGEXP].freeze,
  belarusian: [Belarusian::CHARACTER_TABLE, Belarusian::REGEXP].freeze
}.freeze
REVERSE_SCHEMES =
{
  iso9: build_reverse_mapping(Iso9::CHARACTER_TABLE),
  serbian: build_reverse_mapping(
    Serbian::CHARACTER_TABLE,
    { "LJ" => "Љ", "NJ" => "Њ", "" => "Џ", "DZ" => "Џ", "dz" => "џ" }
  ),
  gost779b: build_reverse_mapping(Gost779b::CHARACTER_TABLE),
  bgn_pcgn: build_reverse_mapping(BgnPcgn::CHARACTER_TABLE),
  bulgarian: build_reverse_mapping(Bulgarian::CHARACTER_TABLE),
  belarusian: build_reverse_mapping(Belarusian::CHARACTER_TABLE),
  mongolian: build_reverse_mapping(Mongolian::CHARACTER_TABLE),
  ukrainian: build_reverse_mapping(Ukrainian::CHARACTER_TABLE),
  de: build_reverse_mapping(De::CHARACTER_TABLE),
  cyrillic: build_reverse_mapping(CHARACTER_TABLE),
  default: build_reverse_mapping(CHARACTER_TABLE)
}.freeze
VERSION =
"0.4.0"

Class Method Summary collapse

Class Method Details

.build_reverse_mapping(table, extra = {}) ⇒ Object



43
44
45
46
47
48
# File 'lib/cyrillic.rb', line 43

def self.build_reverse_mapping(table, extra = {})
  rev = table.reject { |_cyr, lat| lat.nil? || lat.empty? }.to_h { |cyr, lat| [lat, cyr] }
  rev.merge!(extra)
  sorted_keys = rev.keys.sort_by { |key| -key.length }
  [rev.freeze, Regexp.union(sorted_keys).freeze].freeze
end

.detransliterate(string = "", scheme = nil, from: nil) ⇒ String Also known as: det, reverse_transliterate

Detransliterates (reverses) Latin script text back into Cyrillic script.

Examples:

Reverse ISO 9:1995 transliteration

Cyrillic.detransliterate("Transliteraciâ", from: :iso9) #=> "Транслитерация"

Reverse Serbian transliteration (Gajica to Vukovica)

Cyrillic.det("Ljubljana", from: :serbian) #=> "Љубљана"

Reverse GOST 7.79 System B

Cyrillic.det("Shhuka", from: :gost779b) #=> "Щука"

Parameters:

  • string (String, #to_s) (defaults to: "")

    The Latin script text to detransliterate.

  • from (Symbol, String) (defaults to: nil)

    The scheme to reverse (:iso9, :serbian, :gost779b, etc.).

Returns:

  • (String)

    The Cyrillic script string.

Raises:

  • (ArgumentError)

    If the given scheme is unknown.



116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/cyrillic.rb', line 116

def detransliterate(string = "", scheme = nil, from: nil)
  return "" if string.nil? || string.empty?

  chosen = from || scheme || :iso9
  scheme_key = chosen.to_s.downcase.to_sym
  scheme_data = REVERSE_SCHEMES[scheme_key]
  unless scheme_data
    available = (REVERSE_SCHEMES.keys - [:default]).map(&:inspect).join(", ")
    raise ArgumentError, "Unknown detransliteration scheme: #{chosen.inspect}. Available schemes: #{available}"
  end

  table, regexp = scheme_data
  string.to_s.gsub(regexp, table)
end

.transliterate(string = "", to = :cyrillic) ⇒ String Also known as: t

Transliterates Cyrillic text into Roman (Latin) script.

Examples:

Default Cyrillic transliteration

Cyrillic.transliterate("Кириллица") #=> "Kirillitsa"

Short alias .t with ISO 9 scheme

Cyrillic.t("Кириллица", :iso9) #=> "Kirillica"

Serbian Cyrillic to Latin (Vukovica to Gajica)

Cyrillic.t("Љубљана", :serbian) #=> "Ljubljana"

Parameters:

  • string (String, #to_s) (defaults to: "")

    The text to transliterate.

  • to (Symbol, String) (defaults to: :cyrillic)

    The transliteration scheme (:cyrillic, :iso9, :mongolian, :ukrainian, :ua_passport, :de, :serbian, :gost779b, :bgn_pcgn, :bulgarian, :belarusian).

Returns:

  • (String)

    The transliterated Latin script string.

Raises:

  • (ArgumentError)

    If the given transliteration scheme is unknown.



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/cyrillic.rb', line 84

def transliterate(string = "", to = :cyrillic)
  return "" if string.nil? || string.empty?

  scheme_key = to.to_s.downcase.to_sym
  scheme = SCHEMES[scheme_key]
  unless scheme
    available = (SCHEMES.keys - [:default]).map(&:inspect).join(", ")
    raise ArgumentError, "Unknown transliteration scheme: #{to.inspect}. Available schemes: #{available}"
  end

  return UaPassport.transliterate(string) if scheme_key == :ua_passport

  table, regexp = scheme
  string.to_s.gsub(regexp, table)
end