Help:Substitution/nl
| Let op: Als u deze pagina bewerkt, gaat u akkoord met het vrijgeven van uw bijdragen onder de CC0. Zie Helppagina’s Publiek Domein voor meer informatie. Sommige oude revisies van deze pagina zijn geïmporteerd onder de CC BY-SA licentie. Alleen nieuwe bijdragen zijn publieke domein. |
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 waarinrvan de vorm {{{s}}} of {{{s|t}}} is. - Een substitutie met een ongedefinieerde
pbehoudt{{{p}}}en vervangt {{{p|q}}} door de standaardq(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:
{{subst:UC:{{tc}}}}– geeft wikitext{{TC}}weergegeven als the current page's transclusion count.{{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
pgeen waarde is toegewezen, en het dubbele van het aantalpals 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):
{{subst:UC:{{subst:tc}}}}– geeft IN, net als {{UC:{{tc}}}}; UC wordt toegepast op de uitvoer "in" van Tc.{{subst:UC:{{tc}}}}– geeft wikitext{{TC}}weergegeven als the current page's transclusion count.
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 wikitextstart-{{{1|pqr}}}-end, alleen die van m:Template:t, zonder noinclude delen en includeonly tags{{subst:t|a{{{p|q}}}b}}– geeft wikitextstart-a{{{p|q}}}b-end
Voorbeelden met dubbele vervanging:
{{subst:3X|{{subst:t}}}}– geeft wikitextstart-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|q}}}-end{{subst:3X|{{subst:t|{{{1|q}}}}}}}– geeft wikitextstart-{{{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
Tde binnenste sjablonen en parserfuncties aan met het voorvoegsel {{{subst1|}}}; voor het aanroepen vanTkunnen 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
Tde binnenste sjablonen en parserfuncties aan met het voorvoegsel {{{subst1|safesubst:}}}; voor het aanroepen vanTkunnen 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:
- Ontwikkeling codeː
{{#switch: {{len|parameter tag}}|0=case 0 etc.}} - Standaard oplossing:
{{{{{subst|}}}#switch: {{{{{subst|}}}len|parameter tag|subst={{{subst|}}}}}|0=case 0 etc.}} - 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
Door {{A|{{B|p}}}} wordt een sjabloon A aangeroepen met, als parameter, een aanroep van sjabloon B met een parameter p.
We zouden zulke sjabloonaanroepen kunnen integreren in één enkele aanroep {{C|p}} van een "sjabloon composite" C met parameter p.
- De wikitext voor sjabloon
Czou{{A|{{B|{{{1}}}}}}}zijn, of met optionele vervanging de volgende constructie : - {{ {{{subst
|}}} A|{{ {{{subst|}}} B|{{{1}}} |subst={{{subst|}}} }} |subst={{{subst|}}} }} - De
subst={{{subst|}}}is alleen nodig voor recursieve vervanging zoals hierboven beschreven.
Merk op dat het niet nuttig is om {{subst|subst:}} te specificeren, omdat in de vervangingsfase die tag niet terugkomt tot de standaard subst:.
Als A en/of B voorgedefinieerd zijn, is de constructie vergelijkbaar, maar zonder subst={{{subst|}}} voor dat sjabloon.
includeonly
Een alternatieve methode om voortijdige vervanging te voorkomen, bekend als "includeonly subst magic", is met een paar tags includeonly.
De vervanging wordt voorkomen door de aanroep in deze tags te plaatsen.
De vervanging wordt ook voorkomen door een of beide tags overal in de sjabloonaanroep te hebben, behalve binnen een parameterdefinitie.
De tag(s) kunnen dus vóór, binnen of na safesubst: of subst: staan, of binnen of na de sjabloonnaam.
De positie van de twee tags beïnvloedt alleen de weergave van de sjabloonpagina zelf.
De vorm {{<includeonly>safesubst:</includeonly>iets}} suggereert dat substitutie wordt voorkomen door safesubst: op de pagina zelf weg te halen, maar in werkelijkheid wordt substitutie verhinderd omdat de safesubst-syntaxis door de tags wordt verstoord.
Het vervangt "iets" niet bij het maken van het betreffende sjabloon, maar heeft het gewenste effect wanneer het sjabloon wordt vervangen.
Voor voorbeelden, zie "preload" in Extensie InputBox en "substitutie" in Help - Magische woorden.
Een pagina aanmaken die substitutie toepast bij het de volgende keer opslaan
Zie Manual:Recursive conversion of wikitext.
Geforceerde substitutie
Sommige sjablonen weigeren opzettelijk een aanroep zonder substitutie. Deze techniek is essentieel voor sjablonen die tijdstempels produceren van het tijdstip waarop ze (voor het eerst) werden aangeroepen, bijvoorbeeld om ze weer te geven (zoals de Engelse Wikipedia's Voorgestelde verwijdering en CURRENTISOTIME sjablonen) of het toevoegen van pagina's aan gedateerde categorieën.
- De volgende code in een sjabloon
Tgeeft een waarschuwing, tenzij een recursieve substitutie metsubst=subst:van kracht is: {{{{{subst|}}}ifdef|{{{{{subst|subst:}}}ns:0}}|'''Warning'''}}.- Uitvoer voor
{{T}}of{{subst:T}}– Warning - Uitvoer voor
{{T|subst=subst:}}–Warning - Uitvoer voor
{{subst:T|subst=subst:}}– Niets (geen resterende wikitext)
- Uitvoer voor
- Dit is een zeldzaam geval waar het vervangen van
ifdefdoor#if:niet rechtstreeks werkt.
Substitutie van een deel van de parameters
Stel dat sjabloon Feelings de parameters 1 en 2 gebruikt.
Denk aan het maken van een sjabloon Emotions met één parameter 1, overeenkomend met Feelings, met een gegeven waarde love van parameter 2.
Vergelijk {{Feelings|2=love}} en {{Feelings|1={{{1}}}|2=love}}.
Ze zien er hetzelfde uit op de sjabloonpagina, zie bijvoorbeeld m:Template:t ps, maar de eerste werkt niet omdat {{{1}}} als tekst wordt behandeld, niet als parameter.
Bij vervanging (met subst: of Special:Expandtemplates) is de resulterende wikitext echter hetzelfde, zonder onderscheid tussen een tekst {{{1}}} en een parameter, het is toch een parameter. 1={{{1}}} is dus niet nodig.
Als Feelings bijvoorbeeld #expr bevat met een expressie met beide parameters, geldt hetzelfde, behalve dat we alleen het hoogste niveau (Feelings) kunnen vervangen, niet de parserfunctie, dus we kunnen Special:Expandtemplates niet gebruiken.
In het algemeen geeft het vervangen van een parameter en het toepassen van een sjabloon of parserfunctie soms hetzelfde resultaat als het vervangen of vervangen van het sjabloon of parserfunctie met de parametercode met drievoudige haakjes en vervolgens het vervangen van de parameter.
Zonder standaarden (alles wordt in een een stap vervangen als zonder vervanging):
Voorbeelden met gelijkheid:
Feelingssjabloon bevatWith {{{1}}} one can {{{2}}}- Als het vervangen wordt door
1=love,2=help, dan geeft hetWith love one can help. - Als het wordt vervangen door
2=help, geeft hetWith {{{1}}} one can help. Dit zelf, wanneer het wordt vervangen door1=compassion, geeft hetWith compassion one can help.
- Als het vervangen wordt door
- Twee-niveau vervanging van een sjabloon met
{{#if:{{{4}}}|{{{3}}}p}}.- Als het vervangen wordt door
3=u,4=v, dan geeft hetup. - Als het wordt vervangen door
4=v, geeft het{{{3}}}p. Dit zelf, wanneer het wordt vervangen door3=u, geeft hetup.
- Als het vervangen wordt door
Voorbeelden zonder gelijkheid:
- Twee-niveau vervanging van een sjabloon met
{{#if:{{{3}}}|{{{4}}}p}}- Als het vervangen wordt door
3=,4=v, dan geeft het een lege string. - Als het wordt vervangen door
4=v, geeft hetvp. Dit zelf, wanneer het wordt vervangen door3=u, het blijftvp.
- Als het vervangen wordt door
- Twee-niveau vervanging van een sjabloon met
{{#if:{{{2}}}|{{{1}}}p}}- Als het vervangen wordt door
1=u,2=v, dan geeft hetup. - Als het wordt vervangen door
2=v, geeft het{{{1}}}pp(de fout). Dit zelf, wanneer het wordt vervangen door3=u, geeft hetupp.
- Als het vervangen wordt door
- Twee-niveau vervanging van een sjabloon met
{{#expr:{{{1}}}*{{{2}}}}}- Als het vervangen wordt door
1=7,2=8, dan geeft het56. - Als het wordt vervangen door
2=8, geeft het Expression error: Unrecognised punctuation character "{". Dit zelf, wanneer het wordt vervangen door1=7, het blijft hetzelfde.
- Als het vervangen wordt door
Zonder gelijkheid kunnen we dus wel/niet een foutbericht krijgen.
Een voorbeeld toont aan dat de vervanging van één parameter kan worden beïnvloed door de bovengenoemde fout.
We kunnen echter {{{1}}} vervangen door {{{1{{{{{substvoid|}}}void}}}}} en volledige vervanging doen, behalve dat substvoid ongedefinieerd is, waardoor de fout wordt voorkomen.
Het resultaat werkt al correct bij de transclusie.
Vervolgens kan het worden vervangen door substvoid=subst: zodat we gewone {{{1}}} krijgen.
Met standaarden:
Bouwt hetzelfde op als zonder vervanging:
- Twee-niveau vervangen van een sjabloon met
With {{{1|love}}} one can {{{2}}}door2=helpgeeft ̩With {{{1|love}}} one can help. - Twee-niveau vervangen van een sjabloon met
{{#if:{{{4}}}|{{{3|d}}}p}}door4=vgeeft ̩dp.
Bouwt niet hetzelfde op als zonder vervanging:
- Twee-niveau vervangen van een sjabloon met
{{#if:{{{3|}}}|{{{4}}}p}}door4=vgeeft ̩vp. - Twee-niveau vervangen van een sjabloon met
{{#if:{{{2}}}|{{{1|d}}}p}}door2=vgeeft ̩dpp(de fout). - Twee-niveau vervangen van een sjabloon met
{{#expr:{{{1|6}}}*{{{2}}}}}door2=8geeft: 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
- Help:Substitution/tl;dr – tl;dr
- Substitution
- Wikipedia:Substitution – deels technisch, deels beleid
- Phabricator:T4003 – functieverzoek om het markeren van een sjabloon als vervangend zonder
subst:toe te staan - Sjablonen die een aanroep naar zichzelf bevatten met
subst:en een vergelijkbare aanroep met bijgewerkte informatie genereren, waarbij de eerdere informatie wordt vervangen of toegevoegd: - De truc met de "|", die zich vergelijkbaar gedraagt als sjabloonvervanging