From Wikipedia, the free encyclopedia

-- This module copies content from Template:MLB_standings; see the history of that page

-- for attribution.



local me = { }



local mlbData = mw.loadData('Module:MLB standings/data')

local Navbar = require('Module:Navbar')



local defaultOutputForInput = {

    default = 'default',

    overallWinLoss = 'winLossOnly',

}



local readTeamInfo = {

    default = function(args, currentIdx, returnData)

        if (argscurrentIdx   == nil or

            argscurrentIdx+1 == nil or

            argscurrentIdx+2 == nil or

            argscurrentIdx+3 == nil or

            argscurrentIdx+4 == nil ) then

            return nil

        end

        teamInfo = {

            name       = mw.text.trim(argscurrentIdx]),

            homeWins   = tonumber(mw.text.trim(argscurrentIdx+1])),

            homeLosses = tonumber(mw.text.trim(argscurrentIdx+2])),

            roadWins   = tonumber(mw.text.trim(argscurrentIdx+3])),

            roadLosses = tonumber(mw.text.trim(argscurrentIdx+4])),

        }

        returnData.cIndicesRead = 5

        teamInfo.wins = teamInfo.homeWins + teamInfo.roadWins

        teamInfo.losses = teamInfo.homeLosses + teamInfo.roadLosses

        return teamInfo

    end,  -- function readTeamInfo.default()



    overallWinLoss = function(args, currentIdx, returnData)

        if (argscurrentIdx   == nil or

            argscurrentIdx+1 == nil or

            argscurrentIdx+2 == nil ) then

            return nil

        end

        teamInfo = {

            name   = mw.text.trim(argscurrentIdx]),

            wins   = tonumber(mw.text.trim(argscurrentIdx+1])),

            losses = tonumber(mw.text.trim(argscurrentIdx+2])),

        }

        returnData.cIndicesRead = 3

        return teamInfo

    end,  -- function readTeamInfo.default()



}  -- readTeamInfo object



local generateTableHeader = {

    default = function(tableHeaderInfo)

        return

'{| class="wikitable" style="text-align:center;"\

|+ style="text-align:center;" |' .. tableHeaderInfo.navbarText .. '[[' .. tableHeaderInfo.divisionLink

.. '|' .. tableHeaderInfo.division .. ']]\

|- \

! width="51%" | Team \

! width="6%" | [[Win (baseball)|W]]\

! width="6%" | [[Loss (baseball)|L]]\

! width="9%" | [[Winning percentage|Pct.]]\

! width="8%" | [[Games behind|GB]]\

! width="10%" | [[Home (sports)|Home]]\

! width="10%" | [[Road (sports)|Road]]\

'

    end,  -- function generateTableHeader.default()



    winLossOnly = function(tableHeaderInfo)

        return

'{| class="wikitable" style="text-align:center;"\

|+ style="text-align:center;" |' .. tableHeaderInfo.navbarText .. tableHeaderInfo.division .. '\

|- \

! width="66%" | Team\

! width="10%" | [[Win (baseball)|W]]\

! width="10%" | [[Loss (baseball)|L]]\

! width="14%" | [[Winning percentage|Pct.]]\

'

    end,  -- function generateTableHeader.winLossOnlyNoNavBar()



    wildCard2012 = function(tableHeaderInfo)

        return

'{| class="wikitable" style="text-align:center;"\

|+ style="text-align:center;" |' .. tableHeaderInfo.navbarText .. 'Wild Card teams<br><small>(Top 2 teams qualify for postseason)</small>\

|- \

! width="64%" | Team \

! width="8%" | [[Win (baseball)|W]]\

! width="8%" | [[Loss (baseball)|L]]\

! width="10%" | [[Winning percentage|Pct.]]\

! width="10%" | [[Games behind|GB]]\

'

    end,  -- function generateTableHeader.wildCard2012



    wildCard = function(tableHeaderInfo)

    	local teamText = 'team'

    	local numberOfTeamsText = 'team qualifies'

    	if tableHeaderInfo.wildCardsPerLeague > 1 then

    		teamText = 'teams'

    		numberOfTeamsText = tableHeaderInfo.wildCardsPerLeague .. ' teams qualify'

    	end

        return

'{| class="wikitable" style="text-align:center;"\

|+ style="text-align:center;" |' .. tableHeaderInfo.navbarText .. 'Wild Card ' .. teamText .. '<br><small>(Top ' .. numberOfTeamsText ..

	' for postseason)</small>\

|- \

! width="64%" | Team \

! width="8%" | [[Win (baseball)|W]]\

! width="8%" | [[Loss (baseball)|L]]\

! width="10%" | [[Winning percentage|Pct.]]\

! width="10%" | [[Games behind|GB]]\

'

    end,  -- function generateTableHeader.wildCard



}  -- generateTableHeader object



local generateTeamRow = {

    default = function(teamRowInfo, teamInfo)

        return

'|-' .. teamRowInfo.rowStyle .. '\

|| ' .. teamRowInfo.seedText .. '[[' .. teamRowInfo.teamSeasonPage .. '|' .. teamInfo.name .. ']]\

|| ' .. teamInfo.wins .. ' || ' .. teamInfo.losses .. '\

|| ' .. teamRowInfo.winningPercentage .. '\

|| ' .. teamRowInfo.gamesBehind .. '\

|| ' .. teamInfo.homeWins .. '&zwj;–&zwj;' .. teamInfo.homeLosses ..'\

|| ' .. teamInfo.roadWins .. '&zwj;–&zwj;' .. teamInfo.roadLosses .. '\n'



    end,  -- function generateTeamRow.default()



    winLossOnly = function(teamRowInfo, teamInfo)

        return

'|-' .. teamRowInfo.rowStyle .. '\

|| ' .. teamRowInfo.seedText .. '[[' .. teamRowInfo.teamSeasonPage .. '|' .. teamInfo.name .. ']]\

|| ' .. teamInfo.wins .. ' || ' .. teamInfo.losses .. '\

|| ' .. teamRowInfo.winningPercentage .. '\n'

    end,  -- function generateTeamRow.winLossOnly



    wildCard2012 = function(teamRowInfo, teamInfo)

        return

'|-' .. teamRowInfo.rowStyle .. '\

|| ' .. teamRowInfo.seedText .. '[[' .. teamRowInfo.teamSeasonPage .. '|' .. teamInfo.name .. ']]\

|| ' .. teamInfo.wins .. ' || ' .. teamInfo.losses .. '\

|| ' .. teamRowInfo.winningPercentage .. '\

|| ' .. teamRowInfo.gamesBehind .. '\n'

    end,  -- function generateTeamRow.wildCard2012



    wildCard = function(teamRowInfo, teamInfo)

        return

'|-' .. teamRowInfo.rowStyle .. '\

|| ' .. teamRowInfo.seedText .. '[[' .. teamRowInfo.teamSeasonPage .. '|' .. teamInfo.name .. ']]\

|| ' .. teamInfo.wins .. ' || ' .. teamInfo.losses .. '\

|| ' .. teamRowInfo.winningPercentage .. '\

|| ' .. teamRowInfo.gamesBehind .. '\n'

    end,  -- function generateTeamRow.wildCard

}   -- generateTeamRow object



local function parseSeeds(seedsArg, seeds)

    local seedList = mw.text.split(seedsArg, '%s*,%s*')

    if (#seedList == 0) then

        return

    end



    for idx, seed in ipairs(seedList) do

        local seedData = mw.text.split(seed, '%s*:%s*')

        if (#seedData >= 2) then

            local seedNumber = tonumber(mw.text.trim(seedData1]))

            local team = mw.text.trim(seedData2])

            seedsseedNumber = team

            seedsteam = seedNumber

        end

    end

end  -- function parseSeeds()



local function parseHighlightArg(highlightArg, teamsToHighlight)

    local teamList = mw.text.split(highlightArg, '%s*,%s*')

    if (#teamList == 0) then

        return

    end



    for idx, team in ipairs(teamList) do

        teamsToHighlightmw.text.trim(team)] = true

    end



end  -- function parseHighlightArg



local function parseTeamLinks(teamLinksArg, linkForTeam)

    local teamList = mw.text.split(teamLinksArg, '%s*,%s*')

    if (#teamList == 0) then

        return

    end



    for idx, teamLinkInfo in ipairs(teamList) do

        local teamData = mw.text.split(teamLinkInfo, '%s*:%s*')

        if (#teamData >= 2) then

            local team = mw.text.trim(teamData1])

            local teamLink = mw.text.trim(teamData2])

            linkForTeamteam = teamLink

        end

    end

end  -- function parseTeamLinks



local function getWildCardsPerLeagueForYear(year)

	if year == '' then

		return 0

	end

	for idx, wildCardInfo in ipairs(mlbData.wildCardInfo) do

		if wildCardInfo.startYear <= year and year <= wildCardInfo.endYear then

			return wildCardInfo.wildCardsPerLeague;

		end

	end

	-- year not found, thus no wild cards for specified year

	return 0;

end  -- function getWildCardsPerLeagueForYear



function me.generateStandingsTable(frame)

    local inputFormat = 'default'

    if (frame.args.input ~= nil) then

        local inputArg = mw.text.trim(frame.args.input)

        if (inputArg == 'overallWinLoss') then

            inputFormat = 'overallWinLoss'

        end

    end



    local templateName = nil

    if (frame.args.template_name ~= nil) then

        templateName = frame.args.template_name

    end



    local outputFormat = defaultOutputForInputinputFormat

    local fDisplayNavbar = true

    local fDisplayGamesBehind = true

    if (frame.args.output ~= nil) then

        local outputArg = mw.text.trim(frame.args.output)

        if (outputArg == 'winLossOnly') then

            outputFormat = 'winLossOnly'

            fDisplayGamesBehind = false

        end

        if (outputArg == 'wildCard2012') then

            outputFormat = 'wildCard2012'

        end

        if (outputArg == 'wildCard') then

        	outputFormat = 'wildCard'

    	end

    end



    local year = tonumber(mw.text.trim(frame.args.year or '0'))

    local division = mw.text.trim(frame.args.division or '')

    local divisionLink = mw.text.trim(frame.args.division_link or division)

    local wildCardsPerLeague = getWildCardsPerLeagueForYear(year)



    local seedInfo = {}

    if (frame.args.seeds ~= nil) then

        parseSeeds(frame.args.seeds, seedInfo)

    end



    local teamsToHighlight = {}

    if (frame.args.highlight ~= nil) then

        parseHighlightArg(frame.args.highlight, teamsToHighlight)

    end



    local linkForTeam = {}

    if (frame.args.team_links ~= nil) then

        parseTeamLinks(frame.args.team_links, linkForTeam)

    end



    local listOfTeams = {};

    local currentArgIdx = 1;



    while (frame.argscurrentArgIdx ~= nil) do

        local returnData = { }

        local teamInfo = readTeamInfoinputFormat](frame.args, currentArgIdx, returnData);

        if (teamInfo == nil) then

            break

        end

        if (linkForTeamteamInfo.name ~= nil) then

            teamInfo.teamLink = linkForTeamteamInfo.name

        else

            teamInfo.teamLink = teamInfo.name

        end

        table.insert(listOfTeams, teamInfo)

        currentArgIdx = currentArgIdx + returnData.cIndicesRead

    end



    if (#listOfTeams == 0) then

        return ''

    end



    local outputBuffer = { }



    local tableHeaderInfo = {

        division = division,

        divisionLink = divisionLink,

        wildCardsPerLeague = wildCardsPerLeague,

    }



    if (fDisplayNavbar) then

        local divisionForNavbox = division

        if (mlbData.abbreviationForDivisiondivision ~= nil) then

            divisionForNavbox = mlbData.abbreviationForDivisiondivision

        end



        local standingsPage

        if (templateName ~= nil) then

            standingsPage = templateName

        else

            standingsPage = year .. ' ' .. divisionForNavbox .. ' standings'

        end

        tableHeaderInfo.navbarText =

            Navbar.navbar({

                standingsPage,

                mini = 1,

                style = 'float:left;width:0;',

            })

    end



    table.insert(outputBuffer,

        generateTableHeaderoutputFormat](tableHeaderInfo)

    )



    local leadingHalfGames = nil;

    if (fDisplayGamesBehind) then

        local standingsLeaderIdx = 1

        if (outputFormat == 'wildCard2012' and #listOfTeams > 1) then

            standingsLeaderIdx = 2

        end

        if (outputFormat == 'wildCard' and #listOfTeams >= wildCardsPerLeague) then

			standingsLeaderIdx = wildCardsPerLeague

        end



        local teamInfo = listOfTeamsstandingsLeaderIdx

        leadingHalfGames = (teamInfo.wins - teamInfo.losses)

    end



    for idx, teamInfo in ipairs(listOfTeams) do

    	local winningPercentage = string.format(

                '%.3f', teamInfo.wins / ( teamInfo.wins + teamInfo.losses )

                )

        winningPercentage = string.gsub(winningPercentage, '^0', '')

        local teamRowInfo = {

            teamSeasonPage = year .. ' ' .. teamInfo.teamLink .. ' season',

            winningPercentage = winningPercentage,

            gamesBehind = '',

            seedText = '',

            rowStyle = '',

        }



        if (fDisplayGamesBehind) then

            local halfGamesBehind = leadingHalfGames - (teamInfo.wins - teamInfo.losses)

            local prefix = nil

            -- if games behind is negative, take the absolute value and prefix a +

            -- character

            if (halfGamesBehind < 0) then

                halfGamesBehind = -halfGamesBehind

                prefix = '+'

            end

            if (halfGamesBehind == 0) then

                teamRowInfo.gamesBehind = '—'

            else  -- if halfGamesBehind is not 0

                teamRowInfo.gamesBehind = math.floor(halfGamesBehind / 2)

                if (halfGamesBehind % 2 == 1) then

                    if (halfGamesBehind == 1) then

                        teamRowInfo.gamesBehind = '½'

                    else

                        teamRowInfo.gamesBehind = teamRowInfo.gamesBehind .. '½'

                    end

                end

                if ( prefix ~= nil ) then

                    teamRowInfo.gamesBehind = prefix .. teamRowInfo.gamesBehind

                end

            end  -- if halfGamesBehind is not 0

        end  -- if (fDisplayGamesBehind)



        if (seedInfoteamInfo.name ~= nil) then

            teamRowInfo.seedText = '<sup>(' .. seedInfoteamInfo.name .. ')</sup>&nbsp;'

            teamRowInfo.rowStyle = ' style="background:#CCFFCC"'

        end



        if (teamsToHighlightteamInfo.name]) then

            teamRowInfo.rowStyle =  ' style="background:#CCFFCC"'

        end



        table.insert(outputBuffer,

            generateTeamRowoutputFormat](teamRowInfo, teamInfo)

        )

    end  -- end of looping over listOfTeams



    table.insert(outputBuffer, '|}')



    return table.concat(outputBuffer)



end  -- function me.generateStandingsTable()



function me.generateStandingsTable_fromTemplate(frame)

    return me.generateStandingsTable(frame:getParent())

end  -- function me.generateStandingsTable_fromTemplate()



return me