Module:Fabricant de tables

Une page de Wikipédia, l'encyclopédie libre.

 Documentation[créer] [purger]
local simpleTable = {}

function simpleTable:new()
	local obj = {}
	obj.rows = {}
	setmetatable(obj, simpleTable)
	self.__index = self
	return obj
end

function simpleTable:sortColumn(num)
	self.sortColumn = num
end

function simpleTable:addRow(rowvals, rowkey)
	table.insert(self.rows, {rowvals, rowkey}) -- insérée sans tri, peut-être devrait-on la mettre directement à sa place ?
end

function simpleTable:addHeaders(vals)
	self.headers = vals
end

function simpleTable:addClass(class)
	self.class = class
end

function simpleTable:addTitle(title)
	self.title = title
end

function simpleTable:addSource(src)
	self.source = src
end

local function sortRows(rows, sortcolumn) -- effectue le classement défini par :sortColumn ou addRow, à nettoyer et améliorer
	table.sort(
		rows,
		function(a, b)
			if sortcolumn then -- classement par colonne
				local v1, v2 =  a[1][sortcolumn], b[1][sortcolumn]
				if v1 and v2 then
					return v1 < v2
				end
			end
			if (a[2] and b[2]) then -- classement par une valeur autre stockée en valeur 2 dans chaque objet colonne ({val, sortkey})
					return a[2] < b[2]
			end
		end
	)
end

function simpleTable:show()
	local frame = mw.getCurrentFrame()
	local tab =  mw.html.create('table'):addClass(self.class or 'wikitable sortable')
	if self.headers then
		local h = mw.html.create('tr')
		for i, j in pairs(self.headers) do
			h:tag('th'):wikitext(j):done()
		end
		tab:node(h):done()
	end
	sortRows(self.rows, self.sortColumn)
	for i, rowvals in pairs(self.rows) do
		local newrow = mw.html.create('tr')
		for j, val in pairs(rowvals[1]) do
			newrow:tag('td'):wikitext(val):done()
		end
		tab:node(newrow):done()
	end
	tab:done()
	return '<table><tr><th>' .. (self.title or '') .. '</th></tr><tr><td>' .. tostring(tab) .. '<small>' .. (self.source or '') .. '</small></td></tr></table>'
end
return simpleTable