Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Ice hockey box

Permanently protected module
From Wikipedia, the free encyclopedia

-- implements [[template:IceHockeybox]]
local p = {}

local errorcats = ''

local function isnotempty(s)
	return s and s:match( '^%s*(.-)%s*$' ) ~= ''
end

local function makelink(s,t)
	if s:match('^[Hh][Tt][Tt][Pp][Ss]?:[^ ]*$') then
		return '[' .. s .. ' ' .. t .. ']'
	end
	return s
end

local function mysplit(s)
	-- Change <br> tags to slashes
	s = mw.ustring.gsub(s or '', '<[\/%s]*[Bb][Rr][^<>]*>', ' / ')
	s = mw.ustring.gsub(s or '', '[%s]* /[%s]*', ' / ')
	s = mw.ustring.gsub(s or '', '[%s]*/ [%s]*', ' / ')
	-- Split into a table
	s = mw.text.split(s .. ' / ', ' / ')
	-- Remove empty rows
	local t = {}
	for k=1,#s do
		if isnotempty(s[k]) then
			table.insert(t, s[k])
		end
	end
	return t
end

local function scoringtable(g1, g2, p)
	local root = ''
	-- If there is no progression then do a very simple format
	if (not isnotempty(p)) and (isnotempty(g1) or isnotempty(g2)) then
		root = mw.html.create('table')
			root
				:attr('cellspacing', '0')
				:css('width', '100%')
		local row = root:tag('tr'):css('text-align','top')
		row:tag('td')
			:css('text-align','right')
			:css('width', '39%')
			:wikitext(g1 or '')
		row:tag('td')
			:css('text-align','center')
			:css('width', '22%')
			:tag('i'):wikitext('Goals')
		row:tag('td')
			:css('text-align','left')
			:css('width', '39%')
			:wikitext(g2 or '')
		return tostring(root)
	end
	
	-- Split into tables
	local gt1 = mysplit(g1)
	local gt2 = mysplit(g2)
	local pt  = mysplit(p)
	-- Align goals with scores in progression
	local score1, score2 = 0, 0
	for k = 1,#pt do
		local s1 = tonumber(mw.ustring.gsub(pt[k] or '', '^[%s]*([0-9][0-9]*)[^0-9][^0-9]*([0-9][0-9]*)[%s]*$', '%1') or '-1') or -1
		local s2 = tonumber(mw.ustring.gsub(pt[k] or '', '^[%s]*([0-9][0-9]*)[^0-9][^0-9]*([0-9][0-9]*)[%s]*$', '%2') or '-1') or -1
		if s1 == (score1 + 1) and s2 == score2 then
			score1 = s1
			table.insert(gt2, k, '')
		elseif s2 == (score2 + 1) and s1 == score1 then
			score2 = s2
			table.insert(gt1, k, '')
		else
			errorcats = errorcats .. '[[Category:Pages using icehockeybox with improperly formatted progression or goals]]'
			errorcats = errorcats .. 'Error: Goals/Progression mismatch: S1 = ' .. s1 .. ' S2 = ' .. s2 .. ' GT1 = ' .. (gt1[k] or '') .. ' GT2 = ' .. (gt2[k] or '') .. '<br>'
		end
	end
	if not (#gt1 == #pt) or not(#gt2 == #pt) then
		errorcats = errorcats .. '[[Category:Pages using icehockeybox with improperly formatted progression or goals]]'
		errorcats = errorcats .. 'Error: Goals/Progression mismatch: N1 = ' .. #gt1 .. ' N2 = ' .. #gt2 .. ' PN = ' .. #pt .. '<br>'
	end
	-- Now build the score table
	for k=1,#pt do
		if k == 1 then
			root = mw.html.create('table')
			root
				:attr('cellspacing', '0')
				:css('width', '100%')
		end
		local row = root:tag('tr'):css('text-align','top')
		row:tag('td')
			:css('text-align','right')
			:css('width', '39%')
			:wikitext(gt1[k] or '')
		row:tag('td')
			:css('text-align','center')
			:css('width', '22%')
			:wikitext(pt[k] or '')
		row:tag('td')
			:css('text-align','left')
			:css('width', '39%')
			:wikitext(gt2[k] or '')
	end
	
	return tostring(root)
end

function p.box( frame )
	local args = frame:getParent().args
	local res = ''
	local id = args['id'] or ''
	local bgcolor = args['bg'] or '#eeeeee'
	
	id = mw.ustring.gsub(id,'^"(.-)"$', '%1')
	
	local root = mw.html.create('table')
	if bgcolor ~= '' then
	    root:css('background-color', bgcolor)
	end
	root
		:attr('cellspacing', '0')
		:attr('id', id )
		:css('width', '100%')
		:addClass('vevent')
	local row = root:tag('tr'):addClass('summary')
	-- Date and time
	local cell = row:tag('td')
		:css('width', '15%')
		:css('text-align', 'center')
		:css('font-size', '85%')
	cell:wikitext(args['date'] or '')
	cell:wikitext(isnotempty(args['time']) and '<br>' .. args['time'] or '')
	-- Team 1
	cell = row:tag('td')
		:css('width', '25%')
		:css('text-align', 'right')
		:addClass('vcard attendee')
	cell:tag('span'):addClass('fn org'):wikitext(args['team1'] or '')
	-- Score
	cell = row:tag('td')
		:css('width', '15%')
		:css('text-align', 'center')
	if isnotempty(args['score']) then
		cell:tag('b'):wikitext(args['score'])
	else
		cell:tag('abbr'):attr('title', 'versus'):css('text-decoration', 'none'):wikitext('v')	
	end
	if isnotempty(args['periods']) then
		cell:wikitext('<br>')
		cell:tag('small'):wikitext(args['periods'])
	end
	-- Team 2
	cell = row:tag('td')
		:css('width', '25%')
		:css('text-align', 'left')
		:addClass('vcard attendee')
	cell:tag('span'):addClass('fn org'):wikitext(args['team2'] or '')
	-- Stadium and attendance
	cell = row:tag('td')
		:css('font-size', '85%')
	if isnotempty(args['stadium']) then
		cell:tag('span'):addClass('location'):wikitext(args['stadium'])
	end
	if isnotempty(args['attendance']) then
		cell:wikitext('<br>')
		cell:tag('i'):wikitext('Attendance:')
		cell:wikitext(' ' .. args['attendance'])
	end
	res = res .. tostring(root)

	local hassubtable = 
		isnotempty(args['goalie1']) or 
		isnotempty(args['goalie2']) or
		isnotempty(args['official']) or
		isnotempty(args['linesman']) or
		isnotempty(args['goals1']) or 
		isnotempty(args['goals2']) or
		isnotempty(args['progression']) or
		isnotempty(args['pnote']) or
		isnotempty(args['soshots1']) or
		isnotempty(args['soshots2']) or
		isnotempty(args['sonote']) or
		isnotempty(args['otgoals1']) or
		isnotempty(args['otgoals2']) or 
		isnotempty(args['otprogression']) or
		isnotempty(args['otnote']) or
		isnotempty(args['penalties1']) or
		isnotempty(args['penalties2']) or
		isnotempty(args['shots1']) or
		isnotempty(args['shot2'])
	if isnotempty(args['score']) and hassubtable then
		root = mw.html.create('table')
		if bgcolor ~= '' then
		    root:css('background-color', bgcolor)
		end
		root
			:addClass('mw-collapsible mw-collapsed')
			:attr('cellspacing', '0')
			:css('width', '100%')
		cell = root:tag('tr'):tag('th')
		cell:attr('colspan', '5')
			:css('text-align', 'center')
			:css('font-size', '85%')
		if isnotempty(args['reference']) then
			cell:wikitext(makelink(args['reference'], 'Game reference'))
		end
		-- Empty spacing
		row = root:tag('tr'):css('font-size', '85%')
		cell = row:tag('td')
			:attr('rowspan', '7')
			:css('width', '15%')
			:css('vertical-align', 'top')

		-- Goalies
		cell = row:tag('td')
			:css('width', '25%')
			:css('vertical-align', 'top')
			:css('text-align', 'right')
			:wikitext(args['goalie1'] or '')
		cell = row:tag('td')
			:css('width', '15%')
			:css('vertical-align', 'top')
			:css('text-align', 'center')
		if isnotempty(args['goalie1']) or isnotempty(args['goalie2']) then
			cell:tag('i'):wikitext('Goalies')
		end
		cell = row:tag('td')
			:css('width', '25%')
			:css('vertical-align', 'top')
			:css('text-align', 'left')
			:wikitext(args['goalie2'] or '')

		-- Officials and linesmen
		cell = row:tag('td')
			:attr('rowspan', '7')
			:css('vertical-align', 'top')
		if isnotempty(args['official']) then
			if isnotempty(args['official2']) then
				cell:tag('i'):wikitext('Referees:')
				cell:wikitext('<br>' .. args['official'] .. '<br>' .. args['official2'])
			else
				cell:tag('i'):wikitext('Referee:')
				cell:wikitext('<br>' .. args['official'])
			end
		end
		if isnotempty(args['linesman']) then
			cell:wikitext('<br>')
			if isnotempty(args['linesman2']) then
				cell:tag('i'):wikitext('Linesmen:')
				cell:wikitext('<br>' .. args['linesman'] .. '<br>' .. args['linesman2'])
			else
				cell:tag('i'):wikitext('Linesman:')
				cell:wikitext('<br>' .. args['linesman'])
			end
		end
		-- Goals and progression
		row = root:tag('tr'):css('font-size', '85%')
		cell = row:tag('td')
			:attr('colspan', '3')
			:css('width', '65%')
			:wikitext(
				scoringtable(args['goals1'] or '', 
							args['goals2'] or '',
							args['progression'] or '')
					)
		if isnotempty(args['pnote']) then
			row = root:tag('tr'):css('font-size', '85%')
			row:tag('td')
				:attr('colspan', '3')
				:css('text-align','center')
				:css('width', '65%')
				:wikitext(args['pnote'])
		end
		-- Shoot out
		if isnotempty(args['soshots1']) or isnotempty(args['soshots2']) then
			soshots1 = table.concat(mysplit(args['soshots1'] or ''), '<br>')
			soshots2 = table.concat(mysplit(args['soshots2'] or ''), '<br>')
			row = root:tag('tr'):css('font-size', '85%')
			row:tag('td')
				:css('width', '25%')
				:css('vertical-align', 'top')
				:css('text-align', 'right')
				:wikitext(soshots1 or '')
			row:tag('td')
				:css('width', '15%')
				:css('vertical-align', 'top')
				:css('text-align', 'center')
				:tag('i'):wikitext('[[Overtime (ice hockey)#Shootout|Shootout]]')
			row:tag('td')
				:css('width', '25%')
				:css('vertical-align', 'top')
				:css('text-align', 'left')
				:wikitext(soshots2 or '')
		end
		if isnotempty(args['sonote']) then
			row = root:tag('tr'):css('font-size', '85%')
			row:tag('td')
				:attr('colspan', '3')
				:css('text-align', 'center')
				:css('width', '65%')
				:wikitext(args['sonote'])
		end
		-- Second leg overtime
		if isnotempty(args['otgoals1']) or isnotempty(args['otgoals2']) 
						or isnotempty(args['otprogression']) then
			row = root:tag('tr'):css('font-size', '85%')
			cell = row:tag('td')
				:attr('colspan', '3')
				:css('width', '65%')
				:wikitext(
					scoringtable(args['otgoals1'] or '', 
							args['otgoals2'] or '',
							args['otprogression'] or '')
					)
		end
		if isnotempty(args['otnote']) then
			row = root:tag('tr'):css('font-size', '85%')
			row:tag('td')
				:attr('colspan', '3')
				:css('text-align','center')
				:css('width', '65%')
				:wikitext(args['otnote'])
		end
		-- Penalties
		row = root:tag('tr'):css('font-size', '85%')
		cell = row:tag('td')
			:css('width', '25%')
			:css('vertical-align', 'top')
			:css('text-align', 'right')
		if isnotempty(args['penalties1']) then
			cell:tag('i'):wikitext(args['penalties1'] .. ' min')
		end
		cell = row:tag('td')
			:css('width', '15%')
			:css('vertical-align', 'top')
			:css('text-align', 'center')
		if isnotempty(args['penalties1']) or isnotempty(args['penalties2']) then
			cell:tag('i'):wikitext('Penalties')
		end
		cell = row:tag('td')
			:css('width', '25%')
			:css('vertical-align', 'top')
			:css('text-align', 'left')
		if isnotempty(args['penalties2']) then
			cell:tag('i'):wikitext(args['penalties2'] .. ' min')
		end
		-- Shots
		row = root:tag('tr'):css('font-size', '85%')
		cell = row:tag('td')
			:css('width', '25%')
			:css('vertical-align', 'top')
			:css('text-align', 'right')
		if isnotempty(args['shots1']) then
			cell:tag('i'):wikitext(args['shots1'])
		end
		cell = row:tag('td')
			:css('width', '15%')
			:css('vertical-align', 'top')
			:css('text-align', 'center')
		if isnotempty(args['shots1']) or isnotempty(args['shots2']) then
			cell:tag('i'):wikitext('Shots')
		end
		cell = row:tag('td')
			:css('width', '25%')
			:css('vertical-align', 'top')
			:css('text-align', 'left')
		if isnotempty(args['shots2']) then
			cell:tag('i'):wikitext(args['shots2'])
		end
		res = res .. tostring(root)
	elseif isnotempty(args['reference']) then
		root = mw.html.create('table')
		if bgcolor ~= '' then
		    root:css('background-color', bgcolor)
		end
		root
			:attr('cellspacing', '0')
			:css('width', '100%')
		cell = root:tag('tr'):tag('th')
		cell:attr('colspan', '5')
			:css('text-align', 'center')
			:css('font-size', '85%')
			:css('padding-right', '4em')
		cell:wikitext(makelink(args['reference'], 'Game reference'))
		res = res .. tostring(root)
	end

	if isnotempty(args['note']) then
		root = mw.html.create('table')
		if bgcolor ~= '' then
		    root:css('background-color', bgcolor)
		end
		root
			:attr('cellspacing', '0')
			:css('width', '100%')
		cell = root:tag('tr'):tag('td')
		cell
			:css('text-align', 'left')
			:css('font-size', '100%')
			:tag('i'):wikitext(args['note'])
		res = res .. tostring(root) .. '[[Category:Pages using icehockeybox with the note parameter]]'
	end
	-- tracking
	if (args['sogoals1'] or args['sogoals2']) then
		errorcats = errorcats .. '[[Category:Pages using icehockeybox with improperly formatted progression or goals| ]]'
	end
	-- make errors visible in preview mode
	if errorcats ~= '' then
		if frame:preprocess( "{{REVISIONID}}" ) == "" then
			errorcats = '<span class="error">' .. errorcats .. '</span>'
		else
			errorcats = '<span style="display:none">' .. errorcats .. '</span>'
		end
	end
	return errorcats .. res
end

return p