Die Dokumentation für dieses Modul kann unter Modul:Vorlage:Fußballtabelle/Doku erstellt werden

local p = {}
	local function hex2dez(str)
		a = tonumber(str,16);
		if a then
			return a
		else
			return 0
		end
	end

	local function CreateHeader(Args)
		local ewig = (Args['ewig'] or '') ~= '';            -- true, wenn nicht leer
		local sortit =  (Args['nosort'] or '') == '';       -- true, wenn nosort leer
		local HasCaption =  (Args['caption'] or '') ~= '';  -- true, wenn nicht leer
		local land =  (Args['land'] or '') ~= '';           -- true, wenn "Land" nicht leer
		local HasQuote = (Args['quote']  or '') ~= '';          -- true, wenn "Quote" nicht leer
		local withcup = (Args['nocup']  or '') == '';        -- true, wenn "Nocup" leer
		local HasBonus = (Args['bonus']  or '') ~= '';       -- true, wenn "Bonus" nicht leer
		local liga  = Args['liga']  or '';
		local extra1  = Args['extra1']  or '';
		local extra2  = Args['extra2']  or '';
		local liga  = Args['liga']  or '';
		local TN = 	Args['teilnahmen'] or '';
		local VH = (Args['VH'] ~= '0');                     -- true, wenn Verhaeltnis nicht 0
		local text =  '<table class="wikitable';
		local team = Args['team'] or '';
		if team == '' then
			team = 'Verein';
		end
		if HasCaption then
			text = tostring(Args['caption'] or '') ..'\n' .. text;
		end
		if sortit then
			text = text .. ' sortable';
		end

		if ewig then
			text = text .. ' zebra';
		end
		if (Args['float'] or '') == 'left' then
			text = text .. ' float-left';
		elseif  (Args['float'] or '') == 'right' then
			text = text .. ' float-right';
		end
		text = text .. '" style="text-align:center; white-space:nowrap;';
		if ewig then
			text = text .. ' font-size:90%; background-color:#F0F0F0"';
		end
		text = text .. 	'>\n';
		-- Table-Tag fertig

		local kopfzeile = '<tr class="hintergrundfarbe5"><th style="width:4ex"><span class="explain" title="Platzierung">Pl.</span></th>';
		kopfzeile =  kopfzeile .. '<th style="width:25ex">' .. team .. '</th>';
		if land then
			kopfzeile =  kopfzeile .. '<th style="width:4ex"><span class="explain" title="Aktueller Landesverband">Land</span></th>';
		end
		if ewig then
			if TN == '' then 
				kopfzeile =  kopfzeile .. '<th style="width:4ex" data-sort-type="number"><span class="explain" title="Anzahl Spielzeiten">Jahre</span></th>';
			else
				kopfzeile =  kopfzeile .. '<th>'.. TN ..'</th>';
			end
		end
		kopfzeile =  kopfzeile .. '<th style="width:4ex"><span class="explain" title="Spiele">Sp.</span></th>';
		kopfzeile =  kopfzeile .. '<th style="width:3ex"><span class="explain" title="Siege">S</span></th>';
		kopfzeile =  kopfzeile .. '<th style="width:3ex"><span class="explain" title="Unentschieden">U</span></th>';
		kopfzeile =  kopfzeile .. '<th style="width:3ex"><span class="explain" title="Niederlagen">N</span></th>';
		if ewig then
			kopfzeile =  kopfzeile ..  '<th style="width:5ex"><span class="explain" title="geschossene Tore">T+</span></th><th style="width:5ex"><span class="explain" title="kassierte Tore">T-</span></th>';
		else
			 kopfzeile =  kopfzeile ..  '<th style="width:5ex"><span class="explain" title="Torverhältnis">Tore</span></th>';
		end
		if VH then
			kopfzeile =  kopfzeile ..  '<th  style="width:5ex">';			
			if HasQuote then
				kopfzeile =  kopfzeile .. '<span class="explain" title="Torquote">Quote</span>';
			else
				kopfzeile =  kopfzeile .. '<span class="explain" title="Tordifferenz">Diff.</span>';
			end
		end
		kopfzeile =  kopfzeile .. '<th style="width:5ex">Punkte</th>';
		if ewig then
			kopfzeile =  kopfzeile ..  '<th style="width:4ex"><span class="explain" title="Durchschnittliche Punktzahl pro Spiel">Ø-Pkt.</span></th>';
			if withcup then
				kopfzeile =  kopfzeile ..  '<th style="width:4ex"><span class="explain" title="Anzahl Meisterschaften">Titel</span></th>';
			end
		end
		if HasBonus then
			kopfzeile =  kopfzeile ..  '<th style="width:6ex"><span class="explain" title="Bonuspunkte aus der Vorrunde">Bonus</span></th>';
			kopfzeile =  kopfzeile ..  '<th style="width:6ex"><span class="explain" title="Gesamtpunkte aus beiden Runden">Gesamt</span></th>';
		end
		if liga ~='' then
			kopfzeile =  kopfzeile .. '<th>Liga</th>';
		end
		if extra1 ~='' then
			kopfzeile =  kopfzeile .. '<th>' .. extra1 .. '</th>';
		end
		if extra2 ~='' then
			kopfzeile =  kopfzeile .. '<th>' .. extra2 .. '</th>';
		end
		kopfzeile =  kopfzeile ..  '</tr>\n';
		text = text .. kopfzeile;
		return text;
	end


	local function CreateLine(Args)
		local Rang = tonumber(Args['R'] or "") or 0;
		local Name = Args['V'] or "";
		if Name == "" then
			Name='<span class="error">Vereinsname fehlt!</span>'
		end
		local Farbe =  Args['F'] or ''; -- Hintergrundfarbe (optional)
		local Land =   Args['L'] or '';
		local Jahre =  tonumber(Args['J'] or '');
		local IstEwig = Jahre ~='';   -- true, wenn "Jahre" vorhanden ( = ewige Tabelle)
		local Siege =  tonumber(Args['S'] or '0') or 0;
		local Unentschieden =  tonumber(Args['U'] or '0') or 0;
		local Niederlagen  =  tonumber(Args['N'] or '0') or 0;
		local Bonusmalus = 	 (tonumber(Args['B'] or '0') or 0 ) - (tonumber(Args['A'] or '0') or 0 );	-- Bonus - Abzug
		local ToreE =   tonumber(Args['E'] or '0') or -1;    --  -1 wenn keine Zahl
		local ToreG =   tonumber(Args['G'] or '0') or -1;    --  -1 wenn keine Zahl
		local ShowDiff = tonumber(Args['VH'] or '') ~= 0;
		local Quote =  (Args['Q'] or '') ~='' ;   -- true, wenn nicht leer
		local Q = 0;
		local valuetext = '';
		local SP =  tonumber(Args['P'] or '3') or 3; -- Punkte fuer Sieg
		local Pluspunkte = '';
		local Minuspunkte = 0;
		local Level =  tonumber(Args['LL'] or '0');  -- Ebene der Liga
		local Liga =   Args['L'] or 'Liga fehlt!';   -- Liga
		local Extra1 = Args['X1'] or ''; -- Extra 1
		local Extra2 = Args['X2'] or ''; -- Extra 2
		local Titel =  tonumber(Args['T'] or '-1') or -1;   --  -1 = keine Spalte
		local Spiele = Siege + Unentschieden + Niederlagen;
		
		local attribut = '';

		if Farbe ~= '' then
			if (hex2dez('1' .. Farbe) == 0) then
				attribut = ' style="background-color:{{{Farbe}}};"';
			else
				attribut = ' style="background-color:#{{{Farbe}}};"';
			end
		else
			attribut = ' style="background-color:#FFFFFF;"';
		end

		local text = '<tr' .. attribut .. '>';
		if Rang == 0 then
			text = text .. '<td style="text-align:center;">&#x2002;&#x2002;</td>';
		elseif Rang < 10 then
			text = text .. '<td style="text-align:center;">&#x2002;' .. tostring(Rang) .. '</td>';
		else
			text = text .. '<td style="text-align:center;">' .. tostring(Rang) .. '.</td>';
		end
		text = text .. '<td style="text-align:left;">' .. Name .. '</td>';
		if Land ~= '' then
			text = text .. '<td style="text-align:center;">' .. Land .. '</td>';
		end
		if IstEwig then
			text = text .. '<td style="text-align:center;">' .. ( tostring(Jahre) or '' ) .. '</td>';
		end
		text = text .. '<td style="text-align:right; padding-right:1em;">' ..  tostring(Spiele) or '?'  .. '</td>';
		text = text .. '<td style="text-align:right; padding-right:1em;">' ..  tostring(Siege) or '?'  .. '</td>';
		text = text .. '<td style="text-align:right; padding-right:1em;">' ..  tostring(Unentschieden) or '?'  .. '</td>';
		text = text .. '<td style="text-align:right; padding-right:1em;">' ..  tostring(Niederlagen) or '?'  .. '</td>';

		local ET = '';
		local GT = '';
		
		if ToreE >= 0 then
			ET = tostring(ToreE);
		else
			ET = '?';
		end
		if ToreG >= 0 then
			GT = tostring(ToreG);
		else
			GT = '?';
		end
		if IstEwig then
			text = text .. '<td style="text-align:right; padding-right:1em;">' ..  ET .. '</td>';
			text = text .. '<td style="text-align:right; padding-right:1em;">' ..  GT .. '</td>';
		else
			if mw.ustring.len(ET) == 1 then ET = '&#x2002;&#x2002;&#x2002;' .. ET ; end
			if mw.ustring.len(ET) == 2 then ET = '&#x2002;&#x2002;' .. ET ; end
			if mw.ustring.len(ET) == 3 then ET = '&#x2002;' .. ET ; end
			if mw.ustring.len(GT) == 1 then GT = GT .. '&#x2002;&#x2002;&#x2002;'; end
			if mw.ustring.len(GT) == 2 then GT = GT .. '&#x2002;&#x2002;' ; end
			if mw.ustring.len(GT) == 3 then GT = GT ..  '&#x2002;'; end
			text = text .. '<td style="text-align:center;">' ..  ET .. ':' .. GT .. '</td>';
		end
		if ShowDiff then
			if Quote then 
				if (ToreE > 4 and ToreG > 4) then  -- Quote nur bei mind. je 5 Spielen sinnvoll.
					Q = math.floor ((ToreE / ToreG )  * 100 + 0.5) / 100 ;
					valuetext = tostring(Q);
					valuetext = valuetext or '---';
				else
					valuetext = '???';
				end
				text = text .. '<td style="text-align:center;">' .. valuetext ..'</td>';
			else
				if ToreE-ToreG < 0 then
					valuetext = '&#x2212;' .. tostring(ToreG-ToreE);
					text = text .. '<td style="text-align:center;">' .. valuetext ..'</td>';
				elseif ToreE-ToreG > 0 then
					valuetext = '+' .. tostring(ToreE-ToreG);
					text = text .. '<td style="text-align:center;">' .. valuetext ..'</td>';
				else
					valuetext = '&#x2002;&plusmn;0';
					text = text .. '<td style="text-align:center;" data-sort-value="0">' .. valuetext ..'</td>';
				end
			end
		end
		-- Jetzt die Punkte 		
		Pluspunkte = tostring(SP * Siege + Unentschieden + Bonusmalus) or '';
		if mw.ustring.len(Pluspunkte) == 1 then Pluspunkte = '&#x2002;&#x2002;&#x2002;' .. Pluspunkte ; end
		if mw.ustring.len(Pluspunkte) == 2 then Pluspunkte = '&#x2002;&#x2002;' .. Pluspunkte ; end
		if mw.ustring.len(Pluspunkte) == 3 then Pluspunkte = '&#x2002;' .. Pluspunkte ; end
		if IstEwig then
			valuetext = Pluspunkte;
		else
			Minuspunkte = tostring(SP * Niederlagen + Unentschieden) or '';
			if mw.ustring.len(Minuspunkte) == 1 then Minuspunkte = Minuspunkte .. '&#x2002;&#x2002;&#x2002;'; end
			if mw.ustring.len(Minuspunkte) == 2 then Minuspunkte = Minuspunkte .. '&#x2002;&#x2002;' ; end
			if mw.ustring.len(Minuspunkte) == 3 then Minuspunkte = Minuspunkte ..  '&#x2002;'; end
			
			valuetext = Pluspunkte  .. ':' .. Minuspunkte;
		end
		text = text .. '<td style="text-align:center;" data-sort-value="0">' .. valuetext ..'</td>';
		-- Jetzt eine etwaige Ligaangabe
		if Level > 0 then
			text = text .. '<td style="text-align:center;" data-sort-value="' .. tostring(Level) ..'">' .. Liga .. '</td>';
		end
		
		if Extra1 ~='' then
			text = text .. '<td style="text-align:center;">' .. Extra1 ..'</td>';
		end
		if Extra2 ~='' then
			text = text .. '<td style="text-align:center;">' .. Extra2 ..'</td>';
		end
		-- Fertig, nur noch das tr
		text = text .. '</tr>\n';
		return text;
	end


--[=[ Spaeterer Aufruf fuer Zeile:
{{#invoke:Vorlage:Fußballtabelle|Zeile |A={{{Abzug|}}}  |B={{{Bonus|}}} |E={{{ET|}}} |F={{{Farbe|}}} |G={{{GT|}}} |J={{{J|}}} |L={{{Liga|}}}
  |LL={{{Ligalevel|}}}  |N={{{N|}}} |P={{{Siegpunkte|}}} |Q={{Quote|}}} |R={{#if:{{{Rang2|}}}|0|{{{Rang|}}}}}  |S={{{S|}}} |T={{{Titel|}}}
  |U={{{U|}}} |V={{Verein|}}} |VH={{{Verhältnis|}}} |X1={{{Extra1|}}} |X2={{{Extra2|}}} }}
  ]=]


-- {{#invoke:Vorlage:Fußballtabelle|Zeile|R={{{Rang|}}}|V={{Verein|}}}|E={{{ET|}}}|G={{{GT|}}}|A={{{Abzug|}}}|B={{{Bonus|}}}
-- |S={{{S|}}}||U={{{U|}}}||N={{{N|}}}|J={{{J|}}}|F={{{Farbe|}}}|P={{{Siegpunkte|}}}|T={{{Titel|}}}|L={{{Land|}}} }}
	function p.Zeile(frame)
		local FR = frame:getParent()
		return CreateLine(FR.args)
	end


-- Spaeterer Aufruf fuer Kopf: 
-- {{#invoke:Vorlage:Fußballtabelle|Kopf|nosort={{{nosort|}}}|ewig={{{ewig|}}}|float={{{float|}}}|caption={{{Überschrift|}}}|team={{{Team|Verein}}}
--    |teilnahmen={{{Teilnahmen|}}}|VH={{{Verhältnis}}}|nocup={{{Nocup|}}} |bonus={{{Bonus|}}} }}

	function p.Kopf(frame)
		local FR = frame:getParent()
		return CreateHeader(FR.args)
	end

return p