Module:HeroData/nav: Difference between revisionsGive feedback
Gammaton32 (talk | contribs) refactored hero list function for other functions to call for |
Gammaton32 (talk | contribs) 3D model function |
||
| (11 intermediate revisions by 4 users not shown) | |||
| Line 3: | Line 3: | ||
local hero_release_module = require('Module:HeroData/release') | local hero_release_module = require('Module:HeroData/release') | ||
local lang_module = require('Module:Lang') | local lang_module = require('Module:Lang') | ||
local utilities = require('Module:Utilities') | |||
-- Cache to store results of get_heroes if called multiple times in one page render | |||
local heroes_cache = {} | |||
-- Shared helper function | -- Shared helper function | ||
local function get_heroes(in_herolabs | local function get_heroes(in_herolabs) | ||
-- Return cached result if it exists | |||
if heroes_cache[in_herolabs] then | |||
return heroes_cache[in_herolabs] | |||
end | |||
local heroes = {} | local heroes = {} | ||
| Line 20: | Line 29: | ||
--- Create a sort key for each hero to ensure correct alphabetical ordering. | --- Create a sort key for each hero to ensure correct alphabetical ordering. | ||
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' | ||
| Line 26: | Line 34: | ||
local sort_key | local sort_key | ||
-- | -- Detect translation failure if the returned string contains the original search key | ||
if string.find(potential_sort_key, sort_key_to_find, 1, true) then | if string.find(potential_sort_key, sort_key_to_find, 1, true) then | ||
sort_key = hero_name | sort_key = hero_name | ||
else | else | ||
sort_key = potential_sort_key | sort_key = potential_sort_key | ||
end | end | ||
-- NOTE: Check if lang_module.get_string(hero_key, 'en') returns the same value as hero_name. | |||
-- If the second argument defaults to nil natively, you can optimize further by setting: link = hero_name | |||
local hero_link = lang_module.get_string(hero_key, 'en') | |||
-- Store reusable hero data | -- Store reusable hero data | ||
| Line 41: | Line 50: | ||
name = hero_name, | name = hero_name, | ||
sort_key = sort_key, | sort_key = sort_key, | ||
link = | link = hero_link, | ||
recommended = tostring(is_recommended) | recommended = tostring(is_recommended) | ||
} | } | ||
| Line 55: | Line 64: | ||
end) | end) | ||
heroes_cache[in_herolabs] = heroes | |||
return heroes | return heroes | ||
end | end | ||
| Line 60: | Line 70: | ||
-- for [[Template:Deadlock_Wiki/Heroes]] | -- for [[Template:Deadlock_Wiki/Heroes]] | ||
function p.get_hero_nav_cards(frame) | function p.get_hero_nav_cards(frame) | ||
local text_size = frame.args['text_size'] | local text_size = frame.args['text_size'] | ||
local card_size = frame.args['card_size'] | local card_size = frame.args['card_size'] | ||
local | local in_herolabs = frame.args['in_herolabs'] or 'false' | ||
local debug_mode = frame.args['debug_mode'] == 'true' | local debug_mode = frame.args['debug_mode'] == 'true' | ||
local heroes = get_heroes(in_herolabs) | local heroes = get_heroes(in_herolabs) | ||
local parts = {} | |||
local | |||
for _, hero in ipairs(heroes) do | for _, hero in ipairs(heroes) do | ||
table.insert(parts, string.format('{{Hero card2|heroName=%s|cardSize=%s|textSize=%s|isHeroLabs=%s}}', | |||
hero.link, card_size, text_size, in_herolabs)) | |||
end | end | ||
local ret = table.concat(parts) | |||
if debug_mode then | if debug_mode then | ||
| Line 102: | Line 94: | ||
-- 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 in_herolabs = frame.args['in_herolabs'] or 'false' | ||
local debug_mode = frame.args['debug_mode'] == 'true' | local debug_mode = frame.args['debug_mode'] == 'true' | ||
local | local heroes = get_heroes(in_herolabs) | ||
local parts = {} | |||
for _, hero in ipairs(heroes) do | |||
table.insert(parts, string.format('{{HeroRosterCard|name=%s|key=%s}}', hero.name, hero.key)) | |||
end | |||
local ret = table.concat(parts) | |||
if debug_mode then | |||
return ret | |||
else | |||
return frame:preprocess(ret) | |||
end | 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 no_redlinks = frame.args['no_redlinks'] == 'true' | |||
local heroes = get_heroes(in_herolabs) | local heroes = get_heroes(in_herolabs) | ||
local parts = {} | |||
local | for _, hero in ipairs(heroes) do | ||
-- Lua optimization: clean ternary fallback for page_title assignment | |||
local page_title = subpage and (hero.link .. '/' .. subpage) or hero.name | |||
-- Skip redlinks entirely when enabled | |||
if not (no_redlinks and not utilities.page_exists(page_title)) then | |||
local item | |||
if subpage then | |||
item = string.format('{{PageRef|%s|alt_link=%s}}', hero.link, page_title) | |||
else | |||
item = string.format('{{HeroIcon|%s}}', hero.link) | |||
end | |||
table.insert(parts, item) | |||
end | |||
end | end | ||
local ret = table.concat(parts, ' • ') | |||
if debug_mode then | if debug_mode then | ||
| Line 131: | Line 148: | ||
end | end | ||
-- for | -- for image galleries | ||
p. | p.get_hero_gallery = function(frame) | ||
local file_name = frame.args['1'] or '' | |||
local description = frame.args['2'] or '' | |||
local in_herolabs = frame.args['in_herolabs'] or 'false' | |||
local debug_mode = frame.args['debug_mode'] == 'true' | local debug_mode = frame.args['debug_mode'] == 'true' | ||
local | local heroes = get_heroes(in_herolabs) | ||
local parts = {} | |||
local | for _, hero in ipairs(heroes) do | ||
if | table.insert(parts, string.format('File:%s%s|%s%s\n', hero.link, file_name, hero.name, description)) | ||
end | |||
local ret = '<gallery>\n' .. table.concat(parts) .. '</gallery>' | |||
if debug_mode then | |||
return ret | |||
else | |||
return frame:preprocess(ret) | |||
end | end | ||
end | |||
-- Generate 3D model gallery | |||
function p.get_hero_models(frame) | |||
local in_herolabs = frame.args['in_herolabs'] or 'false' | |||
local debug_mode = frame.args['debug_mode'] == 'true' | |||
local heroes = get_heroes(in_herolabs) | local heroes = get_heroes(in_herolabs) | ||
local parts = {} | |||
for _, hero in ipairs(heroes) do | for _, hero in ipairs(heroes) do | ||
table.insert(parts, string.format('{{3D Model|%s}}', hero.name)) | |||
end | |||
local ret = table.concat(parts) | |||
ret = | |||
if debug_mode then | if debug_mode then | ||
return ret | return ret | ||
else | else | ||
return frame:preprocess(ret) | return frame:preprocess(ret) | ||
end | end | ||