Rewrite matrix.to links to matrix uris and handle them the same way
2 files changed, 48 insertions, 14 deletions
diff --git a/resources/qml/MatrixText.qml b/resources/qml/MatrixText.qml
index dfe7122d..0876e610 100644
--- a/resources/qml/MatrixText.qml
+++ b/resources/qml/MatrixText.qml
@@ -14,19 +14,7 @@ TextEdit {
selectByMouse: !Settings.mobileMode
enabled: selectByMouse
color: colors.text
- onLinkActivated: {
- if (/^https:\/\/matrix.to\/#\/(@.*)$/.test(link)) {
- chat.model.openUserProfile(/^https:\/\/matrix.to\/#\/(@.*)$/.exec(link)[1]);
- } else if (/^https:\/\/matrix.to\/#\/(![^\/]*)$/.test(link)) {
- TimelineManager.setHistoryView(/^https:\/\/matrix.to\/#\/(!.*)$/.exec(link)[1]);
- } else if (/^https:\/\/matrix.to\/#\/(![^\/]*)\/(\$.*)$/.test(link)) {
- var match = /^https:\/\/matrix.to\/#\/(![^\/]*)\/(\$.*)$/.exec(link);
- TimelineManager.setHistoryView(match[1]);
- chat.positionViewAtIndex(chat.model.idToIndex(match[2]), ListView.Contain);
- } else {
- TimelineManager.openLink(link);
- }
- }
+ onLinkActivated: TimelineManager.openLink(link);
ToolTip.visible: hoveredLink
ToolTip.text: hoveredLink
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 9d12825f..33af1825 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -451,7 +451,53 @@ TimelineViewManager::openImageOverlayInternal(QString eventId, QImage img)
void
TimelineViewManager::openLink(QString link) const
{
- QDesktopServices::openUrl(link);
+ QUrl url(link);
+ if (url.scheme() == "https" && url.host() == "matrix.to") {
+ // handle matrix.to links internally
+ QString p = url.fragment(QUrl::FullyDecoded);
+ if (p.startsWith("/"))
+ p.remove(0, 1);
+
+ auto temp = p.split("?");
+ QString query;
+ if (temp.size() >= 2)
+ query = temp.takeAt(1);
+
+ temp = temp.first().split("/");
+ auto identifier = temp.first();
+ QString eventId;
+ if (temp.size() >= 2)
+ eventId = temp.takeAt(1);
+ if (!identifier.isEmpty()) {
+ if (identifier.startsWith("@")) {
+ QByteArray uri =
+ "matrix:u/" + QUrl::toPercentEncoding(identifier.remove(0, 1));
+ if (!query.isEmpty())
+ uri.append("?" + query.toUtf8());
+ ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+ } else if (identifier.startsWith("#")) {
+ QByteArray uri =
+ "matrix:r/" + QUrl::toPercentEncoding(identifier.remove(0, 1));
+ if (!eventId.isEmpty())
+ uri.append("/e/" +
+ QUrl::toPercentEncoding(eventId.remove(0, 1)));
+ if (!query.isEmpty())
+ uri.append("?" + query.toUtf8());
+ ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+ } else if (identifier.startsWith("!")) {
+ QByteArray uri = "matrix:roomid/" +
+ QUrl::toPercentEncoding(identifier.remove(0, 1));
+ if (!eventId.isEmpty())
+ uri.append("/e/" +
+ QUrl::toPercentEncoding(eventId.remove(0, 1)));
+ if (!query.isEmpty())
+ uri.append("?" + query.toUtf8());
+ ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+ }
+ }
+ } else {
+ QDesktopServices::openUrl(url);
+ }
}
void
|