Jump to content

Aide:Substitution

From mediawiki.org
This page is a translated version of the page Help:Substitution and the translation is 100% complete.
PD 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.
PD

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 le motif {{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 les 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 si le wikicode requis avait é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 qu'il 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 du 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 la valeur par défaut q (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 la substitution à plusieurs niveaux ci-dessous.

La substitution de modèles par étapes, y compris l'inclusion d'autres modèles appelant aussi des 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 égal 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’une inclusion de {{ msgnw:nom de page }} prévisualisée ou sauvegardée. Néanmoins la substitution de modèle exclue les parties ‎<noinclude>, supprime les balises ‎<includeonly> et remplace les paramètres indéfinis par leur valeur par défaut.

Modèles prédéfinis

Dans le cas de la substitution d'un modèle prédéfini, sans paramètre et qui dépend d'autres modèles, la balise est remplacée par le résultat.

subst: a dû être ajouté directement devant le nom prédéfini du modèle sans espace intermédiaire.

Appliquer subst à une variable fonctionne comme l'appliquer à un modèle. Par exemple un horodatage :

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

peut donner le wikcode

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

rendu comme :

2010-04-10 T 06:30 UTC

Dans le cas de la substitution d'un modèle prédéfini avec un paramètre dépendant d'un autre modèle, celui-ci doit également être remplacé par un modificateur séparé subst:, sinon le résultat est indéfini.

  • {{subst:UC:{{subst:tc}}}} - donné IN, le même wikicode dans lequel {{UC:{{tc}}}} est expansé; UC: est appliqué à la sortie "in" de Tc.
  • {{subst:ns:{{subst:#expr:2*3}}}} - Donne le fichier.
  • {{ns:{{subst:#expr:2*3}}}} - donne le wikicode {{ns:6}} qui génère File.
  • {{subst:t1|{{subst:NAMESPACE}}}} - donne le wikicode startHelpend (voir {{T1 }})
  • {{subst:t1|{{subst:#expr:3*4}}}} - donne le wikicode start12end
  • {{subst:t1|{{subst:uc:AbCdEf}}}} - donne le wikicode startABCDEFend
  • {{subst:#expr:{{subst:3X|11*}}1}} - donne le wikicode 1331
  • {{subst:UC:{{subst:3X|abc}}}} - donne le wikicode ABCABCABC
  • {{subst:LC:{{subst:#expr:1/100000}}}} - donne le wikicode 1e-05
  • {{subst:#expr:2*{{subst:CURRENTDAY}}}} - donne (au moment de la rédaction de cet article) le wikicode 30
  • {{subst:UC:{{subst:CURRENTDAYNAME}}}} - donne (au moment de la rédaction de cet article) le wikicode THURSDAY

Néanmoins :

  1. {{subst:UC:{{tc}}}} - donne le wikicode {{TC}} rendu comme Template:TC.
  2. {{subst:ns:{{#expr:2*3}}}} - reste à $, rendu comme {{subst:ns:6}}.

Comme mentionné précédemment, lors de la substitution, tous les appels sans substitution des modèles, des variables et de fonctions d'analyse syntaxique sont traitéss comme du texte ordinaire. En conséquence, le résultat du remplacement du x: externe imbriqué dans un {{ x:...{{ y:...}} }} n'est souvent approprié que si tous les y: internes sont également remplacés.

Dans le cas de substitution d'un modèle prédéfini, si l'expression pour l'un de ses paramètres contient {{{p|3}}} avec un p indéfini, ce code est réduit à 3. Cependant, sur la page elle-même, {{{p|3}}} est traité comme tel, et non comme 3.

Exemples :

  • {{#expr:2*{{{p}}}}}Expression error: Unrecognized punctuation character "{".
  • {{#expr:2*{{{p|3}}}}}6
  • {{subst:#expr:2*{{{p|3}}}}}Expression error: Unrecognized punctuation character "{".
  • en substituant un modèle contenant {{<includeonly>subst:</includeonly>#expr:2*{{{p|3}}}}} on obtient 6 si p est assigné à aucune valeur et deux fois le nombre p s'il est assigné à une valeur.
  • le même résultat peut être obtenu à partir d'un modèle contenant {{{{{subst}}}#expr:2*{{{p|3}}}}}, si l'appel de la substitution a un paramètre subst=subst:.

Comparer :

  • {{uc:2*{{{p}}}}}2*{{{P}}}
  • {{uc:2*{{{p|q}}}}}2*Q
  • {{subst:uc:2*{{{p|q}}}}} → le wikicode 2*{{{P|Q}}} généré comme 2*Q

et aussi (de ci-dessus) :

  • {{subst:UC:{{subst:tc}}}} - donne IN, tout comme le fait {{UC:{{tc}}}}; UC est appliqué à la sortie « in » de Tc.
  • {{subst:UC:{{tc}}}} - donne le wikicode {{TC}} rendu comme Template:TC.

Dans le remplacement de UC, la balise d'inclusion {{tc}} est traitée comme une chaîne tout comme {{{p|q}}}.

Substitution partielle

Dans un modèle classique, on peut appliquer la substitution à un appel de modèle ordinaire contenant un paramètre, pour le remplacer par le wikicode direct contenant le paramètre. Cela revient à fusionner directement les deux modèles (en créant un modèle composite telle une fonction composite). Ceci n'est pas possible si le modèle interne et / ou externe est prédéfini. (Cependant, la fusion manuelle, par exemple, d'un appel de #expr à l'intérieur d'un autre est utile pour augmenter la précision du résultat en évitant l'arrondissement intermédiaire à 12 chiffres.)

De cette façon, on peut se passer de la technique de substitution optionnelle décrite ci-dessous et appliquer la substitution du modèle externe résultant en utilisant simplement subst: (sauf s'il y a d'autres niveaux supplémentaires d'imbrication).

Exemple :

  • {{subst:t}} - donne le wikicode start-{{{1|pqr}}}-end comme avec m:Template:t, sans les parties noinclude et avec les balises includeonly
  • {{subst:t|a{{{p|q}}}b}} - donne le wikicode start-a{{{p|q}}}b-end

Exemples avec double substitution :

  • {{subst:3X|{{subst:t}}}} - donne le wikicode start-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|q}}}-end
  • {{subst:3X|{{subst:t|{{{1|q}}}}}}} - donne le wikicode start-{{{1|q}}}-endstart-{{{1|q}}}-endstart-{{{1|q}}}-end

Substitution multi-niveaux

Lorsqu'un modèle est remplacé, il peut être souhaitable de réaliser une substitution également à l'intérieur du modèle. Ceci peut être obtenu avec safesubst: dans le modèle. Pour éviter une substitution prématurée (c'est-à-dire lorsque le modèle est enregistré), il est possible d'ajouter la directive ‎<noinclude /> après la directive de substitution – c'est-à-dire safesubst:<noinclude />. Une autre solution consiste à utiliser la valeur par défaut d'un paramètre inutilisé. Souvent, la chaîne vide fonctionne, c'est-à-dire {{{|safesubst:}}}, mais elle est parfois utilisée par les modules qui appellent des modèles ou pour insérer des commentaires.

La différence avec subst:<noinclude /> est que safesubst:<noinclude />, évalué à safesubst: permet non seulement la substitution à plusieurs niveaux, mais aussi la transclusion à plusieurs niveaux, parce que pendant la transclusion, elle est ignorée. Pour permettre au modèle de choisir entre ces deux options ainsi que la substitution à un niveau (et plus de choix si davantage de modèles, de variables et (ou) de fonctions d'analyse syntaxique sont impliquées), un ou plusieurs paramètres sont nécessaires, voir ci-dessous.

Substitution multi niveaux en contrôlant chaque substitution indépendamment et séparément

Un paramètre subst (ou plus, chacun avec son propre nom) peut être utilisé avec safesubst: ainsi que la chaîne vide comme valeurs possibles. Ainsi, nous pouvons par exemple contrôler si un modèle intérne est également à substituer lorsque le modèle externe est remplacé. L'une ou l'autre des possibiités peuvent être définies par défaut.

Les modèles internes avec paramètres peuvent contrôler d'autres substitutions internes de la même manière; ces paramètres peuvent dépendre du paramètre de substitution contrôlant la substitution du modèle interne, car si ce modèle n'est pas remplacé, les substitutions internées dans ce modèle ne sont pas possibles.

De même, s'il y a plusieurs modèles, variables et (ou) les fonctions d'analyse syntaxique dans le ou les modèles internes, nous pouvons contrôler la substitution de tous, soit indépendamment en utilisant différents paramètres, soit avec certains ou tous en utilisant le même paramètre.

Par exemple, si le modèle T utilise le paramètre subst1 :

  • avec la chaîne vide par défaut, T appelle les modèles internes et les fonctions de partage en préfixant leurs noms avec {{{subst1|}}}; pour appeler T nous pouvons utiliser :
    • {{t|..}} - pas de substitution
    • {{subst:t|..}} - substitution à un niveau
    • {{subst:t|subst1=subst:|..}} - substitution à deux niveaux
    • {{subst:t|subst1=safesubst:|..}} - idem
  • avec la chaîne "safesubst:" par défaut, T appelle les modèles internes et les fonctions d'nalyse syntaxique en préfixant leurs noms avec {{{subst1|safesubst:}}}; pour appeler T nous pouvons utiliser :
    • {{t|..}} - pas de substitution
    • {{subst:t|subst1=|..}} - substitution à un niveau
    • {{subst:t|..}} - substitution à deux niveaux

Pour transférer le choix de substituer ou pas aux modèles et aux fonctions d'analyse appelées à l'intérieur des modèles internes de T, nous pouvons ajouter à l'appel de ces modèles internes quelque chose comme subst2={{{subst1|}}} ou subst2={{{subst1|safesubst:}}}, respectivement les (variables et les functions d'analyse ne recevront pas le paramètre supplémentaire).

Substitution partielle

L'utilisation d'un modèle préparé pour subst=subst: optionnel uniquement avec la substitution ordinaire, sans spécifier les valeurs de paramètre, permet d'insérer son code dans un autre modèle, comme un copier-coller, mais toutes les parties de ‎<noinclude> et les mots clés de ‎<includeonly> sont automatiquement retirés. Exécuter du code inséré au lieu de l'appeler peut être plus efficace pour le serveur.

Un exemple typique de cette technique est l'expansion, dans un autre modèle, d'un modèle utilisé comme expression de test dans un #switch: comme m:Template:len :

  1. Code du développement :
    {{#switch: {{len|parameter tag}}|0=case 0 etc.}}
  2. Solution standard :
    {{{{{subst|}}}#switch: {{{{{subst|}}}len|parameter tag|subst={{{subst|}}}}}|0=case 0 etc.}}
  3. Solution meilleure : créer le code du modèle en appliquant la substitution à l'aide de ce wikicode :
    {{{{{subst|}}}#switch: {{subst:len|parameter tag}}|0=case 0 etc.}}

m:Template:len est préparé pour une substitution facultative, les deux solutions fonctionnent donc, mais la dernière solution qui remplace son code est plus simple et plus efficace.

Voir m:Template:csn et m:Template:lz12 pour les cas où Template:len a été substitué de cette façon.

Si un modèle utilise un paramètre dont le nom est une expression contenant un modèle ou une fonction d'analyse syntaxique, et que le modèle est appelé avec une définition de paramètre correspondante (en termes du nom final du paramètre), il n'est correctement étendu que si, au moment de l'expansion du modèle, l'expression du nom du paramètres est ou a été évaluée. Ainsi, si le modèle est remplacé sans remplacer l'expression du nom du paramètre, la définition du paramètre est ``perdue, ce qui rend le paramètre non défini. Par conséquent, dans un tel cas, aucune substitution ne peut donner le même résultat rendu que la substitution complète, tandis que la substituation partielle donne un résultat différent. Voir par exemple m:Template:ts1.

Opérations composées

Pour {{A|{{B|p}}}} un modèle A est appelé avec, comme paramètre, un appel du modèle B avec un paramètre p. Nous pourrions intégrer de tels appels de modèles en un seul appel {{C|p}} d'un modèle composite C avec le paramètre p.

Le texte wiki pour le modèle C serait {{A|{{B|{{{1}}}}}}}, ou avec substitution optionnelle la construction suivante :
{{ {{{subst|}}} A|{{ {{{subst|}}} B|{{{1}}} |subst={{{subst|}}} }} |subst={{{subst|}}} }}
subst={{{subst|}}} est nécessaire uniquement pour la substitution récursive comme expliqué ci-dessus.

Notez qu'il n'est pas utile de spécifier {{subst|subst:}} puisque dans la phase de substitution cette balise ne se réduit pas à la valeur par défaut subst:.

Si A et/ou B sont prédéfinis, la construction est similaire, mais sans subst={{{subst|}}} pour ce modèle.

includeonly

Une autre manière pour empêcher la substitution anticipée, et connue sous de le nom de substitution magique includeonly, est d'utiliser une paire de balises includeonly. La substitution ne se fait pas quand le modèle est placé à l'intérieur de ces balises. La substitution est également empêchée si l'une ou les deux balises se trouvent n'importe où dans l'appel modèle, sauf dans une définition de paramètre. Ainsi, le ou les balises peuvent être avant, à l'intérieur ou après safesubst: ou subst:, ou à l'intérieur ou après le nom du modèle. Les positions des deux balises n'influencent que le rendu de la page du modèle elle-même.

La forme {{<includeonly>safesubst:</includeonly>something}} suggère que la substitution est empêchée en éliminant safesubst: sur la page elle même, mais actuellement la substitution est empêchée car la syntaxe d'auto-substitution est perturbée par les balises.

Il ne substitue pas something au moment de la création du modèle correspondant, mais a l'effet souhaité quand le modèle est substitué.

Pour les exemples, voir preload dans Extension:InputBox et substitution dans les Mots magiques .

Créer une page qui réalise la substitution lors du prochain enregistrement

Voir Manuel:Conversion récursive du wikicode .

Substitution forcée

Certains modèles refusent délibérément de fonctionner sans substituer, par exemple voir w:Template:en. Cette technique est essentielle pour les modèles comme w:Template:en qui produisent une sorte d'horodatage, par exemple en ajoutant des pages à des catégories datées.

Le code suivant dans n'importe quel modèle T produit un avertissement à moins que la substitution récursive par subst=subst: soit en vigueur:
{{{{{subst|}}}ifdef|{{{{{subst|subst:}}}ns:0}}|'''Warning'''}}.
  1. Sortie pour {{T}} ou {{subst:T}} - Warning
  2. Sortie pour {{T|subst=subst:}} - Warning
  3. Sortie pour {{subst:T|subst=subst:}} - rien (pas de texte wiki restant)
Ceci est un des rares cas où le remplacement de ifdef par #if: ne fonctionne pas directement.

Substitution d'une partie des paramètres

Forcer le modèle Feelings à utiliser les paramètres 1 et 2. Considérer la création d'un modèle Emotions avec un paramètre 1, correspondant à Feelings, avec une valeur donnée love du paramètre 2. Comparer {{Feelings|2=love}} et {{Feelings|1={{{1}}}|2=love}}. Ils ont la même apparence sur la page du modèle, voir par exemple m:Template:t ps, mais le premier ne fonctionne pas parce que {{{1}}} est traité comme du texte, et non pas comme un paramètre.

Cependant, avec la substitution (en utilisant subst: ou Special:Expandtemplates) le wikicode obtenu est le même, sans distinction entre un texte {{{1}}} et un paramètre, c'est un paramètres de toute façon, donc 1={{{1}}} n'est pas nécessaire.

Si Feelings contient par exemple #expr avec une expression contenant les deux paramètres, il en va de même, sauf que nous ne pouvons remplacer que le niveau le plus élevé (Feelings), pas la fonction d'analyse syntaxique, donc nous ne pouvons pas utiliser Special:Expandtemplates.

En général, le remplacement d'un paramètre et l'application d'un modèle ou d'une fonction d'analyse syntaxique donnent parfois le même résultat que le remplacements du modèle ou de la fonction d'analyse par le code du paramètre entouré de triple accolades et le remplacement du paramètre.

Sans les valeurs par défaut (tous rendus de la même manière dans une substitution en une seule passe que sans substitution) :

Exemples avec égalité :

  • modèle Feelings contenant With {{{1}}} one can {{{2}}}
    • Lorsqu'il est substitué par 1=love, 2=help, il rend With love one can help.
    • Lorsqu'il est substitué par 2=help, il rend With {{{1}}} one can help. Cela lui-même, lorsqu'il est remplacé par 1=compassion, donne With compassion one can help.
  • Remplacement à deux niveaux d'un modèle contenant {{#if:{{{4}}}|{{{3}}}p}}.
    • Lorsqu'il est substitué par 3=u, 4=v, il rend up.
    • Lorsqu'il est substitué par 4=v, il rend {{{3}}}p. Ceci en soi-même, lorsqu'il est substitué par 3=u, rend up.

Exemples sans égalité :

  • Substitution à deux niveaux d'un modèle contenant {{#if:{{{3}}}|{{{4}}}p}}
    • Lorsqu'il est substitué avec 3=, 4=v, il rend la chaîne vide.
    • Lorsqu'il est substitué par 4=v, il rend vp. Ceci en soi-même, lorsqu'il est substitué par 3=u, conserve vp.
  • Substitution à deux niveaux d'un modèle contenant {{#if:{{{2}}}|{{{1}}}p}}.
    • Lorsqu'il est substitué par 1=u, 2=v, il rend up.
    • Lorsqu'il est substitué par 2=v, il rend {{{1}}}pp (le bogue). Ceci en soi-même, lorsqu'il est substitué par 3=u, rend upp.
  • Substitution à deux niveaux d'un modèle contenant {{#expr:{{{1}}}*{{{2}}}}}
    • Lorsqu'il est substitué par 1=7, 2=8, il rend 56.
    • Quand il est substitué par 2=8, il rend Expression error: Unrecognised punctuation character "{". Ceci en soi-même, lorsqu'il est substitué par 1=7, conserve la même valeur.

Ainsi, sans égalité, nous pouvons ou ne pouvons pas recevoir de message d'erreur.

Un exemple montre que la substitution d'un paramètre peut être affectée par le bogue mentionné ci-dessus. Cependant, nous pouvons remplacer par exemple {{{1}}} par {{{1{{{{{substvoid|}}}void}}}}} et faire une substitution complète, sauf que substvoid est non défini, empêchant le bogue. Le résultat fonctionne déjà correctement avec la transclusion. Par la suite, il peut être remplacé par substvoid=subst: pour obtenir le {{{1}}} à plat.

Avec les valeurs par défaut :

Génère la même chose que sans substitution :

  • La substitution à deux niveaux d'un modèle contenant With {{{1|love}}} one can {{{2}}} avec 2=help donne With {{{1|love}}} one can help.
  • La substitution à deux niveaux d'un modèle contenant {{#if:{{{4}}}|{{{3|d}}}p}} avec 4=v donne dp.

Pas de rendu, même chose que sans substitution :

  • La substitution à deux niveaux d'un modèle contenant {{#if:{{{3|}}}|{{{4}}}p}} avec 4=v donne vp :
  • La substitution à deux niveaux d'un modèle contenant {{#if:{{{2}}}|{{{1|d}}}p}} avec 2=v donne dpp (le bogue).
  • La substitution à deux niveaux d'un modèle contenant {{#expr:{{{1|6}}}*{{{2}}}}} avec 2=8 donne : Expression error: Unrecognised punctuation character "{"

Après substitution par la définition du paramètre :

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

Réécrit :

  • {{subst:#if:{{subst:#ifeq:{{{3|+}}}|{{{3|-}}}|vp}}}} → la chaîne vide
  • {{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