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
[modifier le code]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
[modifier le code]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
[modifier le code]Voir Discussion module:Arbre/Test
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.
--[[
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