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 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 = {}
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 card_size = frame.args['card_size']
    local sticker_size = frame.args['sticker_size']
    local herolabs_text_size = frame.args['herolabs_text_size']
    local debug_mode = frame.args['debug_mode']
local lang_code = lang_module.get_lang_code() -- 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


-- Shared helper function
    if in_herolabs == nil then
local function get_heroes(in_herolabs)
    in_herolabs = 'false'
     -- Return cached result if it exists
    end
     if heroes_cache[in_herolabs] then
    if in_herolabs ~= 'true' and in_herolabs ~= 'false' then
         return heroes_cache[in_herolabs]
        return 'in_herolabs must be either true or false'
    end
   
     -- Only add subpage if not English
    local subpage_str = ''
     if lang_code ~= 'en' then  
         subpage_str = '/' .. lang_code
     end
     end
 
   
    -- Iterate heroes
     local heroes = {}
     local heroes = {}
     for hero_key, hero_data in pairs(heroes_data) do
     for hero_key, hero_data in pairs(heroes_data) do
        -- hero_werewolf_transformed is consolidated in Silver's page
    -- hero_werewolf_transformed is consolidated in Silver's page
         if hero_data["Name"] ~= nil and hero_key ~= 'hero_werewolf_transformed' then
         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)
             local this_hero_status = hero_release_module.get_hero_release_status(hero_key)
 
           
            if this_in_herolabs == nil then this_in_herolabs = false end
           
             if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or
             if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or
                 (in_herolabs == 'false' and this_hero_status == 'Released')) then
                 (in_herolabs == 'false' and this_hero_status == 'Released')) then
 
               
                 local is_recommended = hero_data['IsRecommended'] or false
                 local is_recommended = hero_data['IsRecommended']
 
                if is_recommended == nil then
                 --- Create a sort key for each hero to ensure correct alphabetical ordering.
                    is_recommended = false
                end
               
                 -- 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'
                 local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en')
                 local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en')
 
               
                 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.
                 local hero_wikitext = '|name=' .. hero_name ..  
                -- If the second argument defaults to nil natively, you can optimize further by setting: link = hero_name
                              '|link=' .. lang_module.get_string(hero_key, 'en') ..
                local hero_link = lang_module.get_string(hero_key, 'en')
                              '|subpage=' .. subpage_str ..
 
                              '|recommended=' .. tostring(is_recommended)
                -- Store reusable hero data
                  
                local hero = {
                -- Store the sort key and the wikitext together in a table for sorting.
                    key = hero_key,
                 table.insert(heroes, {sort_key = sort_key, wikitext = hero_wikitext})
                    name = hero_name,
                    sort_key = sort_key,
                    link = hero_link,
                    recommended = tostring(is_recommended)
                 }
 
                 table.insert(heroes, hero)
             end
             end
         end
         end
     end
     end
 
       
     -- Sort heroes
     -- Sort the list of heroes alphabetically based on their assigned sort_key.
     table.sort(heroes, function(a, b)
     table.sort(heroes, function(a, b)
         return a.sort_key < b.sort_key
         return a.sort_key < b.sort_key
     end)
     end)
 
      
     heroes_cache[in_herolabs] = heroes
     -- Build the final wikitext output from the now-sorted table.
     return heroes
     local ret = ''
end
     for index, hero_object in ipairs(heroes) do
 
        ret = ret .. '{{Hero card2' .. hero_object.wikitext
-- for [[Template:Deadlock_Wiki/Heroes]]
        ret = ret .. '|text_size=' .. text_size
function p.get_hero_nav_cards(frame)
        ret = ret .. '|herolabs=' .. in_herolabs
     local text_size = frame.args['text_size']
        ret = ret .. '|card_size=' .. card_size
     local card_size = frame.args['card_size']
         ret = ret .. '|sticker_size=' .. sticker_size
    local in_herolabs = frame.args['in_herolabs'] or 'false'
        ret = ret .. '|herolabs_text_size=' .. herolabs_text_size
    local debug_mode = frame.args['debug_mode'] == 'true'
        ret = ret .. '}} '
 
        end
    local heroes = get_heroes(in_herolabs)
      
    local parts = {}
    -- Remove the last space
 
     ret = string.sub(ret, 1, -(string.len(' '))-1)
    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
 
     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
Line 94: Line 111:
-- 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 debug_mode = frame.args['debug_mode'] == 'true'
local lang_code = lang_module.get_lang_code() -- 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
   
    if in_herolabs == nil then
    in_herolabs = 'false'
    end
    if in_herolabs ~= 'true' and in_herolabs ~= 'false' then
        return 'in_herolabs must be either true or false'
    end
   
    -- Only add subpage if not English
     local subpage_str = ''
    if lang_code ~= 'en' then
        subpage_str = '/' .. lang_code
    end
   
    -- Iterate heroes
    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 this_in_herolabs == nil then this_in_herolabs = false end
           
            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']
                if is_recommended == nil then
                    is_recommended = false
                end
               
                -- 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 sort_key_to_find = hero_key .. '_sort'
                local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en')
               
                local sort_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 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
                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
                end


    local heroes = get_heroes(in_herolabs)
                local hero_wikitext = '|name=' .. hero_name ..
    local parts = {}
                              '|key=' .. hero_key ..
 
                              '|link=' .. lang_module.get_string(hero_key, 'en') ..
    for _, hero in ipairs(heroes) do
                              '|subpage=' .. subpage_str ..
        table.insert(parts, string.format('{{HeroRosterCard|name=%s|key=%s}}', hero.name, hero.key))
                              '|recommended=' .. tostring(is_recommended)
               
                -- Store the sort key and the wikitext together in a table for sorting.
                table.insert(heroes, {sort_key = sort_key, wikitext = hero_wikitext})
            end
        end
     end
     end
 
       
     local ret = table.concat(parts)
    -- Sort the list of heroes alphabetically based on their assigned sort_key.
 
    table.sort(heroes, function(a, b)
        return a.sort_key < b.sort_key
    end)
   
    -- Build the final wikitext output from the now-sorted table.
     local ret = ''
    for index, hero_object in ipairs(heroes) do
        ret = ret .. '{{HeroRosterCard' .. hero_object.wikitext
        ret = ret .. '}}'
        end
   
     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
Line 115: Line 203:
-- for [[Template:Quotes Navbox]] etc.
-- for [[Template:Quotes Navbox]] etc.
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 debug_mode = frame.args['debug_mode'] == 'true'
local lang_code = lang_module.get_lang_code() -- Get the language code
     local no_redlinks = frame.args['no_redlinks'] == 'true'
   
 
    -- Turn debug_mode from string to bool, default to false
    local heroes = get_heroes(in_herolabs)
     if debug_mode == nil then
     local parts = {}
        debug_mode = false
 
     elseif debug_mode == 'true' then
    for _, hero in ipairs(heroes) do
        debug_mode = true
        -- Lua optimization: clean ternary fallback for page_title assignment
     elseif debug_mode == 'false' then
        local page_title = subpage and (hero.link .. '/' .. subpage) or hero.name
         debug_mode = false
 
         -- 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, ' &bull; ')
     if in_herolabs == nil then
 
    in_herolabs = 'false'
     if debug_mode then
        return ret
    else
        return frame:preprocess(ret)
     end
     end
end
     if in_herolabs ~= 'true' and in_herolabs ~= 'false' then
 
        return 'in_herolabs must be either true or false'
-- 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
     end
      
      
     local ret = '<gallery>\n' .. table.concat(parts) .. '</gallery>'
    -- 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
    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 this_in_herolabs == nil then this_in_herolabs = false end
           
            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']
                if is_recommended == nil then
                    is_recommended = false
                end
               
                -- 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 sort_key_to_find = hero_key .. '_sort'
                local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en')
               
                local sort_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 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
                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
                end


-- Generate 3D model gallery
                local hero_wikitext = hero_name
function p.get_hero_models(frame)
               
    local in_herolabs = frame.args['in_herolabs'] or 'false'
                -- Store the sort key and the wikitext together in a table for sorting.
    local debug_mode = frame.args['debug_mode'] == 'true'
                table.insert(heroes, {sort_key = sort_key, wikitext = hero_wikitext})
 
            end
    local heroes = get_heroes(in_herolabs)
        end
    local parts = {}
 
    for _, hero in ipairs(heroes) do
        table.insert(parts, string.format('{{3D Model|%s}}', hero.name))
     end
     end
 
       
     local ret = table.concat(parts)
    -- Sort the list of heroes alphabetically based on their assigned sort_key.
 
    table.sort(heroes, function(a, b)
        return a.sort_key < b.sort_key
    end)
   
    -- Build the final wikitext output from the now-sorted table.
     local ret = ''
    for index, hero_object in ipairs(heroes) do
    if subpage then
            ret = ret .. '{{PageRef|'.. hero_object.wikitext
            ret = ret .. '|alt_link='.. hero_object.wikitext
            ret = ret .. '/'.. subpage
            ret = ret ..'}} &bull; '
        else
            ret = ret .. '{{HeroIcon|'.. hero_object.wikitext
            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
     else -- evaluate wikitext if not in debug mode
         return frame:preprocess(ret)
         return frame:preprocess(ret)
     end
     end
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