Module:Utils: Difference between revisions
From Eco - English Wiki
[unchecked revision] | [unchecked revision] |
m Use tabs for indentation, as per MediaWiki coding conventions. |
Add documentation to functions with author info. |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- Trims and parses the args into a table, then returns the table | --- Trims and parses the args into a table, then returns the table | ||
-- @author User:Avaren | |||
function p.normaliseArgs(frame) | function p.normaliseArgs(frame) | ||
local origArgs = frame:getParent().args | local origArgs = frame:getParent().args | ||
Line 16: | Line 17: | ||
end | end | ||
--- Get path to icon file. | |||
-- @author User:Avaren | |||
function p.checkImage(name, too_expensive) | function p.checkImage(name, too_expensive) | ||
local icon = name:gsub('%s+', '') .. '_Icon.png' | local icon = name:gsub('%s+', '') .. '_Icon.png' | ||
Line 29: | Line 32: | ||
end | end | ||
--- Check if <code>item</code> is in given <code>array</code>. | |||
-- @param item Item to look for | |||
-- @param #table array Table to check | |||
-- @return #bool <code>true</code> if <code>item</code> is in <code>array</code> | |||
-- @author User:Avaren | |||
local function in_array(item, array) | local function in_array(item, array) | ||
-- Should only use on short arrays | -- Should only use on short arrays | ||
Line 38: | Line 46: | ||
end | end | ||
---@param name string | --- Build HTML code for an icon image. | ||
-- @param name string | |||
-- @param size string|nil One of: <code>"iconNormal"</code> (64px) or <code>"iconRecipe"</code> (44px). Default: <code>"iconNormal"</code> | |||
-- @param bg string|nil | |||
-- @param border string|nil | |||
-- @param too_expensive boolean|nil | |||
-- @author User:Avaren | |||
function p.build_icon(name, link, size, bg, border, too_expensive) | function p.build_icon(name, link, size, bg, border, too_expensive) | ||
local L = require('Module:Localization') -- local import | local L = require('Module:Localization') -- local import | ||
Line 120: | Line 128: | ||
end | end | ||
--- Get HTML code for an icon image. | |||
-- @author User:Avaren | |||
function p.Icon(frame) | function p.Icon(frame) | ||
args = p.normaliseArgs(frame) | args = p.normaliseArgs(frame) | ||
Line 125: | Line 135: | ||
end | end | ||
-- mw.LoadData prevents # | --- Calculate the length of a table by iterating over every item in it. | ||
-- | |||
-- <code>mw.LoadData</code> prevents <code>#tbl</code> from working correctly. | |||
-- @param #table tbl Table to calculate the length of | |||
-- @return #number Length of the table. | |||
-- @author User:Avaren | |||
function p.tableLen(tbl) | function p.tableLen(tbl) | ||
local count = 0 | local count = 0 |
Revision as of 15:58, 22 February 2022
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
-- @author User:Avaren
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
--- Get path to icon file.
-- @author User:Avaren
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
--- Check if <code>item</code> is in given <code>array</code>.
-- @param item Item to look for
-- @param #table array Table to check
-- @return #bool <code>true</code> if <code>item</code> is in <code>array</code>
-- @author User:Avaren
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
--- Build HTML code for an icon image.
-- @param name string
-- @param size string|nil One of: <code>"iconNormal"</code> (64px) or <code>"iconRecipe"</code> (44px). Default: <code>"iconNormal"</code>
-- @param bg string|nil
-- @param border string|nil
-- @param too_expensive boolean|nil
-- @author User:Avaren
function p.build_icon(name, link, size, bg, border, too_expensive)
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
--- Get HTML code for an icon image.
-- @author User:Avaren
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
--- Calculate the length of a table by iterating over every item in it.
--
-- <code>mw.LoadData</code> prevents <code>#tbl</code> from working correctly.
-- @param #table tbl Table to calculate the length of
-- @return #number Length of the table.
-- @author User:Avaren
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