Vai al contenuto

Modulo:Traslittera

Da Cathopedia, l'enciclopedia cattolica.

La documentazione per questo modulo può essere creata in Modulo:Traslittera/man

-- =========================================================
-- Module:Translittera
-- Traslitterazione accademica avanzata
--
-- Lingue supportate:
--
--   ru   = russo
--   uk   = ucraino
--   be   = bielorusso
--   bg   = bulgaro
--   grc  = greco antico (academic)
--
-- =========================================================
-- CARATTERISTICHE
-- =========================================================
--
-- ✔ Traslitterazione scientifica
-- ✔ Greco polictonico completo
-- ✔ Spiriti dolci e aspri
-- ✔ Accenti
-- ✔ Circonflessi
-- ✔ Vocali lunghe (ē / ō)
-- ✔ Vocali brevi (ĕ / ŏ)
-- ✔ Dittonghi politonici completi
-- ✔ Protezione dei dittonghi
-- ✔ Iota sottoscritto
-- ✔ Gamma nasale
-- ✔ Gamma dolce completo
-- ✔ Rho aspirato
-- ✔ Eccezioni lessicali
-- ✔ Unicode NFC
-- ✔ Ordine regole stabile
-- ✔ Compatibile MediaWiki/Scribunto
--
-- =========================================================
-- UTILIZZO CON #INVOKE
-- =========================================================
--
-- {{#invoke:Translittera|translit|grc|Ὅτι}}
-- → Hóti
--
-- {{#invoke:Translittera|translit|grc|σοῦ}}
-- → soû
--
-- {{#invoke:Translittera|translit|grc|εἰς}}
-- → eis
--
-- {{#invoke:Translittera|translit|grc|τοῖς}}
-- → toîs
--
-- {{#invoke:Translittera|translit|grc|οὐρανοῖς}}
-- → ouranoîs
--
-- {{#invoke:Translittera|translit|grc|ἐλθέτω}}
-- → ĕlthétō
--
-- {{#invoke:Translittera|translit|grc|ἁγιασθήτω}}
-- → haghiasthétō
--
-- {{#invoke:Translittera|translit|grc|γῆς}}
-- → ghês
--
-- {{#invoke:Translittera|translit|grc|ὡς}}
-- → hos
--
-- {{#invoke:Translittera|show|grc|Ὅτι}}
-- → Ὅτι (Hóti)
--
-- =========================================================

local p = {}

local data = {}

-- =========================================================
-- RUSSO
-- =========================================================

data.ru = {

    ["А"]="A", ["а"]="a",
    ["Б"]="B", ["б"]="b",
    ["В"]="V", ["в"]="v",
    ["Г"]="G", ["г"]="g",
    ["Д"]="D", ["д"]="d",
    ["Е"]="E", ["е"]="e",
    ["Ё"]="Jo", ["ё"]="jo",
    ["Ж"]="Ž", ["ж"]="ž",
    ["З"]="Z", ["з"]="z",
    ["И"]="I", ["и"]="i",
    ["Й"]="J", ["й"]="j",
    ["К"]="K", ["к"]="k",
    ["Л"]="L", ["л"]="l",
    ["М"]="M", ["м"]="m",
    ["Н"]="N", ["н"]="n",
    ["О"]="O", ["о"]="o",
    ["П"]="P", ["п"]="p",
    ["Р"]="R", ["р"]="r",
    ["С"]="S", ["с"]="s",
    ["Т"]="T", ["т"]="t",
    ["У"]="U", ["у"]="u",
    ["Ф"]="F", ["ф"]="f",
    ["Х"]="H", ["х"]="h",
    ["Ц"]="C", ["ц"]="c",
    ["Ч"]="Č", ["ч"]="č",
    ["Ш"]="Š", ["ш"]="š",
    ["Щ"]="Šč", ["щ"]="šč",
    ["Ъ"]="", ["ъ"]="",
    ["Ы"]="Y", ["ы"]="y",
    ["Ь"]="'", ["ь"]="'",
    ["Э"]="È", ["э"]="è",
    ["Ю"]="Ju", ["ю"]="ju",
    ["Я"]="Ja", ["я"]="ja",
}

-- =========================================================
-- UCRAINO
-- =========================================================

data.uk = {

    ["А"]="A", ["а"]="a",
    ["Б"]="B", ["б"]="b",
    ["В"]="V", ["в"]="v",
    ["Г"]="H", ["г"]="h",
    ["Ґ"]="G", ["ґ"]="g",
    ["Д"]="D", ["д"]="d",
    ["Е"]="E", ["е"]="e",
    ["Є"]="Je", ["є"]="je",
    ["Ж"]="Ž", ["ж"]="ž",
    ["З"]="Z", ["з"]="z",
    ["И"]="Y", ["и"]="y",
    ["І"]="I", ["і"]="i",
    ["Ї"]="Ji", ["ї"]="ji",
    ["Й"]="J", ["й"]="j",
    ["К"]="K", ["к"]="k",
    ["Л"]="L", ["л"]="l",
    ["М"]="M", ["м"]="m",
    ["Н"]="N", ["н"]="n",
    ["О"]="O", ["о"]="o",
    ["П"]="P", ["п"]="p",
    ["Р"]="R", ["р"]="r",
    ["С"]="S", ["с"]="s",
    ["Т"]="T", ["т"]="t",
    ["У"]="U", ["у"]="u",
    ["Ф"]="F", ["ф"]="f",
    ["Х"]="H", ["х"]="h",
    ["Ц"]="C", ["ц"]="c",
    ["Ч"]="Č", ["ч"]="č",
    ["Ш"]="Š", ["ш"]="š",
    ["Щ"]="Šč", ["щ"]="šč",
    ["Ь"]="'", ["ь"]="'",
    ["Ю"]="Ju", ["ю"]="ju",
    ["Я"]="Ja", ["я"]="ja",
}

-- =========================================================
-- BIELORUSSO
-- =========================================================

data.be = {

    ["А"]="A", ["а"]="a",
    ["Б"]="B", ["б"]="b",
    ["В"]="V", ["в"]="v",
    ["Г"]="H", ["г"]="h",
    ["Д"]="D", ["д"]="d",
    ["Е"]="Je", ["е"]="je",
    ["Ё"]="Jo", ["ё"]="jo",
    ["Ж"]="Ž", ["ж"]="ž",
    ["З"]="Z", ["з"]="z",
    ["І"]="I", ["і"]="i",
    ["Й"]="J", ["й"]="j",
    ["К"]="K", ["к"]="k",
    ["Л"]="L", ["л"]="l",
    ["М"]="M", ["м"]="m",
    ["Н"]="N", ["н"]="n",
    ["О"]="O", ["о"]="o",
    ["П"]="P", ["п"]="p",
    ["Р"]="R", ["р"]="r",
    ["С"]="S", ["с"]="s",
    ["Т"]="T", ["т"]="t",
    ["У"]="U", ["у"]="u",
    ["Ў"]="Ŭ", ["ў"]="ŭ",
    ["Ф"]="F", ["ф"]="f",
    ["Х"]="H", ["х"]="h",
    ["Ц"]="C", ["ц"]="c",
    ["Ч"]="Č", ["ч"]="č",
    ["Ш"]="Š", ["ш"]="š",
    ["Ы"]="Y", ["ы"]="y",
    ["Ь"]="'", ["ь"]="'",
    ["Э"]="È", ["э"]="è",
    ["Ю"]="Ju", ["ю"]="ju",
    ["Я"]="Ja", ["я"]="ja",
}

-- =========================================================
-- BULGARO
-- =========================================================

data.bg = {

    ["А"]="A", ["а"]="a",
    ["Б"]="B", ["б"]="b",
    ["В"]="V", ["в"]="v",
    ["Г"]="G", ["г"]="g",
    ["Д"]="D", ["д"]="d",
    ["Е"]="E", ["е"]="e",
    ["Ж"]="Ž", ["ж"]="ž",
    ["З"]="Z", ["з"]="z",
    ["И"]="I", ["и"]="i",
    ["Й"]="J", ["й"]="j",
    ["К"]="K", ["к"]="k",
    ["Л"]="L", ["л"]="l",
    ["М"]="M", ["м"]="m",
    ["Н"]="N", ["н"]="n",
    ["О"]="O", ["о"]="o",
    ["П"]="P", ["п"]="p",
    ["Р"]="R", ["р"]="r",
    ["С"]="S", ["с"]="s",
    ["Т"]="T", ["т"]="t",
    ["У"]="U", ["у"]="u",
    ["Ф"]="F", ["ф"]="f",
    ["Х"]="H", ["х"]="h",
    ["Ц"]="C", ["ц"]="c",
    ["Ч"]="Č", ["ч"]="č",
    ["Ш"]="Š", ["ш"]="š",
    ["Щ"]="Št", ["щ"]="št",
    ["Ъ"]="Ă", ["ъ"]="ă",
    ["Ь"]="J", ["ь"]="j",
    ["Ю"]="Ju", ["ю"]="ju",
    ["Я"]="Ja", ["я"]="ja",
}

-- =========================================================
-- GRECO ANTICO
-- =========================================================

data.grc = {

    ["α"]="a", ["Α"]="A",
    ["β"]="b", ["Β"]="B",
    ["γ"]="g", ["Γ"]="G",
    ["δ"]="d", ["Δ"]="D",

    ["ε"]="ĕ", ["Ε"]="Ĕ",
    ["ζ"]="z", ["Ζ"]="Z",
    ["η"]="ē", ["Η"]="Ē",
    ["θ"]="th", ["Θ"]="Th",

    ["ι"]="i", ["Ι"]="I",
    ["κ"]="k", ["Κ"]="K",
    ["λ"]="l", ["Λ"]="L",
    ["μ"]="m", ["Μ"]="M",

    ["ν"]="n", ["Ν"]="N",
    ["ξ"]="x", ["Ξ"]="X",
    ["ο"]="ŏ", ["Ο"]="Ŏ",
    ["π"]="p", ["Π"]="P",

    ["ρ"]="r", ["Ρ"]="R",
    ["σ"]="s", ["Σ"]="S",
    ["ς"]="s",

    ["τ"]="t", ["Τ"]="T",

    -- upsilon isolata
    ["υ"]="y", ["Υ"]="Y",

    ["φ"]="ph", ["Φ"]="Ph",
    ["χ"]="kh", ["Χ"]="Kh",

    ["ψ"]="ps", ["Ψ"]="Ps",

    ["ω"]="ō", ["Ω"]="Ō",
}

-- =========================================================
-- IOTA SOTTOSCRITTO
-- =========================================================

local iotaSubscript = {

    {"ᾳ","āi"},
    {"ῃ","ēi"},
    {"ῳ","ōi"},

    {"ᾷ","âi"},
    {"ῇ","êi"},
    {"ῷ","ôi"},
}

-- =========================================================
-- DITTONGHI GRECO ANTICO
-- =========================================================

local ancientDiphthongs = {

    {"αἰ","ai"},
    {"αἴ","aí"},
    {"αἲ","aì"},
    {"αἶ","aî"},
    {"αῖ","aî"},

    {"Αἰ","Ai"},
    {"Αἴ","Aí"},
    {"Αἲ","Aì"},
    {"Αἶ","Aî"},
    {"Αῖ","Aî"},

    {"αι","ai"},
    {"Αι","Ai"},

    {"εἰ","ei"},
    {"εἴ","eí"},
    {"εἲ","eì"},
    {"εἶ","eî"},
    {"εῖ","eî"},

    {"Εἰ","Ei"},
    {"Εἴ","Eí"},
    {"Εἲ","Eì"},
    {"Εἶ","Eî"},
    {"Εῖ","Eî"},

    {"ει","ei"},
    {"Ει","Ei"},

    {"οἰ","oi"},
    {"οἴ","oí"},
    {"οἲ","oì"},
    {"οἶ","oî"},
    {"οῖ","oî"},

    {"Οἰ","Oi"},
    {"Οἴ","Oí"},
    {"Οἲ","Oì"},
    {"Οἶ","Oî"},
    {"Οῖ","Oî"},

    {"οι","oi"},
    {"Οι","Oi"},

    {"οῦ","oû"},
    {"Οῦ","Oû"},

    {"οὖ","oû"},
    {"Οὖ","Oû"},

    {"ού","oú"},
    {"Ού","Oú"},

    {"οὺ","où"},
    {"Οὺ","Où"},

    {"οὐ","ou"},
    {"Οὐ","Ou"},

    {"ου","ou"},
    {"Ου","Ou"},
    {"ΟΥ","OU"},
}

-- =========================================================
-- GAMMA NASALE
-- =========================================================

local nasalGamma = {

    {"γγ","ng"},
    {"Γγ","Ng"},

    {"γκ","nk"},
    {"Γκ","Nk"},

    {"γξ","nx"},
    {"Γξ","Nx"},

    {"γχ","nkh"},
    {"Γχ","Nkh"},
}

-- =========================================================
-- GAMMA DOLCE COMPLETO
-- =========================================================

local softGamma = {

    {"γε","ghĕ"},
    {"γέ","ghé"},
    {"γὲ","ghè"},

    {"γη","ghē"},
    {"γή","ghé"},
    {"γὴ","ghè"},
    {"γῆ","ghê"},

    {"γι","ghi"},
    {"γί","ghí"},
    {"γὶ","ghì"},
    {"γῖ","ghî"},

    {"γο","ghŏ"},
    {"γό","ghó"},
    {"γὸ","ghò"},

    {"γυ","ghy"},
    {"γύ","ghý"},
    {"γὺ","ghỳ"},
    {"γῦ","ghŷ"},

    {"γω","ghō"},
    {"γώ","ghṓ"},
    {"γὼ","ghṑ"},
    {"γῶ","ghô"},

    {"Γε","Ghĕ"},
    {"Γέ","Ghé"},
    {"Γὲ","Ghè"},

    {"Γη","Ghē"},
    {"Γή","Ghé"},
    {"Γὴ","Ghè"},
    {"Γῆ","Ghê"},
}

-- =========================================================
-- ECCEZIONI LESSICALI
-- =========================================================

local specialGreek = {

    {"ὡς", "hos"},
    {"Ὥς", "Hos"},
}

-- =========================================================
-- POLITONICO COMPLETO
-- =========================================================

local polytonic = {

    {"ῥῦ", "rhŷ"},

    {"ῤ", "r"},
    {"ῥ", "rh"},
    {"Ῥ", "Rh"},

    {"ἀ","a"},
    {"ἐ","ĕ"},
    {"ἰ","i"},
    {"ὀ","ŏ"},
    {"ὐ","y"},
    {"ἠ","ē"},
    {"ὠ","ō"},

    {"ἁ","ha"},
    {"ἑ","hĕ"},
    {"ἱ","hi"},
    {"ὁ","hŏ"},
    {"ὑ","hy"},
    {"ἡ","hē"},
    {"ὡ","hō"},

    {"ἄ","á"},
    {"ἅ","há"},

    {"ἔ","é"},
    {"ἕ","hé"},

    {"ἤ","é"},
    {"ἥ","hé"},

    {"ἴ","í"},
    {"ἵ","hí"},

    {"ὄ","ó"},
    {"ὅ","hó"},

    {"ἆ","â"},
    {"ἇ","hâ"},

    {"ἦ","ê"},
    {"ἧ","hê"},

    {"ῶ","ô"},
    {"ὦ","ô"},
    {"ὧ","hô"},
}

-- =========================================================
-- APPLICA REGOLE
-- =========================================================

local function applyRules(text, rules)

    for _, rule in ipairs(rules) do

        local pattern = rule[1]
        local replacement = rule[2]

        text = mw.ustring.gsub(
            text,
            pattern,
            replacement
        )
    end

    return text
end

-- =========================================================
-- TRASLITTERAZIONE
-- =========================================================

local function transliterate(text, lang)

    local map = data[lang]

    if not map then
        return text
    end

    text = tostring(text)

    text = mw.text.decode(text)

    text = mw.ustring.toNFC(text)

    if lang == "grc" then

        text = applyRules(text, iotaSubscript)

        text = applyRules(text, ancientDiphthongs)

        text = applyRules(text, nasalGamma)

        text = applyRules(text, softGamma)

        text = applyRules(text, specialGreek)

        text = applyRules(text, polytonic)
    end

    local result = {}

    for char in mw.ustring.gcodepoint(text) do

        local c = mw.ustring.char(char)

        table.insert(
            result,
            map[c] or c
        )
    end

    return table.concat(result)
end

-- =========================================================
-- SOLO TRASLITTERAZIONE
-- =========================================================

function p.translit(frame)

    local lang = frame.args[1] or ""
    local text = frame.args[2] or ""

    return transliterate(text, lang)
end

-- =========================================================
-- VISUALIZZAZIONE COMPLETA
-- =========================================================

function p.show(frame)

    local lang = frame.args[1] or ""
    local text = frame.args[2] or ""

    local translit =
        transliterate(text, lang)

    return
        text ..
        " (" ..
        translit ..
        ")"
end

-- =========================================================
-- SHORTCUTS
-- =========================================================

function p.ru(frame)
    frame.args[1] = "ru"
    return p.show(frame)
end

function p.uk(frame)
    frame.args[1] = "uk"
    return p.show(frame)
end

function p.be(frame)
    frame.args[1] = "be"
    return p.show(frame)
end

function p.bg(frame)
    frame.args[1] = "bg"
    return p.show(frame)
end

function p.grc(frame)
    frame.args[1] = "grc"
    return p.show(frame)
end

return p