Diff: Module:ParameterCount
Comparing revision #1 (2017-02-11 14:32:57) with revision #2 (2023-02-02 05:44:04).
| Old | New |
|---|---|
-- 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 |
} |
} |