Moduł:Brudnopis/Paweł Ziemian/Klad

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Brudnopis/Paweł Ziemian/Klad/opis

function loadTree(data)
	local tree = {}
	
	for k, v in pairs(data) do
		mw.log("------------------------------------")
		mw.logObject({k=k, v=v})
		local keys = mw.text.split(k,'.',true)
		local index = keys[#keys]
		if #keys > 1 then
			for i = 1, #keys-1 do
				keys[i] = tonumber(string.match(keys[i], "^[0-9][0-9]?$"))
				if not keys[i] or (keys[i] == 0) then
					mw.logObject(keys,"failed-keys")
					index = false
					break
				end
			end
		end
		
		if index then
			local node = tree
			for i = 1, #keys-1 do
				local k = keys[i]
				local child = node[k]
				if not child then
					child = {}
					node[k] = child
				elseif type(child) == "string" then
					mw.log("-----")
					mw.logObject(tree,"tree-before")
					mw.logObject({i=i,k=k,keys=keys,child=child},"text-child")
					local labelName = "label"..k
					if not node[labelName] then
						node[labelName] = child
					end
					
					child = {}
					node[k] = child
				end
				
				node = child
			end
			
			local childIndex = tonumber(index)
			if childIndex then
				if type(node[childIndex]) == "table" then
					local labelName = "label"..index
					if not node[labelName] then
						node[labelName] = v
					end
				else
					node[childIndex] = v
				end
			else
				node[index] = v
			end

			mw.logObject(tree,"tree-after-kv")
		end
		
	end
	
	mw.log('===============================')
	mw.logObject(tree,"tree")
	return tree
end

function printTree(tree)
	local result = {}
	local style = tree.style or ""
	table.insert(result, '{| cellspacing=0 cellpadding=0 border=0 style="'..style..'"\n')
	local thickness = tostring(tonumber(tree.thickness) or 1)
	for i, v in ipairs(tree) do
		local text
		local labelName = "label"..tostring(i)
		local label = tree[labelName] or "<br />"
		if type(v) == "string" then
			text = v
		elseif type(v) == "table" then
			text = printTree(v)
		end
		
		if i == 1 then
			table.insert(result, '| style="width:1.5em;border-bottom:'..thickness..'px solid black;" valign=bottom align=center | '..label..' || rowspan=2 |\n')
			table.insert(result, text or "{{{1}}}")
			table.insert(result, '\n|-\n')
		elseif text and #text > 0 then
			table.insert(result, '| style="border-left:'..thickness..'px solid black;" valign=top |<br/>\n')
			table.insert(result, '|-\n')
			table.insert(result, '| style="border-left:'..thickness..'px solid black; border-bottom:'..thickness..'px solid black;" valign=bottom align=center | '..label..' || rowspan=2 |\n')
			table.insert(result, text)
			table.insert(result, '\n|-\n')
		end
	end
	
	table.insert(result, '| valign=top | <br/>\n')
	table.insert(result, '|}')
	return table.concat(result)
end


return {
	
["Pokaż"] = function(frame)
	local tree = loadTree(frame:getParent().args)
	if tree and (#tree > 0) then
		return printTree(tree)
	end
end

}