-- Module to build tables for standings in Sports-- See documentation for details
require('strict')
local p =
-- Main functionfunction p.main(frame) -- Declare locals local getArgs = require('Module:Arguments').getArgs local Args = getArgs(frame,) 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 local table_anchor = mw.ustring.gsub(Args['section'] and 'sports-table-' .. Args['section'] or , ' ', '_') -- Exit early if we are using section transclusion for a different section local tsection = frame:getParent.args['transcludesection'] or frame:getParent.args['section'] or local bsection = frame.args['section'] or if(tsection ~= and bsection ~= ) then if(tsection ~= bsection) then return end end
local templatestyles = frame:extensionTag -- Edit links if requested local baselink = frame:getParent:getTitle if baselink
baselink then baselink = end local template_name = (baselink ~= and (':' .. baselink .. (table_anchor ~= and '#' .. table_anchor or ))) 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
'no_hide_class_rules' then full_table = true show_class_rules = false end -- Declare results column header local results_header = results_header = local results_defined = false -- Check whether this would be needed -- Possible prefix for result fields local respre = (Args['result_prefix'] or ) .. '_' respre = (respre
-- 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
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 -- 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
-- Add a table anchor if table_anchor ~= then table.insert(t, '
\n') 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' if bg_col
ii_show and 'font-weight: bold;' or 'font-weight: normal;' if yesno(Args['show_totals'] or 'no') and team_code_ii
'before' then status_string = '
'..string.lower(status_string)..' - ' else status_string = ' ('..status_string..')' end end end -- Now build the rows if yesno(Args['show_totals'] or 'no') and team_code_ii'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
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; color: inherit;' 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 = 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 else -- Refer to it note_res_string = note_res_string .. frame:extensionTag 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
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 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 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 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
'complete' or hide_footer then -- Do nothing elseif update
'future' then -- Future start date table.insert(t_footer,'First '..matches_text..' will be played: '..start_date..'. ') else table.insert(t_footer,'Updated to '..matches_text..' played on '..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 = '
' if footer_break and (not (string.lower(update)
'before' then status_string = status_string..'
'..string.lower(curr_letter)..' - '..t_status.code[curr_letter]..'; ' else status_string = status_string..'('..curr_letter..') '..t_status.code[curr_letter]..'; ' end status_exist = true end end -- Now if it contains entries the '; ' needs to be removed if status_exist and not hide_footer then if (#t_footer > 0) then table.insert(t_footer,''..table.concat(t_footer)..'
' t_footer = t_footer..frame:expandTemplate else -- As reflist size text t_footer = '
'..table.concat(t_footer)..'
' 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("")
Warning: %1 = %2
') 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']
"" then for k=1,#total_warnings do table.insert(t, '
Possible problem: ' .. total_warnings[k] .. '
') end end end end else table.insert(t, '') end if Args['float'] then return frame:expandTemplate .. templatestyles .. '\n' .. table.concat(t) .. frame:expandTemplate end
return templatestyles .. '\n' .. table.concat(t)end return p