From d3ec7ac4b398d1345e64b162b272d9ddb3db768a Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 7 Apr 2022 14:29:11 +0200 Subject: [PATCH] actually show plain images, work on proper simple article layout aka old nonwebengine --- .../webviewers/litehtml/litehtmlviewer.cpp | 73 ++++++++++++++++++- .../gui/webviewers/litehtml/litehtmlviewer.h | 4 + 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/librssguard/gui/webviewers/litehtml/litehtmlviewer.cpp b/src/librssguard/gui/webviewers/litehtml/litehtmlviewer.cpp index 9f980c259..019ec0912 100644 --- a/src/librssguard/gui/webviewers/litehtml/litehtmlviewer.cpp +++ b/src/librssguard/gui/webviewers/litehtml/litehtmlviewer.cpp @@ -24,7 +24,7 @@ #include LiteHtmlViewer::LiteHtmlViewer(QWidget* parent) : QLiteHtmlWidget(parent), m_downloader(new Downloader(this)), - m_reloadingWithImages(false) { + m_reloadingWithImages(false), m_useSimpleArticleLayout(false) { setResourceHandler([this](const QUrl& url) { emit loadProgress(-1); return m_reloadingWithImages ? handleResource(url) : QByteArray{}; @@ -94,8 +94,8 @@ void LiteHtmlViewer::setUrl(const QUrl& url) { } else { if (content_type.startsWith(QSL("image/"))) { - html_str = - ""; + html_str = QSL("").arg(content_type, + QString::fromLocal8Bit(m_downloader->lastOutputData().toBase64())); } else { html_str = QString::fromUtf8(m_downloader->lastOutputData()); @@ -128,8 +128,62 @@ void LiteHtmlViewer::clear() { setHtml({}); } +QPair LiteHtmlViewer::prepareHtmlForMessage(const QList& messages, RootItem* selected_item) const { + QString html; + + for (const Message& message : messages) { + html += QString("

%1

").arg(message.m_title); + + if (!message.m_url.isEmpty()) { + html += QString("[url] %1
").arg(message.m_url); + } + + for (const Enclosure& enc : message.m_enclosures) { + html += QString("[%2] %1
").arg(enc.m_url, enc.m_mimeType); + } + + QRegularExpression imgTagRegex("\\]*src\\s*=\\s*[\"\']([^\"\']*)[\"\'][^\\>]*\\>", + QRegularExpression::PatternOption::CaseInsensitiveOption | + QRegularExpression::PatternOption::InvertedGreedinessOption); + QRegularExpressionMatchIterator i = imgTagRegex.globalMatch(message.m_contents); + QString pictures_html; + + while (i.hasNext()) { + QRegularExpressionMatch match = i.next(); + + pictures_html += QString("
[%1] %2").arg(tr("image"), match.captured(1)); + } + + /*if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayImagePlaceholders)).toBool()) { + html += message.m_contents; + } + else {*/ + QString cnts = message.m_contents; + + html += cnts.replace(imgTagRegex, QString()); + //} + + html += pictures_html; + } + + // TODO: If FgInteresting not defined by the skin + // use current pallette/Highlight color perhaps. + return { QSL("" + "" + "%1" + "").arg(html, + qApp->skins()->currentSkin() + .colorForModel(SkinEnums::PaletteColors::FgInteresting) + .value().name()), + QUrl() }; +} + void LiteHtmlViewer::loadMessages(const QList& messages, RootItem* root) { - auto html_messages = qApp->skins()->generateHtmlOfArticles(messages, root); + auto html_messages = m_useSimpleArticleLayout + ? prepareHtmlForMessage(messages, root) + : qApp->skins()->generateHtmlOfArticles(messages, root); setHtml(html_messages.first, html_messages.second); emit loadFinished(true); @@ -160,6 +214,10 @@ void LiteHtmlViewer::setZoomFactor(qreal zoom_factor) { } } +void LiteHtmlViewer::simpleLayoutChanged(bool activated) { + m_useSimpleArticleLayout = activated; +} + void LiteHtmlViewer::selectedTextChanged(bool available) { if (!available) { return; @@ -233,10 +291,16 @@ void LiteHtmlViewer::showContextMenu(const QPoint& pos, const QUrl& url) { } }); + m_actionSimpleLayout.reset(new QAction(qApp->icons()->fromTheme(QSL("view-list-details")), + tr("Use simple article layout"), + this)); + m_actionSimpleLayout->setCheckable(true); + m_actionReloadWithImages.reset(new QAction(qApp->icons()->fromTheme(QSL("viewimage"), QSL("view-refresh")), tr("Reload with images"), this)); + connect(m_actionSimpleLayout.data(), &QAction::triggered, this, &LiteHtmlViewer::simpleLayoutChanged); connect(m_actionReloadWithImages.data(), &QAction::triggered, this, &LiteHtmlViewer::reloadPageWithImages); } @@ -248,6 +312,7 @@ void LiteHtmlViewer::showContextMenu(const QPoint& pos, const QUrl& url) { m_contextMenu->addActions({ m_actionCopyUrl.data(), m_actionCopyText.data(), m_actionOpenLinkExternally.data(), + m_actionSimpleLayout.data(), m_actionReloadWithImages.data() }); if (url.isValid()) { diff --git a/src/librssguard/gui/webviewers/litehtml/litehtmlviewer.h b/src/librssguard/gui/webviewers/litehtml/litehtmlviewer.h index a7d0506a1..0b0c1cf03 100644 --- a/src/librssguard/gui/webviewers/litehtml/litehtmlviewer.h +++ b/src/librssguard/gui/webviewers/litehtml/litehtmlviewer.h @@ -35,6 +35,7 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer { virtual void setZoomFactor(qreal zoom_factor); private slots: + void simpleLayoutChanged(bool activated); void selectedTextChanged(bool available); void onLinkClicked(const QUrl& link); void reloadPageWithImages(); @@ -55,6 +56,7 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer { virtual void keyPressEvent(QKeyEvent* event); private: + QPair prepareHtmlForMessage(const QList& messages, RootItem* selected_item) const; BlockingResult blockedWithAdblock(const QUrl& url); QByteArray handleResource(const QUrl& url); @@ -64,8 +66,10 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer { QScopedPointer m_actionCopyUrl; QScopedPointer m_actionCopyText; QScopedPointer m_actionOpenLinkExternally; + QScopedPointer m_actionSimpleLayout; QScopedPointer m_actionReloadWithImages; bool m_reloadingWithImages; + bool m_useSimpleArticleLayout; }; #endif // LITEHTMLVIEWER_H