Подстановка — это функция, посредством которой, когда редактор сохраняет страницу, элемент в викикоде навсегда заменяется его текущим значением. В частности, шаблоны и магические слова могут быть заменены в качестве альтернативы включению . Разница в том, что когда шаблон заменяется на странице, его внешний вид на этой странице больше не будет зависеть от последующих изменений, внесенных в сам шаблон (как в случае включенного шаблона).
Замена выполняется с помощью subst:
модификатора после двойных открывающихся скобок. Например, чтобы заменить шаблон {{ afd }} , введите {{subst:afd}}
. Вы можете проверить полученный вики-текст перед сохранением, нажав «Показать изменения» (и посмотреть, как будет выглядеть страница, нажав «Показать предварительный просмотр»).
Переменные и функции синтаксического анализатора также можно заменять, что означает, что их текущее значение будет постоянно записано на странице — они не будут переоцениваться всякий раз, когда кто-то просматривает страницу.
В общем, шаблоны скорее транспонируются , чем заменяются, хотя есть некоторые, которые специально разработаны для замены (и могут не работать, если их транспонировать). Вот некоторые причины для замены шаблонов:
Недостатки замещения могут включать в себя:
<!-- Template:Foo -->
в конец вывода, чтобы смягчить эту проблему.Зависящие от времени переменные подставляются, чтобы сделать отображаемую страницу независимой от времени, в которое она просматривается. Подстановка зависящих от страницы переменных делает полученный викитекст независимым от переименования страницы и копирования на другую страницу.
Более подробные инструкции, включая списки шаблонов, которые следует или не следует заменять, см. в разделе Wikipedia:Substitution .
Чтобы заменить шаблон, используйте тот же синтаксис, что и для transclusion , но включите subst:
после открывающих двойных скобок. Например, чтобы заменить шаблон {{ afd }} , введите {{subst:afd}}
. Параметры могут быть включены как в случае transclusion, например {{subst:afd|Some article}}
.
Страницы, не входящие в пространство имен шаблона, также могут быть заменены, например {{subst:User:Cleverclogs/My box}}
. Чтобы заменить текущее содержимое страницы в основном пространстве (т. е. без префикса пространства имен), требуются два двоеточия, как в {{subst::Page}}
. Если замененная страница или шаблон не существует, все выражение (с фигурными скобками и subst:) останется неизменным в викитексте и на странице.
Используйте тот же синтаксис для замены переменных и функций синтаксического анализатора, например {{subst:PAGENAME}}
или {{subst:#switch:{{NUMBEROFADMINS}}|1=Foo|1000=Bar|#default=Baz}}
.
Между открывающимися скобками и «subst:» могут быть пробелы. Однако рекомендуется не ставить пробелы или переводы строк сразу после «subst:», так как это не будет работать в каждом случае.
Замена является частью процесса, выполняемого при сохранении страницы, и приводит к тому, что вики-текст, сохраненный в результате редактирования, отличается от текста, который пользователь фактически ввел в окне редактирования. Другие замены, выполняемые в ходе этого процесса, включают расширение ссылок с помощью трюка с трубой и замену нескольких тильд подписями и временными метками.
Это означает, что подстановка обязательно происходит до любых действий, выполняемых во время рендеринга страницы (преобразования сохраненного викитекста в HTML). В частности, подстановки выполняются до транспозиций . Таким образом, набор текста {{subst:Help:L{{in(tut)}}k}}
не выполнит подстановку, даже если {{ in(tut) }} возвращает текст "in" и Help:Link существует. Транспозицию {{ in(tut) }} еще не выполнили, когда была предпринята попытка подстановки. Однако замените {{in(tut)}}
на {{subst:in(tut)}}
, и обе подстановки будут выполнены в ожидаемом порядке.
Сходным образом:
{{subst:#if:{{x0}}|yes|no}}
дает викитекст "да", хотя {{ x0 }} является пустым шаблоном, поскольку условный параметр вычисляется как непустая строка "{{x0}}". Однако {{subst:#if:{{subst:x0}}|yes|no}}
выдает "нет", поскольку сначала выполняется внутренняя подстановка.{{subst:#expr:2*{{{p|3}}}}}
возвращается ошибка выражения: нераспознанный знак пунктуации "{" , поскольку неопределенный параметр {{{p}}} не был заменен своим значением по умолчанию (3) при подстановке.{{ {{subst:t6}} }}
будет создан викитекст "{{ t2|a }}", отображаемый как "[[w:Список людей по имени: a{{{2}}}|a{{{2}}}]]" Сравните это с поведением {{ {{t6}} }}
, которое отображается как "{{ t2|a }}", поскольку синтаксический анализатор не интерпретирует вертикальную черту как разделитель на этапе расширения без замены. (Аналогично, {{subst:{{subst:t6}} }}
создает викитекст {{subst:t2|a }}
, который только при следующем редактировании будет заменен на [[w:Список людей по имени: a{{{2}}}|a{{{2}}}]].)Нажатие кнопки «Показать изменения» во время редактирования показывает викитекст, который получится после подстановки и других немедленных замен. Нажатие кнопки «Показать предварительный просмотр» показывает, как будет выглядеть отрисованная страница после этих замен.
Если страница заменяет саму себя (например, в части noinclude страницы шаблона), она заменяет старую версию, какой она была до текущего редактирования.
Если расширение замещенного шаблона само содержит экземпляры синтаксиса subst:
, то подстановки выполняются рекурсивно. Однако подстановка не является автоматически рекурсивной — если замещенный шаблон содержит обычные трансклюзионные включения или переменные и функции синтаксического анализатора, которые явно не замещены, то они не будут замещены.
subst:
Обратите внимание также, что если в шаблоне, который транслируется , появляются экземпляры синтаксиса , то они будут отображены без изменений (как "{{subst:...}}"), поскольку на этапе рендеринга подстановка в викитексте невозможна. Эту функцию можно использовать для управления поведением шаблона (см. § Заставить шаблоны вести себя по-разному при транслировании или подстановке). Однако это может быть неудобно, когда шаблон разработан так, чтобы его можно было как транслировать, так и подставлять — в этом случае safesubst:
вместо этого можно использовать subst:
(см. § Модификатор safesubst:).
Модификатор subst:
можно заменить альтернативным модификатором safesubst:
. Оба ведут себя одинаково, за исключением случаев, когда они встречаются во время незамещенного расширения (трансклюзии или прямого просмотра) шаблона. В такой ситуации код {{subst:...}}
остается неанализируемым, тогда как {{safesubst:...}}
обрабатывается так, как если бы модификатора не было, — и поэтому подшаблон трансклюдируется или оценивается переменная или функция парсера.
Следовательно, safesubst:
модификатор используется в коде шаблонов, которые разработаны для создания рекурсивной подстановки при подстановке; но которые также предназначены для работы при транспонировании или просто для прямого просмотра. В отличие от использования subst:
модификатора, такие шаблоны будут ломаться в таких случаях транспонирования (и, возможно, при прямом просмотре).
Подробную информацию о том, как это реализовать (в частности, как предотвратить выполнение подстановки сразу после сохранения кода шаблона), см. в разделе Рекурсивная подстановка.
Как упоминалось выше, подстановка не является автоматически рекурсивной. Поэтому, если замещенный шаблон имеет код, содержащий трансляции других шаблонов и функций парсера, этот код будет скопирован «как есть» в результирующий викитекст – сами транслированные элементы не будут замещены.
Чтобы подстановка работала рекурсивно, необходимо включить subst:
синтаксис в код вызывающего шаблона. Однако вы не можете сделать это, просто набрав "subst:" в шаблоне, так как подстановка будет выполнена сразу после сохранения шаблона. Есть два способа обойти эту проблему:
subst:<noinclude/>
вместо plain subst:
. Тег noinclude разбивает синтаксис подстановки при сохранении шаблона, но будет удален при его последующей замене, позволяя внутренней подстановке вступить в силу. В качестве альтернативы, большая часть кода шаблона может быть обернута в <onlyinclude>...</onlyinclude>
. Тогда обернутый код игнорируется на самой странице шаблона, но не при его включении.{{{subst-foo|subst:}}}
, , которое будет оцениваться как "subst:" при условии, что параметр subst-foo не задан. Это более гибкое решение, поскольку оно позволяет управлять поведением через параметр. Например, такой шаблон может быть вызван с помощью , присваивая параметру пустое значение и тем самым отключая второй уровень подстановки. Если не планируется использовать параметр, именем параметра часто выбирается пустая строка, давая , но это может иметь неожиданные результаты, если пустому параметру строки присваивается значение (например, ).{{subst:Templatename|subst-foo=|...}}
{{{|subst:}}}
{{Templatename|=foo}}
Чтобы гарантировать, что шаблон будет работать так, как задумано, если он включен вместо замены, используйте safesubst:
вместо subst:
. Это также применимо, если шаблон также будет просматриваться напрямую, на его собственной странице (хотя в этом случае, если используется первый из вышеперечисленных методов, обычный subst: все равно будет работать, так как теги includeonly заставят синтаксический анализатор игнорировать subst: при прямом просмотре).
Чтобы увидеть, что будет создано в полностью развернутом виде, без необходимости явной замены всех подшаблонов и т. д., можно использовать инструмент Special:ExpandTemplates .
Для получения дополнительной информации см. страницу справки Рекурсивное преобразование викитекста на Meta. См. также Help:Calculation § Substitution , m:Template:Example table with computings, with Optional substitution (backlinks edit) , и запрос на функцию на substall.
Экскурсии могут делать сообщения от имени пользователей, например, автоматически размещать содержимое страницы вики на странице обсуждения. Однако, в отличие от обычной подстановки или транспозиции, эта функция экскурсий не учитывает <includeonly>...</includeonly>
и подобную разметку. Чтобы рекурсивная подстановка работала через публикацию экскурсий, можно использовать метод Delaying substitution with Template:subst.
Это пример использования реального Template:Like и гипотетического Template:Foo. Вы пытаетесь включить Template:Foo и косвенно Template:Like на третью страницу через включение и замену. Template:Like отображает этот символ: Like
Например, предположим, что Template:Foo содержал wikitext {{Like}}
. Если вы затем транспонируете его, используя wikitext {{Foo}}
, это транспонирует Template:Like , как и ожидалось. Но если вы используете wikitext {{subst:Foo}}
, при сохранении вы обнаружите, что wikitext {{Like}}
был заменен вместо wikitext страницы Template:Like. Замена не была рекурсивной.
Примером рекурсии может быть, если Template:Foo содержит wikitext {{{{{|safesubst:}}}Like}}
. Теперь, если вы транспонируете его, используя wikitext {{Foo}}
, это транспонирует Template:Like точно так же, как и раньше. И если вы сохраните, {{subst:Foo}}
то заменит полный фактический wikitext Template:Like. Таким образом, вы достигли рекурсивной подстановки.
Примечание: {{!}} заменяет |.
Иногда желательно, чтобы шаблон вел себя по-разному при подстановке, а не при включении. Обычный трюк для этого — использовать выражение типа {{{{{subst|subst:}}}ns:0}}
. Это вычисляется как пустая строка, если шаблон заменяется (поскольку внутренняя подстановка вступает в силу, давая префикс пространства имен 0, который пуст), но как "{{subst:ns:0}}", если шаблон включается (поскольку подстановка не может иметь место после включения).
Распространенное применение — в шаблонах, которые разработаны только для замены, чтобы заставить их выдавать предупреждение, если они ошибочно включены вместо этого. Это делается в шаблонах, таких как {{ prod }} , которые разработаны для создания временной метки (например, для добавления страниц в датированные категории), и не смогут сделать этого, если включены.
Для упрощения этого был создан шаблон {{ issubst }} . Он возвращает "yes", если выполняется подстановка, или пустую строку в противном случае. Затем это можно использовать в качестве параметра функции условного синтаксического анализатора, чтобы заставить шаблон отображать метод предупреждения, если он включается, или иным образом изменить поведение шаблона в зависимости от того, включается ли он или заменяется.
Использование шаблона subst:
не отображается автоматически в истории страниц. Поэтому предоставление строки викитекста, содержащей "subst:" в сводке правок особенно полезно.
Кроме того, страницы с замененным шаблоном не отображаются в обратных ссылках, а шаблон не отображается в списке включенных шаблонов на странице редактирования. Шаблон может добавлять страницы в категорию для отслеживания замен, но указание этой категории на странице может загромождать список категорий контента, в которых находится страница. Кроме того, комментарии вне тегов noinclude включаются в викитекст. Таким образом, комментарий можно использовать для упоминания шаблона. Замена параметров не работает внутри комментариев, но обходным путем для этого является начало предполагаемого комментария с <!<noinclude />--
, чтобы он превратился в комментарий после включения.
Замена недоступна внутри тегов <ref>...</ref>
и <gallery>...</gallery>
. Если вы пишете {{subst:foo}}
, она не заменяется и не транспонируется, а остается как есть (это известная ошибка, см. T4700 и gerrit:272916 для получения информации о текущем статусе).
Однако это ограничение можно обойти, используя волшебное слово #tag. Если вы напишете, например, {{safesubst:#tag:ref|content of the reference}}
, содержимое ссылки будет заменено, а {{#tag:ref|...}}
будет заменено на <ref>...</ref>
. Более конкретный пример: если вы напишете, например , , {{safesubst:#tag:ref|...Title=ExampleTitle|archivedate={{subst:TODAY}}|Edition=Hardcover...}}
то программное обеспечение выполнит замену текста в последнем поле, а {{#tag:ref|...}}
будет заменено на <ref>...</ref>
вокруг измененного текста, а ссылка будет сохранена с заменой; она будет сохранена как " {{|...Title=ExampleTitle|archivedate=29 January 2016|Edition=Hardcover|...}}
" с <ref>...</ref>
вокруг нее. Другими словами, сначала программное обеспечение расширит шаблоны, а затем поместит этот расширенный текст в теги ссылок.