stringtranslate.com

Помощь:Замена

Подстановка — это функция, посредством которой, когда редактор сохраняет страницу, элемент в викикоде навсегда заменяется его текущим значением. В частности, шаблоны и магические слова могут быть заменены в качестве альтернативы включению . Разница в том, что когда шаблон заменяется на странице, его внешний вид на этой странице больше не будет зависеть от последующих изменений, внесенных в сам шаблон (как в случае включенного шаблона).

Замена выполняется с помощью subst:модификатора после двойных открывающихся скобок. Например, чтобы заменить шаблон {{ afd }} , введите {{subst:afd}}. Вы можете проверить полученный вики-текст перед сохранением, нажав «Показать изменения» (и посмотреть, как будет выглядеть страница, нажав «Показать предварительный просмотр»).

Переменные и функции синтаксического анализатора также можно заменять, что означает, что их текущее значение будет постоянно записано на странице — они не будут переоцениваться всякий раз, когда кто-то просматривает страницу.

Когда использовать замену

В общем, шаблоны скорее транспонируются , чем заменяются, хотя есть некоторые, которые специально разработаны для замены (и могут не работать, если их транспонировать). Вот некоторые причины для замены шаблонов:

Недостатки замещения могут включать в себя:

Зависящие от времени переменные подставляются, чтобы сделать отображаемую страницу независимой от времени, в которое она просматривается. Подстановка зависящих от страницы переменных делает полученный викитекст независимым от переименования страницы и копирования на другую страницу.

Более подробные инструкции, включая списки шаблонов, которые следует или не следует заменять, см. в разделе 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)}}, и обе подстановки будут выполнены в ожидаемом порядке.

Сходным образом:

Нажатие кнопки «Показать изменения» во время редактирования показывает викитекст, который получится после подстановки и других немедленных замен. Нажатие кнопки «Показать предварительный просмотр» показывает, как будет выглядеть отрисованная страница после этих замен.

Если страница заменяет саму себя (например, в части noinclude страницы шаблона), она заменяет старую версию, какой она была до текущего редактирования.

Если расширение замещенного шаблона само содержит экземпляры синтаксиса subst:, то подстановки выполняются рекурсивно. Однако подстановка не является автоматически рекурсивной — если замещенный шаблон содержит обычные трансклюзионные включения или переменные и функции синтаксического анализатора, которые явно не замещены, то они не будут замещены.

subst:Обратите внимание также, что если в шаблоне, который транслируется , появляются экземпляры синтаксиса , то они будут отображены без изменений (как "{{subst:...}}"), поскольку на этапе рендеринга подстановка в викитексте невозможна. Эту функцию можно использовать для управления поведением шаблона (см. § Заставить шаблоны вести себя по-разному при транслировании или подстановке). Однако это может быть неудобно, когда шаблон разработан так, чтобы его можно было как транслировать, так и подставлять — в этом случае safesubst:вместо этого можно использовать subst:(см. § Модификатор safesubst:).

Модификатор safesubst:

  • WP:SAFESUBST

Модификатор subst:можно заменить альтернативным модификатором safesubst:. Оба ведут себя одинаково, за исключением случаев, когда они встречаются во время незамещенного расширения (трансклюзии или прямого просмотра) шаблона. В такой ситуации код {{subst:...}}остается неанализируемым, тогда как {{safesubst:...}}обрабатывается так, как если бы модификатора не было, — и поэтому подшаблон трансклюдируется или оценивается переменная или функция парсера.

Следовательно, safesubst:модификатор используется в коде шаблонов, которые разработаны для создания рекурсивной подстановки при подстановке; но которые также предназначены для работы при транспонировании или просто для прямого просмотра. В отличие от использования subst:модификатора, такие шаблоны будут ломаться в таких случаях транспонирования (и, возможно, при прямом просмотре).

Подробную информацию о том, как это реализовать (в частности, как предотвратить выполнение подстановки сразу после сохранения кода шаблона), см. в разделе Рекурсивная подстановка.

Рекурсивная подстановка

Как упоминалось выше, подстановка не является автоматически рекурсивной. Поэтому, если замещенный шаблон имеет код, содержащий трансляции других шаблонов и функций парсера, этот код будет скопирован «как есть» в результирующий викитекст – сами транслированные элементы не будут замещены.

Чтобы подстановка работала рекурсивно, необходимо включить subst:синтаксис в код вызывающего шаблона. Однако вы не можете сделать это, просто набрав "subst:" в шаблоне, так как подстановка будет выполнена сразу после сохранения шаблона. Есть два способа обойти эту проблему:

Чтобы гарантировать, что шаблон будет работать так, как задумано, если он включен вместо замены, используйте 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>вокруг нее. Другими словами, сначала программное обеспечение расширит шаблоны, а затем поместит этот расширенный текст в теги ссылок.

Шаблоны для замены

Смотрите также