Modul:Vorlage:LAGIS Einwohner Diagramm
Vorlagenprogrammierung | Diskussionen | Lua | Unterseiten | |||
Modul | Deutsch | English
|
Modul: | Dokumentation |
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
Dieses Modul dient der Performance von Vorlage:LAGIS Einwohner Diagramm.
local safesub = function ( adjust, adapt, assign )
-- Sichere einmalige Textersetzung
-- Precondition:
-- adjust -- string, mit Basis-Text
-- adapt -- string, mit zu ersetzendem Text
-- assign -- string, mit ersetzendem Text
-- Postcondition:
-- Returns string
local i = adjust:find( adapt, 1, true)
local r
if i then
local k = #adapt
if i > 1 then
r = string.format( "%s%s%s",
adjust:sub( 1, i - 1 ),
assign,
adjust:sub( i + k ) )
else
r = assign .. adjust:sub( k )
end
end
return r or adjust
end -- safesub()
local p = {}
function p.Execute(frame)
local Diagramm = '<table cellspacing="0" cellpadding="0" {FLOAT} style="border:1px solid silver; font-size:90%; padding:0.4em; width:{BREITE}; margin-top:2px; margin-bottom:2px;"><tr style="background:CornflowerBlue;"><th style="text-align:center; font-size:100%;" colspan="5">{NAME}: Einwohnerzahlen von {VON} bis {BIS}</th></tr><tr style="font-size:90%;"><td style="padding:0px, 4px;">Jahr</td><td style="padding:0px, 4px; text-align:right;"> </td><td style="width:{BARWIDTH}; min-width:{BARWIDTH};"></td><td style="padding:0px, 4px; width:5em; text-align:right;"> </td><td style="padding:0px, 4px; text-align:right;">Einwohner</td></tr>{ALLBARS}<tr><td colspan="5" style="padding:4px">{DATEN1834}{QUELLE}</td></tr></table>'
local BarOrg = '<tr style="line-height:0.8em;"><td colspan="2" style="padding-right:0.4em; padding-left:0.4em;">{JAHR}</td><td style="border:1px solid silver;"><div style="background:CornflowerBlue; width:{PIXEL}px; overflow:hidden;">  </div></td><td colspan="2" style="min-width:3em; padding-left:0.4em; padding-right:0.4em; text-align:right;">{ZAHL}</td></tr>'
local Bar = ""
local AllBars = ""
local Daten1834 = "Datenquelle: Histo­risches Ge­mein­de­ver­zeich­nis für Hessen: Die Be­völ­ke­rung der Ge­mei­nden 1834 bis 1967. Wies­baden: Hes­sisches Statis­tisches Lan­des­amt, 1968."
local Daten1834_da = 0
local A_Float = frame.args["Float"] or ""
local A_Name = frame.args["Name"] or "?"
local A_Barwidth = frame.args["Barwidth"] or ""
local A_MaxEinwohner = frame.args["MaxEinwohner"] or ""
local A_Quelle = frame.args["Quelle"] or ""
local Barwidth = 0 -- max. Balkenbreite
local Width = 0 -- Breite der Tabellenspalte
local MaxEinwohner = 0 -- Maximum von maxEinwohner und allen Werten
local MaxAusWerten = 0 -- Ein Wert größer als MaxEinwohner
local T_JahrOrg = {1834,1840,1846,1852,1858,1864,1871,1875,1885,1895,1905,1910,1925,1939,1946,1950,1956,1961,1967}
local T_Jahr = {} -- nimmt nur Jahreszahlen mit zugehörigem Wert auf. Das erlaubt Lücken
local T_Value = {} -- Einwohnerwerte
local T_Bars = {} -- Die TR-Tags
local Value = 0
local Pixel = 0 -- Die Balkenbreite
local debug ='Debug: '
if tonumber(A_MaxEinwohner) then
MaxEinwohner = math.max(0,math.floor(tonumber(A_MaxEinwohner)))
end
Diagramm = safesub(Diagramm,"{NAME}",A_Name)
if A_Float == 'left' then
Diagramm = mw.ustring.gsub(Diagramm,"{FLOAT}",'class="float-left"')
elseif A_Float == 'center' then
Diagramm = mw.ustring.gsub(Diagramm,"{FLOAT}",'class="centered"')
elseif A_Float == 'none' then
Diagramm = mw.ustring.gsub(Diagramm,"{FLOAT}",' ')
else
Diagramm = mw.ustring.gsub(Diagramm,"{FLOAT}",'class="float-right"')
end
if tonumber(A_Barwidth) then
Barwidth = math.floor(tonumber(A_Barwidth))
else
Barwidth = 400
end
Width = Barwidth + 80
Diagramm = mw.ustring.gsub(Diagramm,"{BREITE}" ,tostring(Width).."px" )
Diagramm = mw.ustring.gsub(Diagramm,"{BARWIDTH}",tostring(Barwidth).."px")
-- Werte für Jahre vor 1834
local A_Vor1834 = frame.args["Vor1834"] or ""
debug=debug..'VOR:'..A_Vor1834..'/'
local j, v, jahr, wert
local j_max = 1834
local j_min = 0
for j, v in string.gmatch(A_Vor1834,'%(+%s*(%d+)%s*,%s*(\-?%d+)%s*%)') do
debug=debug..'J:'..j..'V:'..v
jahr = tonumber(j)
wert = tonumber(v)
if jahr < j_max and jahr > j_min then
table.insert(T_Jahr, jahr)
table.insert(T_Value, wert)
j_min = jahr
if wert >= MaxEinwohner then
MaxEinwohner = wert
MaxAusWerten = 1
end
end
end
-- Nur gültige Zahlen in Tabelle T_Value einlesen und dabei das Maximum feststellen
for idx= 1, 19 do
Value = tonumber(frame.args[idx] or "")
if Value then
Value = math.max(-1, math.floor(Value)) -- negative Werte auf -1 setzen.
table.insert(T_Jahr,T_JahrOrg[idx])
table.insert(T_Value,Value)
Daten1834_da = 1
if Value >= MaxEinwohner then
MaxEinwohner = Value
MaxAusWerten = 1
end
end
end
-- Werte für Jahre nach 1967
local A_Nach1967 = frame.args["Nach1967"] or ""
debug=debug..'NACH:'..A_Nach1967..'/'
j_max = 3000
j_min = 1967
for j, v in string.gmatch(A_Nach1967,'%(+%s*(%d+)%s*,%s*(\-?%d+)%s*%)') do
debug=debug..'J:'..j..'V:'..v
jahr = tonumber(j)
wert = tonumber(v)
if jahr < j_max and jahr > j_min then
table.insert(T_Jahr, jahr)
table.insert(T_Value, wert)
j_min = jahr
if wert >= MaxEinwohner then
MaxEinwohner = wert
MaxAusWerten = 1
end
end
end
if MaxAusWerten > 0 then
MaxEinwohner = MaxEinwohner * 1.03 -- 3% freilassen
end
if Daten1834_da > 0 then
Diagramm = mw.ustring.gsub(Diagramm,"{DATEN1834}",Daten1834)
else
Diagramm = mw.ustring.gsub(Diagramm,"{DATEN1834}","")
end
if A_Quelle == "" then
Diagramm = safesub(Diagramm,"{QUELLE}","")
else
if Daten1834_da > 0 then
Diagramm = safesub(Diagramm,"{QUELLE}",'<br /> Weitere Quellen: '..A_Quelle)
else
Diagramm = safesub(Diagramm,"{QUELLE}",' Quellen: '..A_Quelle)
end
end
debug=debug..'MAX:'..MaxEinwohner
Diagramm = mw.ustring.gsub(Diagramm,"{VON}",tostring(T_Jahr[1]))
Diagramm = mw.ustring.gsub(Diagramm,"{BIS}",tostring(T_Jahr[#T_Jahr]))
for idx = 1, #T_Value do
Bar = BarOrg
Bar = mw.ustring.gsub(Bar,"{JAHR}",tostring(T_Jahr[idx]))
Value = T_Value[idx]
if Value < 0 then
Bar = mw.ustring.gsub(Bar,"{ZAHL}","?")
Value = 1
else
Bar = mw.ustring.gsub(Bar,"{ZAHL}",frame:callParserFunction('formatnum',Value))
end
Pixel = Value / MaxEinwohner * Barwidth
Bar = mw.ustring.gsub(Bar,"{PIXEL}",tostring(Pixel))
table.insert(T_Bars,Bar)
end
AllBars = table.concat(T_Bars)
Diagramm = mw.ustring.gsub(Diagramm,"{ALLBARS}",AllBars)
-- mw.log(debug)
return Diagramm
end
return p