Module:Traits

From Elwiki
Revision as of 15:50, 24 August 2022 by Ritsu (talk | contribs)

Documentation for this module may be created at Module:Traits/doc

require('Module:CommonFunctions')
local getArgs = require('Module:Arguments').getArgs
local p = {}

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

    -- Argument init
    local traits = args[3]
    if (traits == nil) then
        traits = '-, -'
    end
    traits = split(traits);
    local skill = args[2]

    -- Attribute effect
    local effects = {
        [1] = {},
        [2] = {}
    }
    args.effects1 = args.effects1 or args[4]
    args.effects2 = args.effects2 or args[5]
    if args.effects1 ~= nil then
        effects[1] = split(args.effects1)
    end
    if args.effects2 ~= nil then
        effects[2] = split(args.effects2)
    end

    local desc = {}

    -- Extra effects
    local counts = {}
    local desc_arg = nil;
    local header_data = {}
    local headers={};
    for i = 1, 2, 1 do
        if (i == 1) then
            desc_arg = args[6]
        else
            desc_arg = args[7]
        end

        if desc_arg == nil then
            desc_arg = args['desc' .. i]
        end

        if desc_arg ~= nil then
            traits[i] = trim(traits[i]);
            local data_split = split(desc_arg, ';');
            --local headers;
            local data;

            if (#data_split >= 2) then
                headers = split(data_split[1]);
                data = data_split[2];
            else
                data = data_split[1];

                -- Generate headers based on trait.
                if (traits[i] == 'Light' or traits[i] == 'Critical') then
                    headers = {
                        [1] = 'MP Usage'
                    }
                elseif (traits[i] == 'Heavy' or traits[i] == 'Haste' or traits[i] == 'Regenerating (2)' or traits[i] ==
                    'Ruthless' or traits[i] == 'Powerful') then
                    headers = {
                        [1] = 'Cooldown'
                    }
                elseif (traits[i] == 'Reversed') then
                    headers = {
                        [1] = 'Cooldown',
                        [2] = 'MP Usage'
                    }
                elseif (traits[i] == 'Regenerating (1)') then
                    headers = {
                        [1] = 'MP Recovery'
                    }
                elseif (traits[i] == 'Killing Blow (1)') then
                    headers = {
                        [1] = 'Duration'
                    }
                else
                    headers = {}
                end

            end

            if (header_data[i] == nil) then
                header_data[i] = {}
            end

            for k, v in spairs(headers) do
                table.insert(header_data[i], trim(v))
            end

            data = split(data);
            counts[i] = 1 + #headers;

            if (desc[i] == nil) then
                desc[i] = {}
            end

            local index = 1
            while index <= #headers do
                desc[i][index] = {}
                desc[i][index][headers[index]] = trim(data[index])
                index = index + 1
            end
        end

    end

    -- Main block
    local trait_table = mw.html.create('table'):attr({
        ['cellpadding'] = '5',
        ['border'] = '1'
    }):css({
        ['border-collapse'] = 'collapse',
        ['text-align'] = 'center'
    })

    -- Get table head color
    local function color(char)
        char = char or args[1]
        return frame:expandTemplate{
            title = 'ColorSel',
            args = {'CharLight', char}
        }:gsub("&#35;", "#")
    end

    function newtr()
        return trait_table:tag('tr'):css('background-color', color())
    end

    -- Spawn headers
    local thead = newtr()
    thead:tag('th'):attr('colspan', counts[1]):wikitext(traits[1] .. ' ' .. skill)
    thead:tag('th'):attr('colspan', counts[2]):wikitext(traits[2] .. ' ' .. skill)

    local no_desc;

    local tr_2 = newtr();
    for i = 1, 2, 1 do
        no_desc = args['desc' .. i] == nil and args[6] == nil and args[7] == nil;
        tr_2:tag('th'):wikitext('Attribute Effect')
        if not (no_desc or header_data[i] == nil) then
            for k, v in ipairs(header_data[i]) do
                v = frame:preprocess(v);
                tr_2:tag('th'):wikitext(v)
            end
        end
    end

    -- Spawn information
    local tr = trait_table:tag('tr')
    for i = 1, 2, 1 do
        no_desc = args['desc' .. i] == nil and args[6] == nil and args[7] == nil;
        tr:tag('td'):wikitext(frame:expandTemplate{
            title = 'SkillText',
            args = {traits[i], effects[i][1], effects[i][2]}
        })
        if not (no_desc or desc[i] == nil) then
            for k, v in ipairs(desc[i]) do
                for k2, v2 in pairs(desc[i][k]) do
                    local expr_header_table = {
                        [1] = 'Cooldown',
                        [2] = 'MP Usage',
                        [3] = 'MP Recovery',
                        [4] = 'Duration'
                    }
                    if (table.containsValue(expr_header_table, k2)) then
                        v2 = '{{#expr:' .. v2 .. '}}'
                        if (k2 == expr_header_table[2] or k2 == expr_header_table[3]) then
                            v2 = v2 .. ' MP'
                        else
                            v2 = v2 .. ' Seconds'
                        end
                    end
                    tr:tag('td'):wikitext(frame:preprocess(v2))
                end
            end
        end
    end

    -- Output point
    return tostring(trait_table);

end

return p