Editing Module:HeroData/nav

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 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
-- for [[Template:Deadlock_Wiki/Heroes]] on home page, i.e. [[Template:Hero card2]]
local heroes_cache = {}
 
-- Shared helper function
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 = {}
 
    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.
                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
                -- 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
                    sort_key = hero_name
                else
                    sort_key = potential_sort_key
                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
                local hero = {
                    key = hero_key,
                    name = hero_name,
                    sort_key = sort_key,
                    link = hero_link,
                    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)
 
    heroes_cache[in_herolabs] = heroes
    return heroes
end
 
-- 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'] -- true 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 in_herolabs = frame.args['in_herolabs'] or 'false'
     local sticker_size = frame.args['sticker_size']
     local debug_mode = frame.args['debug_mode'] == 'true'
    local herolabs_text_size = frame.args['herolabs_text_size']
 
     local debug_mode = frame.args['debug_mode']
     local heroes = get_heroes(in_herolabs)
   
local function get_language_from_subpage()
    -- Get the full page path (including subpages)
     local full_page_name = mw.title.getCurrentTitle().fullText
   
    -- Split path by slashes
     local parts = {}
     local parts = {}
 
     for part in full_page_name:gmatch("[^/]+") do
     for _, hero in ipairs(heroes) do
         table.insert(parts, part)
         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)
    -- Last part - potential language code
 
     local last_part = parts[#parts] or ""
     if debug_mode then
   
         return ret
    -- Check for language codes matching:
    else
    -- 1. Exactly 2 letters (like 'ru'), OR
         return frame:preprocess(ret)
    -- 2. 2 letters + hyphen + any characters (like 'zh-hans')
     if last_part:match("^[a-z][a-z]$") or last_part:match("^[a-z][a-z]%-[%w]+$") then
         -- Convert to lowercase and replace _ with -
         return last_part:lower():gsub("_", "-")
     end
     end
   
    return "en" -- Default to English
end
end
local lang_code = get_language_from_subpage() -- Get the language code
   
    -- Turn debug_mode from string to bool, default to false
    if debug_mode == nil then
        debug_mode = false
    elseif debug_mode == 'true' then
        debug_mode = true
    elseif debug_mode == 'false' then
        debug_mode = false
    end


-- for [[Template:Roster]]
     if in_herolabs ~= 'true' and in_herolabs ~= 'false' then
function p.get_hero_roster(frame)
        return 'in_herolabs must be either true or false'
     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('{{HeroRosterCard|name=%s|key=%s}}', hero.name, hero.key))
     end
     end
 
   
     local ret = table.concat(parts)
    -- Only add subpage if not English
 
     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
   
 
    -- Iterate heroes
-- for [[Template:Quotes Navbox]] etc.
    local heroes = {}
p.get_hero_bulletpoints = function(frame)
    for hero_key, hero_data in pairs(heroes_data) do
    local subpage = frame.args['1']
        if hero_data["Name"] ~= nil then
    local in_herolabs = frame.args['in_herolabs'] or 'false'
            -- if herolabs is requested, only needs to have herolabs=true
    local debug_mode = frame.args['debug_mode'] == 'true'
            -- otherwise, needs to be not disabled, in development, nd herolabs is nil or false
    local no_redlinks = frame.args['no_redlinks'] == 'true'
            local this_hero_status = hero_release_module.get_hero_release_status(hero_key)
 
           
    local heroes = get_heroes(in_herolabs)
            if this_in_herolabs == nil then this_in_herolabs = false end
    local parts = {}
           
 
            if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or
    for _, hero in ipairs(heroes) do
                (in_herolabs == 'false' and this_hero_status == 'Released')) then
        -- Lua optimization: clean ternary fallback for page_title assignment
               
        local page_title = subpage and (hero.link .. '/' .. subpage) or hero.name
                local is_recommended = hero_data['IsRecommended']
 
                if is_recommended == nil then
        -- Skip redlinks entirely when enabled
                    is_recommended = false
        if not (no_redlinks and not utilities.page_exists(page_title)) then
                end
            local item
               
            if subpage then
                local hero_str = '|name=' .. lang_module.get_string(hero_key, nil, 'en') ..  
                item = string.format('{{PageRef|%s|alt_link=%s}}', hero.link, page_title)
                              '|link=' .. lang_module.get_string(hero_key, 'en') ..
            else
                              '|subpage=' .. subpage_str ..  
                 item = string.format('{{HeroIcon|%s}}', hero.link)
                              '|recommended=' .. tostring(is_recommended)
               
                 table.insert(heroes, hero_str)
             end
             end
            table.insert(parts, item)
         end
         end
     end
     end
 
       
     local ret = table.concat(parts, ' &bull; ')
    -- Order list alphabetically
 
     table.sort(heroes) -- O(nlogn)
     if debug_mode then
   
        return ret
     -- Add each item to output
     else
     local ret = ''
        return frame:preprocess(ret)
     for index, hero_name in ipairs(heroes) do
     end
        ret = ret .. '{{Hero card2' .. hero_name
end
        ret = ret .. '|text_size=' .. text_size
 
        ret = ret .. '|herolabs=' .. in_herolabs
-- for image galleries
        ret = ret .. '|card_size=' .. card_size
p.get_hero_gallery = function(frame)
        ret = ret .. '|sticker_size=' .. sticker_size
    local file_name = frame.args['1'] or ''
         ret = ret .. '|herolabs_text_size=' .. herolabs_text_size
    local description = frame.args['2'] or ''
        ret = ret .. '}} '
    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
     end
      
      
     local ret = '<gallery>\n' .. table.concat(parts) .. '</gallery>'
     -- Remove the last space
 
     ret = string.sub(ret, 1, -(string.len(' '))-1)
    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
         return ret
         return ret
     else
     else -- evaluate wikitext if not in debug mode
         return frame:preprocess(ret)
         return frame:preprocess(ret)
     end
     end
end
end
return p
return p
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