Correct terms and move into anonymous namespace

This commit is contained in:
Zentino 2024-12-08 00:47:32 +08:00
commit c3dcba3b4a
No known key found for this signature in database
GPG key ID: ADEEC991C0DEE42A

View file

@ -53,9 +53,10 @@
#include "automatedrssdownloader.h" #include "automatedrssdownloader.h"
#include "feedlistwidget.h" #include "feedlistwidget.h"
#include "ui_rsswidget.h" #include "ui_rsswidget.h"
namespace
{
void convertRelativeUrlToAbsolute(QString &html, const QString &baseUrl); void convertRelativeUrlToAbsolute(QString &html, const QString &baseUrl);
}
RSSWidget::RSSWidget(IGUIApplication *app, QWidget *parent) RSSWidget::RSSWidget(IGUIApplication *app, QWidget *parent)
: GUIApplicationComponent(app, parent) : GUIApplicationComponent(app, parent)
, m_ui {new Ui::RSSWidget} , m_ui {new Ui::RSSWidget}
@ -613,20 +614,23 @@ void RSSWidget::renderArticle(const RSS::Article *article) const
html += u"<pre>" + description + u"</pre>"; html += u"<pre>" + description + u"</pre>";
} }
// Supplement relative path to absolute path // Supplement relative URLs to absolute ones
const QUrl url {article->link()}; const QUrl url {article->link()};
const QString baseUrl = url.toString(QUrl::RemovePath | QUrl::RemoveQuery); const QString baseUrl = url.toString(QUrl::RemovePath | QUrl::RemoveQuery);
convertRelativeUrlToAbsolute(html, baseUrl); convertRelativeUrlToAbsolute(html, baseUrl);
html += u"</div>"; html += u"</div>";
m_ui->textBrowser->setHtml(html); m_ui->textBrowser->setHtml(html);
} }
namespace
void convertRelativeUrlToAbsolute(QString &html, const QString &baseUrl)
{ {
void convertRelativeUrlToAbsolute(QString &html, const QString &baseUrl)
{
const QRegularExpression rx {uR"(((<a\s+[^>]*?href|<img\s+[^>]*?src)\s*=\s*["'])((https?|ftp):)?(\/\/[^\/]*)?(\/?[^\/"].*?)(["']))"_s const QRegularExpression rx {uR"(((<a\s+[^>]*?href|<img\s+[^>]*?src)\s*=\s*["'])((https?|ftp):)?(\/\/[^\/]*)?(\/?[^\/"].*?)(["']))"_s
, QRegularExpression::CaseInsensitiveOption}; , QRegularExpression::CaseInsensitiveOption};
QString normalizedBaseUrl = baseUrl.endsWith(u'/') ? baseUrl : baseUrl + u'/'; QString normalizedBaseUrl = baseUrl.endsWith(u'/') ? baseUrl : baseUrl + u'/';
const QUrl url {normalizedBaseUrl};
const QString defaultScheme = url.scheme();
QRegularExpressionMatchIterator iter = rx.globalMatch(html); QRegularExpressionMatchIterator iter = rx.globalMatch(html);
while (iter.hasNext()) while (iter.hasNext())
@ -639,7 +643,7 @@ void convertRelativeUrlToAbsolute(QString &html, const QString &baseUrl)
if (host.isEmpty()) if (host.isEmpty())
break; // invalid URL, should never happen break; // invalid URL, should never happen
// already absolute path // already absolute URL
continue; continue;
} }
@ -648,13 +652,15 @@ void convertRelativeUrlToAbsolute(QString &html, const QString &baseUrl)
relativePath = relativePath.mid(1); relativePath = relativePath.mid(1);
if (!host.isEmpty()) if (!host.isEmpty())
normalizedBaseUrl = u"http:" + host; {
normalizedBaseUrl = defaultScheme + u":" + host;
}
const QString fullMatch = match.captured(0); const QString fullMatch = match.captured(0);
const QString prefix = match.captured(1); const QString prefix = match.captured(1);
const QString suffix = match.captured(7); const QString suffix = match.captured(7);
const QString absolutePath = normalizedBaseUrl + relativePath; const QString absoluteUrl = normalizedBaseUrl + relativePath;
html.replace(fullMatch, (prefix + absolutePath + suffix)); html.replace(fullMatch, (prefix + absoluteUrl + suffix));
}
} }
} }