Jump to content

Help:Substitution/nl

From mediawiki.org
This page is a translated version of the page Help:Substitution and the translation is 76% complete.

Substitutie is automatische conversie van wikitext van een pagina wanneer de pagina wordt opgeslagen, in het geval dat de wikitext verwijst naar een of meer sjablonen, variabelen of parserfuncties.

In het geval van substitutie van een sjabloon wordt de aanroep van het sjabloon vervangen door de inhoud van het sjabloon met vervanging van parameters. Als een sjabloon wordt gebruikt als macro en de de pagina wordt uitgebreid met de macro wanneer de pagina wordt opgeslagen, in plaats van wanneer de pagina wordt bekeken.

In het geval van substitutie van een variabele of parserfunctie wordt de verwijzing naar deze vervangen door de resulterende waarde.

De substitutie gebeurt door het magisch woord subst: of safesubst: achter de dubbele openingshaken te plaatsen zonder tussenliggende spaties zoals in de voorbeelden: {{subst:FULLPAGENAME}} en {{safesubst:FULLPAGENAME}}. De code safesubst: is nuttig bij multilevel substitutie, zie hieronder.

Het resultaat (in de vorm van het verschil met de opgeslagen wikitext) kan worden gezien voordat (of zonder) het opslaan door op Wijzigingen bekijken te drukken. Als de tekst echter meer dan één alinea omvat, is deze pagina niet erg geschikt voor het kopiëren van het resultaat (bijv. voor stapsgewijze vervanging zonder elke stap te bewaren), vanwege de plustekens in de marge.

Toepassingen

Substitutie van een sjabloon:

  • Bouw een pagina op onafhankelijk van het sjabloon:
    • De weergegeven pagina verandert niet wanneer de sjabloon wordt bewerkt.
    • De pagina kan worden gekopieerd naar een andere MediaWiki wiki zonder het sjabloon te kopiëren.
  • Maak de opbouw van pagina's gemakkelijker en daarom sneller voor de server.
  • Analyse en demonstratie van de werking van sjablonen. In sommige gevallen werkt substitutie echter anders.
  • Maak de overeenkomst tussen wikitext en opgebouwde weer te geven pagina's makkelijker te begrijpen (het tegenovergestelde kan ook gelden).

Substitutie van een tijd-afhankelijke variabele:

  • Maak de weergave van de pagina onafhankelijk van de tijd.

Substitutie van een pagina-afhankelijke variabele:

  • Maak een weergegeven pagina onafhankelijk van de naam van de pagina en het kopiëren van de wikitext naar een andere pagina (het tegenovergestelde geldt als de variabele PAGENAME wordt gebruikt in een niet-invoegend deel van de pagina om de pagina zelf te bevatten).

Sommige MediaWiki-extensies hebben de beperking dat als ze worden gebruikt in een sjabloon met parameters, ze alleen werken als het sjabloon wordt vervangen.

Overzicht

Voor de discussie of substitutie een "gewoon sjabloon" de pagina is waarnaar wordt verwezen door een van beide in het patroon {{subst:pagename }} (voor pagina's in de namespace template) of {{subst: fullpagename }} (voor pagina's in andere namespaces). Een "vooraf gedefinieerd sjabloon" is een variabele of parserfunctie die op vergelijkbare wijze wordt vervangen.

Substitutie is een apart proces dat wordt uitgevoerd voordat de uitbreiding van niet-substitueerde sjablonen, variabelen, parserfuncties of parameters wordt uitgevoerd.

Een aanroep voor substitutie kan andere dergelijke aanroepen bevatten. Evenzo kan het gesubstitueerde sjabloon van een substitutie andere substitutie aanroepen bevatten. De vervanging in de expressie voor de naam van het sjabloon of de parserfunctie, in de parameterdefinities van het vervangende sjabloon of parserfuncties en in de body het gesubstitueerde sjabloon worden eerst uitgevoerd.

Aangezien de uitbreiding later wordt gedaan, zal elke expressie die in een vervanging wordt gebruikt en die toevallig een paar dubbele haakjes bevat, die haakjes als gewone tekst behandelen. Bij vervanging kan er dus een parameternaam met haakjes in de vervangingsaanroep (bv. {{subst:foo|a{{bc}}d=...}}) zijn die overeenkomt met een parameter met dezelfde body in de body van het sjabloon (bijv. {{{a{{bc}}d}}}).

Als men probeert substitutie toe te passen op een niet-bestaand sjabloon enzovoort, is er geen substitutie, het voorvoegsel "subst:" blijft in de wikitext staan.

Na het vervangen werkt de uitbreiding van sjablonen enz. en andere verwerking van de resulterende wikitext zoals gewoonlijk. Omdat de substitutie voorbij is, kan dit een mismatch van parameternamen die tijdens substitutie is opgetreden niet ongedaan maken (zie hieronder ook de sectie "Gedeeltelijke substitutie").

Substitutie is alleen mogelijk als het volgende volledig is geëvalueerd:

  • de naam van het sjabloon, variabele of parserfunctie
  • In het geval van een sjabloon: de parameternamen in de sjabloonaanroep en in het sjabloon zelf
  • In het geval van #if, #ifexpr, #ifexist en #iferror, de parameter na de dubbele punt
  • In het geval van #ifeq, de parameter na de dubbele punt en de volgende
  • In het geval van #switch, de parameter na de dubbele punt en de expressies links van het gelijkteken

Aangezien, zoals al gezegd, de substitutie vóór een andere uitbreiding plaatsvindt, is de hierboven genoemde vereiste evaluatie niet uitgevoerd indien de expressies geen vervangende uitbreiding bevatten.

Ook in het geval van andere parserfuncties dan vermeld, veroorzaakt een niet volledig geëvalueerde parameter na de dubbele punt de parserfunctie toe te passen op de wikitext met haakjes en niet de uitgebreide wikitext, wat het resultaat beïnvloedt.

Voorbeelden:

  • {{subst:Help:L{{tc}}k}} met gebruik van Template:tc doet geen substitutie, omdat Help:L{{tc}}k geen bestaande pagina is, hoewel Help:L{{tc}}k wel als Help:Link wordt weergegeven. De resulterende wikitext is dus hetzelfde als de oorspronkelijke wikitext en wordt opgebouwd als {{subst:Help:Link}}.
  • {{#if:{{void|abc}}|yes|no}} (met gebruik van Template:void) wordt weergegeven als "no", en dus {{subst:#if:{{subst:void|abc}}|yes|no}} geeft op dezelfde manier de wikitext "no" weer. Aan de andere kant geeft {{subst:#if:{{void|abc}}|yes|no}} de wikitext "yes", omdat Template:void pas na substitutie wordt uitgewerkt.

In principe wordt de uit volledige substitutie voortvloeiende wikitext onmiddellijk daarna hetzelfde weergegeven als de wikitexten met gewone opneming.

Let echter op dat bij substitutie van een parserfunctie een ongedefinieerde parameter met standaardwaarde, gebruikt in een parameterwaarde, niet wordt vervangen door de standaardwaarde (in de Engelse Wikipedia), en bijvoorbeeld niet is toegestaan in de numerieke uitdrukking geëvalueerd bij substitutie van #expr:

  • {{#expr:2*{{{p|3}}}}} geeft 6, maar {{subst:#expr:2*{{{p|3}}}}} geeft: Expression error: unrecognised punctuation character "{"

Bij het vervangen van een sjabloon dat dit bevat, wordt {{{p|3}}} ofwel vervangen door de waarde van {{{p}}} of door 3, zodat er geen complicatie ontstaat.

{{ {{t6}} }} met gebruik van Template:t6 dat "t2demo|a<noinclude>[[Category:Demo templates]]</noinclude>" bevat wordt dit als {{ t2demo|a }} weergegeven. {{subst:{{subst:t6}} }} geeft de wikitext {{subst:t2demo|a }} weergegeven als de wikitexten, en bij het volgende bewerken/opslaan veranderd dit in start-a -middle-{{{2}}}-end. {{ {{subst:t6}} }} geeft de wikitext {{ t2demo|a }}, weergegeven als start-a -middle-{{{2}}}-end. Dit komt omdat, zowel zonder vervanging als in het geval van volledige vervanging, de tekens "|" in de aanroepen van het sjabloon, met uitzondering van die binnen de aanroepsvorm, de sjabloonparameters, de links en de afbeeldingtags, de scheiding van de definities van de parameters van elkaar en van de sjabloonnaam bepalen. Deze scheiding is niet afhankelijk van mogelijke extra "|" tekens in de uitgebreide vorm van de sjabloonnaam en parameterdefinities. Als na het vervangen van een binnenste sjabloon het karakter "|" echter in de buitenste sjabloonaanroep zit, is het een zoals elk ander en speelt het zijn rol in het bepalen van de scheiding. Met andere woorden, het parsen wordt eerst één keer gedaan voor vervanging en dan één keer voor opbouw, maar in beide gevallen zonder extra tijd tussenin. In het geval van vervanging van het interne sjabloon alleen zijn twee daaropvolgende verwerkingen effectief.

Bij het vervangen van een sjabloon met {{{p|q}}} (een parametertag met standaard) resulteert dit in de waarde van p als deze is gedefinieerd, en anders in q. Bijvoorbeeld, met gebruik van {{timc|t pd}} (in de Engelse Wikipedia), geeft {{subst:t pd}} de wikitext 2. Als een pagina zichzelf vervangt (bijvoorbeeld in het noinclude-deel van een sjabloonpagina), vervangt deze de oude versie.

Overwegingen over gebruik

Zoals eerder genoemd, heeft een wijziging van een gewoon sjabloon na vervanging geen invloed op de pagina waarop deze is vervangen, en een vervangen variabele afhankelijk van de tijd is o.a. niet langer afhankelijk van de tijd. Een vervanging van bijvoorbeeld {{#expr:2*3}} heeft echter geen invloed op de opbouw van de pagina.

De relatie tussen de wikitext van een pagina en de opbouw ervan kan na vervanging gemakkelijker worden begrepen, omdat men alle wikitext samen heeft en parametersubstituties zijn uitgevoerd.

Het kan ook complexer worden. Het is een eenvoudiger om de focus te leggen op het begrijpen van een sjabloon-aanroep en het begrijpen van de inhoud van het sjabloon is eenvoudiger. Wikitext na vervanging is vaak complexer dan wanneer de vereiste wikitext rechtstreeks zou zijn geschreven.

In tegenstelling tot een sjabloon-aanroep, toont wikitext na vervanging niet hoe men een vergelijkbaar resultaat kan produceren. De wikitext kan lang en ingewikkeld zijn, en daardoor omslachtig om direct te schrijven, of het kan eenvoudig zijn, bijvoorbeeld een getal dat voortkomt uit een berekening, maar lastig om direct te vinden. Bij het bestuderen van de wikitext van een pagina kan men denken dat deze wikitexten is wat men moet schrijven en direct vinden om het resultaat te krijgen, zelfs in gevallen waarin dat zeer onpraktisch zou zijn.

In dergelijke gevallen is documentatie van de aanroep nuttig. Net zoals bij computerprogrammering veranderen we de code en/of de data om nieuwe resultaten te produceren, en we veranderen niet direct het objectbestand, hier zouden we de sjabloon-aanroepen en/of de sjablonen wijzigen, in plaats van de wikitext direct te veranderen die voortkomt uit de vervanging.

Gewone sjablonen

In het geval van vervanging van een gewoon sjabloon wordt de sjabloontag vervangen door de wikitext van het sjabloon, waarbij de parameters worden vervangen door de parameterwaarden.

Voorbeeld: m:Template:t2, bevat
start-{{{1}}}-middle-{{{2}}}-end
en aangeroepen als {{subst:t2|[[a]]|{{tc}}}} (zie {{Tc }}) geeft de wikitext:
start-[[a]]-middle-{{tc}}-end, wordt opgebouwd
start-a-middle-in-end.

De vervanging verwijdert de noinclude delen en de includeonly tags.

Parameters:

  • Een vervanging met p=r vervangt {{{p}}} en {{{p|q}}} door r. Dit omvat de gevallen waarin r van de vorm {{{s}}} of {{{s|t}}} is.
  • Een substitutie met een ongedefinieerde p behoudt {{{p}}} en vervangt {{{p|q}}} door de standaard q (in de Engelse Wikipedia).

Met subst: werkt de vervanging van een sjabloon-tag niet recursief. Voor volledige recursieve vervanging gebruik Special:ExpandTemplates. Zie ook substall en hieronder multilevel substitutie.

Stapsgewijze vervanging van sjablonen, inclusief andere sjablonen, waaronder meer sjablonen, kan nuttig zijn voor het analyseren en documenteren van het gedrag van complexe sjablonen.

Na een vervanging kan een pagina echter anders weergegeven worden, bijvoorbeeld als sjablonen haakjes, "|" of gelijkwaardige tekens produceren die na vervanging de uitbreiding van andere sjablonen bepalen, maar zonder vervanging als gewone tekst worden behandeld.

Bij afwezigheid van parameters kan sjabloonvervanging worden vergeleken met het kopiëren van de wikitext, of het opbouwen van een voorvertoonde of opgeslagen {{ msgnw:paginanaam }} inclusie. Vervanging van een sjabloon luit echter delen ‎<noinclude> uit, verwijdert ‎<includeonly> tags en vervangt ongedefinieerde parameters met standaardwaarden door die standaardwaarden.

Voorgedefinieerde sjablonen

In het geval van vervanging van een vooraf gedefinieerd sjabloon, zonder parameters afhankelijk van andere sjablonen, wordt de tag vervangen door het resultaat.

subst: moet direct voor de vooraf gedefinieerde sjabloonnaam zonder tussenliggende spaties worden toegevoegd.

Het toepassen van vervanging van een variabele werkt net als bij een sjabloon. Bijv. een tijdstempel:

{{subst:CURRENTYEAR}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTDAY}} T {{subst:CURRENTTIME}} [[w:UTC|]]

kan de wikitext geven

2010-04-10 T 06:30 [[w:UTC|UTC]]

wordt weergegeven als

2010-04-10 T 06:30 UTC

In het geval van vervanging van een vooraf gedefinieerd sjabloon met een parameter afhankelijk van een ander sjabloon, moet die ook worden vervangen door een aparte modifier subst:, anders is het resultaat ongedefinieerd.

  • {{subst:UC:{{subst:tc}}}} – geeft IN, dezelfde wikitext als {{UC:{{tc}}}} wordt uitgebreid naar; UC: wordt toegepast op de uitvoer "in" van Tc.
  • {{subst:ns:{{subst:#expr:2*3}}}} – geeft File.
  • {{ns:{{subst:#expr:2*3}}}} – geeft wikitext {{ns:6}} weergegeven als File.
  • {{subst:t1|{{subst:NAMESPACE}}}} – geeft wikitext startHelpend (zie {{T1 }})
  • {{subst:t1|{{subst:#expr:3*4}}}} – geeft wikitext start12end
  • {{subst:t1|{{subst:uc:AbCdEf}}}} – geeft wikitext startABCDEFend
  • {{subst:#expr:{{subst:3X|11*}}1}} – geeft wikitext 1331
  • {{subst:UC:{{subst:3X|abc}}}} – geeft wikitext ABCABCABC
  • {{subst:LC:{{subst:#expr:1/100000}}}} – geeft wikitext 1e-05
  • {{subst:#expr:2*{{subst:CURRENTDAY}}}} – geeft (op het moment van schrijven) de wikitext 30
  • {{subst:UC:{{subst:CURRENTDAYNAME}}}} – geeft (op het moment van schrijven) de wikitext THURSDAY

Echter:

  1. {{subst:UC:{{tc}}}} – geeft wikitext {{TC}} weergegeven als the current page's transclusion count.
  2. {{subst:ns:{{#expr:2*3}}}} – blijft {{subst:ns:{{#expr:2*3}}}}, weergegeven als {{subst:ns:6}}.

Zoals eerder vermeld, worden bij vervanging alle aanroepen zonder vervanging van sjablonen, variabelen en parserfuncties als gewone tekst behandeld. Als gevolg daarvan is de vervanging van de buitenste x: in een geneste {{ x:...{{ y:...}} }} vaak alleen geschikt als alle binnenste y: ook worden vervangen.

In het geval van vervanging van een vooraf gedefinieerd sjabloon, als de expressie voor een van zijn parameters {{{p|3}}} bevat met ongedefinieerde p, wordt deze code teruggebracht tot 3. Maar op de pagina zelf wordt {{{p|3}}} als zodanig behandeld, niet als 3.

Voorbeelden:

  • {{#expr:2*{{{p}}}}}Expression error: Unrecognized punctuation character "{".
  • {{#expr:2*{{{p|3}}}}}6
  • {{subst:#expr:2*{{{p|3}}}}}Expression error: Unrecognized punctuation character "{".
  • door een sjabloon met {{<includeonly>subst:</includeonly>#expr:2*{{{p|3}}}}} te vervangen, krijgt het 6 als waarde als aan p geen waarde is toegewezen, en het dubbele van het aantal p als het een een waarde wordt toegewezen.
  • hetzelfde resultaat kan worden verkregen uit een sjabloon met {{{{{subst}}}#expr:2*{{{p|3}}}}}, als de vervangingsaanroep een parameter van "subst=subst:" heeft.

Vergelijk:

  • {{uc:2*{{{p}}}}}2*{{{P}}}
  • {{uc:2*{{{p|q}}}}}2*Q
  • {{subst:uc:2*{{{p|q}}}}} → de wikitext 2*{{{P|Q}}} wordt weergegeven als 2*Q

en ook (van boven):

Bij de vervanging van UC, wordt de inclusie-tag {{tc}} als een string behandeld net als {{{p|q}}}.

Gedeeltelijke substitutie

In een gewone sjabloon kan men vervanging toepassen op een gewone sjabloonaanroep met een parameter, om deze te vervangen door directe wikitext met de parameter. Het komt neer op het automatisch samenvoegen van de twee sjablonen (het creëren van een "samengesteld sjabloon" zoals een samengestelde functie). Het is niet mogelijk indien het interne en/of externe sjabloon is voorgedefinieerd. (Het handmatig samenvoegen, bijvoorbeeld een aanroep van #expr in een andere, is echter nuttig om de nauwkeurigheid van het resultaat te verhogen door tussentijdse afronding tot 12 cijfers te vermijden.)

Op deze manier kan men afzien van de onderstaande optionele substitutietechniek en de vervanging van het resulterende externe sjabloon toepassen door gewoon subst: te gebruiken (tenzij er meer niveaus van nesten zijn).

Voorbeeld:

  • {{subst:t}} – geeft de wikitext start-{{{1|pqr}}}-end, alleen die van m:Template:t, zonder noinclude delen en includeonly tags
  • {{subst:t|a{{{p|q}}}b}} – geeft wikitext start-a{{{p|q}}}b-end

Voorbeelden met dubbele vervanging:

  • {{subst:3X|{{subst:t}}}} – geeft wikitext start-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|q}}}-end
  • {{subst:3X|{{subst:t|{{{1|q}}}}}}} – geeft wikitext start-{{{1|q}}}-endstart-{{{1|q}}}-endstart-{{{1|q}}}-end

Multilevel substitutie

Bij het vervangen van een sjabloon kan het wenselijk zijn om ook een vervanging binnen het sjabloon uit te voeren. Dit kan met safesubst: in het sjabloon worden gedaan.

Om te voorkomen dat een vroegtijdige vervanging plaatsvindt (dat wil zeggen wanneer het sjabloon wordt opgeslagen), is het mogelijk om de directieve ‎<noinclude /> na die inzake vervanging - dat wil zeggen safesubst:<noinclude /> - toe te voegen. Een andere oplossing is om de standaardwaarde van een niet-gebruikte parameter te gebruiken. Vaak werkt de lege string, d.w.z. {{{|safesubst:}}}, maar soms wordt deze gebruikt door modules die sjablonen aanroepen of voor het invoeren van opmerkingen. De netste manier om vroegtijdige vervanging in sjablonen te voorkomen is om de sjablooncode in ‎<includeonly>...‎</includeonly> te zetten, terwijl u standaard {{safesubst: aanroepen gebruikt; de presentatie van het sjabloon op de sjabloon-subpagina kan vervolgens worden beheerd vanaf de documentatie-subpagina.

Het verschil met subst:<noinclude /> is dat safesubst:<noinclude />, als u het tot safesubst: evalueert, niet alleen meervoudige vervanging mogelijk maakt, maar ook meervoudige transclusie, omdat het bij transclusie wordt genegeerd. Om het sjabloon zo te maken dat de keuze tussen deze twee opties en een niveauvervanging mogelijk is (en meer keuzes indien er meer sjablonen, variabelen en/of parserfuncties zijn betrokken), zijn één of meer parameters nodig, zie hieronder.

Multilevel substitutie met onafhankelijke controle van elke afzonderlijke substitutie

Een parameter vervanging (of meervoudig, elk met zijn eigen naam) kan worden gebruikt met safesubst: en de lege string als mogelijke waarden. Zo kunnen we bijvoorbeeld controleren of een binnenste sjabloon ook wordt vervangen wanneer het buitenste sjabloon wordt vervangen. Beide mogelijkheden kunnen de standaard worden.

De binnenste sjablonen met parameters kunnen op dezelfde manier verdere substituties controleren; deze parameters kunnen afhankelijk zijn van de substitutieparameter die de substitutie van het binnenste sjabloon controleert, omdat indien die niet wordt vervangen, interne substituties binnen dat sjabloon niet mogelijk zijn.

Als er in het binnenste sjabloon (of meerdere) ook meerdere sjablonen, variabelen en/of parserfuncties zijn, kunnen we de vervanging van alle controleren, hetzij onafhankelijk door verschillende parameters te gebruiken, of met sommige of alle met dezelfde parameter.

Bijvoorbeeld, als sjabloon T parameter subst1 gebruikt:

  • met de lege string als standaard, roept T de binnenste sjablonen en parserfuncties aan met het voorvoegsel {{{subst1|}}}; voor het aanroepen van T kunnen we gebruiken:
    • {{t|..}} – geen vervanging
    • {{subst:t|..}} – een-niveau vervanging
    • {{subst:t|subst1=subst:|..}} – twee-niveau vervanging
    • {{subst:t|subst1=safesubst:|..}} – ook
  • met "safesubst:" als standaard, roept T de binnenste sjablonen en parserfuncties aan met het voorvoegsel {{{subst1|safesubst:}}}; voor het aanroepen van T kunnen we gebruiken:
    • {{t|..}} – geen vervanging
    • {{subst:t|subst1=|..}} – een-niveau vervanging
    • {{subst:t|..}} – twee-niveau vervanging

Om de keuze om te vervangen of niet te vervangen van de sjablonen en parserfuncties die binnen de binnenste sjablonen van T worden aangeroepen, over te dragen, kunnen we aan de aanroep van deze binnenste sjablonen respectievelijk iets van de vorm subst2={{{subst1|}}} of subst2={{{subst1|safesubst:}}} toevoegen, respectievelijk (variabelen en parserfuncties krijgen de extra parameter niet).

Gedeeltelijke substitutie

Met behulp van een sjabloon die alleen voor optionele subst=subst: is voorbereid met gewone vervanging, zonder parameters te specificeren, kan de code in een ander sjabloon worden ingevoegd, zoals kopiëren en plakken, maar alle delen ‎<noinclude> en sleutelwoorden ‎<includeonly> worden automatisch verwijderd. Het uitvoeren van ingevoegde code in plaats van het aanroepen kan efficiënter zijn voor de server.

Een typisch voorbeeld van deze techniek is het uitbreiden van een sjabloon binnen een ander sjabloon dat als testexpressie wordt gebruikt in een #switch: zoals m:Template:len:

  1. Ontwikkeling codeː
    {{#switch: {{len|parameter tag}}|0=case 0 etc.}}
  2. Standaard oplossing:
    {{{{{subst|}}}#switch: {{{{{subst|}}}len|parameter tag|subst={{{subst|}}}}}|0=case 0 etc.}}
  3. Betere oplossing: maak een sjablooncode door vervanging toe te passen met behulp van deze wikitext:
    {{{{{subst|}}}#switch: {{subst:len|parameter tag}}|0=case 0 etc.}}

m:Template:len is op optionele vervanging voorbereid, dus beide oplossingen werken, maar de laatste oplossing die de code vervangt, is eenvoudiger en efficiënter.

Zie m:Template:csn en m:Template:lz12 voor gevallen waarin Template:len op deze manier is vervangen.

Als een sjabloon een parameter gebruikt waarvan de naam een expressie is die een sjabloon of een parserfunctie bevat, en het sjabloon wordt genoemd met een overeenkomstige parameterdefinitie (in termen van de definitieve naam van de parameter), wordt deze alleen correct uitgebreid als op het moment van uitbreiding van het sjabloon de expressie voor de naam van de parameters is of is geëvalueerd. Als het sjabloon dus wordt vervangen zonder de expressie voor de parameternaam te vervangen, is de parameterdefinitie "verloren", waardoor de parameter ongedefinieerd wordt. Daarom kan in zo'n geval geen substitutie hetzelfde weergegeven resultaat geven als volledige substitutie, terwijl gedeeltelijke substitutie een ander resultaat geeft. Zie bijvoorbeeld m:Template:ts1.

Samengestelde bewerkingen

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 invocation without substitution. This technique is essential for templates producing timestamps of the time they were (first) called, e.g. to display them (like the English Wikipedia’s Proposed deletion and CURRENTISOTIME templates) or add including pages to dated categories.

The following code in any template T outputs a warning unless recursive substitution with subst=subst: is in effect:
{{{{{subst|}}}ifdef|{{{{{subst|subst:}}}ns:0}}|'''Warning'''}}.
  1. Output for {{T}} or {{subst:T}}Warning
  2. Output for {{T|subst=subst:}}Warning
  3. Output for {{subst:T|subst=subst:}}nothing (no remaining wikitext)
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 containing With {{{1}}} one can {{{2}}}
    • When substituted with 1=love, 2=help, it gives With love one can help.
    • When substituted with 2=help, it gives With {{{1}}} one can help. This itself, when substituted with 1=compassion, it gives With compassion one can help.
  • Two-level substitution of a template containing {{#if:{{{4}}}|{{{3}}}p}}.
    • When substituted with 3=u, 4=v, it gives up.
    • When substituted with 4=v, it gives {{{3}}}p. This itself, when substituted with 3=u, it gives up.

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 gives vp. This itself, when substituted with 3=u, it remains vp.
  • Two-level substitution of a template containing {{#if:{{{2}}}|{{{1}}}p}}
    • When substituted with 1=u, 2=v, it gives up.
    • When substituted with 2=v, it gives {{{1}}}pp (the bug). This itself, when substituted with 3=u, it gives upp.
  • Two-level substitution of a template containing {{#expr:{{{1}}}*{{{2}}}}}
    • When substituted with 1=7, 2=8, it gives 56.
    • When substituted with 2=8, it gives Expression error: Unrecognised punctuation character "{". This itself, when substituted with 1=7, it remains the same.

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}}} with 2=help gives With {{{1|love}}} one can help.
  • Two-level substitution of a template containing {{#if:{{{4}}}|{{{3|d}}}p}} with 4=v gives dp.

Not rendered the same as without substitution:

  • Het dubbele vervangen van een sjabloon met {{#if:{{{3|}}}|{{{4}}}p}} door 4=v geeft ̩vp.
  • Het dubbele vervangen van een sjabloon met {{#if:{{{2}}}|{{{1|d}}}p}} door 2=v geeft ̩dpp (de fout).
  • Het dubbele vervangen van een sjabloon met {{#expr:{{{1|6}}}*{{{2}}}}} door 2=8 geeft: Expression error: Unrecognised punctuation character "{"

Na vervanging met de parameterdefinitie:

  • {{subst:#if:{{{3|}}}|vp}}vp
  • {{subst:#if:v|{{{1|d}}}p}}dpp (de fout)
  • {{subst:#expr:{{{1|6}}}*8}}Expression error: Unrecognised punctuation character "{"

Herschrevenː

  • {{subst:#if:{{subst:#ifeq:{{{3|+}}}|{{{3|-}}}|vp}}}} → de lege string
  • {{subst:#if:v|{{subst:#ifeq:{{{1|+}}}|{{{1|-}}}|{{{1}}}|d}}p}}dp
  • {{subst:#expr:{{subst:#ifeq:{{{1|+}}}|{{{1|-}}}|{{{1}}}|6}}*8}}48

Beperkingen

Substitutie is niet beschikbaar in parsertags zoals ‎<ref>...‎</ref> en ‎<gallery>...‎</gallery>. Als u {{subst:foo}} schrijft, wordt het niet vervangen of transcluded, maar blijft het zoals het is.

Substitutie documenteren

Gebruik van een sjabloon door subst: wordt niet automatisch weergegeven in paginageschiedenis. Daarom is het bijzonder nuttig om de regel wikitext bevat "subst:" in de bewerkingssamenvatting te geven.

Ook komen pagina's met een vervangen sjabloon niet voor in backlinks, en het sjabloon verschijnt niet in de lijst van getranscludeerde sjablonen op de bewerkingspagina. Het sjabloon kan pagina's toevoegen aan een categorie om substituties te volgen, maar het opnemen van deze categorie op een pagina kan de lijst met inhoudsgebaseerde categorieën waarin de pagina zich bevindt, rommelig maken. Ook komen opmerkingen buiten noinclude tags in de wikitext. Een commentaar kan dus worden gebruikt om het sjabloon te vermelden. Het kan zelfs de waarden van de parameters bevatten, omdat de vervanging van parameters zelfs in opmerkingen werkt.

Zie ook