Aide:Substitution
Note : si vous modifiez cette page, vous acceptez de placer votre contribution sous licence CC0. Plus d’informations sont disponibles sur le projet Aide dans le domaine public. Quelques versions anciennes de cette page ont été importées sous la licence CC BY-SA. Seules les nouvelles contributions sont dans le domaine public. |
La substitution est une conversion automatique du wikicode d'une page, lorsque la page est enregistrée, dans le cas où le wikitexte fait référence à un ou plusieurs modèles, variables ou fonctions Parser (fonctions d'analyseur syntaxique).
Dans le cas de la substitution de modèle, l'appel de modèle est remplacé par le contenu du modèle avec substitution des paramètres. Ainsi, un modèle est utilisé comme macro et la page est macro expansée lorsque la page est enregistrée plutôt que, comme cela se produit habituellement, lorsque la page est vue.
En cas de substitution d'une variable ou d'une fonction Parser, la référence à celle-ci est remplacée par la valeur résultante.
La substitution se fait en mettant le mot magique subst:
ou safesubst:
après les doubles accolades ouvrantes, sans espaces intermédiaires comme dans les exemples : {{subst:FULLPAGENAME}}
et {{safesubst:FULLPAGENAME}}
.
Le code safesubst:
est utile dans la substitution multi-niveaux, voir ci-dessous.
Le résultat (sous la forme de la différence avec le wikicode enregistré) peut être vu avant (ou sans) l’enregistrement en appuyant sur « Afficher les modifications ». Cependant, si le texte couvre plus d'un paragraphe, cette page de différence n'est pas très adaptée pour copier le résultat (par exemple pour une substitution pas à pas sans enregistrer chaque étape), à cause des signes '+' dans la marge.
Applications
Substitution d'un modèle :
- Rendre une page générée indépendante du modèle :
- La page rendue ne change pas lorsque le modèle est modifié.
- La page peut être copiée sur un autre wiki MediaWiki sans avoir à recopier le modèle.
- Facilitez le rendu des pages et rendez ainsi le serveur plus rapide.
- Analysez et démontrez le fonctionnement des modèles. Cependant, dans certains cas, la substitution fonctionne différemment.
- Faire la correspondance entre le wikicode et la page rendue plus facile à comprendre (cela peut s’appliquer, l’inverse peut également s’appliquer).
Substitution d'une variable dépendante du temps :
- Créez une page rendue indépendante de l'heure.
Substitution d'une variable dépendante de la page :
- Rendre une page générée indépendante de son changement de nom et de la copie du wikicode dans une autre page (le contraire s’applique si la variable PAGENAME est utilisée dans une partie non incluse de la page pour inclure la page elle-même).
Certaines extensions MediaWiki ont la restriction que si elles sont utilisées dans un modèle avec des paramètres, elles ne fonctionnent que si le modèle est remplacé.
Vue d'ensemble
Pour la discussion de substitution, un modèle ordinaire est la page à laquelle il est fait référence, soit dans l'étiquette {{subst:pagename }} (pour les pages de l'espace de noms des modèles), ou {{subst:fullpagename }} (pour les pages des autres espaces de noms). Un modèle prédéfini est une variable ou une fonction d'analyse syntaxique qui est substituée de manière similaire.
La substitution est un processus distinct qui est effectué avant l'expansion de tout modèle, de variables, de fonction d'analyse syntaxique ou de paramètre qui ne sont pas substitués.
Un appel de substitution peut contenir d'autres appels de substitution. De même, un modèle de substitution substitué peut contenir d'autres appels de substitution. Les substitutions dans l'expression pour le nom du modèle ou de la fonction d'analyseur, dans les définitions de paramètres du modèle ou de la fonction d'analyseur substitué et dans le corps du modèle substitué sont effectuées en premier.
Puisque l'expansion est faite plus tard, toute expression utilisée dans une substitution qui contient des paires d'accolades doubles, aura les accolades traitées comme du texte brut.
Ainsi, pendant la substitution, il peut y avoir un nom de paramètre avec des accolades dans l'appel de substitution (par exemple {{subst:foo|a{{bc}}d=...}}
) qui correspond à un paramètre du même nom dans le corps du modèle (par exemple {{{a{{bc}}d}}}
).
Si l’on tente d’appliquer une substitution à un modèle inexistant, etc. il n’y a pas de substitution, le préfixe « subst: » est conservé dans le wikicode.
Après le processus de substitution, l’expansion des modèles, etc. et d’autres traitements du wikicode résultants, fonctionnent comme d’habitude. La substitution étant terminée, cela ne peut pas annuler une incohérence de noms de paramètres qui s'est produite lors de la substitution (voir également la section Substitution partielle ci-dessous).
La substitution n'est possible que si tout ce qui suit a été complètement évalué.
- nom du modèle, fonction d'analyse ou une variable
- cas d'un modèle : noms des paramètres dans l'appel du modèle et dans le modèle lui-même
- cas #if, #ifexpr, #ifexist et #iferror, paramètre après la virgule ','
- cas #ifeq, paramètre après la virgule ',' et le suivant
- cas #switch, paramètre après la virgule et les expressions à gauche des signes égale '='
Comme il a été dit, parce que la substitution se fait avant tout autre expansion, l'évaluation nécessaire évoquée ci-avant ne se réalise pas si les expressions comportent une expansion sans substitution.
Egalement dans le cas où il existe d'autres fonctions d'analyse syntaxique que celles indiquées, un paramètre non complètement évalué après la virgule ',' fait que la fonction d'analyse est appliquée au wikicode entre accolades, et non pas au wikicode expansé, ce qui biaise le résultat.
Exemples :
- {{subst:Help:L{{tc}}k}} avec Template:tc, ne réalise aucune substitution, parce que Help:L{{tc}}k est une page qui n'existe pas, bien que Help:L{{tc}}k soit rendu en tant que Help:Link. Ainsi le wikicode résultant est le même que le wikicode original et il est généré comme {{subst:Help:Link}}.
- {{#if:{{void|abc}}|yes|no}} (en utilisant Template:void) est généré comme « no », et donc de manière similaire {{subst:#if:{{subst:void|abc}}|yes|no}} produit le wikicode « no ». D'un autre côté, {{subst:#if:{{void|abc}}|yes|no}} produit le wikicode « yes » car Template:void n'est pas résolu tant que la substitution n'est pas faite.
En principe le wikicode résultant de la substitution complète est, immédiatement après cela, généré de la même manière que le wikicode d'une inclusion ordinaire.
Notez néanmoins que lors de la substitution d'une fonction d'analyse syntaxique, un paramètre indéfini avec valeur par défaut, utilisé en tant que valeur de paramètre, n'est pas remplacé par cette valeur (dans la Wikipedia anglophone), et par exemple n'est pas autorisé dans l'expression numérique évaluée lors de la substitution de #expr :
- {{#expr:2*{{{p|3}}}}} donne 6, alors que {{subst:#expr:2*{{{p|3}}}}} donne : Expression error: unrecognised punctuation character "{"
Lorsqu'il s'agit de substituer un modèle qui contient cela, {{{p|3}}} est remplacé soit par la valeur de {{{p}}}, soit par 3 et n'apporte donc pas de difficulté.
{{ {{t6}} }} qui utilise Template:t6 contenant t2demo|a<noinclude>[[Category:Demo templates]]</noinclude>
est rendu comme {{ t2demo|a }}.
{{subst:{{subst:t6}} }} fait que le wikicode {{subst:t2demo|a }} est rendu à l'identique du wikicode initial, et à la prochaine modification ou sauvegarde il sera changé en start-a -middle-{{{2}}}-end.
{{ {{subst:t6}} }} donne le wikicode {{ t2demo|a }}, rendu comme start-a -middle-{{{2}}}-end.
Ceci est dû au fait que sans substitution ou avec substitution totale, les barres verticales '|' dans les appels de modèles – en enlevant las cas où elles se trouvent dans les appels de modèles plus internes, dans les paramètres de modèkes, des liens ou des balises d'image – déterminent la séparation entre le nom du modèle et la définition de chacun de ses paramètres.
Cette séparation ne dépend pas des caractères '|' supplémentaires éventuellement présents dans la fome expansée du nom du modèle ou de la définition des paramètres.
Néanmoins, si après la substitution d'un modèle inclus, le caractère '|' est trouvé dans le modèle appelant, il est traité comme les autres et sert à la séparation.
En d'autres termes, l'analyse syntaxique est d'abord réalisée une fois pour la substitution, puis une autre fois pour le rendu, mais pas plus entre ces deux étapes.
Dans le cas de la substitution du modéle inclus seulement, deux analyses successives sont effectives.
Si vous substituez un modèle contenant {{{p|q}}} (une balise de paramètre avec une valeur par défaut), le résultat vaut p si cette valeur est définie, sinon il vaut q. Par exemple, dans l'utilisation de {{timc|t pd}} (de la Wikipedia anglophone), {{subst:t pd}} donne le wikicode 2. Si une page se substitue à elle même (comme dans la partie noinclude d'une page de modèle), c'est l'ancienne version qui est substituée.
Considérations d'utilisation
Comme mentionné, la modification d'un modèle ordinaire après substitution ne change plus la page où il a été substitué, et une variable substituée qui dépendrait du temps ne dépendra plus du temps. Néanmoins une substitution de {{#expr:2*3}} par exemple ne modifie pas du tout le rendu.
La relation entre le wikicode d'une page et son rendu peut devenir plus facile à comprendre après la substitution, car on a tout le wikicode ensemble, et des substitutions de paramètres ont été effectuées.
Il peut également devenir plus complexe. Il peut être plus facile de se concentrer séparément sur la compréhension d’un appel de modèle et la compréhension du contenu du modèle. Le wikicode après substitution est souvent plus complexe que lorsque le wikicode requis aurait été écrit directement.
Contrairement à un appel de modèle (si l’on connaît les modèles), le wikicode après substitution ne montre pas comment on peut produire un résultat similaire. Le wikicode peut être long et compliqué, et donc lourd à écrire directement, ou il peut être simple, par exemple un nombre résultant d’un calcul, mais lourd à trouver directement. En étudiant le wikicode d'une page, on peut penser que ce wikitexte est ce que l'on est censé écrire et trouver directement pour obtenir le résultat, même dans les cas où cela serait très peu pratique.
Dans de tels cas, la documentation de l'appel de modèle est utile. Tout comme dans la programmation informatique, nous modifions le code source et/ou les données pour produire de nouveaux résultats, et nous ne modifions pas directement le fichier objet, ici nous changerions les appels de modèles et/ou les modèles, au lieu de changer directement le wikicode résultant de la substitution.
Modèles ordinaires
Dans le cas de la substitution d'un modèle ordinaire, la balise de modèle est remplacée par le wikicode du modèle, avec les valeurs des paramètres substituées aux paramètres.
- Exemple: m:Template:t2, contenant
-
start-{{{1}}}-middle-{{{2}}}-end
- et appelé en tant que
{{subst:t2|[[a]]|{{tc}}}}
(voir {{Tc }}) donne le wikicode :start-[[a]]-middle-{{tc}}-end
, rendu comme- start-a-middle-in-end.
La substitution supprime les parties noinclude et les balises includeonly.
Paramètres :
- Une substitution avec p=r remplace {{{p}}} et {{{p|q}}} par
r
. Cela inclut les cas oùr
est de la forme {{{s}}} ou {{{s|t}}}. - Une substitution avec
p
non défini conserve{{{p}}}
et remplace {{{p|q}}} par le defaultq
(dans la Wikipédia en anglais).
Avec subst:
, le remplacement d'une balise de modèle par le wikicode ne fonctionne pas de manière récursive.
Pour la substitution récursive complète, utiliser Special:ExpandTemplates.
Voir aussi substall, et substitution à plusieurs niveaux ci-dessous.
La substitution par étapes de modèles, y compris d'autres modèles de modèles, etc., peut être utile pour analyser et documenter le comportement de modèles complexes.
Cependant, après une substitution, une page peut s'afficher différemment, par exemple si les modèles produisent des accolades, des barres verticales et/ou des signes égaux qui, après substitution, déterminent l'expansion d'autres modèles, mais sans substitution sont traités comme du texte brut.
En l'absence de paramètres, la substitution de modèle peut être comparée à la copie du wikicode, ou au rendu d’un {{ msgnw:
nom de page prévisualisé ou sauvegardé }}.
However, template substitution excludes <noinclude>
parts, removes <includeonly>
tags, and replaces undefined parameters with defaults by those defaults.
Modèles prédéfinis
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]]
rendu comme :
- 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
Néanmoins :
{{subst:UC:{{tc}}}}
- donne le wikicode{{TC}}
rendu comme 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}}}.
Substitution partielle
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).
Exemple :
{{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
Substitution multi-niveaux
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.
Substitution multi niveaux en contrôlant chaque substitution indépendamment et séparément
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).
Substitution partielle
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.
Opérations composées
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 .
Créer une page qui réalise la substitution lors du prochain enregistrement
Substitution forcée
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 d'une partie des paramètres
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
Limitations
La substitution n'est pas disponible dans les balises de l'analyseur syntaxique comme <ref>...</ref>
et <gallery>...</gallery>
.
Si vous écrivez {{subst:foo}}
, il n'est pas substitué ni transclus, mais reste tel-quel.
Documenter la substitution
L'utilisation d'un modèle via subst:
ne s'affiche pas automatiquement dans les historiques des pages.
C'est pourquoi il est particulièrement utile de fournir la ligne de wikicode contenant « subst: » dans le résumé des modifications.
De même les pages avec un modèle substitué ne s’affichent pas dans les liens retour, et le modèle n’apparaît pas dans la liste des modèles transclus sur la page d’édition. Le modèle peut ajouter les pages dans une catégorie pour tracer les substitutions, mais en listant cette catégorie sur une page on peut désordonner la liste des catégories basées sur le contenu à laquelle la page appartient. De même les commentaires en dehors des balises « noinclude » sont inclus dans le wikicode. Ainsi un commentaire peut être utilisé pour mentionner le modèle. Il peut même contenir les valeurs des paramètres, parce que la substitution des paramètres fonctionne même pour les commentaires.
Voir aussi
- 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