Modulis:Sports rivalry series table

Dokumentācijas ikona Moduļa dokumentācija[izveidot]
-- 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, nonumber)
	-- create the header row
	local row = root:tag('tr')
	if(not nonumber) then
		row:tag('th'):wikitext('#')
	end
	row:tag('th'):wikitext('Datums')
	row:tag('th'):wikitext('Vieta')
	if(not compact) then
		row:tag('th'):attr('colspan', 2):wikitext(header1 or 'Uzvarētājs')
		row:tag('th'):attr('colspan', 2):wikitext(header2 or 'Zaudētājs')
		if(not series_summary) then
			row:tag('th'):wikitext('Sērija')
		end
	else
		row:tag('th'):wikitext(header1 or 'Uzvarētājs')
		row:tag('th'):wikitext('Rezultāts')
	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 no_number = isnotempty(args['no_number'])
	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, no_number)
		end
		-- start a new row
		row = root:tag('tr')
		row:css('vertical-align', 'top')
		-- Number
		if (not no_number) then row:tag('td'):wikitext(j) end
		-- 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
		shaderow = args['style' .. j]
		if( not compact ) then
			-- Team 1
			row:tag('td')
				:cssText(shaderow or shade1)
				:wikitext(small_rank(args[6*(j-1)+3]))
			-- Team 1 score
			row:tag('td')
				:cssText(shaderow or shade1)
				:wikitext(score1)
			-- Team 2
			row:tag('td')
				:cssText(shaderow or shade2)
				:wikitext(small_rank(args[6*(j-1)+5]))
			-- Team 2 score
			row:tag('td')
				:cssText(shaderow or 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')
					: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 = '\'\'\'Sērija:\'\'\' '
		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