Modul:Vorlage:LAGIS Einwohner Diagramm

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
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;">&nbsp;</td><td style="width:{BARWIDTH}; min-width:{BARWIDTH};"></td><td style="padding:0px, 4px; width:5em; text-align:right;">&nbsp;</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;">&nbsp;&emsp;</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&shy;risches Ge&shy;mein&shy;de&shy;ver&shy;zeich&shy;nis für Hessen: Die Be&shy;völ&shy;ke&shy;rung der Ge&shy;mei&shy;nden 1834 bis 1967. Wies&shy;baden: Hes&shy;sisches Statis&shy;tisches Lan&shy;des&shy;amt,&nbsp;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