summaryrefslogtreecommitdiff
path: root/includes/composer/ical
diff options
context:
space:
mode:
Diffstat (limited to 'includes/composer/ical')
-rw-r--r--includes/composer/ical/ical.php69
-rw-r--r--includes/composer/ical/icalEvent.php56
2 files changed, 125 insertions, 0 deletions
diff --git a/includes/composer/ical/ical.php b/includes/composer/ical/ical.php
new file mode 100644
index 0000000..84d637c
--- /dev/null
+++ b/includes/composer/ical/ical.php
@@ -0,0 +1,69 @@
+<?php declare(strict_types=1);
+
+require_once('icalEvent.php');
+
+class iCal
+{
+ public $Events = array();
+
+ public function __construct(string $content)
+ {
+ $isUrl = strpos($content, 'http') === 0 && filter_var($content, FILTER_VALIDATE_URL);
+ $isFile = strpos($content, "\n") === false && file_exists($content);
+
+ if ($isUrl || $isFile)
+ {
+ $this->parse(file_get_contents($content));
+ }
+ }
+
+ protected function parse(string $content) : iCal
+ {
+ $content = str_replace("\r\n ", '', $content);
+
+ preg_match_all('`BEGIN:VEVENT(.+)END:VEVENT`Us', $content, $matches);
+ foreach($matches[0] as $eventContent)
+ {
+ $this->Events[] = new iCalEvent($eventContent);
+ }
+
+ return $this;
+ }
+
+ public function getEventsAfterDate(string $date) : array
+ {
+ $output = array();
+
+ $date = strtotime($date);
+ foreach ($this->Events as $event)
+ {
+ $eventTimestamp = strtotime($event->startDateTime);
+ if ($eventTimestamp >= $date)
+ {
+ $output[] = $event;
+ }
+ }
+
+ asort($output);
+ return $output;
+ }
+
+ public function getActiveEvents() : array
+ {
+ $output = array();
+
+ $currentDate = strtotime(date('Y-m-d'));
+ foreach ($this->Events as $event)
+ {
+ $eventStartTimestamp = strtotime($event->startDateTime);
+ $eventEndTimestamp = strtotime($event->endDateTime);
+ if ($currentDate >= $eventStartTimestamp && $currentDate <= $eventEndTimestamp)
+ {
+ $output[] = $event;
+ }
+ }
+
+ asort($output);
+ return $output;
+ }
+} \ No newline at end of file
diff --git a/includes/composer/ical/icalEvent.php b/includes/composer/ical/icalEvent.php
new file mode 100644
index 0000000..a2791c2
--- /dev/null
+++ b/includes/composer/ical/icalEvent.php
@@ -0,0 +1,56 @@
+<?php declare(strict_types=1);
+
+class iCalEvent
+{
+ public $title;
+ public $description;
+ public $startDateTime;
+ public $endDateTime;
+ public $location;
+ public $created;
+ public $lastModified;
+
+ public function __construct(string $eventContent)
+ {
+ $this->parseEvent($eventContent);
+ }
+
+ protected function parseEvent(string $eventContent) : iCalEvent
+ {
+ $content = str_replace("\r\n ", '', $eventContent);
+
+ $this->title = $this->getEventDetail($content, "SUMMARY:");
+ $this->description = $this->getEventDetail($content, "DESCRIPTION:");
+ $this->startDateTime = $this->getEventDateTime($content, "DTSTART");
+ $this->endDateTime = $this->getEventDateTime($content, "DTEND");
+ $this->location = $this->getEventDetail($content, "LOCATION:");
+ $this->created = date('d.m.Y H:i', strtotime($this->getEventDetail($content, "CREATED:")));
+ $this->lastModified = date('d.m.Y H:i', strtotime($this->getEventDetail($content, "LAST-MODIFIED:")));
+
+ return $this;
+ }
+
+ protected function getEventDetail(string $eventContent, string $eventDetailKey) : string
+ {
+ $output = "";
+
+ if (preg_match('`^' . $eventDetailKey . '(.*)$`m', $eventContent, $match))
+ {
+ $output = trim($match[1]);
+ }
+
+ return $output;
+ }
+
+ protected function getEventDateTime(string $eventContent, string $eventDetailKey) : string
+ {
+ $output = "";
+
+ if (preg_match('`^' . $eventDetailKey . '(?:;.+)?:([0-9]+(T[0-9]+Z?)?)`m', $eventContent, $match))
+ {
+ $output = date('d.m.Y H:i', strtotime($match[1]));
+ }
+
+ return $output;
+ }
+} \ No newline at end of file