Manual:Recursive conversion of wikitext/fr

Normalement, le wikicode tel que {{subst:a}} n'est pas enregistré comme {{subst:a}} si {{template:a}} existe, parce que subst: enregistre le codage de template:a à sa place.

Avec certains codages, subst: ne convertit pas automatiquement la première fois qu'il est enregistré. Un éditeur peut créer du wikicode qui est converti quand il est sauvegardé à nouveau, ou converti à chaque sauvegarde.

Retarder la substitution avec Template:subst

La substitution peut être retardée d'une opération d'enregistrement en utilisant Template:Subst contenant Subst

ce modèle peut avoir des noms différents en fonction du wiki. Sur Wikipedia, il s'appelle Template:Delay subst.
Modèle utilisé Code du modèle Saisie Enregistrer Résultat
Template:subst {{subst: {{subst:subst}}a|b}} save page {{subst:a|b}}
  1. Le ficher à enregistrer initialement contient {{subst:subst}}a|b}}
  2. Lorsqu'il est enregistré pour la première fois, {{subst:subst}} est remplacé par le contenu du modèle subst, limité à la partie incluse, c'est à dire : {{subst:
  3. Après avoir été sauvegardé, le fichier contient maintenant {{subst:a|b}}
  4. Le prochain enregistrement (avec ou sans modifications n'importe où sur la page) résultera en la substitution normale du modèle a.

Exemples plus complexes

Dans {{subst:substancia}}a|b}} les accolades explicites ne sont pas appairées - il y a deux { et quatre }.

Le problème des accolades non appairées est que lorsque ce code est inclus dans la portée d'un {{subst: ... | ... | ... }} englobant, l'analyseur syntaxique identifie les paramètres du {{subst: incluant en supposant que ce qu'il y a entre les barres verticales '|' (ou les accolades fermantes) est le texte normal du modèle et doit être appairé. Donc si {{subst:subst}}a|b}} se trouve à l'intérieur d'une autre paire d'accolades doubles, les accolades fermantes terminales }} du code le plus interne sont prises comme accolades fermantes pour la paire externe.

Voir l'exemple avec :

Modèle utilisé Code du modèle Saisie Enregistrer Résultat
Template:T1demo start-{{{1}}}-end {{subst:t1demo|{{subst:subst}}a|b}}|c}} save page start-{{subst:a-end|c}}
  1. Lors de la sauvegarde du fichier, le premier subst:t1demo signifie que, au lieu d'enregistrer le fichier tel qu'il est, le modèle T1demo doit être appelé avec tout ce qui peut s'apparenter à ses paramètres, le résultat remplaçant la séquence appelante. Le modèle T1demo doit pour cela initialiser son paramètre :
  2. L'analyse formelle voit la séquence appairée correctement {{subst:subst}}a entre le premier et le second pipe : cette chaîne est donc passée comme paramètre 1.
  3. Le terme "b" est alors vu entre le pipe et des accolades fermantes }}; il est donc identifié comme le paramètre 2.
  4. Le contenu du modèle est ensuite évalué, en remplaçant {{{1}}}} par la valeur identifiée comme paramètre 1 - et le modèle apparemment n'utilise pas un paramètre 2.

A cause de ces accolades non appairées, la séquence {{subst:subst}}a|b}} ne peut plus fonctionner du tout car elle est désarticulée et perdue dans l'appel du modèle qui l'inclut.

Les accolades peuvent s'appairer avec Template:)), ce qui se substitue à deux accolades fermantes.

modèle utilisé code du modèle Coller ou saisir Enregistrer Résultat
Template:)) }} {{subst:subst}}a|b{{subst:))}} save page {{subst:a|b}}
Template:T1demo start-{{{1}}}-end {{subst:t1demo|{{subst:subst}}a|b}}|c{{subst:))}} save page start-{{subst:a-end|c}}

Cette fois, lors de l'enregistrement du fichier, le premier subst:t1demo identifiera correctement les accolades fermantes correspondant aux accolades ouvrantes. Mais le code interne qui est identifié en tant que paramètres lit : {{subst:subst}}a|b{{subst:))}}|c et l'analyseur voit maintenant deux paramètres séparés par un pipe :

  1. {{subst:subst}}a
  2. b{{subst:))}}

Le problème maintenant est que, les accolades ouvrantes du second subst: prévu ont été masquées à l'analyseur syntaxique dans un {{subst:subst}} formellement appairé; et les accolades fermantes ont été masquées également, dans un {{))}} formellement appairé, l'analyseur ne peut pas voir que le pipe du milieu est censé être à l'intérieur de l'une des paires d'accolades dans le code interne, il est donc pris comme séparateur de paramètres du modèle extérieur ou de la fonction d'analyse.

Pour masquer ce pipe dans la première analyse, nous avons besoin du mot magique "!" qui est équivalent à "{{subst:!}} :

Coller ou saisir Enregistrer Résultat
{{subst:t1|{{subst:subst}}a{{subst:!}}b{{subst:))}}|c}} Save page start-{{subst:a|b}}-end
  1. Au premier appel, l'analyseur syntaxique identifie correctement les paramètres de t1 comme étant :
    {{subst:subst}}a{{subst:!}}b{{subst:))}}|c
  2. Ce bloc de paramètres est formé de deux paramètres séparés par un pipe de premier niveau :
    1. {{subst:subst}}a{{subst:!}}b{{subst:))}}
    2. c
  3. La valeur des deux paramètres doit maintenant être évaluée, ce qui donne :
    1. {{subst:a|b}}
    2. c
  4. La valeur de ces paramètres est maintenant insérée dans le texte de substitution start-{{{1}}}-end de t1 pour donner le résultat correct.

Réaliser une page qui s'auto-convertit récursivement

La page résultante peut avoir la même propriété de créer une page enregistrée contenant subst, si nous utilisons un modèle "a" spécialement conçu à cet effet. Lorsqu'il est appelé d'une page, ce modèle peut insérer subst: actif dans le résultat. Mais ces appels de substitution (qui agissent normalement lorsqu'une page est enregistrée) doivent être neutralisés jusqu'à ce que le modèle lui-même soit inclus quelque part : ils ne doivent pas être activés lorsque le modèle spécial lui-même est enregistré. Pour rendre ce modèle statique, il existe deux stratégies :

  • <includeonly></includeonly> est placé avant (ou autour) (ou à l'intérieur) de chaque subst:, ce qui empêche l'analyseur de le voir comme un appel valide (et actif) de subst:,
  • ou, alternativement chaque subst: est remplacé par {{{|subst:}}}. Cette superbe solution utilise l'assignation de la valeur par défaut pour les paramètres non défini, habituellement vu comme {{{a|b}}} qui signifie « lors de la substitution, utiliser ici la valeur fournie du paramètre a, mais si a n'est pas défini, utiliser "b" comme valeur par défaut ». Parce que dans ce cas il n'y a pas de nom de variable, la variable non nommée est toujours indéfinie et se traduit en sa valeur par défaut lorsque le modèle est inclus.

Une forme de base est celle de Template:tsubst contenant "a{{{{{|subst:}}}subst}}tsubst|b{{{{{|subst:}}}))}}c<noinclude>{{doc|content=This template is used as an example at [[Manual:Recursive conversion of wikitext]][[Category:Demo templates]]}}</noinclude>", où b représente les paramètres, a la sortie avant l'appel du modèle, et c la sortie après l'appel du modèle. Tout cela peut dépendre des paramètres. En lui-même ce contenu n'a pas de subst: actif, donc il n'est pas modifié lors de l'enregistrement. Maintenant si template:tsubst apparaît dans un fichier, à l'intérieur d'un {{subst:tsubst|..}}, la première fois que le fichier est enregistré, le niveau supérieur {{subst:tsubst|..}} sera donc exécuté.

  1. L'analyseur syntaxique délimite d'abord les paramètres du code appelant, extrait leur expression textuelle, et détermine la valeur de ces paramètres.
  2. Étant donné que le contenu de template:tsubst n'a pas de nom de paramètre valide, son contenu sera toujours traduit de la même manière lorsqu'il sera remplacé : les deux pseudo-paramètres {{{|subst:}}} seront remplacés par leur valeur par défaut subst:. Le contenu textuel effectif de tsubst après la substitution du paramètre sera donc a{{subst:subst}}tsubst|b{{subst:rb}}c.
  3. La valeur de cette séquence initiale va se développer après sa propre substitution, et être remplacée par a{{subst:tsubst|b}}c dans le fichier appelant.

En conséquence, à partir du wikicode {{subst:tsubst|..}}, le wikicode est remplacé par a{{subst:tsubst|b}}c lors de la sauvegarde du fichier appelant. De manière récursive, lors de chaque sauvegarde, "a" est ajouté devant les accolades, les valeurs des paramètres sont remplacées, et "c" est ajouté après les accolades.

Les wikicodes "a", "b" et "c" qui apparaissent dans cet exemple simple de template:tsubst sont des emplacements d'exemple pour {{{{{|subst:}}}..}} lorsqu'ils sont utilisés dans des modèles plus élaborés, auquel cas le wikicode produit est le résultat de l'expansion de la variable, de la fonction d'analyseur ou du modèle, comme indiqué dans le modèle élaboré appelé, au moment de sauvegarder le fichier appelant.

  • Ainsi, la substitution du texte "b" représente la situation où le fichier appelant a été enregistré pour la dernière fois, la succession de "a" retrace l'historique de chaque enregistrement successif, depuis le plus ancien jusqu'au plus récent ; et "c" l'historique du plus récent au plus ancien. En d'autres termes, l'ordre chronologique est vers l'intérieur, vers l'appel du modèle; l'historique grandit à partir de l'intérieur, l'endroit où le modèle est gardé actif de manière récursive.
  • ~{{{|~~}}} fournit aussi la signature de l'utilisateur.
  • D'une manière plus générale une page peut contenir plusieurs appels de modèles, et chacun d'eux peut générer plusieurs appels de modèles.
  • Si tel est le souhait, il peut être configuré de manière à ce que le modèle cesse de se reproduire sous une certaine condition (par exemple lors du remplacement d'une page vide), ne laissant derrière lui que les anciennes versions de "a" et de "c", et le cas échéant, le résultat de la dernière substitution intermédiaire.

Mise en forme de la sortie générée

<span style="display:none">..</span> peut être utilisé pour masquer l'appel du modèle. Une imbrication correcte à l'intérieur (ou autour) des paires de double ou triples accolades n'est pas nécessaire, pendant l'expansion du modèle ces balises sont traitées comme du texte ordinaire. Ainsi par exemple la balise ouvrante peut être dans "b" et la balise fermante dans "c".

Si "c" est non vide, il doit commencer par "</span>" pour masquer les accolades fermantes. Les balises span d'ouverture et de fermeture doivent être appairées pour éviter que l'appel du modèle et (ou) sa sortie n'affectent le style après cela. Cela nécessite une balise d'ouverture dans "c" pour correspondre à la balise de fermeture présente dans le "c" et placée précédemment. Il peut apparaître soit immédiatement après la balise fermante au début de "c" (en spécifiant de manière facultative un style qui se substitue au style externe), ou à la fin de "c" (le style externe s'applique aussi à "c"). Si "a" est non vide, pour masquer les accolades ouvrantes "a" doit se terminer par "<span style="display:none">". Ainsi "a" doit commencer par une balise span fermante correspondant à la balise span ouvrante du "a" précédent (le style externe applique un for "a" sauf s'il contient une paire supplémentaire de balises span). Enfin, pour correspondre à la balise span fermante au début du "a" le plus à gauche (le plus ancien), une balise span ouvrante est nécessaire à gauche de celle-ci, tandis que pour correspondre à la balise ouvrante "c" la plus à droite (la plus ancienne), une balise span fermante est nécessaire à droite de celle-là. Si "a" est vide cette balise ouvrante span est également placée; de même si "c" est vide, cette balise span fermante est également placée.

Ainsi l'ensemble de l'appel de modèle, y compris "b", est masqué, à moins qu'à l'intérieur de "b" nous avons "</span>" et "<span style="display:none">"; dans ce cas, la partie de "b", entre les deux, a le style externe, à moins que celle-ci ne contienne une paire supplémentaire de balises span.

Les paires de balises span vides (c'est à dire avec rien entre les deux ou sans spécification de style) peuvent être nettoyées manuellement de temps en temps.

Documentation

En cas de conversion automatique du wikicode, le wikicode original n'est pas automatiquement documenté. Le résumé des modifications peut être utile pour cela. En outre, dans le cas de la conversion automatique en cliquant simplement sur Modifier et enregistrer, le wikicode avant et après la conversion figure dans l'historique des modifications. Un code peut être mis dans le résumé des modifications pour indiquer « aucun changement manuel du wikicode ». Ainsi, seul le wikicode entré initialement est non documenté, à moins qu'il ne soit utilisé dans un résumé d'édition (dont la capacité est peut être trop petite), ou enregistré dans les balises pre ou nowiki sur la page elle-même ou dans la documentation de la page.

Exemple simple opérationnel

Les modèles ci-dessus de formulaire Template:Tsubst contenant "a{{{{{|subst:}}}subst}}tsubst|b{{{{{|subst:}}}))}}c<noinclude>{{doc|content=This template is used as an example at [[Manual:Recursive conversion of wikitext]][[Category:Demo templates]]}}</noinclude>" ont été discutés, où b représente les paramètres, a la sortie avant l'appel du modèle, et c la sortie après l'appel du modèle. Tout cela peut dépendre des paramètres. Un exemple simple est ce modèle lui-même, sans paramètre, où "a", "b" et "c" sont juste ces lettres explicites.

À partir du wikicode {{subst:tsubst|b}}, sur chaque sauvegarde "a" est ajouté avant les accolades ouvrantes et "c" est ajouté après les accolades fermantes.

Exemple en direct (changé automatiquement à chaque fois que l'on appuie sur « Enregistrer la page ») :

aaaaaaaaaaaaaaaaaaaaaaaa{{subst:tsubst|b}}cccccccccccccccccccccccc

Autres exemples

Exemples :

Exemples de modèles conçus pour être utilisés avec le préprocesseur d'avant 2008, avec lesquels ils ont fournit un nombre arbitraire de niveaux de substitution :

  • m:Template:square root A - calcule selon la méthode de Newton, la racine carrée du paramètre 1, avec une estimation initiale donnée par le paramètre 2, avec un critère d'arrêt d'erreur absolu (se terminant lorsque deux estimations successives sont dans le paramètres 3), en deux sauvegardes (ou, avec une fonction d'analyse, en une sauvegarde), imprimant toutes les estimations successives et les différences entre les estimations consécutives
  • m:Template:square root B même chose que m:Template:square root A, sauf que seul le résultat final est imprimé
  • m:Template:sqr - de même, avec un critère d'arrêt fixé d'erreur relative <1e-11 (sur la base de l'utilisation d'un serveur avec des résultats à 12 chiffres); rend une valeur unique, l'appel peut figurer dans une expression
  • m:Template:multiple substs - un subst génère plusieurs subst à chaque niveau, en deux sauvegardes (ou, appelé avec une fonction d'analyse, en une sauvegarde)

Aperçu

Notez que l'aperçu, avant (ou sans) avoir fait les modifications manuelles du wikicode, est différent du rendu de la page actuelle.

Voir aussi

Category:Parser manuals/fr
Category:Parser manuals/fr