29 QMap<QString, QString> attributesToWarnFor;
33 if (missingImageWarning)
34 attributesToWarnFor.insert(QStringLiteral(
"imageUrl"),
35 QStringLiteral(
"Example documentation should have at least one '\\image'"));
36 if (missingProjectFileWarning)
37 attributesToWarnFor.insert(QStringLiteral(
"projectPath"),
38 QStringLiteral(
"Example has no project file"));
40 if (attributesToWarnFor.empty())
43 for (
auto it = attributesToWarnFor.cbegin(); it != attributesToWarnFor.cend(); ++it) {
44 if (!usedAttributes.contains(it.key()))
45 example
->doc().location().warning(example->name() +
": " + it.value());
76 QMap<
int, QString> filesToOpen;
77 for (
const QString &file : files) {
78 QFileInfo fileInfo(file);
79 QString fileName = fileInfo.fileName().toLower();
84 if ((fileInfo.baseName().compare(exampleName, Qt::CaseInsensitive) == 0)) {
85 if (fileName.endsWith(
".qml"))
86 filesToOpen.insert(0, file);
87 else if (fileName.endsWith(
".cpp"))
88 filesToOpen.insert(1, file);
89 else if (fileName.endsWith(
".h"))
90 filesToOpen.insert(2, file);
93 else if (fileName.endsWith(
"main.qml")) {
94 filesToOpen.insert(3, file);
95 }
else if (fileName.endsWith(
"main.cpp")) {
96 filesToOpen.insert(4, file);
276 if (exampleNodeMap.isEmpty())
280 OutputDirectory::ensure(m_outputDirectory,
Location());
282 const QString outputFileName =
"examples-manifest.xml";
283 QFile outputFile(outputDir.absoluteFilePath(outputFileName));
284 if (!outputFile.open(QFile::WriteOnly | QFile::Text)) {
285 Location().error(u"Cannot open '%1' for writing"_s.arg(outputFile.fileName()));
289 QXmlStreamWriter writer(&outputFile);
290 writer.setAutoFormatting(
true);
291 writer.writeStartDocument();
292 writer.writeStartElement(
"instructionals");
293 writer.writeAttribute(
"module", m_project);
294 writer.writeStartElement(
"examples");
296 for (
const auto &example : exampleNodeMap.values()) {
297 QMap<QString, QString> usedAttributes;
299 const QString installPath = retrieveExampleInstallationPath(example);
300 const QString fullName = m_project + QLatin1Char(
'/') + example->title();
302 processManifestMetaContent(
303 fullName, [&](
const ManifestMetaFilter &filter) { tags += filter.m_tags; });
304 tags += tagsAddedWithMetaCommand(example);
306 if (tags.contains(
"broken"))
310 usedAttributes.insert(
"name", example->title());
311 usedAttributes.insert(
"docUrl", m_manifestDir + Generator::currentGenerator()->fileBase(example) +
".html");
313 if (!example->projectFile().isEmpty())
314 usedAttributes.insert(
"projectPath", installPath + example->projectFile());
315 if (!example->imageFileName().isEmpty())
316 usedAttributes.insert(
"imageUrl", m_manifestDir + example->imageFileName());
318 processManifestMetaContent(fullName, [&](
const ManifestMetaFilter &filter) {
319 const auto attributes = filter.m_attributes;
320 for (
const auto &attribute : attributes) {
321 const QLatin1Char div(
':');
322 QStringList attrList = attribute.split(div);
323 if (attrList.size() == 1)
324 attrList.append(QStringLiteral(
"true"));
325 QString attrName = attrList.takeFirst();
326 if (!usedAttributes.contains(attrName))
327 usedAttributes.insert(attrName, attrList.join(div));
331 writer.writeStartElement(
"example");
332 for (
auto it = usedAttributes.cbegin(); it != usedAttributes.cend(); ++it)
333 writer.writeAttribute(it.key(), it.value());
335 warnAboutUnusedAttributes(usedAttributes.keys(), example);
336 writeDescription(&writer, example);
338 const QString moduleNameTag = moduleNameAsTag(m_project);
339 if (!moduleNameTag.isEmpty())
340 tags << moduleNameTag;
341 writeTagsElement(&writer, tags);
343 const QString exampleName = example->name().mid(example->name().lastIndexOf(
'/') + 1);
344 const auto files = example->files();
345 const QMap<
int, QString> filesToOpen = getFilesToOpen(files, exampleName);
346 writeFilesToOpen(writer, installPath, filesToOpen);
348 if (
const QStringMultiMap *metaTagMapP = example->doc().metaTagMap()) {
351 QStringMultiMap map = *metaTagMapP;
352 erase_if(map, [](QStringMultiMap::iterator iter) {
353 return iter.key() ==
"tag" || iter.key() ==
"tags" || iter.key() ==
"installpath";
355 writeMetaInformation(writer, map);
358 writer.writeEndElement();
361 writer.writeEndElement();
363 if (!m_exampleCategories.isEmpty()) {
364 writer.writeStartElement(
"categories");
365 for (
const auto &examplecategory : m_exampleCategories) {
366 writer.writeStartElement(
"category");
367 writer.writeCharacters(examplecategory);
368 writer.writeEndElement();
370 writer.writeEndElement();
373 writer.writeEndElement();
374 writer.writeEndDocument();