Module:HeroData/nav: Difference between revisions

added gallery function
3D model function
 
(6 intermediate revisions by 2 users not shown)
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, 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 21: 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 27: 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 42: 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 56: Line 64:
     end)
     end)


    heroes_cache[in_herolabs] = heroes
     return heroes
     return heroes
end
end
Line 61: 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']
Line 68: Line 76:


     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 .. '|heroName=' .. hero.link
            hero.link, card_size, text_size, in_herolabs))
        ret = ret .. '|cardSize=' .. card_size
        ret = ret .. '|textSize=' .. text_size
        ret = ret .. '|isHeroLabs=' .. in_herolabs
        ret = ret .. '}}'
     end
     end
    local ret = table.concat(parts)


     if debug_mode then
     if debug_mode then
Line 89: 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 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 .. '{{HeroRosterCard'
         table.insert(parts, string.format('{{HeroRosterCard|name=%s|key=%s}}', hero.name, hero.key))
        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 119: Line 114:


-- 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' -- default: false
     local no_redlinks = frame.args['no_redlinks'] == 'true'


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


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


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


-- for image galleries
-- for image galleries
local utilities = require('Module:Utilities')
p.get_hero_gallery = function(frame)
p.get_hero_gallery = function(frame)
     local file_name = frame.args['1']
     local file_name = frame.args['1'] or ''
     local description = frame.args['2']
     local description = frame.args['2'] or ''
     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'  -- default: false


     local heroes = get_heroes(in_herolabs)
     local heroes = get_heroes(in_herolabs)
     local parts = {}
     local parts = {}
    local start_gallery = '<gallery>'
    local end_gallery = '</gallery>'


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


        -- Skip redlinks entirely when enabled
    for _, hero in ipairs(heroes) do
         if not (no_redlinks and not utilities.page_exists(page_title)) then
         table.insert(parts, string.format('{{3D Model|%s}}', hero.name))
            local item
                item = 'File:' .. hero.name .. file_name .. '|'.. hero.name .. description ..
            table.insert(parts, item)
        end
     end
     end


     local ret = table.concat(start_gallery, parts, end_gallery)
     local ret = table.concat(parts)


     if debug_mode then
     if debug_mode then