Module:Flagg/sandbox2 explained
--For testing the use of data modules instead of the current templates; see
local p =
function p.main(frame) --Get input arguments local args = require('Module:Arguments').getArgs(frame,) --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 end endend
local function firstNonNil(...) for i, value in ipairs do if value ~= nil then return value end end return nilend
local function ternary(cond,iftrue,iffalse) if cond then return iftrue else return iffalse endend
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 endend
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 "
"..data.error.."" end local value if fallBack then value = getvar(data,nil,key) else value = getvar(data,key,nil) end return valuenil and "nil" or valueend
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 "" 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 "
"..data.error.."" 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,) else avar = "" amap = 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 = 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 = 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 = 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 ""..name.."" elseif mn
"b" then --both prefix/suffix and normal country link local preflink = pref and (flink
"" and pref.." " or ""..pref.." ") or "" local sufflink = suff and (flink
"" and " "..suff or " "..suff.."") or "" local namelink = (name
"" and "" or nthe)..(clink
"" and name or ""..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 = "
["..title:fullUrl("redirect=no").." "..name.."]" else text = ""..name.."" end elseif mn"u" then --unlinked text = name else --country link (default) text = clink
"" and name or ""..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 = "" if iname
placeholder then if require('Module:yesno')(args["noredlink"])
false then iname = image = "" 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 = 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.."
"..image.."" elseif ms"n" then --non-breaking space out = text.."
"..image.."" elseif ms"l" then --line break out = text.."
"..image.."" elseif ms"t" then --table cell out = "style=\"text-align:"..(align_map[nalign] or "left").."\"|"..text.."||style=\"text-align:"..(align_map[align] or "center")..";\"|
"..image.."" else --fixed-width span box (default) local width = args["width"] or args["w"] or require("Module:Flaglist").luawidth(size) out = text.." "..image.."" 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 = "
"..image..""..text elseif ms"n" then --non-breaking space out = "
"..image.." "..text elseif ms"l" then --line break out = "
"..image.."
"..text elseif ms"t" then --table cell out = "style=\"text-align:"..(align_map[align] or "center")..";\"|
"..image.."||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 = ""..image.." "..text end end if string.find(me,"w") then --avoid wrapping out = ""..out.."" end --Tracking categories local cat = "" if pimage and not image_map[pimage] and country~="" and data["flag alias"] and not args.demo then cat = "" end return out..catendreturn p