summary refs log tree commit diff
path: root/src/timeline/InputBar.cpp
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2022-07-20 13:52:13 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2022-07-20 14:05:10 +0200
commit0ad74590d4b7d91189a08d2278aaa6093d0a7e22 (patch)
tree86b4678bfb1d27d1346ef0bdfa419bce8fba4721 /src/timeline/InputBar.cpp
parentMerge pull request #1121 from MayeulC/32bit (diff)
downloadnheko-0ad74590d4b7d91189a08d2278aaa6093d0a7e22.tar.xz
Fix matrix.to link escaping
Properly escapes in replies and with unmatched [].

fixes #854
Diffstat (limited to 'src/timeline/InputBar.cpp')
-rw-r--r--src/timeline/InputBar.cpp52
1 files changed, 46 insertions, 6 deletions
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp

index 66bc8ef9..47efa867 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp
@@ -343,6 +343,47 @@ InputBar::openFileSelection() startUploadFromPath(fileName); } +QString +replaceMatrixToMarkdownLink(QString input) +{ + bool replaced = false; + do { + replaced = false; + + int endOfName = input.indexOf("](https://matrix.to/#/"); + int startOfName; + int nestingCount = 0; + for (startOfName = endOfName - 1; startOfName > 0; startOfName--) { + // skip escaped chars + if (startOfName > 0 && input[startOfName - 1] == '\\') + continue; + + if (input[startOfName] == '[') { + if (nestingCount <= 0) + break; + else + nestingCount--; + } + if (input[startOfName] == ']') + nestingCount++; + } + if (startOfName < 0 || nestingCount > 0) + break; + + int endOfLink = input.indexOf(')', endOfName); + int newline = input.indexOf('\n', endOfName); + if (endOfLink > endOfName && (newline == -1 || endOfLink < newline)) { + auto name = input.mid(startOfName + 1, endOfName - startOfName - 1); + name.replace("\\[", "["); + name.replace("\\]", "]"); + input.replace(startOfName, endOfLink - startOfName + 1, name); + replaced = true; + } + } while (replaced); + + return input; +} + void InputBar::message(const QString &msg, MarkdownOverride useMarkdown, bool rainbowify) { @@ -354,7 +395,7 @@ InputBar::message(const QString &msg, MarkdownOverride useMarkdown, bool rainbow useMarkdown == MarkdownOverride::ON) { text.formatted_body = utils::markdownToHtml(msg, rainbowify).toStdString(); // Remove markdown links by completer - text.body = msg.trimmed().replace(conf::strings::matrixToMarkdownLink, "\\1").toStdString(); + text.body = replaceMatrixToMarkdownLink(msg.trimmed()).toStdString(); // Don't send formatted_body, when we don't need to if (text.formatted_body.find('<') == std::string::npos) @@ -392,7 +433,8 @@ InputBar::message(const QString &msg, MarkdownOverride useMarkdown, bool rainbow } } - text.body = QStringLiteral("%1\n%2").arg(body, msg).toStdString(); + text.body = + QStringLiteral("%1\n%2").arg(body, QString::fromStdString(text.body)).toStdString(); // NOTE(Nico): rich replies always need a formatted_body! text.format = "org.matrix.custom.html"; @@ -426,8 +468,7 @@ InputBar::emote(const QString &msg, bool rainbowify) emote.formatted_body = html.toStdString(); emote.format = "org.matrix.custom.html"; // Remove markdown links by completer - emote.body = - msg.trimmed().replace(conf::strings::matrixToMarkdownLink, "\\1").toStdString(); + emote.body = replaceMatrixToMarkdownLink(msg.trimmed()).toStdString(); } if (!room->reply().isEmpty()) { @@ -454,8 +495,7 @@ InputBar::notice(const QString &msg, bool rainbowify) notice.formatted_body = html.toStdString(); notice.format = "org.matrix.custom.html"; // Remove markdown links by completer - notice.body = - msg.trimmed().replace(conf::strings::matrixToMarkdownLink, "\\1").toStdString(); + notice.body = replaceMatrixToMarkdownLink(msg.trimmed()).toStdString(); } if (!room->reply().isEmpty()) {