Modul:Achsendiagramm

Dies ist die aktuelle Version dieser Seite, zuletzt bearbeitet am 25. Juni 2025 um 18:31 Uhr durch Zukunft99 (Diskussion | Beiträge).
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Vorlagenprogrammierung Diskussionen Lua Unterseiten
Modul Deutsch English

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


local p = {}
local getArgs = require('Module:Arguments').getArgs
local hellere = require('Modul:Partei').hell

local function fnum(a)
	x = string.gsub(a, '%.', '%,')
	while true do 
		x, k = string.gsub(x, '^(-?%d+)(%d%d%d)', '%1.%2')
 	if k == 0 then break end
	end
	return x
end

function p.diagramm(frame)
	local args = getArgs(frame)
	local data = {}
	local maxval = 0
	local minval = 0
	local num = 1
	while args['w'..num] do
		data[num] = {w = tonumber(args['w'..num]) or tonumber(args['a'..num]) or 0}
			maxval = math.max(maxval, data[num].w)
			minval = math.min(minval, data[num].w)
			num = num+1
	end
	logvalue = math.max(maxval > 0 and 10^(1-(math.floor(math.log10(math.abs(maxval))))) or -999999, minval < 0 and 10^(1-(math.floor(math.log10(math.abs(minval))))) or -999999)
	height = args['height'] or 200
	maxvalue = maxval * logvalue
	minvalue = minval * logvalue
	maximum = math.max(maxvalue > 0 and maxvalue or 0, minvalue < 0 and math.abs(minvalue) or 0)
	unit = height/((maxvalue > 0 and maxvalue or 0) + (minvalue < 0 and math.abs(minvalue) or 0))
	divisor = (maximum > (30 * math.floor(math.log10(maximum))) and 1 or 0.5) * (logvalue < 0 and logvalue or 10^math.floor(math.abs(math.log10(maximum))))
	scale = tonumber(args['scale']) and (tonumber(args['scale']) * logvalue) or divisor
	zelle = unit * scale
	if minvalue < 0 then minneg = (math.ceil(-minvalue/scale)) * unit * scale
		else minneg = 0
	end
	local maxv = (math.ceil(maxvalue/scale)) * unit * scale
	local anzahl = string.len(math.ceil(math.max(math.abs(maxval), math.abs(minval))))
	local root = mw.html.create('div'):css('font-size', '80%')
	local index = {}
	local i = 0
	for datum = 1, 50 do i = i + 1
		if args['w'..i] then table.insert(index, i) end
	end
	left = 8 * anzahl + 8 + (mw.ustring.find(scale/logvalue, '%.') and (6 * mw.ustring.len(mw.ustring.sub(scale/logvalue, (mw.ustring.find(scale/logvalue, '%.'))))) or 0)

	root:tag('div')
		:wikitext('<div style="position:absolute;margin-top:-'..(maxv + minneg + 10)..'px;height:'..(maxv + minneg + 20)..'px;margin-left:'..left..'px;width:1px;background-color:#C0C0C0"></div>')
					
	for k, v in ipairs(index) do
		spaltedav = unit * math.abs(tonumber(args['a'..v]) or 0) - ((tonumber(args['a'..v]) and (tonumber(args['a'..v]) > 0 or tonumber(args['a'..v]) < 0)) and 1 or 0)
		border = (tonumber(args['w'..v]) and (tonumber(args['w'..v]) > 0 or tonumber(args['w'..v]) < 0)) and 1 or 0
		spalte = tonumber(args['w'..v]) and unit * math.abs(tonumber(args['w'..v])) * logvalue or 0
		gruppe = tonumber(args['gruppe'])
		if args['gruppe'] then k = v - gruppe * math.floor((v-1)/gruppe) else k = v end
		if args['w'..v] then
			breite = left + 4 + v * 45 * (args['a1'] and 1.55 or 1) + ((gruppe and args['w'..v] and not args['w'..tonumber(v+1)]) and (20 * (v/gruppe - 1)) or 0)
			if args['a'..v] then
				if (tonumber(args['a'..v]) < tonumber(args['w'..v])) then
					overtop = (args['w'..v] - args['a'..v]) * unit + 20
					undertop = spalte
					zeichen = '+'
				else
					overtop = 20
					undertop = spalte + (args['a'..v] - args['w'..v]) * unit
					zeichen = tonumber(args['a'..v]) == tonumber(args['w'..v]) and '±' or ''
				end
				root:tag('div')
					:wikitext('<div style="text-align:center;width:65px;margin-top:-'..overtop..'px"><span class="hintergrundfarbe5">'..fnum(args['w'..v])..'&nbsp;('..zeichen..(string.gsub((string.format('%.1f', (args['w'..v] - args['a'..v]))), '%.', '%,'))..')</span></div>')
					:wikitext('<div style="text-align:center;width:65px;margin-top:'..undertop..'px"><span class="hintergrundfarbe5">'..args['d'..v]..'</span></div>')
					:css('position', 'absolute')
					:css('margin-top', '-'..(tonumber(args['a'..v]) and tonumber(args['a'..v]) > 0 and (spaltedav + 2))..'px')
					:css('margin-left', (left + 2 + (v-1) * 70)..'px')
					:css('width', '30px')
					:css('height', spaltedav..'px')
					:css((tonumber(args['a'..v]) and tonumber(args['a'..v]) > 0) and 'border-top' or 'border-bottom', ((tonumber(args['a'..v]) and (tonumber(args['a'..v]) > 0 or tonumber(args['a'..v]) < 0)) and 1 or 0)..'px solid #E0E0E0')
					:css('border-right', '1px solid #E0E0E0')
					:css('border-left', '1px solid #E0E0E0')
					:css('background-color', '#'..(args['f'..v] and hellere({col = args['f'..v], h = '0.5'}) or 'E0EAFC'))
			end
			root:tag('div')
				:wikitext('<div style="text-align:center;margin-top:-20px"><span class="hintergrundfarbe5">'.. (args['a1'] and '' or tonumber(args['w'..v]) and (tonumber(args['w'..v]) >= 0 and fnum(args['w'..v]) or args['d'..k]) or args['w'..v])..'</span></div>')
				:wikitext('<div style="text-align:center;margin-top:'..spalte..'px"><span class="hintergrundfarbe5">'..(args['a1'] and '' or tonumber(args['w'..v]) and (tonumber(args['w'..v]) >= 0 and args['d'..k] or fnum(args['w'..v])) or args['d'..k])..'</span></div>')
				:wikitext((args['w'..v] and args['g'..v]) and '<div class="hintergrundfarbe1" style="text-align:center;font-weight:bold;border:1px solid #C0C0C0;margin-top:'..minneg..'px;height:20px;width:'..(45 * gruppe - 5)..'px;">'..(args['g'..v] or '')..'</div>' or '')
				:css('position', 'absolute')
				:css('margin-top', '-'..(tonumber(args['w'..v]) and tonumber(args['w'..v]) > 0 and (minneg + spalte - border + 2) or (minneg))..'px')
				:css('margin-left', (left + (args['a1'] and (v-1) * 25 + 27 or 2) + (v - 1) * 45 + ((args['g'..v] and tonumber(v) > 1) and (20 * (v-1)/gruppe) or 0) + ((gruppe and not args['g'..v] and tonumber(v) > gruppe) and ((20 * math.floor((v-1)/gruppe)) or 0) or 0))..'px')
				:css('width', '40px')
				:css('height', (spalte > border and (spalte - border) or 0)..'px')
				:css((tonumber(args['w'..v]) and tonumber(args['w'..v]) > 0) and 'border-top' or 'border-bottom', ((tonumber(args['w'..v]) and (tonumber(args['w'..v]) > 0 or tonumber(args['w'..v]) < 0)) and 1 or 0)..'px solid #E0E0E0')
				:css('border-right', '1px solid #E0E0E0')
				:css('border-left', '1px solid #E0E0E0')
				:css('background-color', '#'..(args['f'..k] or '6495ED'))
		end
	end
	local rootdiv = mw.html.create('div')
	if tonumber(minvalue) < 0 then lowest = - (math.ceil(-minvalue/scale)) * scale else lowest = 0 end
	local indez = {}
	local t = -1
	for datum = 1, 50 do t = t + 1
		if lowest <= (math.ceil(maxvalue/scale)) * scale - (scale * t) then table.insert(indez, t) end
	end
	for k, v in ipairs(indez) do
		a = ((math.ceil(maxvalue/scale)) * scale - scale * v)/logvalue
		if args['infra'] and tonumber(args['infra']) == a then
			farbline = true
			colorline = '50C878'
			space = zelle - 3
			zeile = 3
		else
			colorline = 'C0C0C0'
			space = (lowest >= (math.ceil(maxvalue/scale)) * scale - (scale * v)) and 0 or (zelle - 1)
			zeile = 1
		end
		rootdiv
			:wikitext('<div style="position:relative;height:'..space..'px;width:'..breite..'px;border-top:'..zeile..'px solid #'..colorline..'"><div class="hintergrundfarbe1" style="position:absolute;bottom:'..(space - 8)..'px;font-size:10px;padding-right:2px;">&nbsp;'..fnum(a)..'</div></div>')
			:done()
	end
	if tonumber(args['infra']) and not farbline then
		rootdiv
			:wikitext('<div style="position:absolute;margin-left:2.5px;margin-top:-'..(minneg + unit * args['infra'] + 1.5)..'px;width:'..(breite - 2.5)..'px;height:3px;background-color:#50C878"><div class="hintergrundfarbe1" style="position:absolute;bottom:-6.5px;font-size:10px;padding-right:2px;">'..fnum(tonumber(args['infra']))..'</div></div>')
			:done()
	end
	
	local rootab = mw.html.create('table'):addClass('wikitable')
		row = rootab:tag('tr')
			if args['titel'] then
				row:tag('th')
					:wikitext(args['titel'])
				row:tag('tr')
			end
			row:tag('td')
				:wikitext(tostring(rootdiv)..tostring(root))
				:css('padding-top', '22px')
				:css('padding-bottom', args['gruppe'] and '50px' or '22px')
			if args['gruppe'] then
				local legende = root:tag('ul')
					legende:css('column-count', '2')
					legende:css('margin-left', '0')
					legende:css('font-size', '90%')
					for k, v in ipairs(index) do
						if args['f'..v] then
							legende:tag('li')
								:css('list-style-type', 'none')
								:css('list-style-image', 'none')
								:css('margin', '0')
								:tag('span')
									:css('border', '0.1px solid silver')
									:css('width', '1.2em')
									:css('height', '1.2em')
									:css('background-color', '#'..args['f'..v])
									:css('margin-right', '0.3em')
									:css('vertical-align', 'middle')
									:css('display', 'inline-block')
									:done()
								:wikitext(args['name'..v])
						end
					end
				row:tag('tr')
					row:tag('td')
						:wikitext(tostring(legende))
			end
			if args['quelle'] then
				row:tag('tr')
					row:tag('td')
				row:tag('tr')
					row:tag('td')
						:wikitext('Quelle: '..(args['url'] and '['..args['url']..' '..args['quelle']..']' or args['quelle']))
						:css('font-size', '90%')
			end
	return tostring(rootab)
end

local function form(num)
	return (tonumber(num) and mw.getLanguage('de'):formatNum(tonumber(num))) or '&ndash;'
end

function p.balken(frame)
	local args = getArgs(frame)
	local data, index = {}, {}
	local i = 0
	for a = 1, 30 do i = i + 1
		if args['w' .. i] then table.insert(index, i) end
		if args['a' .. i] then anmerkung = true end
	end
	local maxvalue = 0
	local num = 1	
	while (args['w'..num]) do
		data[num] = {w = tonumber(args['w'..num]),}				
		maxvalue = math.max(maxvalue, data[num].w)
		num = num+1
	end

	local root = mw.html.create('table'):addClass('wikitable sortable'):css('font-size', '90%')
	row = root:tag('tr')
	
	row:tag('th')
		:wikitext(args['titel'])
		:attr('colspan', 3)
	row = root:tag('tr')
	row:tag('th')
		:wikitext(args['untertitel1'])
		:css('background-color', 'rgb(170 170 170 / 0.1)')
		:css('color', 'var(--color-base, #202122)')
		:css('font-size', '90%')
	row:tag('th')
		:wikitext(args['untertitel2'])
		:attr('colspan', 2)
		:css('background-color', 'rgb(170 170 170 / 0.1)')
		:css('color', 'var(--color-base, #202122)')
		:css('font-size', '90%')
				
	for k, v in ipairs(index) do
		if args['a'..v] then anm = ' <sup>'..args['a'..v]..'</sup>' else anm = '' end
		if args['d'..v] then
			row = root:tag('tr')
				row:tag('td')
					:wikitext(args['d'..v].. anm)
					:css('padding-right', '20px')
		end
		if args['w' .. v] then
			row:tag('td')
				:wikitext('<div style="margin-left:-6px;background-color:#'..(args['f'..v] or '6495ED')..';width:'.. args['w'..v]*(args['width'] or 100)/maxvalue..'px;height:1.2em"></div>')
				:css('border-right', '0.1px solid #F0F0F0')
			row:tag('td')
				:wikitext(form(args['w'..v]))
				:css('text-align', 'right')
				:css('padding-left', '20px')
				:css('padding-right', '20px')
		end
	end
	if anmerkung or args['quelle'] then
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
			:attr('colspan', '3')
	end
	for k, v in ipairs(index) do		
		if (args['a'..v] and args['t'..v]) then
			row = root:tag('tr'):addClass('sortbottom')
				row:tag('td')
					:wikitext('<sup>'..args['a'..v]..'</sup> '..args['t'..v]..'')
					:attr('colspan', 3)
		end
	end
	if args['quelle'] then
		row = root:tag('tr'):addClass('sortbottom')
			row:tag('td')
				:wikitext('Quelle: '..(args['url'] and '['..args['url']..' '..args['quelle']..']' or args['quelle']))
				:attr('colspan', 3)
	end
	return root
end

return p