diff --git a/src/editor/deserialize.js b/src/editor/deserialize.js index 04edd4541c..2d725af4ac 100644 --- a/src/editor/deserialize.js +++ b/src/editor/deserialize.js @@ -15,11 +15,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MATRIXTO_URL_PATTERN } from '../linkify-matrix'; import { walkDOMDepthFirst } from "./dom"; import { checkBlockNode } from "../HtmlUtils"; - -const REGEX_MATRIXTO = new RegExp(MATRIXTO_URL_PATTERN); +import {getPrimaryPermalinkEntity} from "../utils/permalinks/RoomPermalinkCreator"; function parseAtRoomMentions(text, partCreator) { const ATROOM = "@room"; @@ -41,9 +39,8 @@ function parseAtRoomMentions(text, partCreator) { function parseLink(a, partCreator) { const {href} = a; - const pillMatch = REGEX_MATRIXTO.exec(href) || []; - const resourceId = pillMatch[1]; // The room/user ID - const prefix = pillMatch[2]; // The first character of prefix + const resourceId = getPrimaryPermalinkEntity(href); // The room/user ID + const prefix = resourceId ? resourceId[0] : undefined; // First character of ID switch (prefix) { case "@": return partCreator.userPill(a.textContent, resourceId); diff --git a/src/editor/serialize.js b/src/editor/serialize.js index 07a1ad908e..734e2ba030 100644 --- a/src/editor/serialize.js +++ b/src/editor/serialize.js @@ -16,6 +16,7 @@ limitations under the License. */ import Markdown from '../Markdown'; +import {makeGenericPermalink} from "../utils/permalinks/RoomPermalinkCreator"; export function mdSerialize(model) { return model.parts.reduce((html, part) => { @@ -29,7 +30,7 @@ export function mdSerialize(model) { return html + part.text; case "room-pill": case "user-pill": - return html + `[${part.text}](https://matrix.to/#/${part.resourceId})`; + return html + `[${part.text}](${makeGenericPermalink(part.resourceId)})`; } }, ""); } diff --git a/src/utils/permalinks/PermalinkConstructor.js b/src/utils/permalinks/PermalinkConstructor.js index 507f16f795..f74c432bf0 100644 --- a/src/utils/permalinks/PermalinkConstructor.js +++ b/src/utils/permalinks/PermalinkConstructor.js @@ -35,6 +35,10 @@ export default class PermalinkConstructor { throw new Error("Not implemented"); } + forEntity(entityId: string): string { + throw new Error("Not implemented"); + } + isPermalinkHost(host: string): boolean { throw new Error("Not implemented"); } diff --git a/src/utils/permalinks/RiotPermalinkConstructor.js b/src/utils/permalinks/RiotPermalinkConstructor.js index 1b985e8190..f8c4cb361e 100644 --- a/src/utils/permalinks/RiotPermalinkConstructor.js +++ b/src/utils/permalinks/RiotPermalinkConstructor.js @@ -48,6 +48,16 @@ export default class RiotPermalinkConstructor extends PermalinkConstructor { return `${this._riotUrl}/#/group/${groupId}`; } + forEntity(entityId: string): string { + if (entityId[0] === '!' || entityId[0] === '#') { + return this.forRoom(entityId); + } else if (entityId[0] === '@') { + return this.forUser(entityId); + } else if (entityId[0] === '+') { + return this.forGroup(entityId); + } else throw new Error("Unrecognized entity"); + } + isPermalinkHost(testHost: string): boolean { const parsedUrl = new URL(this._riotUrl); return testHost === (parsedUrl.host || parsedUrl.hostname); // one of the hosts should match diff --git a/src/utils/permalinks/RoomPermalinkCreator.js b/src/utils/permalinks/RoomPermalinkCreator.js index 666729bacd..4cac095ca0 100644 --- a/src/utils/permalinks/RoomPermalinkCreator.js +++ b/src/utils/permalinks/RoomPermalinkCreator.js @@ -253,6 +253,10 @@ export class RoomPermalinkCreator { } } +export function makeGenericPermalink(entityId: string): string { + return getPermalinkConstructor().forEntity(entityId); +} + export function makeUserPermalink(userId) { return getPermalinkConstructor().forUser(userId); } diff --git a/src/utils/permalinks/SpecPermalinkConstructor.js b/src/utils/permalinks/SpecPermalinkConstructor.js index e4cff798a7..1c80ff8975 100644 --- a/src/utils/permalinks/SpecPermalinkConstructor.js +++ b/src/utils/permalinks/SpecPermalinkConstructor.js @@ -43,6 +43,10 @@ export default class SpecPermalinkConstructor extends PermalinkConstructor { return `${baseUrl}/#/${groupId}`; } + forEntity(entityId: string): string { + return `${baseUrl}/#/${entityId}`; + } + isPermalinkHost(testHost: string): boolean { return testHost === host; }