Basic release
This commit is contained in:
		
							
								
								
									
										318
									
								
								lib/ics-parser/Event.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										318
									
								
								lib/ics-parser/Event.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,318 @@
 | 
			
		||||
<?php
 | 
			
		||||
ini_set('display_errors', '1');
 | 
			
		||||
ini_set('date.timezone', 'Europe/Berlin');
 | 
			
		||||
 | 
			
		||||
class Event
 | 
			
		||||
{
 | 
			
		||||
    // phpcs:disable Generic.Arrays.DisallowLongArraySyntax
 | 
			
		||||
 | 
			
		||||
    const HTML_TEMPLATE = '<p>%s: %s</p>';
 | 
			
		||||
 | 
			
		||||
    public $category;
 | 
			
		||||
 | 
			
		||||
    public $start = '';
 | 
			
		||||
    public $startInt = 0;
 | 
			
		||||
 | 
			
		||||
    public $end = '';
 | 
			
		||||
    public $endInt = 0;
 | 
			
		||||
 | 
			
		||||
    public $wholeDay = false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/summary.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $summary;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/dtstart.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $dtstart;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/dtend.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $dtend;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/duration.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string|null
 | 
			
		||||
     */
 | 
			
		||||
    public $duration;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/dtstamp.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $dtstamp;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * When the event starts, represented as a timezone-adjusted string
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $dtstart_tz;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * When the event ends, represented as a timezone-adjusted string
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $dtend_tz;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/uid.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $uid;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/created.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $created;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/lastModified.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $last_modified;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/description.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string|null
 | 
			
		||||
     */
 | 
			
		||||
    public $description;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/location.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string|null
 | 
			
		||||
     */
 | 
			
		||||
    public $location;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/sequence.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $sequence;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/status.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $status;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/transp.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $transp;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/organizer.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $organizer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https://www.kanzaki.com/docs/ical/attendee.html
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $attendee;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Manage additional properties
 | 
			
		||||
     *
 | 
			
		||||
     * @var array<string, mixed>
 | 
			
		||||
     */
 | 
			
		||||
    public $additionalProperties = array();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the Event object
 | 
			
		||||
     *
 | 
			
		||||
     * @param  array $data
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    public function __construct(array $data = array())
 | 
			
		||||
    {
 | 
			
		||||
        foreach ($data as $key => $value) {
 | 
			
		||||
            if ($key == 'DTSTART_array' || $key == 'DTEND_array') {
 | 
			
		||||
 | 
			
		||||
                $dateString = $value[1];
 | 
			
		||||
                $dateTime = \DateTime::createFromFormat('Ymd\THis', $dateString);
 | 
			
		||||
                if (false === $dateTime) {
 | 
			
		||||
                    $this->wholeDay = true;
 | 
			
		||||
                    $dateTime = \DateTime::createFromFormat('Ymd', $dateString);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                $timeZone = 'Europe/Berlin';
 | 
			
		||||
                if (isset($value[0]['TZID'])) {
 | 
			
		||||
                    $timeZone = $value[0]['TZID'];
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                $dateTime->setTimezone(new \DateTimeZone($timeZone));
 | 
			
		||||
 | 
			
		||||
                if ($key == 'DTSTART_array') {
 | 
			
		||||
                    $this->start = $dateTime->format('d.m.Y H:i:s');
 | 
			
		||||
                    $this->startInt = $dateTime->getTimestamp();
 | 
			
		||||
                } else {
 | 
			
		||||
                    $this->end = $dateTime->format('d.m.Y H:i:s');
 | 
			
		||||
                    $this->endInt = $dateTime->getTimestamp();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            } else {
 | 
			
		||||
 | 
			
		||||
                $variable = self::snakeCase($key);
 | 
			
		||||
                if (property_exists($this, $variable)) {
 | 
			
		||||
                    $this->{$variable} = $this->prepareData($value);
 | 
			
		||||
                } elseif ($variable == 'categories') {
 | 
			
		||||
                    $this->category = $value;
 | 
			
		||||
                } else {
 | 
			
		||||
                    $this->additionalProperties[$variable] = $this->prepareData($value);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Magic getter method
 | 
			
		||||
     *
 | 
			
		||||
     * @param  string $additionalPropertyName
 | 
			
		||||
     * @return mixed
 | 
			
		||||
     */
 | 
			
		||||
    public function __get($additionalPropertyName)
 | 
			
		||||
    {
 | 
			
		||||
        if (array_key_exists($additionalPropertyName, $this->additionalProperties)) {
 | 
			
		||||
            return $this->additionalProperties[$additionalPropertyName];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Magic isset method
 | 
			
		||||
     *
 | 
			
		||||
     * @param  string $name
 | 
			
		||||
     * @return boolean
 | 
			
		||||
     */
 | 
			
		||||
    public function __isset($name)
 | 
			
		||||
    {
 | 
			
		||||
        return is_null($this->$name) === false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Prepares the data for output
 | 
			
		||||
     *
 | 
			
		||||
     * @param  mixed $value
 | 
			
		||||
     * @return mixed
 | 
			
		||||
     */
 | 
			
		||||
    protected function prepareData($value)
 | 
			
		||||
    {
 | 
			
		||||
        if (is_string($value)) {
 | 
			
		||||
            return stripslashes(trim(str_replace('\n', "\n", $value)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (is_array($value)) {
 | 
			
		||||
            return array_map(function ($value) {
 | 
			
		||||
                return $this->prepareData($value);
 | 
			
		||||
            }, $value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getEventTime() {
 | 
			
		||||
        $dateTime = explode(' ', $this->start);
 | 
			
		||||
 | 
			
		||||
        if ($this->wholeDay) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (isset($dateTime[1])) {
 | 
			
		||||
            $time = explode(':', $dateTime[1]);
 | 
			
		||||
            return $time[0] . ':' . $time[1] . ' Uhr';
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns Event data excluding anything blank
 | 
			
		||||
     * within an HTML template
 | 
			
		||||
     *
 | 
			
		||||
     * @param  string $html HTML template to use
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function printData($html = self::HTML_TEMPLATE)
 | 
			
		||||
    {
 | 
			
		||||
        $data = array(
 | 
			
		||||
            'SUMMARY'       => $this->summary,
 | 
			
		||||
            'start'       => $this->start,
 | 
			
		||||
            'end'           => $this->end,
 | 
			
		||||
            'DTEND'         => $this->dtend,
 | 
			
		||||
            'DTSTART_TZ'    => $this->dtstart_tz,
 | 
			
		||||
            'DTEND_TZ'      => $this->dtend_tz,
 | 
			
		||||
            'DURATION'      => $this->duration,
 | 
			
		||||
            'DTSTAMP'       => $this->dtstamp,
 | 
			
		||||
            'UID'           => $this->uid,
 | 
			
		||||
            'CREATED'       => $this->created,
 | 
			
		||||
            'LAST-MODIFIED' => $this->last_modified,
 | 
			
		||||
            'DESCRIPTION'   => $this->description,
 | 
			
		||||
            'LOCATION'      => $this->location,
 | 
			
		||||
            'SEQUENCE'      => $this->sequence,
 | 
			
		||||
            'STATUS'        => $this->status,
 | 
			
		||||
            'TRANSP'        => $this->transp,
 | 
			
		||||
            'ORGANISER'     => $this->organizer,
 | 
			
		||||
            'ATTENDEE(S)'   => $this->attendee,
 | 
			
		||||
            'CATEGORIES'    => $this->category,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Remove any blank values
 | 
			
		||||
        $data = array_filter($data);
 | 
			
		||||
 | 
			
		||||
        $output = '';
 | 
			
		||||
        foreach ($data as $key => $value) {
 | 
			
		||||
            $output .= sprintf($html, $key, $value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $output;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Converts the given input to snake_case
 | 
			
		||||
     *
 | 
			
		||||
     * @param  string $input
 | 
			
		||||
     * @param  string $glue
 | 
			
		||||
     * @param  string $separator
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    protected static function snakeCase($input, $glue = '_', $separator = '-')
 | 
			
		||||
    {
 | 
			
		||||
        $inputSplit = preg_split('/(?<=[a-z])(?=[A-Z])/x', $input);
 | 
			
		||||
 | 
			
		||||
        if ($inputSplit === false) {
 | 
			
		||||
            return $input;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $inputSplit = implode($glue, $inputSplit);
 | 
			
		||||
        $inputSplit = str_replace($separator, $glue, $inputSplit);
 | 
			
		||||
 | 
			
		||||
        return strtolower($inputSplit);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2731
									
								
								lib/ics-parser/ICal.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2731
									
								
								lib/ics-parser/ICal.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user