Module:DropList

Revision as of 09:58, 17 October 2015 by がか (talk | contribs)

Documentation for this module may be created at Module:DropList/doc

local format = require("Module:StringInterpolation").format
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 = {
	node           = '^%s*(%a)%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
	local boss = args.boss and string.upper(args.boss) or nil
	for node in string.gmatch(args.nodes, args_grammar.comma_list) do
		local node = node:match(args_grammar.node)
		if node then
			local node = string.upper(node)
			table.insert(tbl.nodes, { name = node, boss = node == boss })
		end
	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.ship = ship
				row.rare = false
				for _, rare_ship in pairs(rare_ships) do
					if ship == rare_ship then
						row.rare = true
						break
					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
					    local node = string.upper(node)
						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="article-table sortable" align="center" width="100%" style="text-align:center"\n!Type\n!Ship\n',
	header_node      = '!width="10%%"|${node}\n',
	header_boss_node = '!width="10%%" style="background-color:pink;color:red;"|\'\'\'${node}\'\'\'\n',
	row              = '|-\n',
	type_cell        = '|${type}\n',
	ship_cell        = '![[${ship}]]\n',
	rare_ship_cell   = '![[${ship}|<span style="color:red;">${ship}</span>]]\n',
	node_cell        = '|style="background-color:#${color};"|${diff}\n',
	empty_cell       = '|\n',
	footer           = '|}\n'
}

function showTable(tbl)

	local res = table_format.header

	-- header
	for _, node in pairs(tbl.nodes) do
		res = res .. format{
			node.boss and table_format.header_boss_node or table_format.header_node,
			node = node.name
		}
	end

	-- rows
	for key, row in pairs(tbl.rows) do
		res = res .. table_format.row
		res = res .. format{table_format.type_cell, type = row.type}
		res = res .. format{
			row.rare and table_format.rare_ship_cell or table_format.ship_cell,
			ship = row.ship
		}
		for _, node in pairs(tbl.nodes) do
			local node = row.nodes[node.name]
			res = res .. (node and format{table_format.node_cell, color = node.color, diff = node.diff} or table_format.empty_cell)
		end
	end

	res = res .. table_format.footer

	return res

end

function DropList.show(frame)
	local args = getArgs{frame = frame:getParent()}
	return showTable(parseArgs(args))
end

return DropList