Module:ParameterCount/sandbox

-- This module produces a count of all the arguments passed to it.

local yesno = require('Module:Yesno')

-- Trim a string
local function trim(s)
	return s:match('^%s*(.-)%s*$')
end

-- Test whether a string is blank
local function isBlank(s)
	--mw.log("here?")
	--mw.log(s)
	--mw.log(s:find('%S'))
	--mw.log(not s:find('%S'))
	return not s:find('%S')
end

-- Tests whether a string is a valid positional key, and if so, returns it. If
-- the key is invalid, this returns nil.
local function isPositionalKey(s)
	s = trim(s)
	if s:find('^[1-9][0-9]*$') then
		return tonumber(s)
	end
end

-- Return the count of all arguments for which testFunc returns a truthy value.
local function count(args, testFunc)
	local ret = 0
	for key, val in pairs(args) do
		if testFunc(key, val) then
			--mw.log(key)
			--mw.log(val)
			ret = ret + 1
		end
	end
	return ret
end

-- Check shared arguments and get the parent argument count.
local function main(frame, testFunc)
	local blankifiedTestFunc
	local modified_count = 0
	if yesno(frame.args.checkblanks) then
		-- Extend the test function to check for blanks as well.
		blankifiedTestFunc = function(key, val)
			if not isBlank(val) then
				return testFunc(key, val)
			end
		end
		
		modified_count = -1
	else
		blankifiedTestFunc = testFunc
	end
	
	if frame.args.checkblanks then
		mw.log("here?")
		modified_count = modified_count - 1
	end
	
	local module_count = count(frame.args, blankifiedTestFunc)
	local parent_count = count(frame:getParent().args, blankifiedTestFunc)
	return module_count + parent_count + modified_count
end

return {
	-- Called with {{#invoke:ParameterCount|all}}
	-- All specified parameters are counted, even those not supported by the
	-- template.
	all = function(frame)
		return main(frame, function() return true end)
	end,

	-- Called with {{#invoke:ParameterCount|main}}
	-- Users can specify a list of parameters to check, and a list of Lua
	-- Ustring patterns to check each parameter against.
	main = function(frame)
		local args = frame.args
		local keys, patterns = {}, {}
		
		-- Get key list
		for i, key in ipairs(args) do
			local positionalKey = isPositionalKey(key)
			if positionalKey then
				keys[positionalKey] = true
			else
				keys[trim(key)] = true
			end
		end

		-- Get patterns
		do
			local function getPattern(i)
				local pattern = args['pattern' .. tostring(i)]
				if pattern and pattern ~= '' then
					return pattern
				end
			end
			local i = 1
			local pattern = getPattern(i)
			while pattern do
				patterns[i] = pattern
				i = i + 1
				pattern = getPattern(i)
			end
		end

		-- Construct the test function
		local testFunc = function(key, val)
			if keys[key] then
				return true
			end
			for i, pattern in ipairs(patterns) do
				if mw.ustring.find(tostring(key), pattern) then
					return true
				end
			end
			return false
		end

		return main(frame, testFunc)
	end
}

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.