모듈:Tree diagram

신사 (토론 | 기여)님의 2024년 5월 21일 (화) 13:51 판 (새 문서: 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...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

이 모듈에 대한 설명문서는 모듈: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