Moduuli:fi-verbi-taiv

Wikisanakirjasta

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:fi-verbi-taiv/ohje

local apu = require('Moduuli:Mallinetyokalut')
local kielilinkki = require('Moduuli:Kielilinkki')
local ttapu = require('Moduuli:Taivutustaulukkotyökalut')

local m = {}




local function sisaltaa_arvon(tab, val)
    for index, value in ipairs(tab) do
        if value == val then
            return true
        end
    end

    return false
end

--- Luo kuvaus-attribuutin tekstin sanan taivutusmuotojen nimistä.
-- @param sanan_ryhma: taulukko taivutusmuodoista, joita sanamuoto edustaa
function m.tee_linkki(sana)
    local sanan_ryhma = m.ryhmat[sana]
    
        if not sanan_ryhma or sisaltaa_arvon(sanan_ryhma, "1.inf") then
                return "'''" .. sana .. "'''"
        end
        
        -- Luodaan kuvaus-parametri yhdistämällä kaikkien samannäköisten muotojen nimet (aakkosjärjestyksessä).
        local taivutusmuodot = table.concat(sanan_ryhma, " ")
        
        if taivutusmuodot == "akt.pprees" 
                or taivutusmuodot == "pass.pprees"
                or taivutusmuodot == "akt.pperf" 
                or taivutusmuodot == "pass.pperf" 
                or taivutusmuodot:sub(1, 6) == "2.inf."
                or taivutusmuodot:sub(1, 10) == "3.inf.ins."
                or taivutusmuodot == "4.inf"
                or taivutusmuodot == "agpart"
                or taivutusmuodot == "agpart.neg" then
                        
                        return kielilinkki.linkki{ 
                                kieli = "fi", 
                                kohde = sana, 
                                kuvaus = "tm/fi/v/" .. taivutusmuodot, 
                        		['kuvaus-param'] = { 
                                	[8] = m.args['1.inf']
                        		}
                        }
                        
        elseif taivutusmuodot == "akt.pperf.mon" then
                
                -- Partisiipin perfektin monikolle (esim. lähteneet) tarvitaan yksikkömuoto (lähtenyt).
                return kielilinkki.linkki{ 
                        kieli = "fi", 
                        kohde = sana, 
                        kuvaus = "tm/*/v/akt.pperf.mon", 
                        ['kuvaus-param'] = { 
                                [8] = m.taivutusmuodot['akt.pperf']
                        }
                }
                
        elseif taivutusmuodot == "1.inf.pitkä" 
                or taivutusmuodot:sub(1, 5) == "5.inf" then
                
                -- 1. infinitiivin pitkälle muodolle ja 5. infinitiiville (esim. lähteäkseen, kiertämäisillään) 
                -- tarvitaan vartalo (lähteäkse, kiertämäsillä) ja vokaalisointu (lähteäksens_ä_, kiertämäsilläns_ä_).
                return kielilinkki.linkki{ 
                        kieli = "fi", 
                        kohde = sana, 
                        kuvaus = "tm/fi/v/" .. taivutusmuodot, 
                        ['kuvaus-param'] = { 
                                [8] = mw.ustring.gsub(sana, "[aeä]n$", ""),
                                [9] = m.args['vokaalisointu']
                        } 
                }
                
        elseif taivutusmuodot == "4.inf.part" then
                
                -- 4. infinitiivin partitiiville muodolle (esim. kiertämistä) tarvitaan nominatiivimuoto (kiertäminen).
                return kielilinkki.linkki{ 
                        kieli = "fi", 
                        kohde = sana, 
                        kuvaus = "tm/*/v/4.inf.part", 
                        ['kuvaus-param'] = { 
                                [8] = m.taivutusmuodot['4.inf.nom']
                        } 
                }
        else
                
        return kielilinkki.linkki{ 
                kieli = "fi", 
                kohde = sana, 
                kuvaus = "tm/*/v/" .. taivutusmuodot 
        }
        
        end
end


--- Tuottaa taivutustaulukon solun sisällön.
-- 
-- @param piilota:         Jos true tulostetaan soluun pelkkä n-viiva (–). Tämä asetetaan p-parametrin mukaan.
-- @param muoto:           Taivutusmuotoparametrin nimi, esim "3.inf.adess".
-- @param kuvausprefiksi:  generoitaviin kuvaus-kenttiin laitettava prefiksi, (esim. "tm/fi/v/").
--                         Kuvaus-teksti generoidaan automaattisesti kaikista samannäköisistä taivutusmuodoista
--                         yhdistämällä niiden nimet. Esim. jos { ["imp.y3"] = "ruoki", ["imp.kon"] = "ruoki" },
--                         ja prefiksi on "tm/fi/v/" niin kuvaus-kentän arvoksi tulee "tm/fi/v/imp.kon imp.y3"
--                         molempien "ruoki"-sanojen linkkeihin.
--
function m.solu(muoto, ei_kuvausta)

    local toissijaset = nil
    local ensisijaiset_muodot = m.taivutusmuodot[muoto]

    -- Viiva arvona estää muodon näyttämisen.
    if ensisijaiset_muodot and (ensisijaiset_muodot == "-" or ensisijaiset_muodot[1] == "-") then
        return "–"
    end

    -- Jos ohitusparametri on annettu muodolle, käytetään sitä.
    if m.args[muoto .. "!"] then
        return m.args[muoto .. "!"]
    end

    
    if not ensisijaiset_muodot or #ensisijaiset_muodot == 0 then
        return ""
    end
        
    
    if ohitus then
        return ohitus
    end

    -- Sulkuihin tulevat muodot.
    local toissijaiset_muodot = m.taivutusmuodot[muoto .. ":vanha"]

    
    
    -- Tehdään jokaisesta muodosta kielilinkki. Toissijaiset muodot kääritään lisäksi sulkuihin.
    -- Sen jälkeen yhdistetään kaikki laittamalla väleihin <br/>-elementit.
    
    if toissijaiset_muodot then
        local linkit_2s = apu.map(
            function (sana)
                if ei_kuvausta then
                        return '(' .. kielilinkki.linkki{ kieli = "fi" } .. ')'
                else
                        return '(' .. m.tee_linkki(sana) .. ')'
                end
            end,
            toissijaiset_muodot
        )
        
        toissijaiset = mw.text.listToText( linkit_2s, '<br/>', '<br/>')
    else
        toissijaiset = nil
    end


    
    local linkit_1s = apu.map(
        function (sana)
                if ei_kuvausta then
                        return kielilinkki.linkki{ kieli = "fi" }
                else
                        return m.tee_linkki(sana)
                end
        end,
        ensisijaiset_muodot
    )


    
    if toissijaiset then
        return mw.text.listToText( linkit_1s, '<br/>', '<br/>') .. "<br/>" .. toissijaiset
    else
        return mw.text.listToText( linkit_1s, '<br/>', '<br/>')
    end
end


function m.suodata_taivutusmuodot()

    if m.args.p == nil then
        -- pass
    elseif m.args.p ~= "" then
        m.taivutusmuodot["ind.prees.pass.kon"] = { "-" }  
        m.taivutusmuodot["1.inf.pitkä"]        = { "-" }
        m.taivutusmuodot["2.inf.iness.akt"]        = { "-" }
        m.taivutusmuodot["2.inf.iness.pass"]   = { "-" }
        m.taivutusmuodot["2.inf.ins"]          = { "-" }
        m.taivutusmuodot["3.inf.abess"]        = { "-" }
        m.taivutusmuodot["3.inf.adess"]        = { "-" }
        m.taivutusmuodot["3.inf.elat"]         = { "-" }
        m.taivutusmuodot["3.inf.ill"]          = { "-" }
        m.taivutusmuodot["3.inf.iness"]        = { "-" }
        m.taivutusmuodot["3.inf.ins.akt"]          = { "-" }
        m.taivutusmuodot["3.inf.ins.pass"]     = { "-" }
        m.taivutusmuodot["4.inf.nom"]          = { "-" }
        m.taivutusmuodot["4.inf.part"]         = { "-" }
        m.taivutusmuodot["5.inf"]              = { "-" }
        m.taivutusmuodot["agpart.neg"]        = { "-" }
        m.taivutusmuodot["agpart"]             = { "-" }
        m.taivutusmuodot["imp.m1p"]            = { "-" }
        m.taivutusmuodot["imp.m2p"]            = { "-" }
        m.taivutusmuodot["imp.pass"]           = { "-" }
        m.taivutusmuodot["imp.pass.kon"]       = { "-" }
        m.taivutusmuodot["imp.y2p"]            = { "-" }
        m.taivutusmuodot["imp.y2p.kon"]        = { "-" }        
        m.taivutusmuodot["ind.i.m1p"]          = { "-" }
        m.taivutusmuodot["ind.i.m2p"]          = { "-" }
        m.taivutusmuodot["ind.i.y1p"]          = { "-" }
        m.taivutusmuodot["ind.i.y2p"]          = { "-" }
        m.taivutusmuodot["ind.imperf.pass"]    = { "-" }
        m.taivutusmuodot["ind.p.m1p"]          = { "-" }
        m.taivutusmuodot["ind.p.m2p"]          = { "-" }
        m.taivutusmuodot["ind.p.y1p"]          = { "-" }
        m.taivutusmuodot["ind.p.y2p"]          = { "-" }
        m.taivutusmuodot["ind.prees.pass"]     = { "-" }
        m.taivutusmuodot["ind.prees.pass.kon"] = { "-" }
        m.taivutusmuodot["kond.m1p"]           = { "-" }
        m.taivutusmuodot["kond.m2p"]           = { "-" }
        m.taivutusmuodot["kond.pass"]          = { "-" }
        m.taivutusmuodot["kond.pass.kon"]      = { "-" }
        m.taivutusmuodot["kond.y1p"]           = { "-" }
        m.taivutusmuodot["kond.y2p"]           = { "-" }
        m.taivutusmuodot["pass.pperf"]         = { "-" }
        m.taivutusmuodot["pass.pprees"]        = { "-" }
        m.taivutusmuodot["pot.m1p"]            = { "-" }
        m.taivutusmuodot["pot.m2p"]            = { "-" }
        m.taivutusmuodot["pot.pass"]           = { "-" }
        m.taivutusmuodot["pot.pass.kon"]       = { "-" }
        m.taivutusmuodot["pot.y1p"]            = { "-" }
        m.taivutusmuodot["pot.y2p"]            = { "-" }
        
    elseif m.args.p == "y3" then
        
        m.taivutusmuodot["akt.pperf.mon"] = { "-" }
        m.taivutusmuodot["imp.kon"]       = { "-" }
        m.taivutusmuodot["imp.m3p"]       = { "-" }
        m.taivutusmuodot["ind.i.m3p"]     = { "-" }
        m.taivutusmuodot["ind.kon"]       = { "-" }
        m.taivutusmuodot["ind.p.m3p"]     = { "-" }
        m.taivutusmuodot["kond.kon"]      = { "-" }
        m.taivutusmuodot["kond.m3p"]      = { "-" }
        m.taivutusmuodot["pot.kon"]       = { "-" }
        m.taivutusmuodot["pot.m3p"]       = { "-" }
    end
    
    if m.args.trans == "-" then
        m.taivutusmuodot["agpart"] = { "-" }
    end
        
    if m.args.pprees == "-" then
        m.taivutusmuodot["akt.pprees"]  = { "-" }
        m.taivutusmuodot["pass.pprees"] = { "-" }
    end
        
    if m.args.pass == "-" then
        m.taivutusmuodot["2.inf.iness.pass"]   = { "-" }
        m.taivutusmuodot["3.inf.ins.pass"]     = { "-" }
        m.taivutusmuodot["imp.pass"]           = { "-" }
        m.taivutusmuodot["imp.pass.kon"]       = { "-" }
        m.taivutusmuodot["ind.imperf.pass"]    = { "-" }
        m.taivutusmuodot["ind.prees.pass"]     = { "-" }
        m.taivutusmuodot["ind.prees.pass.kon"] = { "-" }
        m.taivutusmuodot["kond.pass"]          = { "-" }
        m.taivutusmuodot["kond.pass.kon"]      = { "-" }
        m.taivutusmuodot["pass.pperf"]         = { "-" }
        m.taivutusmuodot["pass.pprees"]        = { "-" }
        m.taivutusmuodot["pot.pass"]           = { "-" }
        m.taivutusmuodot["pot.pass.kon"]       = { "-" }
    end
    
    if m.args.vahva == "-" then
        m.taivutusmuodot["imp.y2p"]     = { "-" }
        m.taivutusmuodot["imp.y2p.kon"] = { "-" }
        m.taivutusmuodot["ind.i.m1p"]   = { "-" }
        m.taivutusmuodot["ind.i.m2p"]   = { "-" }
        m.taivutusmuodot["ind.i.m3p"]   = { "-" }
        m.taivutusmuodot["ind.i.y1p"]   = { "-" }
        m.taivutusmuodot["ind.i.y2p"]   = { "-" }
        m.taivutusmuodot["ind.i.y3p"]   = { "-" }
        m.taivutusmuodot["ind.kon"]     = { "-" }
        m.taivutusmuodot["ind.p.m1p"]   = { "-" }
        m.taivutusmuodot["ind.p.m2p"]   = { "-" }
        m.taivutusmuodot["ind.p.m3p"]   = { "-" }
        m.taivutusmuodot["ind.p.y1p"]   = { "-" }
        m.taivutusmuodot["ind.p.y2p"]   = { "-" }
        m.taivutusmuodot["ind.p.y3p"]   = { "-" }
        m.taivutusmuodot["kond.kon"]    = { "-" }
        m.taivutusmuodot["kond.m1p"]    = { "-" }
        m.taivutusmuodot["kond.m2p"]    = { "-" }
        m.taivutusmuodot["kond.m3p"]    = { "-" }
        m.taivutusmuodot["kond.y1p"]    = { "-" }
        m.taivutusmuodot["kond.y2p"]    = { "-" }
        m.taivutusmuodot["kond.y3p"]    = { "-" }
    end
end




function m.Taivutustaulukko(frame)
    m.args = frame.args


    -- Poistetaan mahdolliset tyhjinä annetut parametrit.
    m.args = apu.poista_tyhjat(m.args)
    
    -- Taulukoidaan samannimiset parametrit, esim. jos on annettu useita eri muotoja ind.p.y3p-parametrille kaksi muotoa
    -- ["ind.p.y3p1"] = "x" ja ["ind.p.y3p2"] = "y", yhdistetään ne taulukoksi ["ind.p.y3p"] = { "x", "y" }.
    m.taivutusmuodot = apu.numeroidut_parametrit(m.args, {
                                                     "1.inf",
                                                     "1.inf.pitkä",             "1.inf.pitkä:vanha",
                                                     "2.inf.iness.akt",         "2.inf.iness.akt:vanha",
                                                     "2.inf.iness.pass",        "2.inf.iness.pass:vanha",
                                                     "2.inf.ins",               "2.inf.ins:vanha",
                                                     "3.inf.abess",             "3.inf.abess:vanha",
                                                     "3.inf.adess",             "3.inf.adess:vanha",
                                                     "3.inf.elat",              "3.inf.elat:vanha",
                                                     "3.inf.ill",               "3.inf.ill:vanha",
                                                     "3.inf.iness",             "3.inf.iness:vanha",
                                                     "3.inf.ins.akt",           "3.inf.ins.akt:vanha",
                                                     "3.inf.ins.pass",          "3.inf.ins.pass:vanha",
                                                     "4.inf.nom",               "4.inf.nom:vanha",
                                                     "4.inf.part",              "4.inf.part:vanha",
                                                     "5.inf",                   "5.inf:vanha",
                                                     "agpart.neg",              "agpart.neg:vanha",
                                                     "agpart",                  "agpart:vanha",
                                                     "akt.pperf",               "akt.pperf:vanha",
                                                     "akt.pprees",              "akt.pprees:vanha",
                                                     "imp.kon",                 "imp.kon:vanha",
                                                     "imp.m1p",                 "imp.m1p:vanha",
                                                     "imp.m2p",                 "imp.m2p:vanha",
                                                     "imp.m3p",                 "imp.m3p:vanha",
                                                     "imp.pass",                "imp.pass:vanha",
                                                     "imp.pass.kon",            "imp.pass.kon:vanha",
                                                     "imp.y2p",                 "imp.y2p:vanha",
                                                     "imp.y2p.kon",             "imp.y2p.kon:vanha",                                                 
                                                     "imp.y3p",                 "imp.y3p:vanha",
                                                     "akt.pperf.mon",           "akt.pperf.mon:vanha",
                                                     "ind.i.m1p",               "ind.i.m1p:vanha",
                                                     "ind.i.m2p",               "ind.i.m2p:vanha",
                                                     "ind.i.m3p",               "ind.i.m3p:vanha",
                                                     "ind.i.y1p",               "ind.i.y1p:vanha",
                                                     "ind.i.y2p",               "ind.i.y2p:vanha",
                                                     "ind.i.y3p",               "ind.i.y3p:vanha",
                                                     "ind.imperf.pass",         "ind.imperf.pass:vanha",
                                                     "ind.kon",                 "ind.kon:vanha",
                                                     "ind.p.m1p",               "ind.p.m1p:vanha",
                                                     "ind.p.m2p",               "ind.p.m2p:vanha",
                                                     "ind.p.m3p",               "ind.p.m3p:vanha",
                                                     "ind.p.y1p",               "ind.p.y1p:vanha",
                                                     "ind.p.y2p",               "ind.p.y2p:vanha",
                                                     "ind.p.y3p",               "ind.p.y3p:vanha",
                                                     "ind.prees.pass",          "ind.prees.pass:vanha",
                                                     "ind.prees.pass.kon",      "ind.prees.pass.kon:vanha",
                                                     "kond.kon",                "kond.kon:vanha",
                                                     "kond.m1p",                "kond.m1p:vanha",
                                                     "kond.m2p",                "kond.m2p:vanha",
                                                     "kond.m3p",                "kond.m3p:vanha",
                                                     "kond.pass",               "kond.pass:vanha",
                                                     "kond.pass.kon",           "kond.pass.kon:vanha",
                                                     "kond.y1p",                "kond.y1p:vanha",
                                                     "kond.y2p",                "kond.y2p:vanha",
                                                     "kond.y3p",                "kond.y3p:vanha",
                                                     "pass.pperf",              "pass.pperf:vanha",
                                                     "pass.pprees",             "pass.pprees:vanha",
                                                     "pot.kon",                 "pot.kon:vanha",
                                                     "pot.m1p",                 "pot.m1p:vanha",
                                                     "pot.m2p",                 "pot.m2p:vanha",
                                                     "pot.m3p",                 "pot.m3p:vanha",
                                                     "pot.pass",                "pot.pass:vanha",
                                                     "pot.pass.kon",            "pot.pass.kon:vanha",
                                                     "pot.y1p",                 "pot.y1p:vanha",
                                                     "pot.y2p",                 "pot.y2p:vanha",
                                                     "pot.y3p",                 "pot.y3p:vanha"                                              
    })

    -- Suodatetaan p-, pass-, ppart- ja trans-parametrien mukaisesti pois muodot joita ei haluta. P-parametri voi olla "", "y3" tai "3".
    m.suodata_taivutusmuodot()
    
    -- Luodaan ryhmät samannäköisten taivutusmuotojen mukaan.
    m.ryhmat = ttapu.ryhmittele_arvoittain(m.taivutusmuodot)


    return frame:expandTemplate{
        title = "fi-verbi-taiv",
        args = {
            -- Jos huutomerkillinen parametri on annettu, ohittaa se solu-funktiolla luodun.

            ["1.inf"]                   =  m.solu("1.inf"),
            ["1.inf.pitkä"]             =  m.solu("1.inf.pitkä"),
            ["2.inf.iness.akt"]         =  m.solu("2.inf.iness.akt"),
            ["2.inf.iness.pass"]        =  m.solu("2.inf.iness.pass"),
            ["2.inf.ins"]               =  m.solu("2.inf.ins"),
            ["3.inf.abess"]             =  m.solu("3.inf.abess"),
            ["3.inf.adess"]             =  m.solu("3.inf.adess"),
            ["3.inf.elat"]              =  m.solu("3.inf.elat"),
            ["3.inf.ill"]               =  m.solu("3.inf.ill"),
            ["3.inf.iness"]             =  m.solu("3.inf.iness"),
            ["3.inf.ins.akt"]           =  m.solu("3.inf.ins.akt"),
            ["3.inf.ins.pass"]          =  m.solu("3.inf.ins.pass"),
            ["4.inf.nom"]               =  m.solu("4.inf.nom"),
            ["4.inf.part"]              =  m.solu("4.inf.part"),
            ["5.inf"]                   =  m.solu("5.inf"),
            ["agpart.neg"]              =  m.solu("agpart.neg"),
            ["agpart"]                  =  m.solu("agpart"),
            ["akt.pperf"]               =  m.solu("akt.pperf"),
            ["akt.pprees"]              =  m.solu("akt.pprees"),
            ["imp.kon"]                 =  m.solu("imp.kon"),
            ["imp.m1p"]                 =  m.solu("imp.m1p"),
            ["imp.m2p"]                 =  m.solu("imp.m2p"),
            ["imp.m3p"]                 =  m.solu("imp.m3p"),
            ["imp.pass"]                =  m.solu("imp.pass"),
            ["imp.pass.kon"]            =  m.solu("imp.pass.kon"),
            ["imp.y2p"]                 =  m.solu("imp.y2p"),
            ["imp.y2p.kon"]             =  m.solu("imp.y2p.kon"),           
            ["imp.y3p"]                 =  m.solu("imp.y3p"),
            ["akt.pperf.mon"]           =  m.solu("akt.pperf.mon"),
            ["ind.i.m1p"]               =  m.solu("ind.i.m1p"),
            ["ind.i.m2p"]               =  m.solu("ind.i.m2p"),
            ["ind.i.m3p"]               =  m.solu("ind.i.m3p"),
            ["ind.i.y1p"]               =  m.solu("ind.i.y1p"),
            ["ind.i.y2p"]               =  m.solu("ind.i.y2p"),
            ["ind.i.y3p"]               =  m.solu("ind.i.y3p"),
            ["ind.imperf.pass"]         =  m.solu("ind.imperf.pass"),
            ["ind.kon"]                 =  m.solu("ind.kon"),
            ["ind.p.m1p"]               =  m.solu("ind.p.m1p"),
            ["ind.p.m2p"]               =  m.solu("ind.p.m2p"),
            ["ind.p.m3p"]               =  m.solu("ind.p.m3p"),
            ["ind.p.y1p"]               =  m.solu("ind.p.y1p"),
            ["ind.p.y2p"]               =  m.solu("ind.p.y2p"),
            ["ind.p.y3p"]               =  m.solu("ind.p.y3p"),
            ["ind.prees.pass"]          =  m.solu("ind.prees.pass"),
            ["ind.prees.pass.kon"]      =  m.solu("ind.prees.pass.kon"),
            ["kond.kon"]                =  m.solu("kond.kon"),
            ["kond.m1p"]                =  m.solu("kond.m1p"),
            ["kond.m2p"]                =  m.solu("kond.m2p"),
            ["kond.m3p"]                =  m.solu("kond.m3p"),
            ["kond.pass"]               =  m.solu("kond.pass"),
            ["kond.pass.kon"]           =  m.solu("kond.pass.kon"),
            ["kond.y1p"]                =  m.solu("kond.y1p"),
            ["kond.y2p"]                =  m.solu("kond.y2p"),
            ["kond.y3p"]                =  m.solu("kond.y3p"),
            ["pass.pperf"]              =  m.solu("pass.pperf"),
            ["pass.pprees"]             =  m.solu("pass.pprees"),
            ["pot.kon"]                 =  m.solu("pot.kon"),
            ["pot.m1p"]                 =  m.solu("pot.m1p"),
            ["pot.m2p"]                 =  m.solu("pot.m2p"),
            ["pot.m3p"]                 =  m.solu("pot.m3p"),
            ["pot.pass"]                =  m.solu("pot.pass"),
            ["pot.pass.kon"]            =  m.solu("pot.pass.kon"),
            ["pot.y1p"]                 =  m.solu("pot.y1p"),
            ["pot.y2p"]                 =  m.solu("pot.y2p"),
            ["pot.y3p"]                 =  m.solu("pot.y3p"),

            ["p"]     =  m.args["p"],
            ["huom4"] =  m.args["huom4"],

            ['vart.vok']  = m.args['vart.vok'],
            ['vart.heik'] = m.args['vart.heik'],
            ['vart.vah']  = m.args['vart.vah'],
            ['vart.kons'] = m.args['vart.kons'],

        }
    }
end


return m