Module:ArgsUtil

From NBA 2K Esports Wiki
Jump to: navigation, search

To edit the documentation or categories for this module, click here.


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