Module:Ice hockey box/sandbox explained

-- implements 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 send

local function mysplit(s) -- Change
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 tend

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]+)[%s]*$', '%1') or '-1') or -1 local s2 = tonumber(mw.ustring.gsub(pt[k] or , '^[%s]*([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 .. 'Error: Goals/Progression mismatch: 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 .. '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(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('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') root :addClass('mw-collapsible mw-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('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('
' .. args['official'] .. '
' .. args['official2']) else cell:tag('i'):wikitext('Referee:') 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'] .. ' 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') root :attr('cellspacing', '0') :css('width', '100%') :css('background-color', args['bg'] or '#eeeeee') 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') 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 .. resend

return p