Module:Util: Difference between revisions

From Path of Exile 2 Wiki
Jump to navigation Jump to search
>OmegaK2
(added func to get category that avoids adding it to subpages or namespaces)
>OmegaK2
(turned the arguments for util.cast.number into a table, added min/max arguments, added find_in_nested_array function)
Line 32: Line 32:
end
end


function util.cast.number(value, default)
function util.cast.number(value, args)
     -- Takes an abitary value and attempts to cast it to int
     -- Takes an abitary value and attempts to cast it to int
     --
     --
     -- For strings: if default is nil and the conversion fails, an error will be returned
     -- args:
    --  default: for strings, if default is nil and the conversion fails, an error will be returned
    --  min: error if <min
    --  max: error if >max
     local t = type(value)
     local t = type(value)
   
    local val
      
      
     if t == 'nil' then
     if t == 'nil' then
         return 0
         val = nil
     elseif t == 'boolean' then
     elseif t == 'boolean' then
         if value then
         if value then
             return 1
             val = 1
         else
         else
             return 0
             val = 0
         end
         end
     elseif t == 'number' then
     elseif t == 'number' then
        return value
     elseif t == 'string' then
     elseif t == 'string' then
         val = tonumber(value)
         val = tonumber(value)
        if val == nil then
    else
            if default ~= nil then
        error('"' .. value .. ' is of uncaptured type "' .. t .. '"')
                return default
    end
            else
   
                error('"' .. value .. '" is not an integer')
    if val == nil then
             end
        if args.default ~= nil then
             val = args.default
         else
         else
             return val
             error('"' .. value .. '" is not an integer')
         end
         end
    else
        error('"' .. value .. ' is of uncaptured type "' .. t .. '"')
     end
     end
   
    if args.min ~= nil and val < args.min then
        error('"' .. val .. '" is too small. Minimum: "' .. args.min .. '"')
    end
   
    if args.max ~= nil and val > args.max then
        error('"' .. val .. '" is too large. Maximum: "' .. args.max .. '"')
    end
   
    return val
end
end


Line 74: Line 87:
          
          
     return tostring(tag)
     return tostring(tag)
end
util.table = {}
function util.table.find_in_nested_array(args)
    -- Iterates thoguh the given nested array and finds the given value
    --
    -- ex. 
    -- data = {
    -- {a=5}, {a=6}}
    -- find_nested_array{arg=6, tbl=data, key='a'} -> 6
    -- find_nested_array(arg=10, tbl=data, key='a'} -> nil
    -- -> returns "6"
   
    --
    -- args: Table containing:
    --  arg: value of the argument
    --  tbl: table of valid options
    --  key: key or table of key of in tbl
    --  rtrkey: if key is table, return this key instead of the value instead
    --  rtrvalue: default: true
   
    local rtr
   
    if type(args.key) == 'table' then
        for _, item in ipairs(args.tbl) do
            for _, k in ipairs(args.key) do
                if item[k] == args.arg then
                    rtr = item
                    break
                end
            end
        end
    elseif args.key == nil then
        for _, item in ipairs(args.tbl) do
            if item == args.arg then
                rtr = item
                break
            end
        end
    else
        for _, item in ipairs(args.tbl) do
            if item[args.key] == args.arg then
                rtr = item
                break
            end
        end
    end
   
    if rtr == nil then
        return rtr
    end
   
    if args.rtrvalue or args.rtrvalue == nil then
        return args.arg
    end
   
    if args.rtrkey ~= nil then
        return rtr[args.rtrkey]
    else
        return rtr
    end
end
end



Revision as of 11:24, 26 September 2015

Module documentation[view] [edit] [history] [purge]


This is a meta module.

This module is meant to be used only by other modules. It should not be invoked in wikitext.

Lua logo

This module depends on the following other modules:

Overview

Provides utility functions for programming modules.

Structure

Group Description
util.cast utilities for casting values (i.e. from arguments)
util.html shorthand functions for creating some html tags
util.misc miscellaneous functions

Usage

This module should be loaded with require().

-- Utility stuff

local util = {}

util.cast = {}
util.cast.bool_false = {'false', '0', 'disabled', 'off', 'no', ''}

function util.cast.boolean(value)
    -- Takes an abitary value and casts it to a bool value
    -- 
    -- for strings false will be according to util.cast.bool_false
    local t = type(value)
    if t == 'nil' then
        return false
    elseif t == 'boolean' then
        return value
    elseif t == 'number' then
        if t == 0 then return false end
        return true
    elseif t == 'string' then
        local tmp = string.lower(value)
        for _, v in ipairs(util.cast.bool_false) do
            if v == tmp then
                return false
            end
        end
        return true
    else
        error('"' .. value .. ' is of uncaptured type "' .. t .. '"')
    end
    
end

function util.cast.number(value, args)
    -- Takes an abitary value and attempts to cast it to int
    --
    -- args:
    --  default: for strings, if default is nil and the conversion fails, an error will be returned
    --  min: error if <min
    --  max: error if >max
    local t = type(value)
    
    local val
    
    if t == 'nil' then
        val = nil
    elseif t == 'boolean' then
        if value then
            val = 1
        else
            val = 0
        end
    elseif t == 'number' then
    elseif t == 'string' then
        val = tonumber(value)
    else
        error('"' .. value .. ' is of uncaptured type "' .. t .. '"')
    end
    
    if val == nil then
        if args.default ~= nil then
            val = args.default
        else
            error('"' .. value .. '" is not an integer')
        end
    end
    
    if args.min ~= nil and val < args.min then
        error('"' .. val .. '" is too small. Minimum: "' .. args.min .. '"')
    end
    
    if args.max ~= nil and val > args.max then
        error('"' .. val .. '" is too large. Maximum: "' .. args.max .. '"')
    end
    
    return val
end

util.html = {}
function util.html.abbr(abbr, text, class)
    tag = mw.html.create('abbr')
    tag
        :attr('title', text or '')
        :attr('class', class or '')
        :wikitext(abbr or ' ')
        :done()
        
    return tostring(tag)
end

util.table = {}
function util.table.find_in_nested_array(args) 
    -- Iterates thoguh the given nested array and finds the given value
    -- 
    -- ex.   
    -- data = {
    -- {a=5}, {a=6}}
    -- find_nested_array{arg=6, tbl=data, key='a'} -> 6
    -- find_nested_array(arg=10, tbl=data, key='a'} -> nil
    -- -> returns "6"
    
    --
    -- args: Table containing:
    --  arg: value of the argument
    --  tbl: table of valid options
    --  key: key or table of key of in tbl
    --  rtrkey: if key is table, return this key instead of the value instead
    --  rtrvalue: default: true
    
    local rtr
    
    if type(args.key) == 'table' then
        for _, item in ipairs(args.tbl) do
            for _, k in ipairs(args.key) do
                if item[k] == args.arg then
                    rtr = item
                    break
                end
            end
        end
    elseif args.key == nil then
        for _, item in ipairs(args.tbl) do
            if item == args.arg then
                rtr = item
                break
            end
        end
    else
        for _, item in ipairs(args.tbl) do
            if item[args.key] == args.arg then
                rtr = item
                break
            end
        end
    end
    
    if rtr == nil then
        return rtr
    end
    
    if args.rtrvalue or args.rtrvalue == nil then
        return args.arg
    end
    
    if args.rtrkey ~= nil then 
        return rtr[args.rtrkey]
    else
        return rtr
    end
end

util.misc = {}
function util.misc.get_frame(frame)
    if frame == nil or type(frame) == 'table' then
        frame = mw.getCurrentFrame()
    end
    return frame
end

function util.misc.add_category(categories, namespace)
    if type(categories) == 'string' then
        categories = {categories}
    end
    
    
    local title = mw.title.getCurrentTitle()
    local sub_blacklist = {
        doc = true,
        sandbox = true,
        sandbox2 = true,
        testcases = true,
    }
    
    if namespace ~= nil and title.namespace ~= namespace then
        return ''
    end
    
    if sub_blacklist[title.subpageText] then
        return ''
    end
   
    local cats = {}
    
    for i, cat in ipairs(categories) do
        cats[i] = string.format('[[Category:%s]]', cat)
    end
    return table.concat(cats)
end

return util