Difference between revisions of "Module:MultiReplace"
Jump to navigation
Jump to search
blackwiki>Petr Matas (Call Module:Error to avoid copy&paste programming) |
blackwiki>Ahecht (sync from sandbox. Allow call by direct invocation.) |
||
| 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 44: | Line 43: | ||
end | end | ||
return result | return result | ||
| + | end | ||
| + | |||
| + | function p.main(frame) | ||
| + | local args | ||
| + | if type(frame.args) == 'table' then | ||
| + | if frame.args[1] then | ||
| + | args = frame.args | ||
| + | if args[1] == '' then | ||
| + | args[1] = frame:getParent().args[1] | ||
| + | end | ||
| + | else | ||
| + | args = frame:getParent().args | ||
| + | end | ||
| + | else | ||
| + | args = frame | ||
| + | end | ||
| + | return MultiReplace(args) | ||
end | end | ||
return p | return p | ||
Revision as of 14:48, 18 April 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: <code>' .. (i * 2) .. ' = ' .. change.pattern .. '</code>'
}
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
if type(frame.args) == 'table' then
if frame.args[1] then
args = frame.args
if args[1] == '' then
args[1] = frame:getParent().args[1]
end
else
args = frame:getParent().args
end
else
args = frame
end
return MultiReplace(args)
end
return p