Module:arbre

Bonjour, vous êtes venu ici pour chercher la signification du mot Module:arbre. Dans DICTIOUS, vous trouverez non seulement toutes les significations du dictionnaire pour le mot Module:arbre, mais vous apprendrez également son étymologie, ses caractéristiques et comment dire Module:arbre au singulier et au pluriel. Tout ce que vous devez savoir sur le mot Module:arbre est ici. La définition du mot Module:arbre vous aidera à être plus précis et correct lorsque vous parlerez ou écrirez vos textes. Connaître la définition deModule:arbre, ainsi que celles d'autres mots, enrichit votre vocabulaire et vous fournit des ressources linguistiques plus nombreuses et de meilleure qualité.

Ce module permet d'afficher une liste à plusieurs niveaux sous forme d'arbre. À la place des puces présentes à gauche de chaque élément dans une liste classique, il affiche des lignes connectant chaque élément à ses descendants directs.

Ce module est destiné à être utilisé via le modèle {{arbre}}.

Utilisation

Fonctions exportables :

  • arbre(frame) – fonction générant l'arbre. Prend un seul paramètre contenu, soit depuis l'appel du modèle, soit depuis l'appel du module (si le premier n'est pas présent − ce dernier cas est surtout utilisable pour du test). Pour les tests, accepte un paramètre templatestyles. La valeur non désactive l'inclusion de la balise templatestyles dans le rendu.

--[[
  Test de module pour générer des arbres (cf Modèle:Arbre début) avec
  une syntaxe plus simple.
]]

local p = {}

-- Crée la balise <li> à insérer au début d'une ligne pour avoir le bon embranchement.
local function baliseEmbranchement(brancheFinale, texte)
	local classesEmbranchement = ''
	if brancheFinale then
		classesEmbranchement = 'lastline '
	end
	if texte == '' then
		classesEmbranchement = classesEmbranchement .. 'emptyline'
	end
	if classesEmbranchement == '' then
		return ''
	end
	return '<li class="' .. classesEmbranchement .. '">'
end

-- Ajoute les balises <li> d'embranchement dans lignes.
function p.ajouteEmbranchements(lignes)
	-- Les lignes sont parcourues en partant de la fin.
	-- niveauxDejaFinis indique si on a déjà vu une ligne de profondeur i plus récemment qu'une ligne de
	-- profondeur i-1, autrement dit que la balise de fin à la profondeur i a déjà été insérée quelque part et que
	-- les autres lignes de profondeur i n'en ont pas besoin (tant qu'on ne revient pas à i-1).
	local niveauxDejaFinis = {}
	-- Profondeur de la ligne vue à l'itération d'avant, c'est-à-dire la ligne suivante dans l'ordre du texte.
	local derniereProfondeur = 0

	for i = #lignes, 1, -1 do
		-- Découpe la ligne en deux : etoiles contient les '*' du début, texte le reste.
		local etoiles = string.match(lignes, '^%**')
		local texte = mw.text.trim(string.sub(lignes, #etoiles + 1))
		local profondeur = #etoiles

		-- Met à jour la ligne courante.
		local embranchement = baliseEmbranchement(not niveauxDejaFinis and profondeur > 1, texte)
		if profondeur > 0 then
			lignes = etoiles .. embranchement .. texte
		end
		-- Pour faciliter l'utilisation du modèle, l'entrée est autorisée à contenir des augmentations de plus
		-- d'un niveau à la fois. Dans ce cas, on synthétise les niveaux intermédaires, sans contenu.
		for j = profondeur + 1, derniereProfondeur - 1 do
			etoiles = etoiles .. '*'
			lignes = lignes .. '\n' .. etoiles .. baliseEmbranchement(not niveauxDejaFinis, '')
		end

		-- Mise à jour de niveauxDejaFinis. Le tableau doit être rempli jusqu'à la profondeur courante et vidé
		-- après, de sorte que #niveauxDejaFinis soit égal à profondeur après la mise à jour.
		for j = #niveauxDejaFinis + 1, profondeur - 1 do
			niveauxDejaFinis = false
		end
		niveauxDejaFinis = true
		for j = profondeur + 1, #niveauxDejaFinis do
			niveauxDejaFinis = nil
		end
		derniereProfondeur = profondeur
	end
end

function p.arbre(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	local data = args or pargs or ''
	local lignes = mw.text.split(mw.text.trim(data), '\n', true)
	p.ajouteEmbranchements(lignes)
	local style = ''
	if args.templatestyles ~= 'non' then
		style = frame:preprocess('<templatestyles src="arbre/styles.css" />')
	end
	local resultat = '<div class="treeview">\n' .. table.concat(lignes, '\n') .. '</div>'
	return style .. resultat
end

return p