Module:Tableau boîte utilisateur
[voir] [modifier] [historique] [purger]
Utilisation
modifierFonctions exportables :
genererLigne(frame)
– Permet de générer une ligne de tableau.
Autres fonctions :
numeroParametre( nomParametre, nomRecherche )
– Permet de récupérer un paramètre et son numéro.codeBoite( frame, nomBoite )
- Extrait le code d'une boîte pour affichage.enTete( arguments )
– Génère une ligne d'en-tête.contenu( frame, arguments )
– Génère une ligne de contenu.fin()
– Génère une fin de tableau.
Modules externes et autres éléments dont ce module a besoin pour fonctionner :
mw.text
– Bibliothèque utilisée pour la fonctiontrim
.
Voir le modèle {{Tableau boîte utilisateur}} pour la description des paramètres acceptés par le module.
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis sa sous-page de documentation. Veuillez placer les catégories sur cette page-là.
Les éditeurs peuvent travailler dans le bac à sable (créer).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
local fonctions = { }
-- Fonction permettant de récupérer un paramètre et son numéro.
-- nomParametre : Chaine de caractère du type 'nomparametreN' avec N numérique.
-- nomRecherche : Chaine recherchée dans le paramètre, par exemple 'nomparametre'.
-- Retourne : Le numéro N du paramètre si le paramètre fourni est bien formé du
-- paramètre recherché immédiatement concaténé avec une valeur numérique.
-- Cas particulier : si le paramètre correspond exactement au nom recherché, alors on retourne 1.
-- Retourne nil si le paramètre ne correspond pas au nom recherché.
local function numeroParametre( nomParametre, nomRecherche )
if nomParametre == nomRecherche then
-- Le paramètre est exactement égale à la valeur de nomRecherche => N = 1 implicitement.
return 1
else
local longueurNom = string.len(nomRecherche)
if string.sub(nomParametre, 1, longueurNom) == nomRecherche then
-- Le paramètre est nomRecherche..N => obtenir N.
return tonumber(string.sub(nomParametre, longueurNom+1, -1))
else
return nil
end
end
end
-- Fonction retournant le code permettant d'afficher une boîte utilisateur.
-- La fonction teste d'abord l'existence du modèle, et affiche un message
-- d'erreur à la place de la boîte si celle-ci n'existe pas.
-- Accepte comme argument :
-- * 'frame' : objet Frame
-- * 'nomBoite' : nom de la boîte utilisateur (sans le préfixe Modèle:Utilisateur)
-- Retourne : une chaine de caractère contenant le code pour afficher la boîte.
local function codeBoite( frame, nomBoite )
local chaine
modele = mw.title.makeTitle( 'Modèle', 'Utilisateur '..nomBoite )
if modele.exists then
chaine = frame:expandTemplate{ title = 'Utilisateur '..nomBoite }
else
span = mw.html.create('span')
span:addClass('error')
span:wikitext('Erreur : le [[Modèle:Utilisateur '..nomBoite..']] n\'existe pas')
chaine = tostring(span)
end
return chaine
end
-- Fonction pour générer une ligne d'en-tête.
-- Accepte comme arguments :
-- * 'colonnes' : valeur numérique indiquant le nombre de colonnes.
-- * 'titreN', avec N valeur numérique <= à 'colonnes' : titre de la colonne N.
-- Retourne : une chaine de caractères représentant l'en-tête du tableau.
local function enTete( arguments )
-- Variables nécessaires à la fonction.
local nombreColonnes = 1
local titreColonne = { }
-- Récupérer le nombre de colonnes.
if arguments.colonnes ~= nil then
nombreColonnes = tonumber(arguments.colonnes)
end
-- Dépilage des textes de titre.
for cle,valeur in pairs(arguments) do
local numeroColonne = numeroParametre(cle, 'titre')
if numeroColonne ~= nil then
-- On ne prend en compte que les titres correspondant à une colonne réelle
if numeroColonne <= nombreColonnes then
titreColonne[numeroColonne] = valeur
end
end
end
-- Initialiser la chaine résultat.
local chaine = '{|rules="all" style="border: 1px solid #999; text-align: center;" cellspacing="0" cellpadding="3"'
chaine = chaine..'\n|-bgcolor="#DFDFDF"'
-- Itérer sur le nombre de colonnes.
for numeroColonne=1,nombreColonnes do
chaine = chaine..'\n! scope="col" |'
if titreColonne[numeroColonne] ~= nil then
chaine = chaine..titreColonne[numeroColonne]
else
chaine = chaine..'Nom de la boîte'
end
chaine = chaine..' !! scope="col" | Visualisation'
end
return chaine
end
-- Fonction pour générer une ligne de contenu.
-- Accepte comme arguments :
-- * 'colonnes' : valeur numérique indiquant le nombre de colonnes.
-- * 'lignes' : valeur numérique indiquant le nombre de lignes.
-- * N (valeur numérique) <= à 'colonnes'*'lignes' : Nom de la BU de la case N.
-- * 'commentaireN' avec N <= à 'colonnes' : Commentaire de la colonne N.
-- * 'contenuN' avec N <= à 'colonnes'*'lignes' : Contenu de la case N (remplace l'affichage par défaut du modèle).
-- Retourne : une chaine de caractères représentant une ligne du tableau.
local function contenu ( frame, arguments )
-- Variables nécessaires à la fonction.
local nombreColonnes = 1
local nombreLignes = 1
local nombreCases = 1
local commentaire = { }
local nomBU = { }
local contenuCase = { }
-- Récupérer le nombre de colonnes et de lignes.
if arguments.colonnes ~= nil then
nombreColonnes = tonumber(arguments.colonnes)
end
if arguments.lignes ~= nil then
nombreLignes = tonumber(arguments.lignes)
end
nombreCases = nombreColonnes*nombreLignes
-- Dépilage des paramètres.
for cle,valeur in pairs(arguments) do
local numeroCommentaire = numeroParametre(cle, 'commentaire')
local numeroContenu = numeroParametre(cle, 'contenu')
if type(cle) == 'number' then
if cle <= nombreCases then
local texteTrim = mw.text.trim( valeur )
if texteTrim ~= '' then
nomBU[cle] = texteTrim
end
end
elseif numeroCommentaire ~= nil then
-- Un seul commentaire par colonne, même si multi ligne.
if numeroCommentaire <= nombreColonnes then
commentaire[numeroCommentaire] = valeur
end
elseif numeroContenu ~= nil then
if numeroContenu <= nombreCases then
contenuCase[numeroContenu] = valeur
end
end
end
local chaine = '\n|-'
-- Itérer sur le nombre de colonnes pour créer la première ligne.
for numeroColonne=1,nombreColonnes do
chaine = chaine..'\n| '
-- Si multi ligne, fusionner la première case..
if nombreLignes ~= 1 then
chaine = chaine..' rowspan="'..nombreLignes..'" | '
end
-- Contenu de la première case : noms des modèles.
for numeroLigne=1,nombreLignes do
local numeroCase = ( (numeroColonne - 1) * (nombreLignes) ) + numeroLigne
if nomBU[numeroCase] ~= nil then
if numeroLigne ~= 1 then
chaine = chaine..'<br>ou<br>'
end
chaine = chaine..'[[Modèle:Utilisateur '..nomBU[numeroCase]..'|'..nomBU[numeroCase]..']]'
else
-- Une case peut être vide
chaine = chaine..' '
end
end
-- Commentaire si présent.
if commentaire[numeroColonne] ~= nil then
chaine = chaine..'<br>\'\''..commentaire[numeroColonne]..'\'\''
end
-- Affichage du modèle.
chaine = chaine..'||'
local numeroCase = ( (numeroColonne - 1) * (nombreLignes) ) + 1
if nomBU[numeroCase] ~= nil then
if contenuCase[numeroCase] ~= nil then
chaine = chaine..contenuCase[numeroCase]
else
chaine = chaine..codeBoite( frame, nomBU[numeroCase] )
end
else
-- Une case peut être vide
chaine = chaine..' '
end
end
-- Créer les lignes supplémentaires si elles existent.
if nombreLignes ~= 1 then
for numeroLigne=2,nombreLignes do
chaine = chaine..'\n|-'
for numeroColonne=1,nombreColonnes do
chaine = chaine..'\n| '
local numeroCase = ( (numeroColonne - 1) * (nombreLignes) ) + numeroLigne
if nomBU[numeroCase] ~= nil then
if contenuCase[numeroCase] ~= nil then
chaine = chaine..contenuCase[numeroCase]
else
chaine = chaine..codeBoite( frame, nomBU[numeroCase] )
end
else
-- Une case peut être vide
chaine = chaine..' '
end
end
end
end
return chaine
end
-- Fonction pour générer une fin de tableau.
-- Retourne : une chaine de caractères représentant la fin du tableau.
local function fin( )
-- Simplement retourner la séquence de clôture de tableau.
return '|}'
end
-- Fonction exportée : permet de générer une ligne
-- d'en-tête, de contenu ou de fin.
function fonctions.genererLigne ( frame )
-- Variables nécessaires à la fonction.
local typeLigne = contenu
local arguments = frame:getParent().args
-- Récupérer le type de ligne à créer.
if arguments['type'] ~= nil then
typeLigne = arguments['type']
end
-- Appeler la sous-fonction correspondante.
if typeLigne == 'enTete' then
return enTete( arguments )
elseif typeLigne == 'fin' then
return fin( )
else
return contenu( frame, arguments )
end
end
return fonctions