2020-06-07 17:00:56 +03:00

140 lines
2.8 KiB
Elixir
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

defmodule Localizator.Translitor.UK do
@moduledoc """
Translit module for Ukrainian language.
"""
@locale "uk"
@table %{
"А" => "A",
"Б" => "B",
"В" => "V",
"Г" => "H",
"Ґ" => "G",
"Д" => "D",
"Е" => "E",
"Є" => "Ye",
"Ж" => "Zh",
"З" => "Z",
"И" => "Y",
"І" => "I",
"Ї" => "Yi",
"Й" => "Y",
"К" => "K",
"Л" => "L",
"М" => "M",
"Н" => "N",
"О" => "O",
"П" => "P",
"Р" => "R",
"С" => "S",
"Т" => "T",
"У" => "U",
"Ф" => "F",
"Х" => "Kh",
"Ц" => "Ts",
"Ч" => "Ch",
"Ш" => "Sh",
"Щ" => "Shch",
"Ю" => "Yu",
"Я" => "Ya",
"а" => "a",
"б" => "b",
"в" => "v",
"г" => "h",
"ґ" => "g",
"д" => "d",
"е" => "e",
"є" => "ie",
"ж" => "zh",
"з" => "z",
"и" => "y",
"і" => "i",
"ї" => "i",
"й" => "i",
"к" => "k",
"л" => "l",
"м" => "m",
"н" => "n",
"о" => "o",
"п" => "p",
"р" => "r",
"с" => "s",
"т" => "t",
"у" => "u",
"ф" => "f",
"х" => "kh",
"ц" => "ts",
"ч" => "ch",
"ш" => "sh",
"щ" => "shch",
"ю" => "iu",
"я" => "ia"
}
@typedoc """
Plain Text
"""
@type text :: String.t()
@typedoc """
Locale
"""
@type locale :: String.t()
@behaviour Localizator.Translitor.Base
@impl true
@spec locale() :: {:ok, locale}
def locale(), do: @locale
@doc """
A ukrainian to english transliteration
## Example
``elixir
iex> Localizator.Translitor.UK.convert("Данило Негрієнко")
"Danylo Nehriienko"
``
"""
@impl true
@spec convert(text) :: text
def convert(text) when is_binary(text) do
text
|> String.graphemes()
|> Enum.reduce([], &convert_letter/2)
|> Enum.join()
end
# special case for "Зг", that should be mapped as "zgh"
defp convert_letter(letter, [last_letter] = acc)
when letter in ~w(Г г) and last_letter in ~w(z Z) do
acc ++ [convert_gh(letter)]
end
# special case for "зг", that should be mapped as "zgh"
defp convert_letter(letter, acc) when letter in ~w(Г г) do
case List.last(acc) do
last_letter when last_letter in ~w(z Z) -> acc ++ [convert_gh(letter)]
_ -> acc ++ [convert_letter(letter)]
end
end
defp convert_letter(letter, acc) do
acc ++ [convert_letter(letter)]
end
defp convert_letter(" "), do: " "
defp convert_letter("ь"), do: ""
defp convert_letter("Ь"), do: ""
defp convert_letter("'"), do: ""
defp convert_letter(""), do: ""
defp convert_letter(letter) do
case Map.get(@table, letter) do
nil -> letter
latin -> latin
end
end
defp convert_gh("Г"), do: "Gh"
defp convert_gh("г"), do: "gh"
end