Aide:Infobox en Lua

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 modifier

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 modifier

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 :

-- 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" modifier

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 :

{
	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 modifier

Les parties de parts peuvent prendre les formes suivantes :

title modifier

Titre 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 modifier

Pour 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 modifier

texte libre :

{
	type = 'text',
	value = 'citation',  -- retourne le texte donné dans le paramètre citation,
}

table modifier

Une 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 simple
  • row1col pour les lignes utilisant l'ensemble des colonnes
  • succession 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 modifier

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

Utilisation de fonctions dans le paramètre "value" modifier

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" :

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,
}

Utilisation de Wikidata modifier

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" 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" modifier

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.

{
	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 modifier

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

Requêtes communes modifier

Pour 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 :

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 modifier

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 modifier

Aide avancée des modules Lua modifier

Cette 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 é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.