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