Jump to content

Module:Taxonomy

From PanEcoDevWiki

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