diff --git a/src/matrix/room/timeline/entries/BaseEventEntry.js b/src/matrix/room/timeline/entries/BaseEventEntry.js index 41960e75..a106af58 100644 --- a/src/matrix/room/timeline/entries/BaseEventEntry.js +++ b/src/matrix/room/timeline/entries/BaseEventEntry.js @@ -16,8 +16,9 @@ limitations under the License. import {BaseEntry} from "./BaseEntry.js"; import {REDACTION_TYPE} from "../../common.js"; -import {createAnnotation, createReply, ANNOTATION_RELATION_TYPE, getRelationFromContent} from "../relations.js"; +import {createAnnotation, ANNOTATION_RELATION_TYPE, getRelationFromContent} from "../relations.js"; import {PendingAnnotation} from "../PendingAnnotation.js"; +import {createReply, fallbackBlurb, fallbackPrefix} from "./reply.js" function htmlEscape(string) { return string.replace(/&/g, "&").replace(//g, ">"); @@ -155,55 +156,26 @@ export class BaseEventEntry extends BaseEntry { return createAnnotation(this.id, key); } - _fallbackBlurb() { - switch (this.content.msgtype) { - case "m.file": - return "sent a file."; - case "m.image": - return "sent an image."; - case "m.video": - return "sent a video."; - case "m.audio": - return "sent an audio file."; - } - } - - _fallbackPrefix() { - return this.content.msgtype === "m.emote" ? "* " : ""; - } - - get _formattedBody() { - return this.content.formatted_body || (this.content.body && htmlEscape(this.content.body)); - } - - get _plainBody() { - return this.content.body; - } - - _replyFormattedFallback() { - const body = this._fallbackBlurb() || this._formattedBody || ""; - const prefix = this._fallbackPrefix(); - return ` -
- In reply to - ${prefix}${this.displayName || this.sender} -
- ${body} -
-
`; - } - - _replyPlainFallback() { - const body = this._fallbackBlurb() || this._plainBody || ""; - const bodyLines = body.split("\n"); - bodyLines[0] = `> <${this.sender}> ${bodyLines[0]}` - return bodyLines.join("\n> "); - } - reply(msgtype, body) { // TODO check for absense of sender / body / msgtype / etc? - const newBody = this._replyPlainFallback() + '\n\n' + body; - const newFormattedBody = this._replyFormattedFallback() + htmlEscape(body); + let blurb = fallbackBlurb(this.content.msgtype); + const prefix = fallbackPrefix(this.content.msgtype); + const sender = this.sender; + const name = this.displayName || sender; + + const formattedBody = blurb || this.content.formatted_body || + (this.content.body && htmlEscape(this.content.body)) || ""; + const formattedFallback = `
In reply to ${prefix}` + + `${name}
` + + `${formattedBody}
`; + + const plainBody = blurb || this.content.body || ""; + const bodyLines = plainBody.split("\n"); + bodyLines[0] = `> ${prefix}<${sender}> ${bodyLines[0]}` + const plainFallback = bodyLines.join("\n> "); + + const newBody = plainFallback + '\n\n' + body; + const newFormattedBody = formattedFallback + htmlEscape(body); return createReply(this.id, msgtype, newBody, newFormattedBody); } diff --git a/src/matrix/room/timeline/entries/reply.js b/src/matrix/room/timeline/entries/reply.js new file mode 100644 index 00000000..00d591e0 --- /dev/null +++ b/src/matrix/room/timeline/entries/reply.js @@ -0,0 +1,33 @@ + +export function fallbackBlurb(msgtype) { + switch (msgtype) { + case "m.file": + return "sent a file."; + case "m.image": + return "sent an image."; + case "m.video": + return "sent a video."; + case "m.audio": + return "sent an audio file."; + } + return null; +} + +export function fallbackPrefix(msgtype) { + return msgtype === "m.emote" ? "* " : ""; +} + +export function createReply(targetId, msgtype, body, formattedBody) { + return { + msgtype, + body, + "format": "org.matrix.custom.html", + "formatted_body": formattedBody, + "m.relates_to": { + "m.in_reply_to": { + "event_id": targetId + } + } + }; +} + diff --git a/src/matrix/room/timeline/relations.js b/src/matrix/room/timeline/relations.js index 17d1e9d7..4009d8c4 100644 --- a/src/matrix/room/timeline/relations.js +++ b/src/matrix/room/timeline/relations.js @@ -29,20 +29,6 @@ export function createAnnotation(targetId, key) { }; } -export function createReply(targetId, msgtype, body, formattedBody) { - return { - msgtype, - body, - "format": "org.matrix.custom.html", - "formatted_body": formattedBody, - "m.relates_to": { - "m.in_reply_to": { - "event_id": targetId - } - } - }; -} - export function getRelationTarget(relation) { return relation.event_id || relation["m.in_reply_to"]?.event_id }