diff options
Diffstat (limited to 'src/qdoc/webxmlgenerator.cpp')
-rw-r--r-- | src/qdoc/webxmlgenerator.cpp | 175 |
1 files changed, 146 insertions, 29 deletions
diff --git a/src/qdoc/webxmlgenerator.cpp b/src/qdoc/webxmlgenerator.cpp index a4a14f7b7..ba1ad8389 100644 --- a/src/qdoc/webxmlgenerator.cpp +++ b/src/qdoc/webxmlgenerator.cpp @@ -32,6 +32,7 @@ #include "node.h" #include "qdocdatabase.h" #include "separator.h" +#include "quoter.h" #include "tree.h" #include <QtCore/qxmlstream.h> @@ -65,10 +66,17 @@ QString WebXMLGenerator::fileExtension() const return "html"; } -int WebXMLGenerator::generateAtom(const Atom * /* atom, */, - const Node * /* relative */, - CodeMarker * /* marker */) +/*! + Most of the output is generated by QDocIndexFiles and the append() callback. + Some pages produce supplementary output while being generated, and that's + handled here. +*/ +int WebXMLGenerator::generateAtom(const Atom *atom, + const Node *relative, + CodeMarker *marker) { + if (supplement && currentWriter) + addAtomElements(*currentWriter.data(), atom, relative, marker); return 0; } @@ -95,27 +103,73 @@ void WebXMLGenerator::generateCppReferencePage(Aggregate *aggregate, CodeMarker void WebXMLGenerator::generatePageNode(PageNode *pn, CodeMarker * /* marker */) { QByteArray data; + currentWriter.reset(new QXmlStreamWriter(&data)); + currentWriter->setAutoFormatting(true); + beginSubPage(pn, Generator::fileName(pn, "webxml")); + currentWriter->writeStartDocument(); + currentWriter->writeStartElement("WebXML"); + currentWriter->writeStartElement("document"); + + generateIndexSections(*currentWriter.data(), pn); + + currentWriter->writeEndElement(); // document + currentWriter->writeEndElement(); // WebXML + currentWriter->writeEndDocument(); + + out() << data; + endSubPage(); +} + +void WebXMLGenerator::generateExampleFilePage(const Node *en, + const QString &file, + CodeMarker * /* marker */) +{ + QByteArray data; QXmlStreamWriter writer(&data); writer.setAutoFormatting(true); - beginSubPage(pn, Generator::fileName(pn, "webxml")); + beginFilePage(en, linkForExampleFile(file, en, "webxml")); writer.writeStartDocument(); writer.writeStartElement("WebXML"); writer.writeStartElement("document"); + writer.writeStartElement("page"); + writer.writeAttribute("name", file); + writer.writeAttribute("href", linkForExampleFile(file, en)); + QString title = exampleFileTitle(static_cast<const ExampleNode *>(en), file); + writer.writeAttribute("title", title); + writer.writeAttribute("fulltitle", title); + writer.writeAttribute("subtitle", file); + writer.writeStartElement("description"); + QString userFriendlyFilePath; // unused + writer.writeAttribute("path", Doc::resolveFile(en->doc().location(), + file, + &userFriendlyFilePath)); + writer.writeAttribute("line", "0"); + writer.writeAttribute("column", "0"); + + Quoter quoter; + Doc::quoteFromFile(en->doc().location(), quoter, file); + QString code = quoter.quoteTo(en->location(), QString(), QString()); + writer.writeTextElement("code", trimmedTrailing(code, QString(), QString())); - generateIndexSections(writer, pn); + writer.writeEndElement(); // description + writer.writeEndElement(); // page writer.writeEndElement(); // document writer.writeEndElement(); // WebXML writer.writeEndDocument(); + out() << data; - endSubPage(); + endFilePage(); } void WebXMLGenerator::generateIndexSections(QXmlStreamWriter &writer, Node *node) { marker_ = CodeMarker::markerForFileName(node->location().filePath()); QDocIndexFiles::qdocIndexFiles()->generateIndexSections(writer, node, this); + // generateIndexSections does nothing for groups, so handle them explicitly + if (node->isGroup()) + QDocIndexFiles::qdocIndexFiles()->generateIndexSection(writer, node, this); } // Handles callbacks from QDocIndexFiles to add documentation to node @@ -180,6 +234,17 @@ void WebXMLGenerator::append(QXmlStreamWriter &writer, Node *node) } writer.writeEndElement(); // see-also } + + if (node->isExample()) { + supplement = true; + generateRequiredLinks(node, marker_); + supplement = false; + } else if (node->isGroup()) { + CollectionNode *cn = static_cast<CollectionNode *>(node); + if (!cn->noAutoList()) + generateAnnotatedList(writer, node, cn->members()); + } + writer.writeEndElement(); // description } @@ -225,6 +290,13 @@ const Atom *WebXMLGenerator::addAtomElements(QXmlStreamWriter &writer, bool keepQuoting = false; switch (atom->type()) { + case Atom::AnnotatedList: + { + const CollectionNode* cn = qdb_->getCollectionNode(atom->string(), Node::Group); + if (cn) + generateAnnotatedList(writer, relative, cn->members()); + } + break; case Atom::AutoLink: if (!inLink && !inSectionHeading) { const Node *node = nullptr; @@ -349,6 +421,26 @@ const Atom *WebXMLGenerator::addAtomElements(QXmlStreamWriter &writer, } break; + case Atom::ExampleFileLink: + { + if (!inLink) { + QString link = linkForExampleFile(atom->string(), relative); + if (!link.isEmpty()) + startLink(writer, atom, relative, link); + } + } + break; + + case Atom::ExampleImageLink: + { + if (!inLink) { + QString link = atom->string(); + if (!link.isEmpty()) + startLink(writer, atom, nullptr, "images/used-in-examples/" + link); + } + } + break; + case Atom::FootnoteLeft: writer.writeStartElement("footnote"); break; @@ -453,7 +545,7 @@ const Atom *WebXMLGenerator::addAtomElements(QXmlStreamWriter &writer, if (!inLink) { const Node *node = nullptr; QString link = getLink(atom, relative, &node); - if (node) + if (!link.isEmpty()) startLink(writer, atom, node, link); } break; @@ -668,27 +760,41 @@ const Atom *WebXMLGenerator::addAtomElements(QXmlStreamWriter &writer, void WebXMLGenerator::startLink(QXmlStreamWriter &writer, const Atom *atom, const Node *node, const QString &link) { - QString fullName = node->fullName(); + QString fullName = link; + if (node) + fullName = node->fullName(); if (!fullName.isEmpty() && !link.isEmpty()) { writer.writeStartElement("link"); writer.writeAttribute("raw", atom->string()); writer.writeAttribute("href", link); writer.writeAttribute("type", targetType(node)); - switch (node->nodeType()) { - case Node::Enum: - writer.writeAttribute("enum", fullName); - break; - case Node::Page: - writer.writeAttribute("page", fullName); - break; - case Node::Property: - { - const PropertyNode *propertyNode = static_cast<const PropertyNode *>(node); - if (propertyNode->getters().size() > 0) - writer.writeAttribute("getter", propertyNode->getters().at(0)->fullName()); - } - default: - ; + if (node) { + switch (node->nodeType()) { + case Node::Enum: + writer.writeAttribute("enum", fullName); + break; + case Node::Example: + { + const ExampleNode *en = static_cast<const ExampleNode *>(node); + QString fileTitle = exampleFileTitle(en, atom->string()); + if (!fileTitle.isEmpty()) { + writer.writeAttribute("page", fileTitle); + break; + } + } + // fall through + case Node::Page: + writer.writeAttribute("page", fullName); + break; + case Node::Property: + { + const PropertyNode *propertyNode = static_cast<const PropertyNode *>(node); + if (propertyNode->getters().size() > 0) + writer.writeAttribute("getter", propertyNode->getters().at(0)->fullName()); + } + default: + ; + } } inLink = true; } @@ -696,6 +802,9 @@ void WebXMLGenerator::startLink(QXmlStreamWriter &writer, const Atom *atom, QString WebXMLGenerator::targetType(const Node *node) { + if (!node) + return "external"; + switch (node->nodeType()) { case Node::Namespace: return "namespace"; @@ -704,6 +813,7 @@ QString WebXMLGenerator::targetType(const Node *node) case Node::Union: return "class"; case Node::Page: + case Node::Example: return "page"; case Node::Enum: return "enum"; @@ -771,13 +881,16 @@ void WebXMLGenerator::generateRelations(QXmlStreamWriter &writer, const Node *no void WebXMLGenerator::generateAnnotatedList(QXmlStreamWriter &writer, const Node *relative, const NodeMap &nodeMap) { + generateAnnotatedList(writer, relative, nodeMap.values()); +} + +void WebXMLGenerator::generateAnnotatedList(QXmlStreamWriter &writer, + const Node *relative, const NodeList &nodeList) +{ writer.writeStartElement("table"); writer.writeAttribute("width", "100%"); - for (NodeMap::const_iterator it = nodeMap.cbegin(), - end = nodeMap.cend(); it != end; ++it) { - const Node *node = it.value(); - + for (const auto *node : nodeList) { writer.writeStartElement("row"); writer.writeStartElement("heading"); generateFullName(writer, node, relative); @@ -794,10 +907,14 @@ void WebXMLGenerator::generateAnnotatedList(QXmlStreamWriter &writer, void WebXMLGenerator::generateFullName(QXmlStreamWriter &writer, const Node *node, const Node *relative) { + QString type = targetType(node); + QString name = node->fullName(relative); writer.writeStartElement("link"); writer.writeAttribute("href", fullDocumentLocation(node)); - writer.writeAttribute("type", targetType(node)); - writer.writeCharacters(node->fullName(relative)); + writer.writeAttribute("type", type); + if (type == QLatin1String("page")) + writer.writeAttribute("page", name); + writer.writeCharacters(name); writer.writeEndElement(); // link } |