<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://70.231.62.181/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FBrandonXLF%2FModule%3AMap_params</id>
	<title>Module:Sandbox/BrandonXLF/Module:Map params - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://70.231.62.181/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FBrandonXLF%2FModule%3AMap_params"/>
	<link rel="alternate" type="text/html" href="http://70.231.62.181/index.php?title=Module:Sandbox/BrandonXLF/Module:Map_params&amp;action=history"/>
	<updated>2026-04-22T12:28:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>http://70.231.62.181/index.php?title=Module:Sandbox/BrandonXLF/Module:Map_params&amp;diff=24308991&amp;oldid=prev</id>
		<title>imported&gt;BrandonXLF: This fallback chain is ok</title>
		<link rel="alternate" type="text/html" href="http://70.231.62.181/index.php?title=Module:Sandbox/BrandonXLF/Module:Map_params&amp;diff=24308991&amp;oldid=prev"/>
		<updated>2024-09-06T07:04:04Z</updated>

		<summary type="html">&lt;p&gt;This fallback chain is ok&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Escape a string to add to a Lua pattern&lt;br /&gt;
local function escPattern(s)&lt;br /&gt;
	return s:gsub(&amp;#039;([%(%)%%%.%[%]%*%+%-%?%^%$])&amp;#039;, &amp;#039;%%%1&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get the value of a prefixed argument&lt;br /&gt;
function getPrefixedArg(args, prefix, num, optNum)&lt;br /&gt;
	return args[prefix .. num] or ((num == 1 and optNum and args[prefix]) or nil)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get the prefixed parameters to process&lt;br /&gt;
local function getPrefixes(args)&lt;br /&gt;
	local prefixes = {}&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local cur = getPrefixedArg(args, &amp;#039;prefix&amp;#039;, i, true)&lt;br /&gt;
&lt;br /&gt;
    repeat&lt;br /&gt;
    	table.insert(prefixes, cur or &amp;#039;&amp;#039;)&lt;br /&gt;
    	i = i + 1&lt;br /&gt;
    	cur = getPrefixedArg(args, &amp;#039;prefix&amp;#039;, i, true)&lt;br /&gt;
    until not cur&lt;br /&gt;
    &lt;br /&gt;
    return prefixes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get the extra parameters to process&lt;br /&gt;
local function getExtras(args)&lt;br /&gt;
	local extras = {}&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local cur = getPrefixedArg(args, &amp;#039;extra&amp;#039;, i, true)&lt;br /&gt;
&lt;br /&gt;
    while cur do&lt;br /&gt;
    	local numMatch = cur:match(&amp;#039;^(.+)%(i%)$&amp;#039;)&lt;br /&gt;
    	&lt;br /&gt;
    	if numMatch then&lt;br /&gt;
    		table.insert(extras, {numMatch, true})&lt;br /&gt;
    	else&lt;br /&gt;
    		table.insert(extras, {cur, false})&lt;br /&gt;
    	end&lt;br /&gt;
    	&lt;br /&gt;
    	i = i + 1&lt;br /&gt;
    	cur = getPrefixedArg(args, &amp;#039;extra&amp;#039;, i, true)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return extras&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Perform wikitext parameter substitution&lt;br /&gt;
function substParams(code, num, args)&lt;br /&gt;
	args[&amp;#039;i&amp;#039;] = num&lt;br /&gt;
	local processed = code:gsub(&amp;quot;{{{([^{}|]*)|?[^{}]*}}}&amp;quot;, args) -- Substitute parameters&lt;br /&gt;
	return processed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return the function that processes each iteration&lt;br /&gt;
function makeProcessor(frame, parent)&lt;br /&gt;
	local template = frame.args.call&lt;br /&gt;
	&lt;br /&gt;
	if template then&lt;br /&gt;
		return function(num, args)&lt;br /&gt;
			args[&amp;#039;i&amp;#039;] = num&lt;br /&gt;
			&lt;br /&gt;
			return frame:expandTemplate{&lt;br /&gt;
				title = template,&lt;br /&gt;
				args = args&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Note: The difference between angle brackets and their entities is lost&lt;br /&gt;
	local code = mw.text.unstripNoWiki(frame.args[1]):gsub(&amp;#039;&amp;amp;lt;&amp;#039;, &amp;#039;&amp;lt;&amp;#039;):gsub(&amp;#039;&amp;amp;gt;&amp;#039;, &amp;#039;&amp;gt;&amp;#039;)&lt;br /&gt;
	local expand = yesno(frame.args.expand or true)&lt;br /&gt;
	&lt;br /&gt;
	if expand then&lt;br /&gt;
		local processingFrame = parent:newChild{&lt;br /&gt;
			title = &amp;#039;Module:Map params preprocessor&amp;#039;,&lt;br /&gt;
			args = {}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return function(num, args)&lt;br /&gt;
			return processingFrame:preprocess(substParams(code, num, args))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return function(num, args)&lt;br /&gt;
		return substParams(code, num, args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function numPairs(args, parentArgs, prefixes, optNum)&lt;br /&gt;
	local start = tonumber(args.start or 1)&lt;br /&gt;
	&lt;br /&gt;
	if yesno(args.sparse or false) then&lt;br /&gt;
		local nums = {}&lt;br /&gt;
		local seenNums = {} &lt;br /&gt;
&lt;br /&gt;
	    for k, _ in pairs(parentArgs) do&lt;br /&gt;
	    	local prefixMatch = false&lt;br /&gt;
	    	local j = 1&lt;br /&gt;
&lt;br /&gt;
			-- Check every prefix for a match&lt;br /&gt;
	    	while prefixes[j] and not prefixMatch do&lt;br /&gt;
	    		local numStr = tostring(k):match(&amp;#039;^&amp;#039; .. escPattern(prefixes[j]) .. &amp;#039;(%d*)$&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	    		if numStr ~= nil then&lt;br /&gt;
	    			local num = tonumber(numStr) or (optNum and 1 or nil)&lt;br /&gt;
&lt;br /&gt;
	    			if num ~= nil and num &amp;gt;= start and not seenNums[num] then&lt;br /&gt;
	    				table.insert(nums, num)&lt;br /&gt;
	    				seenNums[num] = true&lt;br /&gt;
	    			end&lt;br /&gt;
&lt;br /&gt;
	    			prefixMatch = true&lt;br /&gt;
	    		end&lt;br /&gt;
&lt;br /&gt;
	    		j = j + 1&lt;br /&gt;
	    	end&lt;br /&gt;
	    end&lt;br /&gt;
	&lt;br /&gt;
	    table.sort(nums)&lt;br /&gt;
	    &lt;br /&gt;
	    -- Iterate over each found number&lt;br /&gt;
	    function sequenceIter(a, i)&lt;br /&gt;
			i = i + 1&lt;br /&gt;
			&lt;br /&gt;
			local v = a[i]&lt;br /&gt;
			&lt;br /&gt;
			if v then&lt;br /&gt;
				return i, v&lt;br /&gt;
			end&lt;br /&gt;
	    end&lt;br /&gt;
	    &lt;br /&gt;
	    return sequenceIter, nums, 0&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Iterate each number and check for any matches&lt;br /&gt;
	local function prefixIter(a, i)&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		&lt;br /&gt;
    	local j = 1&lt;br /&gt;
    	local prefixMatch = false&lt;br /&gt;
    	&lt;br /&gt;
    	-- Check every prefix for a match&lt;br /&gt;
    	while prefixes[j] and not prefixMatch do&lt;br /&gt;
    		prefixMatch = getPrefixedArg(a, prefixes[j], i, optNum) ~= nil&lt;br /&gt;
    		j = j + 1&lt;br /&gt;
    	end&lt;br /&gt;
    	&lt;br /&gt;
    	if prefixMatch then&lt;br /&gt;
    		return i, i&lt;br /&gt;
    	end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return prefixIter, parentArgs, start - 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.map(frame)&lt;br /&gt;
	local result = {}&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
&lt;br /&gt;
	local sep = frame.args.call and frame.args[1] or frame.args[2] or frame.args.sep or &amp;#039;&amp;#039;&lt;br /&gt;
	local conj = frame.args.conj or sep&lt;br /&gt;
	local prefixes = getPrefixes(frame.args)&lt;br /&gt;
	local extras = getExtras(frame.args)&lt;br /&gt;
	local process = makeProcessor(frame, parent)&lt;br /&gt;
	local optNum = yesno(frame.args.optnum or true)&lt;br /&gt;
	&lt;br /&gt;
	for _, num in numPairs(frame.args, parent.args, prefixes, optNum) do&lt;br /&gt;
		local args = {}&lt;br /&gt;
		&lt;br /&gt;
		-- Pass extra registered arguments&lt;br /&gt;
		for _, extraInfo in ipairs(extras) do&lt;br /&gt;
			local extra, numbered = unpack(extraInfo)&lt;br /&gt;
			&lt;br /&gt;
			if numbered then&lt;br /&gt;
				args[extra] = getPrefixedArg(parent.args, extra, num, optNum)&lt;br /&gt;
			else&lt;br /&gt;
				args[extra] = parent.args[extra]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Pass current parameters without their numeric suffix&lt;br /&gt;
		for _, prefix in ipairs(prefixes) do&lt;br /&gt;
			args[prefix ~= &amp;#039;&amp;#039; and prefix or &amp;#039;1&amp;#039;] = getPrefixedArg(parent.args, prefix, num, optNum)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(result, process(num, args))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return mw.text.listToText(result, sep, conj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;BrandonXLF</name></author>
	</entry>
</feed>