Difference between revisions of "Module:For loop/sandbox"
Jump to navigation
Jump to search
blackwiki>Mr. Stradivarius (Undid revision 591216041 by Mr. Stradivarius (talk) ah, sorry, documentation diff link is broken for sandboxes) |
blackwiki>Mr. Stradivarius (tidy the code up a bit) |
||
Line 11: | Line 11: | ||
-- for the specified prefix and suffix. | -- for the specified prefix and suffix. | ||
local nums = {} | local nums = {} | ||
+ | local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' | ||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
− | local num = tostring(k):match( | + | local num = tostring(k):match(pattern) |
− | if num then | + | if num then |
+ | nums[#nums + 1] = tonumber(num) | ||
+ | end | ||
end | end | ||
table.sort(nums) | table.sort(nums) | ||
Line 22: | Line 25: | ||
local constantArgNums = getArgNums('pc', 'n') | local constantArgNums = getArgNums('pc', 'n') | ||
local constantArgs = {} | local constantArgs = {} | ||
− | for _, | + | for _, num in ipairs(constantArgNums) do |
− | local | + | local keyArg = 'pc' .. tostring(num) .. 'n' |
− | local | + | local valArg = 'pc' .. tostring(num) .. 'v' |
− | + | local key = args[keyArg] | |
+ | key = tonumber(key) or key | ||
+ | local value = args[valArg] | ||
+ | constantArgs[key] = value | ||
end | end | ||
return constantArgs | return constantArgs | ||
Line 42: | Line 48: | ||
local function _main() | local function _main() | ||
local template = args['call'] or 'void' | local template = args['call'] or 'void' | ||
− | local variableParam = args.pv or | + | local variableParam = args.pv |
+ | variableParam = tonumber(variableParam) or variableParam or 1 -- fix for positional parameters | ||
local variableValPrefix = args.prefix or '' | local variableValPrefix = args.prefix or '' | ||
local variableValPostfix = args.postfix or '' | local variableValPostfix = args.postfix or '' | ||
Line 48: | Line 55: | ||
local constantArgs = getConstants() | local constantArgs = getConstants() | ||
local variableVals = getVariableVals() | local variableVals = getVariableVals() | ||
− | |||
− | |||
local result = '' | local result = '' |
Revision as of 03:10, 18 January 2014
Documentation for this module may be created at Module:For loop/sandbox/doc
p = {}
local args
local function callTemplate(template, targs)
return mw.getCurrentFrame():expandTemplate{title = template, args = targs}
end
local function getArgNums(prefix, suffix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix and suffix.
local nums = {}
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
for k, v in pairs(args) do
local num = tostring(k):match(pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
table.sort(nums)
return nums
end
local function getConstants()
local constantArgNums = getArgNums('pc', 'n')
local constantArgs = {}
for _, num in ipairs(constantArgNums) do
local keyArg = 'pc' .. tostring(num) .. 'n'
local valArg = 'pc' .. tostring(num) .. 'v'
local key = args[keyArg]
key = tonumber(key) or key
local value = args[valArg]
constantArgs[key] = value
end
return constantArgs
end
local function getVariableVals()
local variableVals = {}
for i, v in ipairs(args) do
if i ~= 1 then
variableVals[i - 1] = v
end
end
return variableVals
end
local function _main()
local template = args['call'] or 'void'
local variableParam = args.pv
variableParam = tonumber(variableParam) or variableParam or 1 -- fix for positional parameters
local variableValPrefix = args.prefix or ''
local variableValPostfix = args.postfix or ''
local sep = args[1] or ''
local constantArgs = getConstants()
local variableVals = getVariableVals()
local result = ''
for i, v in ipairs(variableVals) do
v = mw.text.trim(v) -- trim whitespace
local targs = constantArgs
targs[variableParam] = variableValPrefix .. v .. variableValPostfix
result = result .. tostring(callTemplate(template, targs))
if variableVals[i + 1] then
result = result .. sep
end
end
return result
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return _main()
end
return p