diff --git a/src/plugins/qtsupport/examplesparser.cpp b/src/plugins/qtsupport/examplesparser.cpp index de6a14d8369..bdde8e66a0f 100644 --- a/src/plugins/qtsupport/examplesparser.cpp +++ b/src/plugins/qtsupport/examplesparser.cpp @@ -43,6 +43,35 @@ static QStringList trimStringList(const QStringList &stringlist) return Utils::transform(stringlist, [](const QString &str) { return str.trimmed(); }); } +static QHash parseMeta(QXmlStreamReader *reader) +{ + QHash result; + while (!reader->atEnd()) { + switch (reader->readNext()) { + case QXmlStreamReader::StartElement: + if (reader->name() == QLatin1String("entry")) { + const QString key = reader->attributes().value("name").toString(); + if (key.isEmpty()) { + reader->raiseError("Tag \"entry\" requires \"name\" attribute"); + break; + } + const QString value = reader->readElementText( + QXmlStreamReader::ErrorOnUnexpectedElement); + if (!value.isEmpty()) + result[key].append(value); + } + break; + case QXmlStreamReader::EndElement: + if (reader->name() == QLatin1String("meta")) + return result; + break; + default: + break; + } + } + return result; +} + static QList parseExamples(QXmlStreamReader *reader, const FilePath &projectsOffset, const FilePath &examplesInstallPath) @@ -95,6 +124,8 @@ static QList parseExamples(QXmlStreamReader *reader, item->platforms = trimStringList( reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement) .split(QLatin1Char(','), Qt::SkipEmptyParts)); + } else if (reader->name() == QLatin1String("meta")) { + item->metaData = parseMeta(reader); } break; case QXmlStreamReader::EndElement: diff --git a/src/plugins/qtsupport/examplesparser.h b/src/plugins/qtsupport/examplesparser.h index b133d2c6c8a..2d1afa54838 100644 --- a/src/plugins/qtsupport/examplesparser.h +++ b/src/plugins/qtsupport/examplesparser.h @@ -28,6 +28,7 @@ public: QString videoUrl; QString videoLength; QStringList platforms; + QHash metaData; }; QTSUPPORT_EXPORT Utils::expected_str> parseExamples( diff --git a/tests/auto/examples/tst_examples.cpp b/tests/auto/examples/tst_examples.cpp index 22236ed4c5d..5a18f1e4498 100644 --- a/tests/auto/examples/tst_examples.cpp +++ b/tests/auto/examples/tst_examples.cpp @@ -25,6 +25,8 @@ private slots: tst_Examples::tst_Examples() = default; tst_Examples::~tst_Examples() = default; +using MetaData = QHash; + static ExampleItem fetchItem() { QFETCH(QString, name); @@ -43,6 +45,7 @@ static ExampleItem fetchItem() QFETCH(QString, videoUrl); QFETCH(QString, videoLength); QFETCH(QStringList, platforms); + QFETCH(MetaData, metaData); ExampleItem item; item.name = name; item.description = description; @@ -60,6 +63,7 @@ static ExampleItem fetchItem() item.videoUrl = videoUrl; item.videoLength = videoLength; item.platforms = platforms; + item.metaData = metaData; return item; } @@ -83,6 +87,7 @@ void tst_Examples::parsing_data() QTest::addColumn("videoUrl"); QTest::addColumn("videoLength"); QTest::addColumn("platforms"); + QTest::addColumn("metaData"); QTest::addRow("example") << QByteArray(R"raw( @@ -115,7 +120,7 @@ void tst_Examples::parsing_data() "manifest/widgets/widgets/analogclock/analogclock.cpp")} << FilePath::fromUserInput("manifest/widgets/widgets/analogclock/analogclock.cpp") << FilePaths() << Example << true << false << false << "" - << "" << QStringList(); + << "" << QStringList() << MetaData({{"category", {"Graphics"}}, {"tags", {"widgets"}}}); } void tst_Examples::parsing() @@ -148,6 +153,7 @@ void tst_Examples::parsing() QCOMPARE(item.videoUrl, expected.videoUrl); QCOMPARE(item.videoLength, expected.videoLength); QCOMPARE(item.platforms, expected.platforms); + QCOMPARE(item.metaData, expected.metaData); qDeleteAll(*result); }