ATTENTION! The process of updating WiKi to version Eco 10.x has begun. Those wishing to participate can find out more Information on our ECO Contribution Wiki Discord.
From April 26 to May 12, errors may occur in the Wiki, as we will be carrying out a major update to the information processing modules.

Module:Utils

From Eco - English Wiki
Revision as of 19:02, 16 March 2021 by Avaren (talk | contribs)

This module provides utility functions used from other modules.

Usage

Add the following line of code at the top of your file.

local Utils = require("Module:Utils")

-- You may then call functions from this module in your script. For example:
local tableLength = Utils.tableLen(myTable)

local p = {}

-- Trims and parses the args into a table, then returns the table
function p.normaliseArgs(frame)
    local origArgs = frame:getParent().args
    local args = {}

    for k, v in pairs(origArgs) do
        v = mw.text.trim(tostring(v))
        if v ~= '' then
            args[k] = v
        end
    end

    return args
end

function p.checkImage(name, too_expensive)
    local icon = name:gsub('%s+', '') .. '_Icon.png'
    if too_expensive then
        return icon
    end

    if mw.title.makeTitle('File', icon).file.exists then
        return icon
    else
        return 'NoImage.png'
    end
end

local function in_array(item, array)
    -- Should only use on short arrays
    local set = {}
    for _, l in ipairs(array) do
        set[l] = true
    end
    return set[item] ~= nil
end

---@param name string
---@param size string|nil
---@param bg string|nil
---@param border string|nil
---@param too_expensive boolean|nil
function p.build_icon(name, link, size, bg, border, too_expensive)
    -- Size options are iconNormal or iconRecipe - 64px or 44px - defaults to iconNormal

    local L = require('Module:Localization') -- local import

    if not size then
        size = 'iconNormal'
    end
    local icon_bg
    if bg then
        icon_bg = bg
    end
    local icon_border
    if border then
        icon_border = border
    end

    local item_data = mw.loadData('Module:ItemData')
    local item = item_data.items[name]
    local image
    if item then
        if item['group'] == L.t('Skill Books') then
            image = 'SkillBook.png'
            icon_bg = 'iconGold'
        elseif item['group'] == L.t('Skill Scrolls') then
            image = 'Skill Scroll'
            icon_bg = 'iconGold'
            -- Attempt to generate skill page
        elseif in_array(L.t('Basic  Research'), item['tagGroups']) then
            image = string.sub(item['untranslated'], 1, -7):gsub('%s+', '') .. '_Icon.png'
            icon_bg = 'paperBasic'
        elseif in_array(L.t('Advanced  Research'), item['tagGroups']) then
            image = string.sub(item['untranslated'], 1, -10):gsub('%s+', '') .. '_Icon.png'
            icon_bg = 'paperAdvanced'
        elseif in_array(L.t('Modern  Research'), item['tagGroups']) then
            image = string.sub(item['untranslated'], 1, -8):gsub('%s+', '') .. '_Icon.png'
            icon_bg = 'paperModern'
        else
            image = p.checkImage(item['untranslated'], too_expensive)
        end
        if not icon_bg then
            if item['group'] == L.t('Food') then
                icon_bg = 'iconGreen'
            elseif item['carried'] == L.t('Hands') then
                icon_bg = 'iconBrown'
            end
        end
    else
        image = p.checkImage(name, too_expensive)
    end

    if not icon_bg then
        icon_bg = 'iconBlue'
    end

    if border then
        icon_border = border
    else
        icon_border = 'borderBlue'
    end

    if size == 'iconNormal' then
        icon_container = 'iconContainer'
    else
        icon_container = 'iconContainerSmall'
    end

    if not link then
        link = ''
    else
        link = '|link='..link
    end

    local file = '[[File:' .. image .. '|frameless|class=' .. size .. ' ' .. icon_bg .. link ..']]'
    return '<div class="' .. icon_container .. '"><div class="iconStack">' .. file .. '</div><div class="iconBorder ' .. icon_border .. '" style="position:absolute;"></div></div>'
end

function p.Icon(frame)
    args = p.normaliseArgs(frame)
    return p.build_icon(args.name, args.link, args.size, args.bg, args.border, args.too_expensive)
end

-- mw.LoadData prevents #table from working correctly
function p.tableLen(tbl)
    local count = 0
    for _, v in ipairs(tbl) do
        if v == nil then
            return count
        end
        count = count + 1
    end
    return count
end

return p