Module:MultiReplace:修订间差异
外观
删除的内容 添加的内容
写入 enwiki 原版 Module:MultiReplace(local p + nowiki 转义) |
错误信息改为中文 + 保留 nowiki 转义 |
||
| 第11行: | 第11行: | ||
if not change.repl then |
if not change.repl then |
||
return require('Module:Error').error{ |
return require('Module:Error').error{ |
||
' |
'MultiReplace:不配对冲突:<code>' .. (i * 2) .. ' = ' .. mw.text.nowiki(change.pattern) .. '</code>' |
||
} |
} |
||
end |
end |
||
2026年6月22日 (一) 20:43的最新版本
local 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:不配对冲突:<code>' .. (i * 2) .. ' = ' .. mw.text.nowiki(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 =
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