Module:Sports rivalry series table
Documentation for this module may be created at Module:Sports rivalry series table/doc
-- This module implements {{sports rivalry series table}} local p = {} local root = nil local lang =mw.getContentLanguage() local function formatnumR(num) num = mw.ustring.gsub(num, '^[^%d]*([%d,%.]-)[^%d]*$', '%1') return lang:parseFormattedNumber(num) end local function isnotempty(s) return s and s:match( '^%s*(.-)%s*$' ) ~= '' end local function addheader(header1, header2, series_summary, compact) -- create the header row local row = root:tag('tr') row:tag('th'):wikitext('#') row:tag('th'):wikitext('Date') row:tag('th'):wikitext('Location') if(not compact) then row:tag('th'):attr('colspan', 2):wikitext(header1 or 'Winning team') row:tag('th'):attr('colspan', 2):wikitext(header2 or 'Losing team') if(not series_summary) then row:tag('th'):wikitext('Series') end else row:tag('th'):wikitext(header1 or 'Winner') row:tag('th'):wikitext('Score') end end local function series_text(team1name, team1wins, team2name, team2wins, ties, leads) local res = '' local t1 = mw.ustring.gsub(team1name, '%s*/.*', '') local t2 = mw.ustring.gsub(team2name, '%s*/.*', '') if (team1wins > team2wins) then res = t1 .. ' ' .. (leads and 'leads ' or '') .. team1wins .. '–' .. team2wins .. ( (ties > 0) and '–' .. ties or '') elseif (team2wins > team1wins) then res = t2 .. ' ' .. (leads and 'leads ' or '') .. team2wins .. '–' .. team1wins .. ( (ties > 0) and '–' .. ties or '') else res = 'Tied ' .. team1wins .. '–' .. team2wins .. ( (ties > 0) and '–' .. ties or '') end return res end local function small_rank(team) team = mw.ustring.gsub(team or '', '(%(.-%))', '<small style="font-size:85%; font-weight:normal;">%1</small>') return team end local function get_name(team) team = mw.text.trim(team or '') team = mw.ustring.gsub(team, '^[^A-Za-z%.]*(.-)[^A-Za-z%.]*$', '%1') return team end local function ismultiequal(s1, s2) for k1, a1 in pairs( mw.text.split(s1, '[%s]/[%s]') ) do for k2, a2 in pairs( mw.text.split(s2, '[%s]/[%s]') ) do if a1 == a2 then return 1 end end end return nil end function p.table(frame) local args = (frame.args[3] ~= nil) and frame.args or frame:getParent().args local compact = (args['format'] or ''):lower() == 'compact' local team1style = args['team1style'] or '' local team1name = mw.text.trim(args['team1'] or '') local team2style = args['team2style'] or '' local team2name = mw.text.trim(args['team2'] or '') local team1wins = tonumber(args['team1win_start']) or 0 local team2wins = tonumber(args['team2win_start']) or 0 local ties = tonumber(args['tie_start']) or 0 local series_summary = isnotempty(args['series_summary']) local legend = (args['legend'] and args['legend'] ~= 'no') or (args['legend'] == nil) local cols = tonumber(args['cols'] or '') or 0 local res = '' if (cols < 1 ) then cols = 1 end -- compute the maximum cell index local cellcount = 0 for k, v in pairs( args ) do if type( k ) == 'number' then cellcount = math.max(cellcount, k) end end -- compute the number of rows local rows = math.ceil(cellcount / 6) -- compute the number of rows per column local totalrows = rows if (series_summary ) then totalrows = totalrows + 1 end if (isnotempty(args['note'])) then totalrows = totalrows + 1 end local percol = math.ceil( totalrows / cols ) -- generate the legend if( legend ) then local legendtable = mw.html.create('table') local col3 = args['legend_tie_text'] or 'Tie games' col3 = isnotempty(col3) and col3 or nil legendtable :addClass('wikitable') :css('text-align', 'center') :css('font-size', '90%') :css('white-space', 'nowrap') :cssText(args['style']) local lrow = legendtable:tag('tr') local t1 = mw.ustring.gsub(team1name, '%s*/.*', '') local t2 = mw.ustring.gsub(team2name, '%s*/.*', '') lrow:tag('td') :cssText(team1style) :css('font-weight', 'bold') :css('width', col3 and '34%' or '50%') :wikitext(t1 .. ' victories') lrow:tag('td') :cssText(team2style) :css('font-weight', 'bold') :css('width', col3 and '34%' or '50%') :wikitext(t2 .. ' victories') if( col3 ) then lrow:tag('td') :css('width', '32%') :wikitext(col3) end res = res .. tostring(legendtable) end -- build the table content for j=1,rows do if(math.fmod(j - 1, percol) == 0 ) then -- create the root table res = res .. (root and tostring(root) or '') root = mw.html.create('table') root:addClass('wikitable') root:css('text-align', 'center') :css('font-size', '90%') root:cssText(args['style']) if(cols > 1) then root:css('float', 'left') root:css('margin-right', '1em') end addheader(args['header1'], args['header2'], series_summary, compact) end -- start a new row row = root:tag('tr') row:css('vertical-align', 'top') -- Number row:tag('td'):wikitext(j) -- Date row:tag('td'):wikitext(args[6*(j-1)+1] or '') -- Location row:tag('td'):wikitext(args[6*(j-1)+2] or '') -- Team1 / Team2 / Score1 / Score2 local team1 = get_name(args[6*(j-1)+3]) local score1 = mw.ustring.gsub(args[6*(j-1)+4] or '', '^%s*(.-)%s*$', '%1') local team2 = get_name(args[6*(j-1)+5]) local score2 = mw.ustring.gsub(args[6*(j-1)+6] or '', '^%s*(.-)%s*$', '%1') local shade1 = nil local shade2 = nil local win = mw.ustring.gsub(args['win' .. j] or '', '^%s*(.-)%s*$', '%1') or '' if( isnotempty(win) or (score1 ~= '' and score2 ~= '') ) then local score1num = tonumber(formatnumR(score1)) or 0 local score2num = tonumber(formatnumR(score2)) or 0 if( isnotempty(win) ) then score1num = -1 score2num = -1 end if ( (win == team1) or (score1num > score2num) ) then if( ismultiequal(team1, team1name) ) then shade1 = 'font-weight:bold;' .. team1style team1wins = team1wins + 1 elseif ( ismultiequal(team1, team2name) ) then shade1 = 'font-weight:bold;' .. team2style team2wins = team2wins + 1 end elseif ( (win == team2) or (score2num > score1num) ) then if( ismultiequal(team2, team1name) ) then shade2 = 'font-weight:bold;' .. team1style team1wins = team1wins + 1 elseif ( ismultiequal(team2, team2name) ) then shade2 = 'font-weight:bold;' .. team2style team2wins = team2wins + 1 end elseif ( (win == 'tie') or (not isnotempty(win) ) ) then ties = ties + 1 end end if( not compact ) then -- Team 1 row:tag('td') :cssText(shade1) :wikitext(small_rank(args[6*(j-1)+3])) -- Team 1 score row:tag('td') :cssText(shade1) :wikitext(score1) -- Team 2 row:tag('td') :cssText(shade2) :wikitext(small_rank(args[6*(j-1)+5])) -- Team 2 score row:tag('td') :cssText(shade2) :wikitext(score2) -- Series if(not series_summary) then local seriescell = row:tag('td') if( score1 ~= '' and score2 ~= '') then seriescell:wikitext(series_text(team1name, team1wins, team2name, team2wins, ties, nil)) end end else if( isnotempty(win) or (score1 ~= '' and score2 ~= '') ) then local score1num = tonumber(formatnumR(score1)) or 0 local score2num = tonumber(formatnumR(score2)) or 0 if(score1num > score2num) then -- Winner row:tag('td') :cssText(shade1) :wikitext(small_rank(args[6*(j-1)+3])) -- Score row:tag('td') :wikitext(score1 .. '–' .. score2) elseif(score2num > score1num) then -- Winner row:tag('td') :cssText(shade2) :wikitext(small_rank(args[6*(j-1)+5])) -- Score row:tag('td') :cssText(shade2) :wikitext(score2 .. '–' .. score1) else -- Winner row:tag('td') :wikitext('Tie') -- Score row:tag('td') :wikitext(score1 .. '–' .. score2) end end end end if( series_summary and root) then local ftext = '\'\'\'Series:\'\'\' ' local ftext = ftext .. series_text(team1name, team1wins, team2name, team2wins, ties, 1) if(args['footnote']) then ftext = ftext .. args['footnote'] end row = root:tag('tr') row:tag('td') :attr('colspan', 7) :css('background-color', '#f0f0f0') :wikitext(ftext) end if(isnotempty(args['note']) and root) then row = root:tag('tr') row:tag('td') :attr('colspan', 8) :wikitext(args['note']) end res = res .. (root and tostring(root) or '') if (cols > 1 ) then res = res .. tostring(mw.html.create('br'):attr('clear', 'left')) end -- return the root table return res end return p