Theme: iWiki Log in Register

Diff: Module:ParameterCount

Comparing revision #1 (2017-02-11 14:32:57) with revision #2 (2023-02-02 05:44:04).

OldNew
-- This module produces a count of all the arguments passed to it.
-- This module produces a count of all the arguments passed to it.
local yesno = require('Module:Yesno')
local yesno = require('Module:Yesno')
-- Trim a string
-- Trim a string
local function trim(s)
local function trim(s)
	return s:match('^%s*(.-)%s*$')
	return s:match('^%s*(.-)%s*$')
end
end
-- Test whether a string is blank
-- Test whether a string is blank
local function isBlank(s)
local function isBlank(s)
	return not s:find('%S')
	return not s:find('%S')
end
end
-- Tests whether a string is a valid positional key, and if so, returns it. If
-- Tests whether a string is a valid positional key, and if so, returns it. If
-- the key is invalid, this returns nil.
-- the key is invalid, this returns nil.
local function isPositionalKey(s)
local function isPositionalKey(s)
	s = trim(s)
	s = trim(s)
	if s:find('^[1-9][0-9]*$') then
	if s:find('^[1-9][0-9]*$') then
		return tonumber(s)
		return tonumber(s)
	end
	end
end
end
-- Return the count of all arguments for which testFunc returns a truthy value.
-- Return the count of all arguments for which testFunc returns a truthy value.
local function count(args, testFunc)
local function count(args, testFunc)
	local ret = 0
	local ret = 0
	for key, val in pairs(args) do
	for key, val in pairs(args) do
		if testFunc(key, val) then
		if testFunc(key, val) then
			ret = ret + 1
			ret = ret + 1
		end
		end
	end
	end
	return ret
	return ret
end
end
-- Check shared arguments and get the parent argument count.
-- Check shared arguments and get the parent argument count.
local function main(frame, testFunc)
local function main(frame, testFunc)
	local blankifiedTestFunc
	local blankifiedTestFunc
	if yesno(frame.args.checkblanks) ~= false then
	if yesno(frame.args.checkblanks) ~= false then
		-- Extend the test function to check for blanks as well.
		-- Extend the test function to check for blanks as well.
		blankifiedTestFunc = function (key, val)
		blankifiedTestFunc = function (key, val)
			if not isBlank(val) then
			if not isBlank(val) then
				return testFunc(key, val)
				return testFunc(key, val)
			end
			end
		end
		end
	else
	else
		blankifiedTestFunc = testFunc
		blankifiedTestFunc = testFunc
	end
	end
	return count(frame:getParent().args, blankifiedTestFunc)
	return count(frame:getParent().args, blankifiedTestFunc)
end
end
return {
return {
	-- Called with {{#invoke:ParameterCount|all}}
	-- Called with {{#invoke:ParameterCount|all}}
	-- All specified parameters are counted, even those not supported by the
	-- All specified parameters are counted, even those not supported by the
	-- template.
	-- template.
	all = function (frame)
	all = function (frame)
		return main(frame, function () return true end)
		return main(frame, function () return true end)
	end,
	end,
	-- Called with {{#invoke:ParameterCount|main}}
	-- Called with {{#invoke:ParameterCount|main}}
	-- Users can specify a list of parameters to check, and a list of Lua
	-- Users can specify a list of parameters to check, and a list of Lua
	-- Ustring patterns to check each parameter against.
	-- Ustring patterns to check each parameter against.
	main = function (frame)
	main = function (frame)
		local args = frame.args
		local args = frame.args
		local keys, patterns = {}, {}
		local keys, patterns = {}, {}
		
		
		-- Get key list
		-- Get key list
		for i, key in ipairs(args) do
		for i, key in ipairs(args) do
			local positionalKey = isPositionalKey(key)
			local positionalKey = isPositionalKey(key)
			if positionalKey then
			if positionalKey then
				keys[positionalKey] = true
				keys[positionalKey] = true
			else
			else
				keys[trim(key)] = true
				keys[trim(key)] = true
			end
			end
		end
		end
		-- Get patterns
		-- Get patterns
		do
		do
			local function getPattern(i)
			local function getPattern(i)
				local pattern = args['pattern' .. tostring(i)]
				local pattern = args['pattern' .. tostring(i)]
				if pattern and pattern ~= '' then
				if pattern and pattern ~= '' then
					return pattern
					return pattern
				end
				end
			end
			end
			local i = 1
			local i = 1
			local pattern = getPattern(i)
			local pattern = getPattern(i)
			while pattern do
			while pattern do
				patterns[i] = pattern
				patterns[i] = pattern
				i = i + 1
				i = i + 1
				pattern = getPattern(i)
				pattern = getPattern(i)
			end
			end
		end
		end
		-- Construct the test function
		-- Construct the test function
		local testFunc = function (key, val)
		local testFunc = function (key, val)
			if keys[key] then
			if keys[key] then
				return true
				return true
			end
			end
			for i, pattern in ipairs(patterns) do
			for i, pattern in ipairs(patterns) do
				if mw.ustring.find(tostring(key), pattern) then
				if mw.ustring.find(tostring(key), pattern) then
					return true
					return true
				end
				end
			end
			end
			return false
			return false
		end
		end
		return main(frame, testFunc)
		return main(frame, testFunc)
	end
	end
}
}