Aide:Infobox en Lua

De Nations.fr
Niveau expert
Nous vous recommandons de lire auparavant Aide:créer une infobox
Tutoriel pour la création d'une infobox en Lua.

Emplacement du code

Les pages de modèles proprement dites ne font qu'appeler le module infobox Lua via l'appel en wikicode {{#invoke:}} (voir Wikipédia:Lua). Les codes eux-mêmes se trouvent sur la page Module:Infobox et sur les sous-pages particulières « Module:Infobox/nom de l'infobox », par exemple Module:Infobox/Philosophe.

Structure d'un module d'infobox

Pour l'essentiel, un module d'infobox est constitué d'une table, précédée du mot "return" donnant le contenu de l'infobox. Elle peut être précédée d'importations d'autres modules ou de fonctions de soutien permettant son bon fonctionnement, par exemple : <source lang=lua> -- importe le module Wikidata afin de pouvoir l'utiliser dans la table local wikidata = require( 'Module:Wikidata' ) -- fonction pour aider à l'insertion des smileys local function makeHappy( a ) return a .. ' :)' end

return { blablablaa -- ici : le contenu de l'infobox proprement dit } </source>

La partie après le "return" prend la forme d'une table Lua, c'est à dire une suite de données séparées par des virgules et mises à l'intérieur d'accolades. Sa structure générale est la suivante : <source lang=lua> return { style = 'xxx', -- style css de l'infobox (facultatif) maincolor = '#xxx', -- code html de la couleur à utiliser pour les titres, sous-titre, etc. (facultatif) parts = { }, -- la partie essentielle : le contenu du l'infobox } </source>

La partie "parts"

La partie "parts" définit le contenu de l'infobox. Elle est elle-même constituée de tables correspondant aux différentes parties de l'infobox (titre, image, bloc de texte, etc.). Le contenu de ces sous-tables peut varier en fonction du type de données, mais il prend généralement la forme suivante : <source lang=lua> { type = 'xxx', -- type de brique ("image", "title" etc.), value = 'xxx', -- valeur à retourner property = 'Pxxx', -- propriété Wikidata à utiliser lorsque la valeur manque sur Wikipédia (optionnel), wikidata = {}, -- requête Wikidata (alternative au paramètre property pour les cas plus complexes), default = 'xxx', -- valeur à retourner si on ne trouve rien par les paramètres value, property et wikidata (optionnel) class = 'xxx', -- classe css à utiliser (optionnel) style = {}, -- facultatif : style css à utiliser (voir mw:Extension:Scribunto/Lua reference manual/fr#mw.html:css) } </source>

Les parties de parts

Les parties de parts peuvent prendre les formes suivantes :

title

Titre de l'infobox <source lang=lua> { type = 'title', value = 'nom', -- le titre sera défini par le paramètre "nom" de l'infobox property = 'P1448', -- par défaut, le titre affiché sera la valeur de la propriété P1448 (nom officiel) sur Wikidata class = 'entete icon auteur', -- la classe du titre sera "entete icon auteur" qui ajoute une petite plume à côté du nom } </source> Si les clés "value", "property" et "wikidata" ne retournent aucune valeur, le titre de l'article sera utilisé.

images

Pour les images, blasons etc. <source lang=lua> { type = 'images', imageparameters = 'image', -- l'image est définie ici par le paramètre "image", captionparameter = 'légende', -- la légende est définie par le paramètre "légende", defaultimage = 'foo.jpg', -- quand il n'y a pas d'image, monter "foo.jpg", defaultcaption = 'image du sujet', wikidata = function ( item ) -- Wikidata uniquement pour les images, pas la légende return wikidata.formatStatements{ entity = item, property = 'p18', returntype = 'table' } end, numval = 1, -- 1 image au maximum (utile essentiellement pour les requêtes Wikidata) } </source> Le paramètre wikidata ne s'applique qu'à l'image. La légende ne peut pas être récupérée sur Wikidata.

Si l'on veut utiliser plusieurs images, mettre la liste des paramètres à utiliser dans une table : <source lang=lua> { type = 'images', imageparameters = { 'image', 'logo' }, } </source>


text

texte libre : <source lang=lua> { type = 'text', value = 'citation', -- retourne le texte donné dans le paramètre citation, } </source>

table

Une table de lignes. Une grande partie des données d'infobox sont intégrées à de telles tables.

<source lang=lua> { type = 'table', title = 'Données clés', -- titre de la table (affiché seulement si au moins une des "rows" retourne une valeur) rows = { { type = 'row', value = 'xxx' , property = 'Pxxx', ... }, -- liste des lignes inclues dans la table { type = 'row' ... }, { type = 'row' ... }, }, } </source> Si l'on désire un formatage particulier pour le titre : <source lang=lua> { type = 'table', title = 'Données clé', titlestyle = { ['background-color'] = '#af12dd' }, rows = { { type = 'mixed' ... }, }, } </source>

Les lignes d'une table peuvent être de trois types différents :

  • row ou ligne simple
  • row1col pour les lignes utilisant l'ensemble des colonnes
  • succession pour ajouter un un diptyque ou un triptyque de succession, à l'image de Modèle:Infobox/Succession
row

<source lang=lua>

    { type = 'row', label = 'label', value = 'value' }

</source>

row1col

<source lang=lua>

    { type = 'row1col', color = '#f9f9f9', value = 'texte' }

</source>

Le texte est affiché centré et en gras dans une ligne d'une seule cellule qui fait la largeur de l'infobox. Il est possible de mettre en couleur le mot-clé 'secondcolor' qui sera remplacé par la couleur secondaire de la charte graphique.

succession

<source lang=lua>

   { type = 'succession', color = '#e6e6e6', value = 'texte' }

</source>

Ce type imite la boîte de succession définie par Modèle:Infobox/Succession.

les valeurs de color peuvent être l'un des deux mot-clé 'default' ou 'transparent'. 'default' correspond à la valeur '#e6e6e6', tandis que transparent s'utilise telle quelle. Il est possible de mettre une autre valeur de couleur, mais le contraste avec les flèches Fichier:Fleche-defaut-gauche-gris-32.png et Fichier:Fleche-defaut-droite-gris-32.png n'est pas garanti.

value doit être une table ayant les indices 'before', 'center' et 'after'. La présence de l'indice center produit un triptyque en affichage, et son absence un diptyque.

Exemple

Ces fonctionnalités sont utilisées par la fonction timeline() du module Module:Infobox/Fonctions/Personne

Utilisation de fonctions dans le paramètre "value"

Quand la valeur à afficher ne correspond pas simplement à la valeur d'un paramètre donné dans l'article, on peut utiliser une fonction plutôt qu'une chaîne dans le paramètre "value". Les fonctions peuvent utiliser les paramètres de l'infobox en chargeant le module Infobox/Localdata (les valeurs des paramètres indiqués sur la page, et "item", l'élément Wikidata lié)

Par exemple la ligne mixte suivante affiche "il a écrit " suivi de la valeur du paramètre "œuvres principales" : <source lang=lua> local localdata = require( 'Module:Infobox/Localdata' ) { type = 'mixed', label = 'Œuvres principales', value = function ( localdata ) if localdata[ "œuvres principales" ] then return "il a écrit " .. localdata[ "œuvres principales" ] end end, } </source>

Utilisation de Wikidata

Dans certains cas, on peut utiliser des valeurs Wikidata à retourner en l'absence de données locales. On peut utiliser pour cela les paramètres suivants :

Paramètre "property"

<source lang=lua> { type = 'mixed', label = 'Architecte', value = 'architecte', property = 'P84', } </source> Dans ce cas, si le paramètre "architecte" n'est pas renseigné dans l'article. Le modèle utilise les données de la propriété P84 de l'élément lié.

Paramètre "wikidata"

Permet une gestion plus fine de Wikidata que le paramètre "property. On passe une table d'arguments passés comme requête de Wikidata. Utilise une syntaxe similaire à celle de {{Wikidata}}. Pour plus d'informations, voir Projet:Wikidata/Atelier/Manuel. <source lang=lua> { type = 'mixed', label = 'Architecte', value = 'architecte', wikidata = { property = 'P84', rank = valid, showqualifiers = {'P518'}, entity = 'QXX' -- seulement si on veut lier à un autre élément que l'élément Wikidata utilisé par défaut par l'infobox } , }</source> La valeur du paramètre wikidata peut également être une fonction, pour permettre davantage de personnalisation.

<source lang=lua> { type = 'mixed', label = 'Libellé Wikidata', value = 'Entré Wikidata', wikidata = function ( item ) return item.id end, }</source>

Parfois, dans des cas encore plus délicats, il peut-être nécessaire d'intégrer la valeur wikidata à la fonction définie par le paramètre "value"

Désactivation locale de Wikidata

Pour désactiver Wikidata dans une infobox, ajouter d'un article, y ajouter wikidata = -

Requêtes communes

Pour simplifier la gestion des données complexes, certaines briques souvent utilisées sont définies dans le répetoire Module:Infobox/Fonctions et ses sous-modules et dans ses sous-module thématiques. Par exemple, si l'on veut une ligne affichant la date et le lieu de naissance d'une personne avec un formatage et une requête Wikidata standard, on peut utiliser la fonction p.birth de Module:Infobox/Fonctions/Personne. Pour cela :

<source lang=lua> local person = require( 'Module:Infobox/Fonctions/Personne' ) </source>

  • On ajoute la fonction à l'emplacement désiré :

<source lang=lua> { type = 'table', title = { value = 'Données clé', style = { ['background-color'] = '#af12dd' } }, rows = { person.birth(), { type = 'mixed', label = 'Nom de naissance', value = 'nom de naissance' }, }, } </source>

A noter : certaines fonctions prennent des paramètres dans le module d'infobox qui les appellent. Par exemple, un module d'infobox contenant la fonction suivante catégorisera les articles sans image dans Catégorie:Article à illustrer Château <source lang=lua> require( 'Module:Fonctions' ).mainimage( 'Article à illustrer Château', 'jpg' ) </source>


Erreurs fréquentes

Comme la plupart des langages de programmation, Lua est sensible aux erreurs de majuscule, de ponctuation, etc. (mais, sauf cas particulier, pas aux sauts de lignes ou aux indentations)

Exemples

Aide avancée des modules Lua

Cet aide attend de trouver une meilleure place dans l'arbre des aides.

Le langage Lua semble très simpliste :

  • Il n'y a pas de mot object, ni class, ni new, mais tout est objet et le mot self permet d'accéder à la table qui décrit l'objet dans lequel on est.
  • Il n'y a que 6 types : nil, boolean, string, number, table et function (une table exécutable).
  • Les indices d'une table peuvent être de n'importe quel type, même table, sauf nil qui ne conduit à aucun élement.
  • La fonction pairs(table) parcourt tous les élements d'une table, et la fonction ipairs(table) n'en parcourt que les élements indexés de 1 à n en continu.
  • Il n'y a pas de mot "iterator" mais on peut écrire d'autres fonctions pour fournir les variables qu'on veut à un for et parcourir différemment une table.
  • L'espace global _G est la table qui collecte toutes les variables qui ne sont ni locales, ni dans la table p. d'un module.
  • pcall et xpcall permettent de traiter différemment les "exceptions", les erreurs que l'on voit lors d'une erreur d'exécution. On peut ainsi essayer un require, ou autre opération risquée, et s'il échoue en essayer un autre ou signaler l'erreur sans blocage.
  • On peut récupérer les arguments d'une fonction dans une table ..., entièrement func(...) ou partiellement func(aa, bb, ...).
  • Une fonction getfenv( f ) permet d'accéder à l'environnement dynamique d'une fonction, c'est à dire à l'espace global _G des niveaux supérieurs de la pile d'appels.
  • Les librairies et tous les modules installés par require() sont des tables collectées dans la table package.loaded.
  • On peut y inscrire dynamiquement une nouvelle librairie par package.loaded[nouveau_nom] = { fonctions et variables de la librairie }.
  • Mais si l'on veut la partager dans mediawiki Scribunto, il faut d'abord la soumettre à une série de tests répétés à chaque modification de Scribunto pour s'assurer de sa stabilité.

Pour aller plus loin : Lua Programming Gems ou Lua:demo.