Skip to content

Commit

Permalink
feat(caldav): linkify location in scheduling mails
Browse files Browse the repository at this point in the history
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
  • Loading branch information
st3iny committed Aug 8, 2023
1 parent bbd0deb commit 5671393
Showing 1 changed file with 35 additions and 2 deletions.
37 changes: 35 additions & 2 deletions apps/dav/lib/CalDAV/Schedule/IMipService.php
Expand Up @@ -6,6 +6,7 @@
* @copyright 2022 Anna Larch <anna.larch@gmx.net>
*
* @author Anna Larch <anna.larch@gmx.net>
* @author Richard Steinmetz <richard@steinmetz.cloud>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
Expand Down Expand Up @@ -105,6 +106,33 @@ private function generateDiffString(VEvent $vevent, VEvent $oldVEvent, string $p
return $newstring;
}

/**
* Like generateDiffString() but linkifies the property values if they are urls.
*/
private function generateLinkifiedDiffString(VEvent $vevent, VEvent $oldVEvent, string $property, string $default): ?string {
$strikethrough = "<span style='text-decoration: line-through'>%s</span><br />%s";
if (!isset($vevent->$property)) {
return $default;
}
$newstring = $vevent->$property->getValue();
if (isset($oldVEvent->$property) && $oldVEvent->$property->getValue() !== $newstring) {
$oldstring = $oldVEvent->$property->getValue();
return sprintf($strikethrough, $this->linkify($oldstring) ?? $oldstring, $this->linkify($newstring) ?? $newstring);
}
return $this->linkify($newstring) ?? $newstring;
}

/**
* Convert a given url to a html link element or return null otherwise.
*/
private function linkify(string $url): ?string {
if (!str_starts_with($url, 'http://') && !str_starts_with($url, 'https://')) {
return null;
}

return sprintf('<a href="%1$s">%1$s</a>', htmlspecialchars($url));
}

/**
* @param VEvent $vEvent
* @param VEvent|null $oldVEvent
Expand All @@ -121,11 +149,15 @@ public function buildBodyData(VEvent $vEvent, ?VEvent $oldVEvent): array {

$data['meeting_url_html'] = self::readPropertyWithDefault($vEvent, 'URL', $defaultVal);

if (($locationHtml = $this->linkify($data['meeting_location'])) !== null) {
$data['meeting_location_html'] = $locationHtml;
}

if(!empty($oldVEvent)) {
$oldMeetingWhen = $this->generateWhenString($oldVEvent);
$data['meeting_title_html'] = $this->generateDiffString($vEvent, $oldVEvent, 'SUMMARY', $data['meeting_title']);
$data['meeting_description_html'] = $this->generateDiffString($vEvent, $oldVEvent, 'DESCRIPTION', $data['meeting_description']);
$data['meeting_location_html'] = $this->generateDiffString($vEvent, $oldVEvent, 'LOCATION', $data['meeting_location']);
$data['meeting_location_html'] = $this->generateLinkifiedDiffString($vEvent, $oldVEvent, 'LOCATION', $data['meeting_location']);

$oldUrl = self::readPropertyWithDefault($oldVEvent, 'URL', $defaultVal);
$data['meeting_url_html'] = !empty($oldUrl) && $oldUrl !== $data['meeting_url'] ? sprintf('<a href="%1$s">%1$s</a>', $oldUrl) : $data['meeting_url'];
Expand Down Expand Up @@ -246,6 +278,7 @@ public function buildCancelledBodyData(VEvent $vEvent): array {
$newDescription = isset($vEvent->DESCRIPTION) && (string)$vEvent->DESCRIPTION !== '' ? (string)$vEvent->DESCRIPTION : $defaultVal;
$newUrl = isset($vEvent->URL) && (string)$vEvent->URL !== '' ? sprintf('<a href="%1$s">%1$s</a>', $vEvent->URL) : $defaultVal;
$newLocation = isset($vEvent->LOCATION) && (string)$vEvent->LOCATION !== '' ? (string)$vEvent->LOCATION : $defaultVal;
$newLocationHtml = $this->linkify($newLocation) ?? $newLocation;

$data = [];
$data['meeting_when_html'] = $newMeetingWhen === '' ?: sprintf($strikethrough, $newMeetingWhen);
Expand All @@ -256,7 +289,7 @@ public function buildCancelledBodyData(VEvent $vEvent): array {
$data['meeting_description'] = $newDescription;
$data['meeting_url_html'] = $newUrl !== '' ? sprintf($strikethrough, $newUrl) : '';
$data['meeting_url'] = isset($vEvent->URL) ? (string)$vEvent->URL : '';
$data['meeting_location_html'] = $newLocation !== '' ? sprintf($strikethrough, $newLocation) : '';
$data['meeting_location_html'] = $newLocationHtml !== '' ? sprintf($strikethrough, $newLocationHtml) : '';
$data['meeting_location'] = $newLocation;
return $data;
}
Expand Down

0 comments on commit 5671393

Please sign in to comment.