Module:NLL game log
MyWikiBiz, Author Your Legacy — Thursday January 02, 2025
Jump to navigationJump to search-- 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('{{{game%d_date}}}', 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|%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