Module:WDL

From RabastorWiki
Jump to navigation Jump to search

require('Module:No globals')

local getArgs = require('Module:Arguments').getArgs local roundAndPad = require('Module:Decimals')._main

local p = {}

local function total(frame, played, won, drawn, lost, category) if played == '-' or played == '—' then return '—' elseif not played then if not won and not drawn and not lost then return end return frame:expandTemplate{title = 'Number table sorting', args = { (won or 0) + (drawn or 0) + (lost or 0) }} elseif tonumber(played) ~= (won or 0) + (drawn or 0) + (lost or 0) then return 'error' .. (category or ) .. '' else return frame:expandTemplate{title = 'Number table sorting', args = { played }} end end

local function displayWinPercent(frame, winPercent, decimals) local retval = if winPercent < 10 then retval = '0' end retval = retval .. frame:expandTemplate{title = 'Number table sorting', args = { roundAndPad(winPercent, decimals or 2) }} if winPercent >= 100 then -- XXX: Should >= be ==? This should never be over 100, but that's what the original template had return retval .. '0' else return retval end end

local function pct(frame, played, won, drawn, lost, decimals) if played == '-' or played == '—' then return '—' elseif not played then if not won and not drawn and not lost then return elseif (won or 0) + (drawn or 0) + (lost or 0) <= 0 then return '!—' end return displayWinPercent(frame, 100 * (won or 1) / ((won or 1) + (drawn or 0) + (lost or 0)), decimals) -- XXX: Why is 1 used in the numerator instead of 0 if won isn't set? It's not like that in the case where played is set. It makes sense in the denominator to avoid a divide by zero elseif tonumber(played) <= 0 then return '!—' else return displayWinPercent(frame, 100 * (won or 0) / played, decimals) end end

function p.main(frame) local args = getArgs(frame) local tableprefix = string.format('| style="%stext-align:%s" |', args.total and 'font-weight:bold;background:#efefef;' or , args.align or 'center') local retval = tableprefix .. total(frame, args[1], args[2], args[3], args[4], args.demospace and or ) .. '\n' retval = retval .. tableprefix .. frame:expandTemplate{title = 'Number table sorting', args = { args[2] }} .. '\n' retval = retval .. tableprefix .. frame:expandTemplate{title = 'Number table sorting', args = { args[3] }} .. '\n' retval = retval .. tableprefix .. frame:expandTemplate{title = 'Number table sorting', args = { args[4] }} .. '\n' if args['for'] then retval = retval .. tableprefix .. frame:expandTemplate{title = 'Number table sorting', args = { args['for'] }} .. '\n' end if args.against then retval = retval .. tableprefix .. frame:expandTemplate{title = 'Number table sorting', args = { args.against }} .. '\n' end if args.diff == 'yes' then if tonumber(args['for']) and tonumber(args.against) then retval = retval .. tableprefix .. string.format('%s%d\n', tonumber(args['for']) < tonumber(args.against) and '−' or '+', math.abs(args['for'] - args.against)) else retval = retval .. tableprefix .. '!—\n' end end return retval .. tableprefix .. pct(frame, args[1], args[2], args[3], args[4], args.decimals) end

return p