Module:SkillNav/zh-hant
From Elwiki
Documentation for this module may be created at Module:SkillNav/zh-hant/doc
require('Module:CommonFunctions')
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- Main process
function p.main(frame)
local args = getArgs(frame);
-- Making life easier.
function inArgs(name)
if (inArray(name, args)) then
return true
end
end
local isForceNav = args.forcenav ~= nil;
-- Prepare a table of skill types to display in the navigation.
local skill_types;
if (not isForceNav) then
skill_types = {{
name = args.l_hyper, -- 'Hyper Active',
abbr = 'HA'
}, {
name = args.l_secret, -- 'Secret Art',
abbr = 'SeA'
}, {
name = args.l_special, -- 'Special Active',
abbr = 'SA'
}, {
name = args.l_active, -- 'Active',
abbr = 'A'
}, {
name = args.l_mod, -- 'Force Mod',
abbr = 'FC',
mod = true,
link_suffix = '/Mod'
}, {
name = args.l_mod2, -- 'Base Mod',
abbr = 'FC2',
mod = true,
force_class = 'base'
}, {
name = args.l_buff, -- 'Buff',
abbr = 'B'
}, {
name = args.l_passive, -- 'Passive',
abbr = 'P'
}, {
name = args.l_demon, -- 'Manic Demon',
abbr = 'MD'
}, {
name = '[[File:ForceIcon.png|16px]] ' .. (args.l_demon or 'Manic Demon'), -- 'Manic Demon (Force)',
abbr = 'MDF',
mod = true,
link_suffix = '/Mod'
}, {
name = args.l_master, -- 'Master Skill',
abbr = 'MS'
}, {
name = args.l_couple, -- 'Couple Skill',
abbr = 'Wed'
}, {
name = args.l_row1, -- 'Row 1',
abbr = 'row1'
}, {
name = args.l_row2, -- 'Row 2',
abbr = 'row2'
}, {
name = args.l_row3, -- 'Row 3',
abbr = 'row3'
}, {
name = args.l_row4, -- 'Row 4',
abbr = 'row4'
}}
else
-- Force Nav called, change skill types
skill_types = {{
name = args.l_force_active, -- 'Force Active',
abbr = 'FA3',
type = 'third'
}, {
name = args.l_force_passive, -- 'Force Passive',
abbr = 'FP3',
type = 'third'
}, {
name = args.l_force_active, -- 'Force Active',
abbr = 'FAM',
type = 'master'
}, {
name = args.l_force_passive, -- 'Force Passive',
abbr = 'FPM',
type = 'master'
}}
end
-- For backward compatibility. Do not remove until all pages are changed.
if (args.name == nil) then
args.name = args.Name or 'Unknown';
end
-- Needed this to make a custom toggle.
local char_name = args.name; -- 預設使用 args.name
local char_name_sanitized = '';
if (isForceNav and args.parent_name ~= nil) then
char_name = args.parent_name; -- 如果是 ForceNav,使用 parent_name
end
-- 確保 char_name 不為 nil
char_name = char_name or 'Unknown';
for w in char_name:gmatch("%w+") do
char_name_sanitized = char_name_sanitized .. w;
end
if (isForceNav and args.parent_name ~= nil) then
char_name_sanitized = 'ForceSkills-' .. char_name_sanitized;
end
-- Main block
local skill_nav = mw.html.create('div'):addClass('skill-nav');
if (isForceNav) then
skill_nav:addClass('force-nav');
end
-- Header
local header = skill_nav:tag('div'):addClass('skill-nav-header');
local colors;
if (args.color ~= nil) then
colors = args.color;
else
colors = frame:expandTemplate{
title = 'ColorSel',
args = {'Character', args.char or char_name} -- 使用 args.char 或 char_name
};
end
-- Redirect to language subpages if provided.
local is_localized = args.lang ~= nil;
local lang_suffix = '';
if (is_localized) then
lang_suffix = '/' .. args.lang;
end
colors = colors:gsub('#', '#')
header:css('background-color', colors);
if (args.is_guild ~= nil) then
header:css({
['justify-content'] = 'center',
['background-color'] = colors
});
end
if (not isForceNav and not args.is_guild) then
header:wikitext(frame:expandTemplate{
title = 'Face',
args = {
args.char or char_name, -- 確保角色名稱有效
args.pic,
link = args.name,
lang = lang_suffix,
scale = '0.85'
}
})
end
-- Header text with a link
if (args.l_name == nil) then
args.l_name = args.name; -- 如果 l_name 未提供,使用 name
end
local headerText = header:tag('span'):addClass('skill-nav-title');
if (not isForceNav) then
headerText:wikitext('[[' .. args.name .. lang_suffix .. '|' .. args.l_name .. ']] - ' .. (args.l_skills or 'Skills'));
else
headerText:wikitext(args.name);
end
-- Generate the navigation's body
local skill_nav_wrap = skill_nav:tag('div'):addClass('skill-nav-inner-wrap border-color')
if (args.type ~= nil) then
skill_nav_wrap:addClass(args.type);
end
-- Make it collapsible if needed.
if ((args.type ~= nil and string.find(args.type, 'mw%-collapsible') ~= nil) or args.collapsible ~= nil) then
skill_nav_wrap:attr('id', 'mw-customcollapsible-' .. char_name_sanitized);
header:tag('div'):addClass('mw-customtoggle-' .. char_name_sanitized);
end
if (args.collapsible ~= nil) then
skill_nav_wrap:addClass('mw-collapsible');
end
if (args.collapsed ~= nil) then
skill_nav_wrap:addClass('mw-collapsed');
end
-- Generate the navigation's body content.
for k2, v2 in spairs(skill_types) do
local name = v2['name'];
local abbr = v2['abbr'];
local type = v2['type'];
local mod = v2['mod'];
local link_suffix = v2['link_suffix'] or '';
local force_class = v2['force_class'];
if (inArgs(abbr)) then
-- Syntax: [image.extension], [name], [alt_name]; [image.extension], [name], [alt_name]; (...)
local skill_entries = split(args[abbr], ';'); -- 先按分號分割每個技能條目
if (abbr == 'Wed') then
skill_entries = {
'RelationSkill1.png, Extreme Heavenly Love' .. lang_suffix .. '|' .. (args.l_couple_skill_name or 'Extreme Heavenly Love'),
'RelationSkill2.png, Extreme Heavenly Bond' .. lang_suffix .. '|' .. (args.l_soulmate_skill_name or 'Extreme Heavenly Bond')
}
end
-- Separate syntax for Master Skills: [Stage 1 image], [Stage 2 image], [Stage 3 image], [Stage 4 image], [skill name];
local mc_skill_name = ''
local mc_skill_name_head = ''
if (abbr == 'MS') then
local ms_fields = split(skill_entries[1], ','); -- 只取第一個條目
mc_skill_name = ms_fields[5];
mc_skill_name = mc_skill_name:gsub('ä', 'a');
local l_mc_skill_name = ms_fields[5];
if (args.l_mc_skill_name ~= nil and is_localized) then
l_mc_skill_name = args.l_mc_skill_name;
end
mc_skill_name_head = '<br/>- ' .. l_mc_skill_name;
skill_entries = {
ms_fields[1] .. ', ' .. mc_skill_name .. '/Stage 1' .. lang_suffix .. '|' .. (args.l_stage or 'Stage') .. ' 1',
ms_fields[2] .. ', ' .. mc_skill_name .. '/Stage 2' .. lang_suffix .. '|' .. (args.l_stage or 'Stage') .. ' 2',
ms_fields[3] .. ', ' .. mc_skill_name .. '/Stage 3' .. lang_suffix .. '|' .. (args.l_stage or 'Stage') .. ' 3',
ms_fields[4] .. ', ' .. mc_skill_name .. '/Stage 4' .. lang_suffix .. '|' .. (args.l_stage or 'Stage') .. ' 4'
}
end
-- If Force Nav, append an extra header before "Force Active" if needed.
if (abbr == 'FA3' or abbr == 'FAM') then
local extra_head = skill_nav_wrap:tag('div'):addClass(
'skill-nav-sub-head skill-nav-extra-head border-color tone-7 color-normal-force-link');
if (type == 'third') then
extra_head:wikitext('[[3rd Jobs' .. lang_suffix .. '|' .. (args.l_third_job or '3rd Jobs') .. ']]');
elseif (type == 'master') then
extra_head:wikitext('[[Master Class' .. lang_suffix .. '|' .. (args.l_master_class or 'Master Class') .. ']]');
end
end
-- Append header fields on the left.
skill_nav_wrap:tag('div'):addClass('skill-nav-sub-head border-color tone-4'):wikitext(name ..
mc_skill_name_head);
-- Get localized names
local l_display_names = nil;
if (abbr ~= 'MS' and args['l_' .. abbr] ~= nil) then
l_display_names = split(args['l_' .. abbr], ";");
end
-- Append skill fields on the right.
local content = skill_nav_wrap:tag('div'):addClass('skill-nav-skill-content border-color tone-6');
for index, entry in pairs(skill_entries) do
if entry ~= '' then -- 忽略空條目
local fields = split(entry, ','); -- 按逗號分割字段
local image = trim(fields[1] or '');
local skill_name = trim(fields[2] or '');
local alt_name = trim(fields[3] or '');
-- The display name of skills: 使用替代名稱,如果沒有則用原始名稱
local v_display_name = (alt_name ~= '' and abbr ~= 'MS' and abbr ~= 'Wed') and alt_name or skill_name;
if (is_localized and abbr ~= 'MS' and l_display_names ~= nil and l_display_names[index]) then
v_display_name = l_display_names[index];
end
-- Remove stuff like (Elesis) or (Elsword) in skill display name
v_display_name = v_display_name:gsub("%s%([%w%s%/]+%)", "");
-- Append the actual skills.
local skill_entry = content:tag('div'):addClass(
'skill-nav-skill tone-7-hover color-normal-force-link tone-8-active');
local skill_icon = skill_entry:tag('div'):addClass('skill-nav-image');
if (mod) then
-- [Mod] case
skill_entry:wikitext('[[' .. skill_name .. link_suffix .. lang_suffix .. '|' .. v_display_name .. ']]');
skill_icon:wikitext(frame:expandTemplate{
title = 'Force',
args = {
image,
link = skill_name,
language = args.lang,
size = '3',
class = force_class
}
});
else
-- Normal skill case
if (abbr == 'MS' or abbr == 'Wed') then
-- Master Skill/Wedding Skill case
skill_entry:wikitext('[[' .. v_display_name .. ']]');
else
skill_entry:wikitext('[[' .. skill_name .. lang_suffix .. '|' .. v_display_name .. ']]');
end
skill_icon:wikitext('[[File:' .. image .. '|30px|link=' .. skill_name .. lang_suffix .. ']]');
end
end
end
end
end
-- Append the Force Skill Navigation if needed.
local force_nav = ''
if (args.FS == 'true') then
force_nav = frame:expandTemplate{
title = 'ForceSkillNav' .. lang_suffix,
args = {
type = 'mw-collapsible mw-collapsed',
char = colors,
Color = args.color,
parent_name = args.name
}
}
end
-- Output point
return tostring(skill_nav) .. force_nav;
end
return p