Module:NLL game log explained

-- 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