Module:For loop/sandbox

From blackwiki
< Module:For loop
Revision as of 02:46, 18 January 2014 by blackwiki>Mr. Stradivarius (Undid revision 591216041 by Mr. Stradivarius (talk) ah, sorry, documentation diff link is broken for sandboxes)
Jump to navigation Jump to search

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 = {}
    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[tonumber(args[keyArgName]) or 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()

	variableParam = tonumber(variableParam) or variableParam -- fix for positional parameters
	
    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