summaryrefslogtreecommitdiff
path: root/tex/context/third/transliterator/trans_tables_sr.lua
blob: 0f9eae477fc7d213801acd6ca780e18f13aecda7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

--===========================================================================--
--                               Serbian                                     --
--===========================================================================--


if not translit.done_serbian then
    --------------------------------------------
    -- Lowercase Serbian (Cyrillic -> Latin)  --
    --------------------------------------------
    translit.sr_tolt_lower = translit.make_add_dict{
        ["А"] = "A",
        ["Б"] = "B",
        ["В"] = "V",
        ["Г"] = "G",
        ["Д"] = "D",
        ["Ђ"] = "Đ",
        ["Е"] = "E",
        ["Ж"] = "Ž",
        ["З"] = "Z",
        ["И"] = "I",
        ["Ј"] = "J",
        ["К"] = "K",
        ["Л"] = "L",
        ["Љ"] = "Lj",
        ["М"] = "M",
        ["Н"] = "N",
        ["Њ"] = "Nj",
        ["О"] = "O",
        ["П"] = "P",
        ["Р"] = "R",
        ["С"] = "S",
        ["Т"] = "T",
        ["Ћ"] = "Ć",
        ["У"] = "U",
        ["Ф"] = "F",
        ["Х"] = "H",
        ["Ц"] = "C",
        ["Ч"] = "Č",
        ["Џ"] = "Dž",
        ["Ш"] = "Š",
    }

    translit.tables["Serbian Cyr->Lat Transliteration lowercase"] = translit.sr_tolt_lower

    --------------------------------------------
    -- Uppercase Serbian (Cyrillic -> Latin)  --
    --------------------------------------------

    translit.sr_tolt_upper = translit.make_add_dict{
        ["а"] = "a",
        ["б"] = "b",
        ["в"] = "v",
        ["г"] = "g",
        ["д"] = "d",
        ["ђ"] = "đ",
        ["е"] = "e",
        ["ж"] = "ž",
        ["з"] = "z",
        ["и"] = "i",
        ["ј"] = "j",
        ["к"] = "k",
        ["л"] = "l",
        ["љ"] = "lj",
        ["м"] = "m",
        ["н"] = "n",
        ["њ"] = "nj",
        ["о"] = "o",
        ["п"] = "p",
        ["р"] = "r",
        ["с"] = "s",
        ["т"] = "t",
        ["ћ"] = "ć",
        ["у"] = "u",
        ["ф"] = "f",
        ["х"] = "h",
        ["ц"] = "c",
        ["ч"] = "č",
        ["џ"] = "dž",
        ["ш"] = "š",
    }

    translit.tables["Serbian Cyr->Lat Transliteration uppercase"] = translit.sr_tolt_upper

    local function __inverse_tab (t)
        local result = { }
        for k,v in next,t do result[v] = k end
        return result
    end

    translit.sr_tocy_lower = translit.make_add_dict(__inverse_tab(translit.sr_tolt_lower))
    translit.sr_tocy_upper = translit.make_add_dict(__inverse_tab(translit.sr_tolt_upper))

    local except = {
        ["nadživeti"] = "надживети",
    }

    local P = lpeg.P
    local sub, upper = unicode.utf8.sub, unicode.utf8.upper

    local sre, p_sre   = {}
    for lat, cyr in next, except do
        local Lat = upper(sub(lat, 1, 1)) .. sub(lat, 2)
        local Cyr = upper(sub(cyr, 1, 1)) .. sub(cyr, 2)
        local LAT, CYR = upper(lat), upper(cyr)
        p_sre = p_sre and p_sre + P(lat) + Lat + LAT or P(lat) + Lat + LAT
        sre[lat], sre[Lat], sre[LAT] = cyr, Cyr, CYR
    end

    translit.serbian_exceptions   = sre
    translit.p_serbian_exceptions = p_sre

    translit.done_serbian = true
end

--===========================================================================--
--                              End Of Tables                                --
--===========================================================================--


local t = translit
local function sr (mode, text)
    local P, R, Cs = lpeg.P, lpeg.R, lpeg.Cs
    local utfchar  = translit.utfchar
    local _p_sre   = translit.p_serbian_exceptions / translit.serbian_exceptions

    local trl_sr   = translit.make_add_dict{}
    trl_sr         = t[mode.."_upper"] + t[mode.."_lower"]

    -- transliteration from latin script requires macro handling … 
    local _p_macro = P[[\]] * R("az", "AZ")^1
    local _p_sr    = translit.addrules (trl_sr, _p_sr)
    local p_sr     = Cs((_p_macro + _p_sre + (_p_sr / trl_sr) + utfchar)^0)

    return p_sr:match(text)
end

translit.methods ["sr_tolt"] = function (text) return sr( "sr_tolt", text ) end
translit.methods ["sr_tocy"] = function (text) return sr( "sr_tocy", text ) end