Modul:Namen

Aus GaretienWiki
Version vom 3. Dezember 2024, 06:19 Uhr von VolkoV (D | B) (VolkoV verschob die Seite Modul:Namen2 nach Modul:Namen, ohne dabei eine Weiterleitung anzulegen)
Zur Navigation springen Zur Suche springen

Die Dokumentation für dieses Modul kann unter Modul:Namen/Doku erstellt werden

local p = {}

require("Modul:Hilfsfunktionen")

function pruefeName(name)
	--Titel in doppelten Anführungsstrichen raus
	if mw.ustring.find(name,"\"",1,true)~=nil then return "" end
	--Römische Zahlen (alles mit .) raus
	if mw.ustring.find(name,".",1,true)~=nil then return "" end
	--Zu aussortierende Namen
	local filter={"Mutter","Vater","Bruder","Schwester","Sohn","Tochter",
		"Heilige","Heiliger","Sankt","Sankta",
		"Meister","Meisterin","Abt","Äbtissin",
		"Baron","Beispiel","Pfundt"}
	for k,v in pairs(filter) do
		if v==name then return "" end
	end
	--Worte, nach denen nicht weiter gesucht wird
	local stop={"von","vom","zu","zum","zur","des","der","am","im","an","in",
		"auf","a","al","ap","aus","ay","ben","da","di","de","della","den","der",
		"die","du","dyll","dylli","han","ibn","il","ni","res","saba","te","ui",
		"vor","ya"}
	for k,v in pairs(stop) do
		if v==name then return nil end
	end
	return name
end

function vornamen(name)
	--Sonderzeichen raus
	local n=mw.ustring.gsub(name,"-"," ")
	n=mw.ustring.gsub(n,"'","")
	n=mw.ustring.gsub(n,"´"," ")
	n=mw.ustring.gsub(n,"`"," ")
	n=mw.ustring.gsub(n,","," ")
	--nach Leerzeichen teilen
	local namen=split(n," ")
	local result={}
	--bei nur einem Namen ist dies der Vorname, ansonsten wird der letzte Name immer ignoriert
	local c=#namen-1
	if c==0 then c=1 end
	local i=1
	for j=1,c do
		local n=pruefeName(namen[j])
		if n~=nil and n~="" then
			result[i]=n
			i=i+1
		end
		if n==nil then break end
	end	
	return result
end

function holeNamen(prefix,filter)
	if prefix=='' then return {} end
	local namen=mw.smw.ask('[[Vorname::~'..prefix..'*]]'..filter
		..'|mainlabel=-'
		..'|?Vorname'
		..'|limit=5000'
		..'|offset=0'
	)
	return noniltable(namen)
end

function zaehleNamen(namen,prefix)
	local count={}
	for k,v in pairs(namen) do
		vtable=noniltable(v["Vorname"])
		for k2,v2 in pairs(vtable) do
			if(mw.ustring.find(v2,prefix,1,true)~=nil) then
				if(count[v2]==nil) then
					count[v2]=1
				else
					count[v2]=count[v2]+1
				end
			end
		end
	end
	return count
end

function formatiereNamen(count)
	local result=""
	for k,v in spairs(count,function(count,a,b)
		if count[a]==count[b] then
			return a<b
		end
		return count[a]>count[b]
	end) do
		result=result.."\n#"..k.." ("..v.."x)"
	end
	
	return result
end

function p.Abfrage(frame)
	if (frame.args[1]==nil) then
		return 'no parameter found'
	end
	local prefix=robusttrim(frame.args[1])
	local filter=robusttrim(frame.args[2])
	local namen=holeNamen(prefix,filter)
	local count=zaehleNamen(namen,prefix)
	local result=formatiereNamen(count)
	return result
end

function p.Vornamen(frame)
	if (frame.args[1]==nil)or(frame.args[2]==nil) then
		return 'no parameter found'
	end
	local name=robusttrim(frame.args[1])
	local nr=tonumber(robusttrim(frame.args[2]))
	local namen=vornamen(name)
	if namen[nr]==nil then return "" end
	return namen[nr]
end

return p