Module:HeroData/nav: Difference between revisions

From The Deadlock Wiki
Jump to navigation Jump to search
No edit summary
refactored hero list function for other functions to call for
Line 4: Line 4:
local lang_module = require('Module:Lang')
local lang_module = require('Module:Lang')


-- for [[Template:Deadlock_Wiki/Heroes]] on home page, i.e. [[Template:Hero card2]]
-- Shared helper function
function p.get_hero_nav_cards(frame)
local function get_heroes(in_herolabs, include_key)
     local in_herolabs = frame.args['in_herolabs'] -- true or false
     local heroes = {}
    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


    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
     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']
                 local is_recommended = hero_data['IsRecommended'] or false
                if is_recommended == nil then
 
                    is_recommended = false
                 --- Create a sort key for each hero to ensure correct alphabetical ordering.
                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.
                 -- 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
                 -- The lang_module returns the requested key (wrapped in HTML) if a translation is not found.
                 -- The lang_module returns the requested key (wrapped in HTML) if a translation is not found.
Line 71: Line 36:
                 end
                 end


                 local hero_wikitext = '|name=' .. hero_name ..
                -- Store reusable hero data
                              '|link=' .. lang_module.get_string(hero_key, 'en') ..
                 local hero = {
                              '|subpage=' .. subpage_str ..
                    key = hero_key,
                              '|recommended=' .. tostring(is_recommended)
                    name = hero_name,
                  
                    sort_key = sort_key,
                -- Store the sort key and the wikitext together in a table for sorting.
                    link = lang_module.get_string(hero_key, 'en'),
                 table.insert(heroes, {sort_key = sort_key, wikitext = hero_wikitext})
                    recommended = tostring(is_recommended)
                 }
 
                 table.insert(heroes, hero)
             end
             end
         end
         end
     end
     end
       
 
     -- Sort the list of heroes alphabetically based on their assigned sort_key.
     -- Sort heroes
     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)
      
 
    -- Build the final wikitext output from the now-sorted table.
     return heroes
end
 
-- for [[Template:Deadlock_Wiki/Heroes]]
function p.get_hero_nav_cards(frame)
 
    local in_herolabs = frame.args['in_herolabs'] 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'] == '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 ret = ''
     local ret = ''
     for index, hero_object in ipairs(heroes) do
 
         ret = ret .. '{{Hero card2' .. hero_object.wikitext
     for _, hero in ipairs(heroes) do
         ret = ret .. '{{Hero card2'
        ret = ret .. '|name=' .. hero.name
        ret = ret .. '|link=' .. hero.link
        ret = ret .. '|subpage=' .. subpage_str
        ret = ret .. '|recommended=' .. hero.recommended
         ret = ret .. '|text_size=' .. text_size
         ret = ret .. '|text_size=' .. text_size
         ret = ret .. '|herolabs=' .. in_herolabs
         ret = ret .. '|herolabs=' .. in_herolabs
Line 96: Line 90:
         ret = ret .. '|sticker_size=' .. sticker_size
         ret = ret .. '|sticker_size=' .. sticker_size
         ret = ret .. '|herolabs_text_size=' .. herolabs_text_size
         ret = ret .. '|herolabs_text_size=' .. herolabs_text_size
         ret = ret .. '}} '
         ret = ret .. '}}'
        end
    end
   
 
    -- Remove the last space
    ret = string.sub(ret, 1, -(string.len(' '))-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
Line 111: Line 102:
-- for [[Template:Roster]]
-- for [[Template:Roster]]
function p.get_hero_roster(frame)
function p.get_hero_roster(frame)
 
local lang_code = lang_module.get_lang_code() -- Get the language code
    local in_herolabs = frame.args['in_herolabs'] or 'false'
   
    local debug_mode = frame.args['debug_mode'] == 'true'
    -- Turn debug_mode from string to bool, default to false
 
    if debug_mode == nil then
     local lang_code = lang_module.get_lang_code()
        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 = ''
     local subpage_str = ''
     if lang_code ~= 'en' then  
     if lang_code ~= 'en' then
         subpage_str = '/' .. lang_code  
         subpage_str = '/' .. lang_code
     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


                local hero_wikitext = '|name=' .. hero_name ..
    local heroes = get_heroes(in_herolabs)
                              '|key=' .. hero_key ..
 
                              '|link=' .. lang_module.get_string(hero_key, 'en') ..
                              '|subpage=' .. subpage_str ..
                              '|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
       
    -- 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 = ''
     local ret = ''
     for index, hero_object in ipairs(heroes) do
 
         ret = ret .. '{{HeroRosterCard' .. hero_object.wikitext
     for _, hero in ipairs(heroes) do
         ret = ret .. '{{HeroRosterCard'
        ret = ret .. '|name=' .. hero.name
        ret = ret .. '|key=' .. hero.key
         ret = ret .. '}}'
         ret = ret .. '}}'
        end
    end
   
 
     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
Line 204: Line 134:
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 lang_code = lang_module.get_lang_code() -- Get the language code
    local debug_mode = frame.args['debug_mode'] == 'true'
   
 
    -- Turn debug_mode from string to bool, default to false
     local lang_code = lang_module.get_lang_code()
    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 = ''
     local subpage_str = ''
     if lang_code ~= 'en' then  
     if lang_code ~= 'en' then
         subpage_str = '/' .. lang_code  
         subpage_str = '/' .. lang_code
     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


                local hero_wikitext = hero_name
    local heroes = get_heroes(in_herolabs)
               
 
                -- Store the sort key and the wikitext together in a table for sorting.
     local ret = ''
                table.insert(heroes, {sort_key = sort_key, wikitext = hero_wikitext})
            end
        end
    end
       
    -- 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.
     for _, hero in ipairs(heroes) do
    local ret = ''
     for index, hero_object in ipairs(heroes) do
     if subpage then
     if subpage then
             ret = ret .. '{{PageRef|'.. hero_object.wikitext
             ret = ret .. '{{PageRef|'.. hero.name
             ret = ret .. '|alt_link='.. hero_object.wikitext
             ret = ret .. '|alt_link='.. hero.name
             ret = ret .. '/'.. subpage
             ret = ret .. '/'.. subpage
             ret = ret ..'}} &bull; '
             ret = ret ..'}} &bull; '
         else
         else
             ret = ret .. '{{HeroIcon|'.. hero_object.wikitext
             ret = ret .. '{{HeroIcon|'.. hero.name
             ret = ret ..'}} &bull; '
             ret = ret ..'}} &bull; '
         end
         end

Revision as of 22:15, 17 May 2026

Overview

Generates hero navigation cards

Functions

get_hero_nav_cards

For Template:Hero Navbox on Heroes, individual hero pages like Abrams, and the home page.

Examples

First with debug_mode on, to help visualize what the output's source looks like.

{{#invoke:HeroData/nav|get_hero_nav_cards
|text_size=13
|card_size=88
|in_herolabs=false
|debug_mode=true
}}

Lua error at line 90: attempt to concatenate local 'sticker_size' (a nil value).

Now with debug_mode defaulted to false (off) to see actual visual output.

{{#invoke:HeroData/nav|get_hero_nav_cards
|text_size=13
|card_size=88
|in_herolabs=false
}}

Lua error at line 90: attempt to concatenate local 'sticker_size' (a nil value).

Parameters

  • text_size - Font size of the hero name
  • card_size - Size of the hero card
  • in_herolabs - Get hero labs heroes (there are none at the moment)
  • debug_mode - (OPTIONAL) Defaults to false. With true, the output is raw wikitext source that isn't processed, allowing to see more clearly what is ran.

debug_mode is the only optional parameter. All other parameters are required. Template:Hero card2 utilizes this with some default values, see there for suggested values.

get_hero_roster

For Template:Roster on Heroes, generate a list using Template:HeroRosterCard.

get_hero_bulletpoints

For navboxes such as Template:Quotes Navbox, generate a bulletpoint list of heroes.

Add the name of a subpage to link to specific subpages. It will still display only the hero name but link to the subpage instead.

Add variable "no_redlinks=true" to hide red links (non-existent pages).

Examples

{{#invoke:HeroData/nav|get_hero_bulletpoints}}

Abrams Apollo Bebop Billy Calico Celeste The Doorman Drifter Dynamo Graves Grey Talon Haze Holliday Infernus Ivy Kelvin Lady Geist Lash McGinnis Mina Mirage Mo & Krill Paige Paradox Pocket Rem Seven Shiv Silver Sinclair Venator Victor Vindicta Viscous Vyper Warden Wraith Yamato

To link to "/Movement" subpages:

{{#invoke:HeroData/nav|get_hero_bulletpoints|Movement}}

AbramsApolloBebopBillyCalicoCelesteThe DoormanDrifterDynamoGravesGrey TalonHazeHollidayInfernusIvyKelvinLady GeistLashMcGinnisMinaMirageMo & KrillPaigeParadoxPocketRemSevenShivSilverSinclairVenatorVictorVindictaViscousVyperWardenWraithYamato

Hide redlinks:

{{#invoke:HeroData/nav|get_hero_bulletpoints|Movement|no_redlinks=true}}

AbramsApolloBebopBillyCalicoCelesteThe DoormanDrifterDynamoGravesGrey TalonHazeHollidayInfernusIvyKelvinLady GeistLashMcGinnisMinaMirageMo & KrillPaigeParadoxPocketRemSevenShivSilverSinclairVenatorVictorVindictaViscousVyperWardenWraithYamato


local p = {}
local heroes_data = mw.loadJsonData("Data:HeroData.json")
local hero_release_module = require('Module:HeroData/release')
local lang_module = require('Module:Lang')

-- Shared helper function
local function get_heroes(in_herolabs, include_key)
    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.
                -- 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

                -- Store reusable hero data
                local hero = {
                    key = hero_key,
                    name = hero_name,
                    sort_key = sort_key,
                    link = lang_module.get_string(hero_key, 'en'),
                    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)

    return heroes
end

-- for [[Template:Deadlock_Wiki/Heroes]]
function p.get_hero_nav_cards(frame)

    local in_herolabs = frame.args['in_herolabs'] 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'] == '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 ret = ''

    for _, hero in ipairs(heroes) do
        ret = ret .. '{{Hero card2'
        ret = ret .. '|name=' .. hero.name
        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

    if debug_mode then
        return ret
    else
        return frame:preprocess(ret)
    end
end

-- for [[Template:Roster]]
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()

    local subpage_str = ''
    if lang_code ~= 'en' then
        subpage_str = '/' .. lang_code
    end

    local heroes = get_heroes(in_herolabs)

    local ret = ''

    for _, hero in ipairs(heroes) do
        ret = ret .. '{{HeroRosterCard'
        ret = ret .. '|name=' .. hero.name
        ret = ret .. '|key=' .. hero.key
        ret = ret .. '}}'
    end

    if debug_mode then
        return ret
    else
        return frame:preprocess(ret)
    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 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 ret = ''
    
    for _, hero in ipairs(heroes) do
    	if subpage then
            ret = ret .. '{{PageRef|'.. hero.name
            ret = ret .. '|alt_link='.. hero.name
            ret = ret .. '/'.. subpage
            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
        return ret
    else -- evaluate wikitext if not in debug mode
        return frame:preprocess(ret)
    end
end

return p