From 299415f55ac5cd7643a0892c8b1660e31b4a888b Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 12 Jul 2021 14:58:43 +0200 Subject: [PATCH] experimentally discover base url of the feed and use it to relative URLs withing messages --- .../desktop/com.github.rssguard.appdata.xml | 2 +- src/librssguard/gui/webviewer.cpp | 17 ++++++++++++- src/librssguard/gui/webviewer.h | 1 + .../services/standard/atomparser.cpp | 6 ++--- .../services/standard/feedparser.cpp | 25 +++++++++++++++++++ .../services/standard/feedparser.h | 1 + 6 files changed, 47 insertions(+), 5 deletions(-) diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index 874f373e0..783add4a9 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -30,7 +30,7 @@ https://martinrotter.github.io/donate/ - + none diff --git a/src/librssguard/gui/webviewer.cpp b/src/librssguard/gui/webviewer.cpp index 253a02db1..d7bcd3021 100644 --- a/src/librssguard/gui/webviewer.cpp +++ b/src/librssguard/gui/webviewer.cpp @@ -53,7 +53,7 @@ WebPage* WebViewer::page() const { } void WebViewer::displayMessage() { - setHtml(m_messageContents /*, QUrl::fromUserInput(INTERNAL_URL_MESSAGE)*/); + setHtml(m_messageContents, m_messageBaseUrl /*, QUrl::fromUserInput(INTERNAL_URL_MESSAGE)*/); } bool WebViewer::increaseWebPageZoom() { @@ -143,6 +143,21 @@ void WebViewer::loadMessages(const QList& messages, RootItem* root) { } m_root = root; + + auto* feed = root->getParentServiceRoot()->getItemFromSubTree([messages](const RootItem* it) { + return it->kind() == RootItem::Kind::Feed && it->customId() == messages.at(0).m_feedId; + })->toFeed(); + + m_messageBaseUrl = QString(); + + if (feed != nullptr) { + QUrl url(feed->source()); + + if (url.isValid()) { + m_messageBaseUrl = url.scheme() + QSL("://") + url.host(); + } + } + m_messageContents = skin.m_layoutMarkupWrapper.arg(messages.size() == 1 ? messages.at(0).m_title : tr("Newspaper view"), messages_layout); diff --git a/src/librssguard/gui/webviewer.h b/src/librssguard/gui/webviewer.h index b0bb8a038..b6c38733d 100644 --- a/src/librssguard/gui/webviewer.h +++ b/src/librssguard/gui/webviewer.h @@ -45,6 +45,7 @@ class WebViewer : public QWebEngineView { private: RootItem* m_root; + QString m_messageBaseUrl; QString m_messageContents; }; diff --git a/src/librssguard/services/standard/atomparser.cpp b/src/librssguard/services/standard/atomparser.cpp index 1191890c2..cbb5f6bfa 100755 --- a/src/librssguard/services/standard/atomparser.cpp +++ b/src/librssguard/services/standard/atomparser.cpp @@ -50,13 +50,13 @@ QString AtomParser::feedAuthor() const { Message AtomParser::extractMessage(const QDomElement& msg_element, QDateTime current_time) const { Message new_message; QString title = textsFromPath(msg_element, m_atomNamespace, QSL("title"), true).join(QSL(", ")); - QString summary = textsFromPath(msg_element, m_atomNamespace, QSL("content"), true).join(QSL(", ")); + QString summary = rawXmlChild(msg_element.elementsByTagNameNS(m_atomNamespace, QSL("content")).at(0).toElement()); if (summary.isEmpty()) { - summary = textsFromPath(msg_element, m_atomNamespace, QSL("summary"), true).join(QSL(", ")); + summary = rawXmlChild(msg_element.elementsByTagNameNS(m_atomNamespace, QSL("summary")).at(0).toElement()); if (summary.isEmpty()) { - summary = mrssTextFromPath(msg_element, QSL("description")); + summary = rawXmlChild(msg_element.elementsByTagNameNS(m_mrssNamespace, QSL("description")).at(0).toElement()); } } diff --git a/src/librssguard/services/standard/feedparser.cpp b/src/librssguard/services/standard/feedparser.cpp index 47fc7a7f7..8a2559116 100755 --- a/src/librssguard/services/standard/feedparser.cpp +++ b/src/librssguard/services/standard/feedparser.cpp @@ -3,9 +3,12 @@ #include "services/standard/feedparser.h" #include "exceptions/applicationexception.h" +#include "miscellaneous/application.h" +#include "network-web/webfactory.h" #include #include + #include FeedParser::FeedParser(QString data) : m_xmlData(std::move(data)), m_mrssNamespace(QSL("http://search.yahoo.com/mrss/")) { @@ -84,6 +87,28 @@ QString FeedParser::mrssTextFromPath(const QDomElement& msg_element, const QStri return text; } +QString FeedParser::rawXmlChild(const QDomElement& container) const { + QString raw; + auto children = container.childNodes(); + + for (int i = 0; i < children.size(); i++) { + QString raw_ch; + + if (children.at(i).isCDATASection()) { + raw_ch = children.at(i).toCDATASection().data(); + } + else { + QTextStream str(&raw_ch); + + children.at(i).save(str, 0); + } + + raw += qApp->web()->unescapeHtml(raw_ch); + } + + return raw; +} + QStringList FeedParser::textsFromPath(const QDomElement& element, const QString& namespace_uri, const QString& xml_path, bool only_first) const { QStringList paths = xml_path.split('/'); diff --git a/src/librssguard/services/standard/feedparser.h b/src/librssguard/services/standard/feedparser.h index fc750fad9..a1bc6c236 100755 --- a/src/librssguard/services/standard/feedparser.h +++ b/src/librssguard/services/standard/feedparser.h @@ -19,6 +19,7 @@ class FeedParser { protected: QList mrssGetEnclosures(const QDomElement& msg_element) const; QString mrssTextFromPath(const QDomElement& msg_element, const QString& xml_path) const; + QString rawXmlChild(const QDomElement& container) const; QStringList textsFromPath(const QDomElement& element, const QString& namespace_uri, const QString& xml_path, bool only_first) const; virtual QDomNodeList messageElements() = 0; virtual QString feedAuthor() const;