Module:Tmpl: Difference between revisions

From The Goon Show Depository

c>CptViraj
m (Protected "Module:Tmpl": High-risk Lua module: Request at COM:ANB ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite)))
 
en>ExE Boss
(Prevent exponential expansion by performing all replacements during a single pass; goes from O(2ⁿ) to O(n))
Line 1: Line 1:
-- This is a helper module for Template:tmpl
-- This is a helper module for {{tmpl}}
require('Module:No globals')
 
-- The trailing `[^0-9]?` ensures that `$10` doesn't potentially change
-- from being treated as `${1}0` to being treated as `${10}`
-- if the number of supported parameters is ever expanded:
local PATTERN = "%$([1-9])[^0-9]?"
 
local this = {}
local this = {}


function this.renderTmpl(frame)
function this.renderTmpl(frame)
    local args = frame.args
local args = frame.args
    local pargs = (frame:getParent() or {}).args
local pargs = (frame:getParent() or {}).args
    local result = pargs[0] or ''
local input = pargs[0] or ''
    for k, v in pairs(pargs) do
local result = {}
        local n = tonumber(k) or -1
 
        if (n >= 1 and n <= 9) then
local prevPos = 1
            result = mw.ustring.gsub( result, '$' .. n, mw.text.trim(v) )
do
        end
local startPos, _, k
    end
while true do
    return result
startPos, _, k = string.find(input, PATTERN, prevPos)
if (not startPos) then break end
table.insert(result, string.sub(input, prevPos, startPos - 1))
 
local n = tonumber(k)
local r = pargs[n]
if (r) then
table.insert(result, r)
else
table.insert(result, '$' .. n)
end
 
prevPos = startPos + #k + 1
end
end
 
table.insert(result, string.sub(input, prevPos))
return table.concat(result)
end
end


return this
return this

Revision as of 07:48, 18 August 2021

-- This is a helper module for {{tmpl}}
require('Module:No globals')

-- The trailing `[^0-9]?` ensures that `$10` doesn't potentially change
-- from being treated as `${1}0` to being treated as `${10}`
-- if the number of supported parameters is ever expanded:
local PATTERN = "%$([1-9])[^0-9]?"

local this = {}

function this.renderTmpl(frame)
	local args = frame.args
	local pargs = (frame:getParent() or {}).args
	local input = pargs[0] or ''
	local result = {}

	local prevPos = 1
	do
		local startPos, _, k
		while true do
			startPos, _, k = string.find(input, PATTERN, prevPos)
			if (not startPos) then break end
			table.insert(result, string.sub(input, prevPos, startPos - 1))

			local n = tonumber(k)
			local r = pargs[n]
			if (r) then
				table.insert(result, r)
			else
				table.insert(result, '$' .. n)
			end

			prevPos = startPos + #k + 1
		end
	end

	table.insert(result, string.sub(input, prevPos))
	return table.concat(result)
end

return this