Modul:Benutzer:Korrektor123/Vorlagen/LiveTabelle
Die Dokumentation für dieses Modul kann unter Modul:Benutzer:Korrektor123/Vorlagen/LiveTabelle/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, '<%/*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], '=', '')) 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], ":" )
-- 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] -- W3T[2] liefert einen Fehler
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] -- W3T[2] liefert einen Fehler
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