FANDOM


local BaseData = require('Modulo:BaseData')
 
local format = require('Modulo:StringOperations').format
 
local BaseTable = BaseData{
	_table_start = [[{| class="wikitable typography-xl-optout"]],
	_row_starter = "|-",
	_header_template = "",
	_column_header_cell_template = "! ${value}",
	_cell_color = {
	},
	_cell = [[| colspan="${colspan}" rowspan="${rowspan}" style="text-align: ${text_align}; background-color: ${bg_color}; padding:3px;" |${values.value}]],
	_empty_cell = [[|]],
	_column_cell_templates = {
	},
	_column_empty_cells = {
	},
	_custom_row_prefix = "custom_row_",
	_text_align_suffix = "_text_align",
	_bg_color_suffix = "_bg_color",
	_content_suffix = "_content",
	_bom_stat_color = "#ffff40",
	_excepcional_stat_color = "#73ff4d",
	_enfase_template = "'''${value}'''",
	_transparent = "transparent",
	_start_align = "start",
	_center_align = "center",
	_notas_suffix = "_notes",
	_highlight_sufixo = "_highlight",
	_table_end = [[|}]],
	_operators = {
		["<"] = function(x,y) return x < y end,
		[">"] = function(x,y) return x > y end,
	},
}
 
function BaseTable:Table(args)
	return self{
		_args = args,
	}:create_table()
end
 
function BaseTable:get_emphasis(value, formatted, operator, bom)
	local comparison = self._operators[operator or ">"]
	if value and bom and comparison(value, tonumber(bom)) then
		return format{self._emphasis_template, value = formatted}
	end
	return formatted
end
 
function BaseTable:get_bg_color(default, value, operator, excepcional, bom)
	if not value then
		return default or self._transparent
	end
	local comparison = self._operators[operator or ">"]
	if excepcional and comparison(value, tonumber(excepcional)) then
		return self._outstanding_stat_color
	elseif bom and comparison(value, tonumber(bom)) then
		return self._good_stat_color
	else
		return default or self._transparent
	end
end
 
function BaseTable.compare_values(val1, val2)
	if #val1 == #val2 then
		for value_type, value in pairs(val1) do
			if value ~= val2[value_type] then
				return false
			end
		end
	else
		return false
	end
	return true
end
 
function BaseTable:create_header()
	self._header = self._header_template
	self._header_bottom = self._header_template_bottom or self._header_template
end
 
function BaseTable:process_item_key(item_key)
	return item_key
end
 
function BaseTable:create_items()
	for index, item_key in ipairs(self._args) do
		if item_key == "-" then
			table.insert(self._items, "break")
		elseif item_key == "~" then
			table.insert(self._items, "empty")
		elseif item_key == "#" then
			table.insert(self._items, "header")
		elseif mw.ustring.sub(item_key, 1, 1) == "!" then
			table.insert(self._items, mw.ustring.sub(item_key, 2))
		else
			local item = self._item_class(self:process_item_key(item_key))
			table.insert(self._items, item)
			local nota = self._args[item_key .. self._notas_suffix]
			if nota then
				nota = {nota = nota}
				local nota_highlight = self._args[item_key .. self._notas_suffix .. self._highlight_suffix]
				if nota_highlight then
					nota.highlight = nota_highlight
				end
				self._notas[item] = nota
			end
		end
	end
end
 
function BaseTable:create_data_rows()
	for _, item in ipairs(self._items) do
		local row_values
		if type(item) == "string" then
			row_values = item
		else
			row_values = {}
			for _, column in ipairs(self._columns) do
				row_values[column] = self[column](self, item)
				row_values[column].rowspan = 1
				row_values[column].colspan = 1
			end
		end
		table.insert(self._data_rows, row_values)
	end
end
 
function BaseTable:create_data_rows_merge_vertical()
	for index, item in ipairs(self._items) do
		local row_values
		if type(item) == "string" then
			row_values = item
		else
			row_values = {}
			for _, column in ipairs(self._columns) do
				row_values[column] = self[column](self, item)
			end
			if index > 1 then
				for _, column in ipairs(self._columns) do
					for i=index-1,1,-1 do
						local previous_row = self._data_rows[i]
						local previous_row_type = type(previous_row) ~= "string"
						local previous_cell = previous_row_type and previous_row[column] or false
						if previous_cell then
							if self.compare_values(row_values[column].values, previous_cell.values) then
								previous_cell.rowspan = previous_cell.rowspan + 1
								row_values[column] = nil
							else
								row_values[column].rowspan = 1
								row_values[column].colspan = 1
							end
							break
						elseif not previous_row_type then
							row_values[column].rowspan = 1
							row_values[column].colspan = 1
							break
						end
					end
				end
			else
				for _, column in ipairs(self._columns) do
					row_values[column].rowspan = 1
					row_values[column].colspan = 1
				end
			end
		end
		table.insert(self._data_rows, row_values)
	end
end
 
function BaseTable:start_rows()
	self._rows = {self._table_start, self._header}
end
 
function BaseTable:build_rows()
	for index, row_values in ipairs(self._data_rows) do
		if row_values ~= "break" then
			table.insert(self._rows, self._row_starter)
			if row_values == "header" then
				table.insert(self._rows, self._header)
			elseif row_values == "empty" then
				for _, column in ipairs(self._columns) do
					table.insert(self._rows, self._column_empty_cells[column] or self._empty_cell)
				end
			elseif type(row_values) == "table" then
				for _, column in ipairs(self._columns) do
					if row_values[column] then
						table.insert(self._rows, format(self._column_cell_templates[column] or self._cell, row_values[column]))
					end
				end
			else
				table.insert(self._rows, 
					format{self._cell, 
						colspan = #self._columns, rowspan = 1, 
						text_align = self._args[self._custom_row_prefix .. row_values .. self._text_align_suffix] or self._start_align, 
						bg_color = self._args[self._custom_row_prefix .. row_values .. self._bg_color_suffix] or self._transparent,
						values = {
							value = self._args[self._custom_row_prefix .. row_values .. self._content_suffix] or "",
						},
					}
				)
			end
		end
	end
end
 
--deprecated
function BaseTable:build_rows_breaks_as_empty_rows()
	for index, row_values in ipairs(self._data_rows) do
		table.insert(self._rows, self._row_starter)
		if row_values == "break" then
			for _, column in ipairs(self._columns) do
				table.insert(self._rows, self._column_empty_cells[column] or self._empty_cell)
			end
		elseif row_values == "header" then
			table.insert(self._rows, self._header)
		elseif type(row_values) == "table" then
			for _, column in ipairs(self._columns) do
				if row_values[column] then
					table.insert(self._rows, format(self._column_cell_templates[column] or self._cell, row_values[column]))
				end
			end
		else
			table.insert(self._rows, 
				format{self._cell, 
					colspan = #self._columns, rowspan = 1, 
					text_align = self._args[self._custom_row_prefix .. row_values .. self._text_align_suffix] or self._start_align, 
					bg_color = self._args[self._custom_row_prefix .. row_values .. self._bg_color_suffix] or self._transparent,
					values = {
						value = self._args[self._custom_row_prefix .. row_values .. self._content_suffix] or "",
					},
				}
			)
		end
	end
end
 
function BaseTable:finish_rows()
	table.insert(self._rows, self._row_starter)
	table.insert(self._rows, self._header_bottom or self._header)
	table.insert(self._rows, self._table_end)
end
 
function BaseTable:join_rows()
	return table.concat(self._rows, "\n")
end
 
function BaseTable:create_table_prep()
	return
end
 
function BaseTable:create_items_post()
	return
end
 
function BaseTable:create_table()
	self._items = {}
	self._notes = {}
	self._data_rows = {}
	self:create_table_prep()
 
	self:create_items()
	self:create_items_post()
	self:create_data_rows()
	self:create_header()
 
	self:start_rows()
	self:build_rows()
	self:finish_rows()
	return self:join_rows()
end
 
return BaseTable

Interferência de bloqueador de anúncios detectada!


A Wikia é um site grátis que ganha dinheiro com publicidade. Nós temos uma experiência modificada para leitores usando bloqueadores de anúncios

A Wikia não é acessível se você fez outras modificações. Remova o bloqueador de anúncios personalizado para que a página carregue como esperado.