Modul:Ahnentafel

Aus KoschWiki
Zur Navigation springen Zur Suche springen
Dokumentation und Testfälle unter Modul:Ahnentafel/Doku.
require("Modul:Hilfsfunktionen")
require("Modul:Text")

local p = {}

--hole die Daten zum Traviabund der Eltern
function holeTraviabund(person)
	local travia=mw.smw.ask("{{#ask:<q>[[-Has subobject::"..person["Vater ist"].."]] [[Traviabund mit Partner::"..person["Mutter ist"].."]]</q>"
		.." OR <q>[[-Has subobject::"..person["Mutter ist"].."]] [[Traviabund mit Partner::"..person["Vater ist"].."]]</q>"
		.."|?Traviabund mit Von"
		.."|limit=1"
		.."|offset=0"
		.."|searchlabel=")
	if travia==nil or travia[1]==nil or travia[1]["Traviabund mit Von"]==nil or travia[1]["Traviabund mit Von"]=="9999 vBF" then
		return ""
	end
	return "[[Datei:Symbol Travia-Kirche.svg|15px|link=]]"..travia[1]["Traviabund mit Von"]
end

--hole die Anzahl Geschwister inklusive Halbgeschwister
function holeAnzahlGeschwister(person)
	local anzahl=mw.smw.ask("{{#ask: <q>[[Vater ist::"..person["Vater ist"].."]] OR [[Mutter ist::"..person["Mutter ist"].."]]</q>"
		.."|format=count")
	if anzahl<=1 then
		return ""
	end
	return "("..(anzahl-1).." Geschwister)"
end

--Setze bei nil auf Standardwerte
function standardInfos(artikel,infos)
	local anzeige=artikel
	for w in artikel:gmatch("([^:]+)") do
		anzeige=w
	end

	if infos==nil or infos["Bild ist"]==nil then
		return {
			["Artikel"]=artikel,
			["Mutter ist"]="",
			["Vater ist"]="",
			["Bild ist"]="Datei:Bild blanko.svg",
			["Wappen ist"]="Datei:Wappen blanko.svg",
			["Lehenswappen ist"]="Datei:Wappen blanko.svg",
			["Mitgliedswappen ist"]="Datei:Wappen blanko.svg",
			["Langname"]=anzeige,
			["Tsatag Text"]="",
			["Borontag Text"]="",
		}
	else
		return {
			["Artikel"]=robusttrim(infos["Artikel"]),
			["Mutter ist"]=robusttrim(infos["Mutter ist"]),
			["Vater ist"]=robusttrim(infos["Vater ist"]),
			["Bild ist"]=robusttrim(infos["Bild ist"]),
			["Wappen ist"]=robusttrim(infos["Wappen ist"]),
			["Lehenswappen ist"]=robusttrim(infos["Lehenswappen ist"]),
			["Mitgliedswappen ist"]=robusttrim(infos["Mitgliedswappen ist"]),
			["Langname"]=robusttrim(infos["Langname"]),
			["Tsatag Text"]=robusttrim(infos["Tsatag Text"]),
			["Borontag Text"]=robusttrim(infos["Borontag Text"]),
		}
	end
end

--Hole Eltern und Infos einer Person
function holeElternInfos(artikel)
	local infos=mw.smw.ask("{{#ask: [["..artikel.."]]"
		.."|?#-=Artikel"
		.."|?Mutter ist#"
		.."|?Vater ist#"
		.."|?Bild ist#"
		.."|?Wappen ist#"
		.."|?Lehenswappen ist#"
		.."|?Mitgliedswappen ist#"
		.."|?Langname#"
		.."|?Tsatag Text#"
		.."|?Borontag Text#"
		.."|limit=1"
		.."|offset=0"
		.."|searchlabel="
	)
	if infos==nil then
		return standardInfos(artikel,nil)
	end
	return standardInfos(artikel,infos[1])
end

function holeKinderInfos(artikel)
	local infos=mw.smw.ask("{{#ask: [[Vater ist::"..artikel.."]] OR [[Mutter ist::"..artikel.."]]"
		.."|?#-=Artikel"
		.."|?Mutter ist#"
		.."|?Vater ist#"
		.."|?Bild ist#"
		.."|?Wappen ist#"
		.."|?Lehenswappen ist#"
		.."|?Mitgliedswappen ist#"
		.."|?Langname#"
		.."|?Tsatag Text#"
		.."|?Borontag Text#"
		.."|searchlabel="
		.."|sort=Tsatag Index"
	)
	if infos==nil then
		infos={}
	end
	local result={}
	for c=1,#infos do
		result[c]=standardInfos(artikel,infos[c])
	end
	return result
end

--neue Zeile eventuell verstecken, wenn leer
function neueZeile(eintrag)
	local c=0
	for i=1,#eintrag do
		if eintrag[i]~="" then
			c=c+1
		end
	end
	local hide=""
	if c==0 then
		hide="style=\"visibility:hidden"
	end
	return "\n|- "..hide
end

--versteckte Titelzeile, um gleichmäßige Darstellung zu erreichen, kurze Anzeige der Alteltern
function zeile0(eintrag) 
	local result=neueZeile(eintrag)
	for i=1,16,1 do
		result=result.."\n|class=\"hell\" style=\"width:6%;vertical-align:top;text-align:center;\"|"..eintrag[i]
	end
	return result 
end

--Zeile mit den Urgroßeltern
function zeile1(eintrag) 
	local result=neueZeile(eintrag)
	for i=1,8,1 do
		result=result.."\n|colspan=\"2\" class=\"hell\" "
			.."style=\"vertical-align:top;text-align:center;\"|"
			..eintrag[i]
	end
	return result 
end

--Zeile mit den Großeltern
function zeile2(eintrag) 
	local result=neueZeile(eintrag)
	result=result.."\n|style=\"vertical-align:middle;text-align:right;\"|"..eintrag[1]
	result=result.."\n|colspan=\"2\" class=\"hell\" "
		.."style=\"vertical-align:top;text-align:center;\"|"
		..eintrag[2]
	result=result.."\n|colspan=\"2\" "
		.."style=\"vertical-align:middle;text-align:center;\"|"..eintrag[3]
	result=result.."\n|colspan=\"2\" class=\"hell\" "
		.."style=\"vertical-align:top;text-align:center;\"|"
		..eintrag[4]
	result=result.."\n|style=\"vertical-align:middle;text-align:left;\"|"..eintrag[5]

	result=result.."\n|style=\"vertical-align:middle;text-align:right;\"|"..eintrag[6]
	result=result.."\n|colspan=\"2\" class=\"hell\" "
		.."style=\"vertical-align:top;text-align:center;\"|"
		..eintrag[7]
	result=result.."\n|colspan=\"2\" "
		.."style=\"vertical-align:middle;text-align:center;\"|"..eintrag[8]
	result=result.."\n|colspan=\"2\" class=\"hell\" "
		.."style=\"vertical-align:top;text-align:center;\"|"
		..eintrag[9]
	result=result.."\n|style=\"vertical-align:middle;text-align:left;\"|"..eintrag[10]
	return result 
end

--Zeile mit den Eltern
function zeile3(eintrag) 
	local result=neueZeile(eintrag)
	result=result.."\n|colspan=\"2\" style=\"vertical-align:middle;text-align:right;\"|"..eintrag[1]
	result=result.."\n|colspan=\"4\" class=\"hell\" "
		.."style=\"vertical-align:top;text-align:center;\"|"
		..eintrag[2]
	result=result.."\n|colspan=\"4\" "
		.."style=\"vertical-align:middle;text-align:center;\"|"..eintrag[3]
	result=result.."\n|colspan=\"4\" class=\"hell\" "
		.."style=\"vertical-align:top;text-align:center;\"|"
		..eintrag[4]
	result=result.."\n|colspan=\"2\" style=\"vertical-align:middle;text-align:left;\"|"..eintrag[5]
	return result 
end

--Zeile mit den Person
function zeile4(eintrag) 
	local result=neueZeile(eintrag)
	result=result.."\n|colspan=\"4\" style=\"vertical-align:middle;text-align:right;\"|"
	result=result.."\n|colspan=\"8\" class=\"hell\" "
		.."style=\"vertical-align:top;text-align:center;\"|"
		..eintrag[1]
	result=result.."\n|colspan=\"4\" style=\"vertical-align:middle;text-align:left;\"|"..eintrag[2]
	return result 
end

function personEintrag(person)
	if person==nil or person["Artikel"]=="" then
		return ""
	end
	if person["Langname"]:find("^Vater von ") or person["Langname"]:find("^Mutter von ") then
		return ""
	end
	local wappen2=person["Lehenswappen ist"]
	if wappen2=="Datei:Wappen blanko.svg" then
		wappen2=person["Mitgliedswappen ist"]
	end
	local result="[["..person["Wappen ist"].."|25x28px|link=]]"
		.."[["..person["Bild ist"].."|25x28px|link=]]"
		.."[["..wappen2.."|25x28px|link=]]"
		.."<br>[["..person["Artikel"].."|"..person["Langname"].."]]"
	if person["Tsatag Text"]~="" then
		result=result.."<br>[[Datei:Symbol Tsa-Kirche.svg|15px|link=]]"..person["Tsatag Text"]
	end
	if person["Borontag Text"]~="" then
		result=result.."<br>[[Datei:Symbol Boron-Kirche.svg|15px|link=]]"..person["Borontag Text"]
	end
	return result
end

function personEintragKurz(artikel)
	if artikel==nil or artikel=="" then
		return ""
	end
	local anzeige=artikel
	for w in artikel:gmatch("([^:]+)") do
		anzeige=w
	end
	if anzeige:find("^Vater von ") or anzeige:find("^Mutter von ") then
		return ""
	end
	return "[["..artikel.."|"..anzeige.."]]"
end
--Formatierung der Ausgabe
function ausgabe(artikel)
	local person=holeElternInfos(artikel)

	local vater=holeElternInfos(person["Vater ist"])
	local mutter=holeElternInfos(person["Mutter ist"])
	
	local vatersvater=holeElternInfos(vater["Vater ist"])
	local vatersmutter=holeElternInfos(vater["Mutter ist"])
	local muttersvater=holeElternInfos(mutter["Vater ist"])
	local muttersmutter=holeElternInfos(mutter["Mutter ist"])
	
	local vatersvatersvater=holeElternInfos(vatersvater["Vater ist"])
	local vatersvatersmutter=holeElternInfos(vatersvater["Mutter ist"])
	local vatersmuttersvater=holeElternInfos(vatersmutter["Vater ist"])
	local vatersmuttersmutter=holeElternInfos(vatersmutter["Mutter ist"])

	local muttersvatersvater=holeElternInfos(muttersvater["Vater ist"])
	local muttersvatersmutter=holeElternInfos(muttersvater["Mutter ist"])
	local muttersmuttersvater=holeElternInfos(muttersmutter["Vater ist"])
	local muttersmuttersmutter=holeElternInfos(muttersmutter["Mutter ist"])
	
	local kinder=holeKinderInfos(artikel)

	local result='{| style="font-size:0.8em;width:100%;background:transparent;border:none;"'
	result=result..zeile0({
		[1]=personEintragKurz(vatersvatersvater["Vater ist"]),
		[2]=personEintragKurz(vatersvatersvater["Mutter ist"]),
		[3]=personEintragKurz(vatersvatersmutter["Vater ist"]),
		[4]=personEintragKurz(vatersvatersmutter["Mutter ist"]),
		[5]=personEintragKurz(vatersmuttersvater["Vater ist"]),
		[6]=personEintragKurz(vatersmuttersvater["Mutter ist"]),
		[7]=personEintragKurz(vatersmuttersmutter["Vater ist"]),
		[8]=personEintragKurz(vatersmuttersmutter["Mutter ist"]),
		[9]=personEintragKurz(muttersvatersvater["Vater ist"]),
		[10]=personEintragKurz(muttersvatersvater["Mutter ist"]),
		[11]=personEintragKurz(muttersvatersmutter["Vater ist"]),
		[12]=personEintragKurz(muttersvatersmutter["Mutter ist"]),
		[13]=personEintragKurz(muttersmuttersvater["Vater ist"]),
		[14]=personEintragKurz(muttersmuttersvater["Mutter ist"]),
		[15]=personEintragKurz(muttersmuttersmutter["Vater ist"]),
		[16]=personEintragKurz(muttersmuttersmutter["Mutter ist"]),
	})
	result=result..zeile1({
		[1]=personEintrag(vatersvatersvater),
		[2]=personEintrag(vatersvatersmutter),
		[3]=personEintrag(vatersmuttersvater),
		[4]=personEintrag(vatersmuttersmutter),
		[5]=personEintrag(muttersvatersvater),
		[6]=personEintrag(muttersvatersmutter),
		[7]=personEintrag(muttersmuttersvater),
		[8]=personEintrag(muttersmuttersmutter),
	})
	result=result..zeile2({
		[1]=holeAnzahlGeschwister(vatersvater),
		[2]=personEintrag(vatersvater),
		[3]=holeTraviabund(vater),
		[4]=personEintrag(vatersmutter),
		[5]=holeAnzahlGeschwister(vatersmutter),
		[6]=holeAnzahlGeschwister(muttersvater),
		[7]=personEintrag(muttersvater),
		[8]=holeTraviabund(mutter),
		[9]=personEintrag(muttersmutter),
		[10]=holeAnzahlGeschwister(muttersmutter),
	})
	result=result..zeile3({
		[1]=holeAnzahlGeschwister(vater),
		[2]=personEintrag(vater),
		[3]=holeTraviabund(person),
		[4]=personEintrag(mutter),
		[5]=holeAnzahlGeschwister(mutter),
	})
	result=result..zeile4({
		[1]=personEintrag(person),
		[2]=holeAnzahlGeschwister(person),
	})
	result=result.."\n|}"
	
	result=result.."\n{| style=\"font-size:0.8em;width:100%;background:transparent;border:none;\""
	result=result.."\n|-"
	local width=100/math.min(10,#kinder)
	for c = 1, #kinder do
		result=result.."\n|class=\"hell\" "
		.."style=\"vertical-align:top;text-align:center;width:"..width.."%\"|"
		..personEintrag(kinder[c])
		if (c%10)==0 then
			result=result.."\n|-"
		end
	end
	result=result.."\n|}"
	
	return result
end

--Aufzurufende Funktion
function p.ahnentafel(frame)
	local artikel=robusttrim(frame.args[1])
	if(artikel=='') then return '' end
	return ausgabe(artikel)
end

return p