- 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:NodeInfo"
Jump to navigation
Jump to search
m |
m |
||
Line 13: | Line 13: | ||
_column_cell_templates = { | _column_cell_templates = { | ||
node = [[| colspan="${colspan}" rowspan="${rowspan}" style="text-align: center; color: ${color};" |${values.node}<br /><span style="color: ${time_color};">${values.time}</span>]], | node = [[| colspan="${colspan}" rowspan="${rowspan}" style="text-align: center; color: ${color};" |${values.node}<br /><span style="color: ${time_color};">${values.time}</span>]], | ||
− | formation = [[ | + | formation = [[| ${values.formation}]], |
− | fleet = [[ | + | fleet = [[| ${values.fleet}]], |
− | as = [[| style="text-align: center; | + | as = [[| style="text-align: center;" |${values.as}]], |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
}, | }, | ||
+ | _empty_node_template = [[| style="text-align: center;" |${values.node} | ||
+ | | colspan="3" |Must be my imagination (battle avoided)]], | ||
+ | _resource_node_template = [[| style="text-align: center;" |${values.node} | ||
+ | | colspan="3" |${values.resource}${values.amount}]], | ||
_columns = { | _columns = { | ||
"node", | "node", | ||
Line 46: | Line 44: | ||
function NodeInfo:formation(row) | function NodeInfo:formation(row) | ||
− | return { values = { formation = row.formation } | + | return { values = { formation = row.formation } } |
end | end | ||
function NodeInfo:fleet(row) | function NodeInfo:fleet(row) | ||
− | return { values = { fleet = row.fleet } | + | return { values = { fleet = row.fleet } } |
end | end | ||
function NodeInfo:as(row) | function NodeInfo:as(row) | ||
− | return { values = { as = row.as } | + | return { values = { as = row.as } } |
end | end | ||
Line 85: | Line 83: | ||
local node, time, boss, formation_image, fleet, as_rating = nil, nil, false, nil, "", 0 | local node, time, boss, formation_image, fleet, as_rating = nil, nil, false, nil, "", 0 | ||
for index, item_key in ipairs(self._args) do | for index, item_key in ipairs(self._args) do | ||
− | if item_key == "-" then | + | if item_key == "-" or mw.ustring.find(item_key, "#") then |
self:insert_item(node, time, boss, formation_image, fleet, as_rating, item_key) | self:insert_item(node, time, boss, formation_image, fleet, as_rating, item_key) | ||
table.insert(self._items, "break") | table.insert(self._items, "break") | ||
Line 91: | Line 89: | ||
node, time, boss, formation_image, fleet, as_rating = nil, nil, false, nil, "", 0 | node, time, boss, formation_image, fleet, as_rating = nil, nil, false, nil, "", 0 | ||
mode = 1 | mode = 1 | ||
+ | |||
+ | if mw.ustring.find(item_key, "#") then | ||
+ | item_key = mw.ustring.sub(item_key, 2) | ||
+ | |||
+ | --If it has no /, then it's an empty node; otherwise, it has a resource and number | ||
+ | if not mw.ustring.find(item_key, '/') then | ||
+ | table.insert(self._items, item_key .. "/empty") | ||
+ | else | ||
+ | table.insert(self._items, item_key) | ||
+ | end | ||
+ | table.insert(self._items, "break") | ||
+ | end | ||
else | else | ||
--Each item will be just a string, so we need to check for one of the _columns, which will be done by mode | --Each item will be just a string, so we need to check for one of the _columns, which will be done by mode | ||
Line 166: | Line 176: | ||
end | end | ||
table.insert(self._data_rows, row_values) | table.insert(self._data_rows, row_values) | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function NodeInfo:build_rows() | ||
+ | for index, row_values in ipairs(self._data_rows) do | ||
+ | if row_values ~= "break" and not mw.ustring.find(row_values, '/') then | ||
+ | table.insert(self._rows, self._row_starter) | ||
+ | if 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 | ||
+ | else | ||
+ | table.insert(self._rows, self._row_starter) | ||
+ | |||
+ | local split = mw.ustring.find(row_values, '/') | ||
+ | local node = mw.ustring.sub(row_values, 1, split - 1) | ||
+ | local resource = mw.ustring.sub(row_values, split + 1) | ||
+ | if resource == "empty" then | ||
+ | table.insert(self._rows, format{self._empty_node_template, { values = { node = amount } } }) | ||
+ | else | ||
+ | split = mw.ustring.find(resource, '/') | ||
+ | local amount = mw.ustring.sub(resource, split + 1) | ||
+ | resource = Formatting:format_image{mw.ustring.sub(resource, 1, split - 1) .. ".png", caption = mw.ustring.sub(resource, 1, split - 1)} | ||
+ | table.insert(self._rows, format{self._resource_node_template, { values = { node = node, amount = amount, resource = resource } } }) | ||
+ | end | ||
+ | end | ||
end | end | ||
end | end | ||
return NodeInfo | return NodeInfo |
Revision as of 19:57, 15 April 2015
Documentation for this module may be created at Module:NodeInfo/doc
local BaseTable = require("Module:BaseTable")
local Formatting = require('Module:Formatting')
local EnemyShip = require("Module:EnemyShip")
local format = require('Module:StringInterpolation').format
local NodeInfo = BaseTable({
_item_class = EnemyShip,
_header_template = [[!Node
!Formation
!Fleet
!AS]],
_column_cell_templates = {
node = [[| colspan="${colspan}" rowspan="${rowspan}" style="text-align: center; color: ${color};" |${values.node}<br /><span style="color: ${time_color};">${values.time}</span>]],
formation = [[| ${values.formation}]],
fleet = [[| ${values.fleet}]],
as = [[| style="text-align: center;" |${values.as}]],
},
_empty_node_template = [[| style="text-align: center;" |${values.node}
| colspan="3" |Must be my imagination (battle avoided)]],
_resource_node_template = [[| style="text-align: center;" |${values.node}
| colspan="3" |${values.resource}${values.amount}]],
_columns = {
"node",
"formation",
"fleet",
"as",
},
_day_battle_color = "gold",
_night_battle_color = "blue",
_boss_battle_color = "red",
})
function NodeInfo:node(row)
local color, time_color = "initial", self._day_battle_color
if row.boss then
color = self._boss_battle_color
end
if row.time == "(Night Battle)" then
time_color = self._night_battle_color
end
return { values = { node = row.node, time = row.time }, color = color, time_color = time_color }
end
function NodeInfo:formation(row)
return { values = { formation = row.formation } }
end
function NodeInfo:fleet(row)
return { values = { fleet = row.fleet } }
end
function NodeInfo:as(row)
return { values = { as = row.as } }
end
function NodeInfo:process_node(item)
local split = mw.ustring.find(item, '/')
local node, time
if split then
node = mw.ustring.sub(item, 1, split - 1)
time = "(" .. mw.ustring.sub(item, split + 1):gsub("^%l", string.upper) .. " Battle)"
else
node = item:upper()
time = ""
end
return node, time
end
function NodeInfo:insert_item(node, time, boss, formation, fleet, as, item_key)
table.insert(self._items, {
node = node,
time = time,
boss = boss,
formation = Formatting:format_image{formation, caption = item_key, align = "center", valign = "center"},
fleet = fleet,
as = as,
})
end
function NodeInfo:create_items()
local mode = 1
local node, time, boss, formation_image, fleet, as_rating = nil, nil, false, nil, "", 0
for index, item_key in ipairs(self._args) do
if item_key == "-" or mw.ustring.find(item_key, "#") then
self:insert_item(node, time, boss, formation_image, fleet, as_rating, item_key)
table.insert(self._items, "break")
node, time, boss, formation_image, fleet, as_rating = nil, nil, false, nil, "", 0
mode = 1
if mw.ustring.find(item_key, "#") then
item_key = mw.ustring.sub(item_key, 2)
--If it has no /, then it's an empty node; otherwise, it has a resource and number
if not mw.ustring.find(item_key, '/') then
table.insert(self._items, item_key .. "/empty")
else
table.insert(self._items, item_key)
end
table.insert(self._items, "break")
end
else
--Each item will be just a string, so we need to check for one of the _columns, which will be done by mode
if mode == 1 then
--First item should always be the node
--Node format: !node/day|night where the second part is day -or- night; ! indicates a boss node
if mw.ustring.sub(item_key, 1, 1) == "!" then
boss = true
item_key = mw.ustring.sub(item_key, 2)
end
node, time = self:process_node(item_key)
if boss then
node = node .. "<br />(Boss Node)"
end
mode = 2
elseif mode == 2 then
formation_image = item_key:gsub("%s", "") .. ".jpg"
mode = 3
else
--Fleets are of variable size, so we append onto a string until we hit the next node declaration
local split = mw.ustring.find(item_key, '/')
local ship_name = mw.ustring.sub(item_key, 1, split - 1)
local ship_suffix = mw.ustring.sub(item_key, split + 1)
local ship = EnemyShip(ship_name, ship_suffix)
if fleet ~= "" then
fleet = fleet .. " " -- Actually matters
end
fleet = fleet .. Formatting:format_image{ship:battle_card(), ship:name()}
if ship:as_rating() then
as_rating = as_rating + ship:as_rating()
end
end
end
end
self:insert_item(node, time, boss, formation_image, fleet, as_rating, item_key)
end
function NodeInfo:create_data_rows()
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
if column == "node" then
local previous_cell = self._data_rows[i][column]
if previous_cell then
if row_values[column].values.node == previous_cell.values.node and row_values[column].values.time == previous_cell.values.time 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
end
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 NodeInfo:build_rows()
for index, row_values in ipairs(self._data_rows) do
if row_values ~= "break" and not mw.ustring.find(row_values, '/') then
table.insert(self._rows, self._row_starter)
if 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
else
table.insert(self._rows, self._row_starter)
local split = mw.ustring.find(row_values, '/')
local node = mw.ustring.sub(row_values, 1, split - 1)
local resource = mw.ustring.sub(row_values, split + 1)
if resource == "empty" then
table.insert(self._rows, format{self._empty_node_template, { values = { node = amount } } })
else
split = mw.ustring.find(resource, '/')
local amount = mw.ustring.sub(resource, split + 1)
resource = Formatting:format_image{mw.ustring.sub(resource, 1, split - 1) .. ".png", caption = mw.ustring.sub(resource, 1, split - 1)}
table.insert(self._rows, format{self._resource_node_template, { values = { node = node, amount = amount, resource = resource } } })
end
end
end
end
return NodeInfo