diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 38c5449..5d0443f 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -17,7 +17,7 @@ const textToCustomHtml = (node: FormattedText): string => { const elementToCustomHtml = (node: CustomElement, children: string): string => { switch (node.type) { case BlockType.Paragraph: - return `

${children}

`; + return `${children}
`; case BlockType.Heading: return `${children}`; case BlockType.CodeLine: @@ -25,7 +25,7 @@ const elementToCustomHtml = (node: CustomElement, children: string): string => { case BlockType.CodeBlock: return `
${children}
`; case BlockType.QuoteLine: - return `

${children}

`; + return `${children}
`; case BlockType.BlockQuote: return `
${children}
`; case BlockType.ListItem: @@ -93,3 +93,17 @@ export const toPlainText = (node: Descendant | Descendant[]): string => { const children = node.children.map((n) => toPlainText(n)).join(''); return elementToPlainText(node, children); }; + +/** + * Check if customHtml is equals to plainText + * by replacing `
` with `/n` in customHtml + * and sanitizing plainText before comparison + * because text are sanitized in customHtml + * @param customHtml string + * @param plain string + * @returns boolean + */ +export const customHtmlEqualsPlainText = (customHtml: string, plain: string): boolean => + customHtml.replace(//g, '\n') === sanitizeText(plain); + +export const trimCustomHtml = (customHtml: string) => customHtml.replace(/$/g, ''); diff --git a/src/app/organisms/room/RoomInput.tsx b/src/app/organisms/room/RoomInput.tsx index e869e16..a50c800 100644 --- a/src/app/organisms/room/RoomInput.tsx +++ b/src/app/organisms/room/RoomInput.tsx @@ -51,6 +51,8 @@ import { createEmoticonElement, moveCursor, resetEditorHistory, + customHtmlEqualsPlainText, + trimCustomHtml, } from '../../components/editor'; import { EmojiBoard, EmojiBoardTab } from '../../components/emoji-board'; import { UseStateProvider } from '../../components/UseStateProvider'; @@ -251,7 +253,7 @@ export const RoomInput = forwardRef( uploadBoardHandlers.current?.handleSend(); const plainText = toPlainText(editor.children).trim(); - const customHtml = toMatrixCustomHTML(editor.children); + const customHtml = trimCustomHtml(toMatrixCustomHTML(editor.children)); if (plainText === '') return; @@ -271,9 +273,11 @@ export const RoomInput = forwardRef( const content: IContent = { msgtype: MsgType.Text, body, - format: 'org.matrix.custom.html', - formatted_body: formattedBody, }; + if (replyDraft || !customHtmlEqualsPlainText(formattedBody, body)) { + content.format = 'org.matrix.custom.html'; + content.formatted_body = formattedBody; + } if (replyDraft) { content['m.relates_to'] = { 'm.in_reply_to': {