File indexing completed on 2024-03-24 04:58:21
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"