From 3a948c68254a99475a0ed14c4f4debdab853b95a Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 1 Aug 2024 10:51:32 +0200 Subject: [PATCH] add a switch to turn off raw XML saving --- src/librssguard-standard/CMakeLists.txt | 3 + .../src/gui/formstandardfeeddetails.cpp | 14 +++- .../src/gui/formstandardfeeddetails.h | 2 + .../src/gui/standardfeedexpdetails.cpp | 25 +++++++ .../src/gui/standardfeedexpdetails.h | 28 ++++++++ .../src/gui/standardfeedexpdetails.ui | 38 +++++++++++ .../src/parsers/feedparser.cpp | 66 +++++++++++-------- .../src/parsers/feedparser.h | 10 ++- .../src/parsers/rssparser.cpp | 10 --- src/librssguard-standard/src/standardfeed.cpp | 19 +++++- src/librssguard-standard/src/standardfeed.h | 4 ++ .../src/standardserviceroot.cpp | 1 + .../services/abstract/gui/formfeeddetails.cpp | 7 +- .../services/abstract/gui/formfeeddetails.h | 5 +- 14 files changed, 187 insertions(+), 45 deletions(-) create mode 100644 src/librssguard-standard/src/gui/standardfeedexpdetails.cpp create mode 100644 src/librssguard-standard/src/gui/standardfeedexpdetails.h create mode 100644 src/librssguard-standard/src/gui/standardfeedexpdetails.ui diff --git a/src/librssguard-standard/CMakeLists.txt b/src/librssguard-standard/CMakeLists.txt index 1475b4f07..e4b38303d 100644 --- a/src/librssguard-standard/CMakeLists.txt +++ b/src/librssguard-standard/CMakeLists.txt @@ -15,6 +15,8 @@ set(SOURCES src/gui/standardaccountdetails.h src/gui/standardfeeddetails.cpp src/gui/standardfeeddetails.h + src/gui/standardfeedexpdetails.cpp + src/gui/standardfeedexpdetails.h src/parsers/atomparser.cpp src/parsers/atomparser.h src/parsers/feedparser.cpp @@ -46,6 +48,7 @@ set(UI_FILES src/gui/formstandardimportexport.ui src/gui/standardaccountdetails.ui src/gui/standardfeeddetails.ui + src/gui/standardfeedexpdetails.ui ) # Add ZLIB. diff --git a/src/librssguard-standard/src/gui/formstandardfeeddetails.cpp b/src/librssguard-standard/src/gui/formstandardfeeddetails.cpp index afa525418..78eef4bc1 100644 --- a/src/librssguard-standard/src/gui/formstandardfeeddetails.cpp +++ b/src/librssguard-standard/src/gui/formstandardfeeddetails.cpp @@ -3,6 +3,7 @@ #include "src/gui/formstandardfeeddetails.h" #include "src/gui/standardfeeddetails.h" +#include "src/gui/standardfeedexpdetails.h" #include "src/standardfeed.h" #include @@ -25,9 +26,11 @@ FormStandardFeedDetails::FormStandardFeedDetails(ServiceRoot* service_root, const QString& url, QWidget* parent) : FormFeedDetails(service_root, parent), m_standardFeedDetails(new StandardFeedDetails(this)), - m_authDetails(new AuthenticationDetails(false, this)), m_parentToSelect(parent_to_select), m_urlToProcess(url) { + m_standardFeedExpDetails(new StandardFeedExpDetails(this)), m_authDetails(new AuthenticationDetails(false, this)), + m_parentToSelect(parent_to_select), m_urlToProcess(url) { insertCustomTab(m_standardFeedDetails, tr("General"), 0); insertCustomTab(m_authDetails, tr("Network"), 2); + insertCustomTab(m_standardFeedExpDetails, tr("Experimental")); activateTab(0); connect(m_standardFeedDetails->m_ui.m_btnFetchMetadata, @@ -117,6 +120,10 @@ void FormStandardFeedDetails::apply() { std_feed->setProtection(m_authDetails->authenticationType()); } + if (isChangeAllowed(m_standardFeedExpDetails->m_ui.m_mcbDontUseRawXml)) { + std_feed->setDontUseRawXmlSaving(m_standardFeedExpDetails->m_ui.m_cbDontUseRawXml->isChecked()); + } + if (isChangeAllowed(m_authDetails->findChild(QSL("m_mcbAuthentication")))) { std_feed->setUsername(m_authDetails->username()); std_feed->setPassword(m_authDetails->password()); @@ -171,6 +178,9 @@ void FormStandardFeedDetails::loadFeedData() { ->addActionWidget(m_authDetails->findChild(QSL("m_gbAuthentication"))); m_standardFeedDetails->m_ui.m_btnFetchMetadata->setEnabled(false); + + m_standardFeedExpDetails->m_ui.m_mcbDontUseRawXml + ->addActionWidget(m_standardFeedExpDetails->m_ui.m_cbDontUseRawXml); } else { // We hide batch selectors. @@ -195,5 +205,7 @@ void FormStandardFeedDetails::loadFeedData() { } else { m_standardFeedDetails->setExistingFeed(std_feed); + + m_standardFeedExpDetails->m_ui.m_cbDontUseRawXml->setChecked(std_feed->dontUseRawXmlSaving()); } } diff --git a/src/librssguard-standard/src/gui/formstandardfeeddetails.h b/src/librssguard-standard/src/gui/formstandardfeeddetails.h index d4d38cdf1..723212701 100644 --- a/src/librssguard-standard/src/gui/formstandardfeeddetails.h +++ b/src/librssguard-standard/src/gui/formstandardfeeddetails.h @@ -6,6 +6,7 @@ #include class StandardFeedDetails; +class StandardFeedExpDetails; class StandardServiceRoot; class AuthenticationDetails; class StandardFeed; @@ -31,6 +32,7 @@ class FormStandardFeedDetails : public FormFeedDetails { private: StandardFeedDetails* m_standardFeedDetails; + StandardFeedExpDetails* m_standardFeedExpDetails; AuthenticationDetails* m_authDetails; RootItem* m_parentToSelect; QString m_urlToProcess; diff --git a/src/librssguard-standard/src/gui/standardfeedexpdetails.cpp b/src/librssguard-standard/src/gui/standardfeedexpdetails.cpp new file mode 100644 index 000000000..2828530af --- /dev/null +++ b/src/librssguard-standard/src/gui/standardfeedexpdetails.cpp @@ -0,0 +1,25 @@ +// For license of this file, see /LICENSE.md. + +#include "src/gui/standardfeedexpdetails.h" + +#include "src/definitions.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +StandardFeedExpDetails::StandardFeedExpDetails(QWidget* parent) : QWidget(parent) { + m_ui.setupUi(this); +} diff --git a/src/librssguard-standard/src/gui/standardfeedexpdetails.h b/src/librssguard-standard/src/gui/standardfeedexpdetails.h new file mode 100644 index 000000000..082b01d97 --- /dev/null +++ b/src/librssguard-standard/src/gui/standardfeedexpdetails.h @@ -0,0 +1,28 @@ +// For license of this file, see /LICENSE.md. + +#ifndef STANDARDFEEDEXPDETAILS_H +#define STANDARDFEEDEXPDETAILS_H + +#include "src/standardfeed.h" + +#include "ui_standardfeedexpdetails.h" + +#include +#include + +class Category; +class RootItem; + +class StandardFeedExpDetails : public QWidget { + Q_OBJECT + + friend class FormStandardFeedDetails; + + public: + explicit StandardFeedExpDetails(QWidget* parent = nullptr); + + private: + Ui::StandardFeedExpDetails m_ui; +}; + +#endif // STANDARDFEEDEXPDETAILS_H diff --git a/src/librssguard-standard/src/gui/standardfeedexpdetails.ui b/src/librssguard-standard/src/gui/standardfeedexpdetails.ui new file mode 100644 index 000000000..4b70ba55f --- /dev/null +++ b/src/librssguard-standard/src/gui/standardfeedexpdetails.ui @@ -0,0 +1,38 @@ + + + StandardFeedExpDetails + + + + 0 + 0 + 360 + 197 + + + + Form + + + + + + Use older mechanism for extracting raw XML data + + + + + + + + + + + MultiFeedEditCheckBox + QCheckBox +
multifeededitcheckbox.h
+
+
+ + +
diff --git a/src/librssguard-standard/src/parsers/feedparser.cpp b/src/librssguard-standard/src/parsers/feedparser.cpp index 5b66d457f..e5effa22a 100644 --- a/src/librssguard-standard/src/parsers/feedparser.cpp +++ b/src/librssguard-standard/src/parsers/feedparser.cpp @@ -79,17 +79,16 @@ QPair> FeedParser::guessFeed(const QByteArray } QString FeedParser::xmlMessageRawContents(const QDomElement& msg_element) const { - QString raw_contents; - QTextStream str(&raw_contents); + if (dontUseRawXmlSaving()) { + return msg_element.text(); + } + else { + QString raw_contents; + QTextStream str(&raw_contents); - msg_element.save(str, 0, QDomNode::EncodingPolicy::EncodingFromTextStream); - return raw_contents; - - /* - qDebugNN << msg_element.text(); - - return msg_element.text(); -*/ + msg_element.save(str, 0, QDomNode::EncodingPolicy::EncodingFromTextStream); + return raw_contents; + } } QJsonArray FeedParser::jsonMessageElements() { @@ -345,25 +344,30 @@ QString FeedParser::xmlMrssTextFromPath(const QDomElement& msg_element, const QS } QString FeedParser::xmlRawChild(const QDomElement& container) const { - QString raw; - auto children = container.childNodes(); - - for (int i = 0; i < children.size(); i++) { - auto child = children.at(i); - - if (child.isCDATASection()) { - raw += child.toCDATASection().data(); - } - else { - QString raw_ch; - QTextStream str(&raw_ch); - - child.save(str, 0); - raw += WebFactory::unescapeHtml(raw_ch); - } + if (dontUseRawXmlSaving()) { + return container.text(); } + else { + QString raw; + auto children = container.childNodes(); - return raw; + for (int i = 0; i < children.size(); i++) { + auto child = children.at(i); + + if (child.isCDATASection()) { + raw += child.toCDATASection().data(); + } + else { + QString raw_ch; + QTextStream str(&raw_ch); + + child.save(str, 0); + raw += WebFactory::unescapeHtml(raw_ch); + } + } + + return raw; + } } QStringList FeedParser::xmlTextsFromPath(const QDomElement& element, @@ -408,6 +412,14 @@ QStringList FeedParser::xmlTextsFromPath(const QDomElement& element, return result; } +bool FeedParser::dontUseRawXmlSaving() const { + return m_dontUseRawXmlSaving; +} + +void FeedParser::setDontUseRawXmlSaving(bool no_raw_xml_saving) { + m_dontUseRawXmlSaving = no_raw_xml_saving; +} + QString FeedParser::dateTimeFormat() const { return m_dateTimeFormat; } diff --git a/src/librssguard-standard/src/parsers/feedparser.h b/src/librssguard-standard/src/parsers/feedparser.h index e23641846..51fd55cb0 100644 --- a/src/librssguard-standard/src/parsers/feedparser.h +++ b/src/librssguard-standard/src/parsers/feedparser.h @@ -40,6 +40,9 @@ class FeedParser { QString dateTimeFormat() const; void setDateTimeFormat(const QString& dt_format); + bool dontUseRawXmlSaving() const; + void setDontUseRawXmlSaving(bool no_raw_xml_saving); + protected: virtual QString feedAuthor() const; @@ -61,7 +64,7 @@ class FeedParser { virtual QString jsonMessageUrl(const QJsonObject& msg_element) const; virtual QString jsonMessageDescription(const QJsonObject& msg_element) const; virtual QString jsonMessageAuthor(const QJsonObject& msg_element) const; - virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) ; + virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element); virtual QString jsonMessageId(const QJsonObject& msg_element) const; virtual QList jsonMessageEnclosures(const QJsonObject& msg_element) const; virtual QList jsonMessageCategories(const QJsonObject& msg_element) const; @@ -71,9 +74,9 @@ class FeedParser { virtual QVariantList objMessageElements(); virtual QString objMessageTitle(const QVariant& msg_element) const; virtual QString objMessageUrl(const QVariant& msg_element) const; - virtual QString objMessageDescription(const QVariant& msg_element) ; + virtual QString objMessageDescription(const QVariant& msg_element); virtual QString objMessageAuthor(const QVariant& msg_element) const; - virtual QDateTime objMessageDateCreated(const QVariant& msg_element) ; + virtual QDateTime objMessageDateCreated(const QVariant& msg_element); virtual QString objMessageId(const QVariant& msg_element) const; virtual QList objMessageEnclosures(const QVariant& msg_element) const; virtual QList objMessageCategories(const QVariant& msg_element) const; @@ -95,6 +98,7 @@ class FeedParser { QDomDocument m_xml; QJsonDocument m_json; QString m_mrssNamespace; + bool m_dontUseRawXmlSaving; }; #endif // FEEDPARSER_H diff --git a/src/librssguard-standard/src/parsers/rssparser.cpp b/src/librssguard-standard/src/parsers/rssparser.cpp index 83105ca3c..635d7751a 100644 --- a/src/librssguard-standard/src/parsers/rssparser.cpp +++ b/src/librssguard-standard/src/parsers/rssparser.cpp @@ -268,16 +268,6 @@ QString RssParser::xmlMessageDescription(const QDomElement& msg_element) const { } return description; - - /* - QString description = msg_element.elementsByTagName(QSL("encoded")).at(0).toElement().text(); - - if (description.isEmpty()) { - description = msg_element.elementsByTagName(QSL("description")).at(0).toElement().text(); - } - - return description; - */ } QString RssParser::xmlMessageAuthor(const QDomElement& msg_element) const { diff --git a/src/librssguard-standard/src/standardfeed.cpp b/src/librssguard-standard/src/standardfeed.cpp index 1c8741931..e589bb7ef 100644 --- a/src/librssguard-standard/src/standardfeed.cpp +++ b/src/librssguard-standard/src/standardfeed.cpp @@ -52,6 +52,7 @@ StandardFeed::StandardFeed(RootItem* parent_item) : Feed(parent_item) { m_protection = NetworkFactory::NetworkAuthentication::NoAuthentication; m_username = QString(); m_password = QString(); + m_dontUseRawXmlSaving = false; } StandardFeed::StandardFeed(const StandardFeed& other) : Feed(other) { @@ -62,6 +63,7 @@ StandardFeed::StandardFeed(const StandardFeed& other) : Feed(other) { m_protection = other.protection(); m_username = other.username(); m_password = other.password(); + m_dontUseRawXmlSaving = other.dontUseRawXmlSaving(); } QList StandardFeed::contextMenuFeedsList() { @@ -84,6 +86,7 @@ QString StandardFeed::additionalTooltip() const { .toStdList(); QStringList fltrs = FROM_STD_LIST(QStringList, std_fltrs); + // TODO: toto je v podstatÄ› zkopirovane z Feed... QString base_tooltip = tr("Auto-update status: %1\n" "Active message filters: %2\n" @@ -100,10 +103,12 @@ QString StandardFeed::additionalTooltip() const { return base_tooltip + tr("Encoding: %1\n" "Type: %2\n" - "Post-processing script: %3") + "Post-processing script: %3\n" + "Do not use raw XML saving: %4") .arg(encoding(), StandardFeed::typeToString(type()), - m_postProcessScript.isEmpty() ? QSL("-") : m_postProcessScript); + m_postProcessScript.isEmpty() ? QSL("-") : m_postProcessScript, + dontUseRawXmlSaving() ? tr("yes") : tr("no")); } bool StandardFeed::canBeDeleted() const { @@ -158,6 +163,7 @@ QVariantHash StandardFeed::customDatabaseData() const { data[QSL("protected")] = int(protection()); data[QSL("username")] = username(); data[QSL("password")] = TextFactory::encrypt(password()); + data[QSL("dont_use_raw_xml_saving")] = dontUseRawXmlSaving(); return data; } @@ -170,6 +176,7 @@ void StandardFeed::setCustomDatabaseData(const QVariantHash& data) { setProtection(NetworkFactory::NetworkAuthentication(data[QSL("protected")].toInt())); setUsername(data[QSL("username")].toString()); setPassword(TextFactory::decrypt(data[QSL("password")].toString())); + setDontUseRawXmlSaving(data[QSL("dont_use_raw_xml_saving")].toBool()); } QString StandardFeed::typeToString(StandardFeed::Type type) { @@ -426,6 +433,14 @@ bool StandardFeed::removeItself() { return DatabaseQueries::deleteFeed(database, this, getParentServiceRoot()->accountId()); } +bool StandardFeed::dontUseRawXmlSaving() const { + return m_dontUseRawXmlSaving; +} + +void StandardFeed::setDontUseRawXmlSaving(bool no_raw_xml_saving) { + m_dontUseRawXmlSaving = no_raw_xml_saving; +} + QString StandardFeed::dateTimeFormat() const { return m_dateTimeFormat; } diff --git a/src/librssguard-standard/src/standardfeed.h b/src/librssguard-standard/src/standardfeed.h index 7f64925ba..0f2c3e59d 100644 --- a/src/librssguard-standard/src/standardfeed.h +++ b/src/librssguard-standard/src/standardfeed.h @@ -110,6 +110,9 @@ class StandardFeed : public Feed { QString dateTimeFormat() const; void setDateTimeFormat(const QString& dt_format); + bool dontUseRawXmlSaving() const; + void setDontUseRawXmlSaving(bool no_raw_xml_saving); + public slots: void fetchMetadataForItself(); @@ -127,6 +130,7 @@ class StandardFeed : public Feed { QString m_username; QString m_password; QString m_lastEtag; + bool m_dontUseRawXmlSaving; }; Q_DECLARE_METATYPE(StandardFeed::SourceType) diff --git a/src/librssguard-standard/src/standardserviceroot.cpp b/src/librssguard-standard/src/standardserviceroot.cpp index 03ba8ec80..4a7683637 100644 --- a/src/librssguard-standard/src/standardserviceroot.cpp +++ b/src/librssguard-standard/src/standardserviceroot.cpp @@ -358,6 +358,7 @@ QList StandardServiceRoot::obtainNewMessages(Feed* feed, parser->setDateTimeFormat(f->dateTimeFormat()); } + parser->setDontUseRawXmlSaving(f->dontUseRawXmlSaving()); messages = parser->messages(); if (!parser->dateTimeFormat().isEmpty()) { diff --git a/src/librssguard/services/abstract/gui/formfeeddetails.cpp b/src/librssguard/services/abstract/gui/formfeeddetails.cpp index b1a0f15d7..e2a7386d7 100644 --- a/src/librssguard/services/abstract/gui/formfeeddetails.cpp +++ b/src/librssguard/services/abstract/gui/formfeeddetails.cpp @@ -36,7 +36,12 @@ void FormFeedDetails::clearTabs() { } void FormFeedDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) { - m_ui->m_tabWidget->insertTab(index, custom_tab, title); + if (index < 0) { + m_ui->m_tabWidget->addTab(custom_tab, title); + } + else { + m_ui->m_tabWidget->insertTab(index, custom_tab, title); + } } void FormFeedDetails::apply() { diff --git a/src/librssguard/services/abstract/gui/formfeeddetails.h b/src/librssguard/services/abstract/gui/formfeeddetails.h index c9e3e41c7..317d9a3e5 100644 --- a/src/librssguard/services/abstract/gui/formfeeddetails.h +++ b/src/librssguard/services/abstract/gui/formfeeddetails.h @@ -50,7 +50,10 @@ class RSSGUARD_DLLSPEC FormFeedDetails : public QDialog { QDialogButtonBox* buttonBox() const; bool isChangeAllowed(MultiFeedEditCheckBox* mcb) const; - void insertCustomTab(QWidget* custom_tab, const QString& title, int index); + + // Inserts custom tab made by plugin into its editing form. When index is less + // than zero, tab is inserted to the last position. + void insertCustomTab(QWidget* custom_tab, const QString& title, int index = -1); // Sets the feed which will be edited. // NOTE: This must be reimplemented in subclasses. Also this