Modul:Achsendiagramm

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

local function konv(w)
	local t = w
	local x = mw.ustring.find(t, '%,')
	if x then
	y = mw.ustring.sub(t, 1, x-1)
	z = mw.ustring.sub(t, x+1, x+3)
	c = y..'.'..z
	return tonumber(c)  else return t end
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 lenint = string.len(math.max(math.ceil(math.abs(maxval)), math.ceil(math.abs(minval))))
	local lendec = mw.ustring.find(scale/logvalue, '%.') and mw.ustring.len(mw.ustring.sub(scale/logvalue, (mw.ustring.find(scale/logvalue, '%.')))) or 0
	local leninfra = args['infra'] and string.len(args['infra']) or 0
	local anzahl = math.max(lenint, lendec, leninfra)
	local left = 8 * anzahl + 8
	local gruppe = tonumber(args['gruppe'])
	local pillar = args['width'] or 36

	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
		if args['w'..i] and not args['w'..(i+1)] then breite = left + 4 + i * (pillar + 4) * (args['a1'] and 1.55 or 1) + (gruppe and (20 * (i/gruppe - 1)) or 0) end
	end
	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 = tonumber(args['a'..v]) and unit * math.abs(tonumber(args['a'..v])) * logvalue or 0
		spalte = tonumber(args['w'..v]) and unit * math.abs(tonumber(args['w'..v])) * logvalue or 0
		k = gruppe and v - gruppe * math.floor((v-1)/gruppe) or v
		border = (tonumber(args['w'..v]) and (tonumber(args['w'..v]) > 0 or tonumber(args['w'..v]) < 0)) and 1 or 0
		if args['w'..v] then
			if args['a'..v] then
				root:tag('div')
					:css('position', 'absolute')
					:css('margin-top', '-'..(spaltedav - border + 2)..'px')
					:css('margin-left', (left + 2 + (v-1) * (pillar * 1.6 + 4))..'px')
					:css('width', (pillar*0.6)..'px')
					:css('height', (spaltedav > border and (spaltedav - border) or 0)..'px')
					:css('border-top', ((tonumber(args['a'..v]) and 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')
				: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 + 2 + (v - 1) * (pillar + 4 + (args['a1'] and (pillar * 0.6) or 0)) + (args['a1'] and (pillar * 0.6) or 0) + ((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', pillar..'px')
				: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
	if args['infra'] then
		root:tag('div')
			:wikitext('<div style="position:absolute;margin-top:-'..((minneg + logvalue * unit * args['infra']) + 1.5)..'px;width:'..breite..'px;height:3px;background-color:#'..(args['zeilenfarbe'] or '50C878')..'"><div class="hintergrundfarbe1" style="position:absolute;bottom:-6.5px;font-size:10px;padding-right:2px">'..fnum(tonumber(args['infra']))..'</div></div>')
	end
	
	local rootvalues = mw.html.create('div'):css('font-size', '80%')
	for k, v in ipairs(index) do
		spaltedav = tonumber(args['a'..v]) and unit * math.abs(tonumber(args['a'..v])) * logvalue or 0
		spalte = tonumber(args['w'..v]) and unit * math.abs(tonumber(args['w'..v])) * logvalue or 0
		k = gruppe and v - gruppe * math.floor((v-1)/gruppe) or v
		if args['w'..v] then
			if args['a'..v] then
				if (tonumber(args['a'..v]) or 0) < (tonumber(args['w'..v]) or 0) then
					overtop = (args['w'..v] - args['a'..v]) * unit + 20
					undertop = spalte
					zeichen = '+'
				else
					overtop = 20
					undertop = spalte + ((tonumber(args['a'..v]) or 0) - (tonumber(args['w'..v]) or 0)) * unit
					zeichen = tonumber(args['a'..v]) == tonumber(args['w'..v]) and '±' or ''
				end
				root:tag('div')
					:wikitext('<div style="width:'..(pillar*1.6)..'px;margin-top:-'..overtop..'px"><span class="hintergrundfarbe1">'..fnum(args['w'..v])..'&nbsp;('..zeichen..(string.gsub((string.format('%.1f', ((tonumber(args['w'..v]) or 0) - (tonumber(args['a'..v]) or 0)))), '%.', '%,'))..')</span></div>')
					:wikitext('<div style="width:'..(pillar*1.6)..'px;margin-top:'..undertop..'px"><span class="hintergrundfarbe1">'..args['d'..v]..'</span></div>')
					:css('position', 'absolute')
					:css('margin-top', '-'..spaltedav..'px')
					:css('margin-left', (left + 2 + (v-1) * (pillar * 1.6 + 4))..'px')
					:css('text-align', 'center')
			end
			root:tag('div')
				:wikitext('<span class="hintergrundfarbe1">'.. (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>')
				:wikitext('<div style="margin-top:'..spalte..'px"><span class="hintergrundfarbe1">'..(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:'..((pillar + 4) * 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 + 20) or (minneg + 20))..'px')
				:css('margin-left', (left + 3 + (v - 1) * (pillar + 4) + ((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', pillar..'px')
				:css('text-align', 'center')
		end
	end
	
	local rootdiv = mw.html.create('div'):css('font-size', '80%')
	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
		zeile = (args['infra'] and a == tonumber(args['infra']) * logvalue) and '' or 'border-top:1px solid #C0C0C0'
		number = (args['infra'] and a == tonumber(args['infra']) * logvalue) and '' or fnum(a)
		space = (lowest >= (math.ceil(maxvalue/scale)) * scale - (scale * v)) and 0 or (zelle - 1)
		rootdiv
			:wikitext('<div style="position:relative;height:'..space..'px;width:'..breite..'px;'..zeile..'"><div class="hintergrundfarbe1" style="position:absolute;bottom:'..(space - 8)..'px;font-size:10px;padding-right:2px">'..number..'</div></div>')
			:done()
	end
	
	if args['position'] == 'right' or args['position'] == 'left' then tabfloat = true end

	local rootab = mw.html.create('table'):addClass('wikitable'):css('float', tabfloat and args['position'] or 'inherit'):css(args['position'] == 'right' and 'margin-left' or (args['position'] == 'left' and 'margin-right' or 'margin'), tabfloat and '0.5em' or (args['position'] == 'center' and 'auto' or 'inherit')):css('margin-top', '1em'):css('margin-bottom', '0.5em')
		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)..tostring(rootvalues))
				:css('position', 'relative')
				: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['linienlegende'] then
				row:tag('tr')
					row:tag('td')
						:wikitext('Durchgehende Linie: <span style="font-style:italic">'..args['linienlegende']..'</span>')
						:css('font-size', '90%')
			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(konv(args['w'..num])),}				
		maxvalue = math.max(maxvalue, data[num].w)
		num = num+1
	end

	if args['position'] == 'right' or args['position'] == 'left' then tabfloat = true end

	local root = mw.html.create('table'):addClass('sortable'):css('font-size', '90%'):css('border', '0.1px solid #C0C0C0'):css('border-collapse', 'collapse'):css('float', tabfloat and args['position'] or 'inherit'):css(args['position'] == 'right' and 'margin-left' or (args['position'] == 'left' and 'margin-right' or 'margin'), tabfloat and '0.5em' or (args['position'] == 'center' and 'auto' or 'inherit')):css('margin-top', '1em'):css('margin-bottom', '0.5em')
	row = root:tag('tr')
		row:tag('th')
			:wikitext(args['titel'])
			:css('background-color', '#EAECF0')
			:css('border-bottom', '0.1px solid #C0C0C0')
			:css('text-align', 'center')
			:css('font-weight', 'bold')
			:css('padding-top', '0.2em')
			:css('padding-bottom', '0.2em')
			:attr('colspan', 3)
	row = root:tag('tr'):css('border-bottom', '0.1px solid #C0C0C0'):css('line-height', '1.8em'):css('font-size', '92%')
		row:tag('th')
			:wikitext(args['untertitel1'] or 'Daten')
			:css('background-color', 'rgb(170 170 170 / 0.1)')
			:css('color', 'var(--color-base, #202122)')
			:css('padding-left', '0.5em')
			:css('border-right', '0.1px solid #C0C0C0')
		row:tag('th')
			:wikitext(args['untertitel2'] or 'Werte')
			:attr('colspan', 2)
			:css('background-color', 'rgb(170 170 170 / 0.1)')
			:css('color', 'var(--color-base, #202122)')
				
	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'):css('border-top', '0.1px solid #E6E6E6')
				row:tag('td')
					:wikitext(args['d'..v].. anm)
					:css('padding-left', '0.5em')
					:css('padding-right', '1em')
					:css('border-right', '0.1px solid #C0C0C0')					
				row:tag('td')
					:wikitext('<div style="background-color:#'..(args['f'..v] or args['farbe'] or '6495ED')..';width:'.. konv(args['w'..v])*(args['width'] or 200)/maxvalue..'px;height:1.2em"></div>')
					:css('border-right', '0.1px solid #E6E6E6')
					:css('padding-right', '1em')
				row:tag('td')
					:wikitext(fnum(args['w'..v]))
					:css('text-align', 'right')
					:css('padding-left', '1em')
					:css('padding-right', '1em')
		end
	end
	if anmerkung or args['quelle'] then
		row = root:tag('tr'):css('border-top', '0.1px solid #C0C0C0'):addClass('sortbottom')
			row:tag('td')
				:css('height', '0.2em')
				:attr('colspan', '3')
	end
	for k, v in ipairs(index) do		
		if (args['a'..v] and args['t'..v]) then
			row = root:tag('tr'):css('border-top', '0.1px solid #C0C0C0'):addClass('sortbottom')
				row:tag('td')
					:wikitext('<sup>'..args['a'..v]..'</sup> '..args['t'..v]..'')
					:css('padding-left', '0.5em')
					:attr('colspan', 3)
		end
	end
	if args['quelle'] then
		row = root:tag('tr'):css('border-top', '0.1px solid #C0C0C0'):addClass('sortbottom')
			row:tag('td')
				:wikitext('Quelle: '..(args['url'] and '['..args['url']..' '..args['quelle']..']' or args['quelle']))
				:css('padding-left', '0.5em')
				:attr('colspan', 3)
	end
	return root
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.