- 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:DropList"
Jump to navigation
Jump to search
(format ship types and ignore bogus ship names) |
(add rare ships) |
||
Line 6: | Line 6: | ||
local DropList = {} | local DropList = {} | ||
+ | |||
+ | -- http://kancolle.wikia.com/wiki/Thread:295964 | ||
+ | local rare_ships = { | ||
+ | |||
+ | "Akitsushima", "Akizuki", "Amagi", "Isokaze", "Katsuragi", "Littorio", "Prinz Eugen", "Roma", "Tokitsukaze", | ||
+ | |||
+ | "Akitsu Maru", "Bismarck", "Musashi", "Noshiro", "Yamato", "Taihou", | ||
+ | |||
+ | "Agano", "Akashi", "Amatsukaze", "Asagumo", "Asashimo", "Harusame", "Hatsukaze", "Hayashimo", "I-401", "Katori", "Kiyoshimo", "Maruyu", | ||
+ | "Mikuma", "Nowaki", "Ooyodo", "Sakawa", "Taigei", "Takanami", "U-511", "Unryuu", "Uzuki", "Yahagi", | ||
+ | |||
+ | "Z1", "Z3", "Tanikaze", "Maikaze", | ||
+ | |||
+ | "Libeccio", "Mizuho", "Kazagumo", "Umikaze", "Kawakaze", "Hayasui", "Teruzuki", | ||
+ | |||
+ | } | ||
local args_grammar = { | local args_grammar = { | ||
Line 45: | Line 61: | ||
local ship_table = Ship:get_table(ship, "") | local ship_table = Ship:get_table(ship, "") | ||
if ship_table and ship_table._type then | if ship_table and ship_table._type then | ||
− | + | table.insert(tbl.rows, {}) | |
− | + | local row = tbl.rows[#tbl.rows] | |
− | + | -- row.id = arg_name | |
− | + | row.ship = ship | |
− | + | row.rare = false | |
− | + | for _, rare_ship in pairs(rare_ships) do | |
− | + | if ship == rare_ship then | |
− | + | row.rare = true | |
− | + | end | |
− | + | end | |
− | + | row.type = Formatting:format_ship_code(ship_table._type) or '?' | |
− | + | row.nodes = {} | |
− | + | for _, node in pairs(tbl.nodes) do | |
− | + | row.nodes[node.name] = nil | |
− | + | end | |
− | + | for node_and_diff in string.gmatch(nodes, args_grammar.comma_list) do | |
− | + | local node, diff = node_and_diff:match(args_grammar.node_and_diff) | |
− | + | if not node or not diff then | |
− | + | node = node_and_diff:match(args_grammar.just_node) | |
− | + | diff = nil | |
+ | end | ||
+ | if node then | ||
+ | row.nodes[node] = { color = diff and diff_colors[diff] or diff_colors['?'], diff = diff and diff_names[diff] or '?' } | ||
+ | end | ||
+ | end | ||
+ | end | ||
end | end | ||
end | end | ||
Line 79: | Line 101: | ||
cell = '|%s\n', | cell = '|%s\n', | ||
ship_cell = '|[[%s]]\n', | ship_cell = '|[[%s]]\n', | ||
+ | rare_ship_cell = '|style="background-color:#pink;"|[[%s]]\n', | ||
node_cell = '|style="background-color:#%s;"|%s\n', | node_cell = '|style="background-color:#%s;"|%s\n', | ||
empty_cell = '|\n', | empty_cell = '|\n', | ||
Line 98: | Line 121: | ||
-- res = res .. string.format(table_format.cell, row.id) | -- res = res .. string.format(table_format.cell, row.id) | ||
res = res .. string.format(table_format.cell, row.type) | res = res .. string.format(table_format.cell, row.type) | ||
− | res = res .. string.format(table_format.ship_cell, row.ship) | + | res = res .. string.format(row.rare and table_format.rare_ship_cell or table_format.ship_cell, row.ship) |
for _, node in pairs(tbl.nodes) do | for _, node in pairs(tbl.nodes) do | ||
local node = row.nodes[node.name] | local node = row.nodes[node.name] | ||
Line 112: | Line 135: | ||
function DropList.show(frame) | function DropList.show(frame) | ||
− | local args = getArgs{frame = frame:getParent()} | + | local args = frame.args -- getArgs{frame = frame:getParent()} |
return showTable(parseArgs(args)) | return showTable(parseArgs(args)) | ||
end | end | ||
return DropList | return DropList |
Revision as of 06:25, 17 October 2015
Documentation for this module may be created at Module:DropList/doc
local getArgs = require('Module:GetArgs')
local Ship = require('Module:Ship')
local Formatting = require('Module:Formatting')
local DropList = {}
-- http://kancolle.wikia.com/wiki/Thread:295964
local rare_ships = {
"Akitsushima", "Akizuki", "Amagi", "Isokaze", "Katsuragi", "Littorio", "Prinz Eugen", "Roma", "Tokitsukaze",
"Akitsu Maru", "Bismarck", "Musashi", "Noshiro", "Yamato", "Taihou",
"Agano", "Akashi", "Amatsukaze", "Asagumo", "Asashimo", "Harusame", "Hatsukaze", "Hayashimo", "I-401", "Katori", "Kiyoshimo", "Maruyu",
"Mikuma", "Nowaki", "Ooyodo", "Sakawa", "Taigei", "Takanami", "U-511", "Unryuu", "Uzuki", "Yahagi",
"Z1", "Z3", "Tanikaze", "Maikaze",
"Libeccio", "Mizuho", "Kazagumo", "Umikaze", "Kawakaze", "Hayasui", "Teruzuki",
}
local args_grammar = {
to_trim = '^%s*(.-)%s*$',
comma_list = '[^,]+',
ship_and_nodes = '^%s*(.-)%s*:%s*(.-)%s*$',
just_node = '^%s*(%a)%s*$',
node_and_diff = '^%s*(%a)%s*/%s*(%S-)%s*$'
}
local diff_colors = {
['Easy'] = '5a5',
['Medium'] = 'da6',
['Hard'] = 'd33',
['?'] = '0ff'
}
local diff_names = {
['Easy'] = 'Easy+',
['Medium'] = 'Medium+',
['Hard'] = 'Hard+',
['?'] = '?'
}
function parseArgs(args)
local tbl = { nodes = {}, rows = {} }
-- header args
for node in string.gmatch(args.nodes, args_grammar.comma_list) do
local node = node:match(args_grammar.to_trim)
table.insert(tbl.nodes, { name = node, boss = node == args.boss })
end
-- ship args
for arg_name, arg in pairs(args) do
if tonumber(arg_name) then
local ship, nodes = arg:match(args_grammar.ship_and_nodes)
local ship_table = Ship:get_table(ship, "")
if ship_table and ship_table._type then
table.insert(tbl.rows, {})
local row = tbl.rows[#tbl.rows]
-- row.id = arg_name
row.ship = ship
row.rare = false
for _, rare_ship in pairs(rare_ships) do
if ship == rare_ship then
row.rare = true
end
end
row.type = Formatting:format_ship_code(ship_table._type) or '?'
row.nodes = {}
for _, node in pairs(tbl.nodes) do
row.nodes[node.name] = nil
end
for node_and_diff in string.gmatch(nodes, args_grammar.comma_list) do
local node, diff = node_and_diff:match(args_grammar.node_and_diff)
if not node or not diff then
node = node_and_diff:match(args_grammar.just_node)
diff = nil
end
if node then
row.nodes[node] = { color = diff and diff_colors[diff] or diff_colors['?'], diff = diff and diff_names[diff] or '?' }
end
end
end
end
end
return tbl
end
local table_format = {
header = '{| class="wikitable sortable" align="center" width="100%" style="text-align:center"\n!Type\n!Ship\n',
header_node = '!width="10%%"|%s\n',
header_boss_node = '!width="10%%" style="background-color:pink;color:red;"|\'\'\'%s\'\'\'\n',
row = '|-\n',
cell = '|%s\n',
ship_cell = '|[[%s]]\n',
rare_ship_cell = '|style="background-color:#pink;"|[[%s]]\n',
node_cell = '|style="background-color:#%s;"|%s\n',
empty_cell = '|\n',
footer = '|}\n'
}
function showTable(tbl)
local res = table_format.header
-- header
for _, node in pairs(tbl.nodes) do
res = res .. string.format(node.boss and table_format.header_boss_node or table_format.header_node, node.name)
end
-- rows
for key, row in pairs(tbl.rows) do
res = res .. table_format.row
-- res = res .. string.format(table_format.cell, row.id)
res = res .. string.format(table_format.cell, row.type)
res = res .. string.format(row.rare and table_format.rare_ship_cell or table_format.ship_cell, row.ship)
for _, node in pairs(tbl.nodes) do
local node = row.nodes[node.name]
res = res .. (node and string.format(table_format.node_cell, node.color, node.diff) or table_format.empty_cell)
end
end
res = res .. table_format.footer
return res
end
function DropList.show(frame)
local args = frame.args -- getArgs{frame = frame:getParent()}
return showTable(parseArgs(args))
end
return DropList