Module:ArgsUtil

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(origArgs, parentArgs, norm) if type(origArgs) ~= 'table' then norm = origArgs local f = mw.getCurrentFrame origArgs = f.args parentArgs = f:getParent.args end 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 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.splitArgs(input, fieldlist, sep) sep = sep or '%s*;;;%s*' local result = {} local tbl = util_text.split(input,sep) for i, v in ipairs(fieldlist) do		if tbl[i] ~= '' then result[v] = tbl[i] end end return result end

function p.parseNumber(value) local result = tonumber(value) if (result ~= result) then return nil end return result end

return p