Jump to content

Module:Taxonomy: Difference between revisions

From PanEcoDevWiki
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 function to render a single node recursively
-- Internal: colon-style render (for backward compatibility)
local function renderNode(node, indent)
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 .. renderNode(child, indent + 1)
         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 a hierarchy table as indented text
-- 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 .. renderNode(node)
         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