From c3ccd3d41d29ca8ae43d3ab04b1d101ee160a909 Mon Sep 17 00:00:00 2001 From: Casper van Donderen Date: Thu, 29 Mar 2012 14:50:11 +0200 Subject: [PATCH] QDoc: Add hand-written ditamaps as children of qt.ditamap Known issues: the hand-written ditamap has to be a flat list. The function used should preferably become a recursive function, which would allow you to have as many nested items as you want. Change-Id: I0dc897da5222f6409e2e58c42200c342bc8cacf2 Reviewed-by: Martin Smith --- src/tools/qdoc/ditaxmlgenerator.cpp | 113 ++++++++++++++++++++++++++---------- 1 file changed, 83 insertions(+), 30 deletions(-) diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp index 278c044..73aae1d 100644 --- a/src/tools/qdoc/ditaxmlgenerator.cpp +++ b/src/tools/qdoc/ditaxmlgenerator.cpp @@ -3886,12 +3886,14 @@ QString DitaXmlGenerator::guidForNode(const Node* node) /*! Constructs a file name appropriate for the \a node and returns it. If the \a node is not a fake node, or if it is a fake node but - it is neither an external page node nor an image node, call the - PageGenerator::fileName() function. + it is neither an external page node nor an image node or a ditamap, + call the PageGenerator::fileName() function. */ QString DitaXmlGenerator::fileName(const Node* node) { if (node->type() == Node::Fake) { + if (static_cast(node)->pageType() == Node::DitaMapPage) + return node->name(); if (static_cast(node)->subType() == Node::ExternalPage) return node->name(); if (static_cast(node)->subType() == Node::Image) @@ -5974,38 +5976,89 @@ void DitaXmlGenerator::writeTopicrefs(NodeMultiMap* nmm, const QString& navtitle return; writeStartTag(DT_topicref); xmlWriter().writeAttribute("navtitle",navtitle); - NodeMultiMap::iterator i = nmm->begin(); - while (i != nmm->end()) { - // Hardcode not writing index.dita multiple times in the tree. - // index.dita should only appear at the top of the ditamap. - if (fileName(i.value()) == "index.dita") { - i++; - continue; - } - writeStartTag(DT_topicref); - xmlWriter().writeAttribute("navtitle",i.key()); - xmlWriter().writeAttribute("href",fileName(i.value())); - switch (i.value()->type()) { - case Node::Class: { - const NamespaceNode* nn = static_cast(i.value()); - const NodeList& c = nn->childNodes(); - for (int j=0; jisInternal() || c[j]->access() == Node::Private || c[j]->doc().isEmpty()) - continue; - if (c[j]->type() == Node::Class) { - writeStartTag(DT_topicref); - xmlWriter().writeAttribute("navtitle",c[j]->name()); - xmlWriter().writeAttribute("href",fileName(c[j])); - writeEndTag(); // + NodeMultiMap::iterator i; + NodeMultiMap *ditaMaps = pageTypeMaps[Node::DitaMapPage]; + + /*! + Put all pages that are already in a hand-written ditamap not in + the qt.ditamap separately. It loops through all ditamaps recursively + before deciding to write an article to qt.ditamap. + */ + if ((navtitle == "articles" && ditaMaps && ditaMaps->size() > 0)) { + NodeMultiMap::iterator mapIterator = ditaMaps->begin(); + while (mapIterator != ditaMaps->end()) { + writeStartTag(DT_mapref); + xmlWriter().writeAttribute("navtitle",mapIterator.key()); + xmlWriter().writeAttribute("href",fileName(mapIterator.value())); + writeEndTag(); + ++mapIterator; + } + i = nmm->begin(); + while (i != nmm->end()) { + // Hardcode not writing index.dita multiple times in the tree. + // index.dita should only appear at the top of the ditamap. + if (fileName(i.value()) == "index.dita") { + i++; + continue; + } + bool foundInDitaMap = false; + mapIterator = ditaMaps->begin(); + while (mapIterator != ditaMaps->end()) { + const DitaMapNode *dmNode = static_cast(mapIterator.value()); + for (int count = 0; count < dmNode->map().count(); count++) { + if (dmNode->map().at(count)->navtitle() == i.key()) { + foundInDitaMap = true; + } + ++mapIterator; } } - break; + if (!foundInDitaMap) { + writeStartTag(DT_topicref); + xmlWriter().writeAttribute("navtitle",i.key()); + xmlWriter().writeAttribute("href",fileName(i.value())); + writeEndTag(); // + } + ++i; } - default: - break; + } + /*! + Shortcut when there are no hand-written ditamaps or when we are + not generating the articles list. + */ + else { + i = nmm->begin(); + while (i != nmm->end()) { + // Hardcode not writing index.dita multiple times in the tree. + // index.dita should only appear at the top of the ditamap. + if (fileName(i.value()) == "index.dita") { + i++; + continue; + } + writeStartTag(DT_topicref); + xmlWriter().writeAttribute("navtitle",i.key()); + xmlWriter().writeAttribute("href",fileName(i.value())); + switch (i.value()->type()) { + case Node::Class: { + const NamespaceNode* nn = static_cast(i.value()); + const NodeList& c = nn->childNodes(); + for (int j=0; jisInternal() || c[j]->access() == Node::Private || c[j]->doc().isEmpty()) + continue; + if (c[j]->type() == Node::Class) { + writeStartTag(DT_topicref); + xmlWriter().writeAttribute("navtitle",c[j]->name()); + xmlWriter().writeAttribute("href",fileName(c[j])); + writeEndTag(); // + } + } + break; + } + default: + break; + } + writeEndTag(); // + ++i; } - writeEndTag(); // - ++i; } writeEndTag(); // } -- 2.7.4