Модуль:Multireplace

Материал из Тептар — свободной энциклопедии
Версия от 19:32, 31 января 2022; Mansur700 (обсуждение | вклад) (Новая страница: «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 ch...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Модуль обеспечивает работу шаблона {{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
	
	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