diff --git a/lib/CalEventParser.ts b/lib/CalEventParser.ts index 69724ccc..ef1ff315 100644 --- a/lib/CalEventParser.ts +++ b/lib/CalEventParser.ts @@ -86,4 +86,13 @@ export default class CalEventParser { eventCopy.description = this.getRichDescriptionHtml(); return eventCopy; } + + /** + * Returns a calendar event with rich description as plain text. + */ + public asRichEventPlain(): CalendarEvent { + const eventCopy: CalendarEvent = { ...this.calEvent }; + eventCopy.description = this.getRichDescription(); + return eventCopy; + } } diff --git a/lib/calendarClient.ts b/lib/calendarClient.ts index 3891feab..7eb37632 100644 --- a/lib/calendarClient.ts +++ b/lib/calendarClient.ts @@ -508,7 +508,12 @@ const listCalendars = (withCredentials) => const createEvent = async (credential: Credential, calEvent: CalendarEvent): Promise => { const parser: CalEventParser = new CalEventParser(calEvent); const uid: string = parser.getUid(); - const richEvent: CalendarEvent = parser.asRichEvent(); + /* + * Matching the credential type is a workaround because the office calendar simply strips away newlines (\n and \r). + * We need HTML there. Google Calendar understands newlines and Apple Calendar cannot show HTML, so no HTML should + * be used for Google and Apple Calendar. + */ + const richEvent: CalendarEvent = parser.asRichEventPlain(); const creationResult = credential ? await calendars([credential])[0].createEvent(richEvent) : null; @@ -555,7 +560,7 @@ const updateEvent = async ( ): Promise => { const parser: CalEventParser = new CalEventParser(calEvent); const newUid: string = parser.getUid(); - const richEvent: CalendarEvent = parser.asRichEvent(); + const richEvent: CalendarEvent = parser.asRichEventPlain(); const updateResult = credential ? await calendars([credential])[0].updateEvent(uidToUpdate, richEvent) diff --git a/lib/emails/helpers.ts b/lib/emails/helpers.ts index e5218a0a..5c07dbbe 100644 --- a/lib/emails/helpers.ts +++ b/lib/emails/helpers.ts @@ -25,5 +25,11 @@ export function getFormattedMeetingId(videoCallData: VideoCallData): string { } export function stripHtml(html: string): string { - return html.replace("
", "\n").replace(/<[^>]+>/g, ""); + const aMailToRegExp = /"]*)"[\s\w="_:#;]*>([^<>]*)<\/a>/g; + const aLinkRegExp = /"]*)"[\s\w="_:#;]*>([^<>]*)<\/a>/g; + return html + .replace(//g, "\n") + .replace(aMailToRegExp, "$1") + .replace(aLinkRegExp, "$2: $1") + .replace(/<[^>]+>/g, ""); }