Módulo:Info/Evento meteorológico/barraescala

Documentação do módulo[ver] [editar] [histórico] [purgar]

Este módulo gera automaticamente a barra de escala para weather event infobox scale subbox páginas de documentação sem o uso de uma página secundária para realizar cálculos de categoria.

Uso editar

{{#invoke:Infobox/Evento meteorológico/barraescala|main}}

local getArgs = require('Module:Arguments').getArgs
local cats = require('Module:Storm categories')

local p = {}

function p.main(frame)
    local args = getArgs(frame, {
        trim = true
    })

    return p._main(frame, args)
end

function p._main(frame, args)
    local infoboxScale = args["scale"]
    local basin = args["basin"]

    function getCategory(winds)
        templateArgs = {
            categoryonly = "y",
            winds = winds,
            basin = basin
        }
        return frame:expandTemplate{ title = 'Info/Evento meteorológico/' .. infoboxScale, args = templateArgs }
    end

    local steps = {}
    local start = getCategory(0)
    local last = start
    local lastMinimum = 0
    for i = 0, 140 do
        local category = getCategory(i)
        if category ~= last then
            if last == start then
                -- first category
                table.insert(steps, { last, nil, i - 1 })
            else
                table.insert(steps, { last, lastMinimum, i - 1 })
            end

            last = category
            lastMinimum = i
        end
    end
    table.insert(steps, { last, lastMinimum, nil })

    function barCell(category, minimumWinds, maximumWinds)
        local minKmh = minimumWinds and (1.852 * minimumWinds) or nil
        local minMph = minimumWinds and (1.151 * minimumWinds) or nil

        local maxKmh = maximumWinds and (1.852 * maximumWinds) or nil
        local maxMph = maximumWinds and (1.151 * maximumWinds) or nil

        local nameCell = mw.html.create("td")
            :css("text-align", "center")
            :css("background-color", "#" .. cats._color(category))
            :wikitext("'''" .. cats._name(category, args['basin']) .. "'''<br/>")

        local windsCell = mw.html.create("td")
            :css("text-align", "center")
            :css("vertical-align", "top")
        if minimumWinds ~= nil and maximumWinds ~= nil then
            windsCell:wikitext(
                "''" .. minimumWinds .. "&ndash;" .. maximumWinds .. "&nbsp;kn, "
                .. math.floor(minKmh) .. "&ndash;" .. math.floor(maxKmh) .. "&nbsp;km/h, "
                .. math.floor(minMph) .. "&ndash;" .. math.floor(maxMph) .. "&nbsp;mph''"
            )
        elseif minimumWinds == nil then
            windsCell:wikitext(
                "''&lt;" .. maximumWinds .. "&nbsp;kn, &lt;"
                .. math.floor(maxKmh) .. "&nbsp;km/h, &lt;" .. math.floor(maxMph) .. "&nbsp;mph''"
            )
        elseif maximumWinds == nil then
            windsCell:wikitext(
                "''&gt;" .. minimumWinds .. "&nbsp;kn, &gt;"
                .. math.floor(minKmh) .. "&nbsp;km/h, &gt;" .. math.floor(minMph) .. "&nbsp;mph''"
            )
        end

        return { nameCell, windsCell }
    end

    local nameBar = mw.html.create("tr")
    local windsBar = mw.html.create("tr")
    for i, v in ipairs(steps) do
        local cells = barCell(v[1], v[2], v[3])
        nameBar:node(cells[1])
        windsBar:node(cells[2])
    end

    return tostring(
        mw.html.create("table")
            :addClass("wikitable")
            :css("width", "100%")
            :node(nameBar)
            :node(windsBar)
    )
end

return p