Module:ArgsUtil

From Tardis Wiki, the free Doctor Who reference
Revision as of 18:55, 15 November 2021 by Bongolium500 (talk | contribs) (from https://lol.fandom.com/wiki/Module:ArgsUtil)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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