Jump to content

Module:For nowiki/sandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by BrandonXLF (talk | contribs) at 06:15, 1 September 2024 (Support prefix). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
local p = {}

local function doLoop(frame, args, code, sep, offset, argstosub, iterfunc)
	local result = {}
	code = mw.text.unstripNoWiki(code)
	for i, value in iterfunc(args) do
		if i > offset then
			argstosub["1"] = value
			local actualCode = code
				:gsub("{{{i}}}", i - offset)
				:gsub("{{{([^{}|]*)|?[^{}]*}}}", argstosub)
			table.insert(result, frame:preprocess(actualCode))
		end
	end
	return table.concat(result, sep)
end

local function makePrefixedIpairs(prefix)
	if not prefix then return ipairs end
	local function iter(a, i)
        i = i + 1
		local v = a[prefix .. i]
		if v then
			return i, v
		end
	end
	return function()
    	return iter, a, 0
	end
end

function p.main(frame)
	local args = frame:getParent().args
	local sep = args[1]
	local code = args.code or args[2]
	local offset = args.code and 1 or 2
	local start = args.start or 1
	local argstosub = {}
	for key, value in pairs(args) do
		if not tonumber(key) and key ~= "i" and key ~= "count" then
			argstosub[key] = value
		end
	end
	local countArg = args.count and tonumber(args.count);
	if countArg then
		offset = 0
		args = {}
		for i = 1, countArg do
		   args[i] = i + start - 1
		end
	end
	return doLoop(frame, args, code, sep, offset, argstosub, ipairs)
end

function p.template(frame) 
	local sep = frame.args[1]
	local code = frame.args[2] or frame.args.code
	local offset = tonumber(frame.args.offset) or 0
	local prefix = frame.args.prefix
	local parentFrame = frame:getParent()
	return doLoop(parentFrame, parentFrame.args, code, sep, offset, parentFrame.args, makePrefixedIpairs(prefix))
end

return p