17,105
edits
(round: Amend such that result remains with maxDigits dp when decimals > maxDigits) |
(Remove joinList: Exists within Scribunto provided libraries as mw.text.listToText; Indent with tabs instead of spaces) |
||
Line 25: | Line 25: | ||
--Originally snagged this from Module:VoidByReward written by User:NoBrainz | --Originally snagged this from Module:VoidByReward written by User:NoBrainz | ||
function p.skpairs(t, revert) | function p.skpairs(t, revert) | ||
local keys = {} | |||
for k in pairs(t) do keys[#keys + 1] = k end | |||
if revert ~= nil then | |||
table.sort(keys, function(a, b) return a > b end) | |||
else | |||
table.sort(keys) | |||
end | |||
local i = 0 | |||
local iterator = function() | |||
i = i + 1 | |||
local key = keys[i] | |||
if key then | |||
return key, t[key] | |||
else | |||
return nil | |||
end | |||
end | |||
return iterator | |||
end | end | ||
Line 50: | Line 50: | ||
--Taken from https://stackoverflow.com/questions/15706270/sort-a-table-in-lua | --Taken from https://stackoverflow.com/questions/15706270/sort-a-table-in-lua | ||
function p.spairs(t, order) | function p.spairs(t, order) | ||
-- collect the keys | |||
local keys = {} | |||
for k in pairs(t) do keys[#keys+1] = k end | |||
-- if order function given, sort by it by passing the table and keys a, b, | |||
-- otherwise just sort the keys | |||
if order then | |||
table.sort(keys, function(a,b) return order(t, a, b) end) | |||
else | |||
table.sort(keys) | |||
end | |||
-- return the iterator function | |||
local i = 0 | |||
return function() | |||
i = i + 1 | |||
if keys[i] then | |||
return keys[i], t[keys[i]] | |||
end | |||
end | |||
end | end | ||
Line 76: | Line 76: | ||
--Originally snagged this from Module:VoidByReward written by User:NoBrainz | --Originally snagged this from Module:VoidByReward written by User:NoBrainz | ||
function p.titleCase(head, tail) | function p.titleCase(head, tail) | ||
if tail == nil then | |||
--Split into two lines because don't want the other return from gsub | |||
local result = string.gsub(head, "(%a)([%w_']*)", p.titleCase) | |||
return result | |||
else | |||
return string.upper(head) .. string.lower(tail) | |||
end | |||
end | end | ||
Line 97: | Line 97: | ||
-- if table is not of type 'table' then return nil | -- if table is not of type 'table' then return nil | ||
function p.tableCount(table) | function p.tableCount(table) | ||
if (type(table) == 'table') then | |||
local count = 0 | |||
for _ in pairs(table) do count = count + 1 end | |||
return count | |||
else | |||
return nil | |||
end | |||
end | end | ||
Line 111: | Line 111: | ||
-- if table is not of type 'table' then return nil | -- if table is not of type 'table' then return nil | ||
function p.indexCount(table) | function p.indexCount(table) | ||
if (type(table) == 'table') then | |||
local count = 0 | |||
for _ in ipairs(table) do count = count + 1 end | |||
return count | |||
else | |||
return nil | |||
end | |||
end | end | ||
--Sorts theTable based on the listed column | --Sorts theTable based on the listed column | ||
function p.tableSort(theTable, sortCol, ascend) | function p.tableSort(theTable, sortCol, ascend) | ||
local new function sorter(r1, r2) | |||
if(ascend) then | |||
return r1[sortCol] < r2[sortCol] | |||
else | |||
return r1[sortCol] > r2[sortCol] | |||
end | |||
end | |||
table.sort(theTable, sorter) | |||
end | end | ||
Line 135: | Line 135: | ||
--For example calling splitString ("Lith V1 Relic", " ") would return {"Lith", "V1", "Relic"} | --For example calling splitString ("Lith V1 Relic", " ") would return {"Lith", "V1", "Relic"} | ||
function p.splitString(inputstr, sep) | function p.splitString(inputstr, sep) | ||
if sep == nil then | |||
sep = "%s" | |||
end | |||
local t = {} | |||
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do | |||
table.insert(t, str) | |||
end | |||
return t | |||
end | end | ||
Line 148: | Line 148: | ||
--For example calling startsWith ("Lith V1 Relic", "Lith") would return true | --For example calling startsWith ("Lith V1 Relic", "Lith") would return true | ||
function p.startsWith(string1, start) | function p.startsWith(string1, start) | ||
return string.sub(string1, 1, string.len(start)) == start | |||
end | end | ||
Line 154: | Line 154: | ||
--Adds commas | --Adds commas | ||
function p.formatnum(number) | function p.formatnum(number) | ||
local i, j, minus, int, fraction = tostring(number):find('([-]?)(%d+)([.]?%d*)') | |||
-- reverse the int-string and append a comma to all blocks of 3 digits | |||
int = int:reverse():gsub("(%d%d%d)", "%1,") | |||
-- reverse the int-string back remove an optional comma and put the | |||
-- optional minus and fractional part back | |||
return minus .. int:reverse():gsub("^,", "") .. fraction | |||
end | end | ||
Line 170: | Line 170: | ||
function p.round(val, maxDigits, minDigits) | function p.round(val, maxDigits, minDigits) | ||
if val == nil then | |||
return nil | |||
else | |||
if type(maxDigits) == "table" then | |||
minDigits = maxDigits[2] | |||
maxDigits = maxDigits[1] | |||
end | |||
local result = val.."" | |||
local decimals = string.find(result, "%.") | |||
if decimals ~= nil then | |||
decimals = string.len(result) - decimals | |||
else | |||
decimals = 0 | |||
end | |||
if maxDigits ~= nil and decimals > maxDigits then | |||
result = string.format("%."..maxDigits.."f", result) | |||
elseif minDigits ~= nil and decimals < minDigits then | |||
result = string.format("%."..minDigits.."f", result) | |||
end | |||
return result | |||
end | |||
end | end | ||
--From http://lua-users.org/wiki/SimpleRound | --From http://lua-users.org/wiki/SimpleRound | ||
function p.round2(num, numDecimalPlaces) | function p.round2(num, numDecimalPlaces) | ||
local mult = 10^(numDecimalPlaces or 0) | |||
return math.floor(num * mult + 0.5) / mult | |||
end | end | ||
Line 203: | Line 207: | ||
-- post: returns a boolean; true if element exists in List, false otherwise | -- post: returns a boolean; true if element exists in List, false otherwise | ||
function p.contains(List, Item, IgnoreCase) | function p.contains(List, Item, IgnoreCase) | ||
if List == nil or Item == nil then | |||
return false | |||
end | |||
if IgnoreCase == nil then | |||
IgnoreCase = false | |||
end | |||
if type(List) == "table" then | |||
for key, value in pairs(List) do | |||
if value == Item then | |||
return true, key | |||
elseif IgnoreCase and string.upper(value) == string.upper(Item) then | |||
return true, key | |||
end | |||
end | |||
else | |||
local start = string.find(List, Item) | |||
return start ~= nil | |||
end | |||
return false | |||
end | end | ||
Line 239: | Line 243: | ||
--User:Giga Martin | --User:Giga Martin | ||
function p.trim(str) | function p.trim(str) | ||
return (str:gsub("^%s*(.-)%s*$", "%1")) | |||
end | end | ||
Line 251: | Line 255: | ||
-- if key contains a nil value | -- if key contains a nil value | ||
function p.hasKey(table, key, length) | function p.hasKey(table, key, length) | ||
if (length == nil) then | |||
length = p.tableCount(table) | |||
end | |||
-- iterating through outer table | |||
for i = 1, length, 1 do | |||
local elem = table[i] -- storing one of inner tables into a variable | |||
if (elem[key] ~= nil) then | |||
return true | |||
end | |||
end | |||
return false | |||
end | end | ||
Line 269: | Line 273: | ||
-- Stolen from https://gist.github.com/tylerneylon/81333721109155b2d244 | -- Stolen from https://gist.github.com/tylerneylon/81333721109155b2d244 | ||
function p.clone(obj) | function p.clone(obj) | ||
if type(obj) ~= 'table' then return obj end | |||
local res = {} | |||
for k, v in pairs(obj) do res[p.clone(k)] = p.clone(v) end | |||
return res | |||
end | end | ||
-- Euclidean Greatest Common Divisor algorithm | -- Euclidean Greatest Common Divisor algorithm | ||
function p.gcd(a, b) | function p.gcd(a, b) | ||
if b ~= 0 then | |||
return p.gcd(b, a % b) | |||
else | |||
return math.abs(a) | |||
end | |||
end | end | ||
--Formats a pair of numbers as a reduced fraction | --Formats a pair of numbers as a reduced fraction | ||
function p.fraction(n, d) | function p.fraction(n, d) | ||
local gcd = p.gcd(n, d) | |||
return p.formatnum(n/gcd)..'/'..p.formatnum(d/gcd) | |||
end | end | ||
function p.timeString(timeInSeconds, shorten) | function p.timeString(timeInSeconds, shorten) | ||
local remain = timeInSeconds | |||
local days, hours, minutes = 0, 0, 0 | |||
local isShort = shorten | |||
local pieces = {} | |||
if remain >= 86400 then | |||
days = math.floor(remain / 86400) | |||
remain = remain - days * 86400 | |||
if isShort then | |||
table.insert(pieces, days..'d') | |||
elseif days > 1 then | |||
table.insert(pieces, days..' days') | |||
else | |||
table.insert(pieces, days..' day') | |||
end | |||
end | |||
if remain >= 3600 then | |||
hours = math.floor(remain / 3600) | |||
remain = remain - hours * 3600 | |||
if isShort then | |||
table.insert(pieces, hours..'h') | |||
elseif hours > 1 then | |||
table.insert(pieces, hours..' hours') | |||
else | |||
table.insert(pieces, hours..' hour') | |||
end | |||
end | |||
if remain >= 60 then | |||
minutes = math.floor(remain / 60) | |||
remain = remain - minutes * 60 | |||
if isShort then | |||
table.insert(pieces, minutes..'m') | |||
elseif minutes > 1 then | |||
table.insert(pieces, minutes..' minutes') | |||
else | |||
table.insert(pieces, minutes..' minutes') | |||
end | |||
end | |||
if remain > 0 then | |||
if isShort then | |||
table.insert(pieces, remain..'s') | |||
elseif remain > 1 then | |||
table.insert(pieces, remain..' seconds') | |||
else | |||
table.insert(pieces, remain..' second') | |||
end | |||
end | |||
return table.concat(pieces, ', ') | |||
end | end | ||
function p.fixPagename(pageName) | function p.fixPagename(pageName) | ||
local result = pageName | |||
result = string.gsub(result, "%%27", "'") | |||
result = string.gsub(result, "'", "'") | |||
return result | |||
end | end | ||
--Checks if two tables contain the same value with the same indices | --Checks if two tables contain the same value with the same indices | ||
function p.tablesEqual(t1, t2) | function p.tablesEqual(t1, t2) | ||
if p.tableCount(t1) ~= p.tableCount(t2) then return false end | |||
for i, val in p.skpairs(t1) do | |||
if type(val) ~= type(t2[i]) then | |||
return false | |||
elseif type(val) == 'table' then | |||
if not p.tablesEqual(val, t2[i]) then return false end | |||
elseif t2[i] ~= val then | |||
return false | |||
end | |||
end | |||
return true | |||
end | end | ||
--Returns a number including the sign, even if positive | --Returns a number including the sign, even if positive | ||
function p.numStrWithSign(number) | function p.numStrWithSign(number) | ||
if number >= 0 then | |||
return '+'..p.formatnum(number) | |||
else | |||
return p.formatnum(number) | |||
end | |||
end | end | ||
return p | return p |