Modul:Verb: Unterschied zwischen den Versionen

Aus KGS-Wiki
(Futur 2)
K (Typo)
Zeile 231: Zeile 231:
         setIfPossible(formen[KONJ_AKT], person, perf .. 'isse' .. MST[person])
         setIfPossible(formen[KONJ_AKT], person, perf .. 'isse' .. MST[person])
         setIfPossible(formen[IND_PASS], person, ppp .. endungen[person] .. ' era' .. MST[person])
         setIfPossible(formen[IND_PASS], person, ppp .. endungen[person] .. ' era' .. MST[person])
         setIfPossible(formen[KONJ_PASS],person, ppp .. endungen[perdon] .. ' esse' .. MST[person])
         setIfPossible(formen[KONJ_PASS],person, ppp .. endungen[person] .. ' esse' .. MST[person])
     end
     end
     return formen
     return formen

Version vom 11. Mai 2024, 20:00 Uhr

Dieses Modul erzeugt lateinische Konjugationstabellen aus gegebenen Stämmen.

💬
Beispiel
  • {{subst:#invoke:Verb|render|dare|20|da|ded|28|dat|47|PraesGV=AP|PerfGV=AP}} für ein Vollverb mit Aktiv und Passiv in Präsens- und Perfektstämmen
  • {{subst:#invoke:Verb|render|sequi||sequ|||secut||PraesGV=P|PerfGV=P}} für ein Deponens
  • {{subst:#invoke:Verb|render|gaudere|4|gaude|||gavis||PraesGV=AP|PerfGV=P}} für ein Semideponens, das in Perfektstämmen nur Passivformen bildet
  • {{subst:#invoke:Verb|render|facere|17|faci|fec|27|||PraesGV=A|PerfGV=A}} für ein Defectivum, das nur aktivische Formen bildet.
Erläuterung
{{subst: Immer nur mit subst einbinden, damit die Formen im Seitenquelltext landen und für die Suchfunktion auffindbar sind.
#invoke:Verb| Name des Moduls
render| rufe die Funktion render auf
irrumare| Infinitiv
0| Optional: Lektion, in der der Infinitiv eingeführt wurde
irruma| Präsensstamm
irrumav| Perfektstamm
0| Optional: Lektion, in der der Perfektstamm eingeführt wurde
irrumat| Stamm des PPP
0| Optional: Lektion, in der das PPP eingeführt wurde
PraesGV=AP Optional: Verfügbare Genera verbi in den präsentischen Zeiten.
Erlaubte Werte
  • AP: Verb bildet Aktiv- und Passivformen (Standard)
  • A: Verb bildet nur Aktivformen
  • P: Verb bildet nur Passivformen (Deponens)
PerfGV=AP}} Optional: Verfügbare Genera verbi in den perfektischen Zeiten.
Erlaubte Werte
  • AP: Verb bildet Aktiv- und Passivformen (Standard)
  • A: Verb bildet nur Aktivformen
  • P: Verb bildet nur Passivformen (Deponens)
👉
Hinweis

Dieses Modul sollte immer mit subst: eingebunden werden, damit alle Formen im durchsuchbaren Seitenquelltext landen und eine Suche nach dem auch zu dare führt.


local p = {}

local IND_AKT  = 1
local KONJ_AKT = 2
local IND_PASS = 3
local KONJ_PASS= 4
local IMPERATIV= 5
local PERSONEN = {'1. Person Singular', '2. Person Singular', '3. Person Singular';
                  '1. Person Plural',   '2. Person Plural',   '3. Person Plural'}
local MODI = {}
MODI[IND_AKT]  = "Indikativ Aktiv"
MODI[KONJ_AKT] = "Konjunktiv Aktiv"
MODI[IND_PASS] = "Indikativ Passiv"
MODI[KONJ_PASS]= "Konjunktiv Passiv"
MODI[IMPERATIV]= "Imperativ"
local PRAES = 1
local PERF = 2
local OST = {'o', 's', 't', 'mus', 'tis', 'nt'}
local MST = {'m', 's', 't', 'mus', 'tis', 'nt'}
local ORRISTUR = {'or', 'ris', 'tur', 'mur', 'mini', 'ntur'}
local RRISTUR = {'r', 'ris', 'tur', 'mur', 'mini', 'ntur'}


function init(frame)
    return {
        inf    = frame.args[1] or frame:getParent().args[1] or 'Infinitiv';
        praes  = frame.args[2] or frame:getParent().args[2] or 'Präsensstamm + ';
        perf   = frame.args[3] or frame:getParent().args[3] or 'Perfektstamm + ';
        ppp    = frame.args[4] or frame:getParent().args[4] or 'PPP-Stamm + ';
        praesGV= frame.args.PraesGV or frame:getParent().args.PraesGV or 'AP';
        perfGV = frame.args.PraesGV or frame:getParent().args.PerfGV or 'AP';
    }
end

function renderTemplate(frame, name, params)
	local templateText
	if mw.isSubsting() then
		table.sort(params)
		templateText = '{{' .. name
		for k,v in pairs(params) do
			templateText = templateText .. '|' .. k .. '=' .. v
		end
		templateText = templateText .. '}}'
	else
		templateText = frame:expandTemplate({title=name, args=params})
	end
	return templateText 
end

function bildeInfinitive(params)
	local inf = params.inf
	local praes = params.praes
	local perf = params.perf
	local ppp = params.ppp
	local formen = {{},{}}
	formen[PRAES][IND_AKT] = inf
	if inf:match(praes:sub(-1,-1) .. "r[ei]$") then
		formen[PRAES][IND_PASS] = praes .. "ri"
	elseif praes:match("i$") then
		formen[PRAES][IND_PASS] = praes
	else 
		formen[PRAES][IND_PASS] = praes .. "i"
	end
	formen[PERF][IND_AKT] = perf .. "isse"
	formen[PERF][IND_PASS] = ppp .. "us/a/um esse"
	return formen
end

function bildePraesens(params)
    local praes = params.praes
    local formen = createFormTable(params.praesGV)
    local endungen = {}
    endungen[IND_AKT]  = OST
    endungen[KONJ_AKT] = MST
    endungen[IND_PASS] = ORRISTUR
    endungen[KONJ_PASS]= RRISTUR
    formen[IMPERATIV] = {}
    if not praes:match("[aei]$") then
        for person = 1, 6, 1 do
            setIfPossible(formen[IND_AKT],  person, praes .. 'i' .. endungen[IND_AKT][person])
            setIfPossible(formen[IND_PASS], person, praes .. 'i' .. endungen[IND_PASS][person])
            setIfPossible(formen[KONJ_AKT], person, praes .. 'a' .. endungen[KONJ_AKT][person])
            setIfPossible(formen[KONJ_PASS],person, praes .. 'a' .. endungen[KONJ_PASS][person])
        end
        setIfPossible(formen[IND_AKT],  1, praes .. 'o')
        setIfPossible(formen[IND_PASS], 1, praes .. 'or')
        setIfPossible(formen[IND_PASS], 2, praes .. 'eris')
        setIfPossible(formen[IND_AKT],  6, praes .. 'unt')
        setIfPossible(formen[IND_PASS], 6, praes .. 'untur')
    end
    if praes:match("a$") then
        setIfPossible(formen[IND_AKT],  1, praes:sub(1,-2) .. 'o')
        setIfPossible(formen[IND_PASS], 1, praes:sub(1,-2) .. 'or')
        setIfPossible(formen[KONJ_AKT], 1, praes:sub(1,-2) .. 'em')
        setIfPossible(formen[KONJ_PASS],1, praes:sub(1,-2) .. 'er')
        for person = 2, 6, 1 do
            setIfPossible(formen[IND_AKT],  person, praes .. endungen[IND_AKT][person])
            setIfPossible(formen[IND_PASS], person, praes .. endungen[IND_PASS][person])
            setIfPossible(formen[KONJ_AKT], person, praes:sub(1,-2) .. 'e' .. endungen[KONJ_AKT][person])
            setIfPossible(formen[KONJ_PASS],person, praes:sub(1,-2) .. 'e' .. endungen[KONJ_PASS][person])
        end
    end
    if praes:match("[ei]$") then
        for person = 1, 6, 1 do
            setIfPossible(formen[IND_AKT],  person, praes .. endungen[IND_AKT][person])
            setIfPossible(formen[IND_PASS], person, praes .. endungen[IND_PASS][person])
            setIfPossible(formen[KONJ_AKT], person, praes .. 'a' .. endungen[KONJ_AKT][person])
            setIfPossible(formen[KONJ_PASS],person, praes .. 'a' .. endungen[KONJ_PASS][person])
        end
        if not praes:match("e$") then
            setIfPossible(formen[IND_AKT],  6, praes .. 'unt')
            setIfPossible(formen[IND_PASS], 6, praes .. 'untur')
        end
    end
    if params.praesGV:match("A") then
    	if praes:match("[aei]$") then
    		setIfPossible(formen[IMPERATIV],2, praes .. "!")
    		setIfPossible(formen[IMPERATIV],5, praes .. "te!")
    	else
    		setIfPossible(formen[IMPERATIV],2, praes .. "e!")
    		setIfPossible(formen[IMPERATIV],5, praes .. "ite!")
    	end
    else
    	if praes:match("[aei]$") then
    		setIfPossible(formen[IMPERATIV],2, praes .. "re!")
    		setIfPossible(formen[IMPERATIV],5, praes .. "mini!")
    	else
    		setIfPossible(formen[IMPERATIV],2, praes .. "ere!")
    		setIfPossible(formen[IMPERATIV],5, praes .. "imini!")
    	end
    end
    return formen
end

function bildeImperfekt(params)
    local inf = params.inf
    local praes = params.praes
    local formen = createFormTable(params.praesGV)
    local endungen = {}
    endungen[IND_AKT]  = MST
    endungen[KONJ_AKT] = MST
    endungen[IND_PASS] = RRISTUR
    endungen[KONJ_PASS]= RRISTUR

    local ind_stamm = praes .. 'ba'
    local konj_stamm = inf
    if not praes:match("[ae]$") then
        ind_stamm = praes .. 'eba'
    end
    
    if not inf:match("r[ei]$") then
        konj_stamm = praes .. 'ere'
    end
    if inf:match("ri$") then
        konj_stamm = praes .. 're'
    end
    local staemme = {}
    staemme[IND_AKT]  = ind_stamm
    staemme[IND_PASS] = ind_stamm
    staemme[KONJ_AKT] = konj_stamm
    staemme[KONJ_PASS]= konj_stamm
    for person = 1, 6, 1 do
    	for tm,_ in pairs(formen) do
            setIfPossible(formen[tm], person, staemme[tm] .. endungen[tm][person])
        end
    end
    return formen
end

function bildeFuturI(params)
    local praes = params.praes
    local formen = {}
    local endungen = {}
    endungen[IND_AKT]  = MST
    endungen[IND_PASS] = RRISTUR
    if params.praesGV:match("A") then
        formen[IND_AKT]  = {}
    end
    if params.praesGV:match("P") then
        formen[IND_PASS] = {}
    end
    if praes:match("[ae]$") then
        setIfPossible(formen[IND_AKT],  1, praes .. 'bo')
        setIfPossible(formen[IND_PASS], 1, praes .. 'bor')
        for person = 2, 5, 1 do
        	for tm,_ in pairs(formen) do
                setIfPossible(formen[tm], person, praes .. 'bi' .. endungen[tm][person])
            end
        end
        setIfPossible(formen[IND_PASS], 2, praes .. 'beris')
        setIfPossible(formen[IND_AKT],  6, praes .. 'bunt')
        setIfPossible(formen[IND_PASS], 6, praes .. 'buntur')
    else
        setIfPossible(formen[IND_AKT],  1, praes .. 'am')
        setIfPossible(formen[IND_PASS], 1, praes .. 'ar')
        for person = 2, 6, 1 do
        	for m,_ in pairs(formen) do
                setIfPossible(formen[m], person, praes .. 'e' .. endungen[m][person])
            end
        end
    end
    return formen
end

function bildePerfekt(params)
    local perf = params.perf
    local ppp = params.ppp
    local formen = createFormTable(params.perfGV)
    local endungen = {}
    endungen[IND_AKT]  = {'i', 'isti', 'it', 'imus', 'istis', 'erunt'}
    endungen[KONJ_AKT] = MST
    endungen[IND_PASS] = {'us/a/um sum', 'us/a/um es', 'us/a/um est', 'i/ae/a sumus', 'i/ae/a estis', 'i/ae/a sunt'}
    endungen[KONJ_PASS]= {'us/a/um sim', 'us/a/um sis', 'us/a/um sit', 'i/ae/a simus', 'i/ae/a sitis', 'i/ae/a sint'}
    for person = 1, 6, 1 do
        setIfPossible(formen[IND_AKT], person, perf .. endungen[IND_AKT][person])
        setIfPossible(formen[KONJ_AKT], person, perf .. 'eri' .. endungen[KONJ_AKT][person])
        setIfPossible(formen[IND_PASS], person, ppp .. endungen[IND_PASS][person])
        setIfPossible(formen[KONJ_PASS], person, ppp .. endungen[KONJ_PASS][person])
    end
    return formen
end

function bildePlusquamperfekt(params)
    local perf = params.perf
    local ppp = params.ppp
    local formen = createFormTable(params.perfGV)
    local endungen = {'us/a/um', 'us/a/um', 'us/a/um', 'i/ae/a', 'i/ae/a', 'i/ae/a'}
  
    for person = 1, 6, 1 do
        setIfPossible(formen[IND_AKT],  person, perf .. 'era' .. MST[person])
        setIfPossible(formen[KONJ_AKT], person, perf .. 'isse' .. MST[person])
        setIfPossible(formen[IND_PASS], person, ppp .. endungen[person] .. ' era' .. MST[person])
        setIfPossible(formen[KONJ_PASS],person, ppp .. endungen[person] .. ' esse' .. MST[person])
    end
    return formen
end

function bildeFuturII(params)
    local perf = params.perf
    local ppp = params.ppp
    local formen = {}
    local endungen = {'us/a/um', 'us/a/um', 'us/a/um', 'i/ae/a', 'i/ae/a', 'i/ae/a'}
  
    if params.perfGV:match("A") then
        formen[IND_AKT] = {}
    end
    if params.perfGV:match("P") then
    	formen[IND_PASS] = {}
    end
    for person = 1, 6, 1 do
        setIfPossible(formen[IND_AKT],  person, perf .. 'eri' .. MST[person])
        setIfPossible(formen[IND_PASS], person, ppp .. endungen[person] .. ' eri' .. MST[person])
    end
    
    setIfPossible(formen[IND_AKT],  1, perf .. 'ero')
    setIfPossible(formen[IND_PASS], 1, ppp .. 'us/a/um ero')
    setIfPossible(formen[IND_PASS], 6, ppp .. 'i/ae/a erunt')
    return formen
end

function renderInfinitive(formen, praesGV, perfGV)
	local table = ""
	table = table .. '{| class="wikitable mw-collapsible"\n'
	table = table .. '|+ [[Infinitiv]]e\n! !! Aktiv'
	if praesGV == "AP" or perfGV == "AP" then
		table = table .. ' !! Passiv'
	end
	table = table .. '\n|-\n! Präsens\n'
	if praesGV:match("A") then
		table = table .. ' || ' .. enclose(formen[PRAES][IND_AKT])
	end
	if praesGV:match("P") then
		table = table .. ' || ' .. enclose(formen[PRAES][IND_PASS])
	end
	table = table .. '\n|-\n! Perfekt\n'
	if perfGV:match("A") then
		table = table .. ' || ' .. enclose(formen[PERF][IND_AKT])
	end
	if perfGV:match("P") then
		table = table .. ' || ' .. enclose(formen[PERF][IND_PASS])
	end
	table = table .. '\n|}\n'
	return table
end

function render(tempus, formen)
    local table = ''
    table = table .. '{| class="wikitable mw-collapsible"\n'
    table = table .. '|+ ' .. tempus .. '\n! Person'
    for k,_ in pairs(formen) do
    	table = table .. ' !! ' .. MODI[k]
    end
    table = table .. '\n|-\n'
    for person = 1, 6, 1 do
        table = table .. '! ' .. PERSONEN[person] .. '\n'
        for tm,_ in pairs(formen) do
            table = table .. ' || ' .. enclose(formen[tm][person])
        end
        table = table .. '\n|-\n'
    end
    table = table .. '|}'
    return table
end

function enclose(text)
    return tostring(mw.html.create('span'):attr('lang', 'la'):wikitext(text))
end

function setIfPossible(maybeArray,index,value)
	if maybeArray then
		maybeArray[index] = value
	end
end

function createFormTable(gv)
	local formen = {}
	if gv:match("A") then
    	formen[IND_AKT] = {}
    	formen[KONJ_AKT] = {}
    end
    if gv:match("P") then
    	formen[IND_PASS] = {}
    	formen[KONJ_PASS] = {}
    end
    return formen
end

function p.render(frame)
	local tables = ""
    params = init(frame)
    if params.praesGV:match('A') then
        praesTemp = 1
    else
        praesTemp = 3
    end
    if params.perfGV:match('A') then
        perfTemp = 1
    else
        perfTemp = 3
    end
    infinitive = bildeInfinitive(params)
    praesens = bildePraesens(params)
    perfekt = bildePerfekt(params)
    if not mw.isSubsting() then
    	tables = tables .. renderTemplate(frame, "Achtung", {"Dieses Modul sollte nur mit <code>{{subst:#invoke:Verb|...}}</code> eingebunden werden! "})
    end
    tables = tables .. "{{DISPLAYTITLE:" .. params.inf .. "}}\n"
    tables = tables .. renderTemplate(frame, "Thumbnailbox", {INHALT= renderTemplate(frame, "Wortwolke", {params.inf, ""})}) .. "\n"
    tables = tables .. ";[[Stammformen]]: " .. enclose(params.inf) .. ", " .. enclose(praesens[praesTemp][1]) .. ", " .. enclose(perfekt[perfTemp][1])
    if not params.ppp:match("PPP") and params.perfGV == "AP" then
        tables = tables .. ", " .. enclose(params.ppp ..
 "um")
    end
    tables = tables .. '\n\n'
    tables = tables .. ";Bedeutungen\n\n"
    tables = tables .. ";Feste Wendungen\n\n"
    tables = tables .. ";Aufbau\n\n"
    tables = tables .. ";Verwandte Wörter\n\n"
    tables = tables .. ";In anderen Sprachen\n\n"
    tables = tables .. "== Infinite Formen ==\n\n"
    tables = tables .. renderInfinitive(infinitive, params.praesGV, params.perfGV)
    tables = tables .. "== Formen mit Präsensstamm ==\n\n"
    tables = tables .. render('[[Präsens]]', praesens)
    tables = tables .. '\n\n'
    tables = tables .. render('[[Imperfekt]]', bildeImperfekt(params))
    tables = tables .. '\n\n'
    tables = tables .. render('[[Futur I]]', bildeFuturI(params))
    tables = tables .. '\n\n'
    tables = tables .. "== Formen mit Perfektstamm/PPP ==\n\n"
    tables = tables .. render('[[Perfekt]]', perfekt)
    tables = tables .. '\n\n'
    tables = tables .. render('[[Plusquamperfekt]]', bildePlusquamperfekt(params))
    tables = tables .. '\n\n'
    tables = tables .. render('[[Futur II]]', bildeFuturII(params))
    tables = tables .. '\n\n'
    tables = tables .. "== Weblinks ==\n\n"
    tables = tables .. "* " .. renderTemplate(frame, 'Navigium', {params.inf}) .. "\n"
    tables = tables .. "* " .. renderTemplate(frame, "Georges", {praesens[praesTemp][1]}) .. "\n"
    tables = tables .. "[[Kategorie:Verb (Latein)/" .. params.inf:sub(0,1) .. "]]"
    return tables
end

function p.parseArray(frame)
	res = {}
    for k, v in string.gmatch(frame.args[1], "([^,]+):([^,]+)") do
    	res[k] = v
    end
	return mw.af.export(res)
end

return p