Module:Functions

local p = {}

local function lefttrim(str) return str:match( "^%s*(.+)" ) end local function righttrim(str) return str:match( "(.-)%s*$" ) end local function trim(str) return str:match( "^%s*(.-)%s*$" ) end

local function has_value (tab, val) for index, value in ipairs(tab) do       if value == val then return true end end

return false end local function length(tab) local c = 0 if(tab == nil) then return 0 end for i in pairs(tab) do		c = c+1 end return c end local function range(a, b, step) if not b then b = a   a = 1 end step = step or 1 local f = step > 0 and function(_, lastvalue) local nextvalue = lastvalue + step if nextvalue <= b then return nextvalue end end or   step < 0 and function(_, lastvalue) local nextvalue = lastvalue + step if nextvalue >= b then return nextvalue end end or     function(_, lastvalue) return lastvalue end return f, nil, a - step end

local function replace(str,what,with,c) with = with or "" value, count = str:gsub(what, with) if(c) then return count end return value end local function split(str, sep) if sep == nil then sep = "%s" end local t={} for a in string.gmatch(str, "([^"..sep.."]+)") do               table.insert(t, a)        end return t end local function round(val, decimal) if (decimal) then return math.floor( (val * 10^decimal) + 0.5) / (10^decimal) else return math.floor(val+0.5) end end local function numbers(number) local lang = mw.language.getContentLanguage:getCode local fN = require('Dev:Formatnum').formatNum return fN(tonumber(number), lang) end function compareLess(x, y)   return x[1] < y[1] end function compareMore(x, y)   return x[1] > y[1] end function tableSort(table1,table2,more) for i,v in ipairs(table1) do       table1[i] = {table1[i], table2[i]} end if more == 'less' then table.sort(table1, compareLess) else table.sort(table1, compareMore) end for i, v in ipairs(table1) do       table1[i] = v[1] table2[i] = v[2] end return table2 end

function upperFirstLetter(str) if(str ~= nil and str ~= "") then return (str:gsub("^%l", string.upper)) end return "" end

function noPage(frame, pagename, content) return frame:expandTemplate{title = "createpageifnotex", args={ NS_MAIN = pagename, NS_TEMPLATE = content }} end

function time(seconds) if(hasValue(seconds) ~= seconds) then return "?" end local seconds = tonumber(seconds) if seconds <= 0 then return "0S"; else toReturn = "" days = string.format("%01.f", math.floor(seconds/86400)); hours = string.format("%01.f", math.floor(seconds/3600 - (days*24))); mins = string.format("%01.f", math.floor(seconds/60 - (days*1440)-(hours*60))); secs = string.format("%01.f", math.floor(seconds - (days*86400)- hours*3600 - mins *60)); if(tonumber(days)>0) then toReturn = toReturn..days.."D "; end if(tonumber(hours)>0) then toReturn = toReturn..hours.."H "; end if(tonumber(mins)>0) then toReturn = toReturn..mins.."M "; end if (tonumber(secs)>0) then toReturn = toReturn..secs.."S"; end return toReturn; end end

function sortTable(o) local function padnum(d) local dec, n = string.match(d, "(%.?)0*(.+)") return #dec > 0 and ("%.12f"):format(d) or ("%s%03d%s"):format(dec, #n, n) end table.sort(o, function(a,b)   return tostring(a):gsub("%.?%d+",padnum)..("%3d"):format(#b)         < tostring(b):gsub("%.?%d+",padnum)..("%3d"):format(#a) end) return o end

function sortTableKeys(t) local tkeys = {} for k in pairs(t) do table.insert(tkeys, k) end return sortTable(tkeys) end

function hasValue(value) if(value ~= nil) then return value end return "?" end p.replace = replace p.range=range p.split=split p.round=round p.numbers=numbers p.compareLess=compareLess p.compareMore=compareMore p.tableSort=tableSort p.upfirst = upperFirstLetter p.noPage = noPage p.time = time p.sortKeys = sortTableKeys p.sortTable = sortTable p.hasValue = hasValue p.length = length p.has_value = has_value p.trim = trim p.ltrim = lefttrim p.rtrim = righttrim

return p