Модуль:Sports results
Для документации этого модуля может быть создана страница Модуль:Sports results/doc
-- Модуль для построения таблиц результатов в спорте
require('strict')
local p = {}
-- Main function
function p.main(frame)
-- Get the args, stripping out blank values
local getArgs = require('Module:Arguments').getArgs
local Args = getArgs(frame, {parentFirst = true})
-- 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
-- Declare locals
local t = {}
local t_footer = {}
local t_return = {}
local team_list = {}
local notes_exist = false
local ii, ii_fw, bg_col, team_name, team_code_ii, ii_start, ii_end
-- Optional custom team header
local team_header = Args['team_header'] or 'Home \\ Away'
-- Number of legs
local legs = tonumber(Args['legs']) or 1
local multirowlegs = (Args['multirowlegs'] or 'no') ~= 'no'
-- 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 ''
local edit_links = template_name == '' and ''
or require('Module:Navbar')._navbar({
template_name,
mini=1,
style='float:right'
})
-- 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 some other modules
local p_sub = require('Module:Sports table/sub')
-- Alternative syntax for team list
if Args['team_order'] and Args['team_order'] ~= '' then
local tlist = mw.text.split(Args['team_order'], '%s*[;,]%s*')
for k, tname in ipairs(tlist) do
if tname ~= '' then
Args['team' .. k] = tname
end
end
end
if Args['team_header_note'] then
notes_exist=true
local note_string = frame:expandTemplate{ title = 'efn',
args = { group='lower-alpha', Args['team_header_note']} }
team_header = team_header .. note_string
end
-- Read in number of consecutive teams (ignore entries after skipping a spot)
ii_start = N_teams
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
ii_end = N_teams
-- Get team to show
local ii_show = team_list[Args['showteam']] -- nil if non-existant
-- Set the font size
local font_size=Args['font_size'] or '100%'
-- Create header
-- Open table
table.insert(t,'{|class="wikitable" style="text-align:center; font-size:'..font_size..';"\n')
-- First column
t_return.count = 0 -- Dummy parameter, using subfunction call seems best at this point because both module are intertwined
t_return.tab_text = t -- Actual text
t_return = p_sub.colhead(t_return,'auto','Дома \\ На выезде')
-- Other columns passed to subfunction
t_return = p.header(t_return,Args,p_sub,N_teams,team_list)
t = t_return.tab_text
-- Now create individual rows
for ii=1,N_teams do
-- Get team info
team_code_ii = team_list[ii]
team_name = Args['name_'..team_code_ii] or team_code_ii
local ii_style = 'text-align:right;'
if ii and ii == ii_show then
ii_style = ii_style .. 'font-weight:bold;'
end
-- Team names
table.insert(t,'|- \n') -- New row
table.insert(t,'! scope="row" style="'
.. ii_style ..'"| '..team_name..'\n') -- Position number
-- Then individual results
t = p.row(t,Args,N_teams,team_list,ii,ii_show)
end
-- Close table
table.insert(t, '|}\n')
-- Get info for footer
local update = Args['update'] or 'unknown'
local start_date = Args['start_date'] or 'unknown'
local source = Args['source'] or frame:expandTemplate{ title = 'citation needed', args = { reason='No source parameter defined', date=os.date('%B %Y') } }
-- Create footer text
-- Date updating
if string.lower(update)=='complete' then
-- Do nothing
elseif update=='' then
-- Empty parameter
table.insert(t_footer,'Обновлено по состоянию на (дата неизвестна). ')
elseif string.lower(update)=='future' then
-- Future start date
table.insert(t_footer,'Первые матчи пройдут '..start_date..'. ')
else
table.insert(t_footer,'Обновлено по состоянию на '..update..'. ')
end
table.insert(t_footer,'Источник: '..source)
if (Args['matches_style'] or '') == 'FBR' then
table.insert(t_footer, '<br>Цвета: зелёный — победа хозяев; жёлтый — ничья; розовый — победа гостей.')
end
if (Args['a_note'] or '') ~= '' then
table.insert(t_footer, '<br>Для предстоящих матчей "м" означает наличие статьи о матче.')
end
-- As reflist size text
t_footer = '<div class="reflist">'..table.concat(t_footer)..'</div>'
-- Add footer to main text table
table.insert(t,t_footer)
return table.concat(t)
end
-- Other functions
local function get_short_name(s, t, n)
-- return short name if defined
if s and s ~= '' then
return s
end
-- replace link text in name with team abbr if possible
if n and t and n:match('(%[%[[^%[%]]*%]%])') then
n = mw.ustring.gsub(n, '(%[%[[^%|%]]*%|)[^%|%]]*(%]%])', '%1' .. t .. '%2')
n = mw.ustring.gsub(n, '(%[%[[^%|%]]*)(%]%])', '%1|' .. t .. '%2')
return n
end
-- nothing worked, so just return the unlinked team abbr
return t or ''
end
local function get_score_background(s)
local s1, s2
-- Define the colouring
local wc, lc, tc = '#BBF3BB', '#FCC', '#FFC'
-- delink if necessary
if s:match('^%s*%[%[[^%[%]]*%|([^%[%]]*)%]%]') then
s = s:match('^%s*%[%[[^%[%]]*%|([^%[%]]*)%]%]')
end
-- get the scores
s1 = tonumber(mw.ustring.gsub( s or '',
'^%s*([%d][%d]*)%s*:%s*([%d][%d]*).*', '%1' ) or '') or ''
s2 = tonumber(mw.ustring.gsub( s or '',
'^%s*([%d][%d]*)%s*:%s*([%d][%d]*).*', '%2' ) or '') or ''
-- return colouring if possible
if s1 ~= '' and s2 ~= '' then
return (s1 > s2) and wc or ((s2 > s1) and lc or tc)
else
return 'transparent'
end
end
local function format_score(s)
s = mw.ustring.gsub(s or '', '^%s*([%d]+)%s*[–−—%-]%s*([%d]+)', '%1:%2')
s = mw.ustring.gsub(s, '^%s*([%d]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d]+)', '%1:%2')
s = mw.ustring.gsub(s, '^%s*(%[%[[^%[%]]*%|[%d]+)%s*%-%s*([%d]+)', '%1:%2')
s = mw.ustring.gsub(s, '^%s*(%[%[[^%[%]]*%|[%d]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d]+)', '%1:%2')
return s
end
function p.header(tt,Args,p_sub,N_teams,team_list)
local ii, team_code_ii, short_name
-- Set match column width
local col_width = Args['match_col_width'] or '28'
-- Get some default values in case it doesn't start at 1
local top_pos = tonumber(Args['highest_pos']) or 1
for ii=top_pos,N_teams do
team_code_ii = team_list[ii]
short_name = get_short_name(Args['short_'..team_code_ii],
team_code_ii, Args['name_'..team_code_ii])
tt = p_sub.colhead(tt,col_width,short_name)
end
return tt
end
function p.row(tt,Args,N_teams,team_list,ii,ii_show)
-- Note ii is the row number being shown
local jj, fw, bg, result, team_code_ii, team_code_jj
local cell_bold = false
-- Set score cell style
local matches_style = Args['matches_style'] or ''
team_code_ii = team_list[ii]
-- Get some default values in case it doesn't start at 1
local top_pos = tonumber(Args['highest_pos']) or 1
for jj=top_pos,N_teams do
-- Now for the actual result
team_code_jj = team_list[jj]
result = Args['match_'..team_code_ii..'_'..team_code_jj] or ''
if ii == jj or result == 'null' then
-- Solid cell
if ii==ii_show then cell_bold = true else cell_bold = false end
fw = cell_bold and 'font-weight: bold;' or 'font-weight: normal;'
bg = 'background-color:transparent;'
table.insert(tt,'| style="'..fw..bg..'" | —\n')
else
-- Content cell
-- Set bolding and background
if ii==ii_show or jj == ii_show then cell_bold = true else cell_bold = false end
fw = cell_bold and 'font-weight: bold;' or 'font-weight: normal;'
bg = 'background-color:transparent;'
-- Reformat dashes
if result ~= '' then
result = format_score(result)
end
-- Background coloring if enabled
if matches_style == 'FBR' and result ~= '' then
bg = 'background-color:' .. get_score_background(result) .. ';'
end
table.insert(tt,'| style="white-space:nowrap;'..fw..bg..'" |'..result..'\n')
end
end
return tt
end
return p