« Module:TreeList » : différence entre les versions
Apparence
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| Ligne 21 : | Ligne 21 : | ||
end | end | ||
-- Rendu récursif | -- Rendu récursif des enfants | ||
local function renderNode(node, prefix, isLast, level, colorByLevel) | local function renderNode(node, prefix, isLast, level, colorByLevel) | ||
local output = "" | local output = "" | ||
| Ligne 60 : | Ligne 60 : | ||
local paths = {} | local paths = {} | ||
-- Récupérer les chaînes de type : | -- Récupérer les chaînes de type : A > B > C | ||
for _, v in ipairs(args) do | for _, v in ipairs(args) do | ||
if v and v ~= "" then | if v and v ~= "" then | ||
| Ligne 69 : | Ligne 69 : | ||
-- Définir les couleurs par niveau | -- Définir les couleurs par niveau | ||
local colorByLevel = { | local colorByLevel = { | ||
[1] = "#993333", | [1] = "#993333", -- tronc | ||
[2] = "#209a57", | [2] = "#209a57", -- 1er sous-niveau | ||
[3] = "#2080a5", | [3] = "#2080a5", | ||
[4] = "#5555cc", | [4] = "#5555cc", | ||
[5] = "#cc3366" | [5] = "#cc3366" | ||
} | } | ||
| Ligne 82 : | Ligne 82 : | ||
end | end | ||
-- Rendu final | -- Rendu final dans un encadré | ||
local result = '<div style="font-family:monospace; white-space:pre; border:1px solid #aaa; padding:0.5em;">\n' | |||
-- Détecter si un seul tronc commun existe | -- Détecter si un seul tronc commun existe | ||
local keys = {} | local keys = {} | ||
for k in pairs(root.children or {}) do table.insert(keys, k) end | for k in pairs(root.children or {}) do table.insert(keys, k) end | ||
table.sort(keys) | table.sort(keys) | ||
if #keys == 1 then | if #keys == 1 then | ||
| Ligne 103 : | Ligne 103 : | ||
result = result .. '</div>' | result = result .. '</div>' | ||
return result | |||
end | end | ||
return p | return p | ||
Version du 12 juin 2025 à 07:18
La documentation pour ce module peut être créée à Module:TreeList/doc
local p = {}
-- Fonction utilitaire pour diviser une chaîne avec un séparateur
local function split(text, sep)
if not sep then sep = ">" end
local result = {}
for token in mw.text.gsplit(text, sep, true) do
table.insert(result, mw.text.trim(token))
end
return result
end
-- Construction récursive de l'arbre
local function insertPath(tree, path)
local node = tree
for _, part in ipairs(path) do
node.children = node.children or {}
node.children[part] = node.children[part] or {}
node = node.children[part]
end
end
-- Rendu récursif des enfants
local function renderNode(node, prefix, isLast, level, colorByLevel)
local output = ""
local keys = {}
-- Collecter les enfants dans l’ordre
for k in pairs(node.children or {}) do table.insert(keys, k) end
table.sort(keys)
for i, name in ipairs(keys) do
local child = node.children[name]
local isLastChild = (i == #keys)
local line = prefix
if prefix ~= "" then
line = line .. (isLast and " " or "│ ")
end
line = line .. (isLastChild and "└── " or "├── ")
local color = colorByLevel[level] or ""
local text = name:match("^%[%[.+%]%]$") and name or "[[" .. name .. "]]"
if color ~= "" then
line = line .. string.format('<span style="color:%s;">%s</span>\n', color, text)
else
line = line .. text .. "\n"
end
output = output .. line
output = output .. renderNode(child, prefix .. (isLast and " " or "│ "), isLastChild, level + 1, colorByLevel)
end
return output
end
-- Point d’entrée principal
function p.render(frame)
local args = frame:getParent().args
local paths = {}
-- Récupérer les chaînes de type : A > B > C
for _, v in ipairs(args) do
if v and v ~= "" then
table.insert(paths, split(v))
end
end
-- Définir les couleurs par niveau
local colorByLevel = {
[1] = "#993333", -- tronc
[2] = "#209a57", -- 1er sous-niveau
[3] = "#2080a5",
[4] = "#5555cc",
[5] = "#cc3366"
}
-- Construire l'arbre
local root = {}
for _, path in ipairs(paths) do
insertPath(root, path)
end
-- Rendu final dans un encadré
local result = '<div style="font-family:monospace; white-space:pre; border:1px solid #aaa; padding:0.5em;">\n'
-- Détecter si un seul tronc commun existe
local keys = {}
for k in pairs(root.children or {}) do table.insert(keys, k) end
table.sort(keys)
if #keys == 1 then
local rootKey = keys[1]
local rootNode = root.children[rootKey]
local color = colorByLevel[1] or ""
local text = rootKey:match("^%[%[.+%]%]$") and rootKey or "[[" .. rootKey .. "]]"
local line = (color ~= "") and string.format('<span style="color:%s;">%s</span>', color, text) or text
result = result .. line .. "\n"
result = result .. renderNode(rootNode, "", true, 2, colorByLevel)
else
result = result .. renderNode(root, "", true, 1, colorByLevel)
end
result = result .. '</div>'
return result
end
return p