#include "message_links.h" #include #include /* Отделить адрес от текста, сохраняя сбалансированные скобки внутри пути/query. */ QVector messageLinks(const QString& text) { static const QRegularExpression pattern(QStringLiteral( "utun://[A-Za-z0-9+/]+={0,2}|(?i:https?://)[^\\s\\p{Z}\\p{Cc}<>\"'`«»“”‘’]+")); QVector links; auto matches = pattern.globalMatch(text); while (matches.hasNext()) { 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); } const QUrl parsed(url, QUrl::StrictMode); if (!parsed.isValid() || parsed.host().isEmpty()) continue; } links.append({(int)match.capturedStart(), (int)url.length(), url}); } return links; }