Module:SkillNav/zh-hant: Difference between revisions

From Elwiki
No edit summary
No edit summary
Line 3: Line 3:
local p = {}
local p = {}


-- Main process
function p.main(frame)
function p.main(frame)
     local args = getArgs(frame)
     local args = getArgs(frame);
    local isForceNav = args.forcenav ~= nil


     -- 準備技能類別
     -- Making life easier.
     local skill_types
    function inArgs(name)
     if not isForceNav then
        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 = {{
         skill_types = {{
             name = args.l_hyper,
             name = args.l_hyper, -- 'Hyper Active',
             abbr = 'HA'
             abbr = 'HA'
         }, {
         }, {
             name = args.l_secret,
             name = args.l_secret, -- 'Secret Art',
             abbr = 'SeA'
             abbr = 'SeA'
         }, {
         }, {
             name = args.l_special,
             name = args.l_special, -- 'Special Active',
             abbr = 'SA'
             abbr = 'SA'
         }, {
         }, {
             name = args.l_active,
             name = args.l_active, -- 'Active',
             abbr = 'A'
             abbr = 'A'
         }, {
         }, {
             name = args.l_mod,
             name = args.l_mod, -- 'Force Mod',
             abbr = 'FC',
             abbr = 'FC',
             mod = true,
             mod = true,
             link_suffix = '/Mod'
             link_suffix = '/Mod'
         }, {
         }, {
             name = args.l_mod2,
             name = args.l_mod2, -- 'Base Mod',
             abbr = 'FC2',
             abbr = 'FC2',
             mod = true,
             mod = true,
             force_class = 'base'
             force_class = 'base'
         }, {
         }, {
             name = args.l_buff,
             name = args.l_buff, -- 'Buff',
             abbr = 'B'
             abbr = 'B'
         }, {
         }, {
             name = args.l_passive,
             name = args.l_passive, -- 'Passive',
             abbr = 'P'
             abbr = 'P'
         }, {
         }, {
             name = args.l_demon,
             name = args.l_demon, -- 'Manic Demon',
             abbr = 'MD'
             abbr = 'MD'
         }, {
         }, {
             name = '[[File:ForceIcon.png|16px]] ' .. args.l_demon,
             name = '[[File:ForceIcon.png|16px]] ' .. args.l_demon, -- 'Manic Demon (Force)',
             abbr = 'MDF',
             abbr = 'MDF',
             mod = true,
             mod = true,
             link_suffix = '/Mod'
             link_suffix = '/Mod'
         }, {
         }, {
             name = args.l_master,
             name = args.l_master, -- 'Master Skill',
             abbr = 'MS'
             abbr = 'MS'
         }, {
         }, {
             name = args.l_couple,
             name = args.l_couple, -- 'Couple Skill',
             abbr = 'Wed'
             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;
     end
     end


     -- 設定角色名稱
     -- Needed this to make a custom toggle.
     if args.name == nil then
    local char_name_sanitized = '';
         args.name = args.Name
    local char_name = args.name;
     if (isForceNav and args.parent_name ~= nil) then
         char_name = args.parent_name;
    end
    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
     end


     local skill_nav = mw.html.create('div'):addClass('skill-nav')
    -- Main block
     if isForceNav then
     local skill_nav = mw.html.create('div'):addClass('skill-nav');
         skill_nav:addClass('force-nav')
     if (isForceNav) then
         skill_nav:addClass('force-nav');
     end
     end


     -- 設定標題
     -- Header
     local header = skill_nav:tag('div'):addClass('skill-nav-header')
     local header = skill_nav:tag('div'):addClass('skill-nav-header');
     local colors = args.color or frame:expandTemplate{
     local colors;
        title = 'ColorSel',
    if (args.color ~= nil) then
        args = {'Character', args.char}
        colors = args.color;
    }
    else
    colors = colors:gsub('#', '#')
        colors = frame:expandTemplate{
     header:css('background-color', colors)
            title = 'ColorSel',
            args = {'Character', args.char}
        };
     end


     -- 設定標題文字
     -- Redirect to language subpages if provided.
     if args.l_name == nil then
     local is_localized = args.lang ~= nil;
         args.l_name = args.name
    local lang_suffix = '';
    if (is_localized) then
         lang_suffix = '/' .. args.lang;
     end
     end
     local headerText = header:tag('span'):addClass('skill-nav-title')
 
     if not isForceNav then
    colors = colors:gsub('#', '#')
         headerText:wikitext('[[' .. args.name .. '|' .. args.l_name .. ']] - ' .. args.l_skills)
   
    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,
                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;
    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);
     else
     else
         headerText:wikitext(args.name)
         headerText:wikitext(args.name);
     end
     end


     -- 技能欄位內容
     -- Generate the navigation's body
     local skill_nav_wrap = skill_nav:tag('div'):addClass('skill-nav-inner-wrap border-color')
     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]; [Alternative Names]; [image.extension]; [name]; [Alternative Names]; (...)
            local skills = split(args[abbr], ';');
            if (abbr == 'Wed') then
                skills = {
                    'RelationSkill1.png', 'Extreme Heavenly Love' .. lang_suffix .. '|' .. args.l_couple_skill_name, '',
                    'RelationSkill2.png', 'Extreme Heavenly Bond' .. lang_suffix .. '|' .. args.l_soulmate_skill_name, ''
                }
            end
            -- Separate syntax for Master Skills: [Stage 1 image]; [Stage 2 image]; [Stage 3 image]; [Stage 4 image]; [skill name]; [alt names];
            local mc_skill_name = ''
            local mc_skill_name_head = ''
            if (abbr == 'MS') then
                mc_skill_name = skills[5];
                mc_skill_name = mc_skill_name:gsub('ä', 'a');
                local l_mc_skill_name = skills[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;
                skills[7] = skills[4];
                skills[5] = skills[3];
                skills[3] = skills[2];
                skills[8] = mc_skill_name .. '/Stage 4' .. lang_suffix .. '|' .. args.l_stage .. ' 4';
                skills[6] = mc_skill_name .. '/Stage 3' .. lang_suffix .. '|' .. args.l_stage .. ' 3';
                skills[4] = mc_skill_name .. '/Stage 2' .. lang_suffix .. '|' .. args.l_stage .. ' 2';
                skills[2] = mc_skill_name .. '/Stage 1' .. lang_suffix .. '|' .. args.l_stage .. ' 1';
                skills[9] = ''; -- Add empty alt names for consistency
            end
            local i = 1;


    -- 產生技能導航內容
            -- If Force Nav, append an extra header before "Force Active" if needed.
    for _, v2 in pairs(skill_types) do
            if (abbr == 'FA3' or abbr == 'FAM') then
        local name = v2.name
                local extra_head = skill_nav_wrap:tag('div'):addClass(
        local abbr = v2.abbr
                    'skill-nav-sub-head skill-nav-extra-head border-color tone-7 color-normal-force-link');
        local mod = v2.mod
                if (type == 'third') then
        local link_suffix = v2.link_suffix or ''
                    extra_head:wikitext('[[3rd Jobs' .. lang_suffix .. '|' .. args.l_third_job .. ']]');
                elseif (type == 'master') then
                    extra_head:wikitext('[[Master Class' .. lang_suffix .. '|' .. args.l_master_class .. ']]');
                end
            end


        if args[abbr] then
            -- Append header fields on the left.
             local skills = split(args[abbr], ';') -- 技能列表
             skill_nav_wrap:tag('div'):addClass('skill-nav-sub-head border-color tone-4'):wikitext(name ..
            local i = 1
                                                                                                      mc_skill_name_head);


             skill_nav_wrap:tag('div'):addClass('skill-nav-sub-head border-color tone-4'):wikitext(name)
             -- Get localized names
             local content = skill_nav_wrap:tag('div'):addClass('skill-nav-skill-content border-color tone-6')
             local l_display_names = nil;
            if (abbr ~= 'MS' and args['l_' .. abbr] ~= nil) then
                l_display_names = split(args['l_' .. abbr], ";");
            end


             for _, skill_data in pairs(skills) do
             -- Append skill fields on the right.
                if skill_data then
            local content = skill_nav_wrap:tag('div'):addClass('skill-nav-skill-content border-color tone-6');
                    local skill_parts = split(skill_data, ',')
            while i <= #skills do
                    local skill_icon = trim(skill_parts[1]) -- 圖片檔案
                if (skills[i] and skills[i+1] and skills[i+2]) then -- Check if all three parts exist
                     local skill_link = trim(skill_parts[2]) -- 跳轉連結
                    local image = skills[i];
                     local skill_display_name = trim(skill_parts[3]) -- 顯示名稱
                     local skill_name = skills[i+1];
                     local alt_names = skills[i+2];


                     local skill_entry = content:tag('div')
                    -- The display name of skills
                         :addClass('skill-nav-skill tone-7-hover color-normal-force-link tone-8-active')
                     local v_display_name = skill_name;
                     skill_entry:wikitext('[[' .. skill_link .. '|' .. skill_display_name .. ']]')
                    if (is_localized and abbr ~= 'MS' and l_display_names ~= nil and l_display_names[math.floor(i/3)+1]) then
                         v_display_name = l_display_names[math.floor(i/3)+1];
                    end
                    -- Remove stuff like (Elesis) or (Elsword) in skill display name
                     v_display_name = v_display_name:gsub("%s%([%w%s%/]+%)", "");


                     local skill_icon_div = skill_entry:tag('div'):addClass('skill-nav-image')
                    -- Append the actual skills.
                     if mod then
                     local skill_entry = content:tag('div'):addClass(
                         skill_icon_div:wikitext(frame:expandTemplate{
                        '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 .. ']]' .. (alt_names ~= '' and ' (' .. alt_names .. ')' or ''));
                        skill_icon:wikitext(frame:expandTemplate{
                             title = 'Force',
                             title = 'Force',
                             args = {
                             args = {
                                 skill_icon,
                                 trim(image),
                                 link = skill_link,
                                 link = skill_name,
                                 size = '3'
                                language = args.lang,
                                 size = '3',
                                class = force_class
                             }
                             }
                         })
                         });
                     else
                     else
                         skill_icon_div:wikitext('[[File:' .. skill_icon .. '|30px|link=' .. skill_link .. ']]')
                         -- Normal skill case
                        if (abbr == 'MS' or abbr == 'Wed') then
                            -- Master Skill/Wedding Skill case
                            skill_entry:wikitext('[[' .. v_display_name .. ']]' .. (alt_names ~= '' and ' (' .. alt_names .. ')' or ''));
                        else
                            skill_entry:wikitext('[[' .. skill_name .. lang_suffix .. '|' .. v_display_name .. ']]' .. (alt_names ~= '' and ' (' .. alt_names .. ')' or ''));
                        end
 
                        skill_icon:wikitext('[[File:' .. trim(image) .. '|30px|link= ' .. skill_name .. lang_suffix ..
                                                ']]');
                     end
                     end
                 end
                 end
                 i = i + 1
                 i = i + 3; -- Move to the next triplet
             end
             end
         end
         end
     end
     end


     return tostring(skill_nav)
    -- 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
end


return p
return p

Revision as of 11:24, 28 March 2025

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, -- '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;
    end

    -- Needed this to make a custom toggle.
    local char_name_sanitized = '';
    local char_name = args.name;
    if (isForceNav and args.parent_name ~= nil) then
        char_name = args.parent_name;
    end
    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}
        };
    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,
                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;
    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);
    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]; [Alternative Names]; [image.extension]; [name]; [Alternative Names]; (...)
            local skills = split(args[abbr], ';');
            if (abbr == 'Wed') then
                skills = {
                    'RelationSkill1.png', 'Extreme Heavenly Love' .. lang_suffix .. '|' .. args.l_couple_skill_name, '',
                    'RelationSkill2.png', 'Extreme Heavenly Bond' .. lang_suffix .. '|' .. args.l_soulmate_skill_name, ''
                }
            end
            -- Separate syntax for Master Skills: [Stage 1 image]; [Stage 2 image]; [Stage 3 image]; [Stage 4 image]; [skill name]; [alt names];
            local mc_skill_name = ''
            local mc_skill_name_head = ''
            if (abbr == 'MS') then
                mc_skill_name = skills[5];
                mc_skill_name = mc_skill_name:gsub('ä', 'a');
                local l_mc_skill_name = skills[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;
                skills[7] = skills[4];
                skills[5] = skills[3];
                skills[3] = skills[2];
                skills[8] = mc_skill_name .. '/Stage 4' .. lang_suffix .. '|' .. args.l_stage .. ' 4';
                skills[6] = mc_skill_name .. '/Stage 3' .. lang_suffix .. '|' .. args.l_stage .. ' 3';
                skills[4] = mc_skill_name .. '/Stage 2' .. lang_suffix .. '|' .. args.l_stage .. ' 2';
                skills[2] = mc_skill_name .. '/Stage 1' .. lang_suffix .. '|' .. args.l_stage .. ' 1';
                skills[9] = ''; -- Add empty alt names for consistency
            end
            local i = 1;

            -- 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 .. ']]');
                elseif (type == 'master') then
                    extra_head:wikitext('[[Master Class' .. lang_suffix .. '|' .. args.l_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');
            while i <= #skills do
                if (skills[i] and skills[i+1] and skills[i+2]) then -- Check if all three parts exist
                    local image = skills[i];
                    local skill_name = skills[i+1];
                    local alt_names = skills[i+2];

                    -- The display name of skills
                    local v_display_name = skill_name;
                    if (is_localized and abbr ~= 'MS' and l_display_names ~= nil and l_display_names[math.floor(i/3)+1]) then
                        v_display_name = l_display_names[math.floor(i/3)+1];
                    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 .. ']]' .. (alt_names ~= '' and ' (' .. alt_names .. ')' or ''));
                        skill_icon:wikitext(frame:expandTemplate{
                            title = 'Force',
                            args = {
                                trim(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 .. ']]' .. (alt_names ~= '' and ' (' .. alt_names .. ')' or ''));
                        else
                            skill_entry:wikitext('[[' .. skill_name .. lang_suffix .. '|' .. v_display_name .. ']]' .. (alt_names ~= '' and ' (' .. alt_names .. ')' or ''));
                        end

                        skill_icon:wikitext('[[File:' .. trim(image) .. '|30px|link= ' .. skill_name .. lang_suffix ..
                                                ']]');
                    end
                end
                i = i + 3; -- Move to the next triplet
            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