QDoc: Add hand-written ditamaps as children of qt.ditamap
authorCasper van Donderen <casper.vandonderen@nokia.com>
Thu, 29 Mar 2012 12:50:11 +0000 (14:50 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 29 Mar 2012 16:29:04 +0000 (18:29 +0200)
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 <martin.smith@nokia.com>
src/tools/qdoc/ditaxmlgenerator.cpp

index 278c044..73aae1d 100644 (file)
@@ -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<const FakeNode*>(node)->pageType() == Node::DitaMapPage)
+            return node->name();
         if (static_cast<const FakeNode*>(node)->subType() == Node::ExternalPage)
             return node->name();
         if (static_cast<const FakeNode*>(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<const NamespaceNode*>(i.value());
-            const NodeList& c = nn->childNodes();
-            for (int j=0; j<c.size(); ++j) {
-                if (c[j]->isInternal() || 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(); // </topicref>
+    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<const DitaMapNode *>(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(); // </topicref>
+            }
+            ++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<const NamespaceNode*>(i.value());
+                const NodeList& c = nn->childNodes();
+                for (int j=0; j<c.size(); ++j) {
+                    if (c[j]->isInternal() || 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(); // </topicref>
+                    }
+                }
+                break;
+            }
+            default:
+                break;
+            }
+            writeEndTag(); // </topicref>
+            ++i;
         }
-        writeEndTag(); // </topicref>
-        ++i;
     }
     writeEndTag(); // </topicref>
 }