Module:Flagg/sandbox2

--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 ""..data.error..""

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 ""..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,{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 ""..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 = "File:"..iname..""

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..""..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 = "Category:Pages using Flagg with specified image instead of data template image"

end

return out..cat

end

return p