Модуль:Multireplace
Перейти до навігації
Перейти до пошуку
Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]
Забезпечує роботу шаблону {{multireplace}}.
Документація вище включена з Модуль:Multireplace/документація. (ред. | історія) Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього модуля. Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки. |
p = {}
function p.main(frame)
local args = frame:getParent().args
local input = args[1] or "{{{1}}}"
local plain = args.plain == "yes"
local i = 1
local changeList = {}
while args['?' .. i] do
local change = {pattern = args['?' .. i], repl = args['!' .. i]}
if not change.repl then
return frame:expandTemplate{
title = 'Error',
args = { 'Помилка: непарний аргумент: <code>?' .. (i) .. ' = ' .. change.pattern .. '</code>' }
}
end
changeList[i] = change
i = i + 1
end
if i==1 then --передано позиційні параметри
i = 2
while args[i] do
local change = {pattern = args[i], repl = args[i + 1]}
if not change.repl then
return frame:expandTemplate{
title = 'Error',
args = { 'Помилка: непарний аргумент: <code>' .. (i) .. ' = ' .. change.pattern .. '</code>' }
}
end
changeList[i / 2] = change
i = i + 2
end
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
return p