]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat(caldav): linkify location in scheduling mails 39753/head
authorRichard Steinmetz <richard@steinmetz.cloud>
Tue, 8 Aug 2023 12:51:08 +0000 (14:51 +0200)
committerRichard Steinmetz <richard@steinmetz.cloud>
Wed, 9 Aug 2023 08:50:35 +0000 (10:50 +0200)
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
apps/dav/lib/CalDAV/Schedule/IMipService.php

index 8596500f32009d91834648d03d837df889778aa4..e6d1bbcd875b9d0afd310fcd8f9fbe27bc4ef21a 100644 (file)
@@ -6,6 +6,7 @@ declare(strict_types=1);
  * @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
@@ -105,6 +106,40 @@ class IMipService {
                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 {
+               if (!isset($vevent->$property)) {
+                       return $default;
+               }
+               /** @var string|null $newString */
+               $newString = $vevent->$property->getValue();
+               $oldString = isset($oldVEvent->$property) ? $oldVEvent->$property->getValue() : null;
+               if ($oldString !== $newString) {
+                       return sprintf(
+                               "<span style='text-decoration: line-through'>%s</span><br />%s",
+                               $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 ($url === null) {
+                       return null;
+               }
+               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
@@ -121,11 +156,15 @@ class IMipService {
 
                $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'];
@@ -246,6 +285,7 @@ class IMipService {
                $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);
@@ -256,7 +296,7 @@ class IMipService {
                $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;
        }