Module:SkillNav: Difference between revisions

From Elwiki
No edit summary
No edit summary
Line 93: Line 93:
     end
     end
     -- Append a custom toggle if needed.
     -- Append a custom toggle if needed.
     if (string.find(args.type, 'mw-collapsible')) then
     if (args.type ~= nil and string.find(args.type, 'mw-collapsible')) then
        header:tag('div'):addClass('mw-customtoggle-' .. char_name_sanitized);
            header:tag('div'):addClass('mw-customtoggle-' .. char_name_sanitized);
     end
     end



Revision as of 23:35, 16 June 2022

Documentation for this module may be created at Module:SkillNav/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

    -- Prepare a table of skill types to display in the navigation.
    local skill_types = {
        [1] = {
            ['name'] = 'Hyper Active',
            ['abbr'] = 'HA'
        },
        [2] = {
            ['name'] = 'Secret Art',
            ['abbr'] = 'SeA'
        },
        [3] = {
            ['name'] = 'Special Active',
            ['abbr'] = 'SA'
        },
        [4] = {
            ['name'] = 'Active',
            ['abbr'] = 'A'
        },
        [5] = {
            ['name'] = 'Force Mod',
            ['abbr'] = 'FC'
        },
        [6] = {
            ['name'] = 'Buff',
            ['abbr'] = 'B'
        },
        [7] = {
            ['name'] = 'Passive',
            ['abbr'] = 'P'
        },
        [8] = {
            ['name'] = 'Manic Demon',
            ['abbr'] = 'MD'
        },
        [9] = {
            ['name'] = '[[File:ForceIcon.png|16px]] Manic Demon',
            ['abbr'] = 'MDF'
        },
        [10] = {
            ['name'] = 'Master Skill',
            ['abbr'] = 'MS'
        },
        [11] = {
            ['name'] = 'Couple Skill',
            ['abbr'] = 'Wed'
        }
    }

    -- 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 = args.name:gsub("%s", ""):gsub("'", "");

    -- Main block
    local skill_nav = mw.html.create('div'):addClass('skill-nav');

    -- Header
    local header = skill_nav:tag('div'):addClass('skill-nav-header')
    header:attr('style', 'background-color:' .. frame:expandTemplate{
        title = 'ColorSel',
        args = {'Character', args.char}
    }):wikitext(frame:expandTemplate{
        title = 'Face',
        args = {
            args.char,
            args.pic,
            link = args.name,
            scale = '0.75'
        }
    })
    -- Header text with a link
    header:tag('span'):wikitext('[[' .. args.name .. ']] - Skills');
    local skill_nav_wrap = skill_nav:tag('div'):addClass('skill-nav-inner-wrap border-color'):attr('id', 'mw-customcollapsible-' .. char_name_sanitized);
    if (args.type ~= nil) then
        skill_nav_wrap:addClass(args.type);
    end
    -- Append a custom toggle if needed.
    if (args.type ~= nil and string.find(args.type, 'mw-collapsible')) then
            header:tag('div'):addClass('mw-customtoggle-' .. char_name_sanitized);
    end

    -- Generate the navigation's body.
    for k2, v2 in spairs(skill_types) do
        local name = v2['name'];
        local abbr = v2['abbr'];
        if (inArgs(abbr)) then
            local skills = split(args[abbr], ';');
            if (abbr == 'Wed') then
                skills = {'CSZE.png', 'Extreme Heavenly Love'}
            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
                mc_skill_name = skills[5];
                mc_skill_name_head = '<br/>- ' .. mc_skill_name;
                skills[7] = skills[4];
                skills[5] = skills[3];
                skills[3] = skills[2];
                skills[8] = mc_skill_name .. '/Stage 4|Stage 4';
                skills[6] = mc_skill_name .. '/Stage 3|Stage 3';
                skills[4] = mc_skill_name .. '/Stage 2|Stage 2';
                skills[2] = mc_skill_name .. '/Stage 1|Stage 1';
            end
            local i = 1;
            -- 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);
            -- Append skill fields on the right.
            local content = skill_nav_wrap:tag('div'):addClass('skill-nav-skill-content border-color tone-6');
            for k, v in pairs(skills) do
                if v == nil then
                    return
                end
                -- Remove stuff like (Elesis) or (Elsword) in skill display name
                local v_display_name = v:gsub("%s%(%w+%)", "");
                -- Fetch skills every 2 table elements, since we don't want doubles.
                if (i % 2 == 0) then
                    -- 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 (abbr == 'FC' or abbr == 'MDF') then
                        -- [Mod] case
                        skill_entry:wikitext('[[' .. v .. '/ModA|' .. v_display_name .. ']]');
                        skill_icon:wikitext(frame:expandTemplate{
                            title = 'Force',
                            args = {
                                trim(skills[i - 1]), -- closest smaller odd element will be the icon
                                link = v,
                                size = '3'
                            }
                        });
                    else
                        -- Normal skill case
                        if (abbr == 'MS') then
                            -- Master Skill case
                            skill_entry:wikitext('[[' .. v_display_name .. ']]');
                        else
                            skill_entry:wikitext('[[' .. v .. '|' .. v_display_name .. ']]');
                        end
                        
                        skill_icon:wikitext('[[File:' .. trim(skills[i - 1]) .. '|30px|link= ' .. v .. ']]');
                    end
                end
                i = i + 1;
            end
        end
    end

    -- Append the Force Skill Navigation if needed.
    local force_nav = ''
    if (args.FS == 'true') then
        force_nav = frame:expandTemplate{
            title = 'ForceSkillNav',
            args = {
                Class = 'mw-collapsible mw-collapsed',
                Color = frame:expandTemplate{
                    title = 'ColorSel',
                    args = {'Character', args.char}
                }
            }
        }
    end

    -- Output point
    return tostring(skill_nav) .. force_nav;

end

return p