Difference between revisions of "Module:Flagg/sandbox"

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

Revision as of 23:07, 5 May 2020

Documentation for this module may be created at Module:Flagg/sandbox/doc

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

function p.luaMain(frame,args)

function emp2nil(x)
  if x=="" then return nil else return x end
end
function space2emp(x)
  if string.find(x,"^%s*$") then return "" else return x end
end
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, alink, amap, asuf
if avar then
  local age = args["age"] or ""
  local aalias
  amap, aalias = require("Module:Flagg/Altvar data").alttable(age)
  avar = string.gsub(string.lower(avar or ""),"[ \-]","")
  avar = aalias[avar] or avar
  if not amap[avar] then error("Unknown avar") end
  local apar = {altvar=amap[avar].altvar;mw=amap[avar].mw;age=amap[avar].age;variant=args["variant"] or args[3]}
  data = require("Module:CountryData").gettable(frame,country,apar)
  asuf = amap[avar].altlink
  alink = data["link alias-"..amap[avar].altvar] or (clink or data["shortname alias"] or data.alias or country).." "..asuf
else
  data = (args["nodata"] and {}) or require("Module:CountryData").gettable(frame,country,{variant=args["variant"] or args[3]})
  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 ""

local name = args["name"]
if not name then
  local cname = string.find(me,"e") and (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 = data["flag alias-"..amap[avar].altvar.."-"..variant] or data["flag alias-"..variant] or data["flag alias-"..amap[avar].altvar] or data["flag alias"] 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 = data["border-"..variant] or data["border-"..amap[avar].altvar] or data.border
    if autoborder and autoborder~="border" 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
    --check if redirect
    if require('Module:Redirect').luaIsRedirect("Template:Country data "..country) then
      text = "<span class=\"plainlinks\">["..mw.title.new("Template:Country data "..country):fullUrl("redirect=no").." "..name.."]</span>"
    else
      text = "[[Template:Country data "..country.."|"..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
    --check if redirect
    if require('Module:Redirect').luaIsRedirect("Template:Country data "..country) then
      ilink = "|link="..mw.title.new("Template:Country data "..country):fullUrl("redirect=no")
    else
      ilink = "|link=Template:Country data "..country
    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 (string.find(me,"o") and iname==placeholder and pimage~=placeholder) and (args["missingcategory"] or '') ~= '' and require('Module:yesno')(args["noredlink"]) ~= true then
	iname = ''
	image = "[[:Template:Country data "..country.."]]"..args["missingcategory"]
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