Trim desktop message link punctuation in linear time
This commit is contained in:
1 parent
f04637a257
commit
3d48024fd8
3 files changed
+44
-10
No files matched your search
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user