From 6738290d99c7984b96e495e7870320d6761764f8 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Wed, 21 Feb 2024 00:00:11 +1300 Subject: [PATCH] m->d: Reliably put < > around matrix.to links This replaces the turndown brackets system with a regexp over body and formatted_body. --- m2d/converters/event-to-message.js | 12 ++--- m2d/converters/event-to-message.test.js | 58 ++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js index 4ffe26e..ae9be22 100644 --- a/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -126,12 +126,10 @@ turndownService.addRule("inlineLink", { if (node.getAttribute("data-message-id")) return `https://discord.com/channels/${node.getAttribute("data-guild-id")}/${node.getAttribute("data-channel-id")}/${node.getAttribute("data-message-id")}` if (node.getAttribute("data-channel-id")) return `<#${node.getAttribute("data-channel-id")}>` const href = node.getAttribute("href") - let brackets = ["", ""] content = content.replace(/ @.*/, "") - if (href.startsWith("https://matrix.to")) brackets = ["<", ">"] - if (href === content) return brackets[0] + href + brackets[1] + if (href === content) return href if (href.startsWith("https://matrix.to/#/@") && content[0] !== "@") content = "@" + content - return "[" + content + "](" + brackets[0] + href + brackets[1] + ")" + return "[" + content + "](" + href + ")" } }) @@ -709,6 +707,9 @@ async function eventToMessage(event, guild, di) { // @ts-ignore bad type from turndown content = turndownService.turndown(root) + // Put < > around any surviving matrix.to links to hide the URL previews + content = content.replace(/\bhttps?:\/\/matrix\.to\/[^ )]*/, "<$&>") + // It's designed for commonmark, we need to replace the space-space-newline with just newline content = content.replace(/ \n/g, "\n") @@ -725,7 +726,8 @@ async function eventToMessage(event, guild, di) { content = `* ${displayName} ${content}` } - content = await handleRoomOrMessageLinks(content, di) + content = await handleRoomOrMessageLinks(content, di) // Replace matrix.to links with discord.com equivalents where possible + content = content.replace(/\bhttps?:\/\/matrix\.to\/[^ )]*/, "<$&>") // Put < > around any surviving matrix.to links to hide the URL previews const result = await checkWrittenMentions(content, guild, di) if (result) { diff --git a/m2d/converters/event-to-message.test.js b/m2d/converters/event-to-message.test.js index d8926b6..3865999 100644 --- a/m2d/converters/event-to-message.test.js +++ b/m2d/converters/event-to-message.test.js @@ -2731,7 +2731,7 @@ test("event2message: mentioning events falls back to original link when the chan ) }) -test("event2message: link to event in an unknown room", async t => { +test("event2message: link to event in an unknown room (href link)", async t => { t.deepEqual( await eventToMessage({ content: { @@ -2741,13 +2741,61 @@ test("event2message: link to event in an unknown room", async t => { formatted_body: 'ah yeah, here\'s where the bug was reported: https://matrix.to/#/!QtykxKocfZaZOUrTwp:matrix.org/$1542477546853947KGhZL:matrix.org' }, event_id: "$g07oYSZFWBkxohNEfywldwgcWj1hbhDzQ1sBAKvqOOU", - origin_server_ts: 1688301929913, room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe", sender: "@cadence:cadence.moe", type: "m.room.message", - unsigned: { - age: 405299 - } + }), + { + ensureJoined: [], + messagesToDelete: [], + messagesToEdit: [], + messagesToSend: [{ + username: "cadence [they]", + content: "ah yeah, here's where the bug was reported: ", + avatar_url: undefined + }] + } + ) +}) + +test("event2message: link to event in an unknown room (bare link)", async t => { + t.deepEqual( + await eventToMessage({ + content: { + body: "wrong body", + format: "org.matrix.custom.html", + formatted_body: "PK API failure, tho idk how you'd handle that https://matrix.to/#/!SeYQChwXBnZaQLoZfI:sleeping.town/$AAPZ56B2P7TfROYPTtuoJjgvXmaBM11NoNceM8GCJ7s", + msgtype: "m.text" + }, + sender: "@cadence:cadence.moe", + type: "m.room.message", + event_id: "$-UwntiHseGfch1GMjTROIgDbgLGIOwMx0vJdTi-dmok", + room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe" + }), + { + ensureJoined: [], + messagesToDelete: [], + messagesToEdit: [], + messagesToSend: [{ + username: "cadence [they]", + content: "PK API failure, tho idk how you'd handle that ", + avatar_url: undefined + }] + } + ) +}) + +test("event2message: link to event in an unknown room (plaintext)", async t => { + t.deepEqual( + await eventToMessage({ + content: { + msgtype: "m.text", + body: "ah yeah, here's where the bug was reported: https://matrix.to/#/!QtykxKocfZaZOUrTwp:matrix.org/$1542477546853947KGhZL:matrix.org" + }, + event_id: "$g07oYSZFWBkxohNEfywldwgcWj1hbhDzQ1sBAKvqOOU", + room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe", + sender: "@cadence:cadence.moe", + type: "m.room.message", }), { ensureJoined: [],