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; }