1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#ifndef HTMLGENERATOR_H
5#define HTMLGENERATOR_H
6
7#include "codemarker.h"
8#include "xmlgenerator.h"
9#include "filesystem/fileresolver.h"
10
11#include <QtCore/qhash.h>
12#include <QtCore/qregularexpression.h>
13
14QT_BEGIN_NAMESPACE
15
16class Aggregate;
17class Config;
18class ExampleNode;
19class HelpProjectWriter;
20class ManifestWriter;
21
22class HtmlGenerator : public XmlGenerator
23{
24public:
25 HtmlGenerator(FileResolver& file_resolver);
26 ~HtmlGenerator() override;
27
28 void initializeGenerator() override;
29 void terminateGenerator() override;
30 QString format() override;
31 void generateDocs() override;
32
33 QString protectEnc(const QString &string);
34 static QString protect(const QString &string);
35
36protected:
37 void generateExampleFilePage(const Node *en, ResolvedFile resolved_file, CodeMarker *marker) override;
38 qsizetype generateAtom(const Atom *atom, const Node *relative, CodeMarker *marker) override;
39 void generateCppReferencePage(Aggregate *aggregate, CodeMarker *marker) override;
40 void generateProxyPage(Aggregate *aggregate, CodeMarker *marker) override;
41 void generateQmlTypePage(QmlTypeNode *qcn, CodeMarker *marker) override;
42 void generatePageNode(PageNode *pn, CodeMarker *marker) override;
43 void generateCollectionNode(CollectionNode *cn, CodeMarker *marker) override;
44 void generateGenericCollectionPage(CollectionNode *cn, CodeMarker *marker) override;
45 [[nodiscard]] QString fileExtension() const override;
46
47private:
48 enum SubTitleSize { SmallSubTitle, LargeSubTitle };
49 enum ExtractionMarkType { BriefMark, DetailedDescriptionMark, MemberMark, EndMark };
50
51 void generateNavigationBar(const QString &title, const Node *node, CodeMarker *marker,
52 const QString &buildversion, bool tableItems = false);
53 void generateHeader(const QString &title, const Node *node = nullptr,
54 CodeMarker *marker = nullptr);
55 void generateTitle(const QString &title, const Text &subTitle, SubTitleSize subTitleSize,
56 const Node *relative, CodeMarker *marker);
57 void generateFooter(const Node *node = nullptr);
58 void generateRequisites(Aggregate *inner, CodeMarker *marker);
59 void generateQmlRequisites(QmlTypeNode *qcn, CodeMarker *marker);
60 void generateBrief(const Node *node, CodeMarker *marker, const Node *relative = nullptr,
61 bool addLink = true);
62 void generateTableOfContents(const Node *node, CodeMarker *marker,
63 QList<Section> *sections = nullptr);
64 void generateSidebar();
65 QString generateAllMembersFile(const Section &section, CodeMarker *marker);
66 QString generateAllQmlMembersFile(const Sections &sections, CodeMarker *marker);
67 QString generateObsoleteMembersFile(const Sections &sections, CodeMarker *marker);
68 QString generateObsoleteQmlMembersFile(const Sections &sections, CodeMarker *marker);
69 void generateClassHierarchy(const Node *relative, NodeMultiMap &classMap);
70 void generateAnnotatedLists(const Node *relative, CodeMarker *marker,
71 const NodeMultiMap &nodeMap);
72 void generateAnnotatedList(const Node *relative, CodeMarker *marker, const NodeList &nodes);
73 void generateCompactList(ListType listType, const Node *relative, const NodeMultiMap &classMap,
74 bool includeAlphabet, const QString &commonPrefix);
75 void generateFunctionIndex(const Node *relative);
76 void generateLegaleseList(const Node *relative, CodeMarker *marker);
77 bool generateGroupList(CollectionNode *cn);
78 void generateList(const Node *relative, CodeMarker *marker, const QString &selector);
79 void generateSectionList(const Section &section, const Node *relative, CodeMarker *marker,
80 bool useObsoloteMembers = false);
81 void generateQmlSummary(const NodeVector &members, const Node *relative, CodeMarker *marker);
82 void generateQmlItem(const Node *node, const Node *relative, CodeMarker *marker, bool summary);
83 void generateDetailedQmlMember(Node *node, const Aggregate *relative, CodeMarker *marker);
84
85 void generateSection(const NodeVector &nv, const Node *relative, CodeMarker *marker);
86 void generateSynopsis(const Node *node, const Node *relative, CodeMarker *marker,
87 Section::Style style, bool alignNames = false);
88 void generateSectionInheritedList(const Section &section, const Node *relative);
89 QString highlightedCode(const QString &markedCode, const Node *relative,
90 bool alignNames = false, Node::Genus genus = Node::DontCare);
91
92 void generateFullName(const Node *apparentNode, const Node *relative,
93 const Node *actualNode = nullptr);
94 void generateDetailedMember(const Node *node, const PageNode *relative, CodeMarker *marker);
95 void generateLink(const Atom *atom);
96
97 QString fileBase(const Node *node) const override;
98 QString fileName(const Node *node);
99
100 void beginLink(const QString &link);
101 void beginLink(const QString &link, const Node *node, const Node *relative);
102 void endLink();
103 void generateExtractionMark(const Node *node, ExtractionMarkType markType);
104 void addIncludeFileToMap(const Aggregate *aggregate, CodeMarker *marker,
105 QMap<QString, Text> &requisites, Text& text,
106 const QString &headerText);
107 void addSinceToMap(const Aggregate *aggregate, QMap<QString, Text> &requisites, Text *text,
108 const QString &sinceText) const;
109 void addStatusToMap(const Aggregate *aggregate, QMap<QString, Text> &requisites, Text &text,
110 const QString &statusText) const;
111 void addCMakeInfoToMap(const Aggregate *aggregate, QMap<QString, Text> &requisites, Text *text,
112 const QString &CMakeInfo) const;
113 void addQtVariableToMap(const Aggregate *aggregate, QMap<QString, Text> &requisites, Text *text,
114 const QString &qtVariableText) const;
115 void addInstantiatedByToMap(QMap<QString, Text> &requisites, Text *text,
116 const QString &instantiatedByText, ClassNode *classe) const;
117 void addInheritsToMap(QMap<QString, Text> &requisites, Text *text, const QString &inheritsText,
118 ClassNode *classe);
119 void addInheritedByToMap(QMap<QString, Text> &requisites, Text *text,
120 const QString &inheritedBytext, ClassNode *classe);
121 void generateTheTable(const QStringList &requisiteOrder, const QMap<QString, Text> &requisites,
122 const QString &headerText, const Aggregate *aggregate,
123 CodeMarker *marker);
124 inline void openUnorderedList();
125 inline void closeUnorderedList();
126
127 QString groupReferenceText(PageNode* node);
128
129 static bool s_inUnorderedList;
130
131 int m_codeIndent { 0 };
132 QString m_codePrefix {};
133 QString m_codeSuffix {};
134 HelpProjectWriter *m_helpProjectWriter { nullptr };
135 ManifestWriter *m_manifestWriter { nullptr };
136 QString m_headerScripts {};
137 QString m_headerStyles {};
138 QString m_endHeader {};
139 QString m_postHeader {};
140 QString m_postPostHeader {};
141 QString m_prologue {};
142 QString m_footer {};
143 QString m_address {};
144 bool m_noNavigationBar { false };
145 QString m_project {};
146 QString m_projectDescription {};
147 QString m_projectUrl {};
148 QString m_navigationLinks {};
149 QString m_navigationSeparator {};
150 QString m_homepage {};
151 QString m_hometitle {};
152 QString m_landingpage {};
153 QString m_landingtitle {};
154 QString m_cppclassespage {};
155 QString m_cppclassestitle {};
156 QString m_qmltypespage {};
157 QString m_qmltypestitle {};
158 QString m_buildversion {};
159 QString m_qflagsHref {};
160 int tocDepth {};
161
162 Config *config { nullptr };
163
164};
165
166#define HTMLGENERATOR_ADDRESS "address"
167#define HTMLGENERATOR_FOOTER "footer"
168#define HTMLGENERATOR_POSTHEADER "postheader"
169#define HTMLGENERATOR_POSTPOSTHEADER "postpostheader"
170#define HTMLGENERATOR_PROLOGUE "prologue"
171#define HTMLGENERATOR_NONAVIGATIONBAR "nonavigationbar"
172#define HTMLGENERATOR_NAVIGATIONSEPARATOR "navigationseparator"
173#define HTMLGENERATOR_TOCDEPTH "tocdepth"
174
175QT_END_NAMESPACE
176
177#endif
178

source code of qttools/src/qdoc/qdoc/htmlgenerator.h