Module:Arbre
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. Il permet par exemple de créer des arbres généalogiques ou des cladogrammes.
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ètrecontenu
, 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ètretemplatestyles
. La valeurnon
désactive l'inclusion de la balise<templatestyles>
dans le rendu.
Exemples
La syntaxe de l'arbre est une liste à puce, c'est-à-dire avec un ou plusieurs *
en début de ligne.
Note : le module conserve telles quelles toutes les lignes qui ne commencent pas par « * » ainsi que les lignes vides.
Exemple (note : ici il s'agit d'un appel direct au module, le paramètre vient de l'appel au modèle, normalement) :
{{#invoke:Arbre|arbre|contenu= * ''[[Panthera]]'' **** ''[[Panthera leo]]'' - Lion **** ''[[Panthera pardus]]'' - Léopard *** ''[[Panthera onca]]'' - Jaguar ** *** ''[[Panthera tigris]]'' - Tigre *** ''[[Panthera uncia]]'' - Panthère des neiges ou once }}
Et le résultat :
- Panthera
-
-
- Panthera leo - Lion
- Panthera pardus - Léopard
- Panthera onca - Jaguar
-
-
- Panthera tigris - Tigre
- Panthera uncia - Panthère des neiges ou once
-
Tests
Voir Discussion module:Arbre/Test
--[[ 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[i] 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[i], '^%**') local texte = mw.text.trim(string.sub(lignes[i], #etoiles + 1)) local profondeur = #etoiles -- Met à jour la ligne courante. local embranchement = baliseEmbranchement(not niveauxDejaFinis[profondeur] and profondeur > 1, texte) if profondeur > 0 then lignes[i] = 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[i] = lignes[i] .. '\n' .. etoiles .. baliseEmbranchement(not niveauxDejaFinis[j], '') 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[j] = false end niveauxDejaFinis[profondeur] = true for j = profondeur + 1, #niveauxDejaFinis do niveauxDejaFinis[j] = nil end derniereProfondeur = profondeur end end function p.arbre(frame) local args = frame.args local pargs = frame:getParent().args local data = args['contenu'] or pargs['contenu'] 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