mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
fix: URL patterns based on RFC 3986
Also added const's and changed way of REGEX_TO_WRAPPER' initialization
This commit is contained in:
parent
7b74cc5019
commit
6ffe4cd8d8
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
|
|
||||||
/* Easy way to get count of markdown symbols - through length of substring, captured by reex group.
|
/* Easy way to get count of markdown symbols - through length of substring, captured by regex group.
|
||||||
* If you suppose to change regexes, assure that this const points to right group.
|
* If you suppose to change regexes, assure that this const points to right group.
|
||||||
*/
|
*/
|
||||||
static constexpr uint8_t MARKDOWN_SYMBOLS_GROUP_INDEX = 1;
|
static constexpr uint8_t MARKDOWN_SYMBOLS_GROUP_INDEX = 1;
|
||||||
|
@ -60,30 +60,39 @@ static const QString MULTILINE_CODE = QStringLiteral("(?<=^|[\\s\\n])"
|
||||||
"```"
|
"```"
|
||||||
"(?=$|[\\s\\n])");
|
"(?=$|[\\s\\n])");
|
||||||
|
|
||||||
|
#define REGEXP_WRAPPER_PAIR(pattern, wrapper)\
|
||||||
|
{QRegularExpression(pattern,QRegularExpression::UseUnicodePropertiesOption),QStringLiteral(wrapper)}
|
||||||
|
|
||||||
static const QPair<QRegularExpression, QString> REGEX_TO_WRAPPER[] {
|
static const QPair<QRegularExpression, QString> REGEX_TO_WRAPPER[] {
|
||||||
{QRegularExpression(SINGLE_SLASH_PATTERN), QStringLiteral("<i>%1</i>")},
|
REGEXP_WRAPPER_PAIR(SINGLE_SLASH_PATTERN, "<i>%1</i>"),
|
||||||
{QRegularExpression(SINGLE_SIGN_PATTERN.arg('*')), QStringLiteral("<b>%1</b>")},
|
REGEXP_WRAPPER_PAIR(SINGLE_SIGN_PATTERN.arg('*'), "<b>%1</b>"),
|
||||||
{QRegularExpression(SINGLE_SIGN_PATTERN.arg('_')), QStringLiteral("<u>%1</u>")},
|
REGEXP_WRAPPER_PAIR(SINGLE_SIGN_PATTERN.arg('_'), "<u>%1</u>"),
|
||||||
{QRegularExpression(SINGLE_SIGN_PATTERN.arg('~')), QStringLiteral("<s>%1</s>")},
|
REGEXP_WRAPPER_PAIR(SINGLE_SIGN_PATTERN.arg('~'), "<s>%1</s>"),
|
||||||
{QRegularExpression(SINGLE_SIGN_PATTERN.arg('`')), QStringLiteral("<font color=#595959><code>"
|
REGEXP_WRAPPER_PAIR(SINGLE_SIGN_PATTERN.arg('`'), "<font color=#595959><code>%1</code></font>"),
|
||||||
"%1</code></font>")},
|
REGEXP_WRAPPER_PAIR(DOUBLE_SIGN_PATTERN.arg('*'), "<b>%1</b>"),
|
||||||
{QRegularExpression(DOUBLE_SIGN_PATTERN.arg('*')), QStringLiteral("<b>%1</b>")},
|
REGEXP_WRAPPER_PAIR(DOUBLE_SIGN_PATTERN.arg('/'), "<i>%1</i>"),
|
||||||
{QRegularExpression(DOUBLE_SIGN_PATTERN.arg('/')), QStringLiteral("<i>%1</i>")},
|
REGEXP_WRAPPER_PAIR(DOUBLE_SIGN_PATTERN.arg('_'), "<u>%1</u>"),
|
||||||
{QRegularExpression(DOUBLE_SIGN_PATTERN.arg('_')), QStringLiteral("<u>%1</u>")},
|
REGEXP_WRAPPER_PAIR(DOUBLE_SIGN_PATTERN.arg('~'), "<s>%1</s>"),
|
||||||
{QRegularExpression(DOUBLE_SIGN_PATTERN.arg('~')), QStringLiteral("<s>%1</s>")},
|
REGEXP_WRAPPER_PAIR(MULTILINE_CODE, "<font color=#595959><code>%1</code></font>"),
|
||||||
{QRegularExpression(MULTILINE_CODE), QStringLiteral("<font color=#595959><code>"
|
};
|
||||||
"%1</code></font>")}};
|
|
||||||
|
#undef REGEXP_WRAPPER_PAIR
|
||||||
|
|
||||||
static const QString HREF_WRAPPER = QStringLiteral(R"(<a href="%1">%1</a>)");
|
static const QString HREF_WRAPPER = QStringLiteral(R"(<a href="%1">%1</a>)");
|
||||||
|
|
||||||
|
// based in this: https://tools.ietf.org/html/rfc3986#section-2
|
||||||
|
static const QString URL_PATH_PATTERN = QStringLiteral("[\\w:/?#\\[\\]@!$&'{}*+,;.~%=-]+");
|
||||||
|
|
||||||
static const QRegularExpression URL_PATTERNS[] = {
|
static const QRegularExpression URL_PATTERNS[] = {
|
||||||
QRegularExpression("\\b(www\\.|((http[s]?)|ftp)://)\\w+\\S+"),
|
QRegularExpression(QStringLiteral(R"(\b(www\.|((http[s]?)|ftp)://)%1)").arg(URL_PATH_PATTERN)),
|
||||||
QRegularExpression("\\b(file|smb)://([\\S| ]*)"),
|
QRegularExpression(QStringLiteral(R"(\b(file|smb)://([\S| ]*))")),
|
||||||
QRegularExpression("\\btox:[a-zA-Z\\d]{76}"),
|
QRegularExpression(QStringLiteral(R"(\btox:[a-zA-Z\\d]{76})")),
|
||||||
QRegularExpression("\\bmailto:\\S+@\\S+\\.\\S+"),
|
QRegularExpression(QStringLiteral(R"(\bmailto:\S+@\S+\.\S+)")),
|
||||||
QRegularExpression("\\btox:\\S+@\\S+")
|
QRegularExpression(QStringLiteral(R"(\btox:\S+@\S+)")),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Highlights URLs within passed message string
|
* @brief Highlights URLs within passed message string
|
||||||
* @param message Where search for URLs
|
* @param message Where search for URLs
|
||||||
|
@ -92,15 +101,15 @@ static const QRegularExpression URL_PATTERNS[] = {
|
||||||
QString highlightURL(const QString& message)
|
QString highlightURL(const QString& message)
|
||||||
{
|
{
|
||||||
QString result = message;
|
QString result = message;
|
||||||
for (QRegularExpression exp : URL_PATTERNS) {
|
for (const QRegularExpression& exp : URL_PATTERNS) {
|
||||||
int startLength = result.length();
|
const int startLength = result.length();
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
QRegularExpressionMatchIterator iter = exp.globalMatch(result);
|
QRegularExpressionMatchIterator iter = exp.globalMatch(result);
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
QRegularExpressionMatch match = iter.next();
|
const QRegularExpressionMatch match = iter.next();
|
||||||
int startPos = match.capturedStart() + offset;
|
const int startPos = match.capturedStart() + offset;
|
||||||
int length = match.capturedLength();
|
const int length = match.capturedLength();
|
||||||
QString wrappedURL = HREF_WRAPPER.arg(match.captured());
|
const QString wrappedURL = HREF_WRAPPER.arg(match.captured());
|
||||||
result.replace(startPos, length, wrappedURL);
|
result.replace(startPos, length, wrappedURL);
|
||||||
offset = result.length() - startLength;
|
offset = result.length() - startLength;
|
||||||
}
|
}
|
||||||
|
@ -108,7 +117,6 @@ QString highlightURL(const QString& message)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clang-format on
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks HTML tags intersection while applying styles to the message text
|
* @brief Checks HTML tags intersection while applying styles to the message text
|
||||||
* @param str Checking string
|
* @param str Checking string
|
||||||
|
|
Loading…
Reference in New Issue
Block a user