Module:Utility

p = {} -- Gets Parent/child frame function p.getframe(bParent) local oFrame = mw.getCurrentFrame if bParent and oFrame~=nil and oFrame:getParent then oFrame = mw.getCurrentFrame:getParent end return oFrame end -- Put all arguments into a real table - Returns Parent, child args table function p.getArgs(frame) local tChild = {} local tParent = {} local tChild = p.fetchArgs(frame.args) if frame and frame.getParent(frame) then tParent = p.fetchArgs(frame.getParent(frame).args) end return tParent, tChild end function p.fetchArgs(tTmp) local tTab = {} if not(tTmp) then return end for name, value in pairs( tTmp ) do     tTab[name] = value end return tTab end --Get time using Iso format ((YYYY-MM-DD) function p.getfrmdate(frame) local tParent, tChild  = p.getArgs(frame)  local currTable = tChild, tParent  local sDate = currTable[1]  local sFormat = currTable[2]  if not(sFormat) then sFormat = "%Y-%m-%d" end  local tDate = p.getdate(sDate,sFormat)  local sFrmDate = os.date(sFormat,tDate)   return sFrmDate end --Check if args are enough for script to run function p.checkArgs(frame, iArgs,bParent)  local iCount =0  local  tParent, tChild = p.getArgs(frame)  local tArgTable = tParent  if not(bParent) then    tArgTable = tChild  end  for name, value in  pairs( tArgTable ) do     iCount = iCount + 1    if (iCount) == tonumber(iArgs) then        return true          end        end  return false end -- add days to date function p.addDays(sDate,iDays,bReturnTable, sFormat)    if (iDays and tonumber(iDays)) then        iDayToSecs = iDays  * 24 * 60 *60 if (bReturnTable) then return os.date("*t",p.getdate(sDate,sFormat) + iDayToSecs) end return os.date("%Y-%m-%d",p.getdate(sDate,sFormat) + iDayToSecs) end return sDate end --Check if date is in appropriate format --Iso YYYY-MM-DD function p.checkdate(sDate) local sPat="(%d+)-(%d+)-(%d+)" local year,month,day=sDate:match(sPat) if year and month and day then return true end return false end -- Check if table is empty function p.isempty(table) if next(table) == nil then return true end return false end -- round a number function p.round(num, idp) return tonumber(string.format("%." .. (idp or 0) .. "f", num)) end -- Calculate difference between two dates function p.datediff( sDate1, sDate2) if p.checkdate(sDate1) and p.checkdate(sDate2) then sDate1 = string.sub(sDate1,0,10) sDate2 = string.sub(sDate2,0,10) local tDate1 =p.getdate(sDate1) local tDate2 =p.getdate(sDate2) local iDays = math.abs((os.difftime(tDate1,tDate2))/3600/24) return iDays end return 0 end --Get time using custom format function p.getdate(sDate) if not(sDate) then sDate = os.date("%Y-%m-%d") end local sPat="(%d%d%d%d)-(%d%d)-(%d%d)" local year,month,day=sDate:match(sPat) local tDate=(os.time({month=month,year=year,day=day}) ) return tDate end -- function p.table_print (tt, indent, done) done = done or {} indent = indent or 0 if type(tt) == "table" then local sb = {} for key, value in pairs (tt) do     table.insert(sb, string.rep (" ", indent)) -- indent it      if type (value) == "table" and not done [value] then done [value] = true table.insert(sb, ',["'..key..'"]'.."={\n"); table.insert(sb, p.table_print (value, indent + 2, done)) table.insert(sb, string.rep (" ", indent)) -- indent it       table.insert(sb, "}\n"); elseif "number" == type(key) then table.insert(sb, string.format("\"%s\"\n", tostring(value))) else table.insert(sb, string.format( "%s = \"%s\"\n", tostring ('["'..key..'"]'), tostring(value)) ) end end return table.concat(sb) else return tt .. "\n" end end return p