Module:HeroData/nav: Difference between revisions

refactored hero list function for other functions to call for
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, include_key)
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.
                -- 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'
Line 26: Line 34:


                 local sort_key
                 local sort_key
                 -- The lang_module returns the requested key (wrapped in HTML) if a translation is not found.
                 -- Detect translation failure if the returned string contains the original search key
                -- 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 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
                     sort_key = hero_name
                 else
                 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
                     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 = lang_module.get_string(hero_key, 'en'),
                     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 in_herolabs = frame.args['in_herolabs'] or 'false'
     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 sticker_size = frame.args['sticker_size']
     local in_herolabs = frame.args['in_herolabs'] or 'false'
    local herolabs_text_size = frame.args['herolabs_text_size']
     local debug_mode = frame.args['debug_mode'] == 'true'
     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 heroes = get_heroes(in_herolabs)
 
     local parts = {}
     local ret = ''


     for _, hero in ipairs(heroes) do
     for _, hero in ipairs(heroes) do
         ret = ret .. '{{Hero card2'
         table.insert(parts, string.format('{{Hero card2|heroName=%s|cardSize=%s|textSize=%s|isHeroLabs=%s}}',
        ret = ret .. '|name=' .. hero.name
            hero.link, card_size, text_size, in_herolabs))
        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
     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 lang_code = lang_module.get_lang_code()
     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)


     local subpage_str = ''
     if debug_mode then
     if lang_code ~= 'en' then
        return ret
         subpage_str = '/' .. lang_code
     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 ret = ''
     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


    for _, hero in ipairs(heroes) do
        -- Skip redlinks entirely when enabled
        ret = ret .. '{{HeroRosterCard'
        if not (no_redlinks and not utilities.page_exists(page_title)) then
        ret = ret .. '|name=' .. hero.name
            local item
        ret = ret .. '|key=' .. hero.key
            if subpage then
         ret = ret .. '}}'
                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 [[Template:Quotes Navbox]] etc.
-- for image galleries
p.get_hero_bulletpoints = function(frame)
p.get_hero_gallery = function(frame)
local subpage = frame.args['1']
    local file_name = frame.args['1'] or ''
local in_herolabs = frame.args['in_herolabs'] or 'false'
    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 lang_code = lang_module.get_lang_code()
     local heroes = get_heroes(in_herolabs)
    local parts = {}


     local subpage_str = ''
    for _, hero in ipairs(heroes) do
     if lang_code ~= 'en' then
        table.insert(parts, string.format('File:%s%s|%s%s\n', hero.link, file_name, hero.name, description))
         subpage_str = '/' .. lang_code
    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 = {}


    local ret = ''
   
     for _, hero in ipairs(heroes) do
     for _, hero in ipairs(heroes) do
    if subpage then
        table.insert(parts, string.format('{{3D Model|%s}}', hero.name))
            ret = ret .. '{{PageRef|'.. hero.name
    end
            ret = ret .. '|alt_link='.. hero.name
 
            ret = ret .. '/'.. subpage
     local ret = table.concat(parts)
            ret = ret ..'}} &bull; '
 
        else
            ret = ret .. '{{HeroIcon|'.. hero.name
            ret = ret ..'}} &bull; '
        end
        end
   
        -- Remove the last bullet point
     ret = string.sub(ret, 1, -(string.len(' &bull; '))-1)
   
     if debug_mode then
     if debug_mode then
         return ret
         return ret
     else -- evaluate wikitext if not in debug mode
     else
         return frame:preprocess(ret)
         return frame:preprocess(ret)
     end
     end