Modul:Lehensabfrage

Aus GaretienWiki
Zur Navigation springen Zur Suche springen
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Dokumentation und Testfälle unter Modul:Lehensabfrage/Doku.
local p = {}

require("Modul:Hilfsfunktionen")
require("Modul:Text")

function holeLehenDetails(lehen)
	if lehen=='' then return {} end
	local s='[['..lehen..']]'
	local details=mw.smw.ask(s
		..'|mainlabel=-'
		..'|?Kurzname#='
		..'|?Lehenstyp#='
		..'|?Wappen ist#='
		..'|?Vasallenlehen von#='
		..'|limit=1'
		..'|searchlabel='
	)
	if details==nil then return {} end
	return details
end

function holeLehenSub(mitglied)
	if mitglied=='' then return {} end
	local s='[[-has subobject::'..mitglied..']]'
	local lehen=mw.smw.ask(s
		..'|mainlabel=-'
		..'|?Herrscher von Lehen#='
		..'|?Herrscher von Art#='
		..'|?Herrscher von VonIndex#='
		..'|?Herrscher von BisIndex#='
		..'|limit=500'
		..'|searchlabel='
		..'|sort=Herrscher von VonIndex'
	)
	if lehen==nil then return {} end
	return lehen
end

function findeFamilienmitglieder(familie)
	local s='<q>[[Familienmitglied von::'..familie..']] OR [[Familienmitglied von.Untergruppierung von::'..familie..']]</q>'
	local mitglieder=mw.smw.ask(s
		..'|mainlabel=-'
		..'|?#-='
		..'|limit=500'
		..'|searchlabel='
	)
	if mitglieder==nil then mitglieder={} end
	return mitglieder
end

function findeAlleLehen(mitglieder,jahr)
	local allelehen={}
	for mkey,mvalue in pairs(mitglieder) do
		local lehen=holeLehenSub(mvalue[1])
		for lkey,lvalue in pairs(lehen) do
			if lvalue[1]~=nil and lvalue[2]~=nil and lvalue[3]~=nil and lvalue[4]~=nil then
				if allelehen[lvalue[1]]==nil then allelehen[lvalue[1]]={} end
				local von=lvalue[3]/10000
				local bis=lvalue[4]/10000
				if allelehen[lvalue[1]]['aktuell']==nil then allelehen[lvalue[1]]['aktuell']=false end
				if bis>jahr then
					bis=jahr
					allelehen[lvalue[1]]['aktuell']=true
				end
				local v=3
				if lvalue[2]=='Titel' then v=2 end
				if lvalue[2]=='Regent' then v=1 end
				for i=von,bis,1 do
					allelehen[lvalue[1]][i]=v
				end
			end
		end
	end
	return allelehen
end

function verdichteLehen(allelehen,manuell)
	local lehensarten={}
	lehensarten['Reich']='Reiche'
	lehensarten['Provinz']='Provinzen'
	lehensarten['Grafschaft']='Grafschaften'
	lehensarten['Baronie']='Baronien'
	lehensarten['Junkertum']='Junkertümer'
	lehensarten['Herrschaft']='Herrschaften'
	lehensarten['Ortschaft']='Ortschaften'
	lehensarten['Bauwerk']='Bauwerke'

	local lehenverdichtet={}
	for akey,avalue in pairs(allelehen) do
		local countr=0;
		local countt=0;
		for jkey,jvalue in pairs(avalue) do
			if (jvalue==1)or(jvalue==3) then countr=countr+1 end
			if (jvalue==2)or(jvalue==3) then countt=countt+1 end
		end
		local details=holeLehenDetails(akey)
		if (details[1]~=nil) and (details[1][2]~=nil) and (lehensarten[details[1][2]]~=nil) then
			local art=lehensarten[details[1][2]]
			if lehenverdichtet[art]==nil then lehenverdichtet[art]={} end
			lehenverdichtet[art][akey]={}
			lehenverdichtet[art][akey]['kurzname']=details[1][1]
			lehenverdichtet[art][akey]['aktuell']=avalue['aktuell']
			lehenverdichtet[art][akey]['regent']=countr
			lehenverdichtet[art][akey]['titel']=countt
			lehenverdichtet[art][akey]['wappen']=details[1][3]
			lehenverdichtet[art][akey]['hegemon']=details[1][4]
		end
	end
	--manuell einmischen, nur wenn nicht bereits dabei
	local manuellt=mw.text.split(manuell,',',true)
	for mkey,akey in pairs(manuellt) do
		local details=holeLehenDetails(akey)
		if (details[1]~=nil) and (details[1][2]~=nil) and (lehensarten[details[1][2]]~=nil) then
			local art=lehensarten[details[1][2]]
			if lehenverdichtet[art]==nil then lehenverdichtet[art]={} end
			if lehenverdichtet[art][akey]==nil then
				lehenverdichtet[art][akey]={}
				lehenverdichtet[art][akey]['kurzname']=details[1][1]
				lehenverdichtet[art][akey]['aktuell']=true -- geht natürlich nicht
				lehenverdichtet[art][akey]['regent']=1 --geht natürlich nicht
				lehenverdichtet[art][akey]['titel']=1 --geht natürlich nicht
				lehenverdichtet[art][akey]['wappen']=details[1][3]
				lehenverdichtet[art][akey]['hegemon']=details[1][4]
			end
		end
	end
	return lehenverdichtet
end

function holeLehen(jahr,familie,manuell)
	if familie=='' then return '' end

	--Finde alle Familienmitglieder
	local mitglieder=findeFamilienmitglieder(familie)
	
	--Finde alle Lehen dieser Familienmitglieder
	local allelehen=findeAlleLehen(mitglieder,jahr)

	--Verdichte das Ergebnis auf Lehensart und Lehen
	local lehenverdichtet=verdichteLehen(allelehen,manuell)

	return lehenverdichtet	
end

function sortiereLehen(t,a,b)
	return t[a]['kurzname']<t[b]['kurzname']
end

function sortiereLehensarten(t,a,b)
	local lehenssort={}
	lehenssort['Reiche']=0
	lehenssort['Provinzen']=1
	lehenssort['Grafschaften']=2
	lehenssort['Baronien']=3
	lehenssort['Junkertümer']=4
	lehenssort['Herrschaften']=5
	lehenssort['Ortschaften']=6
	lehenssort['Bauwerke']=7
	return lehenssort[a]<lehenssort[b]
end

function formatiereLehen(lehenverdichtet,weiterelehen,weitereaemter,aktuell)
	local result=''
	for vkey,vvalue in spairs(lehenverdichtet,sortiereLehensarten) do
		local werte={}
		for lkey,lvalue in spairs(vvalue,sortiereLehen) do
			if aktuell==lvalue['aktuell'] then
				local regent=''
				if lvalue['titel']==0 and lvalue['regent']>0 then regent=' (Regentschaft)' end
				table.insert(werte,'[['..lkey..'|'..lvalue['kurzname']..']]'..regent)
			end	
		end
		result=result..subZeile(vkey,table.concat(werte,', '))
	end
	result=result..subZeile('Weitere Lehen',weiterelehen)
	result=result..subZeile('Weitere Ämter',weitereaemter)
	local pre='Aktuelle '
	if not aktuell then pre='Ehemalige ' end
 	return subZeilengruppe(pre..'Lehen und Ämter',result)
end

function kategorieHegemonRekursiv(lehen,kurzname,rekursion)
	if rekursion==0 then return '' end
	if type(lehen)=='table' then
		local result=''
		for key,value in pairs(lehen) do
			result=result..kategorieHegemonRekursiv(value,kurzname,rekursion)
		end
		return result
	end
	if lehen==nil or lehen=='' or type(lehen)~='string' then return '' end
	local title=mw.title.new(lehen).text
	local s='[['..lehen..']]'
	local hegemon=mw.smw.ask(s
		..'|mainlabel=-'
		..'|?Vasallenlehen von#='
		..'|limit=1'
		..'|searchlabel='
	)
	local add=''
	if hegemon[1][1]~=nil then
		add=kategorieHegemonRekursiv(hegemon[1][1],kurzname,rekursion-1)
	end
	return '[[Kategorie:'..title..'|'..kurzname..']]'..add
end

function kategorisiereLehen(lehenverdichtet)
	local result=''
	for vkey,vvalue in spairs(lehenverdichtet,sortiereLehensarten) do
		local werte={}
		for lkey,lvalue in spairs(vvalue,sortiereLehen) do
			local title=mw.title.new(lkey).text
			result=result..' [[Kategorie:'..title..'|'..lvalue['kurzname']..']]'..kategorieHegemonRekursiv(lvalue['hegemon'],lvalue['kurzname'],7)
		end
	end
 	return result
end

function formatiereLehenIcons(lehenverdichtet)
	local result=''
	for vkey,vvalue in spairs(lehenverdichtet,sortiereLehensarten) do
		local werte={}
		for lkey,lvalue in spairs(vvalue,sortiereLehen) do
			if lvalue['aktuell'] then
				result=result..'[['..lvalue['wappen']..'|20px|link='..lkey..']]&nbsp;&nbsp;&nbsp;'
			end
		end
	end
 	return result
end

function p.Abfrage(frame)
	if (frame.args[1]==nil) then
		return 'no parameter found'
	end
	catname=robusttrim(frame.args[2])
	weiterelehen=robusttrim(frame.args[3])
	weitereaemter=robusttrim(frame.args[4])
	manuell=robusttrim(frame.args[5])
	local familie=frame.args[1]
	local lehen=holeLehen(1047,familie,manuell)
	local formatiert=formatiereLehen(lehen,weiterelehen,weitereaemter,true)
	frame:callParserFunction('#vardefine','LehensabfrageIcons',formatiereLehenIcons(lehen))
	frame:callParserFunction('#vardefine','Lehensabfrage',formatiert)
	return formatiert..formatiereLehen(lehen,'','',false)..kategorisiereLehen(lehen)
end

return p