diff --git a/src/domain/session/room/timeline/MessageBody.js b/src/domain/session/room/timeline/MessageBody.js index a2250dfb..42f3c951 100644 --- a/src/domain/session/room/timeline/MessageBody.js +++ b/src/domain/session/room/timeline/MessageBody.js @@ -1,5 +1,10 @@ import { linkify } from "./linkify/linkify.js"; +/** + * Parse text into parts such as newline, links and text. + * @param {string} body A string to parse into parts + * @returns {MessageBody} Parsed result + */ export function parsePlainBody(body) { const parts = []; const lines = body.split("\n"); @@ -16,7 +21,7 @@ export function parsePlainBody(body) { for (let i = 0; i < lines.length; i += 1) { const line = lines[i]; if (line.length) { - linkify(lines[i], linkifyCallback); + linkify(line, linkifyCallback); } const isLastLine = i >= (lines.length - 1); if (!isLastLine) { diff --git a/src/domain/session/room/timeline/linkify/linkify.js b/src/domain/session/room/timeline/linkify/linkify.js index 333705c1..58641055 100644 --- a/src/domain/session/room/timeline/linkify/linkify.js +++ b/src/domain/session/room/timeline/linkify/linkify.js @@ -1,5 +1,13 @@ import { regex } from "./regex.js"; +/** + * Splits text into links and non-links. + * For each such separated token, callback is called + * with the token and a boolean passed as argument. + * The boolean indicates whether the token is a link or not. + * @param {string} text Text to split + * @param {function(string, boolean)} callback A function to call with split tokens + */ export function linkify(text, callback) { const matches = text.matchAll(regex); let curr = 0; diff --git a/src/platform/web/ui/session/room/timeline/TextMessageView.js b/src/platform/web/ui/session/room/timeline/TextMessageView.js index 4af5e5a2..dc5550ee 100644 --- a/src/platform/web/ui/session/room/timeline/TextMessageView.js +++ b/src/platform/web/ui/session/room/timeline/TextMessageView.js @@ -28,6 +28,9 @@ export class TextMessageView extends TemplateView { } } +/** + * Map from part to function that outputs DOM for the part + */ const formatFunction = { text: textPart => text(textPart.text), link: linkPart => tag.a({ href: linkPart.url, target: "_blank", rel: "noopener" }, [linkPart.text]),