Completed
Push — master ( 5ce57c...578406 )
by Alies
25s queued 10s
created

Ics::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
namespace Spatie\CalendarLinks\Generators;
4
5
use Spatie\CalendarLinks\Generator;
6
use Spatie\CalendarLinks\Link;
7
8
/**
9
 * @see https://icalendar.org/RFC-Specifications/iCalendar-RFC-5545/
10
 */
11
class Ics implements Generator
12
{
13
    /** @var string {@see https://www.php.net/manual/en/function.date.php} */
14
    protected $dateFormat = 'Ymd';
15
    protected $dateTimeFormat = 'e:Ymd\THis';
16
17
    /** @var array */
18
    protected $options = [];
19
20
    public function __construct(array $options = [])
21
    {
22
        $this->options = $options;
23
    }
24
25
    /** {@inheritdoc} */
26
    public function generate(Link $link): string
27
    {
28
        $url = [
29
            'BEGIN:VCALENDAR',
30
            'VERSION:2.0',
31
            'BEGIN:VEVENT',
32
            'UID:'.($this->options['uid'] ?? $this->generateEventUid($link)),
33
            'SUMMARY:'.$this->escapeString($link->title),
34
        ];
35
36
        $dateTimeFormat = $link->allDay ? $this->dateFormat : $this->dateTimeFormat;
37
38
        if ($link->allDay) {
39
            $url[] = 'DTSTART:'.$link->from->format($dateTimeFormat);
40
            $url[] = 'DURATION:P1D';
41
        } else {
42
            $url[] = 'DTSTART;TZID='.$link->from->format($dateTimeFormat);
43
            $url[] = 'DTEND;TZID='.$link->to->format($dateTimeFormat);
44
        }
45
46
        if ($link->description) {
47
            $url[] = 'DESCRIPTION:'.$this->escapeString($link->description);
48
        }
49
        if ($link->address) {
50
            $url[] = 'LOCATION:'.$this->escapeString($link->address);
51
        }
52
53
        $url[] = 'END:VEVENT';
54
        $url[] = 'END:VCALENDAR';
55
        $redirectLink = implode("\r\n", $url);
56
57
        return 'data:text/calendar;charset=utf8;base64,'.base64_encode($redirectLink);
58
    }
59
60
    /** @see https://tools.ietf.org/html/rfc5545.html#section-3.3.11 */
61
    protected function escapeString(string $field): string
62
    {
63
        return addcslashes($field, "\r\n,;");
64
    }
65
66
    /** @see https://tools.ietf.org/html/rfc5545#section-3.8.4.7 */
67
    protected function generateEventUid(Link $link): string
68
    {
69
        return md5($link->from->format(\DateTimeInterface::ATOM).$link->to->format(\DateTimeInterface::ATOM).$link->title.$link->address);
70
    }
71
}
72