Difference between revisions of "Module:MultiReplace"
m (1 revision: Vitis) |
m (1 revision: Equisetum) |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
p = {} | p = {} | ||
− | function | + | local function MultiReplace(args) |
− | |||
local input = args[1] or "{{{1}}}" | local input = args[1] or "{{{1}}}" | ||
local plain = args.plain == "yes" | local plain = args.plain == "yes" | ||
Line 11: | Line 10: | ||
local change = {pattern = args[i * 2], repl = args[i * 2 + 1]} | local change = {pattern = args[i * 2], repl = args[i * 2 + 1]} | ||
if not change.repl then | if not change.repl then | ||
− | return | + | return require('Module:Error').error{ |
− | + | 'MultiReplace: Unpaired argument: <code>' .. (i * 2) .. ' = ' .. change.pattern .. '</code>' | |
− | |||
} | } | ||
end | end | ||
Line 45: | Line 43: | ||
end | end | ||
return result | return result | ||
+ | end | ||
+ | |||
+ | function p.main(frame, ...) | ||
+ | local args = | ||
+ | type(frame) ~= 'table' and {frame, ...} or | ||
+ | type(frame.args) ~= 'table' and frame or | ||
+ | frame.args[1] and frame.args or | ||
+ | frame:getParent().args | ||
+ | return MultiReplace(args) | ||
end | end | ||
return p | return p |
Latest revision as of 15:04, 13 September 2018
p = {}
local function MultiReplace(args) local input = args[1] or "{{{1}}}" local plain = args.plain == "yes"
local i = 1
local changeList = {}
while args[i * 2] do
local change = {pattern = args[i * 2], repl = args[i * 2 + 1]}
if not change.repl then
return require('Module:Error').error{
'MultiReplace: Unpaired argument: ' .. (i * 2) .. ' = ' .. change.pattern .. '
'
}
end
changeList[i] = change
i = i + 1
end
local matchList = {} local pos = 1 local len = mw.ustring.len(input) local result = "" while pos <= len do local bestStart = len + 1 local bestStop = len local bestChange for _, change in ipairs(changeList) do local start, stop = mw.ustring.find(input, change.pattern, pos, plain) if start and (start < bestStart) then bestStart = start bestStop = stop bestChange = change end end result = result .. mw.ustring.sub(input, pos, bestStart - 1) if bestChange then local fragment = mw.ustring.sub(input, bestStart, bestStop) result = result .. (plain and bestChange.repl or mw.ustring.gsub(fragment, bestChange.pattern, bestChange.repl, 1)) end pos = bestStop + 1 end return result end
function p.main(frame, ...) local args = type(frame) ~= 'table' and {frame, ...} or type(frame.args) ~= 'table' and frame or frame.args[1] and frame.args or frame:getParent().args return MultiReplace(args) end
return p