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 = {}

function p.main(frame)
    local args = getArgs(frame);

    function inArgs(name)
        if (inArray(name, args)) then
            return true
        end
    end

    local isForceNav = args.forcenav ~= nil;

    local skill_types;
    if (not isForceNav) then
        skill_types = {
            { name = args.l_hyper, abbr = 'HA' },
            { name = args.l_secret, abbr = 'SeA' },
            { name = args.l_special, abbr = 'SA' },
            { name = args.l_active, abbr = 'A' },
            { name = args.l_mod, abbr = 'FC', mod = true, link_suffix = '/Mod' },
            { name = args.l_mod2, abbr = 'FC2', mod = true, force_class = 'base' },
            { name = args.l_buff, abbr = 'B' },
            { name = args.l_passive, abbr = 'P' },
            { name = args.l_demon, abbr = 'MD' },
            { name = '[[File:ForceIcon.png|16px]] ' .. args.l_demon, abbr = 'MDF', mod = true, link_suffix = '/Mod' },
            { name = args.l_master, abbr = 'MS' },
            { name = args.l_couple, abbr = 'Wed' },
            { name = args.l_row1, abbr = 'row1' },
            { name = args.l_row2, abbr = 'row2' },
            { name = args.l_row3, abbr = 'row3' },
            { name = args.l_row4, abbr = 'row4' },
        }
    else
        skill_types = {
            { name = args.l_force_active, abbr = 'FA3', type = 'third' },
            { name = args.l_force_passive, abbr = 'FP3', type = 'third' },
            { name = args.l_force_active, abbr = 'FAM', type = 'master' },
            { name = args.l_force_passive, abbr = 'FPM', type = 'master' },
        }
    end

    if (args.name == nil) then
        args.name = args.Name;
    end

    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

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

    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
    colors = colors:gsub('#', '#')

    header:css('background-color', colors);

    if (args.is_guild ~= nil) then
        header:css({ ['justify-content'] = 'center', ['background-color'] = colors });
    end

    local is_localized = args.lang ~= nil;
    local lang_suffix = '';
    if (is_localized) then
        lang_suffix = '/' .. args.lang;
    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

    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

    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
    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

    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
            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

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

            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

            skill_nav_wrap:tag('div'):addClass('skill-nav-sub-head border-color tone-4'):wikitext(name .. mc_skill_name_head);

            local l_display_names = nil;
            if (abbr ~= 'MS' and args['l_' .. abbr] ~= nil) then
                l_display_names = split(args['l_' .. abbr], ";");
            end

            local content = skill_nav_wrap:tag('div'):addClass('skill-nav-skill-content border-color tone-6');
            local i = 1;
            while i <= #skills do
                local icon = skills[i];
                local skill_name = skills[i + 1];
                local display_name = skills[i + 2] or skill_name;

                if icon == nil or skill_name == nil then break end

                if is_localized and abbr ~= 'MS' and l_display_names ~= nil then
                    display_name = l_display_names[math.ceil(i / 3)];
                end
                display_name = display_name:gsub("%s%([%w%s%/]+%)", "");

                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
                    skill_entry:wikitext('[[' .. skill_name .. link_suffix .. lang_suffix .. '|' .. display_name .. ']]');
                    skill_icon:wikitext(frame:expandTemplate{
                        title = 'Force',
                        args = {
                            trim(icon),
                            link = skill_name,
                            language = args.lang,
                            size = '3',
                            class = force_class
                        }
                    });
                else
                    if abbr == 'MS' or abbr == 'Wed' then
                        skill_entry:wikitext('[[' .. display_name .. ']]');
                    else
                        skill_entry:wikitext('[[' .. skill_name .. lang_suffix .. '|' .. display_name .. ']]');
                    end
                    skill_icon:wikitext('[[File:' .. trim(icon) .. '|30px|link=' .. skill_name .. lang_suffix .. ']]');
                end

                i = i + 3;
            end
        end
    end

    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

    return tostring(skill_nav) .. force_nav;
end

return p