Module:HeroData/nav: Difference between revisionsGive feedback
Gammaton32 (talk | contribs) No edit summary |
Gammaton32 (talk | contribs) refactored hero list function for other functions to call for |
||
| Line 4: | Line 4: | ||
local lang_module = require('Module:Lang') | local lang_module = require('Module:Lang') | ||
-- | -- Shared helper function | ||
function | local function get_heroes(in_herolabs, include_key) | ||
local | local heroes = {} | ||
for hero_key, hero_data in pairs(heroes_data) do | for hero_key, hero_data in pairs(heroes_data) do | ||
-- hero_werewolf_transformed is consolidated in Silver's page | |||
if hero_data["Name"] ~= nil and hero_key ~= 'hero_werewolf_transformed' then | if hero_data["Name"] ~= nil and hero_key ~= 'hero_werewolf_transformed' then | ||
local this_hero_status = hero_release_module.get_hero_release_status(hero_key) | local this_hero_status = hero_release_module.get_hero_release_status(hero_key) | ||
if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or | if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or | ||
(in_herolabs == 'false' and this_hero_status == 'Released')) then | (in_herolabs == 'false' and this_hero_status == 'Released')) then | ||
local is_recommended = hero_data['IsRecommended'] | local is_recommended = hero_data['IsRecommended'] or false | ||
--- Create a sort key for each hero to ensure correct alphabetical ordering. | |||
-- Create a sort key for each hero to ensure correct alphabetical ordering. | |||
-- This logic handles special cases like "The Doorman" by looking for a "_sort" version of the hero's key in the language files. | -- This logic handles special cases like "The Doorman" by looking for a "_sort" version of the hero's key in the language files. | ||
local hero_name = lang_module.get_string(hero_key, nil, 'en') | local hero_name = lang_module.get_string(hero_key, nil, 'en') | ||
local sort_key_to_find = hero_key .. '_sort' | local sort_key_to_find = hero_key .. '_sort' | ||
local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en') | local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en') | ||
local sort_key | local sort_key | ||
-- The lang_module returns the requested key (wrapped in HTML) if a translation is not found. | -- The lang_module returns the requested key (wrapped in HTML) if a translation is not found. | ||
| Line 71: | Line 36: | ||
end | end | ||
local | -- Store reusable hero data | ||
local hero = { | |||
key = hero_key, | |||
name = hero_name, | |||
sort_key = sort_key, | |||
link = lang_module.get_string(hero_key, 'en'), | |||
table.insert(heroes, | recommended = tostring(is_recommended) | ||
} | |||
table.insert(heroes, hero) | |||
end | end | ||
end | end | ||
end | end | ||
-- Sort | -- Sort heroes | ||
table.sort(heroes, function(a, b) | table.sort(heroes, function(a, b) | ||
return a.sort_key < b.sort_key | return a.sort_key < b.sort_key | ||
end) | end) | ||
return heroes | |||
end | |||
-- for [[Template:Deadlock_Wiki/Heroes]] | |||
function p.get_hero_nav_cards(frame) | |||
local in_herolabs = frame.args['in_herolabs'] or 'false' | |||
local text_size = frame.args['text_size'] | |||
local card_size = frame.args['card_size'] | |||
local sticker_size = frame.args['sticker_size'] | |||
local herolabs_text_size = frame.args['herolabs_text_size'] | |||
local debug_mode = frame.args['debug_mode'] == 'true' | |||
local lang_code = lang_module.get_lang_code() | |||
local subpage_str = '' | |||
if lang_code ~= 'en' then | |||
subpage_str = '/' .. lang_code | |||
end | |||
local heroes = get_heroes(in_herolabs) | |||
local ret = '' | local ret = '' | ||
for | |||
ret = ret .. '{{Hero card2' .. | for _, hero in ipairs(heroes) do | ||
ret = ret .. '{{Hero card2' | |||
ret = ret .. '|name=' .. hero.name | |||
ret = ret .. '|link=' .. hero.link | |||
ret = ret .. '|subpage=' .. subpage_str | |||
ret = ret .. '|recommended=' .. hero.recommended | |||
ret = ret .. '|text_size=' .. text_size | ret = ret .. '|text_size=' .. text_size | ||
ret = ret .. '|herolabs=' .. in_herolabs | ret = ret .. '|herolabs=' .. in_herolabs | ||
| Line 96: | Line 90: | ||
ret = ret .. '|sticker_size=' .. sticker_size | ret = ret .. '|sticker_size=' .. sticker_size | ||
ret = ret .. '|herolabs_text_size=' .. herolabs_text_size | ret = ret .. '|herolabs_text_size=' .. herolabs_text_size | ||
ret = ret .. '}} ' | ret = ret .. '}}' | ||
end | |||
if debug_mode then | if debug_mode then | ||
return ret | return ret | ||
else | else | ||
return frame:preprocess(ret) | return frame:preprocess(ret) | ||
end | end | ||
| Line 111: | Line 102: | ||
-- for [[Template:Roster]] | -- for [[Template:Roster]] | ||
function p.get_hero_roster(frame) | function p.get_hero_roster(frame) | ||
local in_herolabs = frame.args['in_herolabs'] or 'false' | |||
local debug_mode = frame.args['debug_mode'] == 'true' | |||
local lang_code = lang_module.get_lang_code() | |||
local subpage_str = '' | local subpage_str = '' | ||
if lang_code ~= 'en' then | if lang_code ~= 'en' then | ||
subpage_str = '/' .. lang_code | subpage_str = '/' .. lang_code | ||
end | end | ||
local heroes = get_heroes(in_herolabs) | |||
local ret = '' | local ret = '' | ||
for | |||
ret = ret .. '{{HeroRosterCard' .. | for _, hero in ipairs(heroes) do | ||
ret = ret .. '{{HeroRosterCard' | |||
ret = ret .. '|name=' .. hero.name | |||
ret = ret .. '|key=' .. hero.key | |||
ret = ret .. '}}' | ret = ret .. '}}' | ||
end | |||
if debug_mode then | if debug_mode then | ||
return ret | return ret | ||
else | else | ||
return frame:preprocess(ret) | return frame:preprocess(ret) | ||
end | end | ||
| Line 204: | Line 134: | ||
p.get_hero_bulletpoints = function(frame) | p.get_hero_bulletpoints = function(frame) | ||
local subpage = frame.args['1'] | local subpage = frame.args['1'] | ||
local in_herolabs = frame.args['in_herolabs'] or 'false' | |||
local | local debug_mode = frame.args['debug_mode'] == 'true' | ||
local lang_code = lang_module.get_lang_code() | |||
local subpage_str = '' | local subpage_str = '' | ||
if lang_code ~= 'en' then | if lang_code ~= 'en' then | ||
subpage_str = '/' .. lang_code | subpage_str = '/' .. lang_code | ||
end | end | ||
local heroes = get_heroes(in_herolabs) | |||
local ret = '' | |||
for _, hero in ipairs(heroes) do | |||
for | |||
if subpage then | if subpage then | ||
ret = ret .. '{{PageRef|'.. | ret = ret .. '{{PageRef|'.. hero.name | ||
ret = ret .. '|alt_link='.. | ret = ret .. '|alt_link='.. hero.name | ||
ret = ret .. '/'.. subpage | ret = ret .. '/'.. subpage | ||
ret = ret ..'}} • ' | ret = ret ..'}} • ' | ||
else | else | ||
ret = ret .. '{{HeroIcon|'.. | ret = ret .. '{{HeroIcon|'.. hero.name | ||
ret = ret ..'}} • ' | ret = ret ..'}} • ' | ||
end | end | ||
Revision as of 22:15, 17 May 2026
Overview
Generates hero navigation cards
Functions
get_hero_nav_cards
For Template:Hero Navbox on Heroes, individual hero pages like Abrams, and the home page.
Examples
First with debug_mode on, to help visualize what the output's source looks like.
{{#invoke:HeroData/nav|get_hero_nav_cards
|text_size=13
|card_size=88
|in_herolabs=false
|debug_mode=true
}}
Lua error at line 90: attempt to concatenate local 'sticker_size' (a nil value).
Now with debug_mode defaulted to false (off) to see actual visual output.
{{#invoke:HeroData/nav|get_hero_nav_cards
|text_size=13
|card_size=88
|in_herolabs=false
}}
Lua error at line 90: attempt to concatenate local 'sticker_size' (a nil value).
Parameters
- text_size - Font size of the hero name
- card_size - Size of the hero card
- in_herolabs - Get hero labs heroes (there are none at the moment)
- debug_mode - (OPTIONAL) Defaults to false. With true, the output is raw wikitext source that isn't processed, allowing to see more clearly what is ran.
debug_mode is the only optional parameter. All other parameters are required. Template:Hero card2 utilizes this with some default values, see there for suggested values.
get_hero_roster
For Template:Roster on Heroes, generate a list using Template:HeroRosterCard.
get_hero_bulletpoints
For navboxes such as Template:Quotes Navbox, generate a bulletpoint list of heroes.
Add the name of a subpage to link to specific subpages. It will still display only the hero name but link to the subpage instead.
Add variable "no_redlinks=true" to hide red links (non-existent pages).
Examples
{{#invoke:HeroData/nav|get_hero_bulletpoints}}
Abrams • Apollo • Bebop • Billy • Calico • Celeste • The Doorman • Drifter • Dynamo • Graves • Grey Talon • Haze • Holliday • Infernus • Ivy • Kelvin • Lady Geist • Lash • McGinnis • Mina • Mirage • Mo & Krill • Paige • Paradox • Pocket • Rem • Seven • Shiv • Silver • Sinclair • Venator • Victor • Vindicta • Viscous • Vyper • Warden • Wraith • Yamato
To link to "/Movement" subpages:
{{#invoke:HeroData/nav|get_hero_bulletpoints|Movement}}
Abrams •
Apollo •
Bebop •
Billy •
Calico •
Celeste •
The Doorman •
Drifter •
Dynamo •
Graves •
Grey Talon •
Haze •
Holliday •
Infernus •
Ivy •
Kelvin •
Lady Geist •
Lash •
McGinnis •
Mina •
Mirage •
Mo & Krill •
Paige •
Paradox •
Pocket •
Rem •
Seven •
Shiv •
Silver •
Sinclair •
Venator •
Victor •
Vindicta •
Viscous •
Vyper •
Warden •
Wraith •
Yamato
Hide redlinks:
{{#invoke:HeroData/nav|get_hero_bulletpoints|Movement|no_redlinks=true}}
Abrams •
Apollo •
Bebop •
Billy •
Calico •
Celeste •
The Doorman •
Drifter •
Dynamo •
Graves •
Grey Talon •
Haze •
Holliday •
Infernus •
Ivy •
Kelvin •
Lady Geist •
Lash •
McGinnis •
Mina •
Mirage •
Mo & Krill •
Paige •
Paradox •
Pocket •
Rem •
Seven •
Shiv •
Silver •
Sinclair •
Venator •
Victor •
Vindicta •
Viscous •
Vyper •
Warden •
Wraith •
Yamato
local p = {}
local heroes_data = mw.loadJsonData("Data:HeroData.json")
local hero_release_module = require('Module:HeroData/release')
local lang_module = require('Module:Lang')
-- Shared helper function
local function get_heroes(in_herolabs, include_key)
local heroes = {}
for hero_key, hero_data in pairs(heroes_data) do
-- hero_werewolf_transformed is consolidated in Silver's page
if hero_data["Name"] ~= nil and hero_key ~= 'hero_werewolf_transformed' then
local this_hero_status = hero_release_module.get_hero_release_status(hero_key)
if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or
(in_herolabs == 'false' and this_hero_status == 'Released')) then
local is_recommended = hero_data['IsRecommended'] or false
--- Create a sort key for each hero to ensure correct alphabetical ordering.
-- This logic handles special cases like "The Doorman" by looking for a "_sort" version of the hero's key in the language files.
local hero_name = lang_module.get_string(hero_key, nil, 'en')
local sort_key_to_find = hero_key .. '_sort'
local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en')
local sort_key
-- The lang_module returns the requested key (wrapped in HTML) if a translation is not found.
-- We detect this failure by checking if the returned string contains the key we originally searched for.
if string.find(potential_sort_key, sort_key_to_find, 1, true) then
-- If the key is found in the result, it means the translation failed. Fall back to the hero's display name for sorting.
sort_key = hero_name
else
-- If the key is NOT found, it means we received a valid sort key (e.g., "Doorman"). Use it.
sort_key = potential_sort_key
end
-- Store reusable hero data
local hero = {
key = hero_key,
name = hero_name,
sort_key = sort_key,
link = lang_module.get_string(hero_key, 'en'),
recommended = tostring(is_recommended)
}
table.insert(heroes, hero)
end
end
end
-- Sort heroes
table.sort(heroes, function(a, b)
return a.sort_key < b.sort_key
end)
return heroes
end
-- for [[Template:Deadlock_Wiki/Heroes]]
function p.get_hero_nav_cards(frame)
local in_herolabs = frame.args['in_herolabs'] or 'false'
local text_size = frame.args['text_size']
local card_size = frame.args['card_size']
local sticker_size = frame.args['sticker_size']
local herolabs_text_size = frame.args['herolabs_text_size']
local debug_mode = frame.args['debug_mode'] == 'true'
local lang_code = lang_module.get_lang_code()
local subpage_str = ''
if lang_code ~= 'en' then
subpage_str = '/' .. lang_code
end
local heroes = get_heroes(in_herolabs)
local ret = ''
for _, hero in ipairs(heroes) do
ret = ret .. '{{Hero card2'
ret = ret .. '|name=' .. hero.name
ret = ret .. '|link=' .. hero.link
ret = ret .. '|subpage=' .. subpage_str
ret = ret .. '|recommended=' .. hero.recommended
ret = ret .. '|text_size=' .. text_size
ret = ret .. '|herolabs=' .. in_herolabs
ret = ret .. '|card_size=' .. card_size
ret = ret .. '|sticker_size=' .. sticker_size
ret = ret .. '|herolabs_text_size=' .. herolabs_text_size
ret = ret .. '}}'
end
if debug_mode then
return ret
else
return frame:preprocess(ret)
end
end
-- for [[Template:Roster]]
function p.get_hero_roster(frame)
local in_herolabs = frame.args['in_herolabs'] or 'false'
local debug_mode = frame.args['debug_mode'] == 'true'
local lang_code = lang_module.get_lang_code()
local subpage_str = ''
if lang_code ~= 'en' then
subpage_str = '/' .. lang_code
end
local heroes = get_heroes(in_herolabs)
local ret = ''
for _, hero in ipairs(heroes) do
ret = ret .. '{{HeroRosterCard'
ret = ret .. '|name=' .. hero.name
ret = ret .. '|key=' .. hero.key
ret = ret .. '}}'
end
if debug_mode then
return ret
else
return frame:preprocess(ret)
end
end
-- for [[Template:Quotes Navbox]] etc.
p.get_hero_bulletpoints = function(frame)
local subpage = frame.args['1']
local in_herolabs = frame.args['in_herolabs'] or 'false'
local debug_mode = frame.args['debug_mode'] == 'true'
local lang_code = lang_module.get_lang_code()
local subpage_str = ''
if lang_code ~= 'en' then
subpage_str = '/' .. lang_code
end
local heroes = get_heroes(in_herolabs)
local ret = ''
for _, hero in ipairs(heroes) do
if subpage then
ret = ret .. '{{PageRef|'.. hero.name
ret = ret .. '|alt_link='.. hero.name
ret = ret .. '/'.. subpage
ret = ret ..'}} • '
else
ret = ret .. '{{HeroIcon|'.. hero.name
ret = ret ..'}} • '
end
end
-- Remove the last bullet point
ret = string.sub(ret, 1, -(string.len(' • '))-1)
if debug_mode then
return ret
else -- evaluate wikitext if not in debug mode
return frame:preprocess(ret)
end
end
return p