Module:Ice hockey box
Usage
{{#invoke:Ice hockey box|box}}
For documentation, see Template:IceHockeybox.
Tracking categories
-- 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
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.