File indexing completed on 2024-04-28 12:40:55

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2008-2012 Mehrdad Momeny <mehrdad.momeny@gmail.com>
0005     SPDX-FileCopyrightText: 2014 Andrea Scarpino <scarpino@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0008 */
0009 
0010 #include "urlutils.h"
0011 
0012 #include <QRegExp>
0013 
0014 const QString protocols = QLatin1String("((https?|ftps?)://)");
0015 const QString subdomains = QLatin1String("(([a-z0-9\\-_]{1,}\\.)?)");
0016 const QString auth = QLatin1String("(([a-z0-9\\-_]{1,})((:[\\S]{1,})?)@)");
0017 const QString domains = QLatin1String("(([a-z0-9\\-\\x0080-\\xFFFF_]){1,63}\\.)+");
0018 const QString port = QLatin1String("(:(6553[0-5]|655[0-2][0-9]|65[0-4][\\d]{2}|6[0-4][\\d]{3}|[1-5][\\d]{4}|[1-9][\\d]{0,3}))");
0019 const QString zone = QLatin1String("((a[cdefgilmnoqrstuwxz])|(b[abdefghijlmnorstvwyz])|(c[acdfghiklmnoruvxyz])|(d[ejkmoz])|(e[ceghrstu])|\
0020 (f[ijkmor])|(g[abdefghilmnpqrstuwy])|(h[kmnrtu])|(i[delmnoqrst])|(j[emop])|(k[eghimnprwyz])|(l[abcikrstuvy])|\
0021 (m[acdefghklmnopqrstuvwxyz])|(n[acefgilopruz])|(om)|(p[aefghklnrstwy])|(qa)|(r[eosuw])|(s[abcdeghijklmnortuvyz])|\
0022 (t[cdfghjkmnoprtvwz])|(u[agksyz])|(v[aceginu])|(w[fs])|(ye)|(z[amrw])\
0023 |(asia|com|info|net|org|biz|name|pro|aero|cat|coop|edu|jobs|mobi|museum|tel|travel|gov|int|mil|local|xxx)|(中国)|(公司)|(网络)|(صر)|(امارات)|(рф))");
0024 const QString ip = QLatin1String("(25[0-5]|[2][0-4][0-9]|[0-1]?[\\d]{1,2})(\\.(25[0-5]|[2][0-4][0-9]|[0-1]?[\\d]{1,2})){3}");
0025 const QString params = QLatin1String("(((\\/)[\\w:/\\?#\\[\\]@!\\$&\\(\\)\\*%\\+,;=\\._~\\x0080-\\xFFFF\\-\\|]{1,}|%[0-9a-f]{2})?)");
0026 const QString excludingCharacters = QStringLiteral("[^\\s`!()\\[\\]{};:'\".,<>?%1%2%3%4%5%6]")
0027                                     .arg(QChar(0x00AB)).arg(QChar(0x00BB)).arg(QChar(0x201C)).arg(QChar(0x201D)).arg(QChar(0x2018)).arg(QChar(0x2019));
0028 
0029 const QRegExp UrlUtils::mUrlRegExp(QLatin1String("(((((") + protocols + auth + QLatin1String("?)?)") +
0030                                    subdomains +
0031                                    QLatin1Char('(') + domains +
0032                                    zone + QLatin1String("(?!(\\w))))|(") + protocols + QLatin1Char('(') + ip + QLatin1String(")+))") +
0033                                    QLatin1Char('(') + port + QLatin1String("?)") + QLatin1String("((\\/)?)")  +
0034                                    params + QLatin1Char(')') + excludingCharacters, Qt::CaseInsensitive);
0035 
0036 const QRegExp UrlUtils::mEmailRegExp(QLatin1Char('^') + auth + subdomains + domains + zone);
0037 const QString hrefTemplate = QLatin1String("<a href='%1' title='%1'>%2</a>");
0038 
0039 UrlUtils::UrlUtils()
0040 {
0041 }
0042 
0043 UrlUtils::~UrlUtils()
0044 {
0045 }
0046 
0047 QStringList UrlUtils::detectUrls(const QString &text)
0048 {
0049     QStringList detectedUrls;
0050 
0051     int pos = 0;
0052     while (((pos = mUrlRegExp.indexIn(text, pos)) != -1)) {
0053         const QString link = mUrlRegExp.cap(0);
0054         if ((pos - 1 > -1 && (text.at(pos - 1) != QLatin1Char('@') &&
0055                               text.at(pos - 1) != QLatin1Char('#') && text.at(pos - 1) != QLatin1Char('!'))) ||
0056                 (pos == 0)) {
0057             detectedUrls << link;
0058         }
0059         pos += link.length();
0060     }
0061 
0062     return detectedUrls;
0063 }
0064 
0065 QString UrlUtils::detectEmails(const QString &text)
0066 {
0067     QString mailtoText(text);
0068 
0069     int pos = 0;
0070     while (((pos = mEmailRegExp.indexIn(mailtoText, pos)) != -1)) {
0071         QString link = mEmailRegExp.cap(0);
0072         QString tmplink = link;
0073         if ((pos - 1 > -1 && (mailtoText.at(pos - 1) != QLatin1Char('@') &&
0074                               mailtoText.at(pos - 1) != QLatin1Char('#') && mailtoText.at(pos - 1) != QLatin1Char('!'))) ||
0075                 pos == 0) {
0076             tmplink.prepend(QLatin1String("mailto:"));
0077             mailtoText.remove(pos, link.length());
0078             tmplink = hrefTemplate.arg(tmplink, link);
0079             mailtoText.insert(pos, tmplink);
0080         }
0081         pos += tmplink.length();
0082     }
0083 
0084     return mailtoText;
0085 }
0086 
0087 #include "moc_urlutils.cpp"