Module:Util: Difference between revisions
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, | 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 | ||
-- | -- | ||
-- | -- 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 | ||
val = nil | |||
elseif t == 'boolean' then | elseif t == 'boolean' then | ||
if value then | if value then | ||
val = 1 | |||
else | else | ||
val = 0 | |||
end | end | ||
elseif t == 'number' then | elseif t == 'number' then | ||
elseif t == 'string' then | elseif t == 'string' then | ||
val = tonumber(value) | 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 | else | ||
error('"' .. value .. '" is not an integer') | |||
end | end | ||
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
This is a meta module.
This module is meant to be used only by other modules. It should not be invoked in wikitext.
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()
.
The above documentation is transcluded from Module:Util/doc.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
-- 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