Modul:Tmpl: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Prevent exponential expansion by performing all replacements during a single pass; goes from O(2ⁿ) to O(n)
StadtbahnBI>CptViraj K (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))) |
StadtbahnBI>ExE Boss (Prevent exponential expansion by performing all replacements during a single pass; goes from O(2ⁿ) to O(n)) |
||
Zeile 1: | Zeile 1: | ||
-- This is a helper module for | -- 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 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 | end | ||
return this | return this |