Centre des communautés
Advertisement
Centre des communautés
Information icon 40px
Attention!
Ce blog assume que vous êtes familier avec les concepts de programmation, comme les variables et les conditions. Si ce n'est pas le cas, vous devriez trouver un cours pour débutants avant d'apprendre à utiliser Lua sur Fandom.

Si vous désirez créer des modèles sur votre wiki, vous devrez tôt ou tard apprendre à utiliser les fonctions parseur pour créer un code plus complexe. Que ça soit {{#if:}} ou {{#switch:}}, elles vous aideront à créer des modèles plus efficaces pour votre contenu.

Cependant, à un moment donné, vous pouvez être confronté à un problème: l'utilisation d'un trop grand nombre de #if rend la lecture du code source plus difficile. Imaginez que vous souhaitiez classer automatiquement les pages d'épisodes de votre wiki consacré à une série télévisée selon les règles suivantes:

  1. Si le paramètre {{{saison}}} est présent, cela ajoute [[Catégorie:Épisodes de la saison {{{saison}}}]].
  2. Si le paramètre {{{saison}}} est manquant, cela ajoute [[Catégorie:Épisodes sans saison]] pour que vous puissiez les trouver facilement.

Dans un modèle, vous n'avez qu'à ajouter un simple #if: comme suit:

{{#if:{{{saison|}}}|[[Catégorie:Épisodes de la saison {{{saison}}}]]|[[Catégorie:Épisodes sans saison]]}}

Avoir beaucoup de {{ }} et de [[ ]] peut rendre le tout assez difficile à lire, mais ce n'est pas si pire... pour l'instant. Qu'arrive-t-il si on ajoute une autre règle?

  1. Si le paramètre {{{special}}} est présent, en fonction de si l'épisode est un épisode régulier ou spécial, on doit alors ajouter [[Catégorie:Épisodes spéciaux de la saison {{{saison}}}]] à la place.

Comment faire? Comme cela:

{{#if:{{{saison|}}}|{{#if:{{{special|}}}|[[Catégorie:Épisodes spéciaux de la saison {{{saison}}}]]|[[Catégorie:Épisodes de la saison {{{saison}}}]]}}|[[Catégorie:Épisodes sans saison]]}}

Cela devient un peu plus difficile à lire, n'est-ce pas? Nous venons d'ajouter une seule règle à notre logique! Les fonctions parseurs sont excellentes pour les vérifications simples, mais elles deviennent plus compliquées lorsque vous essayez d'implémenter une logique plus complexe en les utilisant. Que faire alors ? En tant que langage de programmation, Lua est un outil plus puissant qui vous aide à ajouter une logique avancée à vos modèles, tout en étant plus facile à lire si vous êtes familier avec lui. Mais avant de pouvoir convertir l'exemple précédent, nous devons comprendre ce que c'est et comment vous pouvez l'utiliser sur vos wikis à travers les modules.

Départ rapide avec Lua[]

Les scripts Lua sont disponibles par défaut dans l'espace de noms Module: de tous les wikis. Tout comme tous vos modèles commencent par Modèle:, tous les scripts Lua se trouvent dans des pages qui commencent par Module:. La plupart des modules ressemblent à ceci:

local p = {}

function p.main(frame)
  -- code
end

return p


Résumons rapidement l'exemple précédent:

  • local p est une variable, qui stocke une table vide {}. Vous en avez besoin pour garder toutes vos fonctions exportées regroupées afin qu'elles puissent être retournée (return) à la fin. D'autres modules et pages pourront utiliser tout ce qui se trouve dans la table exportée.
  • Nous créons une fonction main à l'intérieur de notre table p. frame est un argument que toutes les fonctions reçoivent lorsqu'elles sont appellées à partir d'une page; vous pouvez en lire davantage sur le frame ici, mais pour l'instant, nous devons simplement savoir que c'est ce qui nous permets d'accéder aux paramètres utilisés dans la page. Par exemple, dans "{{Modèle|Premier|Deuxieme|hello=world}}", nous aurions accès au premier paramètre, deuxième paramètre ainsi qu'à la valeur du paramètre nommé hello (qui est world).

Gardez en tête: main est simplement un exemple! Vous pouvez utiliser le nom que vous voulez pour vos fonctions.

Créer notre module[]

Maintenant, allons voir du code! Concentrez-vous sur ce qui est dans la fonction main.

local p = {}

function p.categoriser(frame)
  local args = require('Dev:Arguments').getArgs(frame)
  local saison = args.saison
  local special = args.special
  
  if saison then
    if special then
      return string.format( '[[Catégorie:Épisodes spéciaux de la saison %s]]', saison )
    else
      return string.format( '[[Catégorie:Épisodes de la saison %s]]', saison )
    end
  else
    return '[[Catégorie:Épisodes sans saison]]'
  end
end

return p


Étape par étape[]

Prenons le temps d'observer comment cette fonction fonctionne.

Accéder aux paramètres
Il y a plusieurs méthodes pour accéder aux paramètres passés à votre module à partir de la page, mais la plus recommandée est d'utiliser les Arguments un module Lua global disponible sur tous les wikis Fandom. Il exporte une fonction getArgs qui retourne une table avec tous les arguments de votre objet frame. En utilisant la même modèle que tout à l'heure, "{{Modèle|Premier|Deuxieme|hello=world}}", il vous retournera les arguments dans une table comme:
{
  "Premier",
  "Deuxieme",
  hello = "world"
}
N'oubliez pas que dans Lua les tables débutent avec l'index 1! Vous pouvez donc accéder aux paramètres désirés en écrivant args[1] (Premier), args[2] (Deuxieme) et args.hello (world). Si vous tentez d'accéder un index qui n'existe pas, vous recevrez une valeur nil, l'équivalent de undefined en Javascript ou de None en Python.
Implémenter votre logique
Vous devriez déjà être familier avec les if en programmation. La syntaxe de Lua est un peu différente mais assez facile à comprendre.
Tout comme nous l'avons fait précédemment avec les fonctions parseur, on regarde d'abord si le paramètre saison est présent. S'il ne l'était pas, nous recevrions une valeur nil de notre table args et serait donc considéré comme false.
L'autre partie qui pourrait vous questionner est l'utilisation de string.format. Lua possède plusieurs façons de concaténer les strings, et ça en est une. Le premier paramètre de cette fonction est votre string modèle. Dans celle-ci, chaque %s sera remplacé par les paramètres qui suivent dans l'ordre (dans ce cas-ci, la valeur stockée dansseason).
  • Si saison est présent, vérifie si special est également présent.
    • Si special est présent, ajoute une catégorie [[Catégorie:Épisodes spéciaux de la saison %s]], où %s sera remplacé par la valeur dans saison.
    • Sinon, ajouter une catégorie [[Catégorie:Épisodes de la saison %s]].
  • Si saison n'est pas présent, ajoute une catégorie [[Catégorie:Épisodes sans saison]].
Tout comme un modèle, la valeur retournée par le module est insérée dans l'article.

Comment puis-je l'utiliser?[]

Si l'exemple précédent était sauvegardé dans Module:Épisode, vous pourriez l'utiliser à partir de n'importe quelle page en écrivant {{#invoke:Épisode|categoriser|saison=1}}. Cependant, vous devriez éviter. Bien que la syntaxe soit très similaire aux modèles, cela pourrait porter à confusion les nouveaux contributeurs de votre wiki: #invoke? Pourquoi categoriser? Où se trouve ce modèle?

Normalement, vos utilisateurs n'utiliseront jamais les modules directements, mais plutôt via les modèles. Par exemple, vous pourriez appeler le module dans votre Modèle:Infobox épisode comme suit: {{#invoke:Épisode|categoriser}}.

Vous vous demandez peut-être aussi: comment le module connaitra-t-il la saison? Eh bien, votre objet frame aura accès aux paramètre que votre modèle {{Infobox épisode}} lui passera! Et grâce au module global d'arguments que nous avons utilisé plus tôt, vous aurez un accès facile sans même avoir à modifier votre module. Génial, n'est-ce pas?

Résumé[]

Ce blog vous a seulement donné une idée de la façon dont vous pouvez utiliser Lua pour simplifier la logique de vos modèles, en espérant que vous serez en mesure de l'appliquer dans de meilleurs scénarios afin qu'ils soient plus faciles à maintenir! Voici une courte liste de quand vous devriez envisager d'utiliser Lua :

  • Votre modèle comporte de nombreuses fonctions parseur, surtout si elles sont imbriquées les unes dans les autres.
  • Vous avez besoin d'avoir un nombre indéterminé de paramètre. Au lieu de manuellement ajouter {{{parametre 1}}}, {{{parametre 2}}}, {{{parametre 3}}} et ainsi de suite, vous pouvez utiliser Lua.
  • Bien que centraliser vos données soit une mauvaise pratique pour les wikis, c'est parfois la meilleure solution pour vos besoins. Et la meilleure façon de centraliser les données est d'utiliser des modules Lua.

Gardez en tête que les modules Lua nécéssitent que quelqu'un connaisse le langage pour pouvoir les maintenir à jour. Efforcez-vous de toujours suivre les meilleures pratiques et standards de programmation dans vos modules pour que les autres soient capable de les comprendre et de les modifier au besoin. Par exemple: utilisez des noms significatifs pour vos variables (local po ne donne pas beaucoup d'information pour comprendre que la variable représente le prix d'un objet local prix_objet) et diviser votre code en plusieurs fonctions plus courtes pour les rendre plus faciles à lire. Évidemment, ajouter des commentaires et de la documentation!

Vous disposez de tous les outils disponibles dans un langage de programmation pour créer des modules puissants à utiliser dans vos articles, au lieu de vous contenter des fonctions parserur du wikitexte et d'autres fonctions de base.


Vous pouvez consulter l'article original ici (en anglais).

Vous souhaitez être informé(e) sur les billets postés en rapport avec l'actualité Fandom et ses nouvelles fonctionnalités ?
Cliquez ici pour suivre les blogs du Staff.
Nous expérimentons ! Apprenez-en plus sur les types d'événements et autres choses que nous avons fait jusqu'à présent ou que nous prévoyons de faire !


Vous souhaitez un accès à temps réel à vos camarades éditeurs et au staff ?
Rejoignez notre serveur Discord officiel pour les utilisateurs enregistrés !

Advertisement