Siirry sisältöön

Moduuli:Ety

Wikisanakirjasta

local m = {}

local mt = require('Moduuli:Mallinetyokalut')
local luokittelu = require('Moduuli:luokittelu')
local kielikoodit = require('Moduuli:kielikoodit')
local data = mw.loadData('Moduuli:Ety/taulukot')

local etykielet = data['etykielet']
local sukulaisuus = data['sukulaisuudet']


function m.juontuu(kieli, kanta)
    return sukulaisuus[kieli .. ':' .. kanta] or false
end


local function etykielen_genetiivi(tunnus)
    local rivi = etykielet[tunnus]
    if rivi then
        return rivi[2]
    end

    return nil
end


local function kielen_genetiivi(tunnus)
    local gen = kielikoodit.genetiivi_tunnukselle(tunnus, false)
    if gen then
        return gen
    end

    return etykielen_genetiivi(tunnus)
end


local function kielen_partitiivi(tunnus)
    local part = kielikoodit.partitiivissa(tunnus, false)
    if part then
        return part
    end

    local rivi = etykielet[tunnus]
    if rivi then
        return rivi[3]
    end

    return nil
end

local function kielen_nimi(tunnus)
    local part = kielikoodit.nimi(tunnus, false)
    if part then
        return part
    end

    local rivi = etykielet[tunnus]
    if rivi then
        return rivi[1]
    end

    return nil
end
local function kielen_elatiivi(tunnus)
    local gen = kielen_genetiivi(tunnus)
    if not gen then
        error("Genetiiviä ei löydy: " .. tunnus)
        return nil
    end

    local part = kielen_partitiivi(tunnus)
    if not part then
        error("Kielikoodille ei löydy partitiivia: " .. tunnus)
    end

    local part_parts = mw.text.split( part, " " )
    local voksos = mt.map(function(part) return mw.ustring.match( part, "[aä]$" ) end, part_parts)
    local gen_parts = mw.text.split( gen, " " )

    local gens = mt.map2(
        function(gen, vokso)
            if vokso == "ä" then
                return mw.ustring.gsub( gen, "n$", "stä" )
            else
                return mw.ustring.gsub( gen, "n$", "sta" )
            end
        end, gen_parts, voksos)

    return table.concat(gens, " ")
end


local function lainateksti(kanta)
    return "lainat " .. kielen_elatiivi(kanta)
end


local function juontuuteksti(kanta)
    return kielen_elatiivi(kanta) .. " juontuvat sanat"
end



function m.Ety(frame)
    local pframe = frame:getParent()

    local kieli = pframe.args[1]
    local kanta = pframe.args[2]

    if m.juontuu(kieli, kanta) then
        return juontuuteksti(kanta)
    end

    return lainateksti(kanta)
end

local function onKieliTaiEtyKieli(ehkaKielikoodi)
    if kielen_genetiivi(ehkaKielikoodi) then
        return true
    end

    return false
end

function m.OnKieliTaiEtyKieli(frame)
    --local pframe = frame:getParent()
    local ehkaKielikoodi = frame.args[1]

    if onKieliTaiEtyKieli(ehkaKielikoodi) then
        return "juu"
    end
    return ""
end

-- Ei palauta mitään, jos parametri 2 ei ole kieli tai etykieli.
function m.EhkaLainaTaiJuontuuLuokka(frame)

    local pframe = frame:getParent()
    local kohde = pframe.args[1]
    local lahde = pframe.args[2]

    if not onKieliTaiEtyKieli(lahde) then
        return ""
    end

    if m.juontuu(kohde, lahde) then
        luokittelu.asetaAakkostajalla(kohde, luokittelu.kielenLuokka(kohde, juontuuteksti(lahde)))
    else
        luokittelu.asetaAakkostajalla(kohde, luokittelu.kielenLuokka(kohde, lainateksti(lahde)))
    end

    return luokittelu
end

function m.LainaTaiJuontuuTeksti(frame)
    local pframe = frame:getParent()
    local kohde = pframe.args[1]
    local lahde = pframe.args[2]

    local nimi = kielen_nimi(lahde)
    local gen = kielikoodit.genetiivi_tunnukselle(lahde, false)

    if gen then
        return "[[" .. nimi .. "|" .. gen .. "]] sanasta " .. frame:expandTemplate{
            title = 'termi+',
            args = {
                lahde,
                pframe.args[3],
                pframe.args[5],
                lat = pframe.args.lat,
                merkitys = pframe.args[4],
            }
        }
    end

    return "[[" .. nimi .. "|" .. etykielen_genetiivi(lahde) .. "]] ''" .. pframe.args[3] .. "''"
end

return m