Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

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

К недостаткам замены можно отнести:

  • Обновления шаблона не будут отображаться на целевой странице
  • В результате викитекст длиннее и сложнее.
  • Другие пользователи не могут увидеть, что текст был создан с использованием шаблона (и не научатся использовать шаблон)
    • Многие шаблоны добавляют скрытый комментарий, например, <!-- Template:Foo -->в конец своего вывода, чтобы смягчить эту проблему.

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

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

Синтаксис [ править ]

Для того, чтобы заменить шаблон, использовать один и тот же синтаксис, что включение , включают в себя , но subst:после открытия двойных скобок. Например, чтобы заменить шаблон {{ afd }}, введите {{subst:afd}}. Параметры могут быть включены, например, как в случае включения {{subst:afd|Some article}}.

Страницы, не входящие в пространство имен шаблона, также могут быть заменены, например {{subst:User:Cleverclogs/My box}}. Чтобы заменить текущее содержимое страницы в основном пространстве (т. Е. Без префикса пространства имен), требуются два двоеточия, как в {{subst::Page}}. Если замещенная страница или шаблон не существует, все выражение (с фигурными скобками и подстановкой :) останется неизменным в викитексте и на странице.

Используйте тот же синтаксис для замены переменных и функций синтаксического анализатора, например, {{subst:PAGENAME}}или {{subst:#switch:{{NUMBEROFADMINS}}|1=Foo|1000=Bar|#default=Baz}}.

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

Техническая реализация [ править ]

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

Это означает, что подстановка обязательно происходит перед любыми действиями, выполняемыми во время рендеринга страницы (преобразование сохраненного викитекста в HTML). В частности, замены выполняются перед включениями . Таким образом, при вводе {{subst:Help:L{{in(tut)}}k}}подстановки не производится, даже если {{ in (tut) }} возвращает текст «in» и справка: ссылка существует. На момент попытки замены включение {{ 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), когда произошла подстановка.
  • Если {{ t6 }} содержит текст "t2 | a", тогда {{ {{subst:t6}} }}будет создан викитекст "{{t2 | a}}", представленный как "[[w: Список людей по имени: a {{{2}} } | a {{{2}}}]] "Сравните это с поведением {{ {{t6}} }}, которое отображается как" {{t2 | a}} ", потому что синтаксический анализатор не интерпретирует канал как разделитель во время незамещенного стадия расширения. (Точно так же {{subst:{{subst:t6}} }}выдает викитекст {{subst:t2|a }}, который только при следующем редактировании будет заменен на [[w: Список людей по имени: a {{{2}}} | a {{{2}}}]].)

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

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

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

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

Модификатор safesubst: [ править ]

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

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

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

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

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

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

  • Используйте subst:<noinclude/>вместо обычного subst:. Тег noinclude нарушает синтаксис подстановки при сохранении шаблона, но будет удален, когда он будет заменен позже, что позволит внутренней подстановке вступить в силу.
  • Сделайте «subst:» возможным значением выражения, содержащего параметр, например {{{subst-foo|subst:}}}, которое будет оцениваться как «subst:», если параметр subst-foo не установлен. Это более гибкое решение, поскольку оно позволяет управлять поведением с помощью параметра. Например, такой шаблон можно вызвать с помощью , присвоив параметру пустое значение и, таким образом, отключив второй уровень подстановки. Если использование параметра не планируется, в качестве имени параметра часто выбирается пустая строка, давая .{{subst:Templatename|subst-foo=|..}}{{{|subst:}}}

Чтобы гарантировать, что шаблон по-прежнему будет работать должным образом, если он будет включен вместо замены, используйте safesubst:вместо subst:. Это также применимо, если шаблон также должен просматриваться напрямую, на его собственной странице (хотя в этом случае, если используется первый из вышеперечисленных методов, простой subst: все равно будет работать, поскольку теги includeonly заставят синтаксический анализатор игнорировать подпункт: при прямом просмотре).

Чтобы увидеть, что будет создавать шаблон при полном раскрытии, без необходимости явно заменять все подшаблоны и т . Д. , Можно использовать инструмент Special: ExpandTemplates .

Для получения дополнительной информации см. Страницу справки « Рекурсивное преобразование викитекста» на сайте Meta. См. Также Справка: Расчет § Замена , m: Шаблон: Пример таблицы с вычислениями, с необязательной заменой  ( редактирование обратных ссылок ) и запрос функции при подстановке .

Рекурсивная замена в экскурсиях [ править ]

Экскурсии могут публиковать сообщения от имени пользователей, например автоматически размещать содержимое вики-страницы на странице обсуждения. Однако, в отличие от обычной замены или включения, эта функция экскурсий не учитывает <includeonly>...</includeonly>аналогичную разметку. Чтобы заставить рекурсивную замену работать с помощью проводки с гидом, вы можете использовать метод Delaying Template: subst, описанный в Meta.

Пример рекурсии в действии [ править ]

Это пример использования фактического Template: Like и гипотетического Template: Foo. Вы пытаетесь включить Template: Foo и косвенно Template: Like на третьей странице посредством включения и замены. Шаблон: Like отображает такой символ Like : 👍 Like

Например, допустим, Template: Foo содержит вики-текст {{Like}}. Если вы затем включите его, используя викитекст {{Foo}}, он будет включать шаблон: Как и следовало ожидать. Но если вы используете викитекст {{subst:Foo}}, при его сохранении вы обнаружите, что {{Like}}вместо викитекста страницы шаблон заменен на викитекст: Like. Замена не была рекурсивной.

Примером рекурсии может быть шаблон: Foo, содержащий вики-текст {{{{{|safesubst:}}}Like}}. Теперь, если вы включите его, используя викитекст {{Foo}}, он будет включать шаблон: Как и раньше. И если вы сохраните, {{subst:Foo}}он заменит полный фактический вики-текст шаблона: Like. Таким образом, вы добились рекурсивной замены.

Дальнейшие примеры [ править ]

Примечание: {{!}} Заменяет |.

Заставить шаблоны вести себя по-разному при включении или замене [ править ]

Иногда желательно, чтобы шаблон при замене вел себя иначе, чем при включении. Обычный трюк для этого - использовать выражение вроде {{{{{subst|subst:}}}ns:0}}. Это возвращает пустую строку, если шаблон заменяется (поскольку внутренняя подстановка вступает в силу, давая префикс пространства имен 0, которое пусто), но "{{subst: ns: 0}}", если шаблон заменяется включен (поскольку замена не может иметь место после включения).

Распространенное приложение находится в шаблонах, которые предназначены только для подстановки, чтобы они выдавали предупреждение, если вместо этого они были ошибочно включены. Это делается в таких шаблонах, как {{ prod }}, которые предназначены для создания отметки времени (например, для добавления страниц в датированные категории), и не смогут этого сделать, если будут включены.

Для упрощения был создан шаблон {{ issubst }}. Он возвращает «да», если выполняется подстановка, или пустую строку в противном случае. Затем это можно использовать в качестве параметра функции условного синтаксического анализатора, чтобы отобразить в шаблоне метод предупреждения, если он включается, или иным образом изменить поведение шаблона в зависимости от того, включается он или заменяется.

Документирование замены [ править ]

Использование шаблона subst:не отображается автоматически в истории страниц. Поэтому особенно полезно предоставить строку викитекста, содержащую "subst:" в сводке редактирования .

Кроме того, страницы с замещенным шаблоном не отображаются в обратных ссылках, и шаблон не отображается в списке включенных шаблонов на странице редактирования. Шаблон может добавлять страницы в категорию для отслеживания замен, но перечисление этой категории на странице может загромождать список категорий на основе содержимого, в которых находится страница. Кроме того, в викитекст включаются комментарии вне тегов noinclude. Таким образом, можно использовать комментарий для упоминания шаблона. Подстановка параметров не работает внутри комментариев, но обходной путь для этого - начать предполагаемый комментарий с <!<noinclude />--таким образом, чтобы он превратился в комментарий после включения.

Ограничение [ править ]

Подмена недоступна внутри <ref>...</ref>и <gallery>...</gallery>тегами. Если вы пишете {{subst:foo}}, он не заменяется и не включается, а остается как есть (это известная ошибка, текущий статус см. В T4700 и gerrit: 272916 ).

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


Шаблоны для подстановки [ править ]

  • {{ require subst }} может заключать в оболочку шаблоны, требующие subst:
  • {{ issubst }} - возвращает "да" при замене.
  • {{ ifsubst }} - аналогично #if: волшебное слово , судя по замене или нет.

См. Также [ править ]

  • Замена чайников
  • m: Help: Substitution , более длинная и более подробная техническая страница справки на Meta
  • mw: Расширение: ExpandTemplates
  • bugzilla: 2003 - запрос функции, позволяющий пометить шаблон как заменяемый без "subst:"
  • Шаблоны, содержащие вызов самого себя с помощью "subst:" и производящие аналогичный вызов с обновленной информацией, либо заменяя, либо добавляя к предыдущей информации:
    • m: Шаблон: последнее редактирование  ( редактирование обратных ссылок ) - пример: последнее редактирование
    • m: Шаблон: история страницы  ( редактировать обратные ссылки )
  • WikiProject Проверить Википедию § Элемент программирования шаблонов содержит список статей, в которых шаблоны были заменены, а не включены. [ мертвая ссылка ] (По данным Wayback Machine, последний раз эта ссылка работала в мае 2010 года. С тех пор она, похоже, была удалена. Возможно, эта страница инструментов может помочь найти статьи, замененные, а не включенные?)