Module:WDL/sandbox

From blackwiki
< Module:WDL
Revision as of 19:15, 3 November 2019 by blackwiki>Wikiscio (Why are draws not counted in the win %? Changing the default to make them worth 50% of a win. Need to add some options later to support the previous default behavior of treating them as losses.)
Jump to navigation Jump to search

Documentation for this module may be created at Module:WDL/sandbox/doc

require('Module:No globals')

local getArgs = require('Module:Arguments').getArgs
local roundAndPad = require('Module:Math')._precision_format

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 '<span class="error" style="font-size:100%"><abbr title="GP not equal to W + D + L">error</abbr>' .. (category or '') .. '</span>'
	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 = '<span style="visibility:hidden;color:transparent;">0</span>'
	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 .. '<span style="visibility:hidden;color:transparent;">0</span>'
	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 '<span style="display:none">!</span>—'
		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 '<span style="display:none">!</span>—'
	else
		return displayWinPercent(frame, 100 * ((won or 0) + ((drawn or 0) / 2)) / 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 '[[Category:WDL error]]') .. '\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', args['for'] < args.against and '−' or '+', math.abs(args['for'] - args.against))
		else
			retval = retval .. tableprefix .. '<span style="display:none">!</span>—\n'
		end
	end
	return retval .. tableprefix .. pct(frame, args[1], args[2], args[3], args[4], args.decimals)
end

return p