Module:For loop: Difference between revisions
Jump to navigation
Jump to search
en>Mr. Stradivarius trim whitespace from variable values |
en>Mr. Stradivarius move nil checks to the variable definitions |
||
Line 43: | Line 43: | ||
local function _main() | local function _main() | ||
local template = args['call'] or 'void' | local template = args['call'] or 'void' | ||
local variableParam = args.pv | local variableParam = args.pv or 1 | ||
local variableValPrefix = args.prefix | local variableValPrefix = args.prefix or '' | ||
local variableValPostfix = args.postfix | local variableValPostfix = args.postfix or '' | ||
local sep = args[1] or '' | local sep = args[1] or '' | ||
local constantArgs = getConstants() | local constantArgs = getConstants() | ||
Line 54: | Line 54: | ||
v = mw.text.trim(v) -- trim whitespace | v = mw.text.trim(v) -- trim whitespace | ||
local targs = constantArgs | local targs = constantArgs | ||
targs[variableParam | targs[variableParam] = variableValPrefix .. v .. variableValPostfix | ||
result = result .. tostring(callTemplate(template, targs)) | result = result .. tostring(callTemplate(template, targs)) | ||
if variableVals[i + 1] then | if variableVals[i + 1] then |
Revision as of 13:28, 10 June 2013
Documentation for this module may be created at Module:For loop/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. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function getConstants()
local constantArgNums = getArgNums('pc', 'n')
local constantArgs = {}
for _, v in ipairs(constantArgNums) do
local keyArgName = 'pc' .. tostring(v) .. 'n'
local valArgName = 'pc' .. tostring(v) .. 'v'
constantArgs[args[keyArgName]] = args[valArgName]
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 or 1
local variableValPrefix = args.prefix or ''
local variableValPostfix = args.postfix or ''
local sep = args[1] or ''
local constantArgs = getConstants()
local variableVals = getVariableVals()
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