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

{{safesubst: p {{safesubst: #if {{{1}}}: {{{2}}} | 1 | 2}} | {{{3}}} |}}

Документация по шаблону [ просмотреть ] [ изменить ] [ история ] [ очистить ]

С помощью этого шаблона в анализаторе функция по ParserFunctions коллекции с именами , начинающихся с «#if» может использоваться таким образом, чтобы они не отогнать пространства и новую строку из «тогда» и «еще» части. Пробелы по-прежнему не влияют на результат состояния. Параметр 1 выбирает тип if как "eq", "expr", "exist" или "error" (для #iferror) или пустой "||" для простого if-there (для #if). Шаблон может быть многократно вложен в 6 или 7 уровней, один внутри другого, потому что самый внешний завершается перед запуском внутренних уровней then / else.

Этот шаблон можно заменить, если выражение или сравнение не изменится. Функционально знак пробела хранится внутри как простой пробел. Обратите внимание, что во многих случаях может использоваться пустой тег nowiki ("<nowiki />") без шаблона: If , чтобы разрешить пробел (например, "<nowiki /> xx") где угодно, но внутреннее хранилище помещает 43-символьный маркер для "<nowiki />" в длине строки. Однако для тега nowiki нет дополнительной глубины раскрытия, например, в конце пробела "zz <nowiki />".

использование

Где p реализовано в подтверждение утверждения, а q реализовано в отрицании утверждения

  • {{if||x| p | q }}дает "р". Обратите внимание на пару вертикальных полосок, окружающих пустой первый параметр.
  • {{if|expr|2<3| p | q }} дает "п"
  • {{if|eq| u |u| p | q }} дает "п"
  • {{if|exist| Help:Link | p | q }} дает "п"
  • {{if|error|{{#expr:x}}| p | q }} дает "п"

Сравнивать:

  • {{#if:x| p | q }} дает "п"
  • {{#ifexpr:2<3| p | q }} дает "п"
  • {{#ifeq: u |u| p | q }} дает "п"
  • {{#ifexist: Help:Link | p | q }} дает "п"
  • {{#iferror:{{#expr:x}}| p | q }} дает "п"

Например, с шаблоном с именем Template: имя шаблона, содержащего код {{#ifeq: {{{parameter}}} |u| p | q }}, ввод кода {{{Template name|parameter=u}}}в статью дает «p», но {{{Template name|parameter=v}}}дает «q».

Текст предложения then или else обрабатывается и раскрывается только при срабатывании триггера. Следовательно, любые используемые шаблоны раскрываются только после сопоставления предложения then или else, в противном случае они пропускаются как просто парные фигурные скобки "{{" с "}}".

Отступ

Делая отступ в разметке, необходимо соблюдать осторожность, чтобы избежать лишних символов новой строки при отступе "}}" на следующей строке. Дополнительная прутковая труба "|" может быть добавлен после предложения else, чтобы завершить этот текст, и позволить "}}" быть помещенным в любом месте без добавления новой строки в предложение else. Например:

  • {{если | {{{1 |}}} | то найден параметр 1 | иначе параметр 1 отсутствует | ← лишний "|" заканчивается else-clause}}

Когда предложение else смещается к следующей строке, добавляется новая строка (CR / LF):

  • {{если | {{{1 |}}} | затем нашел параметр 1 ← здесь дополнительная новая строка | иначе без параметра 1 |}}

Чтобы сделать отступ для else-clause, разделите комментарий HTML-формы как " <!--" со следующей строкой как " -->|else...". Если каждое предложение then и else не будет тщательно протестировано, чтобы следить за дополнительными символами новой строки, то результаты, скорее всего, приведут к разрыву строк с дополнительными разрывами строк для каждой новой строки. По этой причине глобальное редактирование с простым поиском и заменой " {#if:" на " {if||", вероятно, оставит проблемы с новой строкой, где бы исходная разметка не была перенесена с отступом либо предложения else или "}}" каждой структуры if . Отступ в предложении then не проблема.

Соображения производительности

Поскольку Template: If должен подготовить параметры для #if, #ifeq, #ifexpr,(и т. Д.), При его использовании возникают небольшие накладные расходы. Он был рассчитан на работу со скоростью 290 экземпляров в секунду, поэтому для 29 сравнений потребуется всего 0,1 с, десятая доля секунды для выполнения 29 сравнений. Каждое вложенное использование добавляет 5 уровней к глубине раскрытия шаблона, так что 7 вложенных шаблонов if будут использовать 35 уровней (5 * 7) из 41-уровневого лимита .

Используя Р- , если синтаксис: Аналогичное если-структура может быть кодирован без шаблона: если , при использовании и шаблонов в «Р-если» структуры. Шаблон: P1 всегда возвращает параметр 1, а P2 возвращает 2-й. Итак, сравнение 4 и 3 может быть закодировано с использованием синтаксической формы P-if:{{P1}}{{P2}}

Пример #ifexpr:"{{P{{#ifexpr: 4 > 3|1|2}}| then 4 greater| else 4 lower}}"
Результат для #ifexpr: «затем на 4 больше» ← сравнение произведено {{P1}}.

Глубина раскрытия P-if составляет всего 4 уровня, но вложение then-clause или else-clause может быть более запутанным, чем использование вложенных уровней Template: if.

Пример #if:"{{P{{#if:{{{2|x}}}|1|2}}| then {2} set| else {2} empty}}"
Результат для #if: "else {2} empty" ← вызванное сравнение {{P2}}.

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