
-- Questo modulo contiene il codice per il template:La-decl, che genera la tabella di declinazione dei sostantivi in latino
-- La funzione ladecl genera la tabella di coniugazione utilizzando i parametri passati dal template

p = {}

function p.ladecl(frame)
    pframe = frame:getParent()
    config = frame.args
    args = pframe.args
-- Argomenti passati dal template
    stem = args[1] -- radice del nominativo, obbligatorio, va inserito con gli eventuali accenti di breve e di lunga (ă, ā...)
    stem2 = p.nodiacritic(stem) -- uguale alla precedente, ma automaticamente "pulita" degli accenti dalla funzione nodiacritic
    stem_gen = args[2] -- radice del genitivo, obbligatorio, va inserito con gli eventuali accenti di breve e di lunga (ă, ā...)
    stem_gen2 = p.nodiacritic(stem_gen) -- uguale alla precedente, ma automaticamente "pulita" degli accenti dalla funzione nodiacritic
    decl = config["decl"] -- specifica la declinazione (1, 2, 2-us eccetera), obbligatorio E deve essere uno di quelli specificati sotto
-- Inizializzazione di tutte le variabili interne, che potrebbero altrimenti risultare nulle
    nom1s = ""; nom1p = ""; 
    gen1s = ""; gen1p = "";
    dat1s = ""; dat1p = "";
    acc1s = ""; acc1p = "";
    voc1s = ""; voc1p = "";
    abl1s = ""; abl1p = "";
    titolo = ""
    nom2s = ""
-- per semplificare il template quando la radice del nominativo e del genitivo sono uguali (è possibile lasciare il secondo parametro vuoto):
	if args[2] < "a" then stem_gen = stem; stem_gen2 = stem2 end
-- Costruzione delle forme flesse per ciascuna declinazione:
    if (decl == "1") or (decl == "1-a") then --PRIMA DECLINAZIONE
        nom1s = p.wiki(stem2 .. "a", stem.. "ă"); nom1p = p.wiki(stem2 .. "ae", stem.. "ae") -- nominativo
        gen1s = p.wiki(stem_gen2 .. "ae", stem_gen.. "ae"); gen1p = p.wiki(stem_gen2 .. "arum", stem_gen.. "ārum") -- genitivo
        dat1s = p.wiki(stem_gen2 .. "ae", stem_gen.. "ae"); dat1p = p.wiki(stem_gen2 .. "is", stem_gen.. "ĭs") -- dativo
        acc1s = p.wiki(stem_gen2 .. "am", stem_gen.. "ăm"); acc1p = p.wiki(stem_gen2 .. "as", stem_gen.. "ās") --accusativo
        voc1s = p.wiki(stem2 .. "a", stem.. "ă"); voc1p = p.wiki(stem_gen2 .. "ae", stem_gen.. "ae") -- vocativo
        abl1s = p.wiki(stem_gen2 .. "a", stem_gen.. "ā"); abl1p = p.wiki(stem_gen2 .. "is", stem_gen.. "ĭs") -- ablativo
        titolo = "''Prima declinazione''" -- titolo della tabella
    elseif (decl == "2") or (decl == "2-us") then --SECONDA DECLINAZIONE (-us)
        nom1s = p.wiki(stem2 .. "us", stem.. "ŭs"); nom1p = p.wiki(stem_gen2 .. "i", stem_gen.. "ī") -- nominativo
        gen1s = p.wiki(stem_gen2 .. "i", stem_gen.. "ī"); gen1p = p.wiki(stem_gen2 .. "orum", stem_gen.. "ōrŭm") -- genitivo
        dat1s = p.wiki(stem_gen2 .. "o", stem_gen.. "ō"); dat1p = p.wiki(stem_gen2 .. "is", stem_gen.. "īs") -- dativo
        acc1s = p.wiki(stem_gen2 .. "um", stem_gen.. "ŭm"); acc1p = p.wiki(stem_gen2 .. "os", stem_gen.. "ōs") --accusativo
        voc1s = p.wiki(stem2 .. "e", stem_gen.. "ē"); voc1p = p.wiki(stem_gen2 .. "i", stem_gen.. "ī") -- vocativo
        abl1s = p.wiki(stem_gen2 .. "o", stem_gen.. "ō"); abl1p = p.wiki(stem_gen2 .. "is", stem_gen.. "īs") -- ablativo
        titolo = "''Seconda declinazione''" -- titolo della tabella
	elseif (decl == "2-r") then --SECONDA DECLINAZIONE (-r)
        nom1s = p.wiki(stem2, stem); nom1p = p.wiki(stem_gen2 .. "i", stem_gen.. "ī") -- nominativo
        gen1s = p.wiki(stem_gen2 .. "i", stem_gen.. "ī"); gen1p = p.wiki(stem_gen2 .. "orum", stem_gen.. "ōrŭm") -- genitivo
        dat1s = p.wiki(stem_gen2 .. "o", stem_gen.. "ō"); dat1p = p.wiki(stem_gen2 .. "is", stem_gen.. "īs") -- dativo
        acc1s = p.wiki(stem_gen2 .. "um", stem_gen.. "ŭm"); acc1p = p.wiki(stem_gen2 .. "os", stem_gen.. "ōs") --accusativo
        voc1s = p.wiki(stem2, stem); voc1p = p.wiki(stem_gen2 .. "i", stem_gen.. "ī") -- vocativo
        abl1s = p.wiki(stem_gen2 .. "o", stem_gen.. "ō"); abl1p = p.wiki(stem_gen2 .. "is", stem_gen.. "īs") -- ablativo
        titolo = "''Seconda declinazione,</br>nominativo in -r''" -- titolo della tabella
        elseif (decl == "2-n") or (decl == "2-um") then --SECONDA DECLINAZIONE, NEUTRO
        nom1s = p.wiki(stem2 .. "um", stem .. "ŭm"); nom1p = p.wiki(stem_gen2 .. "a", stem_gen.. "ă") -- nominativo
        gen1s = p.wiki(stem_gen2 .. "i", stem_gen.. "ī"); gen1p = p.wiki(stem_gen2 .. "orum", stem_gen.. "ōrŭm") -- genitivo
        dat1s = p.wiki(stem_gen2 .. "o", stem_gen.. "ō"); dat1p = p.wiki(stem_gen2 .. "is", stem_gen.. "īs") -- dativo
        acc1s = p.wiki(stem2 .. "um", stem.. "ŭm"); acc1p = p.wiki(stem_gen2 .. "a", stem_gen.. "ă") --accusativo
        voc1s = p.wiki(stem2 .. "um", stem.. "ŭm"); voc1p = p.wiki(stem_gen2 .. "a", stem_gen.. "ă") -- vocativo
        abl1s = p.wiki(stem_gen2 .. "o", stem_gen.. "ō"); abl1p = p.wiki(stem_gen2 .. "is", stem_gen.. "īs") -- ablativo
        titolo = "''Seconda declinazione, neutro''" -- titolo della tabella
	elseif (decl == "3") then --TERZA DECLINAZIONE
        nom1s = p.wiki(stem2, stem); nom1p = p.wiki(stem_gen2 .. "es", stem_gen.. "ēs") -- nominativo
        gen1s = p.wiki(stem_gen2 .. "is", stem_gen.. "ĭs"); gen1p = p.wiki(stem_gen2 .. "um", stem_gen.. "ŭm") -- genitivo
        dat1s = p.wiki(stem_gen2 .. "i", stem_gen.. "ī"); dat1p = p.wiki(stem_gen2 .. "ibus", stem_gen.. "ībus") -- dativo
        acc1s = p.wiki(stem_gen2 .. "em", stem_gen.. "ĕm"); acc1p = p.wiki(stem_gen2 .. "es", stem_gen.. "ēs") --accusativo
        voc1s = p.wiki(stem2, stem); voc1p = p.wiki(stem_gen2 .. "es", stem_gen.. "ēs") -- vocativo
        abl1s = p.wiki(stem_gen2 .. "e", stem_gen.. "ĕ"); abl1p = p.wiki(stem_gen2 .. "ibus", stem_gen.. "ībus") -- ablativo
        titolo = "''Terza declinazione''" -- titolo della tabella
	else error("Coniugazione non riconosciuta!")
end
-- Recupera le eventuali forme irregolari, rimpiazziandole a quelle standard
    nom1s = p.over(nom1s,args["nom1s"]); nom1p = p.over(nom1p,args["nom1p"])
    gen1s = p.over(gen1s,args["gen1s"]); gen1p = p.over(gen1p,args["gen1p"])
    dat1s = p.over(dat1s,args["dat1s"]); dat1p = p.over(dat1p,args["dat1p"])
    acc1s = p.over(acc1s,args["acc1s"]); acc1p = p.over(acc1p,args["acc1p"])
    voc1s = p.over(voc1s,args["voc1s"]); voc1p = p.over(voc1p,args["voc1p"])
    abl1s = p.over(abl1s,args["abl1s"]); abl1p = p.over(abl1p,args["abl1p"])
-- Recupera le eventuali varianti e le aggiunge accanto a quelle standard
    if args["nom2s"] == nil then nom2s = " " nom2s2 = " " else --verifica che esista il parametro per la variante (NOMINATIVO sing)
		nom2s = args["nom2s"] nom2s2 = p.nodiacritic(nom2s) --genera le varianti con e senza diacritici
		nom2s = p.wiki(nom2s2, nom2s); nom1s = p.alts(nom1s, nom2s) end --recupera le varianti e le aggiunge accanto alla forma standard
	if args["nom2p"] == nil then nom2p = " " nom2p2 = " " else --verifica che esista il parametro per la variante (NOMINATIVO plur)
		nom2p = args["nom2p"] nom2p2 = p.nodiacritic(nom2p) --genera le varianti con e senza diacritici
		nom2p = p.wiki(nom2p2, nom2p); nom1s = p.alts(nom1p, nom2p) end --recupera le varianti e le aggiunge accanto alla forma standard
    if args["gen2s"] == nil then gen2s = " " gen2s2 = " " else --verifica che esista il parametro per la variante (GENITIVO sing)
		gen2s = args["gen2s"] gen2s2 = p.nodiacritic(gen2s) --genera le varianti con e senza diacritici
		gen2s = p.wiki(gen2s2, gen2s); gen1s = p.alts(gen1s, gen2s) end --recupera le varianti e le aggiunge accanto alla forma standard
	if args["gen2p"] == nil then gen2p = " " gen2p2 = " " else --verifica che esista il parametro per la variante (GENITIVO plur)
		gen2p = args["gen2p"] gen2p2 = p.nodiacritic(gen2p) --genera le varianti con e senza diacritici
		gen2p = p.wiki(gen2p2, gen2p); gen1s = p.alts(gen1p, gen2p) end --recupera le varianti e le aggiunge accanto alla forma standard
    if args["dat2s"] == nil then dat2s = " " dat2s2 = " " else --verifica che esista il parametro per la variante (DATIVO sing)
		dat2s = args["dat2s"] dat2s2 = p.nodiacritic(dat2s) --datera le varianti con e senza diacritici
		dat2s = p.wiki(dat2s2, dat2s); dat1s = p.alts(dat1s, dat2s) end --recupera le varianti e le aggiunge accanto alla forma standard
	if args["dat2p"] == nil then dat2p = " " dat2p2 = " " else --verifica che esista il parametro per la variante (DATIVO plur)
		dat2p = args["dat2p"] dat2p2 = p.nodiacritic(dat2p) --datera le varianti con e senza diacritici
		dat2p = p.wiki(dat2p2, dat2p); dat1s = p.alts(dat1p, dat2p) end --recupera le varianti e le aggiunge accanto alla forma standard
    if args["acc2s"] == nil then acc2s = " " acc2s2 = " " else --verifica che esista il parametro per la variante (ACCUSATIVO sing)
		acc2s = args["acc2s"] acc2s2 = p.nodiacritic(acc2s) --accera le varianti con e senza diacritici
		acc2s = p.wiki(acc2s2, acc2s); acc1s = p.alts(acc1s, acc2s) end --recupera le varianti e le aggiunge accanto alla forma standard
	if args["acc2p"] == nil then acc2p = " " acc2p2 = " " else --verifica che esista il parametro per la variante (ACCUSATIVO plur)
		acc2p = args["acc2p"] acc2p2 = p.nodiacritic(acc2p) --accera le varianti con e senza diacritici
		acc2p = p.wiki(acc2p2, acc2p); acc1s = p.alts(acc1p, acc2p) end --recupera le varianti e le aggiunge accanto alla forma standard
    if args["voc2s"] == nil then voc2s = " " voc2s2 = " " else --verifica che esista il parametro per la variante (VOCATIVO sing)
		voc2s = args["voc2s"] voc2s2 = p.nodiacritic(voc2s) --vocera le varianti con e senza diacritici
		voc2s = p.wiki(voc2s2, voc2s); voc1s = p.alts(voc1s, voc2s) end --recupera le varianti e le aggiunge accanto alla forma standard
	if args["voc2p"] == nil then voc2p = " " voc2p2 = " " else --verifica che esista il parametro per la variante (VOCATIVO plur)
		voc2p = args["voc2p"] voc2p2 = p.nodiacritic(voc2p) --vocera le varianti con e senza diacritici
		voc2p = p.wiki(voc2p2, voc2p); voc1s = p.alts(voc1p, voc2p) end --recupera le varianti e le aggiunge accanto alla forma standard
    if args["abl2s"] == nil then abl2s = " " abl2s2 = " " else --verifica che esista il parametro per la variante (ABLATIVO sing)
		abl2s = args["abl2s"] abl2s2 = p.nodiacritic(abl2s) --ablera le varianti con e senza diacritici
		abl2s = p.wiki(abl2s2, abl2s); abl1s = p.alts(abl1s, abl2s) end --recupera le varianti e le aggiunge accanto alla forma standard
	if args["abl2p"] == nil then abl2p = " " abl2p2 = " " else --verifica che esista il parametro per la variante (ABLATIVO plur)
		abl2p = args["abl2p"] abl2p2 = p.nodiacritic(abl2p) --ablera le varianti con e senza diacritici
		abl2p = p.wiki(abl2p2, abl2p); abl1s = p.alts(abl1p, abl2p) end --recupera le varianti e le aggiunge accanto alla forma standard
-- Costruisce la tabella di declinazione
    conj = "{|border='1' cellpadding='2' style='float:right; margin:1em 1em 1em 0;background:#f0fff0;border:1px #aaaaaa solid;border-collapse:collapse'\n"
	conj = conj .. "|-\n"
	conj = conj .. "|+".. titolo.. "\n"
	conj = conj .. "|-\n"
	conj = conj .. "!bgcolor='#FFFFFF'|\n"
    conj = conj .. "!bgcolor='#87cefa'|''singolare''\n"
    conj = conj .. "!bgcolor='#87cefa'|''plurale''\n"
    conj = conj .. "|-\n"    
    conj = conj .. "!bgcolor='#87cefa'| ''nominativo''\n"    
    conj = conj .. "|" ..nom1s .. "\n"
    conj = conj .. "|" ..nom1p .. "\n"
    conj = conj .. "|-\n"    
    conj = conj .. "!bgcolor='#87cefa'| ''genitivo''\n"    
    conj = conj .. "|" ..gen1s .. "\n"
    conj = conj .. "|" ..gen1p .. "\n"
    conj = conj .. "|-\n"   
    conj = conj .. "!bgcolor='#87cefa'| ''dativo''\n"    
    conj = conj .. "|" ..dat1s .. "\n"
    conj = conj .. "|" ..dat1p .. "\n"
    conj = conj .. "|-\n"
    conj = conj .. "!bgcolor='#87cefa'| ''accusativo''\n"    
    conj = conj .. "|" ..acc1s .. "\n"
    conj = conj .. "|" ..acc1p .. "\n"
    conj = conj .. "|-\n"   
    conj = conj .. "!bgcolor='#87cefa'| ''vocativo''\n"    
    conj = conj .. "|" ..voc1s .. "\n"
    conj = conj .. "|" ..voc1p .. "\n"
    conj = conj .. "|-\n"   
    conj = conj .. "!bgcolor='#87cefa'| ''ablativo''\n"    
    conj = conj .. "|" ..abl1s .. "\n"
    conj = conj .. "|" ..abl1p .. "\n"
    conj = conj .. "|}"
    return conj 
end

function p.nodiacritic(x)
-- funzione che rimuove gli eventuali accenti lunghi e brevi dalla radice (stem); in pratica se si scrive 'puĕr' restituisce 'puer'
	local dp={
	['ā']='a',['ă']='a',
	['ē']='e',['ĕ']='e',
	['ī']='i',['ĭ']='i',
	['ō']='o',['ŏ']='o',
	['ū']='u',['ŭ']='u',
	};
	return (mw.ustring.gsub(x, '.', dp))
	end
function p.over(x,over)
-- Utilizzato all"interno della funzione itconj
-- Rimpiazza una voce verbale standard con quella eventualmente indicata nel template (se quest"ultimo è un link rosso, aggiunge anche la relativa categoria)
    if over == nil then return x end
    if over < "a" then return "" end
	if over >= "a" then over2 = p.nodiacritic(over)
		if mw.title.new(over).exists == false then 
			RedCat = "[[Categoria:Sostantivi latini con link rossi in coniugazione]] "
		else
			over2 = p.nodiacritic(over) RedCat = ""
		end
	end
	return RedCat.. "[[" .. over2 .. "#Latino|" .. over .. "]]"
end

function p.wiki(x,y)
-- Utilizzato all"interno della funzione itconj
    if x == nil then return "n.e." end
    if x == "" then return "n.e" end
    -- aggiunge la categoria link rossi
    if x >= "a" and mw.title.new(x).exists == false then
    	RedCat = "[[Categoria:Sostantivi latini con link rossi in coniugazione]] "
        else
    	RedCat = ""
	end
	if x >= "a" and x == mw.title.getCurrentTitle().text then anchor = "|" else anchor = "#Latino|" end --evita che restituisca un link blu anche quando il link punta alla pagina stessa (elimina il #Latino se il link è uguale al titolo della pagina)
-- Rende il suo argomento un wikilink, o lo rende nullo se non definito (per facilitare la concatenazione)
    return RedCat.. "[[" .. x ..anchor .. y .. "]]"
    end

function p.alts(x,y)
-- Utilizzato all"interno della funzione itconj
-- Aggiunge le eventuali forme alternative, se specificate nel template, separandole da quelle base con una virgola
    if y == nil then return x end
    if y >= "a" then return x .. ", " .. y end
    return x
end

return p