Modul:Achsendiagramm
Erscheinungsbild
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 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 * 45 * (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) * 70)..'px')
:css('width', '30px')
: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 + (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
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:65px;margin-top:-'..overtop..'px"><span class="hintergrundfarbe1">'..fnum(args['w'..v])..' ('..zeichen..(string.gsub((string.format('%.1f', ((tonumber(args['w'..v]) or 0) - (tonumber(args['a'..v]) or 0)))), '%.', '%,'))..')</span></div>')
:wikitext('<div style="width:65px;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) * 70)..'px')
:css('width', '30px')
: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:'..(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 + 20) or (minneg + 20))..'px')
:css('margin-left', (left + (args['a1'] and (v-1) * 25 + 27 or 3) + (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('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
local rootab = mw.html.create('table'):addClass('wikitable'):css('float', args['float'] or 'inherit'):css(args['float'] == 'right' and 'margin-left' or (args['float'] == 'left' and 'margin-right' or 'margin'), args['float'] and '0.5em' or (args['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 '–'
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
local root = mw.html.create('table'):addClass('sortable'):css('font-size', '90%'):css('border', '0.1px solid #C0C0C0'):css('border-collapse', 'collapse'):css('float', args['float'] or 'inherit'):css(args['float'] == 'right' and 'margin-left' or (args['float'] == 'left' and 'margin-right' or 'margin'), args['float'] and '0.5em' or (args['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