a lot of stuff and added dbus_proxy as sub module
This commit is contained in:
@@ -1,6 +1,14 @@
|
||||
local ical = {}
|
||||
local gfilesystem = require("gears.filesystem")
|
||||
local gobject = require("gears.object")
|
||||
local gtable = require("gears.table")
|
||||
local naughty = require("naughty")
|
||||
|
||||
local json = require("src.lib.json-lua.json-lua")
|
||||
|
||||
local ical = { mt = {} }
|
||||
ical.VCALENDAR = {}
|
||||
ical._private = {}
|
||||
ical._private.cache = {}
|
||||
ical._private.parser = {}
|
||||
|
||||
--[[
|
||||
@@ -63,24 +71,74 @@ ical._private.parser = {}
|
||||
DTSTAMP = "...",
|
||||
]]
|
||||
|
||||
---Takes a path to an .ical file then parses it into a lua table and returns it
|
||||
---@param path string Path to the .ical file
|
||||
---@return table | nil calendar New calendar table or nil on error
|
||||
function ical.new(path)
|
||||
local handler = io.open(path, "r")
|
||||
function ical._private.add_to_cache(file, vcal)
|
||||
-- Copy file to src/config/files/calendar/
|
||||
local path = gfilesystem.get_configuration_dir() .. "src/config/"
|
||||
local file_name = file:match(".*/(.*)")
|
||||
if not
|
||||
os.execute("cp " ..
|
||||
file .. " " .. gfilesystem.get_configuration_dir() .. "src/config/files/calendar/" .. file_name) then
|
||||
naughty.notification({
|
||||
app_name = "Systemnotification",
|
||||
title = "Error",
|
||||
text = "Could not copy file to config/files/calendar/",
|
||||
timeout = 0,
|
||||
urgency = "critical",
|
||||
})
|
||||
return
|
||||
end
|
||||
local handler = io.open(path .. "calendar.json", "r")
|
||||
if not handler then return end
|
||||
local json_data = json:decode(handler:read("a"))
|
||||
handler:close()
|
||||
if not (type(json_data) == "table") then return end
|
||||
table.insert(json_data, {
|
||||
file = file_name,
|
||||
VCALENDAR = vcal,
|
||||
})
|
||||
|
||||
json_data = json:encode(json_data)
|
||||
|
||||
handler = io.open(path .. "calendar.json", "w")
|
||||
if not handler then return end
|
||||
handler:write(json_data)
|
||||
handler:close()
|
||||
end
|
||||
|
||||
function ical:add_calendar(file)
|
||||
local handler = io.open(file, "r")
|
||||
if not handler then return end
|
||||
|
||||
-- Check if the line is a BEGIN:VCALENDAR
|
||||
local v, k = handler:read("l"):match("([A-Z]+):([A-Z]+)")
|
||||
|
||||
local vcal = {}
|
||||
if v:match("BEGIN") and k:match("VCALENDAR") then
|
||||
table.insert(ical.VCALENDAR, ical._private.parser.VCALENDAR(handler))
|
||||
return ical
|
||||
vcal = self._private.parser.VCALENDAR(handler)
|
||||
table.insert(self.VCALENDAR, vcal)
|
||||
self._private.add_to_cache(file, vcal)
|
||||
end
|
||||
end
|
||||
|
||||
function ical.new(args)
|
||||
args = args or {}
|
||||
local ret = gobject {}
|
||||
gtable.crush(ret, ical, true)
|
||||
local path = gfilesystem.get_configuration_dir() .. "src/config/calendar.json"
|
||||
local handler = io.open(path, "r")
|
||||
if not handler then return end
|
||||
local json_data = json:decode(handler:read("a"))
|
||||
handler:close()
|
||||
if not (type(json_data) == "table") then return end
|
||||
--Load into the cache
|
||||
for _, v in ipairs(json_data) do
|
||||
ret._private.cache[v.file] = v.VCALENDAR
|
||||
table.insert(ret.VCALENDAR, v.VCALENDAR)
|
||||
end
|
||||
return ical
|
||||
end
|
||||
|
||||
function ical._private.parser.VEVENT(handler)
|
||||
function ical._private.parser:VEVENT(handler)
|
||||
local VEVENT = {}
|
||||
|
||||
while true do
|
||||
@@ -92,11 +150,11 @@ function ical._private.parser.VEVENT(handler)
|
||||
|
||||
local v, k = line:match("(.*):(.*)")
|
||||
if v:match("CREATED") then
|
||||
VEVENT.CREATED = ical._private.parser.to_datetime(k)
|
||||
VEVENT.CREATED = self._private.parser.to_datetime(k)
|
||||
elseif v:match("LAST-MODIFIED") then
|
||||
VEVENT.LAST_MODIFIED = ical._private.parser.to_datetime(k)
|
||||
VEVENT.LAST_MODIFIED = self._private.parser.to_datetime(k)
|
||||
elseif v:match("DTSTAMP") then
|
||||
VEVENT.DTSTAMP = ical._private.parser.to_datetime(k)
|
||||
VEVENT.DTSTAMP = self._private.parser.to_datetime(k)
|
||||
elseif v:match("UID") then
|
||||
VEVENT.UID = k
|
||||
elseif v:match("SUMMARY") then
|
||||
@@ -104,20 +162,20 @@ function ical._private.parser.VEVENT(handler)
|
||||
elseif v:match("RRULE") then
|
||||
VEVENT.RRULE = {
|
||||
FREQ = k:match("FREQ=([A-Z]+)"),
|
||||
UNTIL = ical._private.parser.to_datetime(k:match("UNTIL=([TZ0-9]+)")),
|
||||
UNTIL = self._private.parser.to_datetime(k:match("UNTIL=([TZ0-9]+)")),
|
||||
WKST = k:match("WKST=([A-Z]+)"),
|
||||
COUNT = k:match("COUNT=([0-9]+)"),
|
||||
INTERVAL = k:match("INTERVAL=([0-9]+)")
|
||||
}
|
||||
elseif v:match("DTSTART") then
|
||||
VEVENT.DTSTART = {
|
||||
DTSTART = ical._private.parser.to_datetime(k),
|
||||
DTSTART = self._private.parser.to_datetime(k),
|
||||
TZID = v:match("TZID=([a-zA-Z-\\/]+)"),
|
||||
VALUE = v:match("VALUE=([A-Z]+)")
|
||||
}
|
||||
elseif v:match("DTEND") then
|
||||
VEVENT.DTEND = {
|
||||
DTEND = ical._private.parser.to_datetime(k),
|
||||
DTEND = self._private.parser.to_datetime(k),
|
||||
TZID = v:match("TZID=([a-zA-Z-\\/]+)"),
|
||||
VALUE = v:match("VALUE=([A-Z]+)")
|
||||
}
|
||||
@@ -134,11 +192,12 @@ function ical._private.parser.VEVENT(handler)
|
||||
}
|
||||
elseif v:match("BEGIN") then
|
||||
if k:match("VALARM") then
|
||||
VEVENT.VALARM = ical._private.parser.VALARM(handler)
|
||||
VEVENT.VALARM = self._private.parser:VALARM(handler)
|
||||
end
|
||||
elseif v:match("UID") then
|
||||
VEVENT.UID = k
|
||||
end
|
||||
end
|
||||
|
||||
--VEVENT.duration = VEVENT.DTSTART.DTSTART - VEVENT.DTEND.DTEND
|
||||
|
||||
return VEVENT
|
||||
@@ -153,7 +212,7 @@ function ical._private.parser.alarm_to_time(alarm)
|
||||
return time .. unit
|
||||
end
|
||||
|
||||
function ical._private.parser.VALARM(handler)
|
||||
function ical._private.parser:VALARM(handler)
|
||||
local VALARM = {}
|
||||
|
||||
while true do
|
||||
@@ -169,7 +228,7 @@ function ical._private.parser.VALARM(handler)
|
||||
elseif v:match("TRIGGER;VALUE=DURATION") then
|
||||
VALARM.TRIGGER = {
|
||||
VALUE = v:match("VALUE=(.*):"),
|
||||
TRIGGER = ical._private.parser.alarm_to_time(k)
|
||||
TRIGGER = self._private.parser.alarm_to_time(k)
|
||||
}
|
||||
elseif v:match("DESCRIPTION") then
|
||||
VALARM.DESCRIPTION = k
|
||||
@@ -179,7 +238,7 @@ function ical._private.parser.VALARM(handler)
|
||||
return VALARM
|
||||
end
|
||||
|
||||
function ical._private.parser.VCALENDAR(handler)
|
||||
function ical._private.parser:VCALENDAR(handler)
|
||||
local VCALENDAR = {}
|
||||
VCALENDAR.VEVENT = {}
|
||||
VCALENDAR.VTIMEZONE = {}
|
||||
@@ -199,9 +258,9 @@ function ical._private.parser.VCALENDAR(handler)
|
||||
VCALENDAR.VERSION = k
|
||||
elseif v:match("BEGIN") then
|
||||
if k:match("VTIMEZONE") then
|
||||
VCALENDAR.VTIMEZONE = ical._private.parser.VTIMEZONE(handler)
|
||||
VCALENDAR.VTIMEZONE = self._private.parser:VTIMEZONE(handler)
|
||||
elseif k:match("VEVENT") then
|
||||
table.insert(VCALENDAR.VEVENT, ical._private.parser.VEVENT(handler))
|
||||
table.insert(VCALENDAR.VEVENT, self._private.parser:VEVENT(handler))
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -211,7 +270,7 @@ function ical._private.parser.VCALENDAR(handler)
|
||||
return VCALENDAR
|
||||
end
|
||||
|
||||
function ical._private.parser.VTIMEZONE(handler)
|
||||
function ical._private.parser:VTIMEZONE(handler)
|
||||
local VTIMEZONE = {}
|
||||
|
||||
while true do
|
||||
@@ -227,9 +286,9 @@ function ical._private.parser.VTIMEZONE(handler)
|
||||
end
|
||||
if v:match("BEGIN") then
|
||||
if k:match("DAYLIGHT") then
|
||||
VTIMEZONE.DAYLIGHT = ical._private.parser.DAYLIGHT(handler)
|
||||
VTIMEZONE.DAYLIGHT = self._private.parser:DAYLIGHT(handler)
|
||||
elseif k:match("STANDARD") then
|
||||
VTIMEZONE.STANDARD = ical._private.parser.STANDARD(handler)
|
||||
VTIMEZONE.STANDARD = self._private.parser:STANDARD(handler)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -237,7 +296,7 @@ function ical._private.parser.VTIMEZONE(handler)
|
||||
return VTIMEZONE
|
||||
end
|
||||
|
||||
function ical._private.parser.DAYLIGHT(handler)
|
||||
function ical._private.parser:DAYLIGHT(handler)
|
||||
local DAYLIGHT = {}
|
||||
|
||||
while true do
|
||||
@@ -249,13 +308,13 @@ function ical._private.parser.DAYLIGHT(handler)
|
||||
|
||||
local v, k = line:match("(.*):(.*)")
|
||||
if v:match("TZOFFSETFROM") then
|
||||
DAYLIGHT.TZOFFSETFROM = ical._private.parser.offset(k)
|
||||
DAYLIGHT.TZOFFSETFROM = self._private.parser.offset(k)
|
||||
elseif v:match("TZOFFSETTO") then
|
||||
DAYLIGHT.TZOFFSETTO = ical._private.parser.offset(k)
|
||||
DAYLIGHT.TZOFFSETTO = self._private.parser.offset(k)
|
||||
elseif v:match("TZNAME") then
|
||||
DAYLIGHT.TZNAME = k
|
||||
elseif v:match("DTSTART") then
|
||||
DAYLIGHT.DTSTART = ical._private.parser.to_datetime(k)
|
||||
DAYLIGHT.DTSTART = self._private.parser.to_datetime(k)
|
||||
elseif v:match("RRULE") then
|
||||
DAYLIGHT.RRULE = {
|
||||
FREQ = k:match("FREQ=([A-Z]+)"),
|
||||
@@ -271,7 +330,7 @@ end
|
||||
---Parses the STANDARD property into a table
|
||||
---@param handler table
|
||||
---@return table STANDARD The STANDARD property as a table
|
||||
function ical._private.parser.STANDARD(handler)
|
||||
function ical._private.parser:STANDARD(handler)
|
||||
local STANDARD = {}
|
||||
|
||||
-- Read each line until END:STANDARD is read
|
||||
@@ -285,13 +344,13 @@ function ical._private.parser.STANDARD(handler)
|
||||
-- Break down each line into the property:value
|
||||
local v, k = line:match("(.*):(.*)")
|
||||
if v:match("TZOFFSETFROM") then
|
||||
STANDARD.TZOFFSETFROM = ical._private.parser.offset(k)
|
||||
STANDARD.TZOFFSETFROM = self._private.parser.offset(k)
|
||||
elseif v:match("TZOFFSETTO") then
|
||||
STANDARD.TZOFFSETTO = ical._private.parser.offset(k)
|
||||
STANDARD.TZOFFSETTO = self._private.parser.offset(k)
|
||||
elseif v:match("TZNAME") then
|
||||
STANDARD.TZNAME = k
|
||||
elseif v:match("DTSTART") then
|
||||
STANDARD.DTSTART = ical._private.parser.to_datetime(k)
|
||||
STANDARD.DTSTART = self._private.parser.to_datetime(k)
|
||||
elseif v:match("RRULE") then
|
||||
STANDARD.RRULE = {
|
||||
FREQ = k:match("FREQ=([A-Z]+)"),
|
||||
@@ -329,4 +388,8 @@ function ical._private.parser.offset(offset)
|
||||
return s * (tonumber(h) * 3600 + tonumber(m) * 60)
|
||||
end
|
||||
|
||||
return ical
|
||||
function ical.mt:__call(...)
|
||||
return ical.new(...)
|
||||
end
|
||||
|
||||
return setmetatable(ical, ical.mt)
|
||||
|
||||
Reference in New Issue
Block a user