Модуль : 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

	
	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