Module:Tableau boîte utilisateur

 Documentation[voir] [modifier] [historique] [purger]

Utilisation modifier

Fonctions 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 fonction trim.

Voir le modèle {{Tableau boîte utilisateur}} pour la description des paramètres acceptés par le module.

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