Jump to content

Module:Storm categories/demo

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Chlod (talk | contribs) at 03:04, 3 February 2022 (top: Post-move cleanup, replaced: Tropical cyclone categories → Storm categories (4)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local colorRatio = require("Module:Color contrast")._ratio
local TableTools = require("Module:TableTools")
local tcc = require("Module:Storm categories")
local cats = require("Module:Storm categories/categories").cats
local colors = require("Module:Storm categories/colors").colors
local icons = require("Module:Storm categories/icons").icons
local p = {}

local customKeys = {}
for k, v in pairs(colors) do
	table.insert(customKeys, k)
end
for k, v in pairs(icons) do
	table.insert(customKeys, k)
end
TableTools.removeDuplicates(customKeys)

function inlineWarning(details, icon)
	return mw.html.create("span")
		:css("color", "darkred")
		:wikitext("(")
		:node(
			mw.html.create("span")
				:attr("title", details)
				:css("text-decoration", "underline")
				:css("text-decoration-style", "dotted")
				:wikitext(icon or "!")
		)
		:wikitext(")")
end

function p.demo(frame)
	local out = mw.html.create("table")
		:addClass("wikitable")
		:addClass("sortable")
		:attr("style", "width: 100%")
		
	out
		:node(
			mw.html.create("tr")
				:node(mw.html.create("th"):wikitext("Icon")
					:attr("class", "unsortable")
					:attr("rowspan", "2")
					:css("width", "0"))
				:node(mw.html.create("th"):wikitext("ID")
					:attr("rowspan", "2"))
				:node(mw.html.create("th"):wikitext("Name")
					:attr("colspan", "2"))
				:node(mw.html.create("th"):wikitext("Color")
					:attr("rowspan", "2")
					:attr("colspan", "2"))
				:node(mw.html.create("th"):wikitext("Sortkey")
					:attr("colspan", "2"))
		):node(
			mw.html.create("tr")
				:node(mw.html.create("th"):wikitext("Basin"))
				:node(mw.html.create("th"):wikitext("Name"))
				:node(mw.html.create("th"):wikitext("Basin"))
				:node(mw.html.create("th"):wikitext("Sortkey")
					:attr("data-sort-type", "number"))
		)
	
	local legends = {}
	
	for name, cat in TableTools.sortedPairs(cats) do
		local rows = { mw.html.create("tr") }
		local row = rows[1]
		
		local actualIcon = tcc._icon(name)
		local icon = mw.html.create("td")
			:wikitext(actualIcon)
		if cat["icon"] ~= nil and actualIcon ~= cat["icon"] then
			icon
				:wikitext(" ")
				:node(
					mw.html.create("span")
						:css("text-decoration", "underline")
						:css("text-decoration-style", "dotted")
						:attr("title", "Overriden from original icon (" .. cat["icon"] .. ")")
						:wikitext("*")
				)
			legends["*"] = "Overriden from original icon."
		end
			
		local id = mw.html.create("td")
			:wikitext(name)
		local actualColor = tcc._color(name)
		local colorPreview = mw.html.create("td")
			:attr("style", "background-color: #" .. actualColor .. "; padding: 0; width: 1.8em")
		local color = mw.html.create("td")
			:wikitext("#" .. actualColor)
			
		if actualColor ~= cat["color"] then
			color
				:node(
					mw.html.create("span")
						:css("text-decoration", "underline")
						:css("text-decoration-style", "dotted")
						:attr("title", "Overriden from original color (#" .. cat["color"] .. ")")
						:wikitext("**")
				)
			legends["**"] = "Overriden from original color."
		end
		
		local catColorBlackRatio = colorRatio({ "#" .. actualColor, "black" })
		local catColorLinkRatio = colorRatio({ "#" .. actualColor, "#0645ad" })
		local catColorVisitedLinkRatio = colorRatio({ "#" .. actualColor, "#0b0080" })
		
		if catColorBlackRatio == "?" or catColorLinkRatio == "?" or catColorVisitedLinkRatio == "?" then
			color
				:wikitext(" ")
				:node(inlineWarning("This color must be a hexadecimal color.", "E"))
			legends["E"] = "Not a valid hexadecimal color code."
		else
			if catColorBlackRatio < 4.5 then
				color
					:wikitext(" ")
					:node(inlineWarning("This color has contrast issues with black (not WCAG 2.0 AA-compatible).", "C"))
				legends["C"] = "Color has contrast issues with black."
			end
			if catColorLinkRatio < 4.5 then
				color
					:wikitext(" ")
					:node(inlineWarning("This color has contrast issues with links (not WCAG 2.0 AA-compatible).", "L"))
				legends["L"] = "Color has contrast issues with links (#0645ad)."
			end
			if catColorVisitedLinkRatio < 4.5 then
				color
					:wikitext(" ")
					:node(inlineWarning("This color has contrast issues with visited links (not WCAG 2.0 AA-compatible).", "V"))
				legends["V"] = "Color has contrast issues with visited links (#0b0080)."
			end
		end
		
		local sortkeyCategory = mw.html.create("td")
			:attr("data-sort-value", cat["sortkey"])
		local sortkey = mw.html.create("td")
			:attr("data-sort-value", cat["sortkey"])
			:wikitext(cat["sortkey"])
			
		if cat["sortkey"] < 0 then
			sortkeyCategory:wikitext("Invalid")
		elseif cat["sortkey"] < 20000 then
			sortkeyCategory:wikitext("Global")
		elseif cat["sortkey"] < 30000 then
			sortkeyCategory:wikitext("Historical")
		elseif cat["sortkey"] < 40000 then
			sortkeyCategory:wikitext("SWIO")
		elseif cat["sortkey"] < 50000 then
			sortkeyCategory:wikitext("Aus/Fiji")
		elseif cat["sortkey"] < 60000 then
			sortkeyCategory:wikitext("NIO")
		elseif cat["sortkey"] < 80000 then
			sortkeyCategory:wikitext("WPAC")
		elseif cat["sortkey"] < 90000 then
			sortkeyCategory:wikitext("Atl/EPac/SAtl")
		elseif cat["sortkey"] < 100000 then
			sortkeyCategory:attr("style", "color: gray")
			sortkeyCategory:wikitext("''Global''")
		else
			sortkeyCategory:wikitext("Invalid")
		end
		
		if type(cat["name"]) == "string" then
			local name = mw.html.create("td")
				:attr("colspan", "2")
				:wikitext(cat["name"])
			row:node(icon)
			row:node(id)
			row:node(name)
		else
			local nameTableLength = TableTools.size(cat["name"])
			icon:attr("rowspan", nameTableLength)
			id:attr("rowspan", nameTableLength)
			colorPreview:attr("rowspan", nameTableLength)
			color:attr("rowspan", nameTableLength)
			sortkeyCategory:attr("rowspan", nameTableLength)
			sortkey:attr("rowspan", nameTableLength)
			
			row:node(icon)
			row:node(id)
			local firstDone = false
			for key, basinName in TableTools.sortedPairs(cat["name"]) do
				if firstDone then
					local nameRow = mw.html.create("tr")
					
					nameRow
						:node(mw.html.create("td"):wikitext(key))
						:node(mw.html.create("td"):wikitext(basinName))
						
					table.insert(rows, nameRow)	
				else
					firstDone = true
					row
						:node(mw.html.create("td"):wikitext(key))
						:node(mw.html.create("td"):wikitext(basinName))
				end
			end
		end
		
		row:node(colorPreview)
		row:node(color)
		row:node(sortkeyCategory)
		row:node(sortkey)
		
		for _, _row in TableTools.sortedPairs(rows) do
			out:node(_row)
		end
	end
	
	for name, _ in TableTools.sortedPairs(TableTools.listToSet(customKeys)) do
		if cats[name] == nil then
			local row = mw.html.create("tr")
			
			local icon = tcc._icon(name, true)
			row
				:node(mw.html.create("td")
					:wikitext(
						icon ~= nil
						and icon
						or "''<span style=\"color:gray\">N/A</span>''"
					))
				:node(mw.html.create("td"):wikitext(name))
			
			local color = tcc._color(name, true)
			-- Add more conditions eventually
			if color ~= nil then
				row
					:node(mw.html.create("td")
						:attr("colspan", "2")
						:wikitext("''<span style=\"color:gray\">not available</span>''"))
					:node(mw.html.create("td")
						:attr("style", "background-color: #" .. color .. "; padding: 0; width: 1.8em"))
					:node(mw.html.create("td")
						:wikitext("#" .. color))
					:node(mw.html.create("td")
						:attr("colspan", "2")
						:wikitext("''<span style=\"color:gray\">not available</span>''"))
			else
				row
					:node(mw.html.create("td")
						:attr("colspan", "6")
						:wikitext("''<span style=\"color:gray\">not available</span>''"))
			end
			out:node(row)
		end
	end
	
	local legendsCompiled = mw.html.create("ul")
	local showLegend = false
	legendsCompiled
		:css("list-style-icon", "none")
		:css("list-style-type", "none")
	for legend, details in TableTools.sortedPairs(legends) do
		showLegend = true
		legendsCompiled:node(
			mw.html.create("li")
				-- en dash
				:wikitext("'''" .. legend .. "''' – " .. details)
		)
	end
	
	return (showLegend and tostring(legendsCompiled) or "") .. tostring(out)
end

return p