diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 666d2da971..f6e5830329 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -18,7 +18,13 @@ import React from 'react'; import PropTypes from 'prop-types'; import dis from '../../../dispatcher'; import EditorModel from '../../../editor/model'; -import {htmlSerializeIfNeeded, textSerialize, containsEmote, stripEmoteCommand} from '../../../editor/serialize'; +import { + htmlSerializeIfNeeded, + textSerialize, + containsEmote, + stripEmoteCommand, + unescapeMessage, +} from '../../../editor/serialize'; import {CommandPartCreator} from '../../../editor/parts'; import {MatrixClient} from 'matrix-js-sdk'; import BasicMessageComposer from "./BasicMessageComposer"; @@ -54,6 +60,7 @@ function createMessageContent(model, permalinkCreator) { if (isEmote) { model = stripEmoteCommand(model); } + model = unescapeMessage(model); const repliedToEvent = RoomViewStore.getQuotingEvent(); const body = textSerialize(model); diff --git a/src/editor/serialize.js b/src/editor/serialize.js index f3371ac8ee..07a1ad908e 100644 --- a/src/editor/serialize.js +++ b/src/editor/serialize.js @@ -74,3 +74,16 @@ export function stripEmoteCommand(model) { model.removeText({index: 0, offset: 0}, 4); return model; } + +export function unescapeMessage(model) { + const {parts} = model; + if (parts.length) { + const firstPart = parts[0]; + // only unescape \/ to / at start of editor + if (firstPart.type === "plain" && firstPart.text.startsWith("\\/")) { + model = model.clone(); + model.removeText({index: 0, offset: 0}, 1); + } + } + return model; +}