From 65d56d1490e3adc0f93d1fb0eb0d74f84a6e20b9 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 14 Jun 2019 18:25:02 +0200 Subject: [PATCH] transform @room to AtRoomPill while deserializing html to md --- src/editor/deserialize.js | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/editor/deserialize.js b/src/editor/deserialize.js index e08c1d59d9..200f3eb885 100644 --- a/src/editor/deserialize.js +++ b/src/editor/deserialize.js @@ -20,6 +20,21 @@ import { walkDOMDepthFirst } from "./dom"; const REGEX_MATRIXTO = new RegExp(MATRIXTO_URL_PATTERN); +function parseAtRoomMentions(text, partCreator) { + const ATROOM = "@room"; + const parts = []; + text.split(ATROOM).forEach((textPart, i, arr) => { + if (textPart.length) { + parts.push(partCreator.plain(textPart)); + } + const isLast = i === arr.length - 1; + if (!isLast) { + parts.push(partCreator.atRoomPill(ATROOM)); + } + }); + return parts; +} + function parseLink(a, partCreator) { const {href} = a; const pillMatch = REGEX_MATRIXTO.exec(href) || []; @@ -158,7 +173,7 @@ function parseHtmlMessage(html, partCreator) { } if (n.nodeType === Node.TEXT_NODE) { - newParts.push(partCreator.plain(n.nodeValue)); + newParts.push(...parseAtRoomMentions(n.nodeValue, partCreator)); } else if (n.nodeType === Node.ELEMENT_NODE) { const parseResult = parseElement(n, partCreator); if (parseResult) { @@ -210,13 +225,11 @@ export function parseEvent(event, partCreator) { const lines = body.split("\n"); parts = lines.reduce((parts, line, i) => { const isLast = i === lines.length - 1; - const text = partCreator.plain(line); - const newLine = !isLast && partCreator.newline(); - if (newLine) { - return parts.concat(text, newLine); - } else { - return parts.concat(text); + const newParts = parseAtRoomMentions(line, partCreator); + if (!isLast) { + newParts.push(partCreator.newline()); } + return parts.concat(newParts); }, []); } if (content.msgtype === "m.emote") {