Modul:If not given or empty

This module's check_parameter function checks whether a parameter is given, empty, or nonempty in a template call. It is intended to be called from template definitions only, as

{{#invoke:If not given or empty|check_parameter|parameter name|before|after|when=NG EM NE|notgiven=|empty=|notempty=}}

This is similar to {{If then show|{{{parameter name|}}}|...|before|after}}, but also checks if the parameter is *present* in the template call. This can be useful in the calls from a template to some existing templates, where the output depends on the three states of a parameter, as it does in {{Location map}} for {{{caption}}}.

The values before and after are added only for cases in which |when= contains the codes NG (for not given), EM (given but empty), NE (given and not empty).

Examples

beccè'

Template {{Infobox some thing}} has parameter {{{image}}}. When used on a page, the template can be called without the parameter, as in {{Infobox some thing|}}, or with the parameter, in which case the parameter can have no value ({{Infobox some thing|image=}}) or some value ({{Infobox some thing|image=some value}}). This module has different outputs depending on these three cases.

{{#invoke:If not given or empty|check_parameter|image|before | after|when=EM|notgiven=[[Image:Red pog.svg|30px]]|empty=EMPTY|notempty=[[File:{{{image}}}|30px]]}}

{{Infobox some thing|}}
final output is the equivalent of [[Image:Red pog.svg|30px]]. Text before and after is not added because when does not contain NG (for not given).
{{Infobox some thing|image=}}
final output is before EMPTY after. Text before and after is added because when contains EM (for empty).
{{Infobox some thing|image=Green pog.svg}}
final output is the equivalent of [[File:Green pog.svg|30px]]. Text before and after is not added because when does not contain NE (for not empty).

-- This module's check_parameter function checks whether a parameter is given, empty, or nonempty in a template call.
-- It is intended to be called from templates only, as {{#invoke:If not given or empty|check_parameter|parameter name|before|after|when=NG EM NE|notgiven=|empty=|notempty=}}
-- This is similar to {{If then show|{{{parameter name|}}}|...|before|after}}, but also checks if the parameter is *present* in the template call. 
-- before and after are added only for cases in which when= contains the codes NG (for not given), EM (given but empty), NE (given and not empty)
local p = {}

function p.check_parameter(frame)
  local m_args = frame.args
  local t_args = frame:getParent().args

  local check_param = m_args[1] and mw.text.trim(m_args[1])  or  ''
  
  if (check_param ~= '') then
    local s, c
    if not t_args[check_param] then
      s = m_args.notgiven or ''
      c = 'NG'  
    elseif t_args[check_param] == '' then
      s = m_args.empty or ''
      c = 'EM'
    else
      s = m_args.notempty or ''
      c = 'NE'
    end

    local before = ''
    local after  = ''
    local when = m_args.when or ''
    if when:find(c) then
      before = m_args[2]
      after  = m_args[3]
    end
    return before .. s .. after
  end
  error("Function called without template's parameter name")
end

return p