Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Flagg/sandbox2

From Wikipedia, the free encyclopedia
--For testing the use of data modules instead of the current templates; see [[WT:WPFT]]

local p = {}


function p.main(frame)
	--Get input arguments
	local args = require('Module:Arguments').getArgs(frame,{valueFunc =
		function(key,value)
			if value then
				value = mw.text.trim(value)
				--Change empty string to nil for all args except 'image' and 'border'
				if key=="image" or key=="border" or value~="" then
					return value
				end
			end
			return nil
		end
	})
	--Call main function
	return p.luaMain(frame,args)
end


local function loadCountryData(country)
	if country == "test" then
		return mw.loadData("Module:Sandbox/SiBr4/Flag data")
	else
		local redirs = mw.loadData("Module:Sandbox/Ahecht/flag/redirects")
		while redirs[country] do
			country = redirs[country]
		end
		success, data = pcall(mw.loadData,"Module:Sandbox/Ahecht/flag/"..country)
		if success then
			return data[country]
		else --doesn't exist, return error message
			return {error=data}
		end
	end
end


local function firstNonNil(...)
	for i, value in ipairs({...}) do
		if value ~= nil then
			return value
		end
	end
	return nil
end


local function ternary(cond,iftrue,iffalse)
	if cond then return iftrue else return iffalse end
end


local function getvar(data,key,variant,lastDefault)
	if key and #key > 0 then
		if type(data) == "table" then
			local subkey = ""
			--check for key in data (with literal hyphens)
			while #key > 0 and data[key] == nil do
				--remove last section of key and retry
				key, trail = string.match(key,"^(.-)(%-?[^%-]*)$")
				subkey = trail..subkey
			end
			if #key > 0 then --data[key] exists
				--return it or look for subkey in nested table
				return getvar(data[key],string.gsub(subkey,"^%-",""),variant,lastDefault)
			else --key not found
				return nil
			end
		else --no subtable
			return nil
		end
	elseif variant and #variant > 0 then --no key; look for variant
		if type(data) == "table" then
			--remember default to fall back to
			if data['#default'] ~= nil then
				lastDefault = data['#default']
			end
			local subvar = ""
			--check for variant in data (with literal hyphens)
			while #variant > 0 and data[variant] == nil do
				--remove last section of variant and retry
				variant, trail = string.match(variant,"^(.-)(%-?[^%-]*)$")
				subvar = trail..subvar
			end
			if #variant > 0 then --data[variant] exists
				--return it or look for subvar in nested table
				return getvar(data[variant],nil,string.gsub(subvar,"^%-",""),lastDefault)
			else --variant not found
				return lastDefault
			end
		else --value or nil
			return data
		end
	else --base case (no key or variant); return data
		if type(data) == "table" then
			return firstNonNil(data["#default"], lastDefault)
		else --value or nil
			return data
		end
	end
end


function p.getvar(frame)
	local args = require('Module:Arguments').getArgs(frame)
	local country = args[1]
	local key = args[2]
	local fallBack = require('Module:Yesno')(args[3])
	local data = loadCountryData(country)
	if data.error then
		return "<span class='error'>"..data.error.."<span>"
	end
	local value
	if fallBack then
		value = getvar(data,nil,key)
	else
		value = getvar(data,key,nil)
	end
	return value==nil and "nil" or value
end


local function fillParams(str,values)
	return string.gsub(str, "%{%{%{([^%{%}%|]+)(%|?)([^%{%}]-)%}%}%}", function(param,pipe,default)
		if values[param] then
			return values[param]
		elseif pipe ~= "" then
			return default
		else
			return "{{{"..param.."}}}"
		end
	end)
end


function p.luaMain(frame,args)
	local function emp2nil(x)
		if x=="" then return nil else return x end
	end
	local function space2emp(x)
		if string.find(x,"^%s*$") then return "" else return x end
	end
	local function nopx(x)
		if x~=nil and (string.find(x,"^%d+$") or string.find(x,"^%d+px$")) then return string.gsub(x,"^(.*)px","%1") else return nil end
	end
	
	--Country & mode parameters
	local mode = string.lower(args[1] or "usc")
	local mi = string.sub(mode,1,1)
	local ms = string.sub(mode,2,2)
	local mn = string.sub(mode,3,3)
	local me = string.sub(mode,4,-1)
	
	local country = args[2] or ""
	local avar = args["avar"] or args["altvar"]
	local clink = args["clink"] or args["link"]
	
	--Get country data & altvar data
	local data = args["nodata"] and {} or loadCountryData(country)
	if data.error then
		return "<span class='error'>"..data.error.."<span>"
	end
	local alink, amap, asuf
	if avar then
		local altData = mw.loadData("Module:Flagg/Altvar data/sandbox")
		amap = altData.map
		avar = string.gsub(string.lower(avar or ""),"[ \-]","")
		avar = altData.aliases[avar] or avar
		if not amap[avar] then error("Unknown avar") end
		local age = args["age"] and "under-"..args["age"] or amap[avar].age or ""
		asuf = amap[avar].altlink
		alink = getvar(data,"link alias",amap[avar].altvar) or (clink or data["shortname alias"] or data.alias or country).." "..asuf
		alink = fillParams(alink,{age=age,mw=amap[avar].mw})
	else
		avar = ""
		amap = {[""]={altvar=""}}
	end
	
	--Name and link parameters
	clink = clink or data.alias or country
	
	local pref = args["pref"]
	local suff = args["suff"] or asuf
	if not pref and not suff then --Default prefix
		pref = "Flag of"
	end
	local yn_map = {[""]=0; ["0"]=0; ["no"]=0; ["n"]=0; ["1"]=1; ["yes"]=1; ["y"]=1}
	local fthe = (args["pthe"] and yn_map[args["pthe"]]~=0) or (args["the"] and yn_map[args["the"]]~=0)
	local nthe = (args["nthe"] and yn_map[args["nthe"]]~=0) or (args["the"] and yn_map[args["the"]]~=0)
	fthe = fthe and (pref and "t" or "T").."he " or ""
	nthe = nthe and (pref and "t" or "T").."he " or ""
	local flink = args["plink"] or args["flink"] or alink
	              or clink=="" and "" or space2emp((pref or "").." ")..fthe..clink..space2emp(" "..(suff or ""))
	local fsec = args["psection"] or args["section"]
	local csec = args["csection"] or args["section"]
	fsec = fsec and "#"..fsec or ""
	csec = csec and "#"..csec or ""
	
	if string.find(me,"f") then
		if mw.title.new( flink ).exists == false then
			flink = clink
		end
	end
	
	local name = args["name"]
	if not name then
		local cname = string.find(me,"e") and (getvar(data,"name alias",amap[avar].altvar)
		              or data["shortname alias"] or data.alias) or country
		if mn == "f" then
			name = cname=="" and "" or space2emp((pref or "").." ")..nthe..cname..space2emp(" "..(suff or ""))
		else
			name = cname
		end
	end
	
	--Image parameters
	local pimage = args["image"]
	local placeholder = "Flag placeholder.svg"
	local variant = args["variant"] or args[3] or ""
	local image_map = {[""]=placeholder; ["none"]=placeholder; ["blank"]=placeholder}
	if pimage then --Remove namespace
		pimage = string.gsub(pimage,"^[Ff][Ii][Ll][Ee]:","")
		pimage = string.gsub(pimage,"^[Ii][Mm][Aa][Gg][Ee]:","")
	end
	local iname = image_map[pimage] or pimage
	
	local size = args["size"] or args["sz"]
	local size_map = {xs="12x8px"; s="17x11px"; m="23x15px"; l="32x21px"; xl="46x30px"}
	if size==nil or string.find(size,"^%d*x?%d+px$") then
		--valid EIS size (..px, x..px or ..x..px) or unset
	elseif string.find(size,"^%d*x?%d+$") then --EIS size without "px" suffix
		size=size.."px"
	else --size from map, or invalid value
		size = size_map[size] or nil
	end
	local border = args["border"]
	
	if iname then
		size = size or "23x15px"
		if yn_map[border]==0 then border = "" else border = "|border" end
	else
		iname = getvar(data,"flag alias-"..amap[avar].altvar.."-"..variant)
			 or getvar(data,"flag alias-"..variant)
			 or getvar(data,"flag alias",amap[avar].altvar) or placeholder
		size = size or emp2nil(data.size) or "23x15px"
		if border then
			if yn_map[border]==0 then border = "" else border = "|border" end
		else
			local autoborder = firstNonNil(getvar(data,"border-"..amap[avar].altvar.."-"..variant),
				                           getvar(data,"border-"..variant),
			                               getvar(data,"border",amap[avar].altvar))
			if autoborder == false then border = "" else border = "|border" end
		end
	end
	
	local am = ""
	if args["alt"] or string.find(me,"a") then
		am = args["alt"] or args["name"] or country
		am = am.."|"..am
	end
	
	--Build display name
	local text = args["text"]
	if not text then
		if mn=="x" then --no text
			text = ""
		elseif mn=="p" or mn=="f" then --prefix/suffix link
			text = flink=="" and name or "[["..flink..fsec.."|"..name.."]]"
		elseif mn=="b" then --both prefix/suffix and normal country link
			local preflink = pref and (flink=="" and pref.." " or "[["..flink..fsec.."|"..pref.."]] ") or ""
			local sufflink = suff and (flink=="" and " "..suff or " [["..flink..fsec.."|"..suff.."]]") or ""
			local namelink = (name=="" and "" or nthe)..(clink=="" and name or "[["..clink..csec.."|"..name.."]]")
			text = preflink..namelink..sufflink
		elseif mn=="d" then --data template
			local title = mw.title.new("Template:Country data "..country)
			--check if redirect
			if title.isRedirect then
				text = "<span class=\"plainlinks\">["..title:fullUrl("redirect=no").." "..name.."]</span>"
			else
				text = "[["..title.fullText.."|"..name.."]]"
			end
		elseif mn=="u" then --unlinked
			text = name
		else --country link (default)
			text = clink=="" and name or "[["..clink..csec.."|"..name.."]]"
		end
	end
	
	--Build image
	local ilink = args["ilink"]
	if not ilink then
		if mi=="x" or (iname==placeholder and pimage~=placeholder) then --no image/invisible image
			iname = placeholder
			border = ""
			ilink = "|link="
			am = ""
		elseif mi=="i" then --image page link
			ilink = ""
		elseif mi=="c" then --country link
			ilink = "|link="..clink..(clink=="" and "" or csec)
		elseif mi=="p" or mi=="f" then --prefix/suffix link
			ilink = "|link="..flink..(flink=="" and "" or fsec)
		elseif mi=="d" then --data template
			local title = mw.title.new("Template:Country data "..country)
			--check if redirect
			if title.isRedirect then
				ilink = "|link="..title:fullUrl("redirect=no")
			else
				ilink = "|link="..title.fullText
			end
		else --unlinked (default)
			ilink = "|link="
		end
	end
	if am == "" and string.find(me,"l") then
		am = mw.ustring.sub(ilink,7,-1)
	end
	local image = "[[File:"..iname.."|"..size..border..ilink.."|alt="..am.."]]"
	
	if iname==placeholder then
		if require('Module:yesno')(args["noredlink"]) == false then
			iname = ''
			image = "[[:Template:Country data "..country.."]]"
		end
		if (args["missingcategory"] or '') ~= '' then
			image = image..args["missingcategory"]
		end
		if string.find(me,"b") then
			text = ''
		end
	end
	
	--Combine image and name with separator
	local align = args["align"] or args["al"]
	local nalign = args["nalign"] or args["nal"]
	local align_map = {left="left", l="left", center="center", centre="center", c="center", middle="center", m="center", right="right", r="right"}
	local out
	if string.find(me,"r") then
		--image right of name
		if (ms=="x" and mi=="x") or (string.find(me,"o") and iname==placeholder and pimage~=placeholder) then --name only
			out = text
		elseif ms=="x" then --no separator
			out = text.."<span class=\"flagicon\">"..image.."</span>"
		elseif ms=="n" then --non-breaking space
			out = text.."<span class=\"flagicon\">&nbsp;"..image.."</span>"
		elseif ms=="l" then --line break
			out = text.."<span class=\"flagicon\"><br/>"..image.."</span>"
		elseif ms=="t" then --table cell
			out = "style=\"text-align:"..(align_map[nalign] or "left").."\"|"..text.."||style=\"text-align:"..(align_map[align] or "center")..";\"|<span class=\"flagicon\">"..image.."</span>"
		else --fixed-width span box (default)
			local width = args["width"] or args["w"] or require("Module:Flaglist").luawidth(size)
			out = text.."&nbsp;<span class=\"flagicon\" style=\"display:inline-block;width:"..width.."px;text-align:"..(align_map[align] or "right")..";\">"..image.."</span>"
		end
	else --image left of name
		if (ms=="x" and mi=="x") or (string.find(me,"o") and iname==placeholder and pimage~=placeholder) then --name only
			out = text
		elseif ms=="x" then --no separator
			out = "<span class=\"flagicon\">"..image.."</span>"..text
		elseif ms=="n" then --non-breaking space
			out = "<span class=\"flagicon\">"..image.."&nbsp;</span>"..text
		elseif ms=="l" then --line break
			out = "<span class=\"flagicon\">"..image.."<br/></span>"..text
		elseif ms=="t" then --table cell
			out = "style=\"text-align:"..(align_map[align] or "center")..";\"|<span class=\"flagicon\">"..image.."</span>||style=\"text-align:"..(align_map[nalign] or "left").."\"|"..text
		else --fixed-width span box (default)
			local width = nopx(args["width"] or args["w"]) or require("Module:Flaglist").luawidth(size)
			out = "<span class=\"flagicon\" style=\"display:inline-block;width:"..width.."px;text-align:"..(align_map[align] or "left")..";\">"..image.."</span>&nbsp;"..text
		end
	end
	if string.find(me,"w") then --avoid wrapping
		out = "<span class=\"nowrap\">"..out.."</span>"
	end
	
	--Tracking categories
	local cat = ""
	if pimage and not image_map[pimage] and country~="" and data["flag alias"] and not args.demo then
		cat = "[[Category:Pages using Flagg with specified image instead of data template image]]"
	end
	
	return out..cat
end

return p