Editing Module:HeroData/nav

Jump to navigation Jump to search
Warning: You are not logged in. Once you make an edit, a temporary account will be created for you. Learn more. Log in or create an account to continue receiving notifications after this account expires, and to access other features.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision Your text
Line 4: Line 4:
local lang_module = require('Module:Lang')
local lang_module = require('Module:Lang')
local utilities = require('Module:Utilities')
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, include_key)
    -- Return cached result if it exists
    if heroes_cache[in_herolabs] then
        return heroes_cache[in_herolabs]
    end
 
     local heroes = {}
     local heroes = {}


Line 29: Line 21:


                 --- 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 34: Line 27:


                 local sort_key
                 local sort_key
                 -- Detect translation failure if the returned string contains the original search 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 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 50: Line 42:
                     name = hero_name,
                     name = hero_name,
                     sort_key = sort_key,
                     sort_key = sort_key,
                     link = hero_link,
                     link = lang_module.get_string(hero_key, 'en'),
                     recommended = tostring(is_recommended)
                     recommended = tostring(is_recommended)
                 }
                 }
Line 64: Line 56:
     end)
     end)


    heroes_cache[in_herolabs] = heroes
     return heroes
     return heroes
end
end
Line 70: Line 61:
-- 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 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 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
         table.insert(parts, string.format('{{Hero card2|heroName=%s|cardSize=%s|textSize=%s|isHeroLabs=%s}}',
         ret = ret .. '{{Hero card2'
            hero.link, card_size, text_size, in_herolabs))
        ret = ret .. '|heroName=' .. hero.name
        ret = ret .. '|cardSize=' .. card_size
        ret = ret .. '|textSize=' .. text_size
        ret = ret .. '|isHeroLabs=' .. in_herolabs
        ret = ret .. '|link=' .. hero.link
        ret = ret .. '}}'
     end
     end
    local ret = table.concat(parts)


     if debug_mode then
     if debug_mode then
Line 94: Line 97:
-- 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 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
         table.insert(parts, string.format('{{HeroRosterCard|name=%s|key=%s}}', hero.name, hero.key))
         ret = ret .. '{{HeroRosterCard'
        ret = ret .. '|name=' .. hero.name
        ret = ret .. '|key=' .. hero.key
        ret = ret .. '}}'
     end
     end
    local ret = table.concat(parts)


     if debug_mode then
     if debug_mode then
Line 114: Line 127:


-- for [[Template:Quotes Navbox]] etc.
-- for [[Template:Quotes Navbox]] etc.
local utilities = require('Module:Utilities')
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 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 no_redlinks = frame.args['no_redlinks'] == 'true'
     local no_redlinks = frame.args['no_redlinks'] == 'true' -- default: false


     local heroes = get_heroes(in_herolabs)
     local heroes = get_heroes(in_herolabs)
Line 124: Line 139:


     for _, hero in ipairs(heroes) do
     for _, hero in ipairs(heroes) do
         -- Lua optimization: clean ternary fallback for page_title assignment
         local page_title = hero.name
         local page_title = subpage and (hero.link .. '/' .. subpage) or hero.name
         if subpage then
            page_title = hero.name .. '/' .. subpage
        end


         -- Skip redlinks entirely when enabled
         -- Skip redlinks entirely when enabled
Line 131: Line 148:
             local item
             local item
             if subpage then
             if subpage then
                 item = string.format('{{PageRef|%s|alt_link=%s}}', hero.link, page_title)
                 item = '{{PageRef|' .. hero.name .. '|alt_link=' .. page_title .. '}}'
             else
             else
                 item = string.format('{{HeroIcon|%s}}', hero.link)
                 item = '{{HeroIcon|' .. hero.name .. '}}'
             end
             end
             table.insert(parts, item)
             table.insert(parts, item)
Line 140: Line 157:


     local ret = table.concat(parts, ' • ')
     local ret = table.concat(parts, ' • ')
    if debug_mode then
        return ret
    else
        return frame:preprocess(ret)
    end
end
-- for image galleries
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 heroes = get_heroes(in_herolabs)
    local parts = {}
    for _, hero in ipairs(heroes) do
        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
-- 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 parts = {}
    for _, hero in ipairs(heroes) do
        table.insert(parts, string.format('{{3D Model|%s}}', hero.name))
    end
    local ret = table.concat(parts)


     if debug_mode then
     if debug_mode then
Please note that all contributions to The Deadlock Wiki are considered to be released under the Creative Commons Attribution-NonCommercial-ShareAlike (see Deadlock:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template