• Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Module:Sandbox/Bob1301/Tree

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [创建] [刷新]
local p = {}

local getArgs = require('Module:Arguments').getArgs

function p.main(frame)
	local r = ""
	local input = frame.args[1] or ""
	local lines = {}
	for line in mw.text.gsplit(input, '\n', true) do
		table.insert(lines, line)
	end
	
	local root = {
		name = "ROOT",
		children = {},
		depth = -1
	}
	local stack = {root}
	
	for _, line in ipairs(lines) do
		local stars, name = line:match("^(%**)%s*(.+)$")
		if name then
			local depth = stars and #stars or 0
			local node = {
				name = name,
				children = {},
				depth = depth
			}
			
			while #stack > 0 and stack[#stack].depth >= depth do
				table.remove(stack)
			end
			
			table.insert(stack[#stack].children, node)
			table.insert(stack, node)
		end
	end
	
    local function render(node, prefix, isLast)
        local connector = isLast and "└─ " or "├─ "
        r = r .. "<br />" .. prefix .. connector .. node.name
        local newPrefix = prefix .. (isLast and "\t" or "│\t")
        for i, child in ipairs(node.children) do
            render(child, newPrefix, i == #node.children)
        end
    end
    
    local top = root.children[1]
    if top then
        r = top.name
        for i, child in ipairs(top.children) do
            render(child, "", i == #top.children)
        end
    end
    
    
    return "<span style=\"tab-size:4\">" .. r .. "</span>"
end

return p