Module:HeroData/nav: Difference between revisionsGive feedback
Undo revision 23580 by Monster Domosed (talk) Tag: Undo |
Auto-detect language from subpage |
||
| Line 6: | Line 6: | ||
-- for [[Template:Deadlock_Wiki/Heroes]] on home page, i.e. [[Template:Hero card2]] | -- for [[Template:Deadlock_Wiki/Heroes]] on home page, i.e. [[Template:Hero card2]] | ||
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 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 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 = {} | |||
for part in full_page_name:gmatch("[^/]+") do | |||
table.insert(parts, part) | |||
end | |||
-- Last part - potential language code | |||
local last_part = parts[#parts] or "" | |||
-- Check for language codes matching: | |||
-- 1. Exactly 2 letters (like 'ru'), OR | |||
-- 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 | |||
return "en" -- Default to English | |||
end | |||
-- Turn debug_mode from string to bool, default to false | 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 | |||
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 | |||
if hero_data["Name"] ~= nil then | |||
-- if herolabs is requested, only needs to have herolabs=true | |||
-- otherwise, needs to be not disabled, in development, nd herolabs is nil or false | |||
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 | |||
local hero_str = '|name=' .. lang_module.get_string(hero_key, nil, 'en') .. | |||
'|link=' .. lang_module.get_string(hero_key, 'en') .. | |||
'|subpage=' .. subpage_str .. | |||
'|recommended=' .. tostring(is_recommended) | |||
table.insert(heroes, hero_str) | |||
end | |||
end | |||
end | |||
-- Order list alphabetically | |||
table.sort(heroes) -- O(nlogn) | |||
-- Add each item to output | |||
local ret = '' | |||
for index, hero_name in ipairs(heroes) do | |||
ret = ret .. '{{Hero card2' .. hero_name | |||
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 | |||
-- Remove the last space | |||
ret = string.sub(ret, 1, -(string.len(' '))-1) | |||
if debug_mode then | |||
return ret | |||
else -- evaluate wikitext if not in debug mode | |||
return frame:preprocess(ret) | |||
end | |||
end | end | ||
return p | return p | ||