Aide:Infobox en Lua
Emplacement du code
modifierLes 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
modifierPour 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 :
-- 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
}
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 :
return {
style = 'xxx', -- style css de l'infobox (facultatif)
maincolor = '#xxx', -- code html de la couleur à utiliser pour les titres, sous-titre, etc. (facultatif)
categories = {'xxx','yyy'}, --- catégories de maintenance (sans préfixe) à appliquer à l'article (facultatif)
parts = { }, -- la partie essentielle : le contenu du l'infobox
}
La partie "parts"
modifierLa 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 :
{
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]])
}
Les parties de parts
modifierLes parties de parts peuvent prendre les formes suivantes :
title
modifierTitre de l'infobox
{
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
}
Si les clés "value", "property" et "wikidata" ne retournent aucune valeur, le titre de l'article sera utilisé.
images
modifierPour les images, blasons etc.
{
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)
}
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 :
{
type = 'images',
imageparameters = { 'image', 'logo' },
}
text
modifiertexte libre :
{
type = 'text',
value = 'citation', -- retourne le texte donné dans le paramètre citation,
}
table
modifierUne table de lignes. Une grande partie des données d'infobox sont intégrées à de telles tables.
{
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' ... },
},
}
Si l'on désire un formatage particulier pour le titre :
{
type = 'table',
title = 'Données clé',
titlestyle = { ['background-color'] = '#af12dd' },
rows = {
{ type = 'mixed' ... },
},
}
Les lignes d'une table peuvent être de trois types différents :
row
ou ligne simplerow1col
pour les lignes utilisant l'ensemble des colonnessuccession
pour ajouter un diptyque ou un triptyque de succession, à l'image de Modèle:Infobox/Succession
row
modifier { type = 'row', label = 'label', value = 'value' }
row1col
modifier { type = 'row1col', color = '#f9f9f9', value = 'texte' }
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
modifier { type = 'succession', color = '#e6e6e6', value = 'texte' }
Ce type imite la boîte de succession définie par Modèle:Infobox/Succession. La valeur de color
est '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 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
modifierCes fonctionnalités sont utilisées par la fonction timeline()
du module Module:Infobox/Fonctions/Personne
Utilisation de fonctions dans le paramètre "value"
modifierQuand 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" :
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,
}
XXX : Le callback ne reçoit pas en paramètre le localdata
obtenu par le require()
plus haut, mais le localdata
qui est défini localement dans le Module:Infobox ; c'est-à-dire qu'il y a un variable shadowing dans le présent exemple. Ainsi, le require()
est en fait inutile dans cette situation. Chercher « local function getValue
» dans Module:Infobox.
Remarquer aussi que le callback reçoit en 2e paramètre localdata.item
(l'identifiant Wikidata utilisé, voir règles de détermination dans Module:Infobox/Localdata), et en 3e paramètre params
(la présente table avec "type", "label", etc.).
Utilisation de Wikidata
modifierDans 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"
modifier{
type = 'mixed',
label = 'Architecte',
value = 'architecte',
property = 'P84',
}
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"
modifierPermet 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.
{
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
}
,
}
La valeur du paramètre wikidata
peut également être une fonction, pour permettre davantage de personnalisation.
{
type = 'mixed',
label = 'Libellé Wikidata',
value = 'Entré Wikidata',
wikidata = function ( item )
return item.id
end,
}
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
modifierPour désactiver Wikidata dans une infobox, ajouter d'un article, y ajouter wikidata = -
Requêtes communes
modifierPour simplifier la gestion des données complexes, certaines briques souvent utilisées sont définies dans le répertoire 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 :
- On importe le module désiré, de préférence en début de page. Pour importer Module:Infobox/Fonctions/Personne :
local person = require( 'Module:Infobox/Fonctions/Personne' )
- On ajoute la fonction à l'emplacement désiré :
{
type = 'table',
title = { value = 'Données clé', style = { ['background-color'] = '#af12dd' } },
rows = {
person.birth(),
{ type = 'mixed', label = 'Nom de naissance', value = 'nom de naissance' },
},
}
A noter : certaines fonctions prennent des paramètres dans le module d'infobox qui les appelle. Par exemple, un module d'infobox contenant la fonction suivante catégorisera les articles sans image dans Catégorie:Article à illustrer Château
require( 'Module:Fonctions' ).mainimage( 'Article à illustrer Château', 'jpg' )
Erreurs fréquentes
modifierComme 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
modifier- Pour un module simple, qui n'utilise pas Wikidata : Module:Infobox/Tapis persan
- Pour un module complexe : Module:Infobox/Monument
Aide avancée des modules Lua
modifierCette 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
etfunction
(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 élément.
- La fonction pairs(table) parcourt tous les éléments d'une table, et la fonction ipairs(table) n'en parcourt que les éléments 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.