Modul:Vorlage:LiveTabelle 10Mannschaften

Die Dokumentation für dieses Modul kann unter Modul:Vorlage:LiveTabelle 10Mannschaften/Doku erstellt werden

-- Generiert eine Tabelle aus Spielergebnissen
--[[Abkürzungen der Variablen:
Tennis:
	W1 = Matches
	W2 = Sätze
	W3 = Spiele
]]

local p = {}

function p.main(frame)
	-- benötigte Variablen deklarieren
	local Tabelle = {}
	local ResultT = {}
	local Punkte = {}
	local W1T = {}
	local W2T = {}
	local W3T = {}
	---------------------
	local NameTeam = {}
	local DesgTeam = {}
	local TeamBeg = {}
	local DiffPunkte = {}
	local TeamPunkte = {}
	local TeamGegenPunkte = {}
	local DiffW1 = {}
	local TeamW1 = {}
	local TeamGW1 = {}
	local DiffW2 = {}
	local TeamW2 = {}
	local TeamGW2 = {}
	local DiffW3 = {}
	local TeamW3 = {}
	local TeamGW3 = {}
	local TeamPos = {}
	local tblErgebnisse = {}
	local NormColour = "#ffffff;"
	local AufColour = "#ccffcc;"
	local AbColour = "#ffcccc;"
	local TeamsSorted = ""
	local Counter = 1
	local SourceCode = 0
	-- Mannschaftsnamen werden übernommen und zugehörige Variablen deklariert
	local Aufsteiger = frame:getParent().args['AufsteigerZahl']
	if (Aufsteiger == nil or Aufsteiger == "" or Aufsteiger == " ") then
		Aufsteiger = "1"
	end
	Aufsteiger = tonumber( Aufsteiger )
	local Absteiger = frame:getParent().args['AbsteigerZahl']
	if (Absteiger == nil or Absteiger == "" or Absteiger == " ") then
		Absteiger = "0"
	end
	Absteiger = tonumber( Absteiger )
	-- Ab hier Teamnamen und Variablen; in TeamDim wird für später die Anzahl der Mannschaften gespeichert
	local BREAK = false
	local TeamDim = 0
	while BREAK == false do
		NameTeam[Counter] = frame:getParent().args['Team' .. Counter]
		if (NameTeam[Counter] ~= nil) then
			NameTeam[Counter] = mw.ustring.gsub(NameTeam[Counter], ' ', '' )
			DesgTeam[Counter] = frame:getParent().args['DarstellungT' .. Counter]
			TeamBeg[Counter] = 0
			DiffPunkte[Counter] = 0
			TeamPunkte[Counter] = 0
			TeamGegenPunkte[Counter] = 0
			DiffW1[Counter] = 0
			TeamW1[Counter] = 0
			TeamGW1[Counter] = 0
			DiffW2[Counter] = 0
			TeamW2[Counter] = 0
			TeamGW2[Counter] = 0
			DiffW3[Counter] = 0
			TeamW3[Counter] = 0
			TeamGW3[Counter] = 0
			TeamDim = Counter
		else
			BREAK = true
		end
		Counter = Counter + 1
	end
	-- Anzahl der maximalen Begegnungen bestimmen (Gaußsche Summenformel)
	local BegDim = 0
	local n = 0
	n = TeamDim - 1
	BegDim = (n*(n+1))/2
	n = nil
	if (TeamDim == 0) then
		BegDim = 0
	end
	local strErgebnisse = frame:getParent().args['Ergebnisse']
	if (strErgebnisse ~= nil) then
		strErgebnisse = mw.ustring.gsub(strErgebnisse, '<&/*gallery[%a%A]->', '')
		strErgebnisse = mw.ustring.gsub(strErgebnisse, '<%/*div[%a%A]->', '')
		strErgebnisse = mw.ustring.gsub(strErgebnisse, '<%/*span[%a%A]->', '')
		strErgebnisse = mw.ustring.gsub(strErgebnisse, '%b{}', '')
		strErgebnisse = mw.ustring.gsub(strErgebnisse, '\n+', '/')
	else
		return
	end
	tblErgebnisse = mw.text.split(strErgebnisse, '/')
	Counter = 1
	local tblBegegnungen = {}
	while (tblErgebnisse[Counter] ~= nil) do
		if ((tblErgebnisse[Counter] ~= mw.ustring.gsub(tblErgebnisse[Counter], '=', '')) or (tblErgebnisse[Counter] ~= mw.ustring.gsub(tblErgebnisse[Counter], '|', ''))) then
			table.remove(tblErgebnisse, Counter)
			Counter = Counter - 1
		else
			tblErgebnisse[Counter] = mw.ustring.gsub(tblErgebnisse[Counter], 'UNIQ[%a%A]*', '') --Irgendein Bug in der MediaWiki-Software. Kann nach dem nächsten Update vielleicht raus.
			tblErgebnisse[Counter] = mw.ustring.gsub(tblErgebnisse[Counter], ' ', '')
			tblErgebnisse[Counter] = mw.ustring.gsub(tblErgebnisse[Counter], '', '')			--Dieses Zeichen kann dieser Editor aus irgend einem Grund nicht richtig anzeigen bevor du diese Zeile löschst bitte mit dem Windows Editor oder Notepad++ ansehen dort wird der anscheinen leere String richtig dargestellt.
			tblBegegnungen[Counter] = mw.text.split(tblErgebnisse[Counter], '−')
		end
		Counter = Counter + 1
	end
	-- Anzahl der bisher eingetragenen Begegnungen bestimmen
	Counter = 1
	local AktBegDim = 0
	while (tblBegegnungen[Counter][3] ~= nil) and (Counter <= BegDim) do
		Counter = Counter + 1
	end 
	AktBegDim = Counter - 1
	Counter = 1
	-- Ergebnisse übernehmen
	while Counter <= AktBegDim do
		local HeimTeamT = {}
		local GastTeamT = {}
		local HeimTeam = tblBegegnungen[Counter][1]
		local GastTeam = tblBegegnungen[Counter][2]
		HeimTeam = mw.ustring.gsub(HeimTeam, ' ', '')
		GastTeam = mw.ustring.gsub(GastTeam, ' ', '')
		Result = tblBegegnungen[Counter][3]
		Result = mw.ustring.gsub(Result, ' ', '')
		ResultT = mw.text.split( Result, "," )
		W1T = mw.text.split( ResultT[1], ":" )
		W2T = mw.text.split( ResultT[2], ":" )
		W3T = mw.text.split( ResultT[3], ":" )
		if (ResultT[1] == '-:-' or ResultT[1] == ':') then
			W1T[1] = 0
			W1T[2] = 0
		end
		if (ResultT[2] == '-:-' or ResultT[2] == ':') then
			W2T[1] = 0
			W2T[2] = 0
		end
		if (ResultT[3] == '-:-' or ResultT[3] == ':') then
			W3T[1] = 0
			W3T[2] = 0
		end
		-- Punktverteilung
		if (W1T[1] == W1T[2]) then
			Punkte[1] = 1
			Punkte[2] = 1
		end
		if (W1T[1] > W1T[2]) then
			Punkte[1] = 2
			Punkte[2] = 0
		end
		if (W1T[1] < W1T[2]) then
			Punkte[1] = 0
			Punkte[2] = 2
		end
		if (W1T[1] == 0 and W1T[2] == 0) then
				Punkte[1] = 0
				Punkte[2] = 0
		end
		local TeamCounter = 1
		while TeamCounter <= TeamDim do
			-- Wertezuweisung zu den eigentlichen Teams (Heim)
			if (HeimTeam == NameTeam[TeamCounter]) then
				if (Punkte[1] ~= 0 or Punkte[2] ~=0) then
					TeamBeg[TeamCounter] = TeamBeg[TeamCounter] + 1
				end
				TeamPunkte[TeamCounter] = TeamPunkte[TeamCounter] + Punkte[1]
				TeamGegenPunkte[TeamCounter] = TeamGegenPunkte[TeamCounter] + Punkte[2]
				TeamW1[TeamCounter] = TeamW1[TeamCounter] + W1T[1]
				TeamGW1[TeamCounter] = TeamGW1[TeamCounter] + W1T[2]
				TeamW2[TeamCounter] = TeamW2[TeamCounter] + W2T[1]
				TeamGW2[TeamCounter] = TeamGW2[TeamCounter] + W2T[2]
				TeamW3[TeamCounter] = TeamW3[TeamCounter] + W3T[1]
				TeamGW3[TeamCounter] = TeamGW3[TeamCounter] + W3T[2]
			end
			-- Wertezuweisung zu den eigentlichen Teams (Gast)
			if (GastTeam == NameTeam[TeamCounter]) then
				if (Punkte[1] ~= 0 or Punkte[2] ~=0) then
					TeamBeg[TeamCounter] = TeamBeg[TeamCounter] + 1
				end
				TeamPunkte[TeamCounter] = TeamPunkte[TeamCounter] + Punkte[2]
				TeamGegenPunkte[TeamCounter] = TeamGegenPunkte[TeamCounter] + Punkte[1]
				TeamW1[TeamCounter] = TeamW1[TeamCounter] + W1T[2]
				TeamGW1[TeamCounter] = TeamGW1[TeamCounter] + W1T[1]
				TeamW2[TeamCounter] = TeamW2[TeamCounter] + W2T[2]
				TeamGW2[TeamCounter] = TeamGW2[TeamCounter] + W2T[1]
				TeamW3[TeamCounter] = TeamW3[TeamCounter] + W3T[2]
				TeamGW3[TeamCounter] = TeamGW3[TeamCounter] + W3T[1]
			end
			TeamCounter = TeamCounter + 1
		end
		Counter = Counter + 1
	end
	-- Jetzt geht's an die Auswertung
	Counter = 1
	while TeamDim >= Counter do
		DiffPunkte[Counter] = TeamPunkte[Counter] - TeamGegenPunkte[Counter]
		DiffW1[Counter] = TeamW1[Counter] - TeamGW1[Counter]
		DiffW2[Counter] = TeamW2[Counter] - TeamGW2[Counter]
		DiffW3[Counter] = TeamW3[Counter] - TeamGW3[Counter]
		Tabelle[Counter] = { Name=NameTeam[Counter], Desg=DesgTeam[Counter], Beg=TeamBeg[Counter], DiffPunkte=DiffPunkte[Counter], DiffW1=DiffW1[Counter], DiffW2=DiffW2[Counter], DiffW3=DiffW3[Counter], W3=TeamW3[Counter], W2=TeamW2[Counter], W1=TeamW1[Counter], Punkte=TeamPunkte[Counter], GW3=TeamGW3[Counter], GW2=TeamGW2[Counter], GW1=TeamGW1[Counter], GegPunkte=TeamGegenPunkte[Counter], Colour=NormColour }
		Counter = Counter + 1
	end
	table.sort( Tabelle, compareTeamNames )
	Counter = 1
	while (Aufsteiger >= Counter and TeamDim >= Counter) do
		Tabelle[Counter].Colour = AufColour
		Counter = Counter + 1
	end
	Counter = 1
	while (Absteiger >= Counter and TeamDim >= Counter) do
		local Pos = TeamDim - (Counter - 1)
		Tabelle[Pos].Colour = AbColour
		Counter = Counter + 1
	end
	Counter = 1
	if (frame:getParent().args['SourceCode'] ~= nil and frame:getParent().args['SourceCode'] ~= "" and frame:getParent().args['SourceCode'] ~= " ") then
		add = "{{0}}"
		SourceCode = 1
	else
		add = ""
	end
	while (TeamDim >= Counter) do
		TeamPos[Counter] = "|- style=\"background-color: " ..Tabelle[Counter].Colour .. "\"\
			! " .. add .. Counter .. ".\
			| style=\"text-align: left;\" |" .. Tabelle[Counter].Desg .. "\
			| " .. Tabelle[Counter].Beg .. "\
			| " .. Tabelle[Counter].Punkte .. ":" .. Tabelle[Counter].GegPunkte .. "\
			| " .. Tabelle[Counter].W1 .. ":" .. Tabelle[Counter].GW1 .. "\
			| " .. Tabelle[Counter].W2 .. ":" .. Tabelle[Counter].GW2 .. "\
			| " .. Tabelle[Counter].W3 .. ":" .. Tabelle[Counter].GW3 .. "\n"
		Counter = Counter + 1
	end
	Counter = 1
	while TeamDim >= Counter do
		TeamsSorted = TeamsSorted .. TeamPos[Counter]
		Counter = Counter + 1
	end
	Header = "{| class=\"wikitable\" style=\"text-align: center;\"\
		|- class=\"hintergrundfarbe5\"\
		!\
		! Mannschaft\
		! Begegnungen\
		! Punkte\
		! Matches\
		! Sätze\
		! Spiele\n"
	endTag = "|}"
	TeamsSorted = Header .. TeamsSorted .. endTag
	if (SourceCode == 1) then
		local Dim = 0
		local Lines = {}
		Lines = mw.text.split( TeamsSorted, "\n" )
		Dim = table.getn(Lines)
		TeamsSorted = ""
		Counter = 1
		while Counter <= Dim do  --vielleicht genügt auch nur <
			local Line = ""
			Line = mw.text.nowiki( Lines[Counter] )
			TeamsSorted = TeamsSorted .. "<br />" .. Line
			Counter = Counter + 1
		end
	end
	return TeamsSorted
end

function compareTeamNames(a,b)
	local ReturnTF = false
	local Position = 1
	if (a.DiffPunkte > b.DiffPunkte) then
		ReturnTF = true
	end
	if (a.DiffPunkte < b.DiffPunkte) then
		ReturnTF = false
	end
	if (a.DiffPunkte == b.DiffPunkte) then
		Position = 2
		if (a.Punkte > b.Punkte) then
			ReturnTF = true
		end
		if (a.Punkte < b.Punkte) then
			ReturnTF = false
		end
		if (a.Punkte == b.Punkte) then
			Position = 3
			if (a.DiffW1 > b.DiffW1) then
				ReturnTF = true
			end
			if (a.DiffW1 < b.DiffW1) then
				ReturnTF = false
			end
			if (a.DiffW1 == b.DiffW1) then
				Position = 4
				if (a.W1 > b.W1) then
					ReturnTF = true
				end
				if (a.W1 < b.W1) then
					ReturnTF = false
				end
				if (a.W1 == b.W1) then
					Position = 5
					if (a.DiffW2 > b.DiffW2) then
						ReturnTF = true
					end
					if (a.DiffW2 < b.DiffW2) then
						ReturnTF = false
					end
					if (a.DiffW2 == b.DiffW2) then
						Position = 6
						if (a.W2 > b.W2) then
							ReturnTF = true
						end
						if (a.W2 < b.W2) then
							ReturnTF = false
						end
						if (a.W2 == b.W2) then
							Position = 7
							if (a.DiffW3 > b.DiffW3) then
								ReturnTF = true
							end
							if (a.DiffW3 < b.DiffW3) then
								ReturnTF = false
							end
							if (a.DiffW3 == b.DiffW3) then
								Position = 8
								if (a.W3 > b.W3) then
									ReturnTF = true
								end
								if (a.W3 < b.W3) then
									ReturnTF = false
								end
								if (a.W3 == b.W3) then
									Position = 9
									if (a.Beg < b.Beg) then
										ReturnTF = true
									end
									if (a.Beg > b.Beg) then
										ReturnTF = false
									end
									if (a.Beg == b.Beg) then
										ReturnTF = false
									end
								end
							end
						end
					end
				end
			end
		end
	end
	if (ReturnTF == true) then
		if (Position == 1) then
			return ( a.DiffPunkte > b.DiffPunkte )
		end
		if (Position == 2) then
			return ( a.Punkte > b.Punkte )
		end
		if (Position == 3) then
			return ( a.DiffW1 > b.DiffW1 )
		end
		if (Position == 4) then
			return ( a.W1 > b.W1 )
		end
		if (Position == 5) then
			return ( a.DiffW2 > b.DiffW2 )
		end
		if (Position == 6) then
			return ( a.W2 > b.W2 )
		end
		if (Position == 7) then
			return ( a.DiffW3 > b.DiffW3 )
		end
		if (Position == 8) then
			return ( a.W3 > b.W3 )
		end
		if (Position == 9) then
			return ( a.Beg > b.Beg )
		end
	else
		return false
	end
end

return p