diff options
Diffstat (limited to 'src/tools/qdoc/htmlgenerator.cpp')
-rw-r--r-- | src/tools/qdoc/htmlgenerator.cpp | 972 |
1 files changed, 526 insertions, 446 deletions
diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp index 407253ff64..be8c68fc11 100644 --- a/src/tools/qdoc/htmlgenerator.cpp +++ b/src/tools/qdoc/htmlgenerator.cpp @@ -264,16 +264,15 @@ QString HtmlGenerator::format() } /*! - Traverses the database generating all the HTML documentation. + Traverses the current tree generating all the HTML documentation. */ -void HtmlGenerator::generateTree() +void HtmlGenerator::generateDocs() { - qdb_->buildCollections(); - Node* qflags = qdb_->findNodeByNameAndType(QStringList("QFlags"), Node::Class, Node::NoSubType); + Node* qflags = qdb_->findClassNode(QStringList("QFlags")); if (qflags) qflagsHref_ = linkForNode(qflags,0); if (!runPrepareOnly()) { - Generator::generateTree(); + Generator::generateDocs(); generateCollisionPages(); } @@ -304,9 +303,6 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark int skipAhead = 0; static bool in_para = false; - if (Generator::debugging()) { - atom->dump(); - } switch (atom->type()) { case Atom::AbstractLeft: if (relative) @@ -319,15 +315,22 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark case Atom::AutoLink: if (!inLink_ && !inContents_ && !inSectionHeading_) { const Node *node = 0; - QString link = getLink(atom, relative, &node); - if (!link.isEmpty()) { + QString link = getAutoLink(atom, relative, &node); + if (link.isEmpty()) { + if (autolinkErrors()) + relative->doc().location().warning(tr("Can't autolink to '%1'").arg(atom->string())); + } + else if (node && node->status() == Node::Obsolete) { + if ((relative->parent() != node) && !relative->isObsolete()) + link.clear(); + } + if (link.isEmpty()) + out() << protectEnc(atom->string()); + else { beginLink(link, node, relative); generateLink(atom, marker); endLink(); } - else { - out() << protectEnc(atom->string()); - } } else { out() << protectEnc(atom->string()); @@ -336,11 +339,9 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark case Atom::BaseName: break; case Atom::BriefLeft: - if (relative->type() == Node::Document) { - if (relative->subType() != Node::Example) { - skipAhead = skipAtoms(atom, Atom::BriefRight); - break; - } + if (relative->isQmlBasicType() || (relative->isDocNode() && !relative->isExample())) { + skipAhead = skipAtoms(atom, Atom::BriefRight); + break; } out() << "<p>"; @@ -374,7 +375,7 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark } break; case Atom::BriefRight: - if (relative->type() != Node::Document) + if (!relative->isDocNode()) out() << "</p>\n"; break; case Atom::C: @@ -485,9 +486,9 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark break; case Atom::AnnotatedList: { - DocNode* dn = qdb_->getGroup(atom->string()); - if (dn) - generateAnnotatedList(relative, marker, dn->members()); + GroupNode* gn = qdb_->getGroup(atom->string()); + if (gn) + generateList(gn, marker, atom->string()); } break; case Atom::GeneratedList: @@ -495,19 +496,22 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark generateAnnotatedList(relative, marker, qdb_->getCppClasses()); } else if (atom->string() == "classes") { - generateCompactList(Generic, relative, qdb_->getCppClasses(), true, QStringLiteral("Q")); + generateCompactList(Generic, relative, qdb_->getCppClasses(), true, QStringLiteral("")); + } + else if (atom->string().contains("classes ")) { + QString rootName = atom->string().mid(atom->string().indexOf("classes") + 7).trimmed(); + generateCompactList(Generic, relative, qdb_->getCppClasses(), true, rootName); } else if (atom->string() == "qmltypes") { generateCompactList(Generic, relative, qdb_->getQmlTypes(), true, QStringLiteral("")); } else if (atom->string().contains("classesbymodule")) { - QString arg = atom->string().trimmed(); QString moduleName = atom->string().mid(atom->string().indexOf("classesbymodule") + 15).trimmed(); QDocDatabase* qdb = QDocDatabase::qdocDB(); - DocNode* dn = qdb->findModule(moduleName); - if (dn) { + ModuleNode* mn = qdb->findModule(moduleName); + if (mn) { NodeMap m; - dn->getMemberClasses(m); + mn->getMemberClasses(m); if (!m.isEmpty()) { generateAnnotatedList(relative, marker, m); } @@ -550,16 +554,25 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark generateCompactList(Generic, relative, qdb_->getServiceClasses(), false, QStringLiteral("Q")); } else if (atom->string() == "overviews") { - generateOverviewList(relative); + generateList(relative, marker, "overviews"); + } + else if (atom->string() == "cpp-modules") { + generateList(relative, marker, "cpp-modules"); + } + else if (atom->string() == "qml-modules") { + generateList(relative, marker, "qml-modules"); } else if (atom->string() == "namespaces") { generateAnnotatedList(relative, marker, qdb_->getNamespaces()); } else if (atom->string() == "related") { - const DocNode *dn = static_cast<const DocNode *>(relative); - if (dn) - generateAnnotatedList(dn, marker, dn->members()); + generateList(relative, marker, "related"); } +#if 0 + /* + This is not used in Qt5, as of 10/02/2014 + Remove permanently if it is not missed. + */ else if (atom->string() == "relatedinline") { const DocNode *dn = static_cast<const DocNode *>(relative); if (dn && !dn->members().isEmpty()) { @@ -573,6 +586,7 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark generateBody(node, marker); } } +#endif break; case Atom::SinceList: { @@ -591,10 +605,8 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark while (n != nsmap.constEnd()) { const Node* node = n.value(); switch (node->type()) { - case Node::Document: - if (node->subType() == Node::QmlClass) { - sections[QmlClass].appendMember((Node*)node); - } + case Node::QmlType: + sections[QmlClass].appendMember((Node*)node); break; case Node::Namespace: sections[Namespace].appendMember((Node*)node); @@ -750,8 +762,7 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark out() << " alt=\"\""; out() << " />"; helpProjectWriter->addExtraFile(fileName); - if ((relative->type() == Node::Document) && - (relative->subType() == Node::Example)) { + if (relative->isExample()) { const ExampleNode* cen = static_cast<const ExampleNode*>(relative); if (cen->imageFileName().isEmpty()) { ExampleNode* en = const_cast<ExampleNode*>(cen); @@ -794,17 +805,26 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark break; case Atom::Link: { + inObsoleteLink = false; const Node *node = 0; - QString myLink = getLink(atom, relative, &node); - if (myLink.isEmpty()) { - myLink = getCollisionLink(atom); - if (myLink.isEmpty() && !noLinkErrors()) { - relative->doc().location().warning(tr("Can't link to '%1'").arg(atom->string())); + QString link = getLink(atom, relative, &node); + if (link.isEmpty() && !noLinkErrors()) { + relative->doc().location().warning(tr("Can't link to '%1'").arg(atom->string())); + } + else { + node = 0; + if (node && node->status() == Node::Obsolete) { + if ((relative->parent() != node) && !relative->isObsolete()) { + inObsoleteLink = true; + if (obsoleteLinks) { + relative->doc().location().warning(tr("Link to obsolete item '%1' in %2") + .arg(atom->string()) + .arg(relative->plainFullName())); + } + } } - else - node = 0; } - beginLink(myLink, node, relative); + beginLink(link, node, relative); skipAhead = 1; } break; @@ -1117,7 +1137,7 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark } /*! - Generate a reference page for a C++ class. + Generate a reference page for a C++ class or a C++ namespace. */ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker) { @@ -1304,6 +1324,97 @@ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker) } /*! + Generate the HTML page for a QML type. \qcn is the QML type. + \marker is the code markeup object. + */ +void HtmlGenerator::generateQmlTypePage(QmlClassNode* qcn, CodeMarker* marker) +{ + SubTitleSize subTitleSize = LargeSubTitle; + QList<Section>::const_iterator s; + QString fullTitle = qcn->fullTitle(); + QString htmlTitle = fullTitle; + + generateHeader(htmlTitle, qcn, marker); + QList<Section> sections = marker->qmlSections(qcn, CodeMarker::Summary); + generateTableOfContents(qcn, marker, §ions); + marker = CodeMarker::markerForLanguage(QLatin1String("QML")); + generateTitle(fullTitle, Text() << qcn->subTitle(), subTitleSize, qcn, marker); + generateBrief(qcn, marker); + generateQmlRequisites(qcn, marker); + + QString allQmlMembersLink = generateAllQmlMembersFile(qcn, marker); + if (!allQmlMembersLink.isEmpty()) { + out() << "<ul>\n"; + out() << "<li><a href=\"" << allQmlMembersLink << "\">" + << "List of all members, including inherited members</a></li>\n"; + out() << "</ul>\n"; + } + + s = sections.constBegin(); + while (s != sections.constEnd()) { + out() << "<a name=\"" << registerRef((*s).name.toLower()) + << "\"></a>" << divNavTop << '\n'; + out() << "<h2>" << protectEnc((*s).name) << "</h2>\n"; + generateQmlSummary(*s, qcn, marker); + ++s; + } + + generateExtractionMark(qcn, DetailedDescriptionMark); + out() << "<a name=\"" << registerRef("details") << "\"></a>" << divNavTop << '\n'; + out() << "<h2>" << "Detailed Description" << "</h2>\n"; + generateBody(qcn, marker); + ClassNode* cn = qcn->classNode(); + if (cn) + generateQmlText(cn->doc().body(), cn, marker, qcn->name()); + generateAlsoList(qcn, marker); + generateExtractionMark(qcn, EndMark); + //out() << "<hr />\n"; + + sections = marker->qmlSections(qcn,CodeMarker::Detailed); + s = sections.constBegin(); + while (s != sections.constEnd()) { + out() << "<h2>" << protectEnc((*s).name) << "</h2>\n"; + NodeList::ConstIterator m = (*s).members.constBegin(); + while (m != (*s).members.constEnd()) { + generateDetailedQmlMember(*m, qcn, marker); + out() << "<br/>\n"; + ++m; + } + ++s; + } + generateFooter(qcn); +} + +/*! + Generate the HTML page for the QML basic type represented + by the QML basic type node \a qbtn. + */ +void HtmlGenerator::generateQmlBasicTypePage(QmlBasicTypeNode* qbtn, CodeMarker* marker) +{ + SubTitleSize subTitleSize = LargeSubTitle; + QList<Section>::const_iterator s; + QString htmlTitle = qbtn->fullTitle(); + QString fullTitle = "QML Basic Type: " + htmlTitle; + + marker = CodeMarker::markerForLanguage(QLatin1String("QML")); + + generateHeader(htmlTitle, qbtn, marker); + generateTitle(fullTitle, + Text() << qbtn->subTitle(), + subTitleSize, + qbtn, + marker); + generateExtractionMark(qbtn, DetailedDescriptionMark); + out() << "<div class=\"descr\"> <a name=\"" << registerRef("details") << "\"></a>\n"; // QTBUG-9504 + + generateBody(qbtn, marker); + out() << "</div>\n"; // QTBUG-9504 + generateAlsoList(qbtn, marker); + generateExtractionMark(qbtn, EndMark); + generateFooter(qbtn); +} + +/*! We delayed generation of the disambiguation pages until now, after all the other pages have been generated. We do this because we might encounter a link command that tries to link to a target on a QML @@ -1341,7 +1452,6 @@ void HtmlGenerator::generateCollisionPages() if (collisions.size() <= 1) continue; - ncn->clearCurrentChild(); beginSubPage(ncn, Generator::fileName(ncn)); QString fullTitle = ncn->fullTitle(); CodeMarker* marker = CodeMarker::markerForFileName(ncn->location().filePath()); @@ -1373,7 +1483,7 @@ void HtmlGenerator::generateCollisionPages() int count = 0; for (int i=0; i<collisions.size(); ++i) { InnerNode* n = static_cast<InnerNode*>(collisions.at(i)); - if (n->findChildNodeByName(t.key())) { + if (n->findChildNode(t.key())) { ++count; if (count > 1) { targets.append(t.key()); @@ -1392,7 +1502,7 @@ void HtmlGenerator::generateCollisionPages() out() << "<ul>\n"; for (int i=0; i<collisions.size(); ++i) { InnerNode* n = static_cast<InnerNode*>(collisions.at(i)); - Node* p = n->findChildNodeByName(*t); + Node* p = n->findChildNode(*t); if (p) { QString link = linkForNode(p,0); QString label; @@ -1437,31 +1547,14 @@ void HtmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker) QList<Section>::const_iterator s; QString fullTitle = dn->fullTitle(); - if (dn->subType() == Node::QmlBasicType) { - fullTitle = "QML Basic Type: " + fullTitle; - - // Replace the marker with a QML code marker. - marker = CodeMarker::markerForLanguage(QLatin1String("QML")); - } - else if (dn->subType() == Node::QmlClass) { - fullTitle = fullTitle + " QML Type"; - } - generateHeader(fullTitle, dn, marker); /* Generate the TOC for the new doc format. Don't generate a TOC for the home page. */ - QmlClassNode* qml_cn = 0; - if (dn->subType() == Node::QmlClass) { - qml_cn = static_cast<QmlClassNode*>(dn); - sections = marker->qmlSections(qml_cn,CodeMarker::Summary); - generateTableOfContents(dn,marker,§ions); - - // Replace the marker with a QML code marker. - marker = CodeMarker::markerForLanguage(QLatin1String("QML")); - } - else if (dn->subType() != Node::Collision && dn->name() != QString("index.html") && dn->name() != QString("qtexamplesandtutorials.html")) + if ((dn->subType() != Node::Collision) && + (dn->name() != QString("index.html")) && + (dn->name() != QString("qtexamplesandtutorials.html"))) generateTableOfContents(dn,marker,0); generateTitle(fullTitle, @@ -1470,29 +1563,7 @@ void HtmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker) dn, marker); - if (dn->subType() == Node::Module) { - // Generate brief text and status for modules. - generateBrief(dn, marker); - generateStatus(dn, marker); - generateSince(dn, marker); - - NodeMap nm; - dn->getMemberNamespaces(nm); - if (!nm.isEmpty()) { - out() << "<a name=\"" << registerRef("namespaces") << "\"></a>" << divNavTop << '\n'; - out() << "<h2>Namespaces</h2>\n"; - generateAnnotatedList(dn, marker, nm); - } - nm.clear(); - dn->getMemberClasses(nm); - if (!nm.isEmpty()) { - out() << "<a name=\"" << registerRef("classes") << "\"></a>" << divNavTop << '\n'; - out() << "<h2>Classes</h2>\n"; - generateAnnotatedList(dn, marker, nm); - } - nm.clear(); - } - else if (dn->subType() == Node::HeaderFile) { + if (dn->subType() == Node::HeaderFile) { // Generate brief text and status for modules. generateBrief(dn, marker); generateStatus(dn, marker); @@ -1522,88 +1593,110 @@ void HtmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker) out() << "</ul>\n"; } - else if (dn->subType() == Node::QmlClass) { - const_cast<DocNode*>(dn)->setCurrentChild(); - ClassNode* cn = qml_cn->classNode(); - generateBrief(qml_cn, marker); - generateQmlRequisites(qml_cn, marker); - QString allQmlMembersLink = generateAllQmlMembersFile(qml_cn, marker); - if (!allQmlMembersLink.isEmpty()) { - out() << "<ul>\n"; - out() << "<li><a href=\"" << allQmlMembersLink << "\">" - << "List of all members, including inherited members</a></li>\n"; - out() << "</ul>\n"; - } + sections = marker->sections(dn, CodeMarker::Summary, CodeMarker::Okay); + s = sections.constBegin(); + while (s != sections.constEnd()) { + out() << "<a name=\"" << registerRef((*s).name) << "\"></a>" << divNavTop << '\n'; + out() << "<h2>" << protectEnc((*s).name) << "</h2>\n"; + generateSectionList(*s, dn, marker, CodeMarker::Summary); + ++s; + } - s = sections.constBegin(); - while (s != sections.constEnd()) { - out() << "<a name=\"" << registerRef((*s).name.toLower()) - << "\"></a>" << divNavTop << '\n'; - out() << "<h2>" << protectEnc((*s).name) << "</h2>\n"; - generateQmlSummary(*s,dn,marker); - ++s; - } + generateExtractionMark(dn, DetailedDescriptionMark); + out() << "<div class=\"descr\"> <a name=\"" << registerRef("details") << "\"></a>\n"; // QTBUG-9504 - generateExtractionMark(dn, DetailedDescriptionMark); - out() << "<a name=\"" << registerRef("details") << "\"></a>" << divNavTop << '\n'; - out() << "<h2>" << "Detailed Description" << "</h2>\n"; - generateBody(dn, marker); - if (cn) - generateQmlText(cn->doc().body(), cn, marker, dn->name()); - generateAlsoList(dn, marker); - generateExtractionMark(dn, EndMark); + generateBody(dn, marker); + out() << "</div>\n"; // QTBUG-9504 + generateAlsoList(dn, marker); + generateExtractionMark(dn, EndMark); + + sections = marker->sections(dn, CodeMarker::Detailed, CodeMarker::Okay); + s = sections.constBegin(); + while (s != sections.constEnd()) { //out() << "<hr />\n"; + out() << "<h2>" << protectEnc((*s).name) << "</h2>\n"; - sections = marker->qmlSections(qml_cn,CodeMarker::Detailed); - s = sections.constBegin(); - while (s != sections.constEnd()) { - out() << "<h2>" << protectEnc((*s).name) << "</h2>\n"; - NodeList::ConstIterator m = (*s).members.constBegin(); - while (m != (*s).members.constEnd()) { - generateDetailedQmlMember(*m, dn, marker); - out() << "<br/>\n"; - ++m; - } - ++s; + NodeList::ConstIterator m = (*s).members.constBegin(); + while (m != (*s).members.constEnd()) { + generateDetailedMember(*m, dn, marker); + ++m; } - generateFooter(dn); - const_cast<DocNode*>(dn)->clearCurrentChild(); - return; + ++s; } + generateFooter(dn); +} - sections = marker->sections(dn, CodeMarker::Summary, CodeMarker::Okay); +/*! + Generate the HTML page for a group, module, or QML module. + */ +void HtmlGenerator::generateCollectionNode(CollectionNode* cn, CodeMarker* marker) +{ + SubTitleSize subTitleSize = LargeSubTitle; + QList<Section> sections; + QList<Section>::const_iterator s; + QString fullTitle = cn->fullTitle(); + QString htmlTitle = fullTitle; + + generateHeader(htmlTitle, cn, marker); + generateTableOfContents(cn,marker,0); + generateTitle(fullTitle, Text() << cn->subTitle(), subTitleSize, cn, marker); + + if (cn->isModule()) { + // Generate brief text and status for modules. + generateBrief(cn, marker); + generateStatus(cn, marker); + generateSince(cn, marker); + + NodeMap nm; + cn->getMemberNamespaces(nm); + if (!nm.isEmpty()) { + out() << "<a name=\"" << registerRef("namespaces") << "\"></a>" << divNavTop << '\n'; + out() << "<h2>Namespaces</h2>\n"; + generateAnnotatedList(cn, marker, nm); + } + nm.clear(); + cn->getMemberClasses(nm); + if (!nm.isEmpty()) { + out() << "<a name=\"" << registerRef("classes") << "\"></a>" << divNavTop << '\n'; + out() << "<h2>Classes</h2>\n"; + generateAnnotatedList(cn, marker, nm); + } + nm.clear(); + } + + sections = marker->sections(cn, CodeMarker::Summary, CodeMarker::Okay); s = sections.constBegin(); while (s != sections.constEnd()) { out() << "<a name=\"" << registerRef((*s).name) << "\"></a>" << divNavTop << '\n'; out() << "<h2>" << protectEnc((*s).name) << "</h2>\n"; - generateSectionList(*s, dn, marker, CodeMarker::Summary); + generateSectionList(*s, cn, marker, CodeMarker::Summary); ++s; } - Text brief = dn->doc().briefText(); - if (dn->subType() == Node::Module && !brief.isEmpty()) { - generateExtractionMark(dn, DetailedDescriptionMark); + Text brief = cn->doc().briefText(); + if (cn->isModule() && !brief.isEmpty()) { + generateExtractionMark(cn, DetailedDescriptionMark); out() << "<a name=\"" << registerRef("details") << "\"></a>" << divNavTop << '\n'; out() << "<div class=\"descr\">\n"; // QTBUG-9504 out() << "<h2>" << "Detailed Description" << "</h2>\n"; } else { - generateExtractionMark(dn, DetailedDescriptionMark); + generateExtractionMark(cn, DetailedDescriptionMark); out() << "<div class=\"descr\"> <a name=\"" << registerRef("details") << "\"></a>\n"; // QTBUG-9504 } - generateBody(dn, marker); + generateBody(cn, marker); out() << "</div>\n"; // QTBUG-9504 - generateAlsoList(dn, marker); - generateExtractionMark(dn, EndMark); + generateAlsoList(cn, marker); + generateExtractionMark(cn, EndMark); - if ((dn->subType() == Node::Group)) - generateAnnotatedList(dn, marker, dn->members()); - else if (dn->subType() == Node::QmlModule) - generateAnnotatedList(dn, marker, dn->members()); + if (cn->isGroup()) + generateAnnotatedList(cn, marker, cn->members()); + else if (cn->isQmlModule()) + generateAnnotatedList(cn, marker, cn->members()); - sections = marker->sections(dn, CodeMarker::Detailed, CodeMarker::Okay); + sections = marker->sections(cn, CodeMarker::Detailed, CodeMarker::Okay); s = sections.constBegin(); while (s != sections.constEnd()) { //out() << "<hr />\n"; @@ -1611,12 +1704,12 @@ void HtmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker) NodeList::ConstIterator m = (*s).members.constBegin(); while (m != (*s).members.constEnd()) { - generateDetailedMember(*m, dn, marker); + generateDetailedMember(*m, cn, marker); ++m; } ++s; } - generateFooter(dn); + generateFooter(cn); } /*! @@ -1650,7 +1743,7 @@ void HtmlGenerator::generateNavigationBar(const QString &title, << Atom(Atom::AutoLink, landingpage) << Atom(Atom::ListItemRight); - if (node->type() == Node::Class) { + if (node->isClass()) { const ClassNode *cn = static_cast<const ClassNode *>(node); QString name = node->moduleName(); @@ -1667,18 +1760,27 @@ void HtmlGenerator::generateNavigationBar(const QString &title, << Atom(Atom::String, cn->name()) << Atom(Atom::ListItemRight); } - else if (node->type() == Node::Document) { + else if (node->isQmlType()) { + if (!qmltypespage.isEmpty()) + navigationbar << Atom(Atom::ListItemLeft) + << Atom(Atom::Link, qmltypespage) + << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) + << Atom(Atom::String, QLatin1String("QML Types")) + << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) + << Atom(Atom::ListItemRight); + } + else if (node->isQmlBasicType()) { + if (!qmltypespage.isEmpty()) + navigationbar << Atom(Atom::ListItemLeft) + << Atom(Atom::Link, qmltypespage) + << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) + << Atom(Atom::String, QLatin1String("QML Types")) + << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) + << Atom(Atom::ListItemRight); + } + else if (node->isDocNode()) { const DocNode *dn = static_cast<const DocNode *>(node); - if (node->subType() == Node::QmlClass || node->subType() == Node::QmlBasicType) { - if (!qmltypespage.isEmpty()) - navigationbar << Atom(Atom::ListItemLeft) - << Atom(Atom::Link, qmltypespage) - << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) - << Atom(Atom::String, QLatin1String("QML Types")) - << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) - << Atom(Atom::ListItemRight); - } - else if (dn && dn->isExampleFile()) { + if (dn && dn->isExampleFile()) { navigationbar << Atom(Atom::ListItemLeft) << Atom(Atom::Link, dn->parent()->name()) << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) @@ -1892,7 +1994,7 @@ void HtmlGenerator::generateRequisites(InnerNode *inner, CodeMarker *marker) if (inner->type() == Node::Class || inner->type() == Node::Namespace) { //add the QT variable to the map if (!inner->moduleName().isEmpty()) { - DocNode * moduleNode = qdb_->findModule(inner->moduleName()); + ModuleNode* moduleNode = qdb_->findModule(inner->moduleName()); if (moduleNode && !moduleNode->qtVariable().isEmpty()) { text.clear(); text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_TELETYPE) @@ -1923,18 +2025,20 @@ void HtmlGenerator::generateRequisites(InnerNode *inner, CodeMarker *marker) r = classe->baseClasses().constBegin(); index = 0; while (r != classe->baseClasses().constEnd()) { - text << Atom(Atom::LinkNode, CodeMarker::stringForNode((*r).node)) - << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) - << Atom(Atom::String, (*r).dataTypeWithTemplateArgs) - << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); - - if ((*r).access == Node::Protected) { - text << " (protected)"; - } - else if ((*r).access == Node::Private) { - text << " (private)"; + if ((*r).node_) { + text << Atom(Atom::LinkNode, CodeMarker::stringForNode((*r).node_)) + << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) + << Atom(Atom::String, (*r).signature_) + << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); + + if ((*r).access_ == Node::Protected) { + text << " (protected)"; + } + else if ((*r).access_ == Node::Private) { + text << " (private)"; + } + text << separator(index++, classe->baseClasses().count()); } - text << separator(index++, classe->baseClasses().count()); ++r; } text << Atom::ParaRight; @@ -2002,9 +2106,9 @@ void HtmlGenerator::generateQmlRequisites(QmlClassNode *qcn, CodeMarker *marker) //add the module name and version to the map QString qmlModuleVersion; - DocNode* dn = qdb_->findQmlModule(qcn->qmlModuleName()); - if (dn) - qmlModuleVersion = dn->qmlModuleVersion(); + QmlModuleNode* qmn = qdb_->findQmlModule(qcn->qmlModuleName()); + if (qmn) + qmlModuleVersion = qmn->qmlModuleVersion(); else qmlModuleVersion = qcn->qmlModuleVersion(); text.clear(); @@ -2044,7 +2148,7 @@ void HtmlGenerator::generateQmlRequisites(QmlClassNode *qcn, CodeMarker *marker) } //add the inherits to the map - const QmlClassNode* base = qcn->qmlBaseNode(); + QmlClassNode* base = qcn->qmlBaseNode(); while (base && base->isInternal()) { base = base->qmlBaseNode(); } @@ -2136,7 +2240,7 @@ void HtmlGenerator::generateTableOfContents(const Node *node, QList<Atom*> toc; if (node->doc().hasTableOfContents()) toc = node->doc().tableOfContents(); - if (toc.isEmpty() && !sections && (node->subType() != Node::Module)) + if (toc.isEmpty() && !sections && !node->isModule()) return; QStringList sectionNumber; @@ -2151,7 +2255,7 @@ void HtmlGenerator::generateTableOfContents(const Node *node, sectionNumber.append("1"); out() << "<ul>\n"; - if (node->subType() == Node::Module) { + if (node->isModule()) { if (node->hasNamespaces()) { out() << "<li class=\"level" << sectionNumber.size() @@ -2178,9 +2282,7 @@ void HtmlGenerator::generateTableOfContents(const Node *node, } } } - else if (sections && ((node->type() == Node::Class) || - (node->type() == Node::Namespace) || - (node->subType() == Node::QmlClass))) { + else if (sections && (node->isClass() || node->isNamespace() || node->isQmlType())) { QList<Section>::ConstIterator s = sections->constBegin(); while (s != sections->constEnd()) { if (!s->members.isEmpty() || !s->reimpMembers.isEmpty()) { @@ -2278,8 +2380,7 @@ QString HtmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, the members of QML class \a qml_cn, including the inherited members. The \a marker is used for formatting stuff. */ -QString HtmlGenerator::generateAllQmlMembersFile(const QmlClassNode* qml_cn, - CodeMarker* marker) +QString HtmlGenerator::generateAllQmlMembersFile(QmlClassNode* qml_cn, CodeMarker* marker) { QList<Section> sections; QList<Section>::ConstIterator s; @@ -2448,8 +2549,8 @@ void HtmlGenerator::generateClassHierarchy(const Node *relative, NodeMap& classM NodeMap newTop; foreach (const RelatedClass &d, child->derivedClasses()) { - if (d.access != Node::Private && !d.node->doc().isEmpty()) - newTop.insert(d.node->name(), d.node); + if (d.node_ && !d.isPrivate() && !d.node_->isInternal() && d.node_->hasDoc()) + newTop.insert(d.node_->name(), d.node_); } if (!newTop.isEmpty()) { stack.push(newTop); @@ -2469,33 +2570,29 @@ void HtmlGenerator::generateAnnotatedList(const Node* relative, { if (nodeMap.isEmpty()) return; - NodeList nl; - NodeMap::const_iterator i = nodeMap.begin(); - while (i != nodeMap.end()) { - nl.append(i.value()); - ++i; - } - generateAnnotatedList(relative, marker, nl); + generateAnnotatedList(relative, marker, nodeMap.values()); } +/*! + */ void HtmlGenerator::generateAnnotatedList(const Node *relative, CodeMarker *marker, - const NodeList& nodes) + const NodeList& unsortedNodes) { + NodeMap nm; bool allInternal = true; - foreach (const Node* node, nodes) { - if (!node->isInternal() && node->status() != Node::Obsolete) { + foreach (Node* node, unsortedNodes) { + if (!node->isInternal() && !node->isObsolete()) { allInternal = false; + nm.insert(node->fullName(relative), node); } } if (allInternal) return; out() << "<table class=\"annotated\">\n"; int row = 0; + NodeList nodes = nm.values(); foreach (const Node* node, nodes) { - if (node->isInternal() || node->status() == Node::Obsolete) - continue; - if (++row % 2 == 1) out() << "<tr class=\"odd topAlign\">"; else @@ -2504,7 +2601,7 @@ void HtmlGenerator::generateAnnotatedList(const Node *relative, generateFullName(node, relative); out() << "</p></td>"; - if (!(node->type() == Node::Document)) { + if (!node->isDocNode()) { Text brief = node->doc().trimmedBriefText(node->name()); if (!brief.isEmpty()) { out() << "<td class=\"tblDescr\"><p>"; @@ -2680,7 +2777,7 @@ void HtmlGenerator::generateCompactList(ListType listType, } QStringList pieces; - if (it.value()->subType() == Node::QmlClass) + if (it.value()->isQmlType()) pieces << it.value()->name(); else pieces = it.value()->fullName(relative).split("::"); @@ -2786,117 +2883,105 @@ void HtmlGenerator::generateQmlItem(const Node *node, marked.remove("<@type>"); marked.remove("</@type>"); } - out() << highlightedCode(marked, relative, false, node); + out() << highlightedCode(marked, relative, false); } -void HtmlGenerator::generateOverviewList(const Node *relative) +void HtmlGenerator::generateList(const Node* relative, CodeMarker* marker, const QString& selector) { - QMap<const DocNode *, QMap<QString, DocNode *> > docNodeMap; - QMap<QString, const DocNode *> groupTitlesMap; - QMap<QString, DocNode *> uncategorizedNodeMap; + NodeList nl; + CollectionList cl; QRegExp singleDigit("\\b([0-9])\\b"); - const NodeList children = qdb_->treeRoot()->childNodes(); - foreach (Node *child, children) { - if (child->type() == Node::Document && child != relative) { - DocNode *docNode = static_cast<DocNode *>(child); - - // Check whether the page is part of a group or is the group - // definition page. - QString group; - bool isGroupPage = false; - if (docNode->doc().metaCommandsUsed().contains("group")) { - group = docNode->doc().metaCommandArgs("group")[0].first; - isGroupPage = true; - } - - // there are too many examples; they would clutter the list - if (docNode->subType() == Node::Example) - continue; - - // not interested either in individual (Qt Designer etc.) manual chapters - if (docNode->links().contains(Node::ContentsLink)) - continue; - - // Discard external nodes. - if (docNode->subType() == Node::ExternalPage) - continue; - - QString sortKey = docNode->fullTitle().toLower(); - if (sortKey.startsWith("the ")) - sortKey.remove(0, 4); - sortKey.replace(singleDigit, "0\\1"); - - if (!group.isEmpty()) { - if (isGroupPage) { - // If we encounter a group definition page, we add all - // the pages in that group to the list for that group. - foreach (Node *member, docNode->members()) { - if (member->isInternal() || member->type() != Node::Document) - continue; - DocNode *page = static_cast<DocNode *>(member); - if (page) { - QString sortKey = page->fullTitle().toLower(); - if (sortKey.startsWith("the ")) - sortKey.remove(0, 4); - sortKey.replace(singleDigit, "0\\1"); - docNodeMap[const_cast<const DocNode *>(docNode)].insert(sortKey, page); - groupTitlesMap[docNode->fullTitle()] = const_cast<const DocNode *>(docNode); - } - } - } - else if (!isGroupPage) { - // If we encounter a page that belongs to a group then - // we add that page to the list for that group. - const DocNode* gn = qdb_->getGroup(group); - if (gn && !docNode->isInternal()) - docNodeMap[gn].insert(sortKey, docNode); - } - } + if (selector == "overviews") { + CNMap groups; + qdb_->mergeCollections(Node::Group, groups, relative); + cl = groups.values(); + foreach (CollectionNode* cn, cl) + nl.append(cn); + generateAnnotatedList(relative, marker, nl); + } + else if (selector == "cpp-modules") { + CNMap modules; + qdb_->mergeCollections(Node::Module, modules, relative); + cl = modules.values(); + foreach (CollectionNode* cn, cl) + nl.append(cn); + generateAnnotatedList(relative, marker, nl); + } + else if (selector == "qml-modules") { + CNMap qmlModules; + qdb_->mergeCollections(Node::QmlModule, qmlModules, relative); + cl = qmlModules.values(); + foreach (CollectionNode* cn, cl) + nl.append(cn); + generateAnnotatedList(relative, marker, nl); + } + else { + /* + \generatelist {selector} is only allowed in a + comment where the topic is \group, \module, or + \qmlmodule. + */ + if (!relative || !relative->isCollectionNode()) { + relative->doc().location().warning(tr("\\generatelist {%1} is only allowed in \\group, \\module, and \\qmlmodule comments.").arg(selector)); + return; + } + if (selector == "related") { + Node* n = const_cast<Node*>(relative); + CollectionNode* cn = static_cast<CollectionNode*>(n); + qdb_->mergeCollections(cn); + generateAnnotatedList(cn, marker, cn->members()); + } + else { + Node* n = const_cast<Node*>(relative); + CollectionNode* cn = static_cast<CollectionNode*>(n); + qdb_->mergeCollections(cn); + generateAnnotatedList(cn, marker, cn->members()); } } - // We now list all the pages found that belong to groups. - // If only certain pages were found for a group, but the definition page - // for that group wasn't listed, the list of pages will be intentionally - // incomplete. However, if the group definition page was listed, all the - // pages in that group are listed for completeness. - - if (!docNodeMap.isEmpty()) { - foreach (const QString &groupTitle, groupTitlesMap.keys()) { - const DocNode *groupNode = groupTitlesMap[groupTitle]; +#if 0 + QStringList keys = groups.uniqueKeys(); + foreach (QString key, keys) { + GroupNode* gn = static_cast<GroupNode*>(groups.value(key)); + if (gn) { out() << QString("<h3><a href=\"%1\">%2</a></h3>\n").arg( - linkForNode(groupNode, relative)).arg( - protectEnc(groupNode->fullTitle())); - - if (docNodeMap[groupNode].count() == 0) + linkForNode(gn, relative)).arg( + protectEnc(gn->fullTitle())); +#if 0 + if (gn->members().isEmpty()) continue; - out() << "<ul>\n"; + NodeMap nm; + foreach (Node* member, gn->members()) { + if (member->isInternal() || member->isExample() || member->isExternalPage() || + member->isObsolete()) + continue; + // not interested either in individual (Qt Designer etc.) manual chapters + if (member->links().contains(Node::ContentsLink)) + continue; + QString sortKey = member->fullTitle().toLower(); + if (sortKey.startsWith("the ")) + sortKey.remove(0, 4); + sortKey.replace(singleDigit, "0\\1"); + nm.insert(sortKey, member); + } - foreach (const DocNode *docNode, docNodeMap[groupNode]) { - QString title = docNode->fullTitle(); + out() << "<ul>\n"; + QStringList titles = nm.keys(); + foreach (QString t, titles) { + Node* member = nm.value(t); + QString title = member->fullTitle(); if (title.startsWith("The ")) title.remove(0, 4); - out() << "<li><a href=\"" << linkForNode(docNode, relative) << "\">" + out() << "<li><a href=\"" << linkForNode(member, relative) << "\">" << protectEnc(title) << "</a></li>\n"; } out() << "</ul>\n"; +#endif } } - - if (!uncategorizedNodeMap.isEmpty()) { - out() << QString("<h3>Miscellaneous</h3>\n"); - out() << "<ul>\n"; - foreach (const DocNode *docNode, uncategorizedNodeMap) { - QString title = docNode->fullTitle(); - if (title.startsWith("The ")) - title.remove(0, 4); - out() << "<li><a href=\"" << linkForNode(docNode, relative) << "\">" - << protectEnc(title) << "</a></li>\n"; - } - out() << "</ul>\n"; - } +#endif } void HtmlGenerator::generateSection(const NodeList& nl, @@ -3099,8 +3184,7 @@ void HtmlGenerator::generateSynopsis(const Node *node, QString HtmlGenerator::highlightedCode(const QString& markedCode, const Node* relative, - bool alignNames, - const Node* self) + bool alignNames) { QString src = markedCode; QString html; @@ -3148,8 +3232,7 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode, if (src.at(i) == charLangle && src.at(i + 1) == charAt) { i += 2; if (parseArg(src, funcTag, &i, srcSize, &arg, &par1)) { - - const Node* n = qdb_->resolveTarget(par1.toString(), relative); + const Node* n = qdb_->resolveFunctionTarget(par1.toString(), relative); QString link = linkForNode(n, relative); addLink(link, arg, &html); par1 = QStringRef(); @@ -3164,7 +3247,7 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode, } } - // replace all "(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)(</@\\2>)" tags + // replace all "(<@(type|headerfile)(?: +[^>]*)?>)(.*)(</@\\2>)" tags src = html; html = QString(); @@ -3174,10 +3257,10 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode, bool handled = false; if (parseArg(src, typeTag, &i, srcSize, &arg, &par1)) { par1 = QStringRef(); - const Node* n = qdb_->resolveTarget(arg.toString(), relative, self); + const Node* n = qdb_->resolveType(arg.toString(), relative); html += QLatin1String("<span class=\"type\">"); - if (n && n->subType() == Node::QmlBasicType) { - if (relative && relative->subType() == Node::QmlClass) + if (n && n->isQmlBasicType()) { + if (relative && relative->isQmlType()) addLink(linkForNode(n,relative), arg, &html); else html += arg.toString(); @@ -3189,17 +3272,18 @@ QString HtmlGenerator::highlightedCode(const QString& markedCode, } else if (parseArg(src, headerTag, &i, srcSize, &arg, &par1)) { par1 = QStringRef(); - const Node* n = qdb_->resolveTarget(arg.toString(), relative); - addLink(linkForNode(n,relative), arg, &html); - handled = true; - } - else if (parseArg(src, funcTag, &i, srcSize, &arg, &par1)) { - par1 = QStringRef(); - const Node* n = qdb_->resolveTarget(arg.toString(), relative); - addLink(linkForNode(n,relative), arg, &html); + if (arg.at(0) == QChar('&')) + html += arg.toString(); + else { + // zzz resolveClassTarget() + const Node* n = qdb_->resolveTarget(arg.toString(), relative); + if (n) + addLink(linkForNode(n,relative), arg, &html); + else + html += arg.toString(); + } handled = true; } - if (!handled) { html += charLangle; html += charAt; @@ -3537,7 +3621,7 @@ QString HtmlGenerator::linkForNode(const Node *node, const Node *relative) QString fn = fileName(node); if (node && relative && node->parent() != relative) { - if (node->parent()->subType() == Node::QmlClass && relative->subType() == Node::QmlClass) { + if (node->parent()->isQmlType() && relative->isQmlType()) { if (node->parent()->isAbstract()) { /* This is a bit of a hack. What we discover with @@ -3680,6 +3764,7 @@ int HtmlGenerator::hOffset(const Node *node) case Node::Namespace: case Node::Class: return 2; + case Node::QmlType: case Node::Document: return 1; case Node::Enum: @@ -3715,128 +3800,134 @@ const QPair<QString,QString> HtmlGenerator::anchorForNode(const Node *node) return anchorPair; } +/*! + This function is called for links, i.e. for words that + are marked with the qdoc link command. For autolinks + that are not marked with the qdoc link command, qdoc + calls getAutoLink(). + + Return the link represented by the \a atom, and set \a node + to point to the target node for that link. \a relative points + to the node holding the qdoc comment where the link command + was found. + */ QString HtmlGenerator::getLink(const Atom *atom, const Node *relative, const Node** node) { - QString link; - *node = 0; - inObsoleteLink = false; + if (atom->string().contains(QLatin1Char(':')) && (atom->string().startsWith("file:") || + atom->string().startsWith("http:") || + atom->string().startsWith("https:") || + atom->string().startsWith("ftp:") || + atom->string().startsWith("mailto:"))) { + return atom->string(); // It's some kind of protocol. + } - if (atom->string().contains(QLatin1Char(':')) && - (atom->string().startsWith("file:") - || atom->string().startsWith("http:") - || atom->string().startsWith("https:") - || atom->string().startsWith("ftp:") - || atom->string().startsWith("mailto:"))) { + QString ref; + QString link; + QString first; + QStringList path; - link = atom->string(); + *node = 0; + if (atom->string().contains('#')) { + path = atom->string().split('#'); + first = path.first().trimmed(); + path.removeFirst(); } - else { - QStringList path; - if (atom->string().contains('#')) { - path = atom->string().split('#'); - } - else { - path.append(atom->string()); - } + else + first = atom->string(); - QString ref; - QString first = path.first().trimmed(); - if (first.isEmpty()) { - *node = relative; + if (first.isEmpty()) + *node = relative; // search for a target on the current page. + else { + if (first.endsWith(".html")) { // The target is an html file. + *node = qdb_->findNodeByNameAndType(QStringList(first), Node::Document); + //Node* n = qdb_->findHtmlFileNode(atom); } - else if (first.endsWith(".html")) { - /* - This is not a recursive search. That's ok in - this case, because we are searching for a page - node, which must be a direct child of the tree - root. - */ - *node = qdb_->treeRoot()->findChildNodeByNameAndType(first, Node::Document); + else if (first.endsWith("()")) { // The target is a C++ function or QML method. + *node = qdb_->resolveFunctionTarget(first, relative); } else { *node = qdb_->resolveTarget(first, relative); - if (!*node) { - *node = qdb_->findDocNodeByTitle(first, relative); - } - if (!*node) { - *node = qdb_->findUnambiguousTarget(first, ref, relative); + if (!(*node)) + *node = qdb_->findDocNodeByTitle(first); + if (!(*node)) { + *node = qdb_->findUnambiguousTarget(first, ref); if (*node && !(*node)->url().isEmpty() && !ref.isEmpty()) { QString final = (*node)->url() + "#" + ref; return final; } } } - if (*node) { - if (!(*node)->url().isEmpty()) { - return (*node)->url(); - } - else { - path.removeFirst(); - } - } - else { - *node = relative; - } - - if (*node) { - if ((*node)->status() == Node::Obsolete) { - if (relative) { - if (relative->parent() != *node) { - if (relative->status() != Node::Obsolete) { - bool porting = false; - if (relative->type() == Node::Document) { - const DocNode* dn = static_cast<const DocNode*>(relative); - if (dn->title().startsWith("Porting")) - porting = true; - } - QString name = relative->plainFullName(); - if (!porting && !name.startsWith("Q3")) { - if (obsoleteLinks) { - relative->doc().location().warning(tr("Link to obsolete item '%1' in %2") - .arg(atom->string()) - .arg(name)); - } - inObsoleteLink = true; - } - } - } - } - else { - qDebug() << "Link to Obsolete entity" - << (*node)->name() << "no relative"; - } - } - } + } + if (!(*node)) + return link; // empty - /* - This loop really only makes sense if *node is not 0. - In that case, The node *node points to represents a - qdoc page, so the link will ultimately point to some - target on that page. This loop finds that target on - the page that *node represents. ref is that target. - */ - while (!path.isEmpty()) { - ref = qdb_->findTarget(path.first(), *node); - if (ref.isEmpty()) - break; - path.removeFirst(); - } + if (!(*node)->url().isEmpty()) + return (*node)->url(); - /* - Given that *node is not null, we now cconstruct a link - to the page that *node represents, and then if there is - a target on that page, we connect the target to the link - with '#'. - */ - if (path.isEmpty()) { - link = linkForNode(*node, relative); - if (*node && (*node)->subType() == Node::Image) - link = "images/used-in-examples/" + link; - if (!ref.isEmpty()) { - link += QLatin1Char('#') + ref; + if (!path.isEmpty()) { + ref = qdb_->findTarget(path.first(), *node); + if (ref.isEmpty()) + return link; // empty + } + + /* + Given that *node is not null, we now cconstruct a link + to the page that *node represents, and then if we found + a target on that page, we connect the target to the link + with '#'. + */ + link = linkForNode(*node, relative); + if (*node && (*node)->subType() == Node::Image) + link = "images/used-in-examples/" + link; + if (!ref.isEmpty()) + link += QLatin1Char('#') + ref; + return link; +} + +/*! + This function is called for autolinks, i.e. for words that + are not marked with the qdoc link command that qdoc has + reason to believe should be links. For links marked with + the qdoc link command, qdoc calls getLink(). + + Return the link represented by the \a atom, and set \a node + to point to the target node for that link. \a relative points + to the node holding the qdoc comment where the link command + was found. + */ +QString HtmlGenerator::getAutoLink(const Atom *atom, const Node *relative, const Node** node) +{ + QString ref; + QString link; + QString path = atom->string().trimmed(); + *node = 0; + + if (path.endsWith("()")) { // The target is a C++ function or QML method. + *node = qdb_->resolveFunctionTarget(path, relative); + } + else { + *node = qdb_->resolveTarget(path, relative); + if (!(*node)) { + *node = qdb_->findDocNodeByTitle(path); + } + if (!(*node)) { + *node = qdb_->findUnambiguousTarget(path, ref); + if (*node && !(*node)->url().isEmpty() && !ref.isEmpty()) { + QString final = (*node)->url() + "#" + ref; + return final; } } } + + if (!(*node)) + return link; // empty + + if (!(*node)->url().isEmpty()) + return (*node)->url(); + + link = linkForNode(*node, relative); + if (!ref.isEmpty()) + link += QLatin1Char('#') + ref; return link; } @@ -3861,19 +3952,7 @@ void HtmlGenerator::generateStatus(const Node *node, CodeMarker *marker) << "We strongly advise against " << "using it in new code. See "; - const DocNode *docNode = qdb_->findDocNodeByTitle("Porting To Qt 4"); - QString ref; - if (docNode && node->type() == Node::Class) { - QString oldName(node->name()); - oldName.remove(QLatin1Char('3')); - ref = qdb_->findTarget(oldName, docNode); - } - - if (!ref.isEmpty()) { - text << Atom(Atom::Link, linkForNode(docNode, node) + QLatin1Char('#') + ref); - } - else - text << Atom(Atom::Link, "Porting to Qt 4"); + text << Atom(Atom::Link, "Porting to Qt 4"); text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) << Atom(Atom::String, "Porting to Qt 4") @@ -4018,7 +4097,7 @@ void HtmlGenerator::generateDetailedQmlMember(Node *node, out() << "<td class=\"tblQmlPropNode\"><p>"; out() << "<a name=\"" + refForNode(qpn) + "\"></a>"; - if (!qpn->isWritable(qdb_)) + if (!qpn->isWritable()) out() << "<span class=\"qmlreadonly\">read-only</span>"; if (qpn->isDefault()) out() << "<span class=\"qmldefault\">default</span>"; @@ -4039,7 +4118,7 @@ void HtmlGenerator::generateDetailedQmlMember(Node *node, out() << "<a name=\"" + refForNode(qpn) + "\"></a>"; if (!qpn->isReadOnlySet()) { if (qpn->declarativeCppNode()) - qpn->setReadOnly(!qpn->isWritable(qdb_)); + qpn->setReadOnly(!qpn->isWritable()); } if (qpn->isReadOnly()) out() << "<span class=\"qmlreadonly\">read-only</span>"; @@ -4101,11 +4180,11 @@ void HtmlGenerator::generateDetailedQmlMember(Node *node, Output the "Inherits" line for the QML element, if there should be one. */ -void HtmlGenerator::generateQmlInherits(const QmlClassNode* qcn, CodeMarker* marker) +void HtmlGenerator::generateQmlInherits(QmlClassNode* qcn, CodeMarker* marker) { if (!qcn) return; - const QmlClassNode* base = qcn->qmlBaseNode(); + QmlClassNode* base = qcn->qmlBaseNode(); while (base && base->isInternal()) { base = base->qmlBaseNode(); } @@ -4229,7 +4308,7 @@ void HtmlGenerator::generateManifestFiles() { generateManifestFile("examples", "example"); generateManifestFile("demos", "demo"); - ExampleNode::exampleNodeMap.clear(); + qdb_->exampleNodeMap().clear(); manifestMetaContent.clear(); } @@ -4240,7 +4319,8 @@ void HtmlGenerator::generateManifestFiles() */ void HtmlGenerator::generateManifestFile(QString manifest, QString element) { - if (ExampleNode::exampleNodeMap.isEmpty()) + ExampleNodeMap& exampleNodeMap = qdb_->exampleNodeMap(); + if (exampleNodeMap.isEmpty()) return; QString fileName = manifest +"-manifest.xml"; QFile file(outputDir() + QLatin1Char('/') + fileName); @@ -4251,8 +4331,8 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element) demos = true; bool proceed = false; - ExampleNodeMap::Iterator i = ExampleNode::exampleNodeMap.begin(); - while (i != ExampleNode::exampleNodeMap.end()) { + ExampleNodeMap::Iterator i = exampleNodeMap.begin(); + while (i != exampleNodeMap.end()) { const ExampleNode* en = i.value(); if (demos) { if (en->name().startsWith("demos")) { @@ -4276,8 +4356,8 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element) writer.writeAttribute("module", project); writer.writeStartElement(manifest); - i = ExampleNode::exampleNodeMap.begin(); - while (i != ExampleNode::exampleNodeMap.end()) { + i = exampleNodeMap.begin(); + while (i != exampleNodeMap.end()) { const ExampleNode* en = i.value(); if (demos) { if (!en->name().startsWith("demos")) { @@ -4501,6 +4581,16 @@ void HtmlGenerator::reportOrphans(const InnerNode* parent) break; case Node::Class: break; + case Node::QmlType: + break; + case Node::QmlBasicType: + break; + case Node::Group: + break; + case Node::Module: + break; + case Node::QmlModule: + break; case Node::Document: switch (child->subType()) { case Node::Example: @@ -4511,20 +4601,10 @@ void HtmlGenerator::reportOrphans(const InnerNode* parent) break; case Node::Image: break; - case Node::Group: - break; - case Node::Module: - break; case Node::Page: break; case Node::ExternalPage: break; - case Node::QmlClass: - break; - case Node::QmlBasicType: - break; - case Node::QmlModule: - break; case Node::Collision: break; default: |