diff options
author | Casper van Donderen <casper.vandonderen@nokia.com> | 2012-03-29 14:50:11 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-29 18:29:04 +0200 |
commit | c3ccd3d41d29ca8ae43d3ab04b1d101ee160a909 (patch) | |
tree | 2b9e54e5f06d83ba37e443efc244b86d3da82cbe /src | |
parent | c1cb279019c5630aa6a8d7d8f3191832daa7509a (diff) |
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 <martin.smith@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/qdoc/ditaxmlgenerator.cpp | 113 |
1 files changed, 83 insertions, 30 deletions
diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp index 278c044612..73aae1dbaa 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<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> } |