Module:NBA team standings
Appearance
-- this module implements [[Template:NBA team standings]]
local p = {}
local math_module = require("Module:Math")
local headings = {
["#"] = {"#", "#", "5"},
["W"] = {"W", "Games won", "5"},
["L"] = {"L", "Games lost", "5"},
["PCT"] = {"PCT", "Winning percentage", "5"},
["GB"] = {"GB", "Games behind", "7.5"},
["Home"] = {"Home", "Home record", "7.5"},
["Road"] = {"Road", "Road record", "7.5"},
["Div"] = {"Div", "Division record", "7.5"},
["GP"] = {"GP", "Games played", "7.5"}
}
local highlight = "#CCFFCC"
local splitcolor = "#CCCCCC"
local divleadermark = " *"
local function get_division(division)
if division then
division = division:sub(1,1):upper() .. division:sub(2,-1) -- ucfirst
return '[[' .. division .. ' Division (NBA)|' .. division .. ' Division]]'
else
return nil
end
end
local function get_conference(conference)
if conference then
conference = conference:sub(1,1):upper() .. conference:sub(2,-1) -- ucfirst
return '[[' .. conference .. 'ern Conference (NBA)|' .. conference .. 'ern Conference]]'
else
return nil
end
end
local function rnd(num, digits)
-- This function implements {{rnd}}
return math_module._precision_format(tostring(num), digits)
end
local function winpct(w, l)
local pct = '–'
if (w + l) > 0 then
pct = rnd(w / (w + l), 3):gsub('^0', '')
end
return pct
end
local function gbformat(hw, hl, rw, rl, hw1, hl1, rw1, rl1)
if (tonumber(hw1 or '0') == hw1 and tonumber(hl1 or '0') == hl1
and tonumber(rw1 or '0') == rw1 or tonumber(rl1 or '0') == rl1) then
local gb = ((hw1 - hl1 + rw1 - rl1) - (hw - hl + rw - rl))/2
if gb == 0 then
return '–'
end
return rnd(gb, 1)
end
return '–'
end
function p._division(args)
-- division name
local division = args['division']:lower()
-- division leader record
local dloffset = 8*((tonumber(args[division .. 'leader']) or 1) - 1)
local dlhw = tonumber(args[dloffset + 3])
local dlhl = tonumber(args[dloffset + 4])
local dlrw = tonumber(args[dloffset + 5])
local dlrl = tonumber(args[dloffset + 6])
-- start the table
local root = mw.html.create('table')
:addClass('wikitable')
:css('width', args['width'] or '500px')
:css('font-size', args['font-size'] or '95%')
:css('text-align', 'center')
-- table headings
local row = root:tag('tr')
row:tag('th'):wikitext(get_division(args['division']))
for k,v in ipairs({"W", "L", "PCT", "GB", "Home", "Road", "Div", "GP"}) do
local abbr, text, width = v, v, 0
if headings[v] then
abbr = headings[v][1] or abbr
text = headings[v][2] or abbr or text
width = tonumber(headings[v][3]) or width
if text ~= abbr then
text = '<abbr title="' .. text .. '">' .. abbr .. '</abbr>'
end
end
row:tag('th')
:css('width', (width > 0) and width .. '%' or nil)
:wikitext(text)
end
-- rows
local pos = 1
while args[(pos - 1)*8 + 1] or args[(pos - 1)*8 + 2] do
local offset = (pos - 1)*8
local team = args[offset + 1] or ''
local abbr = args[offset + 2] or ''
local hw = tonumber(args[offset + 3]) or 0
local hl = tonumber(args[offset + 4]) or 0
local rw = tonumber(args[offset + 5]) or 0
local rl = tonumber(args[offset + 6]) or 0
local wldiff = hw - hl + rw - rl
local divrecord = args[offset + 7] or ''
local divname = (args[offset + 8] or ''):lower()
if divname == division then
local rowcolor = nil
if abbr == args['team'] then
rowcolor = highlight
end
row = root:tag('tr'):css('background-color', rowcolor)
-- team name
row:tag('td'):css('text-align', 'left'):wikitext(team)
-- wins
row:tag('td'):wikitext(hw + rw)
-- losses
row:tag('td'):wikitext(hl + rl)
-- percentage
row:tag('td'):wikitext(winpct(hw + rw, hl + rl))
-- gb
row:tag('td'):wikitext(gbformat(hw, hl, rw, rl, dlhw, dlhl, dlrw, dlrl))
-- home record
row:tag('td'):wikitext(hw .. '‍–‍' .. hl)
-- road record
row:tag('td'):wikitext(rw .. '‍–‍' .. rl)
-- div record
row:tag('td'):wikitext(divrecord)
-- played
row:tag('td'):wikitext(hw + hl + rw + rl)
end
pos = pos + 1
end
return root
end
function p._conference(args)
-- conference leader
local cloffset = 0
local clhw = tonumber(args[cloffset + 3])
local clhl = tonumber(args[cloffset + 4])
local clrw = tonumber(args[cloffset + 5])
local clrl = tonumber(args[cloffset + 6])
-- start the table
local root = mw.html.create('table')
:addClass('wikitable')
:css('width', args['width'] or '400px')
:css('font-size', args['font-size'] or '95%')
:css('text-align', 'center')
-- title
root:tag('tr'):tag('th'):attr('colspan', 7):wikitext(get_conference(args['conference']))
-- headings
local row = root:tag('tr')
for k,v in ipairs({"#", "Team", "W", "L", "PCT", "GB", "GP"}) do
local abbr, text, width = v, v, 0
if headings[v] then
abbr = headings[v][1] or abbr
text = headings[v][2] or abbr or text
width = tonumber(headings[v][3]) or width
if text ~= abbr then
text = '<abbr title="' .. text .. '">' .. abbr .. '</abbr>'
end
end
row:tag('th')
:css('width', (width > 0) and width .. '%' or nil)
:wikitext(text)
end
-- rows
local pos = 1
local div1leader = tonumber(args[(args['div1name'] or ''):lower() .. 'leader'])
local div2leader = tonumber(args[(args['div2name'] or ''):lower() .. 'leader'])
local div3leader = tonumber(args[(args['div3name'] or ''):lower() .. 'leader'])
while args[(pos - 1)*8 + 1] or args[(pos - 1)*8 + 2] do
local offset = (pos - 1)*8
local team = args[offset + 1] or ''
local abbr = args[offset + 2] or ''
local hw = tonumber(args[offset + 3]) or 0
local hl = tonumber(args[offset + 4]) or 0
local rw = tonumber(args[offset + 5]) or 0
local rl = tonumber(args[offset + 6]) or 0
local wldiff = hw - hl + rw - rl
local divrecord = args[offset + 7] or ''
local divname = (args[offset + 8] or ''):lower()
if (pos == div1leader or pos == div2leader or pos == div3leader) then
team = team .. divleadermark
end
local rowcolor = nil
if abbr == args['team'] then
rowcolor = highlight
end
row = root:tag('tr'):css('background-color', rowcolor)
-- position
row:tag('th'):wikitext(pos)
-- team name
row:tag('td'):css('text-align', 'left'):wikitext(team)
-- wins
row:tag('td'):wikitext(hw + rw)
-- losses
row:tag('td'):wikitext(hl + rl)
-- percentage
row:tag('td'):wikitext(winpct(hw + rw, hl + rl))
-- gb
row:tag('td'):wikitext(gbformat(hw, hl, rw, rl, clhw, clhl, clrw, clrl))
-- played
row:tag('td'):wikitext(hw + hl + rw + rl)
if args['split' .. pos] then
root:tag('tr'):css('background-color', splitcolor):tag('td'):attr('colspan', 7)
end
pos = pos + 1
end
return root
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
if args['division'] then
return p._division(args)
else
return p._conference(args)
end
end
return p