Modul:Tennisturniere-Herren

aus Wikipedia, der freien Enzyklopädie

Das Modul:Tennisturniere-Herren erzeugt eine Tabelle mit den Turnierergebnissen der ATP 1000 Turniere. Für die Parameter siehe Vorlage:Tennisturniere-Herreneinzel bzw Vorlage:Tennisturniere-Herrendoppel.

Die Funktion TennisturniereHerren ist zuständig für die Erzeugung der Tabelle und der ersten Zeile mit den Links auf die jeweiligen ATP Tour Artikel (wie zB ATP Tour 2021). Daneben wird die Funktion isUsed genutzt, um für jedes Turnier festzustellen, ob es einen Eintrag dafür gibt, oder ob die jeweilge Turnierzeile weggelassen werden kann. Wird die Zeile benötigt (isUsed gibt true zurück), so wird die Funktion getRow genutzt, um die Ergebnisse des Turniers in einer Zeile zusammen zu fassen.

Die Funktion getRow stellt für jedes über die Parameter vorgegebene Jahr fest, ob das Turnier stattgefunden hat (mittels der Funktion wasHeld). Gibt wasHeld true zurück, so wird das über Parameter angegebene Resultat des jeweiligen Turniers in die Zeile eingetragen, anderenfalls wird die Zelle ausgegraut. In der Funktion sind die Links auf die jeweiligen Turnierartikel hard coded. Falls sich an einem Turniernamen mehr als die Jahreszahl ändert, muss diese Funktion also erweitert werden.

Die Funktion wasHeld prüft ob das Turnier im jeweilgen Jahr stattgefunden hat. Wann welches Turnier stattgefunden hat ist in dieser Funktion hard coded.

Einsprungpunkte in das Modul sind die Funktionen TennisturniereHerrenEinzel bzw TennisturniereHerrenDoppel, die dafür sorgen, dass die Links in der Tabelle auf den entsprechenden Wettkampf gesetzt werden.

Änderungsbedarf

neues ATP 1000 Turnier

In diesem Fall ist die Funktion TennisturniereHerren zu ergänzen um einen Dreizeiler der Form:

if isUsed(frame, firstYear, lastYear, 'XXX') then
  table:node(getRow(frame, 'ATP XXX|XXX', '#', 'XXX', firstYear, lastYear)):newline()
end

Dabei ist XXX durch das Kürzel des neuen Turniers zu ersetzen und ATP XXX|XXX durch den Übersichtsartikel des neuen Turniers vor der Pipe und seine Bezeichnung in der Tabelle dahinter.

Zusätzlich müssen die Funktionen getRow und wasHeld um elseif Blöcke für das neue Turnier erweitert werden.

Turnierartikel wird umbenannt

Wird der Turnierartikel umbenannt (mehr als die Jahreszahl ändert sich), muss der zugehörige elseif Block des Turniers in der Funktion getRow angepasst werden.

Turnier findet nicht (mehr) statt

Der zugehörige elseif Block in der Funktion wasHeld muss angepasst werden.

Die ATP Tour wird umbenannt

Davon ist nur die erste Zeile der Tabelle betroffen. Diese wird in der Funktion TennisturniereHerren erzeugt. Es muss also die Loop

for year = lastYear, firstYear, -1
do
  head:node(mw.html.create('th'):wikitext('[[ATP Tour ' .. year .. '|' .. year .. ']]'))
end

zu zwei (oder mehr) Loops geändert werden.

for year = letztesJahrNeuerName, erstesJahrNeuerName, -1
do
  head:node(mw.html.create('th'):wikitext('[[NeuerName ' .. year .. '|' .. year .. ']]'))
end
for year = lastYearATPTour, firstYear, -1
do
  head:node(mw.html.create('th'):wikitext('[[ATP Tour ' .. year .. '|' .. year .. ']]'))
end

local p = {}

-- die Funktion getCell erzeugt eine Tabellenzelle
-- Parameter:
--   link: Artikelname
--   result: Resultat der Athletin/des Athleten (zB S oder HF)
-- Rückgabe:
--   ein String mit dem HTML Code der Tabellenzelle
local function getCell(link, result)
    local cell

    if not result or result == '' then
      cell = mw.html.create('td'):wikitext(' ')
    else
      if result == '-' then
        result = '–'
      end

      if result == 'S' then
        cell = mw.html.create('td'):wikitext('[[' .. link .. '|S]]'):css('background-color', '#FFF68F'):css('font-weight', 'bold')
      elseif result == 'F' then
        cell = mw.html.create('td'):wikitext('[[' .. link .. '|F]]'):css('background-color', '#BFEFFF')
      elseif result == 'HF' or result == 'KF' then
        cell = mw.html.create('td'):wikitext('[[' .. link .. '|' .. result .. ']]'):css('background-color', '#FFE7BA')
      elseif result == ' ' or not result then
        cell = mw.html.create('td'):wikitext(' ')
      elseif result == 'B' then
        cell = mw.html.create('td'):wikitext('[[' .. link .. '|B]]'):css('background-color', '#CC9966')
      elseif result == 'Q1' or result == 'Q2' or result == 'Q3' then
        cell = mw.html.create('td'):wikitext('[[' .. link .. '/Qualifikation' .. '|' .. result .. ']]')
      else
        cell = mw.html.create('td'):wikitext('[[' .. link .. '|' .. result .. ']]')
      end
    end

    return cell
end

-- die Funktion wasHeld überprüft ob ein Wettkampf im angegebenen Jahr ausgerichtet wurde
-- Parameter:
--   prefix: das Prefix des Wettkampfs, das in den Vorlagenparametern verwendet wird (zB AUO, FRO)
--   year: Jahr der Ausrichtung
-- Rückgabe:
--   boolean false wenn der Wettkampf nicht stattgefunden hat
--   boolean true wenn er stattgefunden hat
local function wasHeld(prefix, year)
    local held = false

    if prefix == 'AUO' then
      if year ~= 1986 then
        held = true
      end
    elseif prefix == 'FRO' then
      held = true
    elseif prefix == 'WIM' then
      if year ~= 2020 then
        held = true
      end
    elseif prefix == 'USO' then
      held = true
    elseif prefix == 'ATP' then
      if year >= 1970 then
        held = true
      end
    elseif prefix == 'IND' then
      if year >= 1976 and year ~= 2020 then
        held = true
      end
    elseif prefix == 'MIA' then
      if year >= 1985 and year ~= 2020 then
        held = true
      end
    elseif prefix == 'MCM' then
      if year >= 1970 and year ~= 2020 then
        held = true
      end
    elseif prefix == 'MAD' then
      if year >= 2002 and year ~= 2020 then
        held = true
      end
    elseif prefix == 'ROM' then
      if year >= 1970 then
        held = true
      end
    elseif prefix == 'HAM' then
      if year >= 1990 and year <= 2008 then
        held = true
      end
    elseif prefix == 'KAN' then
      if year >= 1970 and year ~= 2020 then
        held = true
      end
    elseif prefix == 'CIN' then
      if year >= 1970 then
        held = true
      end
    elseif prefix == 'STO' then
      if year >= 1990 and year <= 1994 then
        held = true
      end
    elseif prefix == 'ESS' then
      if year == 1995 then
        held = true
      end
    elseif prefix == 'STU' then
      if year >= 1996 and year <= 2001 then
        held = true
      end
    elseif prefix == 'SHA' then
      if year >= 2009 and year <= 2019 then
        held = true
      end
    elseif prefix == 'PAR' then
      if year == 1970 or (year >= 1972 and year <= 1982) or year >= 1986 then
        held = true
      end
    elseif prefix == 'DAV' then
      if year >= 1900 and year ~= 1901 and year ~= 1910 and (year < 1915 or year > 1918) and (year < 1940 or year > 1945) then
        held = true
      end
    elseif prefix == 'OLY' then
      if year >= 1988 and (year % 4) == 0 then
        held = true
      end
    end

    return held
end

-- die Funktion isUsed prüft ob es für die Athletin/den Athleten
-- im angegebenen Zeitraum für das Turnier mindestens einen gesetzten Parameter gibt
-- Parameter:
--   frame: der aufrufende frame
--   firstYear: erstes Jahr des zu prüfenden Zeitraums
--   lastYear: letztes Jahr des zu prüfenden Zeitraums
--   prefix: Prefix des Wettkampfs (zB AUS für Australien Open oder WIM für Wimbledon Championships)
-- Rückgabe:
--   boolean false wenn in der Vorlage keine Parameter für den Wettkampf gesetzt wurde
--   boolean true wenn der Anwender der Vorlage einen Parameter für den Wettkampf gesetzt hat
local function isUsed(frame, firstYear, lastYear, prefix)
    local used=false
    local year
    local result

    for year = firstYear, lastYear
    do
      if frame:getParent().args[prefix .. year] then
        result = frame:getParent().args[prefix .. year] or '&nbsp;'
        if wasHeld(prefix, year) and result ~= '&nbsp;' then
          used = true
          break
        end
      end
    end

    return used
end

-- die Funktion getRow erzeugt eine Wettkampfzeile der Tabelle
-- Parameter:
--   frame: der aufrufende frame
--   overviewArticle: der Überblicksartikel für den Wettkampf (zB Australian Open)
--   competition: entweder 'einzel' oder 'doppel'
--   bgColor: die Hintergrundfarbe der Zeile
--   prefix: Prefix des Wettkampfs (zB AUS für Australien Open oder WIM für Wimbledon Championships)
--   firstYear: erstes Jahr in der Tabelle
--   lastYear: letztes Jahr in der Tabelle
-- Rückgabe:
--   ein String mit dem HTML Code der Zeile
local function getRow(frame, overviewArticle, competition, bgColor, prefix, firstYear, lastYear)
    local row
    local sum
    local karriere
    local year
    local fYear
    local year2
    local result
    local colspan
    local possibleResults = {}

    possibleResults[''] = 0
    possibleResults['Q1'] = 1
    possibleResults['Q2'] = 2
    possibleResults['Q3'] = 3
    possibleResults['1'] = 4
    possibleResults['2'] = 5
    possibleResults['3'] = 6
    possibleResults['AF'] = 14
    possibleResults['VF'] = 15
    possibleResults['RR'] = 16
    possibleResults['HF'] = 17
    possibleResults['B'] = 18
    possibleResults['F'] = 19
    possibleResults['S'] = 20

    karriere = 0
    sum = 0

    row = mw.html.create('tr'):css('background-color', bgColor)
    row:node(mw.html.create('td'):wikitext('[[' .. overviewArticle .. ']]'):css('text-align', 'left'))
    fYear = tonumber(firstYear)
    year = tonumber(lastYear)
    while (year >= fYear) do
      colspan = 1
      if wasHeld(prefix, year) then
        if not frame:getParent().args[prefix .. year] then
          cell = mw.html.create('td'):wikitext('&nbsp;')
        else
          result = frame:getParent().args[prefix .. year] or '&nbsp;'
          if prefix == 'AUO' then
            cell = getCell('Australian Open ' .. year .. '/Herren' .. competition, result)
          elseif prefix == 'FRO' then
            cell = getCell('French Open ' .. year .. '/Herren' .. competition, result)
          elseif prefix == 'WIM' then
            cell = getCell('Wimbledon Championships ' .. year .. '/Herren' .. competition, result)
          elseif prefix == 'USO' then
            cell = getCell('US Open ' .. year .. '/Herren' .. competition, result)
          elseif prefix == 'ATP' then
	    if year < 1990 then
              cell = getCell('New York Masters ' .. year, result)
	    elseif year < 2000 then
	      cell = getCell('ATP-Weltmeisterschaft ' .. year, result)
	    elseif year < 2009 then
	      cell = getCell('Tennis Masters Cup ' .. year, result)
	    elseif year < 2017 then
	      cell = getCell('ATP World Tour Finals ' .. year, result)
	    else
	      cell = getCell('ATP Finals ' .. year, result)
	    end
          elseif prefix == 'IND' then
            if year < 1970 then
              cell = getCell('American Airlines Tennis Games ' .. year, result)
            elseif year < 1981 then
              cell = getCell('GranCongoleum Classic ' .. year, result)
            elseif year == 1981 then
              cell = getCell('Grand Marnier/ATP Tennis Games 1981', result)
            elseif year < 1985 then
              cell = getCell('Congoleum Classic ' .. year, result)
            elseif year < 1988 then
              cell = getCell('Pilot Pen Classic ' .. year, result)
            elseif year < 2000 then
              cell = getCell('Newsweek Champions Cup ' .. year, result)
            elseif year < 2002 then
              cell = getCell('Tennis Masters Series Indian Wells ' .. year .. '/Herren', result)
            elseif year < 2009 then
              cell = getCell('Pacific Life Open ' .. year .. '/Herren', result)
            else
              cell = getCell('BNP Paribas Open ' .. year .. '/Herren', result)
            end
          elseif prefix == 'MIA' then
            if year < 1993 then
              cell = getCell('Lipton International Players Championships ' .. year .. '/Herren', result)
            elseif year < 2000 then
              cell = getCell('The Lipton Championships ' .. year .. '/Herren', result)
            elseif year < 2002 then
              cell = getCell('Ericsson Open ' .. year .. '/Herren', result)
            elseif year < 2007 then
              cell = getCell('NASDAQ-100 Open ' .. year .. '/Herren', result)
            elseif year < 2013 then
              cell = getCell('Sony Ericsson Open ' .. year .. '/Herren', result)
            elseif year < 2015 then
              cell = getCell('Sony Open Tennis ' .. year .. '/Herren', result)
            else
              cell = getCell('Miami Open ' .. year .. '/Herren', result)
            end
          elseif prefix == 'MCM' then
            if year < 2000 then
              cell = getCell('Monte Carlo Open ' .. year, result)
            elseif year < 2007 then
              cell = getCell('Monte Carlo Masters ' .. year, result)
            elseif year < 2009 then
              cell = getCell('Masters Series Monte-Carlo ' .. year, result)
            elseif year < 2019 then
              cell = getCell('Monte-Carlo Rolex Masters ' .. year, result)
            else
              cell = getCell('Rolex Monte-Carlo Masters ' .. year, result)
	    end
          elseif prefix == 'ROM' then
            if year < 2001 then
              cell = getCell('Italian Open ' .. year .. '/Herren', result)
            elseif year == 2001 then
              cell = getCell('Tennis Masters Series Rome 2001/Herren', result)
            elseif year == 2002 then
              cell = getCell('Tennis Masters Roma 2002/Herren', result)
            elseif year == 2003 or year == 2004 then
              cell = getCell('Telecom Italia Masters ' .. year .. '/Herren', result)
            elseif year == 2005 then
              cell = getCell('Telecom Italia Masters Roma 2005/Herren', result)
            elseif year == 2006 then
              cell = getCell('Internazionali d’Italia 2006/Herren', result)
            elseif year >= 2007 then
              cell = getCell('Internazionali BNL d’Italia ' .. year .. '/Herren', result)
            end
          elseif prefix == 'MAD' then
            if year < 2004 then
              cell = getCell('Tennis Masters Madrid ' .. year, result)
            elseif year < 2006 then
              cell = getCell('Masters Series Madrid ' .. year, result)
            elseif year < 2009 then
              cell = getCell('Mutua Madrileña Masters Madrid ' .. year, result)
            elseif year < 2011 then
              cell = getCell('Mutua Madrileña Madrid Open ' .. year .. '/Herren', result)
            else
              cell = getCell('Mutua Madrid Open ' .. year .. '/Herren', result)
            end
          elseif prefix == 'HAM' then
	    if year < 2000 then
	      cell = getCell('ATP German Open ' .. year, result)
	    elseif year < 2003 then
	      cell = getCell('Tennis Masters Series Hamburg ' .. year, result)
	    elseif year <= 2004 then
	      cell = getCell('Tennis Masters Hamburg ' .. year, result)
	    else
	      cell = getCell('Masters Series Hamburg ' .. year, result)
	    end
          elseif prefix == 'STO' then
	    cell = getCell('Stockholm Open ' .. year, result)
          elseif prefix == 'ESS' then
	    cell = getCell('Essen Masters', result)
          elseif prefix == 'STU' then
	    cell = getCell('Mercedes Cup ' .. year, result)
          elseif prefix == 'CIN' then
            if year < 1990 then
              cell = getCell('Cincinnati Masters ' .. year, result)
            elseif year < 1996 then
              cell = getCell('Thriftway ATP Championships ' .. year, result)
            elseif year < 2000 then
              cell = getCell('Great American Insurance ATP Championship ' .. year, result)
            elseif year < 2011 then
              cell = getCell('Western & Southern Financial Group Masters ' .. year, result)
            else
              cell = getCell('Western & Southern Open ' .. year .. '/Herren', result)
            end
          elseif prefix == 'KAN' then
            if year < 1998 then
              cell = getCell('Rogers Cup ' .. year .. '/Herren', result)
            elseif year < 2001 then
              cell = getCell('Du Maurier Open ' .. year .. '/Herren', result)
            elseif year == 2001 then
              cell = getCell('Tennis Masters Series Montreal 2001', result)
            elseif year == 2002 then
              cell = getCell('Tennis Masters Series Toronto 2002', result)
            elseif year < 2005 then
              cell = getCell('Tennis Masters Series Canada ' .. year, result)
            elseif year < 2020 then
              cell = getCell('Rogers Cup ' .. year .. '/Herren', result)
            else
              cell = getCell('National Bank Open ' .. year .. '/Herren', result)
            end
          elseif prefix == 'SHA' then
	    if year == 2009 then
	      cell = getCell('Shanghai ATP Masters 1000 ' .. year, result)
	    elseif year < 2019 then
	      cell = getCell('Shanghai Rolex Masters ' .. year, result)
	    else
	      cell = getCell('Rolex Shanghai Masters ' .. year, result)
	    end
          elseif prefix == 'PAR' then
	    if year < 1972 then
	      cell = getCell('Paris Open ' .. year, result)
	    elseif year < 1983 then
	      cell = getCell('Paris Masters ' .. year, result)
	    elseif year < 2000 then
	      cell = getCell('Paris Open ' .. year, result)
	    elseif year < 2004 then
	      cell = getCell('Tennis Masters Series Paris ' .. year, result)
	    elseif year < 2017 then
	      cell = getCell('BNP Paribas Masters ' .. year, result)
	    else
	      cell = getCell('Rolex Paris Masters ' .. year, result)
	    end
          elseif prefix == 'DAV' then
	    if year < 1940 then
	      cell = getCell('International Lawn Tennis Challenge ' .. year, result)
            elseif year == 2021 then
              if year > fYear then
                if result == '&nbsp;' or not result or result == '' or result == '-' or result == '–' then
                  result = frame:getParent().args['DAV2020'] or '&nbsp;'
                end
	        cell = getCell('Davis Cup 2020/21', result)
                cell:attr('colspan', 2)
                year = year - 1
              else
	        cell = getCell('Davis Cup 2020/21', result)
              end
            elseif year == 2020 then
	      cell = getCell('Davis Cup 2020/21', result)
	    else
	      cell = getCell('Davis Cup ' .. year, result)
	    end
          elseif prefix == 'OLY' then
            cell = getCell('Olympische Sommerspiele ' .. year .. '/Tennis/Herren' .. competition, result)
          end
          if possibleResults[result] ~= null then
            if possibleResults[result] == karriere then
              sum = sum + 1
            elseif possibleResults[result] > karriere then
              karriere = possibleResults[result]
              sum = 1
            end
          end
        end
      else
        for year2 = year - 1, fYear, -1 do
          if not wasHeld(prefix, year2) then
            colspan = colspan + 1
          else
            break
          end
        end
        cell = mw.html.create('td'):wikitext('&nbsp;')
        cell:css('font-style', 'italic')
        cell:css('background-color', '#e8e9ea')
        if colspan > 1 then
          cell:attr('colspan', colspan)
        end
      end
      row:node(cell)
      year = year - colspan
    end
    if karriere == 0 then
      row:node(mw.html.create('td'):wikitext('—'))
    else
      for k,v in pairs(possibleResults) do
        if v == karriere then
          if k == 'S' then
            row:node(mw.html.create('td'):wikitext(sum .. ' × S'):css('background-color', '#FFF68F'):css('font-weight', 'bold'))
          elseif k == 'F' then
            row:node(mw.html.create('td'):wikitext(sum .. ' × F'):css('background-color', '#BFEFFF'))
          elseif k == 'HF' or result == 'KF' then
            row:node(mw.html.create('td'):wikitext(sum .. ' × ' .. k):css('background-color', '#FFE7BA'))
          elseif k == 'B' then
            row:node(mw.html.create('td'):wikitext(sum .. ' × B'):css('background-color', '#CC9966'))
          elseif k == '1' or k == '2' or k == '3' then
            row:node(mw.html.create('td'):wikitext(sum .. ' × ' .. k .. 'R'))
          else
            row:node(mw.html.create('td'):wikitext(sum .. ' × ' .. k))
          end
          break
        end
      end
    end

    return row
end

-- die Vorlage TennisturniereHerren erzeugt eine Tabelle mit den Turnierergebnissen der
-- wichtigsten Tennisturniere.
-- Parameter:
--   frame: der aufrufende frame
--   competition: entweder 'einzel' oder 'doppel'
--   tournaments: welche Turniere eingeschlossen werden sollen
--                'all' alle Turniere
--                'gs' nur die Grand Slam Turniere
--                'gsatp' Grand Slams und ATP Finals
--                'gsoly' Grand Slams und Olympische Spiele
--                'gsatpoly' Grand Slams, ATP Finals und Olympische Spiele
-- Die wichtigsten Turniere sind:
--   die Grand Slam Turniere
--   die Olympischen Spiele
--   die ATP 1000 Turniere
-- die Vorlage kann die beidenfolgenden Parameter haben:
--   firstYear: das erste Jahr für das Tabelleneinträge erzeugt werden sollen (vierstellig)
--   lastYear: das letzte Jahr für das Tabelleneinträge erzeugt werden sollen (vierstellig)
--   sind diese beiden Parameter nicht vorhanden, werden sie aus den folgenden ermittelt
-- optional kommen folgende Parameter dazu
--   AUS gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Australian Open (zB AUS2016=1)
--   FRO gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die French Open (zB FRO2016=2)
--   WIM gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Wimbledon Championships (zB WIM2016=AF)
--   USO gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die US Open (zB USO2016=VF)
--   ATP gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die ATP Finals (zB ATP2016=S)
--   IND gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Indian Wells Masters
--   MIA gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Miami Masters
--   ROM gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Rom Masters
--   MAD gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Madrid Masters
--   CIN gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Cincinnati Masters
--   KAN gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Kanada Masters
--   MCM gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Monte Carlo Masters
--   SHA gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Shanghai Masters
--   HAM gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Hamburg Masters
--   STO gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Stockholm Masters
--   STU gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Stuttgart Masters
--   ESS gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Essen Masters
--   PAR gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Paris Masters
--   OLY gefolgt vom Jahr für das Ergebnis im jeweiligen Jahr für die Olympischen Spiele
local function TennisturniereHerren(frame, competition, tournaments)
    local firstYear = frame:getParent().args['ErstesJahr']
    local lastYear = frame:getParent().args['LetztesJahr']
    local result
    local table
    local head
    local row
    local year

    if not firstYear then
      for year=1877, tonumber(os.date('%Y')) do
        for k,v in pairs({ "AUO", "FRO", "WIM", "USO", "DAV", "ATP", "IND", "MIA", "ROM", "MAD", "CIN", "KAN", "MCM", "SHA", "HAM", "STO", "STU", "ESS", "PAR", "OLY" }) do
          if frame:getParent().args[v..year] then
            firstYear = year
            break
          end
        end
        if firstYear then
          break
        end
      end
      if not firstYear then
        return '\n\nKein gültiger Parameter gefunden!\n\n'
      end
    end
    if not lastYear then
      lastYear = firstYear
      for year=tonumber(os.date('%Y')), firstYear, -1 do
        for k,v in pairs({ "AUO", "FRO", "WIM", "USO", "DAV", "ATP", "IND", "MIA", "ROM", "MAD", "CIN", "KAN", "MCM", "SHA", "HAM", "STO", "STU", "ESS", "PAR", "OLY" }) do
          if frame:getParent().args[v..year] then
            lastYear = year
            break
          end
        end
        if lastYear > firstYear then
          break
        end
      end
    end

    if competition ~= 'einzel' and competition ~= 'doppel' then
        return 'Der Parameter competition muss entweder "einzel" oder "doppel" sein'
    end

    -- wikitable anlegen
    table = mw.html.create('table'):addClass('wikitable'):css('text-align', 'center'):css('font-size', '90%')

    -- Tabellenheader mit Links auf die zugehörigen 'ATP Tour' Artikel anlegen
    head = mw.html.create('tr')
    head:node(mw.html.create('th'):wikitext('Turnier'))
    for year = lastYear, firstYear, -1
    do
       if year < 1990 then
       	 head:node(mw.html.create('th'):wikitext(year))
       elseif year < 2009 then
         head:node(mw.html.create('th'):wikitext('[[ATP Tour ' .. year .. '|' .. year .. ']]'))
       elseif year < 2019 then
         head:node(mw.html.create('th'):wikitext('[[ATP World Tour ' .. year .. '|' .. year .. ']]'))
       else
         head:node(mw.html.create('th'):wikitext('[[ATP Tour ' .. year .. '|' .. year .. ']]'))
       end
    end
    head:node(mw.html.create('th'):wikitext('Karriere'))

    -- Header in die Tabelle einfügen
    table:node(head):newline()

    -- Zeile Australian Open
    if isUsed(frame, firstYear, lastYear, 'AUO') then
      table:node(getRow(frame, 'Australian Open', competition, '#E5D1CB', 'AUO', firstYear, lastYear)):newline()
    end

    -- Zeile French Open
    if isUsed(frame, firstYear, lastYear, 'FRO') then
      table:node(getRow(frame, 'French Open', competition, '#E5D1CB', 'FRO', firstYear, lastYear)):newline()
    end

    -- Zeile Wimbledon Championships
    if isUsed(frame, firstYear, lastYear, 'WIM') then
      table:node(getRow(frame, 'Wimbledon Championships|Wimbledon', competition, '#E5D1CB', 'WIM', firstYear, lastYear)):newline()
    end

    -- Zeile US Open
    if isUsed(frame, firstYear, lastYear, 'USO') then
      table:node(getRow(frame, 'US Open', competition, '#E5D1CB', 'USO', firstYear, lastYear)):newline()
    end

    if tournaments == 'all' or tournaments == 'gsatp' or tournaments == 'gsatpoly' then
      -- Zeile ATP Finals
      if isUsed(frame, firstYear, lastYear, 'ATP') then
        -- das &nbsp; erreicht, dass die Namen der Übersichtsartikel einzeilig dargestellt werden
        table:node(getRow(frame, 'ATP Finals', competition, '#FFFFCC', 'ATP', firstYear, lastYear)):newline()
      end
    end

    if tournaments == 'all' then
      -- Zeile Indian Wells Masters
      if isUsed(frame, firstYear, lastYear, 'IND') then
        table:node(getRow(frame, 'Indian Wells Masters|Indian Wells', competition, '#', 'IND', firstYear, lastYear)):newline()
      end

      -- Zeile Miami Masters
      if isUsed(frame, firstYear, lastYear, 'MIA') then
        table:node(getRow(frame, 'Miami Masters|Miami', competition, '#', 'MIA', firstYear, lastYear)):newline()
      end

      -- Zeile Monte Carlo Masters
      if isUsed(frame, firstYear, lastYear, 'MCM') then
        table:node(getRow(frame, 'Monte Carlo Masters|Monte Carlo', competition, '#', 'MCM', firstYear, lastYear)):newline()
      end

      -- Zeile Madrid Masters
      if isUsed(frame, firstYear, lastYear, 'MAD') then
        table:node(getRow(frame, 'Madrid Masters|Madrid', competition, '#', 'MAD', firstYear, lastYear)):newline()
      end

      -- Zeile Rom Masters
      if isUsed(frame, firstYear, lastYear, 'ROM') then
        table:node(getRow(frame, 'Rom Masters|Rom', competition, '#', 'ROM', firstYear, lastYear)):newline()
      end

      -- Zeile Hamburg Masters
      if isUsed(frame, firstYear, lastYear, 'HAM') then
        table:node(getRow(frame, 'ATP Hamburg|Hamburg', competition, '#', 'HAM', firstYear, lastYear)):newline()
      end

      -- Zeile Kanada Masters
      if isUsed(frame, firstYear, lastYear, 'KAN') then
        table:node(getRow(frame, 'Kanada Masters|Kanada', competition, '#', 'KAN', firstYear, lastYear)):newline()
      end

      -- Zeile Cincinnati Masters
      if isUsed(frame, firstYear, lastYear, 'CIN') then
        table:node(getRow(frame, 'Cincinnati Masters|Cincinnati', competition, '#', 'CIN', firstYear, lastYear)):newline()
      end

      -- Zeile Stockholm Masters
      if isUsed(frame, firstYear, lastYear, 'STO') then
        table:node(getRow(frame, 'Stockholm Masters|Stockholm', competition, '#', 'STO', firstYear, lastYear)):newline()
      end

      -- Zeile Essen Masters
      if isUsed(frame, firstYear, lastYear, 'ESS') then
        table:node(getRow(frame, 'Essen Masters|Essen', competition, '#', 'ESS', firstYear, lastYear)):newline()
      end

      -- Zeile Stuttgart Masters
      if isUsed(frame, firstYear, lastYear, 'STU') then
        table:node(getRow(frame, 'Stuttgart Masters|Stuttgart', competition, '#', 'STU', firstYear, lastYear)):newline()
      end

      -- Zeile Shanghai Masters
      if isUsed(frame, firstYear, lastYear, 'SHA') then
        table:node(getRow(frame, 'Shanghai Masters (Tennis)|Shanghai', competition, '#', 'SHA', firstYear, lastYear)):newline()
      end

      -- Zeile Paris Masters
      if isUsed(frame, firstYear, lastYear, 'PAR') then
        table:node(getRow(frame, 'Paris Masters|Paris', competition, '#', 'PAR', firstYear, lastYear)):newline()
      end
    end

    if tournaments == 'all' or tournaments == 'gsoly' or tournaments == 'gsatpoly' then
      -- Zeile Olympische Spiele
      if isUsed(frame, firstYear, lastYear, 'OLY') then
        table:node(getRow(frame, 'Tennis bei den Olympischen Spielen|Olympische&nbsp;Spiele', competition, '#FFD700', 'OLY', firstYear, lastYear)):newline()
      end
    end

    if tournaments == 'all' then
      -- Zeile Davis Cup
      if isUsed(frame, firstYear, lastYear, 'DAV') then
        table:node(getRow(frame, 'Davis Cup', competition, '#C2B280', 'DAV', firstYear, lastYear)):newline()
      end
    end

    -- komplette Tabelle als String zurückgeben
    return tostring(table)
end

function p.TennisturniereHerrenEinzel(frame)
    return TennisturniereHerren(frame, 'einzel', 'all')
end

function p.TennisturniereHerrenDoppel(frame)
    return TennisturniereHerren(frame, 'doppel', 'all')
end

function p.HerrenEinzelGrandSlam(frame)
    return TennisturniereHerren(frame, 'einzel', 'gs')
end

function p.HerrenDoppelGrandSlam(frame)
    return TennisturniereHerren(frame, 'doppel', 'gs')
end

function p.HerrenEinzelGrandSlamATP(frame)
    return TennisturniereHerren(frame, 'einzel', 'gsatp')
end

function p.HerrenDoppelGrandSlamATP(frame)
    return TennisturniereHerren(frame, 'doppel', 'gsatp')
end

function p.HerrenEinzelGrandSlamOly(frame)
    return TennisturniereHerren(frame, 'einzel', 'gsoly')
end

function p.HerrenDoppelGrandSlamOly(frame)
    return TennisturniereHerren(frame, 'doppel', 'gsoly')
end

function p.HerrenEinzelGrandSlamATPOly(frame)
    return TennisturniereHerren(frame, 'einzel', 'gsatpoly')
end

function p.HerrenDoppelGrandSlamATPOly(frame)
    return TennisturniereHerren(frame, 'doppel', 'gsatpoly')
end

return p