summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-08-10 10:53:47 +0200
committerNikita Kostovsky <nikita@kostovsky.me>2025-08-10 10:53:47 +0200
commitb91bddfbc588dedffda4b129c5e2c2fd9afe7bfd (patch)
tree001fc6c3507375902f3c8200d4885abe28c98897
parent99c0f738e1d67aa16875110bfb5621bd7ea04e41 (diff)
made new parsers for channel and item
-rw-r--r--src/atomchannel.cpp42
-rw-r--r--src/atomchannel.h2
-rw-r--r--src/playground.cpp1
3 files changed, 39 insertions, 6 deletions
diff --git a/src/atomchannel.cpp b/src/atomchannel.cpp
index d89d4ef..d3f3c3f 100644
--- a/src/atomchannel.cpp
+++ b/src/atomchannel.cpp
@@ -271,11 +271,38 @@ DbItem::DbItem(const QDomNode &node)
void DbItem::init(const QMetaObject &mo, const QDomNode &node)
{
- for (int i = mo.propertyOffset(); i < mo.propertyCount(); ++i) {
- auto prop = mo.property(i);
- QVariant variant{node.toElement().elementsByTagName(prop.name()).at(0).toElement().text()};
- const bool converted = variant.convert(QMetaType{prop.typeId()});
- prop.writeOnGadget(this, converted ? std::move(variant) : QVariant{});
+ // for (int i = mo.propertyOffset(); i < mo.propertyCount(); ++i) {
+ for (int i = staticMetaObject.propertyOffset(); i < staticMetaObject.propertyCount(); ++i) {
+ const auto prop = staticMetaObject.property(i);
+ const auto propName = prop.name();
+ const auto propElement = node.toElement().elementsByTagName(propName).at(0);
+ const auto propText = propElement.toElement().text();
+ const auto propType = QMetaType{prop.typeId()};
+
+ switch (propType.id()) {
+ case QMetaType::Type::QDateTime: {
+ prop.writeOnGadget(this, QDateTime::fromString(propText, dateFormat));
+ break;
+ }
+ case QMetaType::Type::QStringList: {
+ const auto elements = node.toElement().elementsByTagName(propName);
+ QStringList values;
+ values.reserve(elements.size());
+
+ for (const auto &element : elements) {
+ values << element.toElement().text();
+ }
+
+ prop.writeOnGadget(this, std::move(values));
+
+ break;
+ }
+ default: {
+ QVariant variant{propText};
+ variant.convert(propType);
+ prop.writeOnGadget(this, std::move(variant));
+ }
+ }
}
}
@@ -283,4 +310,9 @@ Item::Item(const QDomNode &node)
: DbItem{node}
{
init(staticMetaObject, node);
+
+ if (m_content.isEmpty()) {
+ const QString contentEncodedTag = QStringLiteral("content:encoded");
+ set_content(node.toElement().elementsByTagName(contentEncodedTag).at(0).toElement().text());
+ }
}
diff --git a/src/atomchannel.h b/src/atomchannel.h
index 87727d2..e52048a 100644
--- a/src/atomchannel.h
+++ b/src/atomchannel.h
@@ -69,7 +69,7 @@ class Item : public DbItem
GADGET_PROPERTY(QString, title);
GADGET_PROPERTY(QUrl, link);
- GADGET_PROPERTY(QStringList, categories);
+ GADGET_PROPERTY(QStringList, category);
GADGET_PROPERTY(QString, guid);
GADGET_PROPERTY(QDateTime, pubDate);
GADGET_PROPERTY(QString, description);
diff --git a/src/playground.cpp b/src/playground.cpp
index 117fb31..73eb84a 100644
--- a/src/playground.cpp
+++ b/src/playground.cpp
@@ -68,6 +68,7 @@ std::shared_ptr<AtomChannel> Playground::parseFeed(QIODevice *ioDevice)
for (const auto &itemNode : itemNodes) {
const Item item{itemNode};
qDebug() << item;
+ break;
}
return {};