<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ANLLDivisionStanding</id>
	<title>Module:NLLDivisionStanding - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ANLLDivisionStanding"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:NLLDivisionStanding&amp;action=history"/>
	<updated>2026-06-22T06:30:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:NLLDivisionStanding&amp;diff=478748&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:NLLDivisionStanding&amp;diff=478748&amp;oldid=prev"/>
		<updated>2021-07-16T05:02:31Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module implements {{NLLDivisionStanding}}.&lt;br /&gt;
&lt;br /&gt;
local yesno = require('Module:Yesno')&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function abbr(shortForm, longForm)&lt;br /&gt;
	return tostring(mw.html.create('abbr')&lt;br /&gt;
		:attr('title', longForm)&lt;br /&gt;
		:wikitext(shortForm)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Team class&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Team = {}&lt;br /&gt;
Team.__index = Team&lt;br /&gt;
&lt;br /&gt;
Team.stringFields = {&lt;br /&gt;
	'name',&lt;br /&gt;
	'link',&lt;br /&gt;
	'short',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Team.numberFields = {&lt;br /&gt;
	'pos',&lt;br /&gt;
	'clinch_playoff',&lt;br /&gt;
	'clinch_division',&lt;br /&gt;
	'clinch_best_record',&lt;br /&gt;
	'ga',&lt;br /&gt;
	'gf',&lt;br /&gt;
	'home_loss',&lt;br /&gt;
	'home_win',&lt;br /&gt;
	'road_loss',&lt;br /&gt;
	'road_win',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Team.new(options)&lt;br /&gt;
	options = options or {}&lt;br /&gt;
	local self = setmetatable({}, Team)&lt;br /&gt;
	for i, field in ipairs(Team.stringFields) do&lt;br /&gt;
		self[field] = options[field]&lt;br /&gt;
	end&lt;br /&gt;
	for i, field in ipairs(Team.numberFields) do&lt;br /&gt;
		self[field] = tonumber(options[field])&lt;br /&gt;
	end&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getPosition()&lt;br /&gt;
	return tostring(self.pos) or '--'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getShortName()&lt;br /&gt;
	return self.short&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getName()&lt;br /&gt;
	return self.name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getLink()&lt;br /&gt;
	local name = self:getName()&lt;br /&gt;
	local link = self.link&lt;br /&gt;
	if link and name then&lt;br /&gt;
		return string.format('[[%s|%s]]', link, name)&lt;br /&gt;
	elseif link then&lt;br /&gt;
		return string.format('[[%s]]', link)&lt;br /&gt;
	else&lt;br /&gt;
		return name&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:makeDisplayName()&lt;br /&gt;
	local ret = self:getLink()&lt;br /&gt;
	if not ret then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local clinches = {}&lt;br /&gt;
	-- The numerical syntax here is a hangover from the wikitext template&lt;br /&gt;
	-- which used #expr hacks to calculate the number of clinches&lt;br /&gt;
	if self.clinch_playoff == 1 then&lt;br /&gt;
		table.insert(clinches, 'x')&lt;br /&gt;
	end&lt;br /&gt;
	if self.clinch_playoff == 2 then&lt;br /&gt;
		table.insert(clinches, 'c')&lt;br /&gt;
	end&lt;br /&gt;
	if self.clinch_division == 1 then&lt;br /&gt;
		table.insert(clinches, 'y')&lt;br /&gt;
	end&lt;br /&gt;
	if self.clinch_best_record == 1 then&lt;br /&gt;
		table.insert(clinches, 'z')&lt;br /&gt;
	end&lt;br /&gt;
	if clinches[1] then&lt;br /&gt;
		ret = string.format(&amp;quot;%s &amp;amp;ndash; '''%s'''&amp;quot;, ret, table.concat(clinches))&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getHomeWins()&lt;br /&gt;
	return self.home_win or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getHomeLosses()&lt;br /&gt;
	return self.home_loss or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getRoadWins()&lt;br /&gt;
	return self.road_win or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getRoadLosses()&lt;br /&gt;
	return self.road_loss or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getGamesPlayed()&lt;br /&gt;
	return self:getHomeWins() +&lt;br /&gt;
		self:getRoadWins() +&lt;br /&gt;
		self:getHomeLosses() +&lt;br /&gt;
		self:getRoadLosses()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getWins()&lt;br /&gt;
	return self:getHomeWins() + self:getRoadWins()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getLosses()&lt;br /&gt;
	return self:getHomeLosses() + self:getRoadLosses()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:_divideByGamesPlayed(val)&lt;br /&gt;
	local gp = self:getGamesPlayed()&lt;br /&gt;
	if gp &amp;gt; 0 then -- avoid divide-by-zero error&lt;br /&gt;
		return val / gp&lt;br /&gt;
	else&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getWinPercentage()&lt;br /&gt;
	local percent = self:_divideByGamesPlayed(self:getWins())&lt;br /&gt;
	if percent &amp;gt; 1 then&lt;br /&gt;
		percent = 1&lt;br /&gt;
	elseif percent &amp;lt; 0 then&lt;br /&gt;
		percent = 0&lt;br /&gt;
	end&lt;br /&gt;
	local ret = string.format('%.3f', percent)&lt;br /&gt;
	if ret:sub(1, 1) == '0' then&lt;br /&gt;
		-- Use strings like .123 instead of 0.123 as that is how it's done&lt;br /&gt;
		-- in sports publications&lt;br /&gt;
		ret = ret:sub(2, -1)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getGamesBack(teamInFirst)&lt;br /&gt;
	local tifDiff = teamInFirst:getWins() - teamInFirst:getLosses()&lt;br /&gt;
	local selfDiff = self:getWins() - self:getLosses()&lt;br /&gt;
	return string.format('%.1f', (tifDiff - selfDiff) / 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getHomeRecord()&lt;br /&gt;
	return self:getHomeWins() .. '&amp;amp;ndash;' .. self:getHomeLosses()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getRoadRecord()&lt;br /&gt;
	return self:getRoadWins() .. '&amp;amp;ndash;' .. self:getRoadLosses()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getGoalsScored()&lt;br /&gt;
	return self.gf or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getGoalsAllowed()&lt;br /&gt;
	return self.ga or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getDifferential()&lt;br /&gt;
	local diff = self:getGoalsScored() - self:getGoalsAllowed()&lt;br /&gt;
	if diff &amp;gt; 0 then&lt;br /&gt;
		return '+' .. tostring(diff)&lt;br /&gt;
	else&lt;br /&gt;
		return tostring(diff)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getGameScoredAverage()&lt;br /&gt;
	local avg = self:_divideByGamesPlayed(self:getGoalsScored())&lt;br /&gt;
	return string.format('%.2f', avg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Team:getGameAllowedAverage()&lt;br /&gt;
	local avg = self:_divideByGamesPlayed(self:getGoalsAllowed())&lt;br /&gt;
	return string.format('%.2f', avg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- DivisionStanding class&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local DivisionStanding = {}&lt;br /&gt;
DivisionStanding.__index = DivisionStanding&lt;br /&gt;
&lt;br /&gt;
function DivisionStanding.new(args)&lt;br /&gt;
	local self = setmetatable({}, DivisionStanding)&lt;br /&gt;
&lt;br /&gt;
	-- Set template-wide arguments&lt;br /&gt;
	self.division = args.division&lt;br /&gt;
	self.team = args.team&lt;br /&gt;
	self.hideLegend = yesno(args.hideLegend, false)&lt;br /&gt;
&lt;br /&gt;
	-- Separate args starting with &amp;quot;team&amp;quot; by team number.&lt;br /&gt;
	local teamArgs = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if type(k) == 'string' then&lt;br /&gt;
			local num, suffix = k:match('^team([1-9][0-9]*)_([a-z_]+)$')&lt;br /&gt;
			if num then&lt;br /&gt;
				num = tonumber(num)&lt;br /&gt;
				teamArgs[num] = teamArgs[num] or {}&lt;br /&gt;
				teamArgs[num][suffix] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Make the team objects&lt;br /&gt;
	self.teams = {}&lt;br /&gt;
	for num, t in pairs(teamArgs) do&lt;br /&gt;
		self.teams[num] = Team.new(t)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the first-place team if it has been specified&lt;br /&gt;
	self.teamInFirst = tonumber(args.teamInFirst)&lt;br /&gt;
	if self.teamInFirst then&lt;br /&gt;
		self.teamInFirst = self.teams[self.teamInFirst]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Compress the teams array, which at the moment may contain nils&lt;br /&gt;
	self.teams = (function (t)&lt;br /&gt;
		local nums, ret = {}, {}&lt;br /&gt;
		for num in pairs(t) do&lt;br /&gt;
			nums[#nums + 1] = num&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(nums)&lt;br /&gt;
		for i, num in ipairs(nums) do&lt;br /&gt;
			ret[i] = t[num]&lt;br /&gt;
		end&lt;br /&gt;
		return ret&lt;br /&gt;
	end)(self.teams)&lt;br /&gt;
&lt;br /&gt;
	-- Assume the first-place team is the first team in the teams array if it&lt;br /&gt;
	-- was not specified earlier&lt;br /&gt;
	if not self.teamInFirst then&lt;br /&gt;
		self.teamInFirst = self.teams[1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function DivisionStanding:__tostring()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	local tableRoot = root:tag('table')&lt;br /&gt;
	tableRoot&lt;br /&gt;
		:addClass('wikitable sortable')&lt;br /&gt;
		:css('width', '65%')&lt;br /&gt;
&lt;br /&gt;
	-- Caption&lt;br /&gt;
	if self.division then&lt;br /&gt;
		tableRoot:tag('caption')&lt;br /&gt;
			:wikitext(self.division)&lt;br /&gt;
			:wikitext(' Division')&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Headers&lt;br /&gt;
	local headerRow = tableRoot:tag('tr')&lt;br /&gt;
	local function addHeader(display, width, sort)&lt;br /&gt;
		headerRow:tag('th')&lt;br /&gt;
			:css('width', tostring(width) .. '%')&lt;br /&gt;
			:attr('data-sort-type', sort)&lt;br /&gt;
			:wikitext(display)&lt;br /&gt;
	end&lt;br /&gt;
	addHeader(abbr('P', 'Position'), 4, 'number')&lt;br /&gt;
	addHeader('Team', 38, 'text')&lt;br /&gt;
	addHeader('GP', 4, 'number')&lt;br /&gt;
	addHeader('W', 4, 'number')&lt;br /&gt;
	addHeader('L', 4, 'number')&lt;br /&gt;
	addHeader('PCT', 5, 'number')&lt;br /&gt;
	addHeader('GB', 5, 'number')&lt;br /&gt;
	addHeader('Home', 6, 'number')&lt;br /&gt;
	addHeader('Road', 6, 'number')&lt;br /&gt;
	addHeader('GF', 4, 'number')&lt;br /&gt;
	addHeader('GA', 4, 'number')&lt;br /&gt;
	addHeader(abbr('Diff', 'Differential'), 4, 'number')&lt;br /&gt;
	addHeader('GF/GP', 6, 'number')&lt;br /&gt;
	addHeader('GA/GP', 6, 'number')&lt;br /&gt;
&lt;br /&gt;
	-- Empty header row. This is purely to hold the up-down arrow icons added&lt;br /&gt;
	-- with the &amp;quot;sortable&amp;quot; class, which helps to keep the table width down.&lt;br /&gt;
	local emptyHeaderRow = tableRoot:tag('tr')&lt;br /&gt;
	emptyHeaderRow:tag('th'):tag('br', {selfClosing = true})&lt;br /&gt;
	for i = 1, 13 do&lt;br /&gt;
		emptyHeaderRow:tag('th')&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Rows&lt;br /&gt;
	local function addTeamCell(teamRow, val, align)&lt;br /&gt;
		teamRow:tag('td')&lt;br /&gt;
			:css('text-align', align)&lt;br /&gt;
			:wikitext(val)&lt;br /&gt;
	end&lt;br /&gt;
	for i, team in ipairs(self.teams) do&lt;br /&gt;
		if team:getLink() then&lt;br /&gt;
			local teamRow = tableRoot:tag('tr')&lt;br /&gt;
			teamRow&lt;br /&gt;
				:css('text-align', 'center')&lt;br /&gt;
				:css('background-color', self.team and&lt;br /&gt;
					self.team == team:getShortName() and&lt;br /&gt;
					'#ccffcc' or&lt;br /&gt;
					nil&lt;br /&gt;
				)&lt;br /&gt;
			addTeamCell(teamRow, team:getPosition())	&lt;br /&gt;
			addTeamCell(teamRow, team:makeDisplayName(), 'left')&lt;br /&gt;
			addTeamCell(teamRow, team:getGamesPlayed())&lt;br /&gt;
			addTeamCell(teamRow, team:getWins())&lt;br /&gt;
			addTeamCell(teamRow, team:getLosses())&lt;br /&gt;
			addTeamCell(teamRow, team:getWinPercentage())&lt;br /&gt;
			addTeamCell(teamRow, team:getGamesBack(self.teamInFirst))&lt;br /&gt;
			addTeamCell(teamRow, team:getHomeRecord())&lt;br /&gt;
			addTeamCell(teamRow, team:getRoadRecord())&lt;br /&gt;
			addTeamCell(teamRow, team:getGoalsScored())&lt;br /&gt;
			addTeamCell(teamRow, team:getGoalsAllowed())&lt;br /&gt;
			addTeamCell(teamRow, team:getDifferential())&lt;br /&gt;
			addTeamCell(teamRow, team:getGameScoredAverage())&lt;br /&gt;
			addTeamCell(teamRow, team:getGameAllowedAverage())&lt;br /&gt;
		end	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Legend&lt;br /&gt;
	if not self.hideLegend then&lt;br /&gt;
		local function makeLegend(key, val)&lt;br /&gt;
			return string.format(&amp;quot;'''%s''':&amp;amp;nbsp;%s&amp;quot;, key, val)&lt;br /&gt;
		end&lt;br /&gt;
		root:newline()&lt;br /&gt;
		root:tag('small')&lt;br /&gt;
			:wikitext(table.concat({&lt;br /&gt;
				makeLegend('x', 'Clinched playoff berth'),&lt;br /&gt;
				makeLegend('c', 'Clinched playoff berth by crossing over to another division'),&lt;br /&gt;
				makeLegend('y', 'Clinched division'),&lt;br /&gt;
				makeLegend('z', 'Clinched best regular season record'),&lt;br /&gt;
				makeLegend('GP', 'Games Played'),&lt;br /&gt;
			}, '; '))&lt;br /&gt;
			:tag('br', {selfClosing = true}):done()&lt;br /&gt;
			:wikitext(table.concat({&lt;br /&gt;
				makeLegend('W', 'Wins'),&lt;br /&gt;
				makeLegend('L', 'Losses'),&lt;br /&gt;
				makeLegend('GB', '[[Games behind|Games back]]'),&lt;br /&gt;
				makeLegend('PCT', 'Win percentage'),&lt;br /&gt;
				makeLegend('Home', 'Record at Home'),&lt;br /&gt;
				makeLegend('Road', 'Record on the Road'),&lt;br /&gt;
				makeLegend('GF', 'Goals scored'),&lt;br /&gt;
				makeLegend('GA', 'Goals allowed'),&lt;br /&gt;
			}, '; '))&lt;br /&gt;
			:tag('br', {selfClosing = true}):done()&lt;br /&gt;
			:wikitext(table.concat({&lt;br /&gt;
				makeLegend('Differential', 'Difference between goals scored and allowed'),&lt;br /&gt;
				makeLegend('GF/GP', 'Average number of goals scored per game'),&lt;br /&gt;
				makeLegend('GA/GP', 'Average number of goals allowed per game'),&lt;br /&gt;
			}, '; '))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	return tostring(DivisionStanding.new(args))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require('Module:Arguments').getArgs(frame, {&lt;br /&gt;
		wrappers = 'Template:NLLDivisionStanding'&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>