Zum Inhalt springen

Modul:Wahl Listen

aus Wikipedia, der freien Enzyklopädie

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

local p = {}
local getArgs = require('Modul:Arguments').getArgs
local farbe = require('Modul:Partei').farbe
local gewahlt = require('Modul:Direktwahl').gewahlt

function p.form(num)
	return tonumber(num) and mw.getLanguage('de'):formatNum(tonumber(num)) or num == '*' and '' or '–'
end
	
function p.pz(frame)
	local args = getArgs(frame)
	a = args[1]
	b = args[2]
	c = args[3]
	if tonumber(a) and tonumber(b) then
		q = a*100/b
		s = string.format('%.1f', q)
		if c and tonumber(s) == tonumber(c) and tonumber(q) < tonumber(c) then
			k = string.format('%.2f', q) else
			k = s
		end
		z = string.gsub(k, "%.", "%,")
		elseif a == '*' then z = ''
		else z = '&ndash;'
	end
	return z
end

function p.wahl(frame)
	local args = getArgs(frame)
	if args['p'] == 's' then farben = true end
	if args['typ'] == 'PR' then PR = true end
	if args['typ'] == 'PA' then PA = true end
	if args['typ'] == 'PAG' then PAG = true end
	if args['typ'] == 'PRZ' then PRZ = true end
	if args['typ'] == 'PAZ' then PAZ = true end
	if args['typ'] == 'PAD' then
		if args['system'] == 'BY' then BY = true PAZ = true AUT = true
		elseif args['system'] == 'HB' then HB = true PAZ = true AUT = true
		else PAD = true end
	end
	if args['z1'] or PRZ or PAZ or PAD then zweite = true end
	if args['kein'] == '1' then kein = true end
	local system = args['system'] or ''
	local zeile = 4 + (farben and 1 or 0) + (args['DS1'] and 1 or 0) + (args['DM1'] and 1 or 0) + ((PAG or zweite) and 2 or 0) + (AUT and 4 or (PAZ and 2 or (PAD and 5 or 0))) + (args['DSZ1'] and 1 or 0) + (args['DMZ1'] and 1 or 0) + (args['DSD1'] and 1 or 0) + (args['DMD1'] and 1 or 0) + (args['DMG1'] and 1 or 0) + (args['BG'] and 1 or 0)
	local coltitel = farben and 2 or 1
	local rowtitel = (PAG or zweite) and 2 or 1
	local colspalte = farben and ((PR or PRZ) and 3 or 2) or ((PR or PRZ) and 2 or 1)
	local colsub1 = 2 + ((PAZ or PAD) and 1 or 0) + (args['DS1'] and 1 or 0) + (args['DM1'] and 1 or 0)
	local colsub2 = BY and 2 + (args['DSZ1'] and 1 or 0) or PAG and 3 + (args['DMG1'] and 1 or 0) or colsub1
	
	local data = {}
	maxvalue = 0
	gesamts = 0
	gesamtm = 0
	gesamtsz = 0
	gesamtmz = 0
	gesamtsd = 0
	gesamtmd = 0
	local num = 1
	local stimme = (PR or PRZ) and 3 or 2
	local mandat = 3
	local zstimme = 4
	local zmandat = PAG and 4 or 5
	local dstimme = 6
	local dmandat = 7
	while args[tonumber(num)] do
		data = {
			stimmen = tonumber(args[stimme]) or 0,
			mandate = tonumber(args[mandat]) or 0,
			zstimmen =  PR and (tonumber(args['z'..num]) or 0) or (tonumber(args[zstimme]) or 0),
			zmandate =  tonumber(args[zmandat]) or 0,
			dstimmen =  tonumber(args[dstimme]) or 0,
			dmandate =  tonumber(args[dmandat]) or 0
		}
		num = num + 1
		stimme = stimme + ((PA or PR) and 3 or (PRZ and 4 or (PAG and 5 or (PAZ and 6 or 8))))
		mandat = mandat + (PA and 3 or (PAG and 5 or (PAZ and 6 or 8)))
		zstimme = zstimme + (PRZ and 4 or (PAZ and 6 or 8))
		zmandat = zmandat + (PAG and 5 or (PAZ and 6 or 8))
		dstimme = dstimme + 8
		dmandat = dmandat + 8
		maxvalue = math.max(maxvalue, data.stimmen)
		gesamts = args['gesamts'] or gesamts + data.stimmen
		gesamtm = args['gesamtm'] or gesamtm + data.mandate
		gesamtsz = args['gesamtsz'] or gesamtsz + data.zstimmen
		gesamtmz = args['gesamtmz'] or gesamtmz + data.zmandate
		gesamtsd = args['gesamtsd'] or AUT and (gesamts+gesamtsz) or gesamtsd + data.dstimmen
		gesamtmd = args['gesamtmd'] or gesamtmd + data.dmandate
	end
	gesamtsg = gesamts + gesamtsz
	gesamtmg = args['gesamtmg'] or (args['gesamtmz'] and (gesamtm + gesamtmz + (PAD and gesamtmd or 0)))
	
	local gultiged = HB and (args['gültige'] + args['gültigez'])
	local wahler = args['wähler']
	local wahlerz = (PRZ or BY) and wahler or args['wählerz']
	local wahlerd = BY and '' or (HB and (wahler+wahlerz) or args['wählerd'])
	local abgegebened = BY and (args['abgegebene'] + args['abgegebenez']) or args['abgegebened'] or ''
	local ungultige = wahler and (args['abgegebene'] or wahler) - (args['gültige'] or gesamts) - (args['hungültige'] or 0)
	local ungultigez = wahlerz and (args['abgegebenez'] or wahlerz) - (args['gültigez'] or gesamtsz) - (args['hungültigez'] or 0) or '&ndash;'
	local ungultiged = (BY or HB) and ungultige + ungultigez or wahlerd and (args['abgegebened'] or wahlerd) - (args['gültiged'] or gesamtsd) - (args['hungültiged'] or 0) or '&ndash;'
	local ausgefallened = BY and '' or args['abgegebened'] and (wahlerd - abgegebened)
	local wahlberechtigte = args['wahlberechtigte']
	local wahlberechtigtez = PRZ and args['wahlberechtigte'] or args['wahlberechtigtez']
	local wahlberechtigted = HB and (wahlberechtigte+wahlberechtigtez) or args['wahlberechtigted']
	local titel1 = PR and '1. Wahlgang' or PAG and 'Stimmen' or ((system == '1') and '1. Wahlgang') or ((system == '2') and 'Direktstimmen') or (system == '3' and 'Wahlkreisstimmen') or (system == '4' and 'Provinzialstimmen') or (system == '5' and 'Listenstimmen') or (HB and 'Stadt Bremen') or 'Erststimmen'
	local titel2 = PR and '2. Wahlgang' or PAG and 'Mandate' or ((system == '1') and '2. Wahlgang') or ((system == '2') and 'Listenstimmen') or (system == '3' and 'Landesstimmen') or (system == '4' and 'Nationalstimmen') or (system == '5' and 'Wahlkreisstimmen') or (HB and 'Bremerhaven') or 'Zweitstimmen'
	local titel3 = BY and 'Gesamtstimmen' or HB and 'Land Bremen' or 'Regionalstimmen'
	if PA or PAG or PAZ or PAD then parl = true end

	if args['p1'] then
		root = mw.html.create('table'):addClass('wikitable sortable'):css('text-align', 'right'):css('float', 'left'):css('margin-right', '1em')
	else
		root = mw.html.create('table'):addClass('wikitable sortable'):css('text-align', 'right')
	end
	
	row = root:tag('tr')
	row:tag('th')
		:wikitext((PR or PRZ) and 'Kandidaten' or 'Listen')
		:attr('colspan', coltitel)
		:attr('rowspan', rowtitel)
	if PR or PRZ then
		row:tag('th')
			:wikitext(PRZ and 'Parteien/Listen' or 'Parteien')
			:attr('rowspan', rowtitel)
	end
	if PAG or zweite then
		row:tag('th')
			:wikitext(titel1)
			:attr('colspan', colsub1)
		row:tag('th')
			:wikitext(titel2)
			:attr('colspan', colsub2)
		if PAD or AUT then
			row:tag('th')
				:wikitext(titel3)
				:attr('colspan', colsub1)
		end
		if (PAZ or PAD) and not HB then
			if args['DMG1'] then
				row:tag('th')
					:wikitext('Mandate')
					:attr('colspan', 2)
			else
			row:tag('th')
				:wikitext('Mandate<br/>Gesamt')
				:attr('rowspan', 2)
			end
			if args['BG'] then
				row:tag('th')
					:wikitext('[[Berliner Bundestagsabgeordneter|Berliner<br/>Abg.]]')
					:attr('rowspan', 2)
			end
		end
		row = root:tag('tr')
		row:tag('th')
			:wikitext(PAG and 'Anzahl' or 'Stimmen')
		row:tag('th')
			:wikitext('%')
		if parl and args['DS1'] then
			row:tag('th')
				:wikitext('+/-')
		end
		if PAZ or PAD then
			row:tag('th')
				:wikitext('Mandate')
			if args['DM1'] then
				row:tag('th')
					:wikitext('+/-')
			end
		end
		if PAG then
			row:tag('th')
				:wikitext('Direkt-<br/>Mandate')
			row:tag('th')
				:wikitext('Listen-<br/>Mandate')
			row:tag('th')
				:wikitext('Gesamt<br/>Mandate')
			if args['DMG1'] then
				row:tag('th')
					:wikitext('+/-')
			end
		else
			row:tag('th')
				:wikitext('Stimmen')
			row:tag('th')
				:wikitext('%')
		end
		if PAZ or PAD then
			if args['DSZ1'] then
				row:tag('th')
					:wikitext('+/-')
			end
			if not BY then 
				row:tag('th')
					:wikitext('Mandate')
				if args['DMZ1'] then
					row:tag('th')
						:wikitext('+/-')
				end
			end
			if PAD or AUT then
				row:tag('th')
					:wikitext('Stimmen')
				row:tag('th')
					:wikitext('%')
				if args['DSD1'] then
					row:tag('th')
						:wikitext('+/-')
				end
				row:tag('th')
					:wikitext('Mandate')
				if args['DMD1'] then
					row:tag('th')
						:wikitext('+/-')
				end
			end
			if args['DMG1'] then
				row:tag('th')
					:wikitext('Anzahl')
				row:tag('th')
					:wikitext('+/-')
			end
		end
	else
		row:tag('th')
			:wikitext('Stimmen')
		row:tag('th')
			:wikitext('%')
		if args['DS1'] then
			row:tag('th')
				:wikitext('+/-')
		end
		if PA then
			row:tag('th')
				:wikitext('Mandate')
			if args['DM1'] then
				row:tag('th')
					:wikitext('+/-')
			end
		end
	end
	
	for k,v in ipairs(args) do
		row = root:tag('tr')
		local i = 0
		for datum = 1, 60 do i = i + 1
			
			if PR and tonumber(k) and (((k - 1)/3 + 1) == i) then
				if farben then
					row:tag('td')
						:css('background', '#'..farbe({args[k+1]}))
						:css('width', '0px')
				end
				row:tag('td')
					:wikitext(v)
					:css('text-align', 'left')
				row:tag('td')
					:wikitext(args[k+1])
					:css('text-align', 'left')
				row:tag('td')
					:wikitext(p.form(args[k+2]))
				row:tag('td')
					:wikitext(p.pz({args[k+2], gesamts}))
				if args['z'..i] then
					row:tag('td')
						:wikitext(p.form(args['z'..i]))
					row:tag('td')
						:wikitext(p.pz({args['z'..i], gesamtsz}))
				end
			elseif PRZ and tonumber(k) and (((k - 1)/4 + 1) == i) then
				if farben then
					row:tag('td')
						:css('background', '#'..farbe({args[k+1]}))
						:css('width', '0px')
				end
				row:tag('td')
					:wikitext(v..(((tonumber(args[k+2]) == maxvalue) and not kein) and gewahlt({'gewählt im WK'}) or ''))
					:css('text-align', 'left')
				row:tag('td')
					:wikitext(args[k+1])
					:css('text-align', 'left')
				row:tag('td')
					:wikitext(p.form(args[k+2]))
				row:tag('td')
					:wikitext(p.pz({args[k+2], gesamts}))
				row:tag('td')
					:wikitext(p.form(args[k+3]))
				row:tag('td')
					:wikitext(p.pz({args[k+3], gesamtsz}))
			elseif PA and tonumber(k) and (((k - 1)/3 + 1) == i) then
				if farben then
					row:tag('td')
						:css('background', '#'..farbe({v}))
						:css('width', '0px')
				end
				row:tag('td')
					:wikitext(v)
					:css('text-align', 'left')
				row:tag('td')
					:wikitext(p.form(args[k+1]))
				row:tag('td')
					:wikitext(p.pz({args[k+1], gesamts}))
				if args['DS1'] then
					row:tag('td')
						:wikitext(args['DS'..i])
				end
				row:tag('td')
					:wikitext(args[k+2])
				if args['DM1'] then
					row:tag('td')
						:wikitext(args['DM'..i])
				end
			elseif PAG and tonumber(k) and (((k - 1)/5 + 1) == i) then
				if farben then
					row:tag('td')
						:css('background', '#'..farbe({v}))
						:css('width', '0px')
				end
				row:tag('td')
					:wikitext(v)
					:css('text-align', 'left')
				row:tag('td')
					:wikitext(p.form(args[k+1]))
				row:tag('td')
					:wikitext(p.pz({args[k+1], gesamts}))
				if args['DS1'] then
					row:tag('td')
						:wikitext(args['DS'..i])
				end
				row:tag('td')
					:wikitext(args[k+2])
				row:tag('td')
					:wikitext(args[k+3])
				row:tag('td')
					:wikitext(args[k+4])
				if args['DMG1'] then
					row:tag('td')
						:wikitext(args['DMG'..i])
				end
			elseif PAZ and tonumber(k) and (((k - 1)/6 + 1) == i) then
				if farben then
					row:tag('td')
						:css('background', '#'..farbe({v}))
						:css('width', '0px')
				end
				row:tag('td')
					:wikitext(v)
					:css('text-align', 'left')
				row:tag('td')
					:wikitext(p.form(args[k+1]))
				row:tag('td')
					:wikitext(p.pz({args[k+1], gesamts}))
				if args['DS1'] then
					row:tag('td')
						:wikitext(args['DS'..i])
				end
				row:tag('td')
					:wikitext(args[k+2])
				if args['DM1'] then
					row:tag('td')
						:wikitext(args['DM'..i])
				end
				row:tag('td')
					:wikitext(p.form(args[k+3]))
				row:tag('td')
					:wikitext(p.pz({args[k+3], gesamtsz, args['klausel']}))
				if args['DSZ1'] then
					row:tag('td')
						:wikitext(args['DSZ'..i])
				end
				if not BY then
					row:tag('td')
						:wikitext(args[k+4])
					if args['DMZ1'] then
						row:tag('td')
							:wikitext(args['DMZ'..i])
					end
				end
				if AUT then
					row:tag('td')
						:wikitext(p.form(args[k+1] + args[k+3]))
					row:tag('td')
						:wikitext(p.pz({args[k+1] + args[k+3], gesamtsd}))
					if args['DSD1'] then
						row:tag('td')
							:wikitext(args['DSD'..i])
					end
					if BY then
						row:tag('td')
							:wikitext(args[k+4])
					elseif HB then
						row:tag('td')
							:wikitext(args[k+5])
					end
					if args['DMD1'] then
						row:tag('td')
							:wikitext(args['DMD'..i])
					end
				end
				if not HB then
					row:tag('td')
						:wikitext(args[k+5])
					if args['DMG1'] then
						row:tag('td')
							:wikitext(args['DMG'..i])
					end
					if args['BG'] then
						row:tag('td')
							:wikitext(args['B'..i] or '&ndash;')
					end
				end
			elseif PAD and tonumber(k) and (((k - 1)/8 + 1) == i) then
				if farben then
					row:tag('td')
						:css('background', '#'..farbe({v}))
						:css('width', '0px')
				end
				row:tag('td')
					:wikitext(v)
					:css('text-align', 'left')
				row:tag('td')
					:wikitext(p.form(args[k+1]))
				row:tag('td')
					:wikitext(p.pz({args[k+1], gesamts}))
				if args['DS1'] then
					row:tag('td')
						:wikitext(args['DS'..i])
				end
				row:tag('td')
					:wikitext(args[k+2])
				if args['DM1'] then
					row:tag('td')
						:wikitext(args['DM'..i])
				end
				row:tag('td')
					:wikitext(p.form(args[k+3]))
				row:tag('td')
					:wikitext(p.pz({args[k+3], gesamtsz}))
				if args['DSZ1'] then
					row:tag('td')
						:wikitext(args['DSZ'..i])
				end
				row:tag('td')
					:wikitext(args[k+4])
				if args['DMZ1'] then
					row:tag('td')
						:wikitext(args['DMZ'..i])
				end
				row:tag('td')
					:wikitext(p.form(args[k+5]))
				row:tag('td')
					:wikitext(p.pz({args[k+5], gesamtsd}))
				if args['DSD1'] then
					row:tag('td')
						:wikitext(args['DSD'..i])
				end
				row:tag('td')
					:wikitext(args[k+6])
				if args['DMD1'] then
					row:tag('td')
						:wikitext(args['DMD'..i])
				end
				row:tag('td')
					:wikitext(args[k+7])
				if args['DMG1'] then
					row:tag('td')
						:wikitext(args['DMG'..i])
				end
			end
		end
	end
	
	if args['jgültige'] then
		row = root:tag('tr')
		row:tag('td')
			:wikitext(args['jname'] or (parl and 'Keine Liste') or 'Kein Kandidat')
			:attr('colspan', colspalte)
			:css('text-align', 'left')
		row:tag('td')
			:wikitext(p.form(args['jgültige']))
		row:tag('td')
			:wikitext(p.pz({args['jgültige'], gesamts}))
		if parl then
			if args['DS1'] then
				row:tag('td')
					:wikitext(args['DJ'])
			end
			row:tag('td')
					:wikitext('&ndash;')
			if args['DM1'] then
				row:tag('td')
					:wikitext('&ndash;')
			end
		end
		if zweite then
			row:tag('td')
				:wikitext(p.form(args['jgültigez']))
			row:tag('td')
				:wikitext(p.pz({args['jgültigez'], gesamtsz}))
			if parl then
				if args['DSZ1'] then
					row:tag('td')
						:wikitext(args['DJZ'])
				end
				row:tag('td')
					:wikitext('&ndash;')
				if args['DMZ1'] then
					row:tag('td')
						:wikitext('&ndash;')
				end
				row:tag('td')
					:wikitext('&ndash;')
				if args['DMG1'] then
					row:tag('td')
						:wikitext('&ndash;')
				end
			end
		end
	end

	if args['rungültige'] then
		row = root:tag('tr')
		row:tag('td')
			:wikitext('Ungültige Stimmen')
			:attr('colspan', colspalte)
			:css('text-align', 'left')
		row:tag('td')
			:wikitext(p.form(args['rungültige']))
		row:tag('td')
			:wikitext(p.pz({args['rungültige'], gesamts}))
		if parl then
			if args['DS1'] then
				row:tag('td')
					:wikitext(args['DR'])
			end
			row:tag('td')
				:wikitext('&ndash;')
			if args['DM1'] then
				row:tag('td')
					:wikitext('&ndash;')
			end
		end
		if zweite then
			row:tag('td')
				:wikitext(p.form(args['rungültigez']))
			row:tag('td')
				:wikitext(p.pz({args['rungültigez'], gesamtsz}))
			if parl then
				if args['DSZ1'] then
					row:tag('td')
						:wikitext(args['DRZ'])
				end
				row:tag('td')
					:wikitext('&ndash;')
				if args['DMZ1'] then
					row:tag('td')
						:wikitext('&ndash;')
				end
				row:tag('td')
					:wikitext('&ndash;')
				if args['DMG1'] then
					row:tag('td')
						:wikitext('&ndash;')
				end
			end
		end
	end
	
	row = root:tag('tr'):addClass('sortbottom')
	row:tag('th')
		:wikitext('Gesamt')
		:attr('colspan', colspalte)
		:css('text-align', 'left')
	row:tag('th')
		:wikitext(p.form(gesamts))
		:css('text-align', 'right')
	row:tag('th')
		:wikitext('100')
		:css('text-align', 'right')
	if parl then
		if args['DS1'] then
			row:tag('th')
		end
		row:tag('th')
			:wikitext(gesamtm)
			:css('text-align', 'right')
		if args['DM1'] then
			row:tag('th')
				:wikitext(args['DM'] or '&ndash;')
				:css('text-align', 'right')
		end
		if PAG then
			row:tag('th')
				:wikitext(gesamtmz)
				:css('text-align', 'right')
			row:tag('th')
				:wikitext(gesamtmg)
				:css('text-align', 'right')
			if args['DMG1'] then
				row:tag('th')
					:wikitext(args['DMG'] or '&ndash;')
					:css('text-align', 'right')
			end
		end
	end
	if zweite then
		row:tag('th')
			:wikitext(p.form(gesamtsz))
			:css('text-align', 'right')
		row:tag('th')
			:wikitext('100')
			:css('text-align', 'right')
		if parl then
			if args['DSZ1'] then
				row:tag('th')
			end
			if not BY then
				row:tag('th')
					:wikitext(gesamtmz)
					:css('text-align', 'right')
				if args['DMZ1'] then
					row:tag('th')
						:wikitext(args['DMZ'] or '&ndash;')
						:css('text-align', 'right')
				end
			end
			if PAD or AUT then
				row:tag('th')
					:wikitext(p.form(AUT and gesamtsg or gesamtsd))
					:css('text-align', 'right')
				row:tag('th')
					:wikitext('100')
					:css('text-align', 'right')
				if args['DSD1'] then
					row:tag('th')
				end
				if not HB then
					row:tag('th')
						:wikitext(BY and gesamtmz or gesamtmd)
						:css('text-align', 'right')
					if args['DMD1'] then
						row:tag('th')
							:wikitext(args['DMD'] or '&ndash;')
							:css('text-align', 'right')
					end
				end
			end
			row:tag('th')
				:wikitext(gesamtmg)
				:css('text-align', 'right')
			if args['DMG1'] or (HB and args['DMD1']) then
				row:tag('th')
					:wikitext(args['DMG'] or args['DMD'] or '&ndash;')
					:css('text-align', 'right')
			end
			if args['BG'] then
				row:tag('th')
					:wikitext(args['BG'])
					:css('text-align', 'right')
			end
		end
	end
	
	if wahler or args['gültige'] or args['rungültige'] or wahlberechtigte then
		row = root:tag('tr'):addClass('sortbottom')
		row:tag('td')
			:attr('colspan', zeile)
	end

	if args['gültige'] or args['rungültige'] then
		row = root:tag('tr'):addClass('sortbottom')
		row:tag('td')
			:wikitext(args['gültige'] and 'Gültige Stimmzettel' or 'Gültige Stimmen')
			:attr('colspan', colspalte)
			:css('text-align', 'left')
			:css('font-weight', 'bold')
		row:tag('td')
			:wikitext(p.form(args['gültige'] or (gesamts - args['rungültige'])))
			:css('font-weight', 'bold')
		row:tag('td')
			:wikitext('&ndash;')
			:css('font-weight', 'bold')
		if args['DS1'] then
			row:tag('td')
				:wikitext('&ndash;')
				:css('font-weight', 'bold')
		end
		if zweite then
			if parl then
				row:tag('td')
			end
			if args['DM1'] then
				row:tag('td')
			end
			row:tag('td')
				:wikitext(p.form(args['gültigez'] or (gesamtsz - args['rungültigez'])))
				:css('font-weight', 'bold')
			row:tag('td')
				:wikitext('&ndash;')
				:css('font-weight', 'bold')
			if args['DSZ1'] then
				row:tag('td')
					:wikitext('&ndash;')
					:css('font-weight', 'bold')
			end
			if PAD or AUT then
				row:tag('td')
				if args['DMZ1'] then
					row:tag('td')
				end
				row:tag('td')
					:wikitext(p.form(gultiged or args['gültiged'] or (gesamtsd - args['rungültiged'])))
					:css('font-weight', 'bold')
				row:tag('td')
					:wikitext('&ndash;')
					:css('font-weight', 'bold')
				if args['DSD1'] then
					row:tag('td')
						:wikitext('&ndash;')
						:css('font-weight', 'bold')
				end
			end
		end
	end
	
	if wahler or args['rungültige'] then
		if args['hungültige'] then
			row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext(args['hname'] or (parl and 'Keine Liste') or 'Kein Kandidat')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
			row:tag('td')
				:wikitext(p.form(args['hungültige']))
			row:tag('td')
				:wikitext(p.pz({args['hungültige'], wahler}))
			if args['DS1'] then
				row:tag('td')
					:wikitext(args['DH'])
			end
		end
		if args['leere'] and args['ungültige'] then
			row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext('Leere Stimmzettel')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
			row:tag('td')
				:wikitext(p.form(args['leere']))
			row:tag('td')
				:wikitext(p.pz({args['leere'], (args['rungültige'] and gesamts or wahler)}))
			if args['DS1'] then
				row:tag('td')
					:wikitext(args['DL'])
			end
			if zweite then
				if parl then
					row:tag('td')
				end
				if args['DM1'] then
					row:tag('td')
				end
				row:tag('td')
					:wikitext(p.form(args['leerez']))
				row:tag('td')
					:wikitext(p.pz({args['leerez'], wahlerz}))
				if args['DSZ1'] then
					row:tag('td')
						:wikitext(args['DLZ'])
				end
			end
			row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext('Ungültige Stimmzettel')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
			row:tag('td')
				:wikitext(p.form(args['ungültige']))
			row:tag('td')
				:wikitext(p.pz({args['ungültige'], (args['rungültige'] and gesamts or wahler)}))
			if args['DS1'] then
				row:tag('td')
					:wikitext(args['DU'])
			end
			if zweite then
				if parl then
					row:tag('td')
				end
				if args['DM1'] then
					row:tag('td')
				end
				row:tag('td')
					:wikitext(p.form(args['ungültigez']))
				row:tag('td')
					:wikitext(p.pz({args['ungültigez'], (args['rungültigez'] and gesamtsz or wahlerz)}))
				if args['DSZ1'] then
					row:tag('td')
						:wikitext(args['DUZ'])
				end
			end
		elseif not args['rungültige'] then
			row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext(args['gültige'] and 'Ungültige Stimmzettel' or 'Ungültige Stimmen')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
			row:tag('td')
				:wikitext(p.form(ungultige))
			row:tag('td')
				:wikitext(p.pz({ungultige, wahler}))
			if args['DS1'] then
				row:tag('td')
					:wikitext(args['DU'])
			end
			if zweite then
				if parl then
					row:tag('td')
				end
				if args['DM1'] then
					row:tag('td')
				end
				row:tag('td')
					:wikitext(p.form(ungultigez))
				row:tag('td')
					:wikitext(p.pz({ungultigez, wahlerz}))
				if args['DSZ1'] then
					row:tag('td')
						:wikitext(args['DUZ'])
				end
				if PAD or AUT then
					if not BY then
						row:tag('td')
						if args['DMZ1'] then
							row:tag('td')
						end
					end
					row:tag('td')
						:wikitext(p.form(ungultiged))
					row:tag('td')
						:wikitext(p.pz({ungultiged, wahlerd}))
					if args['DSD1'] then
						row:tag('td')
							:wikitext(args['DUD'])
					end
				end
			end
		end
		if args['abgegebene'] then
			row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext(args['gültige'] and 'Abgegebene Stimmzettel' or 'Abgegebene Stimmen')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
				:css('font-weight', 'bold')
			row:tag('td')
				:wikitext(p.form(args['abgegebene']))
				:css('font-weight', 'bold')
			row:tag('td')
				:wikitext('&ndash;')
				:css('font-weight', 'bold')
			if args['DS1'] then
				row:tag('td')
					:wikitext('&ndash;')
					:css('font-weight', 'bold')
			end
			if zweite then
				if parl then
					row:tag('td')
				end
				if args['DM1'] then
					row:tag('td')
				end
				row:tag('td')
					:wikitext(p.form(args['abgegebenez']))
					:css('font-weight', 'bold')
				row:tag('td')
					:wikitext('&ndash;')
					:css('font-weight', 'bold')
				if args['DSZ1'] then
					row:tag('td')
						:wikitext('&ndash;')
						:css('font-weight', 'bold')
				end
				if PAD or AUT then
					if not BY then
						row:tag('td')
						if args['DMZ1'] then
							row:tag('td')
						end
					end
					row:tag('td')
						:wikitext(p.form(abgegebened))
						:css('font-weight', 'bold')
					row:tag('td')
						:wikitext('&ndash;')
						:css('font-weight', 'bold')
					if args['DSD1'] then
						row:tag('td')
							:wikitext('&ndash;')
							:css('font-weight', 'bold')
					end
				end
			end
			row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext(args['gültige'] and 'Nicht abgegebene Stimmzettel' or 'Ausgefallene Stimmen')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
			row:tag('td')
				:wikitext(p.form(wahler - args['abgegebene']))
			row:tag('td')
				:wikitext(p.pz({(wahler - args['abgegebene']), wahler}))
			if args['DS1'] then
				row:tag('td')
					:wikitext(args['DA'])
			end
			if zweite then
				if parl then
					row:tag('td')
					if args['DM1'] then
						row:tag('td')
					end
				end
				row:tag('td')
					:wikitext(p.form(wahlerz - args['abgegebenez']))
				row:tag('td')
					:wikitext(p.pz({(wahlerz - args['abgegebenez']), wahlerz}))
				if args['DS1'] then
					row:tag('td')
						:wikitext(args['DAZ'])
				end
				if PAD or AUT then
					if not BY then
						row:tag('td')
						if args['DMZ1'] then
							row:tag('td')
						end
					end
					row:tag('td')
						:wikitext(p.form(ausgefallened))
					row:tag('td')
						:wikitext(p.pz({ausgefallened, wahlerd}))
					if args['DSD1'] then
						row:tag('td')
					end
				end
			end
		end
	end
	
	if args['rungültige'] then
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('th')
				:wikitext('Wähler')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
				:css('font-weight', 'bold')
			row:tag('th')
				:wikitext(p.form(gesamts))
				:css('text-align', 'right')
				:css('font-weight', 'bold')
			row:tag('th')
				:wikitext(p.pz({gesamts, wahlberechtigte}))
				:css('text-align', 'right')
			if args['DS1'] then
				row:tag('th')
					:wikitext(args['DW'])
					:css('text-align', 'right')
			end
			if zweite then
				if parl then
					row:tag('th')
				end
				if args['DM1'] then
					row:tag('th')
				end
				row:tag('th')
					:wikitext(p.form(gesamtsz))
					:css('text-align', 'right')
					:css('font-weight', 'bold')
				row:tag('th')
					:wikitext(p.pz({gesamtsz, wahlberechtigtez}))
					:css('text-align', 'right')
				if args['DSZ1'] then
					row:tag('th')
						:wikitext(args['DWZ'])
						:css('text-align', 'right')
				end
			end
	elseif wahler then
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('th')
				:wikitext('Wähler')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
			row:tag('th')
				:wikitext(p.form(wahler))
				:css('text-align', 'right')
			row:tag('th')
				:wikitext(p.pz({wahler, wahlberechtigte}))
				:css('text-align', 'right')
		if args['DS1'] then
			row:tag('th')
				:wikitext(args['DW'])
				:css('text-align', 'right')
		end
		if zweite then
			if parl then
				row:tag('th')
			end
			if args['DM1'] then
				row:tag('th')
			end
			row:tag('th')
				:wikitext(p.form(wahlerz))
				:css('text-align', 'right')
			row:tag('th')
				:wikitext(p.pz({wahlerz, wahlberechtigtez}))
				:css('text-align', 'right')
			if args['DSZ1'] then
				row:tag('th')
					:wikitext(args['DWZ'])
					:css('text-align', 'right')
			end
			if PAD or AUT then
				if not BY then
					row:tag('th')
					if args['DMZ1'] then
						row:tag('th')
					end
				end
				row:tag('th')
					:wikitext(p.form(wahlerd))
					:css('text-align', 'right')
				row:tag('th')
					:wikitext(p.pz({wahlerd, wahlberechtigted}))
					:css('text-align', 'right')
				if args['DSD1'] then
					row:tag('th')
						:wikitext(args['DWD'])
						:css('text-align', 'right')
				end
			end
		end
	end
	
	if wahlberechtigte then
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext('Wahlberechtigte')
				:attr('colspan', colspalte)
				:css('text-align', 'left')
			row:tag('td')
				:wikitext(p.form(wahlberechtigte))
			row:tag('td')
		if args['DS1'] then
			row:tag('td')
		end
		if zweite then
			if parl then
				row:tag('td')
			end
			if args['DM1'] then
				row:tag('td')
			end
			row:tag('td')
				:wikitext(p.form(wahlberechtigtez))
			row:tag('td')
			if args['DSZ1'] then
				row:tag('td')
			end
			if PAD or AUT then
				if not BY then
					row:tag('td')
					if args['DMZ1'] then
						row:tag('td')
					end
				end
				row:tag('td')
					:wikitext(p.form(wahlberechtigted))
				row:tag('td')
				if args['DSD1'] then
					row:tag('td')
				end
			end
		end
	end

	if kein then
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:attr('colspan', zeile)
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext('<span style="font-weight:bold">Anmerkung:</span> kein Kandidat hat ein Direktmandat bekommen (siehe [[Bundestagswahlrecht#Sitzverteilung_ab_2023|Wahlrechtsreform]])')
				:attr('colspan', zeile)
				:css('font-size', '90%')
				:css('text-align', 'left')
	end
	if args['url'] or args['quelle'] or args['quellen'] then
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:attr('colspan', zeile)
	end
	
	if args['url'] or args['quelle'] or args['quellen'] then
		quelle = ((args['url'] or args['quelle']) and 'Quelle' or 'Quellen')..': '..(args['url'] and '['..args['url']..' '..(args['quelle'] or 'Innenministerium')..']' or args['quelle'] or args['quellen'])
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext(quelle)
				:attr('colspan', zeile)
				:css('text-align', 'left')
	end


	local index = {}
	local i = 0
	for datum = 1, 50 do i = i + 1
		if args['k'..i] then table.insert(index, i) end
		if args['v'..i] == 'ja' then verzicht = true end
		if args['op'..i] then option = true end
	end

	local rootz = mw.html.create('table'):addClass('wikitable sortable')

	if args['p1'] then
		rootz
			:tag('th'):attr('colspan', '2'):wikitext('Listen'):done()
			:tag('th'):wikitext('Kandidaten'):done()
		if args['w1'] then
			rootz
				:tag('th'):wikitext('Wahlkreis'):done()
		end
		if args['s1'] then
			rootz
				:tag('th'):wikitext('Stimmen'):done()
		end

		for i, v in ipairs(index) do
			row = rootz:tag('tr')

			if args['v'..v] then
				if args['v'..v] == 'ja' then x = '&#11119; ' else x = '<sup>'..args['v'..v]..' </sup>' end
				else x = ''
			end
			if args['b'..v] then kand = x..' '..args['b'..v]..' '..args['k'..v] else
				if args['link'..v] then kand = x..'[['..args['link'..v]..'|'..args['a'..v]..' '..args['k'..v]..']]'
					else kand = x..'[['..args['a'..v]..' '..args['k'..v]..']]'
				end
			end

			if args['p'..v] then
				row:tag('td')
					:attr('rowspan', args['n'..v])
					:css('width', '0px')
					:css('background', '#'..(args['f'..v] or farbe({(args['pf'..v] or args['p'..v])})))
				row:tag('td')
					:attr('rowspan', args['n'..v])
					:wikitext(args['p'..v])
			end
			row:tag('td')
				:wikitext('<span data-sort-value="'..args['k'..v]..'">'..kand..'</span>')
			if args['w'..v] then
				row:tag('td')
					:wikitext(args['w'..v])
					:css('text-align', 'center')
			end
			if args['s'..v] then
				row:tag('td')
					:wikitext(tonumber(args['s'..v]) and mw.getLanguage('de'):formatNum(tonumber(args['s'..v])) or '&ndash;')
					:css('text-align', 'center')
			end
		end
		if verzicht or option then
			row = rootz:tag('tr'):addClass('sortbottom')
				row:tag('td')
					:attr('colspan', 4)
			if verzicht then
				row = rootz:tag('tr'):addClass('sortbottom')
					row:tag('td')
						:attr('colspan', 4)
						:wikitext('&#11119; : Verzicht auf den Sitz')
						:css('font-size', '90%')
			end
			for i, v in ipairs(index) do
				if args['op'..v] and args['opw'..v] then opt = '<span style=font-style:italic>'..args['op'..v]..'</span>: '..args['opw'..v] end
				if args['op'..v] then
					row = rootz:tag('tr'):addClass('sortbottom')
						row:tag('td')
							:attr('colspan', 4)
							:wikitext('Option '..opt)
							:css('font-size', '90%')
				end
			end
			if args['kurl'] then kquelle = 'Quelle: ['..args['kurl']..' '..args['kquelle']..']' elseif args['kquellen'] then kquelle = 'Quellen: '..args['kquellen'] end
			if args['kurl'] or args['kquellen'] then
				row = rootz:tag('tr'):addClass('sortbottom')
					row:tag('td')
						:attr('colspan', 4)
				row = rootz:tag('tr'):addClass('sortbottom')
					row:tag('td')
						:wikitext(kquelle)
						:attr('colspan', 4)
			end
		end
	end
	if args[1] and args['p1'] then return tostring(root)..tostring(rootz)..'<div style="clear:both"></div>' elseif args[1] then return tostring(root) else return tostring(rootz) end
end

return p