Module:SummonIconTable
From Liquipedia Wildcard Wiki
Overview[edit]
This module creates a responsive grid display of summons icons with automatic categorization into their houses.
It pulls data from Liquipedia's database and applies theme-appropriate styling.
By default this module show all heroes available.
You can either use invoke or simple template.
For invoke use:
{{#invoke:Lua|invoke|module=SummonIconTable|fn=display}}(All Heroes){{#invoke:Lua|invoke|module=SummonIconTable|house=Malus|fn=display}}{{#invoke:Lua|invoke|module=SummonIconTable|house=Lubabub|fn=display}}{{#invoke:Lua|invoke|module=SummonIconTable|house=Chronos|fn=display}}
Parameters[edit]
|house=(optional)- Malus: Shows only summons within Malus house (cinnabar-theme-dark-bg)
- Lubabub: Shows only summons within Lubabub house (forest-theme-dark-bg)
- Chronos: Shows only summons within Chronos house (gold-bg-alt)
Usage Examples[edit]
- All Summons
{{SummonIconTable}}
All Summons (268)
- Only Summons in Malus House
{{SummonIconTable|house=Malus}}
Copy/Paste[edit]
- All Summons
{{SummonIconTable}}
- Categorized Champions
{{SummonIconTable|house=Malus}}
{{SummonIconTable|house=Chronos}}
{{SummonIconTable|house=Lubabub}}
For more information on how to contribute, please refer to our Help:Edit an Article.
local Class = require('Module:Class')
local CharacterIcon = require('Module:CharacterIcon')
local Lua = require('Module:Lua')
local HtmlWidgets = Lua.import('Module:Widget/Html/All')
local Div = HtmlWidgets.Div
local SummonIconTable = {}
-- Constants for house themes and icons
local DEFAULT_CATEGORY = {theme = 'gray-theme-dark-bg', text = 'All Summons'}
local SUMMON_HOUSE = {
['malus'] = {
theme = 'wildcard-malus-theme',
text = 'Malus',
icon = 'File:Wildcard_gameasset_Malus_Faction_Icon_White.png'
},
['chronos'] = {
theme = 'wildcard-chronos-theme',
text = 'Chronos',
icon = 'File:Wildcard_gameasset_Chronos_Faction_Icon_White.png'
},
['lubabub'] = {
theme = 'wildcard-lubabub-theme',
text = 'Lubabub',
icon = 'File:Wildcard_gameasset_Lubabub_Faction_Icon_White.png'
}
}
---Main function to display a table of summon icons based on provided arguments
---@param args table|nil
---@return Html
function SummonIconTable.display(args)
args = args or {}
-- Build conditions for the database query based on the provided arguments
local conditions = SummonIconTable._buildConditions(args)
-- Fetch summons from the database using the built conditions
local summons = mw.ext.LiquipediaDB.lpdb('datapoint', {
conditions = conditions,
order = 'name asc',
limit = 5000
})
-- Normalize results to ensure it's always a table of summons, even for single or invalid results
if type(summons) == 'table' and summons.name then
summons = {summons}
elseif type(summons) ~= 'table' then
summons = {}
end
local count = #summons
-- Get category data (house or default) based on the arguments
local categoryData = SummonIconTable._getCategoryData(args)
-- Create and return the HTML structure with a header and body containing summon icons
return Div{
classes = {'white-text'},
css = {['text-align'] = 'center', ['font-weight'] = 'bold'},
children = {
SummonIconTable._createHeader(categoryData, count),
SummonIconTable._createBody(summons)
}
}
end
---Retrieve category data for the specified house, or use default if no house is provided
---@param args table
---@return table
function SummonIconTable._getCategoryData(args)
local house = args.house and string.lower(args.house) or nil
return SUMMON_HOUSE[house] or DEFAULT_CATEGORY
end
---Create the header section of the table, including house icon and text with summon count
---@param categoryData table
---@param count integer
---@return Html
function SummonIconTable._createHeader(categoryData, count)
local headerText = categoryData.text
local headerChildren = {}
-- Add the house icon to the header if available
if categoryData.icon then
table.insert(headerChildren,
'[[' .. categoryData.icon .. '|30x30px|link=]] '
)
end
-- Append the formatted text with the total count of summons
table.insert(headerChildren, string.format('%s (%d)', headerText, count))
return Div{
classes = {categoryData.theme},
css = {padding = '5px 10px', ['font-size'] = '18px', ['border-radius'] = '0.5rem'},
children = headerChildren
}
end
---Create the body section of the table containing the summon icons
---@param summons table[]
---@return Html
function SummonIconTable._createBody(summons)
return Div{
css = {
gap = '8px',
padding = '8px',
display = 'flex',
['justify-content'] = 'center',
['align-items'] = 'center',
['flex-wrap'] = 'wrap'
},
children = SummonIconTable._generateSummonIcons(summons)
}
end
---Generate a table of individual summon icon elements for display
---@param summons table[]
---@return table
function SummonIconTable._generateSummonIcons(summons)
local icons = {}
for _, entry in ipairs(summons) do
if entry.name then
-- Create a container Div for each summon icon with styling and zoom capability
table.insert(icons, Div{
classes = {'zoom-container'},
css = {
display = 'inline-block',
padding = '2px',
overflow = 'hidden',
['vertical-align'] = 'middle',
},
children = {
CharacterIcon.Icon{
character = entry.name,
size = 'x125px'
}
}
})
end
end
return icons
end
---Build the conditions string for the database query based on arguments
---@param args table
---@return string
function SummonIconTable._buildConditions(args)
-- Initialize base conditions to filter for summons with names
local conditions = {
'[[type::Summon]]',
'[[name::!]]'
}
-- Add house-specific condition if a house is provided in the arguments
if args.house then
table.insert(conditions, '[[extradata_house::' .. args.house .. ']]')
end
-- Concatenate conditions with ' AND ' to form the final query string
return table.concat(conditions, ' AND ')
end
return Class.export(SummonIconTable)