模块:ArgsUtil
此模块的文档可以在模块:ArgsUtil/doc创建
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 = {}
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 not str or bool_false[lang:lc(str)] then
return false
end
return true
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]
end
return vars
end
function p.merge(norm)
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 norm and v ~= '' or not norm then
args[k] = v
end
end
for k, v in pairs(parentArgs) do
v = mw.text.trim(v)
if norm and v ~= '' or not norm then
args[k] = v
end
end
return args
end
function p.overwrite(norm)
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)
if norm and v ~= '' or not norm then
args[k] = v
end
end
for k, v in pairs(origArgs) do
v = mw.text.trim(tostring(v))
if norm and v ~= '' or not norm then
args[k] = v
end
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.numberedArgsToList(args, argname, disallowUnnamedFirst, max, sep, removeEmpty)
local tbl = p.numberedArgsToTable(args, argname, disallowUnnamedFirst, max)
if removeEmpty then
util_table.removeFalseEntries(tbl, max)
elseif max then
for k = 1, max do
tbl[k] = tbl[k] or ''
end
end
return table.concat(tbl, sep or ',')
end
function p.splitAndMap(str, sep, f, ...)
if not sep then
sep = '%s*,%s*'
end
local tbl = util_text.split(str,sep)
if f then
return util_table.mapInPlace(tbl, f, ...)
else
return tbl
end
end
function p.splitMapConcat(str, sep, f, sep2)
if not str then return nil end
if not sep2 then sep2 = '' end
local tbl = p.splitAndMap(str, sep, f)
return table.concat(tbl, sep2)
end
function p.ifArg(arg, display)
if not arg then
return false
end
return display
end
function p.splitAllArgs(input, fieldlist, sep)
local ret = {}
for i, row in ipairs(input) do
ret[i] = p.splitArgs(row, fieldlist, sep)
ret[i].index = i
end
return ret
end
function p.splitArgs(input, fieldlist, sep)
if not input or input == '' then return end
sep = sep 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.splitArgsArray(input, fieldlist, outersep, innersep)
if not input or input == '' then return {} end
outersep = outersep or '%s*:::%s*'
return p.splitAndMap(input, outersep, p.splitArgs, fieldlist, innersep)
end
return p