Module:TableBuilder

From Minetest Wiki
Jump to navigation Jump to search

local TableBuilder = {}

local HtmlBuilder = require('Module:HtmlBuilder') local methodtable = getmetatable(HtmlBuilder.create()).__index local tablemetatable, rowmetatable, cellmetatable

local function createBuilder(metatable, parent)

   local builder = {}
   setmetatable(builder, metatable)
   builder.nodes = {}
   if parent then
       builder.parent = parent
       table.insert(parent.nodes, builder)
   end
   return builder

end

function TableBuilder.create()

   local builder = createBuilder(tablemetatable)
   builder.attributes = {}
   builder.styles = {}
   return builder

end

local function addCell(t, mark, ...)

   local builder = createBuilder(cellmetatable, t)
   builder.attributes = {}
   builder.styles = {}
   builder.mark = mark
   if ... then
       builder:wikitext(...)
   end
   return builder

end

local function tostring(t)

   local ret = {}
   t:_build(ret)
   return table.concat(ret)

end

tablemetatable = {

   __tostring = tostring,
   __index = {
       _buildAttributes = methodtable._buildAttributes,
       _buildStyles = methodtable._buildStyles,
       _buildNodes = methodtable._buildNodes,
       _build = function(t, ret)
           table.insert(ret, '{|')
           t:_buildAttributes(ret)
           t:_buildStyles(ret)
           t:_buildNodes(ret)
           table.insert(ret, '\n|}')
       end,
       addCaption = function(t, ...) return addCell(t, "|+", ...) end,
       addRow = function(t) return createBuilder(rowmetatable, t) end,
       getAttr = methodtable.getAttr,
       attr = methodtable.attr,
       addClass = methodtable.addClass,
       css = methodtable.css,
       cssText = methodtable.cssText
   }

}

rowmetatable = {

   __tostring = tostring,
   __index = {
       _buildNodes = methodtable._buildNodes,
       _build = function(t, ret)
           table.insert(ret, '\n|-')
           t:_buildNodes(ret)
       end,
       addHeader = function(t, ...) return addCell(t, "!", ...) end,
       addData = function(t, ...) return addCell(t, "|", ...) end,
       done = methodtable.done,
       allDone = methodtable.allDone
   }

}

cellmetatable = {

   __tostring = tostring,
   __index = {
       _buildAttributes = methodtable._buildAttributes,
       _buildStyles = methodtable._buildStyles,
       _buildNodes = methodtable._buildNodes,
       _build = function(t, ret)
           table.insert(ret, '\n' .. t.mark)
           t:_buildAttributes(ret)
           t:_buildStyles(ret)
           table.insert(ret, '|')
           t:_buildNodes(ret)
       end,
       node = methodtable.node,
       wikitext = methodtable.wikitext,
       tag = methodtable.tag,
       getAttr = methodtable.getAttr,
       attr = methodtable.attr,
       addClass = methodtable.addClass,
       css = methodtable.css,
       cssText = methodtable.cssText,
       done = methodtable.done,
       allDone = methodtable.allDone
   }

}

return TableBuilder