-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #39753 from nextcloud/feat/caldav/linkify-location…
…-in-email feat(caldav): linkify location in scheduling mails
- Loading branch information
Showing
1 changed file
with
42 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ | |
* @copyright 2022 Anna Larch <[email protected]> | ||
* | ||
* @author Anna Larch <[email protected]> | ||
* @author Richard Steinmetz <[email protected]> | ||
* | ||
* 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 @@ 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 { | ||
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 @@ 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']; | ||
|
@@ -246,6 +285,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); | ||
|
@@ -256,7 +296,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; | ||
} | ||
|