Module:HTML Utility

local util_table = require("Module:Table Utility") local p = {}

function p.makeFootnoteN(n) if n and n ~= "" then return string.format('%s', n)	end return "" end function p.makeNodeFromWikitext(text) local tbl = mw.html.create :wikitext(text) return tbl end

-- this function only makes the inner divs; it does not put the content into a table to restrict width, that's up to the parent function -- as such, this adds to an existing html object and does not create its own -- while content is a table, padding is a constant because why would you want variable padding -- the name of this function is inherited from the template BlockBox function p.blockBoxContent(content, padding, tbl) for k, v in ipairs(content) do		div = tbl:tag('div') div:css({			display = "inline-block",			['vertical-align'] = 'top',		}) if padding and k ~= #content then div:css('padding-right',padding) end div:wikitext(v) end return end

function p.blockBox(content, padding) local tbl = mw.html.create('table') :addClass('blockbox') local tr = tbl:tag('tr') local td = tr:tag('td') p.blockBoxContent(content, padding, td) return tbl end

function p.printEmptySortRow(tbl, n)	local tr = tbl:tag('tr'):css('font-size','60%') for i = 1, n do		tr:tag('th') :wikitext(' ') end return end

function p.printEmptyWidthRow(tbl, widths) local tr = tbl:tag('tr'):addClass('empty-width-row') for _, v in ipairs(widths) do		tr:tag('td'):css('width', v):wikitext(' ') end return end

function p.printEmptyWidthRowPX(tbl, widths) local tr = tbl:tag('tr'):addClass('empty-width-row') for _, v in ipairs(widths) do tr:tag('td'):css('width', v .. 'px'):wikitext(' ') end return end

function p.printColspanHeader(tbl, display, colspan, class, width) local tr = tbl:tag('tr'):addClass(class) local th = tr:tag('th'):attr('colspan', colspan):wikitext(display) if width then th:cssText(('width:%spx'):format(width)) end end

function p.printColspanCell(tbl, display, colspan, class, width) local tr = tbl:tag('tr'):addClass(class) local td = tr:tag('td'):attr('colspan', colspan):wikitext(display) if width then td:cssText(('width:%spx'):format(width)) end end

function p.makeColspanCell(display, colspan, class, width) local output = mw.html.create p.printColspanCell(tbl, display, colspan, class, width) return output end

function p.printHeader(tbl, data, classes) if not classes then classes = {} end local class = type(classes) == 'string' and classes local tr = tbl:tag('tr'):addClass(classes.row) for i, v in ipairs(data) do		tr:tag('th'):addClass(class or classes[i] or ''):wikitext(v) end return end

function p.printRowsByList(tbl, data, list) -- data is an array of tables for _, row in ipairs(data) do		p.printRowByList(tbl, row, list) end return end

function p.printRowByList(tbl, row, list) local classes = util_table.merge(row.classes or {}, list.classes) local attrs = row.attrs or {} local tr = tbl:tag('tr') for _, item in ipairs(list) do		local td = tr:tag('td') :addClass(classes[item] or '') for k, v in pairs(attrs[item] or {}) do			td:attr(k, v)		end if row[item] then td:wikitext(tostring(row[item])) end end return tr end

function p.printRowsByListInDict(tbl, data, list) -- data is an ordered dictionary for _, v in ipairs(data) do		tbl:tag('tr') for _, item in ipairs(list) do			tbl:tag('td'):wikitext(data[v][item]) end end return end

function p.clear(tbl) if not tbl then tbl = mw.html.create end tbl:tag('div'):addClass('clear') return tbl end

function p.innerColspanTable(tbl, colspan) local th = p.innerColspanCellOnly(tbl, colspan) local tblNew = th:tag('table'):addClass('nested-table wikitable') return tblNew end

function p.innerColspanCellOnly(tbl, colspan) local th = tbl:tag('tr'):tag('th') :attr('colspan', colspan) :addClass('nested-table-outer') return th end

function p.makeFlatlist(tbl) local div = mw.html.create('div') :addClass('hlist') local ul = div:tag('ul') for _, v in ipairs(tbl) do		ul:tag('li'):wikitext(v) end return div end

function p.lastChild(tbl) return tbl.nodes[#tbl.nodes] end

function p.mapChildren(tbl, f, ...) for _, node in ipairs(tbl.nodes) do		f(node, ...) end end

return p