Справка:Подстановка
Примечание: Редактируя эту страницу, вы соглашаетесь на передачу своего вклада по лицензии CC0. Подробнее — в проекте Помощь с общественным достоянием. Некоторые старые изменения для этой страницы были импортированы под лицензией CC BY-SA. Только новые вклады находятся в общественном достоянии (ОД). |
Подстановка — это автоматическое преобразование викитекста страницы, осуществляемое при записи новой версии страницы. Подстановка может быть применена к шаблонам, переменным и функциям анализатора.
При подстановке шаблона его вызов заменяется его содержимым, в котором указания на параметры заменяются значениями, указанными в вызове. Это позволяет использовать шаблон как макрокоманду, заменяемую один раз при записи страницы, а не регулярно при её просмотре, как при обычном вызове шаблона.
При подстановке переменной или функции анализатора указание на неё заменяется её значением или результатом.
Подстановка осуществляется путём размещения одного из волшебных слов subst:
или safesubst:
после двойных открывающих фигурных скобок без промежуточных пробелов, как в примерах: {{subst:FULLPAGENAME}}
; {{safesubst:FULLPAGENAME}}
.
Вариант safesubst:
используется при многоуровневой подстановке.
Результат подстановки (в виде разницы с сохранённым викитекстом) можно увидеть до (или без) сохранения, нажав на кнопку «Показать изменения».
Тем не менее, если текст занимает более одного абзаца, просмотр с помощью разницы не очень подходит для копирования результата (например, для постепенной замены без сохранения каждого шага), так как вместе с текстом окажутся скопированы знаки +
в полях формы сравнения.
Применения подстановки
Подстановка шаблона позволяет:
- Сделать конечный текст страницы независимым от шаблона:
- Страница не изменится при изменении шаблона.
- Страница может быть скопирована на другую вики MediaWiki без копирования шаблона.
- Снизить нагрузку на сервер, вызванную рендерингом страниц.
- Анализировать и демонстрировать принцип работы шаблонов. При этом следует учитывать, что в некоторых случаях шаблон с подстановкой работает по-другому, чем без подстановки.
- Прояснить связь викитекста и конечного текста страницы (но иногда, наоборот, подстановка затрудняет понимание этой связи).
Подстановка зависящей от времени переменной позволяет:
- Сделать конечный текст страницы независимым от текущего времени.
Подстановка переменной, зависящей от страницы, позволяет:
- Сделать конечный текст страницы не меняющимся при переименовании страницы или при копировании её викитекста на другую страницу (но если переменная PAGENAME используется как название шаблона в примерах использования в его документации, размещённой на его же странице в тегах
noinclude
, то подстановка переменной может создать проблемы при переименовании или копировании кода).
Некоторые расширения MediaWiki добавляют функции и теги анализатора, которые при использовании в шаблоне с параметрами работают только тогда, когда шаблон используется с подстановкой.
Обзор
При обсуждении подстановки на этой странице будут использоваться следующие термины. Пользовательский шаблон — страница, подстанавливаемая кодом {{subst:название страницы без пространства имён }} (для страниц в пространстве имён Шаблон:) или {{subst:название страницы с пространством имён }} (для страниц в других пространствах имён). Встроенный шаблон — переменная или функция анализатора, подстанавливаемая аналогичным кодом.
Подстановка — это отдельный процесс, который выполняется до раскрытия любых неподстанавливаемых шаблонов, переменных, функций анализатора или параметров.
Вызов с подстановкой может включать в себя другие вызовы с подстановкой. Аналогично, подстанавливаемый шаблон также может включать вызовы с подстановкой. В первую очередь выполняется подстановка в названии вызываемого шаблона или функции анализатора, в определении параметров подстанавливаемого шаблона или функции, а также в тексте подстанавливаемого шаблона.
Поскольку раскрытие других элементов викитекста происходит после подстановки, если в вызове с подстановкой есть двойные фигурные скобки, то они будут рассматриваться как обычный текст.
Поэтому при вызове с подстановкой может использоваться параметр с названием, включающим фигурные скобки (например {{subst:foo|a{{bc}}d=...}}
), которому соответствует параметр с тем же названием в тексте шаблона (например {{{a{{bc}}d}}}
).
При попытке применить подстановку к несуществующему шаблону никакой подстановки не произойдёт, а префикс subst:
останется в викитексте.
После завершения процесса подстановки, как и обычно, происходят раскрытие шаблонов и другая обработка викитекста. Поскольку на этом этапе подстановка уже завершена, возникшие в ходе подстановки несовпадения названий параметров не могут быть исправлены. (См. также раздел про частичную подстановку.)
Подстановка возможна только тогда, если все следующие значения полностью раскрыты, и их конечный результат известен:
- название шаблона, переменной или функции анализатора
- в случае шаблона: названия параметров в вызове шаблона и в самом шаблоне
- в случае #if, #ifexpr, #ifexist и #iferror, параметр после двоеточия
- в случае #ifeq, параметр после двоеточия и следующий за ним
- в случае #switch, параметр после двоеточия, а также выражения слева от знаков равенства
Поскольку, как уже было сказано, подстановка производится до раскрытия, указанные выше требования к известности значений не могут быть соблюдены, если для вычисления этих значений нужно раскрытие без подстановки.
При подстановке других, не упомянутых выше функций анализатора, не до конца определённое значение параметра после двоеточия приведёт к тому, что функция анализатора будет применена к викитексту с фигурными скобками, а не к раскрытому викитексту, что повлияет на результат.
Примеры:
- В коде {{subst:Help:L{{tc}}k}}, который использует Template:tc, подстановка не будет произведена, так как страницы Help:L{{tc}}k не существует, хотя викитекст Help:L{{tc}}k был бы раскрыт как Help:Link. В результате конечный викитекст будет таким же, как исходный, и будет отображён как {{subst:Help:Link}}.
- Код {{#if:{{void|abc}}|yes|no}} (использующий Template:void) отображается как «no», и соответственно, код {{subst:#if:{{subst:void|abc}}|yes|no}} также выдаёт результат «no». С другой стороны, код {{subst:#if:{{void|abc}}|yes|no}} даёт викитекст «yes», так как вызов Template:void не раскрывается до завершения подстановки.
В принципе, сразу после полной подстановки викитекст отображается так же, как викитекст, использующий обычное включение вместо подстановки.
Тем не менее, следует отметить особый случай при подстановке функции анализатора, в аргументах которой есть указание викитекстового параметра со значением по умолчанию (справка на английской Википедии). Если этому параметру не передано значение, то при подстановке значение по умолчанию использовано не будет. В частности, это приведёт к ошибке из-за некорректного выражения при подстановке #expr:
- Вызов {{#expr:2*{{{p|3}}}}} выдаст значение 6, но вызов {{subst:#expr:2*{{{p|3}}}}} выдаст ошибку: Expression error: unrecognised punctuation character "{"
При подстановке шаблона, содержащего такой вызов, {{{p|3}}} будет заменено или значением {{{p}}}, или 3, так что в этом случае вышеприведённое обстоятельство создавать проблем не будет.
Вызов {{ {{t6}} }}, где шаблон Template:t6 содержит код t2demo|a<noinclude>[[Category:Demo templates]]</noinclude>
, выведет на страницу {{ t2demo|a }}.
Вызов {{subst:{{subst:t6}} }} приведёт к викитексту {{subst:t2demo|a }}, который будет отображён на странице в этом же виде, но при следующей правке заменён в коде на start-a -middle-{{{2}}}-end.
Вызов {{ {{subst:t6}} }} приведёт к викитексту {{ t2demo|a }}, который будет отображён на странице как start-a -middle-{{{2}}}-end.
Так происходит потому, что в случаях без подстановки и с полной подстановкой символы вертикальной черты в вызовах шаблонов, кроме находящихся в вызовах внутренних шаблонов, параметрах шаблонов, ссылках и тегах изображений, определяют разделение определений параметров друг от друга и от названия шаблона.
This separation does not depend on possible extra pipe characters in the expanded form of the template name and parameter definitions.
However, if after substitution of an inner template the pipe character is in the outer template call it is one like any other and plays its part in determining the separation.
In other words, parsing is done first once for substitution, and then once for rendering, but in both cases not an extra time in between.
In the case of substitution of the inner template only, two subsequent parsings are effective.
When substituting a template containing {{{p|q}}} (a parameter tag with default) this results in the value of p if it is defined, and otherwise in q. For example, using {{timc|t pd}} (in English Wikipedia), {{subst:t pd}} gives the wikitext 2. If a page substitutes itself (e.g. in the noinclude-part of a template page) it substitutes the old version.
Usage considerations
As mentioned, a change of an ordinary template after substitution does not affect the page in which it was substituted, and a substituted variable depending on time no longer depends on time, etc. However, a substitution of e.g. {{#expr:2*3}} does not affect rendering at all.
The relationship between wikitext of a page and its rendering can become easier to understand after substitution, because one has all wikitext together, and parameter substitutions have been performed.
It can also become more complex. Separately focusing on understanding a template call and understanding the template content can be easier. Wikitext after substitution is often more complex than when the required wikitext would have been written directly.
Unlike a template call (if one knows about templates), wikitext after substitution does not show how one can produce a similar result. The wikitext can be long and complicated, and therefore cumbersome to write directly, or it can be simple, e.g. a number resulting from a computation, but cumbersome to find directly. When studying the wikitext of a page one may think that this wikitext is what one is supposed to write and find directly to get the result, even in cases where that would be very impractical.
In such cases documentation of the template call is useful. Just like in computer programming we change the source code and/or the data to produce new results, and we do not directly change the object file, here we would change the template calls and/or the templates, instead of changing the wikitext resulting from substitution directly.
Ordinary templates
In the case of substituting an ordinary template, the template tag is replaced by the wikitext of the template, with the parameter values substituted for the parameters.
- Example: m:Template:t2, containing
-
start-{{{1}}}-middle-{{{2}}}-end
- and called as
{{subst:t2|[[a]]|{{tc}}}}
(see {{Tc }}) gives the wikitext:start-[[a]]-middle-{{tc}}-end
, rendering as- start-a-middle-in-end.
Substitution removes the noinclude parts and the includeonly tags.
Parameters:
- A substitution with p=r replaces {{{p}}} and {{{p|q}}} by
r
. This includes the cases thatr
is of the form {{{s}}} or {{{s|t}}}. - A substitution with undefined
p
preserves{{{p}}}
and replaces {{{p|q}}} by the defaultq
(in English Wikipedia).
With subst:
the replacement of a template tag by wikitext does not work recursively.
For full recursive substitution use Special:ExpandTemplates.
See also substall, and multilevel substitution below.
Stepwise substitution of templates including other templates including more templates etc. can be useful for analyzing and documenting the behaviour of complex templates.
However, after a substitution a page may render differently, e.g. if templates produce braces, pipes, and/or equals signs which after substitution determine expansion of other templates, but without substitution are treated as plain text.
In the absence of parameters, template substitution can be compared with copying the wikitext, or the rendering of a previewed or saved {{ msgnw:
pagename }} inclusion.
However, template substitution excludes <noinclude>
parts, removes <includeonly>
tags, and replaces undefined parameters with defaults by those defaults.
Predefined templates
In the case of substituting a predefined template, without parameters depending on other templates, the tag is replaced by the result.
subst:
has to be added directly in front of the predefined template name without intervening spaces.Applying subst to a variable works like applying it to a template. E.g. a timestamp:
- {{subst:CURRENTYEAR}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTDAY}} T {{subst:CURRENTTIME}} [[w:UTC|]]
may give the wikitext
- 2010-04-10 T 06:30 [[w:UTC|UTC]]
rendered as
- 2010-04-10 T 06:30 UTC
In the case of substituting a predefined template with a parameter depending on another template, that has to be substituted too, with a separate subst:
modifier, otherwise the result is undefined.
{{subst:UC:{{subst:tc}}}}
- gives IN, the same wikitext as {{UC:{{tc}}}} is expanded to;UC:
is applied to the output "in" of Tc.{{subst:ns:{{subst:#expr:2*3}}}}
- gives File.{{ns:{{subst:#expr:2*3}}}}
- gives wikitext {{ns:6}} rendered as File.{{subst:t1|{{subst:NAMESPACE}}}}
- gives the wikitext startHelpend (see {{T1 }}){{subst:t1|{{subst:#expr:3*4}}}}
- gives the wikitext start12end{{subst:t1|{{subst:uc:AbCdEf}}}}
- gives the wikitext startABCDEFend{{subst:#expr:{{subst:3X|11*}}1}}
- gives the wikitext 1331{{subst:UC:{{subst:3X|abc}}}}
- gives the wikitext ABCABCABC{{subst:LC:{{subst:#expr:1/100000}}}}
- gives the wikitext 1e-05{{subst:#expr:2*{{subst:CURRENTDAY}}}}
- gives (at the time of writing) the wikitext 30{{subst:UC:{{subst:CURRENTDAYNAME}}}}
- gives (at the time of writing) the wikitext THURSDAY
However:
{{subst:UC:{{tc}}}}
- gives the wikitext{{TC}}
rendered as Template:TC.{{subst:ns:{{#expr:2*3}}}}
- stays {{subst:ns:{{#expr:2*3}}}}, rendered as {{subst:ns:6}}.
As mentioned before, on substitution, all calls without substitution of templates, variables, and parser functions are treated as plain text.
As a result substitution of the outer x:
in a nested
{{ x:...
{{ y:...
}} }} often is only suitable if all inner y:
are also substituted.
In the case of substitution of a predefined template, if the expression for one of its parameters contains {{{p|3}}} with undefined p
, this code reduces to 3.
However, on the page itself, {{{p|3}}} is treated as such, not as 3.
Examples:
{{#expr:2*{{{p}}}}}
→Expression error: Unrecognized punctuation character "{".
{{#expr:2*{{{p|3}}}}}
→6
{{subst:#expr:2*{{{p|3}}}}}
→ Expression error: Unrecognized punctuation character "{".- substituting a template containing {{<includeonly>subst:</includeonly>#expr:2*{{{p|3}}}}} gives 6 if
p
is not assigned a value, and twice the numberp
if it is assigned a value. - the same result can be obtained from a template containing {{{{{subst}}}#expr:2*{{{p|3}}}}}, if the substitution call has a parameter of "
subst=subst:
".
Compare:
{{uc:2*{{{p}}}}}
→2*{{{P}}}
{{uc:2*{{{p|q}}}}}
→2*Q
{{subst:uc:2*{{{p|q}}}}}
→ the wikitext 2*{{{P|Q}}} rendered as 2*Q
and also (from above):
{{subst:UC:{{subst:tc}}}}
- gives IN, just like {{UC:{{tc}}}} does; UC is applied to the output "in" of Tc.{{subst:UC:{{tc}}}}
- gives the wikitext{{TC}}
rendered as Template:TC.
In the substitution of UC
, the inclusion tag {{tc}} is treated as string just like {{{p|q}}}.
Partial substitution
Inside an ordinary template one can apply substitution to an ordinary template call containing a parameter, to replace it by the direct wikitext containing the parameter. It amounts to automatically merging the two templates (creating a "composite template" like a composite function). It is not possible if the inner and/or outer template is predefined. (However, manually merging e.g. a call of #expr inside another one is useful for increasing the accuracy of the result by avoiding intermediate rounding to 12 digits.)
This way one can dispense with the optional substitution technique described below, and apply substitution of the resulting outer template by simply using subst:
(unless there are more nesting levels).
Example:
{{subst:t}}
- gives the wikitextstart-{{{1|pqr}}}-end
, just that of m:Template:t, without noinclude parts and includeonly tags{{subst:t|a{{{p|q}}}b}}
- gives the wikitextstart-a{{{p|q}}}b-end
Examples with double substitution:
{{subst:3X|{{subst:t}}}}
- gives the wikitextstart-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|q}}}-end
{{subst:3X|{{subst:t|{{{1|q}}}}}}}
- gives the wikitextstart-{{{1|q}}}-endstart-{{{1|q}}}-endstart-{{{1|q}}}-end
Multilevel substitution
When substituting a template it may be desirable to carry out a substitution inside the template too.
This can be done with safesubst:
in the template.
To prevent premature substitution (i.e., when the template is saved), it is possible to append the <noinclude />
directive after the substitution directive – i.e. safesubst:<noinclude />
.
Another solution is to use the default value of an unused parameter.
Often the empty string works, i.e. {{{|safesubst:}}}
, however it is sometimes used by modules that call templates or for inserting comments.
The difference with subst:<noinclude />
is that safesubst:<noinclude />
, evaluating to safesubst:
not only allows multilevel substitution but also multilevel transclusion, because on transclusion it is ignored.
To make the template such that it allows the choice between these two options as well as one-level substitution (and more choices if more templates, variables, and/or parser functions are involved) one or more parameters are needed, see below.
Multilevel substitution with independent control of each substitution separately
A parameter subst (or more, each with its own name) can be used with safesubst:
and the empty string as possible values.
Thus we can for example control whether an inner template is substituted too when the outer template is substituted.
Either possibility can be made the default.
Inner templates with parameters may control further inner substitutions in the same way; these parameters may depend on the substitution parameter controlling the substitution of the inner template, since if that is not substituted, inner substitutions within that template are not possible.
Similarly, if there are multiple templates, variables, and/or parser functions in the inner template(s) we can control substitution of all, either independently by using different parameters, or with some or all using the same parameter.
For example, if template T
uses parameter subst1
:
- with the empty string as default,
T
calls inner templates and parser functions prefixing their names with {{{subst1|}}}; for callingT
we can use:- {{t|..}} - no substitution
- {{subst:t|..}} - one-level substitution
- {{subst:t|subst1=subst:|..}} - two-level substitution
- {{subst:t|subst1=safesubst:|..}} - ditto
- with default "safesubst:",
T
calls inner templates and parser functions prefixing their names with {{{subst1|safesubst:}}}; for callingT
we can use:- {{t|..}} - no substitution
- {{subst:t|subst1=|..}} - one-level substitution
- {{subst:t|..}} - two-level substitution
To transfer the choice of substituting or not to templates and parser functions called inside the inner templates of T
, we can add to the call of these inner templates something of the form subst2={{{subst1|}}} or subst2={{{subst1|safesubst:}}}, respectively (variables and parser functions don't get the additional parameter).
Partial substitution
Using a template prepared for optional subst=subst:
only with ordinary substitution, without specifying parameter values, allows to insert its code into another template, like copy and paste, but all
<noinclude>
parts and <includeonly>
keywords automatically stripped.
Executing inserted code instead of calling it may be more efficient for the server.
A typical example for this technique is expanding, within another template, a template used as test expression in a #switch: like m:Template:len:
- Development code:
{{#switch: {{len|parameter tag}}|0=case 0 etc.}}
- Standard solution:
{{{{{subst|}}}#switch: {{{{{subst|}}}len|parameter tag|subst={{{subst|}}}}}|0=case 0 etc.}}
- Better solution: create template code by applying substitution using this wikitext:
{{{{{subst|}}}#switch: {{subst:len|parameter tag}}|0=case 0 etc.}}
m:Template:len is prepared for optional substitution, therefore both solutions work, but the latter solution substituting its code is simpler and more efficient.
See m:Template:csn and m:Template:lz12 for cases where Template:len
was substituted in this way.
If a template uses a parameter whose name is an expression containing a template or parser function, and the template is called with a corresponding parameter definition (in terms of the final name of the parameter) it expands properly only if at the time of expansion of the template the expression for the name of the parameter is or has been evaluated. Thus if the template is substituted without substituting the expression for the parameter name, the parameter definition is "lost", so the parameter becomes undefined. Therefore in such a case no substitution can give the same rendered result as full substitution, while partial substitution gives a different result. See e.g. m:Template:ts1.
Composite operations
By {{A|{{B|p}}}}
a template A
is called with, as parameter, a call of template B
with a parameter p
.
We could integrate such template calls to a single call {{C|p}}
of a "composite template" C
with parameter p
.
- The wikitext for template
C
would be{{A|{{B|{{{1}}}}}}}
, or with optional substitution the following construct : - {{ {{{subst
|
}}} A|{{ {{{subst|
}}} B|{{{1}}} |subst={{{subst|
}}} }} |subst={{{subst|
}}} }} - The
subst={{{subst|}}}
is only necessary for recursive substitution as explained above.
Note that it is not useful to specify {{subst|subst:}}
since in the substitution phase this tag does not reduce to the default subst:
.
If A
and/or B
is predefined the construct is similar, but without subst={{{subst|}}}
for that template.
includeonly
An alternative method to prevent premature substitution, known as "includeonly subst magic", is with a pair of includeonly tags.
Substitution is prevented by having the template call inside these tags.
Substitution is also prevented by having one or both tags anywhere in the template call except inside a parameter definition.
Thus the tag(s) can be before, inside, or after safesubst:
or subst:
, or inside or after the template name.
The positions of the two tags only influence the rendering of the template page itself.
The form {{<includeonly>safesubst:</includeonly>something}}
suggests that substitution is prevented by discarding safesubst:
on the page itself, but actually substitution is prevented because the safesubst-syntax is disturbed by the tags.
It doesn't substitute "something" at the time of the creation of the relevant template, but has the desired effect when the template is substituted.
For examples see "preload" in Extension:InputBox and "substitution" in Help:Magic words .
Creating a page which applies substitution on the next save
Forced substitution
Some templates deliberately refuse to work without substitution, for an example see w:Template:en. This technique is essential for templates like w:Template:en producing some kind of timestamp, e.g. adding pages to dated categories.
- The following code in any template
T
outputs a warning unless recursive substitution withsubst=subst:
is in effect: {{{{{subst|}}}ifdef|{{{{{subst|subst:}}}ns:0}}|'''Warning'''}}
.- Output for
{{T}}
or{{subst:T}}
- Warning - Output for
{{T|subst=subst:}}
-Template:Ifdef
- Output for
{{subst:T|subst=subst:}}
- nothing (no remaining wikitext)
- Output for
- This is a rare case where replacing
ifdef
by#if:
doesn't work directly.
Substitution of part of the parameters
Let template Feelings
use parameters 1 and 2.
Consider creating a template Emotions with one parameter 1, corresponding to Feelings
, with a given value love
of parameter 2.
Compare {{Feelings|2=love}}
and {{Feelings|1={{{1}}}|2=love}}
.
They look the same on the template page, see e.g. m:Template:t ps
, but the first does not work because {{{1}}}
is treated as text, not as parameter.
However, with substitution (using subst:
or Special:Expandtemplates) the resulting wikitext is the same, without distinction between a text {{{1}}} and a parameter, it is a parameter anyway, so 1={{{1}}}
is not needed.
If Feelings
contains e.g. #expr
with an expression containing both parameters the same applies, except that we can only substitute the highest level (Feelings
), not the parser function, so we cannot use Special:Expandtemplates
.
In general, substituting a parameter and applying a template or parser function sometimes gives the same result as substituting the template or parser function with the triple-braced parameter code and then substituting the parameter.
Without defaults (all rendered the same in one-step substitution as without substitution):
Examples with equality:
Feelings
template containingWith {{{1}}} one can {{{2}}}
- When substituted with
1=love
,2=help
, it givesWith love one can help
. - When substituted with
2=help
, it givesWith {{{1}}} one can help
. This itself, when substituted with1=compassion
, it givesWith compassion one can help
.
- When substituted with
- Two-level substitution of a template containing
{{#if:{{{4}}}|{{{3}}}p}}
.- When substituted with
3=u
,4=v
, it givesup
. - When substituted with
4=v
, it gives{{{3}}}p
. This itself, when substituted with3=u
, it givesup
.
- When substituted with
Examples without equality:
- Two-level substitution of a template containing
{{#if:{{{3}}}|{{{4}}}p}}
- When substituted with
3=
,4=v
, it gives the empty string. - When substituted with
4=v
, it givesvp
. This itself, when substituted with3=u
, it remainsvp
.
- When substituted with
- Two-level substitution of a template containing
{{#if:{{{2}}}|{{{1}}}p}}
- When substituted with
1=u
,2=v
, it givesup
. - When substituted with
2=v
, it gives{{{1}}}pp
(the bug). This itself, when substituted with3=u
, it givesupp
.
- When substituted with
- Two-level substitution of a template containing
{{#expr:{{{1}}}*{{{2}}}}}
- When substituted with
1=7
,2=8
, it gives56
. - When substituted with
2=8
, it gives Expression error: Unrecognised punctuation character "{". This itself, when substituted with1=7
, it remains the same.
- When substituted with
Thus without equality we may or may not get an error message.
One example shows that substitution of one parameter can be affected by the bug mentioned above.
However, we can then replace e.g. {{{1}}}
by {{{1{{{{{substvoid|}}}void}}}}}
and do full substitution, except that substvoid
is undefined, preventing the bug.
The result works already correctly with transclusion.
Subsequently it can be substituted with substvoid=subst:
so that we get the plain {{{1}}}
.
With defaults:
Rendered the same as without substitution:
- Two-level substitution of a template containing
With {{{1|love}}} one can {{{2}}}
with2=help
givesWith {{{1|love}}} one can help
. - Two-level substitution of a template containing
{{#if:{{{4}}}|{{{3|d}}}p}}
with4=v
givesdp
.
Not rendered the same as without substitution:
- Two-level substitution of a template containing
{{#if:{{{3|}}}|{{{4}}}p}}
with4=v
givesvp
. - Two-level substitution of a template containing
{{#if:{{{2}}}|{{{1|d}}}p}}
with2=v
givesdpp
(the bug). - Two-level substitution of a template containing
{{#expr:{{{1|6}}}*{{{2}}}}}
with2=8
gives: Expression error: Unrecognised punctuation character "{"
After substitution with the parameter definition:
{{subst:#if:{{{3|}}}|vp}}
→vp
{{subst:#if:v|{{{1|d}}}p}}
→dpp
(the bug){{subst:#expr:{{{1|6}}}*8}}
→ Expression error: Unrecognised punctuation character "{"
Rewritten:
{{subst:#if:{{subst:#ifeq:{{{3|+}}}|{{{3|-}}}|vp}}}}
→ the empty string{{subst:#if:v|{{subst:#ifeq:{{{1|+}}}|{{{1|-}}}|{{{1}}}|d}}p}}
→dp
{{subst:#expr:{{subst:#ifeq:{{{1|+}}}|{{{1|-}}}|{{{1}}}|6}}*8}}
→48
Ограничения
Замена не доступна внутри тегов анализатора, таких как <ref>...</ref>
и <gallery>...</gallery>
.
Если вы напишете {{subst:foo}}
, он не заменяется и не заменяет, но остается таким, как есть.
Документация подстановки
Использование шаблона через subst:
не отображается автоматически в истории страниц.
Therefore providing the line of wikitext containing "subst:" in the edit summary is especially useful.
Also pages with a substituted template do not show up in backlinks, and the template does not appear in the list of transcluded templates on the edit page. The template could add pages to a category to track substitutions, but listing this category on a page may clutter the list of content-based categories the page is in. Also, comments outside noinclude tags are included in the wikitext. Thus a comment can be used to mention the template. It can even contain the values of the parameters, because substitution of parameters works even in comments.
См. также
- Help:Substitution/tl;dr – tl;dr
- w:Help:Substitution#The safesubst: modifier
- w:Wikipedia:Template substitution – partly technical, partly policy
- Phabricator:T4003 – feature request to allow marking a template as being substituted without
subst:
- Templates containing a call to itself with
subst:
and producing a similar call with updated info, either replacing or adding to the previous info: - The pipe trick, which behaves similarly to template substitution