diff --git a/src/app/features/common-settings/general/RoomProfile.tsx b/src/app/features/common-settings/general/RoomProfile.tsx index 87aa3d4db..ee283fcd4 100644 --- a/src/app/features/common-settings/general/RoomProfile.tsx +++ b/src/app/features/common-settings/general/RoomProfile.tsx @@ -41,6 +41,32 @@ import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { useAlive } from '../../../hooks/useAlive'; import { RoomPermissionsAPI } from '../../../hooks/useRoomPermissions'; +const MARKDOWN_PATTERN = /(\*\*|__|\*|_|~~|`|\[.+?\]\(.+?\))/; + +function topicMarkdownToHtml(text: string): string { + return text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/\*\*(.+?)\*\*/g, '$1') + .replace(/__(.+?)__/g, '$1') + .replace(/\*(.+?)\*/g, '$1') + .replace(/_(.+?)_/g, '$1') + .replace(/~~(.+?)~~/g, '$1') + .replace(/`(.+?)`/g, '$1') + .replace(/\[(.+?)\]\((.+?)\)/g, '$1') + .replace(/\n/g, '
'); +} + +function buildTopicContent(topic: string): Record { + if (!MARKDOWN_PATTERN.test(topic)) return { topic }; + return { + topic, + format: 'org.matrix.custom.html', + formatted_body: topicMarkdownToHtml(topic), + }; +} + type RoomProfileEditProps = { canEditAvatar: boolean; canEditName: boolean; @@ -101,7 +127,8 @@ export function RoomProfileEdit({ await mx.sendStateEvent(room.roomId, StateEvent.RoomName as any, { name: roomName }); } if (roomTopic !== undefined) { - await mx.sendStateEvent(room.roomId, StateEvent.RoomTopic as any, { topic: roomTopic }); + const topicContent = buildTopicContent(roomTopic); + await mx.sendStateEvent(room.roomId, StateEvent.RoomTopic as any, topicContent); } }, [mx, room.roomId], @@ -224,10 +251,16 @@ export function RoomProfileEdit({