Module:For loop: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
meta>Pppery Fix handling of seperators -- don't add two |
meta>Johnuniq update from sandbox to implement 'for' |
||
Line 3: | Line 3: | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
local yesno = require('Module:Yesno') | local yesno = require('Module:Yesno') | ||
p = {} | local p = {} | ||
function p.main(frame) | function p.main(frame) | ||
Line 82: | Line 82: | ||
function p.callTemplate(template, targs) | function p.callTemplate(template, targs) | ||
return mw.getCurrentFrame():expandTemplate{title = template, args = targs} | return mw.getCurrentFrame():expandTemplate{title = template, args = targs} | ||
end | |||
p['for'] = function (frame) | |||
-- Example: return 9 lines, first is "* [[Any text 1|1]]" with newline at end. | |||
-- {{#invoke:ForLoop|for|1|9|* [[Any text {i}{!}{i}]]\n}} | |||
local args = getArgs(frame) | |||
local first = tonumber(args[1]) | |||
local last = tonumber(args[2]) | |||
local text = args[3] | |||
local result = {} | |||
if first and last and text then | |||
for i = first, last do | |||
table.insert(result, (text:gsub('{i}', tostring(i)))) | |||
end | |||
end | |||
return (table.concat(result):gsub('{!}', '|'):gsub('\\n', '\n')) | |||
end | end | ||
return p | return p |
Revision as of 07:39, 8 November 2017
Documentation for this module may be created at Module:For loop/doc
-- This module implements {{for loop}}.
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local p = {}
function p.main(frame)
local args = getArgs(frame, {
trim = false,
removeBlanks = false
})
return p._main(args)
end
function p._main(args)
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 = p.getConstants(args)
local variableVals = p.getVariableVals(args)
local result = ''
local addSeparator = false;
for i, v in ipairs(variableVals) do
v = mw.text.trim(v) -- trim whitespace
if #v > 0 or not yesno(args.skipBlanks) then
if addSeparator then
result = result .. sep
end
addSeparator = true;
local targs = constantArgs
targs[variableParam] = variableValPrefix .. v .. variableValPostfix
local expandedTemplate = p.callTemplate(template, targs)
result = result .. expandedTemplate
end
end
return result
end
function p.getConstants(args)
local constantArgNums = p.getArgNums(args, '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
function p.getVariableVals(args)
local variableVals = {}
for i, v in ipairs(args) do
if i ~= 1 then
variableVals[i - 1] = v
end
end
return variableVals
end
function p.getArgNums(args, 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
function p.callTemplate(template, targs)
return mw.getCurrentFrame():expandTemplate{title = template, args = targs}
end
p['for'] = function (frame)
-- Example: return 9 lines, first is "* [[Any text 1|1]]" with newline at end.
-- {{#invoke:ForLoop|for|1|9|* [[Any text {i}{!}{i}]]\n}}
local args = getArgs(frame)
local first = tonumber(args[1])
local last = tonumber(args[2])
local text = args[3]
local result = {}
if first and last and text then
for i = first, last do
table.insert(result, (text:gsub('{i}', tostring(i))))
end
end
return (table.concat(result):gsub('{!}', '|'):gsub('\\n', '\n'))
end
return p