Trim desktop message link punctuation in linear time

This commit is contained in:
evgeny committed 2026-10-27 14:22:32 +01:00
1 parent f04637a257
commit 3d48024fd8
3 files changed
+44 -10

No files matched your search

+17 -6
View File
@@ -12,13 +12,24 @@ QVector<MessageLink> messageLinks(const QString& text) {
const auto match = matches.next();
QString url = match.captured();
if (!url.startsWith(QStringLiteral("utun://"))) {
while (!url.isEmpty()) {
const QChar last = url.back();
const int closing = QStringLiteral(")]}").indexOf(last);
const bool unmatched = closing >= 0 && url.count(last) > url.count(QStringLiteral("([{").at(closing));
if (!QStringLiteral(".,;:!?").contains(last) && !unmatched) break;
url.chop(1);
// Один подсчёт и один проход по хвосту: повторный count() на каждой скобке даёт O(n²).
qsizetype balance[3] = {};
for (const QChar ch : url) {
const int opening = QStringLiteral("([{").indexOf(ch);
const int closing = QStringLiteral(")]}").indexOf(ch);
if (opening >= 0) balance[opening]--;
if (closing >= 0) balance[closing]++;
}
auto end = url.size();
while (end > 0) {
const QChar last = url.at(end - 1);
const int closing = QStringLiteral(")]}").indexOf(last);
const bool unmatched = closing >= 0 && balance[closing] > 0;
if (!QStringLiteral(".,;:!?").contains(last) && !unmatched) break;
if (closing >= 0) balance[closing]--;
end--;
}
url.truncate(end);
const QUrl parsed(url, QUrl::StrictMode);
if (!parsed.isValid() || parsed.host().isEmpty()) continue;
}