Jump to content

Module:Storm categories/demo

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Anthony Appleyard (talk | contribs) at 00:34, 3 February 2022 (Anthony Appleyard moved page Module:Tropical cyclone categories/demo to Module:Storm categories/demo without leaving a redirect: Requested by Chlod at WP:RM/TR: Module's scope has now expanded to include other non-tropical storms (such as tornadoes). As such, the name "Tropical cyclone categories" is unfitting. This module includes many subpages (some are submodules, others are documentation pages) which require the page mover right to move (or at...). 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:Tropical cyclone categories")
local cats = require("Module:Tropical cyclone categories/categories").cats
local colors = require("Module:Tropical cyclone categories/colors").colors
local icons = require("Module:Tropical cyclone 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