-type(utf8_str() :: [integer()]).
-type(ascii_str() :: [byte()]).
-spec(translit(utf8_str()) -> ascii_str()).
translit(Data) ->
translit(Data, []).
-spec(translit(utf8_str(), list()) -> ascii_str()).
translit([], Acc) -> lists:flatten(lists:reverse(Acc));
translit([Last], Acc) -> lists:flatten(lists:reverse([Last | Acc]));
translit([C1, C2 | Rest], Acc) ->
case proplists:get_value({C1, C2}, translit_map()) of
undefined -> translit([C2 | Rest], [C1 | Acc]);
{Str, _} -> translit(Rest, [Str | Acc])
end.
translit_map() ->
L1 = [{208, N} || N <- lists:seq(144, 191)],
L2 = [{209, N} || N <- lists:seq(128, 143)],
D1 = [{"A", "А"}, {"B", "Б"}, {"V", "В"}, {"G", "Г"}, {"D", "Д"}, {"E", "Е"},
{"Zh", "Ж"}, {"Z", "З"}, {"I", "И"}, {"J", "Й"}, {"K", "К"}, {"L", "Л"},
{"M", "М"}, {"N", "Н"}, {"O", "О"}, {"P", "П"}, {"R", "Р"}, {"S", "С"},
{"T", "Т"}, {"U", "У"}, {"F", "Ф"}, {"H", "Х"}, {"Ts", "Ц"}, {"Ch", "Ч"},
{"Sh", "Ш"}, {"Shh","Щ"}, {"#", "Ъ"}, {"Y", "Ы"}, {"'", "Ь"}, {"Je", "Э"},
{"Ju", "Ю"}, {"Ja", "Я"},
{"a", "а "}, {"b", "б"}, {"v", "в"}, {"g", "г"}, {"d", "д"}, {"e", "е"},
{"zh", "ж"}, {"z", "з"}, {"i", "и"}, {"j", "й"}, {"k", "к"}, {"l", "л"},
{"m", "м"}, {"n", "н"}, {"o", "о"}, {"p", "п"}],
D2 = [{"r", "р"}, {"s", "с"}, {"t", "т"}, {"u", "у"}, {"f", "ф"}, {"h", "х"},
{"ts", "ц"}, {"ch", "ч"}, {"sh", "ш"}, {"shh","щ"}, {"#", "ъ"}, {"y", "ы"},
{"'", "ь"}, {"je", "э"}, {"ju", "ю"}, {"ja", "я"}],
[{{208, 129}, {"Yo", "Ё"}},
{{209, 145}, {"yo", "ё"}},
{{194, 171}, {"\"", "«"}},
{{194, 187}, {"\"", "»"}}
] ++ lists:zip(L1, D1) ++ lists:zip(L2, D2).
translit_test() ->
?assertEqual("abvgd", translit("абвгд")),
?assertEqual("a b v g d", translit("а б в г д")),
?assertEqual("abv gd 100", translit("абв гд 100")),
?assertEqual("a-b/vgwwd", translit("а-б/вгwwд")),
?assertEqual("Vasilij Alibabaevich", translit("Василий Алибабаевич")),
?assertEqual("Vot vam telegramma ot gippopotama.",
translit("Вот вам телеграмма от гиппопотама.")),
?assertEqual("Shtirlits el shhi s kapustoj, ishhi-svishhi ego teper'.",
translit("Штирлиц ел щи с капустой, ищи-свищи его теперь.")),
?assertEqual("Asteriks na Olimpijskih igrah HD",
translit("Астерикс на Олимпийских играх HD")),
?assertEqual("Afisha. Jekskljuzivnyj otryvok \"Zhizn' Adel'\"",
translit("Афиша. Эксклюзивный отрывок \"Жизнь Адель\"")),
?assertEqual("Veselaja koza: Legendy staroj Pragi",
translit("Веселая коза: Легенды старой Праги")),
?assertEqual("Vojna drakonov / Vojna dinozavrov HD",
translit("Война драконов / Война динозавров HD")),
?assertEqual("Zdravstvujte, my vasha krysha!",
translit("Здравствуйте, мы ваша крыша!")),
?assertEqual("Variant \"Omega\". 4 serija",
translit("Вариант «Омега». 4 серия")),
ok.
сорри, скопипастил из проекта. Внятной отдельной либой не оформлено )
пятница, 29 ноября 2013 г., 13:24:27 UTC+3 пользователь sVIKs написал: