Naar inhoud springen

Module:Sports table/argcheck

Uit Wikipedia, de vrije encyclopedie

Documentatie voor deze module kan aangemaakt worden op de volgende pagina: Module:Sports table/argcheck/doc

local a = {}

local good_args = {
        ['away_goals_header'] = 1,
        ['bonus_header'] = 1,
        ['class_rules'] = 1,
        ['draw_header'] = 1,
        ['drawpoints'] = 1,
        ['float'] = 1,
        ['for_against_style'] = 1,
        ['GB_team'] = 1,
        ['goalpoints'] = 1,
        ['group_header'] = 1,
        ['hide_for_against_columns'] = 1,
        ['hide_played'] = 1,
        ['hide_results'] = 1,
        ['highest_pos'] = 1,
        ['legs'] = 1,
        ['loss_before_draw'] = 1,
        ['loss_before_tie'] = 1,
        ['losspoints'] = 1,
        ['lowest_pos'] = 1,
        ['matches_style'] = 1,
        ['matches_text'] = 1,
        ['match_col_width'] = 1,
        ['note_header_res'] = 1,
        ['only_pld_pts'] = 1,
        ['only_totals'] = 1,
        ['only_fa_totals'] = 1,
        ['pld_header'] = 1,
        ['postitle'] = 1,
        ['perc_first'] = 1,
        ['pts_first'] = 1,
        ['ranking_style'] = 1,
        ['res_col_header'] = 1,
        ['result_prefix'] = 1,
        ['rwpoints'] = 1,
        ['rw_header'] = 1,
        ['section'] = 1,
        ['short_style'] = 1,
        ['show_GB'] = 1,
        ['show_away_goals'] = 1,
        ['show_bonus_points'] = 1,
        ['show_class_rules'] = 1,
        ['show_draw'] = 1,
        ['show_groups'] = 1,
        ['show_limit'] = 1,
        ['show_matches'] = 1,
        ['show_positions'] = 1,
        ['show_rw'] = 1,
        ['show_status'] = 1,
        ['show_totals'] = 1,
        ['solid_cell'] = 1,
        ['sortable_table'] = 1,
        ['source'] = 1,
        ['start_date'] = 1,
        ['stack_footer'] = 1,
        ['status_order'] = 1,
        ['status_pos'] = 1,
        ['style'] = 1,
        ['table_header'] = 1,
        ['table_header_source'] = 1,
        ['team_header'] = 1,
        ['team_order'] = 1,
        ['team_order_start'] = 1,
        ['teamwidth'] = 1,
        ['template_name'] = 1,
        ['title'] = 1,
        ['title_source'] = 1,
        ['transcludesection'] = 1,
        ['update'] = 1,
        ['use_goal_average'] = 1,
        ['use_goal_diff'] = 1,
        ['use_goal_percentage'] = 1,
        ['use_goal_ratio'] = 1,
        ['use_goals_scored'] = 1,
        ['use_point_percentage'] = 1,
        ['use_goals_per_match'] = 1,
        ['use_points_per_match'] = 1,
        ['use_tie'] = 1,
        ['winpoints'] = 1,
}
local good_args_HA = {
        ['hdrawpoints'] = 1,
        ['adrawpoints'] = 1,
        ['hlosspoints'] = 1,
        ['alosspoints'] = 1,
        ['hwinpoints'] = 1,
        ['awinpoints'] = 1
}
local good_args_PKOT = {
        ['showOTloss'] = 1,
        ['showOTwin'] = 1,
        ['showPKloss'] = 1,
        ['showPKwin'] = 1,
        ['show_tiebr'] = 1,
        ['PKlosspoints'] = 1,
        ['OTlosspoints'] = 1,
        ['PKwinpoints'] = 1,
        ['OTwinpoints'] = 1,
        ['PKloss_after_loss'] = 1,
        ['OTloss_after_loss'] = 1,
        ['tiebr_header'] = 1,
}
local ignored_args = {
        ['date'] = 1,
        ['ptsfirst'] = 1
}
local col_names = {
        ['adjust_points'] = 1,
        ['away_goals'] = 1,
        ['draw'] = 1,
        ['loss'] = 1,
        ['gf'] = 1,
        ['ga'] = 1,
        ['group'] = 1,
        ['pf'] = 1,
        ['pa'] = 1,
        ['matches'] = 1,
        ['pos'] = 1,
        ['rw'] = 1,
        ['short'] = 1,
        ['startpoints'] = 1,
        ['status'] = 1,
        ['win'] = 1,
}
local col_names_HA = {
        ['draw'] = 0,
        ['loss'] = 0,
        ['gf'] = 0,
        ['ga'] = 0,
        ['pf'] = 0,
        ['pa'] = 0,
        ['rw'] = 0,
        ['hdraw'] = 1,
        ['adraw'] = 1,
        ['hloss'] = 1,
        ['aloss'] = 1,
        ['hwin'] = 1,
        ['awin'] = 1,
        ['hga'] = 1,
        ['aga'] = 1,
        ['hgf'] = 1,
        ['agf'] = 1,
        ['hpa'] = 1,
        ['apa'] = 1,
        ['hpf'] = 1,
        ['apf'] = 1,
}
local col_names_PKOT = {
        ['PKloss'] = 1,
        ['OTloss'] = 1,
        ['PKwin'] = 1,
        ['OTwin'] = 1,
        ['tiebr'] = 1
}
local tracked_styles = {
        ['football'] = 'WDL',
        ['WDL'] = 'WDL',
        ['WL'] = 'WDL',
        ['WDLHA'] = 'HA',
        ['WDL OT'] = 'PKOT',
        ['WLHA'] = 'HA',
        ['WL OT'] = 'PKOT',
        ['WL PK'] = 'PKOT',
        ['WL OTL tiebreak'] = 'PKOT'
}

function a.check(targs, pargs)
        local teams = {}
        local missing_teams = {}
        local results = {}
        local missing_results = {}
        local orphaned_match_notes = {}
        local orphaned_results = {}
        local orphaned_names = {}
        local orphaned_notes = {}
        local ignored = {}
        local possibly_ignored = {}
        local unknown = {}
        local warn = {}
        local track = {}

        local mstyle = mw.ustring.gsub(targs['style'] or '', '[%s_][%s_]*', ' ')
        mstyle = tracked_styles[mstyle]

        if mstyle == nil then
                return warn,track
        end

        if mstyle == 'HA' then
                for k, v in pairs(good_args_HA) do
                        good_args[k] = v ~= 0 and v or nil
                end
                for k, v in pairs(col_names_HA) do
                        col_names[k] = v ~= 0 and v or nil
                end
                if targs['only_fa_totals'] then
                        col_names['pf'] = 1
                        col_names['gf'] = 1
                        col_names['pa'] = 1
                        col_names['ga'] = 1
                end
        end

        if mstyle == 'PKOT' then
                for k, v in pairs(good_args_PKOT) do
                        good_args[k] = v ~= 0 and v or nil
                end
                for k, v in pairs(col_names_PKOT) do
                        col_names[k] = v ~= 0 and v or nil
                end
        end

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

        -- Limited tracking if we are only showing part of the table
        if targs['showteam'] then
                local top_pos = tonumber(targs['highest_pos']) or 1
                local bottom_pos = tonumber(targs['lowest_pos']) or 0
                local N = top_pos - 1
                while targs['team'..N+1] ~= nil and (bottom_pos < top_pos or N < bottom_pos) do
                        N = N + 1
                        teams[targs['team'..N]] = 1
                        if teams[targs['showteam']] then
                                return warn,track
                        end
                end
        end

        -- Step 1: Generate a team and result list
        for k,v in pairs(targs) do
                if type(k) == 'string' then
                        if k:find('^team%d%d*$') then
                                teams[v] = 1
                                targs[k] = ''
                                if targs['name_' .. v] then
                                        -- Great!
                                        targs['name_' .. v] = ''
                                else
                                        table.insert(missing_teams, v)
                                end
                                if targs['note_' .. v] then
                                        targs['note_' .. v] = ''
                                end
                                if targs['hth_' .. v] then
                                        local multiref = 1
                                        local hth_local_table = mw.text.split(targs['hth_' .. v], '%s*,%s*')
                                        if (#hth_local_table > 1) then
                                                for j, hth_loc in ipairs(hth_local_table) do
                                                        multiref = multiref * (targs['hth_' .. hth_loc] and 1 or 0)
                                                end
                                        else
                                                multiref = 0
                                        end
                                        if multiref > 0 then
                                                for j, hth_loc in ipairs(hth_local_table) do
                                                        targs['hth_' .. hth_loc] = ''
                                                end
                                        elseif targs['hth_' .. targs['hth_' .. v]] then
                                                targs['hth_' .. targs['hth_' .. v]] = ''
                                        end
                                        targs['hth_' .. v] = ''
                                end
                        elseif k:find('^result%d%d*$') or k:find('^.*_result%d%d*$') then
                                local pre = mw.ustring.gsub(k, '^(.*)result%d%d*$', '%1')
                                results[v] = 1
                                targs[k] = ''
                                if targs[pre .. 'col_' .. v] or targs[pre .. 'text_' .. v] or targs[pre .. 'note_res_' .. v] then
                                        -- Great!
                                        if targs[pre .. 'col_' .. v] then
                                                targs[pre .. 'col_' .. v] = ''
                                        end
                                        if targs[pre .. 'text_' .. v] then
                                                targs[pre .. 'text_' .. v] = ''
                                        end
                                        if targs[pre .. 'note_res_' .. v] then
                                                local multiref = 1
                                                local note_res_local_table = mw.text.split(targs[pre .. 'note_res_' .. v], '%s*,%s*')
                                                if (#note_res_local_table > 1) then
                                                        for j, note_res_loc in ipairs(note_res_local_table) do
                                                             multiref = multiref * (targs[pre .. 'note_res_' .. note_res_loc] and 1 or 0)
                                                        end
                                                else
                                                        multiref = 0
                                                end
                                                if multiref > 0 then
                                                        for j, note_res_loc in ipairs(note_res_local_table) do
                                                             targs[pre .. 'note_res_' .. note_res_loc] = ''
                                                        end
                                                elseif targs[pre .. 'note_res_' .. targs[pre .. 'note_res_' ..  v]] then
                                                        targs[pre .. 'note_res_' ..  targs[pre .. 'note_res_' ..  v]] = ''
                                                end
                                                targs[pre .. 'note_res_' .. v] = ''
                                        end
                                        if targs[pre .. 'res_col_header'] then
                                                targs[pre .. 'res_col_header'] = ''
                                        end
                                else
                                        table.insert(missing_results, v)
                                end
                        elseif k:find('^match[%d]*_.*_.*_note$') then
                                local m = mw.ustring.gsub(k, '^(match[%d]*_.*_.*)_note$', '%1')
                                targs[k] = ''
                                if targs[m] then
                                        if targs['note_' .. v] then
                                                targs['note_' .. v] = ''
                                        end
                                        -- Great!
                                else
                                        table.insert(orphaned_match_notes, m)
                                end
                        end
                end
        end

        local possible_missing_winpoints = 0
        for k,v in pairs(targs) do
                if v and v~= '' then
                        local found_arg = 0
                        if type(k) == 'string' then
                                if k:find('^adjust_points_') then
                                        local p = mw.ustring.gsub(k, '^adjust_points_', '')
                                        if (tonumber(v) or 0) ~= 0 then
                                                local pdiff = (tonumber(targs['win_' .. p] or 0) or 0) + tonumber(v)
                                                if pdiff == 0 then
                                                        possible_missing_winpoints = possible_missing_winpoints + 1
                                                else
                                                        possible_missing_winpoints = possible_missing_winpoints - 1
                                                end
                                        end
                                end
                                if found_arg == 0 and (good_args[k] or k:find('^split[%d][%d]*$')) then
                                        -- Great!
                                        found_arg = 1
                                end
                                if found_arg == 0 and k == 'showteam' then
                                        -- Great!
                                        found_arg = 1
                                        if teams[v] ~= 1 then
                                                table.insert(missing_teams, v)
                                        end
                                end
                                if found_arg == 0 and (ignored_args[k] or k:find('^att_')) then
                                        found_arg = 1
                                        table.insert(ignored, k)
                                end
                                if found_arg == 0 and k:find('^[A-Za-z]*_.*$') then
                                        local p = mw.ustring.gsub(k, '^([A-Za-z]*)_.*$', '%1')
                                        if col_names[p] then
                                                -- Great!
                                                found_arg = 1
                                        end
                                end
                                if found_arg == 0 and k:find('^[A-Za-z]*_[A-Za-z]*_.*$') then
                                        local p = mw.ustring.gsub(k, '^([A-Za-z]*_[A-Za-z]*)_.*$', '%1')
                                        if col_names[p] then
                                                -- Great!
                                                found_arg = 1
                                        end
                                end

                                if found_arg == 0 and k:find('^match[%d]*_.*_.*$') then
                                        local t1 = mw.ustring.gsub(k, '^match[%d]*_(.*)_(.*)$', '%1')
                                        local t2 = mw.ustring.gsub(k, '^match[%d]*_(.*)_(.*)$', '%2')
                                        found_arg = 1
                                        if teams[t1] == nil or teams[t2] == nil then
                                                if teams[t1] == nil then
                                                        table.insert(missing_teams, t1)
                                                end
                                                if teams[t2] == nil then
                                                        table.insert(missing_teams, t2)
                                                end
                                        end
                                end
                                if found_arg == 0 and k:find('^result_.*_.*$') then
                                        local t1 = mw.ustring.gsub(k, '^result[%d]*_(.*)_(.*)$', '%1')
                                        local t2 = mw.ustring.gsub(k, '^result[%d]*_(.*)_(.*)$', '%2')
                                        found_arg = 1
                                        if teams[t1] == nil or teams[t2] == nil then
                                                if teams[t1] == nil then
                                                        table.insert(missing_teams, t1)
                                                end
                                                if teams[t2] == nil then
                                                        table.insert(missing_teams, t2)
                                                end
                                        end
                                end
                                if found_arg == 0 and (k:find('^name_') or k:find('^short_')) then
                                        found_arg = 1
                                        table.insert(orphaned_names, k)
                                end
                                if found_arg == 0 and (k:find('^note_') or k:find('^hth_')) then
                                        found_arg = 1
                                        if (k == 'hth_ABC' and v == 'H2H note') then
                                                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met genegeerde parameters|hth_ABC]]')
                                        elseif (k == 'note_ABC' and v == 'Team note') then
                                                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met genegeerde parameters|note_ABC]]')
                                        elseif (k == 'note_res_AAA' and v == 'Result note') then
                                                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met genegeerde parameters|note_res_AAA]]')
                                        else
                                                table.insert(orphaned_notes, k)
                                        end
                                end
                                if found_arg == 0 and (k:find('^col_') or k:find('^text_')) then
                                        found_arg = 1
                                        table.insert(orphaned_results, k)
                                end
                        end
                        if found_arg == 0 then
                                if pargs[k] and pargs[k] ~= '' then
                                        if tonumber(k) then
                                                k = k .. ' = ' .. v
                                        end
                                        table.insert(possibly_ignored, k)
                                else
                                        if tonumber(k) then
                                                k = k .. ' = ' .. v
                                        end
                                        table.insert(unknown, k)
                                end
                        end
                end
        end

        local badchar = '[^A-Za-z0-9_%(%)%- ]'
        for k,v in ipairs(unknown) do
                v = mw.ustring.gsub(v, badchar, '?')
                if v == '' then v = ' ' end
                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met onbekende parameters|' .. v .. ']]')
        end
        for k,v in ipairs(missing_teams) do
                v = mw.ustring.gsub(v, badchar, '?')
                if v == '' then v = ' ' end
                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met ontbrekende teams|' .. v .. ']]')
        end
        for k,v in ipairs(missing_results) do
                v = mw.ustring.gsub(v, badchar, '?')
                if v == '' then v = ' ' end
                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met ontbrekende results|' .. v .. ']]')
        end
        for k,v in ipairs(orphaned_results) do
                v = mw.ustring.gsub(v, badchar, '?')
                if v == '' then v = ' ' end
                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met verweesde results|' .. v .. ']]')
        end
        for k,v in ipairs(orphaned_names) do
                v = mw.ustring.gsub(v, '[^A-Za-z0-9_ ]', '?')
                if v == '' then v = ' ' end
                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met verweesde names|' .. v .. ']]')
        end
        for k,v in ipairs(orphaned_notes) do
                v = mw.ustring.gsub(v, badchar, '?')
                if v == '' then v = ' ' end
                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met verweesde notes|' .. v .. ']]')
        end
        for k,v in ipairs(orphaned_match_notes) do
                v = mw.ustring.gsub(v, badchar, '?')
                if v == '' then v = ' ' end
                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met verweesde match notes|' .. v .. ']]')
        end
        for k,v in ipairs(ignored) do
                v = mw.ustring.gsub(v, badchar, '?')
                if v == '' then v = ' ' end
                table.insert(warn, '[[Categorie:Pagina\'s die sports table gebruiken met genegeerde parameters|' .. v .. ']]')
        end
        for k,v in ipairs(possibly_ignored) do
                v = mw.ustring.gsub(v, badchar, '?')
                if v == '' then v = ' ' end
                table.insert(track, '[[Categorie:Pagina\'s die sports table gebruiken met mogelijk genegeerde parameters|' .. v .. ']]')
        end

        if possible_missing_winpoints > 1 then
                table.insert(track, '[[Categorie:Pagina\'s die sports table gebruiken met mogelijk foutieve winpoints|' .. possible_missing_winpoints .. ']]')
        end

        return warn,track
end

return a