모듈:Ice hockey box

-- implements template:IceHockeybox
local p = {}
local errorcats = 
local function isnotempty(s)
	return s and s:match( '^%s*(.-)%s*$' ) ~= 
end
local function mysplit(s)
	-- Change  tags to slashes
	s = mw.ustring.gsub(s or , '*>', ' / ')
	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(sk) then
			table.insert(t, sk)
		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(ptk or , '^%s*(0-90-9*)^0-9^0-9*(0-90-9*)%s*$', '%1') or '-1') or -1
		local s2 = tonumber(mw.ustring.gsub(ptk or , '^%s*(0-90-9*)^0-9^0-9*(0-90-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 .. 
			errorcats = errorcats .. 'Error: Goals/Progression mismatch: S1 = ' .. s1 .. ' S2 = ' .. s2 .. ' GT1 = ' .. (gt1k or ) .. ' GT2 = ' .. (gt2k or ) .. 
		end
	end
	if not (#gt1 == #pt) or not(#gt2 == #pt) then
		errorcats = errorcats .. 
		errorcats = errorcats .. 'Error: Goals/Progression mismatch: N1 = ' .. #gt1 .. ' N2 = ' .. #gt2 .. ' PN = ' .. #pt .. 
	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(gt1k or )
		row:tag('td')
			:css('text-align','center')
			:css('width', '22%')
			:wikitext(ptk or )
		row:tag('td')
			:css('text-align','left')
			:css('width', '39%')
			:wikitext(gt2k or )
	end
	
	return tostring(root)
end
function p.box( frame )
	local args = frame:getParent().args
	local res = 
	local id = args'id' or 
	
	id = mw.ustring.gsub(id,'^"(.-)"$', '%1')
	
	local root = mw.html.create('table')
	root
		:attr('cellspacing', '0')
		:attr('id', id )
		:css('width', '100%')
		:css('background-color', args'bg' or '#eeeeee')
		: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  .. 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()
		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()
		cell:tag('i'):wikitext('관중 수:')
		cell:wikitext(' ' .. args'attendance')
	end
	res = res .. tostring(root)
	if isnotempty(args'score') then
		root = mw.html.create('table')
		root
			:addClass('collapsible collapsed')
			:attr('cellspacing', '0')
			:css('width', '100%')
			:css('background-color', args'bg' or '#eeeeee')
		cell = root:tag('tr'):tag('th')
		cell:attr('colspan', '5')
			:css('style', 'text-align', 'center')
			:css('font-size', '85%')
		if isnotempty(args'reference') then
			cell:tag('b'):wikitext( .. args'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('골키퍼')
		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('심판:')
				cell:wikitext( .. args'official' ..  .. args'official2')
			else
				cell:tag('i'):wikitext('심판:')
				cell:wikitext( .. args'official')
			end
		end
		if isnotempty(args'linesman') then
			cell:wikitext()
			if isnotempty(args'linesman2') then
				cell:tag('i'):wikitext('Linesmen:')
				cell:wikitext( .. args'linesman' ..  .. args'linesman2')
			else
				cell:tag('i'):wikitext('Linesman:')
				cell:wikitext( .. 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 ), )
			soshots2 = table.concat(mysplit(args'soshots2' or ), )
			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('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' .. ' 분')
		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('페널티')
		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' .. ' 분')
		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('슛')
		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)
	end
	if isnotempty(args'note') then
		root = mw.html.create('table')
		root
			:attr('cellspacing', '0')
			:css('width', '100%')
			:css('background-color', args'bg' or '#eeeeee')
		cell = root:tag('tr'):tag('td')
		cell
			:css('text-align', 'left')
			:css('font-size', '100%')
			:tag('i'):wikitext(args'note')
		res = res .. tostring(root) .. 
	end
	-- tracking
	if (args'sogoals1' or args'sogoals2') then
		errorcats = errorcats .. 
	end
	-- make errors visible in preview mode
	if errorcats ~=  then
		if frame:preprocess( "" ) == "" then
			errorcats =  .. errorcats .. 
		else
			errorcats =  .. errorcats .. 
		end
	end
	return errorcats .. res
end
return p