Module:CountryData

MyWikiBiz, Author Your Legacy — Friday April 19, 2024
Jump to navigationJump to search

Template:Module rating This module has three functions to extract data from country data templates (which are used for most flag templates).

gettable

Extracts all parameters from a data template and returns them as a Lua table. This function is only usable from other Lua modules; invoke it using require('Module:CountryData').gettable(parameters).

The first parameter is the frame of the invoking module; the second is the country or other entity to get the data of. The optional third parameter is a table of parameters to pass into the data template; this may, for example, include Template:Para or Template:Para, which are used in the values of some sports alias parameters. E.g., <syntaxhighlight lang="Lua">local data = require('Module:CountryData').gettable(frame,"France",{age="20",mw="men's"})</syntaxhighlight>

The function returns an empty table if a data template does not exist or does not conform to the standard structure.

getalias

If used from wikicode, this function returns the value of a single field in a data template. The first parameter is the country or other entity whose data to return; the second is the name of the field. For example, Template:((#invoke:CountryData|getalias|France|flag aliasTemplate:)) → nil. The other parameters are Template:Para to return a variant parameter value, with fallback to the main field value if the variant does not exist, and Template:Para for the fallback output if the wanted data template or field does not exist, the default for which is a literal "nil".

Note: This is likely not quicker than wikicode-only alternatives such as {{getalias}}, {{getalias2}} and {{pst name}}, because it transcludes the data template from Lua and converts it to a Lua table using the above function, picks the wanted parameter name, and returns it to wikicode, whereas other templates perform two simple non-Lua transclusions to get, in most cases, the same result. The Lua version does have the advantage that using it with a non-existing country data template returns "nil" (or the value of Template:Para) rather than a redlink to the data template. See a comparison of the four at User:SiBr4/Flagg tests#Lua-based getalias.

gettemplate

This function concatenates the fields of a data template into a string similar to what you get when transcluding it directly. It can be compared with a direct transclusion to test if a template is being converted to Lua correctly:

{{#tag:pre|{{Country data France}}}}
{{#tag:pre|{{#invoke:CountryData|gettemplate|France}}}}

gives

[[:Template:Country data France]]
{{ {{{1}}}
}}

Note that, like with all Lua tables, the order of entries is not preserved, so the parameters are mixed up.

Template:Sandbox other


local p = {}
local mostUsed = mw.loadData('Module:CountryData/summary')

local function getcontents(frame,country,params)
  return frame:expandTemplate({title="Country data "..country;args=params})
end

function p.getcachedtable(frame, country, params)
	country = mostUsed.redirects[country] or country
	if params and next(params) then return p.gettable(frame, country, params) end
	-- Uses mw.loadData to cache data for the most-used templates
	if mostUsed.pages[country] then
		local cache = mw.loadData('Module:CountryData/cache' .. mostUsed.pages[country])
		if cache.data[country] then return cache.data[country] end
	end
	-- if not in cache
	return p.gettable(frame, country, params)
end

function p.gettable(frame,country,params)
--Returns the parameters of a country data template as a Lua table
  --If not a valid data template, return empty table
  local bool, s = pcall(getcontents,frame,country,params or {})
  if bool and (string.find(s,"^%{%{ *%{%{%{1") or string.find(s,"^%{%{safesubst: *%{%{%{1"))
  then
    --Replace parameter delimiters with arbitrary control characters
    --to avoid clashes if param values contain equals/pipe signs
    s = string.gsub(s,"|([^|=]-)=","\1\1%1\2")
    s = string.gsub(s,"}}%s*$","\1")
    --Loop over string and add params to table
    local part = {}
    for par in string.gmatch(s,"\1[^\1\2]-\2[^\1\2]-\1") do
      local k = string.match(par,"\1%s*(.-)%s*\2")
      local v = string.match(par,"\2%s*(.-)%s*\1")
      if v and not (v=="" and string.find(k,"^flag alias")) then
        part[k] = v
      end
    end
    return part
  else
  	return {}
  end
end

function p.getalias(frame)
--Returns a single parameter value from a data template
  local part = p.gettable(frame,frame.args[1])
  if frame.args.variant
    then return tostring(part[frame.args[2].."-"..frame.args.variant]
                         or part[frame.args[2]] or frame.args.def)
    else return tostring(part[frame.args[2]] or frame.args.def)
  end
end

function p.gettemplate(frame)
--For testing, recreates the country data from the created Lua table
  --Get data table
  local data = p.gettable(frame,frame.args[1])
  --Concatenate fields into a template-like string
  local out = "{{ {{{1}}}"
  for k,v in pairs(data) do
    out = out.."\n| "..k.." = "..v
  end
  return out.."\n}}"
end

return p