Aller au contenu

« Module:TreeList » : différence entre les versions

De Wikiquestia
Aucun résumé des modifications
Aucun résumé des modifications
 
(9 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
local p = {}
local p = {}


-- Fonction utilitaire pour diviser une chaîne avec un séparateur
local function split(text, sep)
local function split(text, sep)
if not sep then sep = ">" end
if not sep then sep = ">" end
Ligne 11 : Ligne 10 :
end
end


-- Construction récursive de l'arbre
local function insertPath(tree, path)
local function insertPath(tree, path)
local node = tree
local node = tree
Ligne 21 : Ligne 19 :
end
end


-- 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 = ""
local keys = {}
local keys = {}


-- Collecter les enfants dans l’ordre
for k in pairs(node.children or {}) do table.insert(keys, k) end
for k in pairs(node.children or {}) do table.insert(keys, k) end
table.sort(keys)
table.sort(keys)
Ligne 34 : Ligne 30 :
local isLastChild = (i == #keys)
local isLastChild = (i == #keys)


local line = prefix
local line = prefix .. (isLast and "    " or "│  ")
if prefix ~= "" then
line = line .. (isLast and "    " or "│  ")
end
line = line .. (isLastChild and "└── " or "├── ")
line = line .. (isLastChild and "└── " or "├── ")


Ligne 55 : Ligne 48 :
end
end


-- Point d’entrée principal
function p.render(frame)
function p.render(frame)
local args = frame:getParent().args
local args = frame:getParent().args
local paths = {}
local paths = {}
local root = {}


-- 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 67 : Ligne 59 :
end
end


-- Définir les couleurs par niveau
for _, path in ipairs(paths) do
insertPath(root, path)
end
 
local colorByLevel = {
local colorByLevel = {
[1] = "#993333", -- tronc
[1] = "#993333",
[2] = "#209a57", -- 1er sous-niveau
[2] = "#209a57",
[3] = "#2080a5",
[3] = "#2080a5",
[4] = "#5555cc",
[4] = "#5555cc",
Ligne 76 : Ligne 71 :
}
}


-- Construire l'arbre
-- ✅ Rendu propre : pas de fond, pas de cadre, mais alignement préservé
local root = {}
local result = '<div style="font-family:Menlo; font-size:0.95em; line-height:1.6em; background:none; border:none; padding:0; margin:0; color:#222; white-space:pre;">\n'
for _, path in ipairs(paths) do
result = result .. renderNode(root, "", true, 1, colorByLevel)
insertPath(root, path)
result = result .. '</div>'
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
return result
end
end


return p
return p

Dernière version du 12 juin 2025 à 08:36

La documentation pour ce module peut être créée à Module:TreeList/doc

local p = {}

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

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

local function renderNode(node, prefix, isLast, level, colorByLevel)
	local output = ""
	local keys = {}

	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 .. (isLast and "    " or "│   ")
		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

function p.render(frame)
	local args = frame:getParent().args
	local paths = {}
	local root = {}

	for _, v in ipairs(args) do
		if v and v ~= "" then
			table.insert(paths, split(v))
		end
	end

	for _, path in ipairs(paths) do
		insertPath(root, path)
	end

	local colorByLevel = {
		[1] = "#993333",
		[2] = "#209a57",
		[3] = "#2080a5",
		[4] = "#5555cc",
		[5] = "#cc3366"
	}

	-- ✅ Rendu propre : pas de fond, pas de cadre, mais alignement préservé
	local result = '<div style="font-family:Menlo; font-size:0.95em; line-height:1.6em; background:none; border:none; padding:0; margin:0; color:#222; white-space:pre;">\n'
	result = result .. renderNode(root, "", true, 1, colorByLevel)
	result = result .. '</div>'

	return result
end

return p