- Welcome to the Kancolle Wiki!
- If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord
Difference between revisions of "Module:BaseTable"
Jump to navigation
Jump to search
com>Ckwng m (maybe returning something would be useful...) |
com>Ckwng |
||
Line 56: | Line 56: | ||
end | end | ||
return true | return true | ||
+ | end | ||
+ | |||
+ | function BaseTable:create_header() | ||
+ | self._header = self._header_template | ||
+ | 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, "header") | ||
+ | else | ||
+ | local item = self._item_class(item_key) | ||
+ | table.insert(self._items, item) | ||
+ | local note = self._args[item_key .. self._notes_suffix] | ||
+ | if note then | ||
+ | note = {note = note} | ||
+ | local note_highlight = self._args[item_key .. self._notes_suffix .. self._highlight_suffix] | ||
+ | if note_highlight then | ||
+ | note.highlight = note_highlight | ||
+ | end | ||
+ | self._notes[item] = note | ||
+ | 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 | ||
+ | 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) | ||
+ | else | ||
+ | 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 | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function BaseTable:finish_rows() | ||
+ | table.insert(self._rows, self._row_starter) | ||
+ | table.insert(self._rows, 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:build_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 | ||
+ | end | ||
+ | break | ||
+ | elseif not previous_row_type then | ||
+ | row_values[column].rowspan = 1 | ||
+ | break | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | else | ||
+ | for _, column in ipairs(self._columns) do | ||
+ | row_values[column].rowspan = 1 | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | table.insert(self._data_rows, row_values) | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function BaseTable:create_table() | ||
+ | self._items = {} | ||
+ | self._notes = {} | ||
+ | self._data_rows = {} | ||
+ | self:create_table_prep() | ||
+ | |||
+ | self:create_items() | ||
+ | self:create_header() | ||
+ | |||
+ | self:start_rows() | ||
+ | self:build_rows() | ||
+ | self:finish_rows() | ||
+ | return self:join_rows() | ||
end | end | ||
return BaseTable | return BaseTable |
Revision as of 10:41, 25 March 2015
Documentation for this module may be created at Module:BaseTable/doc
local BaseData = require('Module:BaseData')
local BaseTable = BaseData{
_table_start = [[{| class="wikitable"]],
_row_starter = "|-",
_header_template = "",
_column_header_cell_template = "! ${value}",
_cell_color = {
},
_cell = [[| colspan="1" rowspan="${rowspan}" style="text-align: ${text_align}; background-color: ${bg_color}; padding:5px 5px 5px 5px;" |${values.value}]],
_column_cell_templates = {
},
_good_stat_color = "#ffff40",
_outstanding_stat_color = "#73ff4d",
_transparent = "transparent",
_start_align = "start",
_center_align = "center",
_notes_suffix = "_notes",
_highlight_suffix = "_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_bg_color(default, value, operator, outstanding, good)
if not value then
return default or self._transparent
end
local comparison = self._operators[operator or ">"]
if outstanding and comparison(value, tonumber(outstanding)) then
return self._outstanding_stat_color
elseif good and comparison(value, tonumber(good)) 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
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, "header")
else
local item = self._item_class(item_key)
table.insert(self._items, item)
local note = self._args[item_key .. self._notes_suffix]
if note then
note = {note = note}
local note_highlight = self._args[item_key .. self._notes_suffix .. self._highlight_suffix]
if note_highlight then
note.highlight = note_highlight
end
self._notes[item] = note
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
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)
else
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
end
end
end
end
function BaseTable:finish_rows()
table.insert(self._rows, self._row_starter)
table.insert(self._rows, 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:build_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
end
break
elseif not previous_row_type then
row_values[column].rowspan = 1
break
end
end
end
else
for _, column in ipairs(self._columns) do
row_values[column].rowspan = 1
end
end
end
table.insert(self._data_rows, row_values)
end
end
function BaseTable:create_table()
self._items = {}
self._notes = {}
self._data_rows = {}
self:create_table_prep()
self:create_items()
self:create_header()
self:start_rows()
self:build_rows()
self:finish_rows()
return self:join_rows()
end
return BaseTable