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])..' ('..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 '–'
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.
- 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:
- 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.
- 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.
- 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.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.