Module:Infobox weather event/scalebar

This module automatically generates the scale bar for weather event infobox scale subbox documentation pages without the use of a secondary page for performing category calculations.

{{#invoke:Infobox weather event/scalebar|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 = 'Infobox weather event/' .. 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