Module:Sports table

Moduledocumentatie​[bekijk] [bewerk] [ververs] [geschiedenis]

Deze op Lua gebaseerde module is bedoeld om groepsfasetabellen en competitieklassementen voor artikelen over sportmanifestaties op te stellen. Het vervolg van deze documentatie legt de structuur van de module uit. In de documentatie van de individuele varianten vindt de gedetailleerde uitleg over het gebruik terug.

Gebruik bewerken

De basiscode is {{#invoke:Sports table|main|style=XXX}}. Hierbij refereert XXX naar de gekozen variant. De documentatie bij deze varianten geeft meer uitleg over het gebruik. De beschikbare varianten zijn:

  • WDL (voor tabellen met een winst-gelijkspel-verlies systeem)
  • WL OT (voor tabellen met een winst-verlies systeem en afwijkende puntenwaardering als een wedstrijd pas na de reguliere speeltijd wordt beslist)

Meer varianten? bewerken

De module gebruikt Lua om de tabellen te genereren. De meerderheid van de functionaliteit wordt verkregen uit de hoofdmodule, maar de specifieke instellingen voor de kolommen komen uit de variante sub-modules. De beschikbare varianten beschikken over verschillende mogelijkheden. Indien u meer mogelijkheden nodig heeft kan het gewenst zijn om een nieuwe variant aan te maken. Door hierbij uit te gaan van een bestaande variant kan met een weinig aan afstelling de gewenste functionaliteit verkregen worden zonder een volledige nieuwe variant op te hoeven bouwen. Indien het gewenst is om een nieuwe variant aan te maken, kan u het Lua handboek desgewenst raadplegen.

-- Module to build tables for standings in Sports
-- See documentation for details

require('Module:No globals')

local p = {}

-- Main function
function p.main(frame)
        -- Declare locals
        local getArgs = require('Module:Arguments').getArgs
        local Args = getArgs(frame, {parentFirst = true})
        local ii_start, ii_end, N_rows_res = 0
        local text_field_result
        local notes_exist = false
        local t = {}
        local t_footer = {}
        local t_return = {}
        local team_list = {}
        local jj, jjj

        -- Exit early if we are using section transclusion for a different section
        if (Args['transcludesection'] and Args['section'])
                and Args['transcludesection'] ~= Args['section'] then
                return ''
        end

        -- Edit links if requested
        local baselink = frame:getParent():getTitle()
        if mw.title.getCurrentTitle().text == baselink then  baselink = '' end
        local template_name = Args['template_name']
                or (baselink ~= '' and (':' .. baselink))
                or ''

        -- Get the custom start point for the table (most will start by default at 1)
        local top_pos = tonumber(Args['highest_pos']) or 1
        -- Get the custom end point for the table (unrestricted if bottom_pos is < top_pos)
        local bottom_pos = tonumber(Args['lowest_pos']) or 0
        local N_teams = top_pos - 1 -- Default to 0 at start, but higher number needed to skip certain entries

        -- Load modules
        local yesno = require('Module:Yesno')
        -- Load style and (sub) modules
        local style_def = Args['style'] or 'WDL'
        -- Historically 'football' exists as style, this is now forwarded to WDL
        if style_def == 'football' then style_def = 'WDL' end
        local p_style = require('Module:Sports table/'..style_def)
        local p_sub = require('Module:Sports table/sub')

        -- Random value used for uniqueness
        math.randomseed( os.clock() * 10^8 )
        local rand_val = math.random()

        -- Declare colour scheme
        local result_col = {}
        result_col = {green1='#BBF3BB', green2='#CCF9CC', green3='#DDFCDD', green4='#EEFFEE',
                blue1='#BBF3FF', blue2='#CCF9FF', blue3='#DDFCFF', blue4='#EEFFFF',
                yellow1='#FFFFBB', yellow2='#FFFFCC', yellow3='#FFFFDD', yellow4='#FFFFEE',
                red1='#FFBBBB', red2='#FFCCCC', red3='#FFDDDD', red4='#FFEEEE',
                black1='#BBBBBB', black2='#CCCCCC', black3='#DDDDDD', black4='#EEEEEE',
                orange1='#FEDCBA', orange2='#FEEAD5', pink1='#FFCCFF',
                white1='inherit',['']='inherit',
                groen1='#CCFFCC',
                groen1_1='#BBF3BB', groen2_1='#CCF9CC', groen3_1='#DDFCDD', groen4_1='#EEFFEE',
                blauw1='#CCCCFF', blauw2='#87CEFA',
                blauw1_1='#BBF3FF', blauw2_1='#CCF9FF', blauw3_1='#DDFCFF', blauw4_1='#EEFFFF',
                geel1='#EEE8AA', 
                geel1_1='#FFFFBB', geel2_1='#FFFFCC', geel3_1='#FFFFDD', geel4_1='#FFFFEE',
                rood1='#FF8888',
                rood1_1='#FFBBBB', rood2_1='#FFCCCC', rood3_1='#FFDDDD', rood4_1='#FFEEEE',
                zwart1_1='#BBBBBB', zwart2_1='#CCCCCC', zwart3_1='#DDDDDD', zwart4_1='#EEEEEE',
                oranje1_1='#FEDCBA', oranje2_1='#FEEAD5',
                roze1_1='#FFCCFF',
                wit1_1='inherit',['']='inherit'
        }

        -- Show all stats in table or just matches played and points
        local full_table = true
        local hide_results = yesno(Args['hide_results'] or 'no')
        local pld_pts_val = string.lower(Args['only_pld_pts'] or 'no')
        local show_class_rules = yesno(Args['show_class_rules'] or 'yes') and true or false
        -- True if par doesn't exist, false otherwise
        if yesno(pld_pts_val) then
                full_table = false
        elseif pld_pts_val=='no_hide_class_rules' then
                full_table = true
                show_class_rules = false
        end

        -- Declare results column header
        local results_header = {}
        results_header = {HPD='Handhaving, promotie of degradatie',
        	Q='Kwalificatie', QR='Kwalificatie of degradatie',
            P='Promotie', PQR='Promotie, kwalificatie of degradatie', PR='Promotie of degradatie', PQ='Promotie of kwalificatie',
            R='Degradatie'}
        local results_defined = false -- Check whether this would be needed
        -- Possible prefix for result fields
        local respre = (Args['result_prefix'] or '') .. '_'
        respre = (respre == '_') and '' or respre
        -- Now define line for column header (either option or custom)
        local local_res_header = results_header[Args[respre..'res_col_header']] or Args[respre..'res_col_header'] or ''
        -- Check whether it includes a note
        local res_head_note = Args['note_header_res']
        local res_head_note_text = ''
        if full_table and res_head_note then
                notes_exist = true
                res_head_note_text = frame:expandTemplate{ title = 'refn', args = { group='kleine-letter', res_head_note} }
        end
        local results_header_txt = '! scope="col" |'..local_res_header..res_head_note_text..'\n'

        -- Get status option
        local t_status = p_style.status(Args)

        -- Alternative syntax for team list
        if Args['team_order'] and Args['team_order'] ~= '' then
                local team_order_offset = (tonumber(Args['team_order_start']) or 1) - 1
                local tlist = mw.text.split(Args['team_order'], '%s*[;,]%s*')
                for k, tname in ipairs(tlist) do
                        if tname ~= '' then
                                Args['team' .. (k + team_order_offset)] = tname
                        end
                end
        end

        -- Read in number of consecutive teams (ignore entries after skipping a spot)
        while Args['team'..N_teams+1] ~= nil and (bottom_pos < top_pos or N_teams < bottom_pos) do
                N_teams = N_teams+1
                -- Sneakily add it twice to the team_list parameter, once for the actual
                -- ranking, the second for position lookup in sub-tables
                -- This is possible because Lua allows both numbers and strings as indices.
                team_list[N_teams] = Args['team'..N_teams] -- i^th entry is team X
                team_list[Args['team'..N_teams]] = N_teams -- team X entry is position i
        end

        -- Optional totals
        local total_row_name = 'SPORTS_TABLE_TOTAL'
        if yesno(Args['show_totals'] or 'no') then
                N_teams = N_teams+1
                Args['team' .. N_teams] = total_row_name
                Args['name_' .. total_row_name] = 'Total'
                Args['result' .. N_teams] = total_row_name
                Args['col_' .. total_row_name] = '#eee'
                team_list[N_teams] = Args['team' .. N_teams]
                team_list[Args['team'..N_teams]] = N_teams
        end

        -- Show position
        local position_col = yesno(Args['show_positions'] or 'yes') and true or false

        -- Show groups or note
        local group_col = yesno(Args['show_groups'] or 'no') and true or false

        -- Show match_table or not
        local match_table = yesno(Args['show_matches'] or 'no') and true or false
        local p_matches = match_table and
                (style_def == 'Chess' and require('Module:Sports results/'..style_def) or require('Module:Sports results'))

        -- Custom position column label or note
        local pos_label = Args['postitle'] or '<abbr title="Positie">Pos</abbr>'
        if position_col == false then pos_label = nil end

        -- Show status or not
        local show_status = yesno(Args['show_status'] or 'yes') and true or false

        -- Get VTE button text (but only for non-empty text)
        local VTE_text = ''
        if (template_name ~= '') then
                VTE_text = require('Module:Navbar')._navbar({
                        template_name,
                        mini=1,
                        style='float:right',
                        brackets=1
                })

                -- remove the next part if https://en.wikipedia.org/w/index.php?oldid=832717047#Sortable_link_disables_navbar_links?
                -- is ever fixed
                if yesno(Args['sortable_table'] or 'no') then
                        VTE_text = mw.ustring.gsub(VTE_text, '<%/?abbr[^<>]*>', ' ')
                end
        end

        -- Add source to title if specified and possible
        local title_source = false
        if Args['title'] and Args['title_source'] then
                Args['title'] = Args['title'] .. Args['title_source']
                title_source = true
        elseif Args['table_header'] and Args['table_header_source'] then
                Args['table_header'] = Args['table_header'] .. Args['table_header_source']
                title_source = true
        end

        -- Write column headers
        t_return = p_style.header(t,Args,p_sub,pos_label,group_col,VTE_text,full_table,results_header_txt)
        if match_table then
                -- Add empty column header
                t_return.count = t_return.count+1
                table.insert(t_return.tab_text,'! scope="row" class="unsortable" style="background-color:white;border-top:white;border-bottom:white;line-width:3pt;"| \n')

                -- Add rest of header
                t_return = p_matches.header(t_return,Args,p_sub,N_teams,team_list,tonumber(Args['legs']) or 1)
        end
        t = t_return.tab_text
        local N_cols = t_return.count

        -- Determine what entries go into table
        -- Find out which team to show (if any)
        local ii_show = team_list[Args['showteam'] or nil] -- nil if non-existant
        -- Start and end positions to show
        local n_to_show = tonumber(Args['show_limit']) or N_teams
        -- Check for "legal value", if not legal (or non declared), then show all
        local check_n = ((n_to_show>=(N_teams-top_pos+1)) or (n_to_show<=1) or (n_to_show~=math.floor(n_to_show)))
        -- Also check whether there is a valid ii_show
        if check_n or (not ii_show) then
                ii_start = top_pos
                ii_end = N_teams
        else
                -- It's a proper integer between top_pos+1 and N_teams-1
                -- If it is in the middle show the same number above and below
                -- If it is in the top or bottom, show the exact number
                -- How many to show on the side
                local n_show_side = math.floor(n_to_show/2)
                if (ii_show-top_pos+1)<=n_show_side then
                        -- Top team
                        ii_start = top_pos
                        ii_end = top_pos+n_to_show-1
                elseif ii_show>=(N_teams+1-n_show_side) then
                        -- Bottom team
                        ii_start = N_teams+1-n_to_show
                        ii_end = N_teams
                else
                        -- Normal case
                        ii_start = ii_show-n_show_side
                        ii_end = ii_show+n_show_side
                end
        end

        -- For results column
        local new_res_ii = ii_start
        -- Pre-check for existence of column
        if not hide_results then
                for ii = ii_start, ii_end do
                        if Args[respre..'result'..ii] and Args[respre..'text_' .. Args[respre..'result'..ii]] then results_defined = true end
                end
        end
        -- Remove results header if it is unused
        if full_table and not results_defined then
                -- First get it as one string, then use string replace to replace that header by empty string
                local t_str = tostring(table.concat(t))
                t_str = mw.ustring.gsub( t_str, results_header_txt, '' )
                N_cols = N_cols-1 -- There is actually one column less
                t = {}
                table.insert(t, t_str)
        end

        -- Write rows
        local team_name, team_code_ii, team_code_jj, pos_num, group_txt, note_local
        local note_string, note_local, note_local_num, note_id
        local note_id_list = {}
        local hth_id_list = {}
        for ii = ii_start, ii_end do
                -- First get code
                team_code_ii = team_list[ii]
                -- Now read values
                pos_num = Args['pos_'..team_code_ii]         or ii
                group_txt = Args['group_'..team_code_ii]     or ' '
                team_name = Args['name_'..team_code_ii]       or team_code_ii
                note_local = Args['note_'..team_code_ii]     or nil

                -- Does it need a promotion/qualification/relegation tag
                local result_local = Args[respre..'result'..ii] or nil
                local bg_col = nil
                -- Get local background colour
                if result_local then
                        bg_col = result_col[Args[respre..'col_'..result_local]] or Args[respre..'col_'..result_local] or 'inherit'
                        bg_col = 'background-color:'..bg_col..';'     -- Full style tag
                end
                if not bg_col then bg_col = 'background-color:transparent;' end -- Becomes default if undefined

                -- Bold this line or not
                local ii_fw = ii == ii_show and 'font-weight: bold;' or 'font-weight: normal;'
                if yesno(Args['show_totals'] or 'no') and team_code_ii == total_row_name then
                        ii_fw = 'font-weight: bold;'
                end

                -- Check whether there is a note or not, if so get text ready for it
                if note_local and full_table then
                        -- Set global check for notes to true
                        notes_exist = true
                        -- There are now 3 options for notes
                        -- 1) It is a full note
                        -- 2) It is a referal to another note (i.e. it's just a team code; e.g. note_AAA=Text, note_BBB=AAA) in which the note for BBB should link to the same footnote as AAA, with
                        -- 2a) The other linked note exist in the part of the table shown
                        -- 2b) The part of the note does not exist in the part of the table shown
                        if not Args['note_'..note_local] then
                                -- Option 1
                                -- Now define the identifier for this
                                note_id = '"table_note_'..team_code_ii..rand_val..'"' -- Add random end for unique ID if more tables are present on article (which might otherwise share an ID)
                                note_id_list[team_code_ii] = note_id

                                -- Call refn template
                                note_string = frame:expandTemplate{ title = 'refn', args = { group='kleine-letter', name=note_id, note_local} }
                        else
                                -- Option 2
                                -- It is option 2a in either one if either the main note is inside the sub-table
                                -- or another ref to that note is inside the sub-table
                                -- Basically when it either has been defined, or the main link will be in the table
                                note_local_num = team_list[note_local]
                                if note_id_list[note_local] or ((note_local_num >= ii_start) and (note_local_num <= ii_end)) then
                                        -- Option 2a
                                        note_id = '"table_note_'..note_local..rand_val..'"'
                                        note_string = frame:extensionTag{ name = 'ref', args = { group = 'kleine-letter', name = note_id} }
                                else
                                        -- Option 2b
                                        -- Now define the identifier for this
                                        note_id = '"table_note_'..note_local..rand_val..'"' -- Add random end for unique ID
                                        note_id_list[note_local] = note_id

                                        -- Call refn template
                                        note_string = frame:expandTemplate{ title = 'refn', args = { group='kleine-letter', name=note_id, Args['note_'..note_local]} }
                                end
                        end
                else
                        note_string = '';
                end

                -- Insert status when needed
                local status_string = ''
                local status_local = show_status and Args[respre .. 'status_'..team_code_ii] or nil
                local status_let_first = true
                local curr_letter
                -- Only if it is defined
                if status_local then
                        -- Take it letter by letter
                        for jjj = 1,mw.ustring.len(status_local) do
                                curr_letter = mw.ustring.upper(mw.ustring.sub(status_local,jjj,jjj))
                                -- See whether it exist
                                if t_status.code[curr_letter] then
                                        -- Depending on whether it is the first letter of not
                                        if status_let_first then
                                                status_string = curr_letter
                                                t_status.called[curr_letter] = true
                                                status_let_first = false
                                        else
                                                status_string = status_string..', '..curr_letter
                                                t_status.called[curr_letter] = true
                                        end
                                end
                        end
                        -- Only add brackets/dash and bolding if it exist
                        if not status_let_first then
                                if t_status.position == 'before' then
                                        status_string = '<span style="font-weight:bold">'..string.lower(status_string)..' &ndash;</span> '
                                else
                                        status_string = ' <span style="font-weight:bold">('..status_string..')</span>'
                                end
                        end
                end

                -- Now build the rows
                if yesno(Args['show_totals'] or 'no') and team_code_ii == total_row_name then
                        table.insert(t,'|- class="sortbottom"\n')                                                          -- New row
                else
                        table.insert(t,'|- \n')              -- New row
                end
                if position_col then
                        table.insert(t,'| style="text-align: center;'..ii_fw..bg_col..'"| '..pos_num..'\n')   -- Position number
                end
                if full_table and group_col then
                        table.insert(t,'| style="'..ii_fw..bg_col..'" |'..group_txt..'\n')                                 -- Group number/name
                end
                -- Build the team string order based on status position
                local team_string
                if t_status.position == 'before' then
                        team_string = status_string..team_name..note_string
                else
                        team_string = team_name..note_string..status_string
                end
                table.insert(t,'! scope="row" style="text-align: left; white-space:nowrap;'..ii_fw..bg_col..'"| '..team_string..'\n')-- Team (with possible note)
                -- Call to subfunction
                t_return = p_style.row(frame,t,Args,p_sub,notes_exist,hth_id_list,full_table,rand_val,team_list,team_code_ii,ii_start,ii_end,ii_fw,bg_col,N_teams,ii,ii_show)
                t = t_return.t
                notes_exist = t_return.notes_exist
                hth_id_list = t_return.hth_id_list

                -- Now check what needs to be added inside the results column
                if full_table then
                        local res_jjj
                        if ii == new_res_ii then
                                -- First check how many rows you need for this
                                N_rows_res = 1
                                jjj = ii+1
                                result_local = Args[respre..'result'..ii] or ''
                                local cont_loop = true
                                while (jjj<=ii_end) and cont_loop do
                                        if Args['split'..tostring(jjj-1)] then
                                                cont_loop = false
                                                new_res_ii = jjj
                                        else
                                                res_jjj = Args[respre..'result'..jjj] or ''
                                                if result_local == res_jjj then
                                                        N_rows_res = N_rows_res+1
                                                else
                                                        cont_loop = false
                                                        new_res_ii = jjj
                                                end
                                        end
                                        jjj = jjj+1
                                end
                                -- Now create this field (reuse ii_fw and bg_col)
                                -- Bold (if in range) or not
                                if ii_show and (ii_show>=ii) and (ii_show<=(ii+N_rows_res-1)) then
                                        ii_fw = 'font-weight: bold;'
                                else
                                        ii_fw = 'font-weight: normal;'
                                end
                                -- Get background colour
                                bg_col = nil
                                if Args[respre..'result'..ii] then
                                        bg_col = result_col[Args[respre..'col_'..result_local]] or Args[respre..'col_'..result_local] or 'inherit'
                                        bg_col = 'background-color:'..bg_col..';'     -- Full style tag
                                end
                                if not bg_col then bg_col = 'background-color:transparent;' end -- Becomes default if undefined
                                -- Check for notes
                                local note_res_string, note_ref, note_text = '', '', ''
                                if Args['note_res_'..result_local] then
                                        notes_exist = true
                                        local note_res_local = Args['note_res_'..result_local]

                                        -- Split the note_res_local into a table if all the entries are valid
                                        local multiref = 1
                                        local note_res_local_table = mw.text.split(note_res_local, '%s*,%s*')
                                        if (#note_res_local_table > 1) then
                                                for k, note_res_loc in ipairs(note_res_local_table) do
                                                        multiref = multiref * (Args['note_res_' .. note_res_loc] and 1 or 0)
                                                end
                                        else
                                                multiref = 0
                                        end

                                        -- Split failed, so make a single entry table with hth_local inside
                                        if multiref < 1 then
                                                note_res_local_table = { note_res_local }
                                        end

                                        for k,note_res_local in ipairs(note_res_local_table) do
                                                if not Args['note_res_'..note_res_local] then
                                                        -- It does not point to another result note
                                                        note_ref = respre..'res_'..result_local
                                                        note_id = '"table_note_res_'..result_local..rand_val..'"' -- Identifier
                                                        note_text = note_res_local
                                                else
                                                        -- It does point to another result note
                                                        note_ref = respre..'res_'..note_res_local
                                                        note_id = '"table_note_res_'..note_res_local..rand_val..'"' -- Identifier
                                                        note_text = Args['note_res_'..note_res_local]
                                                end
                                                -- Check whether it is already printed
                                                if not note_id_list[note_ref] then
                                                        -- Print it
                                                        note_id_list[note_ref] = note_id
                                                        note_res_string = note_res_string .. frame:expandTemplate{ title = 'refn', args = { group='kleine-letter', name=note_id, note_text} }
                                                else
                                                        -- Refer to it
                                                        note_res_string = note_res_string .. frame:extensionTag{ name = 'ref', args = { group = 'kleine-letter', name = note_id} }
                                                end
                                        end
                                end
                                -- Get text
                                local text_result = Args[respre..'text_'..result_local] or ''
                                if text_result:match('fbmulticomp') then
                                        ii_fw = 'padding:0;' .. ii_fw
                                        if text_result:match('fbmulticompefn') then
                                                notes_exist = true
                                        end
                                end
                                text_field_result = '| style="'..ii_fw..bg_col..'" rowspan="'..tostring(N_rows_res)..'" |'..text_result..note_res_string..'\n'
                                -- See whether it is needed (only when blank for all entries)
                                if results_defined then table.insert(t,text_field_result) end
                        end
                end

                -- Insert match row if needed
                if match_table then
                        local legs = tonumber(Args['legs']) or 1
                        -- Add empty cell
                        table.insert(t,'| style="background-color:white;border-top:white;border-bottom:white;"| \n')

                        -- Now include note to match results if needed
                        for jj=top_pos,N_teams do
                                team_code_jj = team_list[jj]
                                if ii == jj then
                                        -- Nothing
                                else
                                        for l=1,legs do
                                                local m = (legs == 1) and 'match_' or 'match' .. l .. '_'
                                                local match_note = Args[m..team_code_ii..'_'..team_code_jj..'_note']
                                                if match_note then
                                                        notes_exist = true
                                                        -- Only when it exist
                                                        -- First check for existence of reference for note
                                                        if not (Args['note_'..match_note] or Args[m..match_note..'_note']) then
                                                             -- It's the entry
                                                             note_id = '"table_note_'..team_code_ii..'_'..team_code_jj..rand_val..'"' -- Add random end for unique ID if more tables are present on article (which might otherwise share an ID)
                                                             note_id_list[team_code_ii..'_'..team_code_jj] = note_id
                                                             note_string = frame:expandTemplate{ title = 'refn', args = { group='kleine-letter', name=note_id, match_note} }
                                                        else
                                                             -- Check for existence elsewhere
                                                             note_local_num = team_list[match_note] or ii_end + 1
                                                             if note_id_list[match_note] or ((note_local_num >= ii_start) and (note_local_num <= ii_end)) then
                                                             -- It exists
                                                             note_id = '"table_note_'..match_note..rand_val..'"' -- Identifier
                                                             note_string = frame:extensionTag{ name = 'ref', args = { group = 'kleine-letter', name = note_id} }
                                                             else
                                                             -- Now define the identifier for this
                                                             note_id = '"table_note_'..match_note..rand_val..'"' -- Add random end for unique ID
                                                             note_id_list[match_note] = note_id
                                                             -- Call refn template
                                                             note_string = frame:expandTemplate{ title = 'refn', args = { group='kleine-letter', name=note_id, Args['note_'..match_note]} }
                                                             end
                                                        end

                                                        -- Now append this to the match result string
                                                        Args[m..team_code_ii..'_'..team_code_jj] = (Args[m..team_code_ii..'_'..team_code_jj] or '')..note_string
                                                end
                                        end
                                end
                        end

                        -- Add rest of match row
                        t = p_matches.row(t,Args,N_teams,team_list,ii,ii_show,legs)
                end

                -- Now, if needed, insert a split (solid line to indicate split in standings, but only when it is not at the last shown position)
                if Args['split'..ii] and (ii<ii_end) then
                        -- Base size on N_cols (it needs 2*N_cols |)
                        table.insert(t,'|- style="background-color:'..result_col['black1']..'; line-height:3pt;"\n')
                        table.insert(t,string.rep('|',2*N_cols)..'\n')
                end
        end

        -- Close table
        table.insert(t, '|}\n')

        -- Get info for footer
        local update = Args['update']                   or 'onbekend'
        local start_date = Args['start_date']   or 'onbekend'
        local source = Args['source'] or Args['bron']   or (title_source == true and '')
                or '<sup class="noprint nopopups">[[Wikipedia:Bronvermelding#Bron gevraagd|<span title="Geen source/bron parameter gedefinieerd">[bron?]</span>]]</sup>'
        local class_rules = Args['class_rules'] or nil

        -- Create footer text
        -- Date updating
        local matches_text = Args['matches_text'] or 'wedstrijd(en)'
        if string.lower(update)=='complete' then
                -- Do nothing
        elseif update=='' then
                -- Empty parameter
                table.insert(t_footer,'Bijgewerkt tot '..matches_text..' gespeeld op onbekend. ')
        elseif string.lower(update)=='future' then
                -- Future start date
                table.insert(t_footer,'De eerste '..matches_text..' word(t/en) gespeeld op '..start_date..'. ')
        else
                table.insert(t_footer,'Bijgewerkt tot '..matches_text..' gespeeld op '..update..'. ')
        end

        -- Stack footer or not
        local footer_break = yesno(Args['stack_footer'] or 'no') and true or false

        -- Variable for linebreak
        local stack_string = '<br />'

        if footer_break and (not (string.lower(update)=='complete')) then table.insert(t_footer,stack_string) end

        if source ~= '' then
                table.insert(t_footer,'Bron: '..source)
        end
        if class_rules and full_table and show_class_rules then
                table.insert(t_footer,'<br />Regels voor de stand: '..class_rules)
        end
        if (Args['matches_style'] or '') == 'FBR' then
                table.insert(t_footer, Args['team_header']
                        and '<br />Kleuren: groen - winst ploeg in linkerkolom; blauw - gelijkspel; rood - winst ploeg in toprij.'
                        or '<br />Kleuren: groen - winst thuisploeg; blauw - gelijkspel; rood - verlies thuisploeg.')
        elseif (Args['matches_style'] or '') == 'BSR' then
                table.insert(t_footer, Args['team_header']
                        and '<br />Kleuren: groen - winst ploeg in linkerkolom; rood - winst ploeg in toprij.'
                        or '<br />Kleuren: groen - winst thuisploeg; rood - verlies thuisploeg.')
        end
        
        -- Now for the named status
        local status_exist = false
        local status_string = ''
        local curr_letter
        for jjj = 1,mw.ustring.len(t_status.letters) do
                curr_letter = mw.ustring.upper(mw.ustring.sub(t_status.letters,jjj,jjj))
                if t_status.called[curr_letter] then
                        if (footer_break and status_exist) then
                                status_string = status_string..stack_string
                        end
                        if t_status.position == 'before' then
                                status_string = status_string..'<span style="font-weight:bold">'..string.lower(curr_letter)..' &ndash;</span> '..t_status.code[curr_letter]..'; '
                        else
                                status_string = status_string..'<span style="font-weight:bold">('..curr_letter..')</span> '..t_status.code[curr_letter]..'; '
                        end
                        status_exist = true
                end
        end
        -- Now end it with a point instead (if it contains entries the '; ' needs to be removed)
        if status_exist then
                status_string = '<br />'..mw.ustring.sub(status_string,1,mw.ustring.len(status_string)-2)..'.'
                table.insert(t_footer,status_string)
        end

        local templatestyles = frame:extensionTag{
                name = 'templatestyles', args = { src = 'Module:Sports table/styles.css' }
        }
        -- Add notes (if applicable)
        if notes_exist then
                table.insert(t_footer,'<br />Noten:')
                -- As reflist size text
                t_footer = templatestyles .. '<div class="sports-table-notes">'..table.concat(t_footer)..'</div>'
                t_footer = t_footer..frame:expandTemplate{ title = 'references', args = { group='kleine-letter'} }
        else
                -- As reflist size text
                t_footer = templatestyles .. '<div class="sports-table-notes">'..table.concat(t_footer)..'</div>'
        end

        -- Add footer to main text table
        table.insert(t,t_footer)

        -- Rewrite anchor links
        for k=1,#t do
                if t[k]:match('%[%[#[^%[%]]*%|') then
                        t[k] = mw.ustring.gsub(t[k], '(%[%[)(#[^%[%]]*%|)', '%1' .. baselink .. '%2')
                end
        end

        -- Generate tracking
        if not Args['notracking'] then
                local getTracking = require('Module:Sports table/argcheck').check
                local warning_categories, tracking_categories = getTracking(Args, frame:getParent().args)
                if #warning_categories > 0 then
                        if frame:preprocess( "{{REVISIONID}}" ) == "" then
                                for k=1,#warning_categories do
                                        warning_categories[k] = mw.ustring.gsub(warning_categories[k], '^%[%[Categorie:Pagina\'s die sports table gebruiken met (.*)|(.*)%]%]$', '<div style="color:red">Warning: %1 = %2</div>')
                                end
                        end
                end
--[[
                for k=1,#warning_categories do
                                table.insert(t, warning_categories[k])
                end
                for k=1,#tracking_categories do
                                table.insert(t, tracking_categories[k])
                end
--]]
                if(Args['showteam'] == nil) then
                        local getWarnings = require('Module:Sports table/totalscheck').check
                        local total_warnings = getWarnings(Args, team_list, ii_start, ii_end)
                        if #total_warnings > 0 then
                                if frame:preprocess( "{{REVISIONID}}" ) == "" then
                                        for k=1,#total_warnings do
                                                table.insert(t, '<div style="color:green">Mogelijk probleem: ' .. total_warnings[k] .. '</div>')
                                        end
                                end
                        end
                end

--        else
--				table.insert(t, '[[Category:Pagina\'s die sports table gebruiken met notracking]]')
        end

        if Args['float'] then
                return frame:expandTemplate{ title = 'wrapper', args = {clear = 'true', margin = '1', float = Args['float']} }
                        .. '\n' .. table.concat(t) .. '|}'
        end

        return table.concat(t)
end

return p