summaryrefslogtreecommitdiffstats
path: root/src/qdoc/webxmlgenerator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qdoc/webxmlgenerator.cpp')
-rw-r--r--src/qdoc/webxmlgenerator.cpp890
1 files changed, 0 insertions, 890 deletions
diff --git a/src/qdoc/webxmlgenerator.cpp b/src/qdoc/webxmlgenerator.cpp
deleted file mode 100644
index 2f8f772b5..000000000
--- a/src/qdoc/webxmlgenerator.cpp
+++ /dev/null
@@ -1,890 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the tools applications of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "webxmlgenerator.h"
-
-#include "aggregate.h"
-#include "collectionnode.h"
-#include "config.h"
-#include "helpprojectwriter.h"
-#include "node.h"
-#include "propertynode.h"
-#include "qdocdatabase.h"
-#include "quoter.h"
-
-#include <QtCore/qxmlstream.h>
-
-QT_BEGIN_NAMESPACE
-
-static CodeMarker *marker_ = nullptr;
-
-void WebXMLGenerator::initializeGenerator()
-{
- HtmlGenerator::initializeGenerator();
-}
-
-void WebXMLGenerator::terminateGenerator()
-{
- Generator::terminateGenerator();
-}
-
-QString WebXMLGenerator::format()
-{
- return "WebXML";
-}
-
-QString WebXMLGenerator::fileExtension() const
-{
- // As this is meant to be an intermediate format,
- // use .html for internal references. The name of
- // the output file is set separately in
- // beginSubPage() calls.
- return "html";
-}
-
-/*!
- 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.
-*/
-qsizetype WebXMLGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMarker *marker)
-{
- if (m_supplement && currentWriter)
- addAtomElements(*currentWriter.data(), atom, relative, marker);
- return 0;
-}
-
-void WebXMLGenerator::generateCppReferencePage(Aggregate *aggregate, CodeMarker * /* marker */)
-{
- QByteArray data;
- QXmlStreamWriter writer(&data);
- writer.setAutoFormatting(true);
- beginSubPage(aggregate, Generator::fileName(aggregate, "webxml"));
- writer.writeStartDocument();
- writer.writeStartElement("WebXML");
- writer.writeStartElement("document");
-
- generateIndexSections(writer, aggregate);
-
- writer.writeEndElement(); // document
- writer.writeEndElement(); // WebXML
- writer.writeEndDocument();
-
- out() << data;
- endSubPage();
-}
-
-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);
- beginFilePage(en, linkForExampleFile(file, "webxml"));
- writer.writeStartDocument();
- writer.writeStartElement("WebXML");
- writer.writeStartElement("document");
- writer.writeStartElement("page");
- writer.writeAttribute("name", file);
- writer.writeAttribute("href", linkForExampleFile(file));
- QString title = exampleFileTitle(static_cast<const ExampleNode *>(en), file);
- writer.writeAttribute("title", title);
- writer.writeAttribute("fulltitle", title);
- writer.writeAttribute("subtitle", file);
- writer.writeStartElement("description");
-
- if (Config::instance().getBool(CONFIG_LOCATIONINFO)) {
- 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()));
-
- writer.writeEndElement(); // description
- writer.writeEndElement(); // page
- writer.writeEndElement(); // document
- writer.writeEndElement(); // WebXML
- writer.writeEndDocument();
-
- out() << data;
- endFilePage();
-}
-
-void WebXMLGenerator::generateIndexSections(QXmlStreamWriter &writer, Node *node)
-{
- marker_ = CodeMarker::markerForFileName(node->location().filePath());
- auto qdocIndexFiles = QDocIndexFiles::qdocIndexFiles();
- if (qdocIndexFiles) {
- qdocIndexFiles->generateIndexSections(writer, node, this);
- // generateIndexSections does nothing for groups, so handle them explicitly
- if (node->isGroup())
- qdocIndexFiles->generateIndexSection(writer, node, this);
- }
-}
-
-// Handles callbacks from QDocIndexFiles to add documentation to node
-void WebXMLGenerator::append(QXmlStreamWriter &writer, Node *node)
-{
- Q_ASSERT(marker_);
-
- writer.writeStartElement("description");
- if (Config::instance().getBool(CONFIG_LOCATIONINFO)) {
- writer.writeAttribute("path", node->doc().location().filePath());
- writer.writeAttribute("line", QString::number(node->doc().location().lineNo()));
- writer.writeAttribute("column", QString::number(node->doc().location().columnNo()));
- }
-
- if (node->isTextPageNode())
- generateRelations(writer, node);
-
- if (node->isModule()) {
- writer.writeStartElement("generatedlist");
- writer.writeAttribute("contents", "classesbymodule");
- auto *cnn = static_cast<CollectionNode *>(node);
-
- if (cnn->hasNamespaces()) {
- writer.writeStartElement("section");
- writer.writeStartElement("heading");
- writer.writeAttribute("level", "1");
- writer.writeCharacters("Namespaces");
- writer.writeEndElement(); // heading
- NodeMap namespaces;
- cnn->getMemberNamespaces(namespaces);
- generateAnnotatedList(writer, node, namespaces);
- writer.writeEndElement(); // section
- }
- if (cnn->hasClasses()) {
- writer.writeStartElement("section");
- writer.writeStartElement("heading");
- writer.writeAttribute("level", "1");
- writer.writeCharacters("Classes");
- writer.writeEndElement(); // heading
- NodeMap classes;
- cnn->getMemberClasses(classes);
- generateAnnotatedList(writer, node, classes);
- writer.writeEndElement(); // section
- }
- writer.writeEndElement(); // generatedlist
- }
-
- m_inLink = m_inSectionHeading = m_hasQuotingInformation = false;
-
- const Atom *atom = node->doc().body().firstAtom();
- while (atom)
- atom = addAtomElements(writer, atom, node, marker_);
-
- QList<Text> alsoList = node->doc().alsoList();
- supplementAlsoList(node, alsoList);
-
- if (!alsoList.isEmpty()) {
- writer.writeStartElement("see-also");
- for (const auto &item : alsoList) {
- const auto *atom = item.firstAtom();
- while (atom)
- atom = addAtomElements(writer, atom, node, marker_);
- }
- writer.writeEndElement(); // see-also
- }
-
- if (node->isExample()) {
- m_supplement = true;
- generateRequiredLinks(node, marker_);
- m_supplement = false;
- } else if (node->isGroup()) {
- auto *cn = static_cast<CollectionNode *>(node);
- if (!cn->noAutoList())
- generateAnnotatedList(writer, node, cn->members());
- }
-
- writer.writeEndElement(); // description
-}
-
-void WebXMLGenerator::generateDocumentation(Node *node)
-{
- // Don't generate nodes that are already processed, or if they're not supposed to
- // generate output, ie. external, index or images nodes.
- if (!node->url().isNull() || node->isExternalPage() || node->isIndexNode())
- return;
-
- if (node->isInternal() && !m_showInternal)
- return;
-
- if (node->parent()) {
- if (node->isNamespace() || node->isClassNode() || node->isHeader())
- generateCppReferencePage(static_cast<Aggregate *>(node), nullptr);
- else if (node->isCollectionNode()) {
- if (node->wasSeen()) {
- // see remarks in base class impl.
- m_qdb->mergeCollections(static_cast<CollectionNode *>(node));
- generatePageNode(static_cast<PageNode *>(node), nullptr);
- }
- } else if (node->isTextPageNode())
- generatePageNode(static_cast<PageNode *>(node), nullptr);
- // else if TODO: anything else?
- }
-
- if (node->isAggregate()) {
- auto *aggregate = static_cast<Aggregate *>(node);
- for (auto c : aggregate->childNodes()) {
- if ((c->isAggregate() || c->isTextPageNode() || c->isCollectionNode())
- && !c->isPrivate())
- generateDocumentation(c);
- }
- }
-}
-
-const Atom *WebXMLGenerator::addAtomElements(QXmlStreamWriter &writer, const Atom *atom,
- const Node *relative, CodeMarker *marker)
-{
- bool keepQuoting = false;
-
- if (!atom)
- return nullptr;
-
- switch (atom->type()) {
- case Atom::AnnotatedList: {
- const CollectionNode *cn = m_qdb->getCollectionNode(atom->string(), Node::Group);
- if (cn)
- generateAnnotatedList(writer, relative, cn->members());
- } break;
- case Atom::AutoLink:
- if (!m_inLink && !m_inSectionHeading) {
- const Node *node = nullptr;
- QString link = getAutoLink(atom, relative, &node, Node::API);
- if (!link.isEmpty() && node && node->isDeprecated()
- && relative->parent() != node && !relative->isDeprecated()) {
- link.clear();
- }
- if (node) {
- startLink(writer, atom, node, link);
- if (m_inLink) {
- writer.writeCharacters(atom->string());
- writer.writeEndElement(); // link
- m_inLink = false;
- }
- } else {
- writer.writeCharacters(atom->string());
- }
- } else {
- writer.writeCharacters(atom->string());
- }
- break;
- case Atom::BaseName:
- break;
- case Atom::BriefLeft:
-
- writer.writeStartElement("brief");
- switch (relative->nodeType()) {
- case Node::Property:
- writer.writeCharacters("This property");
- break;
- case Node::Variable:
- writer.writeCharacters("This variable");
- break;
- default:
- break;
- }
- if (relative->isProperty() || relative->isVariable()) {
- QString str;
- const Atom *a = atom->next();
- while (a != nullptr && a->type() != Atom::BriefRight) {
- if (a->type() == Atom::String || a->type() == Atom::AutoLink)
- str += a->string();
- a = a->next();
- }
- str[0] = str[0].toLower();
- if (str.endsWith('.'))
- str.chop(1);
-
- const QList<QStringView> words = QStringView{str}.split(' ');
- if (!words.isEmpty()) {
- QStringView first(words.at(0));
- if (!(first == u"contains" || first == u"specifies" || first == u"describes"
- || first == u"defines" || first == u"holds" || first == u"determines"))
- writer.writeCharacters(" holds ");
- else
- writer.writeCharacters(" ");
- }
- }
- break;
-
- case Atom::BriefRight:
- if (relative->isProperty() || relative->isVariable())
- writer.writeCharacters(".");
-
- writer.writeEndElement(); // brief
- break;
-
- case Atom::C:
- writer.writeStartElement("teletype");
- if (m_inLink)
- writer.writeAttribute("type", "normal");
- else
- writer.writeAttribute("type", "highlighted");
-
- writer.writeCharacters(plainCode(atom->string()));
- writer.writeEndElement(); // teletype
- break;
-
- case Atom::Code:
- if (!m_hasQuotingInformation)
- writer.writeTextElement(
- "code", trimmedTrailing(plainCode(atom->string()), QString(), QString()));
- else
- keepQuoting = true;
- break;
-
-#ifdef QDOC_QML
- case Atom::Qml:
- if (!m_hasQuotingInformation)
- writer.writeTextElement(
- "qml", trimmedTrailing(plainCode(atom->string()), QString(), QString()));
- else
- keepQuoting = true;
-#endif
- case Atom::CodeBad:
- writer.writeTextElement("badcode",
- trimmedTrailing(plainCode(atom->string()), QString(), QString()));
- break;
-
- case Atom::CodeNew:
- writer.writeTextElement("para", "you can rewrite it as");
- writer.writeTextElement("newcode",
- trimmedTrailing(plainCode(atom->string()), QString(), QString()));
- break;
-
- case Atom::CodeOld:
- writer.writeTextElement("para", "For example, if you have code like");
- writer.writeTextElement("oldcode",
- trimmedTrailing(plainCode(atom->string()), QString(), QString()));
- break;
-
- case Atom::CodeQuoteArgument:
- if (m_quoting) {
- if (quoteCommand == "dots") {
- writer.writeAttribute("indent", atom->string());
- writer.writeCharacters("...");
- } else {
- writer.writeCharacters(atom->string());
- }
- writer.writeEndElement(); // code
- keepQuoting = true;
- }
- break;
-
- case Atom::CodeQuoteCommand:
- if (m_quoting) {
- quoteCommand = atom->string();
- writer.writeStartElement(quoteCommand);
- }
- break;
-
- case Atom::ExampleFileLink: {
- if (!m_inLink) {
- QString link = linkForExampleFile(atom->string());
- if (!link.isEmpty())
- startLink(writer, atom, relative, link);
- }
- } break;
-
- case Atom::ExampleImageLink: {
- if (!m_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;
-
- case Atom::FootnoteRight:
- writer.writeEndElement(); // footnote
- break;
-
- case Atom::FormatEndif:
- writer.writeEndElement(); // raw
- break;
- case Atom::FormatIf:
- writer.writeStartElement("raw");
- writer.writeAttribute("format", atom->string());
- break;
- case Atom::FormattingLeft: {
- if (atom->string() == ATOM_FORMATTING_BOLD)
- writer.writeStartElement("bold");
- else if (atom->string() == ATOM_FORMATTING_ITALIC)
- writer.writeStartElement("italic");
- else if (atom->string() == ATOM_FORMATTING_UNDERLINE)
- writer.writeStartElement("underline");
- else if (atom->string() == ATOM_FORMATTING_SUBSCRIPT)
- writer.writeStartElement("subscript");
- else if (atom->string() == ATOM_FORMATTING_SUPERSCRIPT)
- writer.writeStartElement("superscript");
- else if (atom->string() == ATOM_FORMATTING_TELETYPE)
- writer.writeStartElement("teletype");
- else if (atom->string() == ATOM_FORMATTING_PARAMETER)
- writer.writeStartElement("argument");
- else if (atom->string() == ATOM_FORMATTING_INDEX)
- writer.writeStartElement("index");
- } break;
-
- case Atom::FormattingRight: {
- if (atom->string() == ATOM_FORMATTING_BOLD)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_ITALIC)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_UNDERLINE)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_SUBSCRIPT)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_SUPERSCRIPT)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_TELETYPE)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_PARAMETER)
- writer.writeEndElement();
- else if (atom->string() == ATOM_FORMATTING_INDEX)
- writer.writeEndElement();
- }
- if (m_inLink) {
- writer.writeEndElement(); // link
- m_inLink = false;
- }
- break;
-
- case Atom::GeneratedList:
- writer.writeStartElement("generatedlist");
- writer.writeAttribute("contents", atom->string());
- writer.writeEndElement();
- break;
- case Atom::Image:
- writer.writeStartElement("image");
- writer.writeAttribute("href", imageFileName(relative, atom->string()));
- writer.writeEndElement();
- setImageFileName(relative, atom->string());
- break;
-
- case Atom::InlineImage:
- writer.writeStartElement("inlineimage");
- writer.writeAttribute("href", imageFileName(relative, atom->string()));
- writer.writeEndElement();
- setImageFileName(relative, atom->string());
- break;
-
- case Atom::ImageText:
- break;
-
- case Atom::ImportantLeft:
- writer.writeStartElement("para");
- writer.writeTextElement("bold", "Important:");
- writer.writeCharacters(" ");
- break;
-
- case Atom::LegaleseLeft:
- writer.writeStartElement("legalese");
- break;
-
- case Atom::LegaleseRight:
- writer.writeEndElement(); // legalese
- break;
-
- case Atom::Link:
- case Atom::LinkNode:
- if (!m_inLink) {
- const Node *node = nullptr;
- QString link = getLink(atom, relative, &node);
- if (!link.isEmpty())
- startLink(writer, atom, node, link);
- }
- break;
-
- case Atom::ListLeft:
- writer.writeStartElement("list");
-
- if (atom->string() == ATOM_LIST_BULLET)
- writer.writeAttribute("type", "bullet");
- else if (atom->string() == ATOM_LIST_TAG)
- writer.writeAttribute("type", "definition");
- else if (atom->string() == ATOM_LIST_VALUE) {
- if (relative->isEnumType())
- writer.writeAttribute("type", "enum");
- else
- writer.writeAttribute("type", "definition");
- } else {
- writer.writeAttribute("type", "ordered");
- if (atom->string() == ATOM_LIST_UPPERALPHA)
- writer.writeAttribute("start", "A");
- else if (atom->string() == ATOM_LIST_LOWERALPHA)
- writer.writeAttribute("start", "a");
- else if (atom->string() == ATOM_LIST_UPPERROMAN)
- writer.writeAttribute("start", "I");
- else if (atom->string() == ATOM_LIST_LOWERROMAN)
- writer.writeAttribute("start", "i");
- else // (atom->string() == ATOM_LIST_NUMERIC)
- writer.writeAttribute("start", "1");
- }
- break;
-
- case Atom::ListItemNumber:
- break;
- case Atom::ListTagLeft: {
- writer.writeStartElement("definition");
-
- writer.writeTextElement(
- "term", plainCode(marker->markedUpEnumValue(atom->next()->string(), relative)));
- } break;
-
- case Atom::ListTagRight:
- writer.writeEndElement(); // definition
- break;
-
- case Atom::ListItemLeft:
- writer.writeStartElement("item");
- break;
-
- case Atom::ListItemRight:
- writer.writeEndElement(); // item
- break;
-
- case Atom::ListRight:
- writer.writeEndElement(); // list
- break;
-
- case Atom::NoteLeft:
- writer.writeStartElement("para");
- writer.writeTextElement("bold", "Note:");
- writer.writeCharacters(" ");
- break;
-
- // End admonition elements
- case Atom::ImportantRight:
- case Atom::NoteRight:
- case Atom::WarningRight:
- writer.writeEndElement(); // para
- break;
-
- case Atom::Nop:
- break;
-
- case Atom::ParaLeft:
- writer.writeStartElement("para");
- break;
-
- case Atom::ParaRight:
- writer.writeEndElement(); // para
- break;
-
- case Atom::QuotationLeft:
- writer.writeStartElement("quote");
- break;
-
- case Atom::QuotationRight:
- writer.writeEndElement(); // quote
- break;
-
- case Atom::RawString:
- writer.writeCharacters(atom->string());
- break;
-
- case Atom::SectionLeft:
- writer.writeStartElement("section");
- writer.writeAttribute("id", Doc::canonicalTitle(Text::sectionHeading(atom).toString()));
- break;
-
- case Atom::SectionRight:
- writer.writeEndElement(); // section
- break;
-
- case Atom::SectionHeadingLeft: {
- writer.writeStartElement("heading");
- int unit = atom->string().toInt(); // + hOffset(relative)
- writer.writeAttribute("level", QString::number(unit));
- m_inSectionHeading = true;
- } break;
-
- case Atom::SectionHeadingRight:
- writer.writeEndElement(); // heading
- m_inSectionHeading = false;
- break;
-
- case Atom::SidebarLeft:
- case Atom::SidebarRight:
- break;
-
- case Atom::SnippetCommand:
- if (m_quoting) {
- writer.writeStartElement(atom->string());
- }
- break;
-
- case Atom::SnippetIdentifier:
- if (m_quoting) {
- writer.writeAttribute("identifier", atom->string());
- writer.writeEndElement();
- keepQuoting = true;
- }
- break;
-
- case Atom::SnippetLocation:
- if (m_quoting) {
- const QString &location = atom->string();
- writer.writeAttribute("location", location);
- const QString resolved = Doc::resolveFile(Location(), location);
- if (!resolved.isEmpty())
- writer.writeAttribute("path", resolved);
- }
- break;
-
- case Atom::String:
- writer.writeCharacters(atom->string());
- break;
- case Atom::TableLeft:
- writer.writeStartElement("table");
- if (atom->string().contains("%"))
- writer.writeAttribute("width", atom->string());
- break;
-
- case Atom::TableRight:
- writer.writeEndElement(); // table
- break;
-
- case Atom::TableHeaderLeft:
- writer.writeStartElement("header");
- break;
-
- case Atom::TableHeaderRight:
- writer.writeEndElement(); // header
- break;
-
- case Atom::TableRowLeft:
- writer.writeStartElement("row");
- break;
-
- case Atom::TableRowRight:
- writer.writeEndElement(); // row
- break;
-
- case Atom::TableItemLeft: {
- writer.writeStartElement("item");
- QStringList spans = atom->string().split(",");
- if (spans.size() == 2) {
- if (spans.at(0) != "1")
- writer.writeAttribute("colspan", spans.at(0).trimmed());
- if (spans.at(1) != "1")
- writer.writeAttribute("rowspan", spans.at(1).trimmed());
- }
- } break;
- case Atom::TableItemRight:
- writer.writeEndElement(); // item
- break;
-
- case Atom::Target:
- writer.writeStartElement("target");
- writer.writeAttribute("name", Doc::canonicalTitle(atom->string()));
- writer.writeEndElement();
- break;
-
- case Atom::WarningLeft:
- writer.writeStartElement("para");
- writer.writeTextElement("bold", "Warning:");
- writer.writeCharacters(" ");
- break;
-
- case Atom::UnhandledFormat:
- case Atom::UnknownCommand:
- writer.writeCharacters(atom->typeString());
- break;
- default:
- break;
- }
-
- m_hasQuotingInformation = keepQuoting;
- return atom->next();
-}
-
-void WebXMLGenerator::startLink(QXmlStreamWriter &writer, const Atom *atom, const Node *node,
- const QString &link)
-{
- QString fullName = link;
- if (node)
- fullName = node->fullName();
- if (!fullName.isEmpty() && !link.isEmpty()) {
- writer.writeStartElement("link");
- if (atom && !atom->string().isEmpty())
- writer.writeAttribute("raw", atom->string());
- else
- writer.writeAttribute("raw", fullName);
- writer.writeAttribute("href", link);
- writer.writeAttribute("type", targetType(node));
- if (node) {
- switch (node->nodeType()) {
- case Node::Enum:
- writer.writeAttribute("enum", fullName);
- break;
- case Node::Example: {
- const auto *en = static_cast<const ExampleNode *>(node);
- QString fileTitle = exampleFileTitle(en, atom->string());
- if (!fileTitle.isEmpty()) {
- writer.writeAttribute("page", fileTitle);
- break;
- }
- }
- Q_FALLTHROUGH();
- case Node::Page:
- writer.writeAttribute("page", fullName);
- break;
- case Node::Property: {
- const auto *propertyNode = static_cast<const PropertyNode *>(node);
- if (!propertyNode->getters().empty())
- writer.writeAttribute("getter", propertyNode->getters().at(0)->fullName());
- } break;
- default:
- break;
- }
- }
- m_inLink = true;
- }
-}
-
-void WebXMLGenerator::endLink(QXmlStreamWriter &writer)
-{
- if (m_inLink) {
- writer.writeEndElement(); // link
- m_inLink = false;
- }
-}
-
-void WebXMLGenerator::generateRelations(QXmlStreamWriter &writer, const Node *node)
-{
- if (node && !node->links().empty()) {
- QPair<QString, QString> anchorPair;
- const Node *linkNode;
-
- for (auto it = node->links().cbegin(); it != node->links().cend(); ++it) {
-
- linkNode = m_qdb->findNodeForTarget(it.value().first, node);
-
- if (!linkNode)
- linkNode = node;
-
- if (linkNode == node)
- anchorPair = it.value();
- else
- anchorPair = anchorForNode(linkNode);
-
- writer.writeStartElement("relation");
- writer.writeAttribute("href", anchorPair.first);
- writer.writeAttribute("type", targetType(linkNode));
-
- switch (it.key()) {
- case Node::StartLink:
- writer.writeAttribute("meta", "start");
- break;
- case Node::NextLink:
- writer.writeAttribute("meta", "next");
- break;
- case Node::PreviousLink:
- writer.writeAttribute("meta", "previous");
- break;
- case Node::ContentsLink:
- writer.writeAttribute("meta", "contents");
- break;
- default:
- writer.writeAttribute("meta", "");
- }
- writer.writeAttribute("description", anchorPair.second);
- writer.writeEndElement(); // link
- }
- }
-}
-
-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 (const auto *node : nodeList) {
- writer.writeStartElement("row");
- writer.writeStartElement("item");
- writer.writeStartElement("para");
- const QString link = linkForNode(node, relative);
- startLink(writer, node->doc().body().firstAtom(), node, link);
- endLink(writer);
- writer.writeEndElement(); // para
- writer.writeEndElement(); // item
-
- writer.writeStartElement("item");
- writer.writeStartElement("para");
- writer.writeCharacters(node->doc().briefText().toString());
- writer.writeEndElement(); // para
- writer.writeEndElement(); // item
- writer.writeEndElement(); // row
- }
- writer.writeEndElement(); // table
-}
-
-QString WebXMLGenerator::fileBase(const Node *node) const
-{
- return Generator::fileBase(node);
-}
-
-QT_END_NAMESPACE