Module:ArgsUtil
From Tardis Wiki, the free Doctor Who reference
Documentation for this module may be created at Module:ArgsUtil/doc
-- from https://lol.fandom.com/wiki/Module:ArgsUtil
local util_map = require('Module:MapUtil')
local util_text = require('Module:TextUtil')
local util_table = require('Module:TableUtil')
local bool_false = { ['false'] = true, ['no'] = true, [''] = true, ['0'] = true, ['nil'] = true }
local bool_true = { ['true'] = true, ['yes'] = true }
local lang = mw.getLanguage('en')
local p = {}
local h = {}
function p.norm(v)
if not v then
return false
end
local lc = lang:lc(v)
if bool_false[lc] then
return false
elseif bool_true[lc] then
return true
end
return v
end
function p.castAsBool(str)
if type(str) == 'boolean' then return str end
if not str or bool_false[lang:lc(str)] then
return false
end
return true
end
function p.isDefined(str)
if not str then return false end
return true
end
function p.boolToStringYN(str)
if str then return 'Yes' end
return 'No'
end
function p.boolToStringTF(str)
if str then return 'True' end
return 'False'
end
function p.nilToFalse(val)
-- casts nil as false
-- does not change anything else
-- used if needing to have false but non-nil values in a table
-- for ipairs, util_table.removeFalseEntries, etc
return not not val and val
end
function p.lookupVars(str, lookup_tbl, skipdefault)
-- for rolenames etc. if a default table is supplied, this will be
-- returned with priority over lookup.DEFAULT in the case of no match
local vars = str and lookup_tbl[lang:lc(str)]
if not vars then
if skipdefault then
return nil
end
return lookup_tbl.DEFAULT
end
if type(vars) == 'string' then
vars = lookup_tbl[vars]
if type(vars) == 'string' then
error(('Error in lookup module for input %s'):format(str))
end
end
return vars
end
function p.merge()
local f = mw.getCurrentFrame()
local origArgs = f.args
local parentArgs = f:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = mw.text.trim(tostring(v))
if v ~= '' then
args[k] = v
end
end
for k, v in pairs(parentArgs) do
v = mw.text.trim(v)
if v ~= '' then
args[k] = v
end
end
return args
end
function p.mergeKeepEmpty()
local f = mw.getCurrentFrame()
local origArgs = f.args
local parentArgs = f:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = mw.text.trim(tostring(v))
args[k] = v
end
for k, v in pairs(parentArgs) do
v = mw.text.trim(v)
args[k] = v
end
return args
end
function p.overwrite()
local f = mw.getCurrentFrame()
local origArgs = f.args
local parentArgs = f:getParent().args
local args = {}
for k, v in pairs(parentArgs) do
v = mw.text.trim(v)
args[k] = v
end
for k, v in pairs(origArgs) do
v = mw.text.trim(tostring(v))
args[k] = v
end
return args
end
function p.original()
local f = mw.getCurrentFrame()
local origArgs = f.args
local args = {}
for k, v in pairs(origArgs) do
v = mw.text.trim(tostring(v))
args[k] = v
end
return args
end
function p.numberedArgsToTable(args, argname, disallowUnnamedFirst, max)
if not max then max = -1 end
local i = 1
local tbl = {}
if args[argname] and not disallowUnnamedFirst then
tbl[1] = args[argname]
i = 2
end
while args[argname .. i] or i <= max do
tbl[i] = args[argname .. i]
i = i + 1
end
if not next(tbl) then
return nil
end
return tbl
end
function p.ifArg(arg, display)
if not arg then
return false
end
return display
end
function p.splitArgs(input, fieldlist, sep, outersep)
-- outersep 99.9% of the time is going to be nil here, but on the off chance
-- that we have to specify it, it's important to make it available
-- so yeah it's shitty that we're switching arg order
-- but blame lua for not having named params zzzzzzzzzzzz
return p.splitArgsArray(input, fieldlist, outersep, sep)[1]
end
function p.splitArgsArray(input, fieldlist, outersep, innersep)
if not input or input == '' then return {} end
outersep = outersep or '%s*:::%s*'
local ret = util_map.split(input, outersep, h.splitArgs, fieldlist, innersep)
return ret
end
function h.splitArgs(input, fieldlist, sep)
if not input or input == '' then return end
sep = (sep and ('%s*' .. sep .. '%s*')) or '%s*;;;%s*'
local result = {}
local inputTbl = util_text.split(input,sep)
for i, v in ipairs(fieldlist) do
if not inputTbl[i] then
error(('Missing parameter %s - maybe wrong child template?'):format(v))
end
if inputTbl[i] ~= '' then
result[v] = inputTbl[i]
end
end
return result
end
function p.isSplitArg(input)
if not input then return false end
return input:find(';;;')
end
function p.strOrTitle(str)
return str or mw.title.getCurrentTitle().rootText
end
function p.require(n, ...)
local params = {...}
local numberSpecified = util_table.generalLength(params)
if numberSpecified < n then
local traceback = debug.traceback('', 2)
relevantTraceback = util_text.split(traceback, '\n')[3]
error(('Missing params in %s! %s expected, %s non-nil'):format(
relevantTraceback,
n,
numberSpecified
))
end
end
return p