Баг в парсере CMS MediaWiki с символом равно в неявно переданном порядковом параметре

Мною был найден интересный баг в парсере CMS MediaWiki, что заключается в пропуске значения неявно переданного порядкового параметра символом «равно». Я конечно уже добавил его на официальный баг трекер, но хотелось бы поделиться им со своими читателями.

Как известно, в шаблонах MediaWiki есть два типа параметров: именованные и порядковые (числовые). Если в значении неявно переданного числового параметра будет символ «равно» (=), то параметр этот будет отброшен. В явно переданных параметрах всё нормально, как в именованных, так и в числовых.

Пример

Есть шаблон «quote»:

<span>{{{1|{{{q|{{{text|}}}}}}}}}</span>{{#if:{{{2|{{{cite|{{{source|}}}}}}}}}|<cite>— {{{2|{{{cite|{{{source|}}}}}}}}}</cite>}}

Если вызвать его с неявной передачей числовых параметров так:

{{quote|some text|source from http://site.loc?id=5}}

То второй параметр будет отброшен т.к. в нём встречается символ «равно» (=). Т.е. шаблоном будет возвращено только следующее:

<span>some text</span>

URL в пример добавил для того, чтобы было целесообразно использовать «равно», а вообще URL
ни при чём.

Однако, если вызвать этот шаблон с явной передачей 2-ого проблемного параметра как числового вот так:

{{quote|some text|2=some source from http://site.loc?id=5}}

или как именованного:

{{quote|some text|cite=some source from http://site.loc?id=5}}

То всё будет работать как и задумывалось, т.е. шаблон вернёт это:

<span>some text</span><cite>— source from http://site.loc?id=5</cite>

Проблема со знаком «равно» в параметрах шаблонов MediaWiki наблюдается только у неявно переданных порядковых аргументов, а у именованных такого нет, т.к. они всегда передаются явно.

Решение

Проблема решается просто. Для этого можно:

  • передавать порядковые параметры явно также как и именованные.
  • использовать всевозможные мнемоники символа «равно» (=) — &equals;, &#61;, U+003D.

Версии CMS, устранение

Замечу, что баг был найден на версии MediaWiki 1.21.1, но он есть и в более старых версиях, и на более новых версиях он никуда не пропал.