Mô đun: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(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('Bàn thắng')
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 ..
errorcats = errorcats .. 'Lỗi: Bàn thắng/Progression không khớp: S1 = ' .. s1 .. ' S2 = ' .. s2 .. ' GT1 = ' .. (gt1[k] or ) .. ' GT2 = ' .. (gt2[k] or ) ..
end
end
if not (gt1 pt) or not(gt2 pt) then
errorcats = errorcats ..
errorcats = errorcats .. 'Lỗi: Bàn thắng/Progression không khớp: 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(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

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('Số khán giả:')
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'] .. ' Nguồn]')
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('Thủ môn')
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('Trọng tài:')
cell:wikitext( .. args['official'] .. .. args['official2'])
else
cell:tag('i'):wikitext('Trọng tài:')
cell:wikitext( .. args['official'])
end
end
if isnotempty(args['linesman']) then
cell:wikitext()
if isnotempty(args['linesman2']) then
cell:tag('i'):wikitext('Trọng tài biên:')
cell:wikitext( .. args['linesman'] .. .. args['linesman2'])
else
cell:tag('i'):wikitext('Trọng tài biên:')
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('Luân lưu')
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'] .. ' phút')
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('Số phút bị phạt')
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'] .. ' phút')
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('Số cú đánh')
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