모듈:Tree diagram

이 모듈에 대한 설명문서는 모듈:Tree diagram/설명문서에서 만들 수 있습니다

local p = {}

--============  tree root  ================
function p.main(frame)
    local i = 0
    local str, gene = {}, {}
    local code = {}
    local codeinput = string.gsub(string.gsub(frame.args[1], "[\n]+", "\n"), "\n", "", 1)
    -- 입력한 코드
    local rootClass = frame.args[2]
    local nodestyle = frame.args[3] -- 노드 스타일
    local nodeClass = frame.args[4] -- 노드 클래스
    local linkstyle = frame.args[5] -- 링크 스타일
    local linkclass = frame.args[6] -- 링크 클래스

    -- make tree node, link
    local function link() -- link
        return tostring(mw.html.create("div"):addClass(linkclass):cssText(linkstyle):done())
    end

    local function node(text) -- node
        return '<li>' .. link() .. tostring(
            mw.html.create("span")
            :addClass('node ' .. nodeClass)
            :cssText(nodestyle):wikitext(link() .. text):done())
    end

    local function repeats(str, cha)
        local _, n = string.gsub(str, cha, "")
        return n
    end

    for line in string.gmatch(codeinput, "([^\n]*)\n+") do
        str[i] = string.gsub(string.gsub(line, "*%s*", "*"), "*", "")
        gene[i] = repeats(line, "*")
        i = i + 1
    end
    --====================================

    local rootBox = "<ul " .. rootClass .. ">" .. link()
    i = -1
    while str[i + 1] do
        i = i + 1
        local cont = node(str[i])
        if i == 0 then
            table.insert(code, rootBox .. cont)
            --      앞에보다  뒤에가 작다
        elseif gene[i - 1] < gene[i] then
            local times = gene[i] - gene[i - 1]
            for _ = 1, times do
                cont = '<ul>' .. link() .. cont
            end
            table.insert(code, cont)

        elseif gene[i - 1] == gene[i] then
            table.insert(code, '</li>' .. cont)

        elseif gene[i - 1] > gene[i] then
            local times = gene[i - 1] - gene[i]
            for _ = 1, times do
                cont = '</ul></li>' .. cont
            end
            table.insert(code, cont)
        end
    end
    return table.concat(code)
end

return p