Module:Taxonomy: Difference between revisions
Appearance
Created page with "local p = {} -- Internal function to render a single node recursively local function renderNode(node, indent) indent = indent or 0 local out = string.rep(":", indent) .. node.label .. "\n" for _, child in ipairs(node.children) do out = out .. renderNode(child, indent + 1) end return out end -- Parse a "*"-style hierarchy string into a Lua table tree function p.parse(frame) local input = frame.args[1] or "" local nodes = {} local..." |
No edit summary |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- Internal | -- Internal: colon-style render (for backward compatibility) | ||
local function | local function renderNodeColon(node, indent) | ||
indent = indent or 0 | indent = indent or 0 | ||
local out = string.rep(":", indent) .. node.label .. "\n" | local out = string.rep(":", indent) .. node.label .. "\n" | ||
for _, child in ipairs(node.children) do | for _, child in ipairs(node.children) do | ||
out = out .. | out = out .. renderNodeColon(child, indent + 1) | ||
end | end | ||
return out | 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 | end | ||
| Line 48: | Line 61: | ||
end | end | ||
-- Render | -- Render as colon-style indented text | ||
function p.renderTree(frame) | function p.renderTree(frame) | ||
local tree = p.parse(frame) | local tree = p.parse(frame) | ||
local out = "" | local out = "" | ||
for _, node in ipairs(tree) do | for _, node in ipairs(tree) do | ||
out = out .. | out = out .. renderNodeColon(node) | ||
end | end | ||
return "<pre>" .. mw.text.nowiki(out) .. "</pre>" | 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 | end | ||
return p | return p | ||
Latest revision as of 15:48, 27 November 2025
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