Module:Taxonomy
Appearance
Documentation for this module may be created at Module:Taxonomy/doc
local p = {}
-- Internal: colon-style render (for backward compatibility)
local function renderNodeColon(node, indent)
indent = indent or 0
local out = string.rep(":", indent) .. node.label .. "\n"
for _, child in ipairs(node.children) do
out = out .. renderNodeColon(child, indent + 1)
end
return out
end
-- Internal: nested <ul> render
local function renderNodeUL(node)
local out = "<li>" .. mw.text.nowiki(node.label)
if #node.children > 0 then
out = out .. "<ul>"
for _, child in ipairs(node.children) do
out = out .. renderNodeUL(child)
end
out = out .. "</ul>"
end
return out .. "</li>"
end
-- Parse a "*"-style hierarchy string into a Lua table tree
function p.parse(frame)
local input = frame.args[1] or ""
local nodes = {}
local stack = {}
-- Match: one or more * followed by non-* characters
for stars, label in input:gmatch("(%*+)([^%*]+)") do
local level = #stars
label = mw.text.trim(label)
local node = {
level = level,
label = label,
children = {}
}
-- Update stack
stack[level] = node
for i = level + 1, #stack do
stack[i] = nil
end
-- Attach node to parent or root
if level == 1 then
table.insert(nodes, node)
else
local parent = stack[level - 1]
if parent then
table.insert(parent.children, node)
end
end
end
return nodes
end
-- Render as colon-style indented text
function p.renderTree(frame)
local tree = p.parse(frame)
local out = ""
for _, node in ipairs(tree) do
out = out .. renderNodeColon(node)
end
return "<pre>" .. mw.text.nowiki(out) .. "</pre>"
end
-- Render as nested <ul> HTML list (vertical hierarchy)
function p.renderTreeUL(frame)
local tree = p.parse(frame)
local out = "<ul>"
for _, node in ipairs(tree) do
out = out .. renderNodeUL(node)
end
out = out .. "</ul>"
return out
end
return p