From 11b99604acf8befc6df2e76baa4aee4b958931bd Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 29 Aug 2022 07:19:25 +0200 Subject: [PATCH] add ability to display attachments directly in text-based previewer + enhance feed download logic to allow proper exceptions catching and feed error propagation! --- .../desktop/com.github.rssguard.appdata.xml | 2 +- .../qtextbrowser/textbrowserviewer.cpp | 44 +++++++++++++++---- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index df935a499..2e87015cc 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -26,7 +26,7 @@ https://github.com/sponsors/martinrotter - + none diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp index 3a82ecd30..970593e53 100644 --- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp +++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp @@ -88,6 +88,9 @@ PreparedHtml TextBrowserViewer::prepareHtmlForMessage(const QList& mess PreparedHtml html; for (const Message& message : messages) { + bool is_plain = !Qt::mightBeRichText(message.m_contents.simplified()); + + // Add title. if (!message.m_url.isEmpty()) { html.m_html += QSL("

%1

").arg(message.m_title, message.m_url); } @@ -95,36 +98,61 @@ PreparedHtml TextBrowserViewer::prepareHtmlForMessage(const QList& mess html.m_html += QSL("

%1

").arg(message.m_title); } + // Start contents. html.m_html += QSL("
"); + // Add links to enclosures. for (const Enclosure& enc : message.m_enclosures) { - html.m_html += QString("[%2] %1
").arg(enc.m_url, enc.m_mimeType); + html.m_html += QSL("[%2] %1
").arg(enc.m_url, enc.m_mimeType); } + // Display enclosures which are pictures if user has it enabled. + auto first_enc_break_added = false; + + if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayEnclosuresInMessage)).toBool()) { + for (const Enclosure& enc : message.m_enclosures) { + if (enc.m_mimeType.startsWith(QSL("image/"))) { + if (!first_enc_break_added) { + html.m_html += QSL("
"); + first_enc_break_added = true; + } + + html.m_html += QSL("
").arg(enc.m_url); + } + } + } + + // Append actual contents of article and convert to HTML if needed. + html.m_html += is_plain ? Qt::convertFromPlainText(message.m_contents) : message.m_contents; + static QRegularExpression img_tag_rgx("\\]*src\\s*=\\s*[\"\']([^\"\']*)[\"\'][^\\>]*\\>", QRegularExpression::PatternOption::CaseInsensitiveOption | QRegularExpression::PatternOption::InvertedGreedinessOption); - QRegularExpressionMatchIterator i = img_tag_rgx.globalMatch(message.m_contents); + + // Extract all images links from article to be appended to end of article. + QRegularExpressionMatchIterator i = img_tag_rgx.globalMatch(html.m_html); QString pictures_html; while (i.hasNext()) { QRegularExpressionMatch match = i.next(); auto captured_url = match.captured(1); - pictures_html += QString("
[%1] %2").arg(tr("image"), captured_url); + pictures_html += QSL("
[%1] %2").arg(tr("image"), captured_url); } - QString cnts = message.m_contents; - + // Make alla images clickable as links and also resize them if user has it setup. auto forced_img_size = qApp->settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toInt(); // Fixup all "img" tags. - html.m_html += cnts.replace(img_tag_rgx, - QSL("") - .arg(forced_img_size <= 0 ? QString() : QString::number(forced_img_size))); + html.m_html = html.m_html.replace(img_tag_rgx, + QSL("") + .arg(forced_img_size <= 0 ? QString() : QString::number(forced_img_size))); + + // Append generated list of images. html.m_html += pictures_html; } + // Close contents. html.m_html += QSL("
"); QString base_url;