Jump to content

Module:For loop: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Add an optional feature for not fully substing everything
Undid revision 835463676 by Pppery (talk) Seems to have broken something
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')
local makeTemplate = require('Module:Template invocation').invocation
p = {}
p = {}


Line 16: Line 15:
function p._main(args)
function p._main(args)
local template = args['call'] or 'void'
local template = args['call'] or 'void'
local calltemplates = yesno(args.substall or "", true) or not mw.isSubsting()
local variableParam = args.pv
local variableParam = args.pv
variableParam = tonumber(variableParam) or variableParam or 1 -- fix for positional parameters
variableParam = tonumber(variableParam) or variableParam or 1 -- fix for positional parameters
Line 36: Line 34:
local targs = constantArgs
local targs = constantArgs
targs[variableParam] = variableValPrefix .. v .. variableValPostfix
targs[variableParam] = variableValPrefix .. v .. variableValPostfix
local expandedTemplate = p.callTemplate(template, targs)
if callTemplates then
result = result .. p.callTemplate(template, targs)
result = result .. expandedTemplate
else
result = result .. makeTemplate(template, targs)
end
end
end
end
end

Revision as of 21:24, 8 April 2018

-- This module implements {{for loop}}.

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
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

return p