-- This module implements .
local yesno = require('Module:Yesno')local lang = mw.language.getContentLanguage
---------------------------------------------------------------------------------- Game class--------------------------------------------------------------------------------
local Game = Game.__index = Game
Game.keys =
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 selfend
function Game:get_number return self.num or self.idend
function Game:get_total_wins return self.total_winsend
function Game:get_total_losses return self.total_lossesend
function Game:get_team_score return tonumber(self.team_score) or 0end
function Game:get_opponent_score return tonumber(self.opp_score) or 0end
function Game:has_valid_score return self:get_team_score + self:get_opponent_score > 0end
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 > 0end
function Game:get_date -- TODO: Convert to Lua and call the module from here. local date = self.date or string.format('', self.id) local frame = mw.getCurrentFrame return frame:expandTemplateend
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 endend
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 retend
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) endend
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 .. ' - ' .. oppend
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 retend
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_lossesend
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 rowend
---------------------------------------------------------------------------------- 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 if game then wins = game:get_total_wins losses = game:get_total_losses self.games[i] = game else break end end
return selfend
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,) return p._main(args)end
return p