Module:TableBuilder

From Minetest Wiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:TableBuilder/doc

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