diff --git a/src/texthandler.cpp b/src/texthandler.cpp
index ea6a89f88..c5a9147ee 100644
--- a/src/texthandler.cpp
+++ b/src/texthandler.cpp
@@ -429,9 +429,54 @@ QString TextHandler::unescapeHtml(QString stringIn)
QString TextHandler::linkifyUrls(QString stringIn)
{
- stringIn = stringIn.replace(TextRegex::mxId, QStringLiteral(R"(\1\2)"));
- stringIn.replace(TextRegex::plainUrl, QStringLiteral(R"(\1)"));
- stringIn = stringIn.replace(TextRegex::emailAddress, QStringLiteral(R"(\1\2)"));
+ QRegularExpressionMatch match;
+ int start = 0;
+ for (int index = 0; index != -1; index = stringIn.indexOf(TextRegex::mxId, start, &match)) {
+ int skip = 0;
+ if (match.captured(0).size() > 0) {
+ if (stringIn.left(index).count(QStringLiteral("")) == stringIn.left(index).count(QStringLiteral(""))) {
+ auto replacement = QStringLiteral("%1").arg(match.captured(2));
+ stringIn = stringIn.replace(index, match.captured(0).size(), replacement);
+ } else {
+ skip = match.captured().length();
+ }
+ }
+ start = index + skip;
+ match = {};
+ }
+ start = 0;
+ match = {};
+ for (int index = 0; index != -1; index = stringIn.indexOf(TextRegex::plainUrl, start, &match)) {
+ int skip = 0;
+ if (match.captured(0).size() > 0) {
+ if (stringIn.left(index).count(QStringLiteral("")) == stringIn.left(index).count(QStringLiteral(""))) {
+ auto replacement = QStringLiteral("%1").arg(match.captured(1));
+ stringIn = stringIn.replace(index, match.captured(0).size(), replacement);
+ skip = replacement.length();
+ } else {
+ skip = match.captured().length();
+ }
+ }
+ start = index + skip;
+ match = {};
+ }
+ start = 0;
+ match = {};
+ for (int index = 0; index != -1; index = stringIn.indexOf(TextRegex::emailAddress, start, &match)) {
+ int skip = 0;
+ if (match.captured(0).size() > 0) {
+ if (stringIn.left(index).count(QStringLiteral("")) == stringIn.left(index).count(QStringLiteral(""))) {
+ auto replacement = QStringLiteral("%1").arg(match.captured(2));
+ stringIn = stringIn.replace(index, match.captured(0).size(), replacement);
+ skip = replacement.length();
+ } else {
+ skip = match.captured().length();
+ }
+ }
+ start = index + skip;
+ match = {};
+ }
+
return stringIn;
}