Module:NLL game log

-- This module implements Template:NLLGameLog.

local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage

-- Game class

local Game = {} Game.__index = Game

Game.keys = { 'opp', 'opp_link', 'team_score', 'opp_score', 'num', 'date', 'road_game', 'loc', 'loc_link', 'ot', 'attendance', }

function Game.new(data) local self = setmetatable({}, Game) local args = data.args

-- Set properties from arguments self.id = data.id	do local prefix = 'game' .. self.id .. '_'		for i, key in ipairs(Game.keys) do self[key] = args[prefix .. key] end end

-- Set other properties self.arena = args.arena self.arena_link = args.arena_link

-- Abort if we don't have required fields if not self.opp and not self.opp_link then return nil end

-- Set wins and losses self.total_wins = data.previous_wins self.total_losses = data.previous_losses if self:is_win then self.total_wins = self.total_wins + 1 else self.total_losses = self.total_losses + 1 end

-- Do some simple data preprocessing self.road_game = yesno(self.road_game) or false

return self end

function Game:get_number return self.num or self.id end

function Game:get_total_wins return self.total_wins end

function Game:get_total_losses return self.total_losses end

function Game:get_team_score return tonumber(self.team_score) or 0 end

function Game:get_opponent_score return tonumber(self.opp_score) or 0 end

function Game:has_valid_score return self:get_team_score + self:get_opponent_score > 0 end

function Game:is_win -- Only record win/loss, as there are no draws in box lacrosse return self:get_team_score - self:get_opponent_score > 0 end

function Game:get_date -- TODO: Convert Template:Date to Lua and call the module from here. local date = self.date or string.format('', self.id) local frame = mw.getCurrentFrame return frame:expandTemplate{title = 'Date', args = {date, 'mdy'}} end

function Game:make_link(page, display) if display and page then return string.format('%s', page, display) elseif display then return display elseif page then return string.format('%s', page) else return '' end end

function Game:make_opponent_text local ret = '' if self.road_game then ret = ret .. '@ '	end ret = ret .. self:make_link(self.opp_link, self.opp) return ret end

function Game:make_location_text if self.road_game then return self:make_link(self.loc_link, self.loc) else return self:make_link(self.arena_link, self.arena) end end

function Game:make_score_text local team = self:get_team_score local opp = self:get_opponent_score local ret = '' if self:is_win then ret = ret .. 'W'	else ret = ret .. 'L'	end return ret .. ' ' .. team .. '–' .. opp end

function Game:make_overtime_text local ot = tonumber(self.ot) or 0 local ret = '' if ot > 0 then if ot > 1 then ret = ret .. ot		end ret = ret .. 'OT' end return ret end

function Game:make_attendance_text local att = tonumber(self.attendance) or 0 return lang:formatNum(att) end

function Game:make_record -- The record of the wins and losses so far in the game log. return self:get_total_wins .. '–' .. self:get_total_losses end

function Game:render_html local row = mw.html.create('tr')

-- Row color if self:has_valid_score then row:css('background-color', self:is_win and '#ccffcc' or '#ffbbbb') end

local function addCell(content) if content then row:tag('td') :css('text-align', 'center') :wikitext(content) else row:tag('td') end end

addCell(self:get_number) addCell(self:get_date) addCell(self:make_opponent_text) addCell(self:make_location_text)

if self:has_valid_score then addCell(self:make_score_text) addCell(self:make_overtime_text) addCell(self:make_attendance_text) addCell(self:make_record) else for i = 1, 4 do			addCell end end

return row end

-- GameLog class

local GameLog = {} GameLog.__index = GameLog

function GameLog.new(args) local self = setmetatable({}, GameLog)

-- Set game objects self.games = {} local i = 0 local wins = 0 local losses = 0 while true do		i = i + 1 local game = Game.new{ id = i,			args = args, previous_wins = wins, previous_losses = losses, }		if game then wins = game:get_total_wins losses = game:get_total_losses self.games[i] = game else break end end

return self end

function GameLog:get_game(id) return self.games[id] end

function GameLog:__tostring local root = mw.html.create('table') root :addClass('wikitable') :css('width', '85%')

-- Headers do local headerRow = root:tag('tr')

local function addHeader(header, width) headerRow :tag('th') :css('width', width .. '%') :wikitext(header) end

addHeader('Game', 5) addHeader('Date', 15) addHeader('Opponent', 25) addHeader('Location', 30) addHeader('Score', 10) addHeader('OT', 5) addHeader('Attendance', 5) addHeader('Record', 5) end

-- Data local i = 0 while true do		i = i + 1 local game = self:get_game(i) if game then root:node(game:render_html) else break end end

return tostring(root) end

-- Exports

local p = {}

function p._main(args) return tostring(GameLog.new(args)) end

function p.main(frame) local args = require('Module:Arguments').getArgs(frame, {		wrappers = 'Template:NLL game log'	}) return p._main(args) end

return p