Difference between revisions of "Module:MultiReplace"

From Eat Every Plant
Jump to navigation Jump to search
m (1 revision: 'Asparagales')
 
m (1 revision: Equisetum)
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
p = {}
 
p = {}
  
function p.main(frame)
+
local function MultiReplace(args)
local args = frame:getParent().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 frame:expandTemplate{
+
return require('Module:Error').error{
title = 'Error',
+
'MultiReplace: Unpaired argument: <code>' .. (i * 2) .. ' = ' .. change.pattern .. '</code>'
args = { '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 16: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