summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCasper van Donderen <casper.vandonderen@nokia.com>2012-03-29 14:50:11 +0200
committerQt by Nokia <qt-info@nokia.com>2012-03-29 18:29:04 +0200
commitc3ccd3d41d29ca8ae43d3ab04b1d101ee160a909 (patch)
tree2b9e54e5f06d83ba37e443efc244b86d3da82cbe /src
parentc1cb279019c5630aa6a8d7d8f3191832daa7509a (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.cpp113
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>
}