11#include "ir/documentir.h"
12#include "ir/irbuilder.h"
18#include <QtCore/qdir.h>
19#include <QtCore/qfile.h>
20#include <QtCore/qloggingcategory.h>
21#include <QtCore/qtextstream.h>
25Q_LOGGING_CATEGORY(lcQDocTemplateGenerator,
"qt.qdoc.templategenerator")
27using namespace Qt::Literals;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
69 const Config &config = Config::instance();
71 QString extensionConfig = config.get(u"template.extension"_s).asString();
72 if (!extensionConfig.isEmpty())
73 m_fileExtension = extensionConfig;
75 QString templateDirConfig = config.get(u"template.templatedir"_s).asString();
77 if (templateDirConfig.isEmpty()) {
78 m_templateDir.clear();
79 }
else if (QDir::isAbsolutePath(templateDirConfig)) {
80 m_templateDir = templateDirConfig;
83 QString outDir = outputDir();
84 if (!outDir.isEmpty())
85 m_templateDir = outDir +
"/"_L1 + templateDirConfig;
87 m_templateDir = templateDirConfig;
90 bool foundTemplates =
false;
91 if (!m_templateDir.isEmpty()) {
92 QDir templateDir(m_templateDir);
93 if (templateDir.exists() && !templateDir.entryList(QDir::Files).isEmpty()) {
94 foundTemplates =
true;
95 qCInfo(lcQDocTemplateGenerator) <<
"Using template directory:" << m_templateDir;
96 }
else if (!templateDir.exists()) {
97 qCInfo(lcQDocTemplateGenerator)
98 <<
"Configured template directory does not exist:" << m_templateDir
99 <<
"- will use embedded templates";
101 qCInfo(lcQDocTemplateGenerator)
102 <<
"Configured template directory is empty:" << m_templateDir
103 <<
"- will use embedded templates";
106 qCInfo(lcQDocTemplateGenerator)
107 <<
"No external template directory configured - will use embedded templates";
111 m_templateDir.clear();
121 return "template"_L1;
126 return m_fileExtension;
137
138
139
140
141
147 out() <<
"<!-- TemplateGenerator: C++ Reference Page for "
148 << aggregate->name() <<
" -->\n";
149 out() <<
"<h1>" << aggregate->fullTitle() <<
"</h1>\n";
150 out() <<
"<p>Template-based output (IR integration pending)</p>\n";
158 out() <<
"<!-- TemplateGenerator: QML Type Page for "
159 << qcn->name() <<
" -->\n";
160 out() <<
"<h1>" << qcn->fullTitle() <<
"</h1>\n";
161 out() <<
"<p>Template-based output (IR integration pending)</p>\n";
173 renderDocument(ir,
"page"_L1);
177
178
179
180
181
182
185 const QString templateFileName = templateBaseName +
'.'_L1 + m_fileExtension;
186 QString templateContent;
188 if (!m_templateDir.isEmpty()) {
189 QString templatePath = m_templateDir +
'/'_L1 + templateFileName;
190 QFile templateFile(templatePath);
192 if (templateFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
193 templateContent = QString::fromUtf8(templateFile.readAll());
194 templateFile.close();
198 if (templateContent.isEmpty()) {
199 QFile resourceFile(
":/qdoc/templates/"_L1 + templateFileName);
200 if (resourceFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
201 templateContent = QString::fromUtf8(resourceFile.readAll());
202 resourceFile.close();
206 if (templateContent.isEmpty())
207 qFatal(
"TemplateGenerator: No template file found for extension '%s'. "
208 "Ensure '%s.%s' exists in the configured template directory or in resources.",
209 qPrintable(m_fileExtension), qPrintable(templateBaseName),
210 qPrintable(m_fileExtension));
212 QString rendered = InjaBridge::render(templateContent, ir.toJson());
220 out() <<
"<!-- TemplateGenerator: Collection "
221 << cn->name() <<
" -->\n";
222 out() <<
"<h1>" << cn->fullTitle() <<
"</h1>\n";
223 out() <<
"<p>Template-based output (IR integration pending)</p>\n";
227
228
229
230
231
232
233
242 out() <<
"<!-- Atom: " << atom->typeString() <<
" -->\n";
The Atom class is the fundamental unit for representing documents internally.
A class for holding the members of a collection of doc pages.
The Config class contains the configuration variables for controlling how qdoc produces documentation...
Encapsulate the logic that QDoc uses to find files whose path is provided by the user and that are re...
Generator(FileResolver &file_resolver)
Constructs the generator base class.
virtual void terminateGenerator()
virtual void generateDocs()
Traverses the database recursively to generate all the documentation.
virtual void initializeGenerator()
No-op base implementation.
Builds IR (Intermediate Representation) from QDoc's Node tree.
DocumentIR buildPageIR(const PageNode *pn) const
A PageNode is a Node that generates a documentation page.
Generates documentation using external templates and a pre-built IR.
QString fileExtension() const override
void initializeGenerator() override
No-op base implementation.
void generateCppReferencePage(Aggregate *aggregate, CodeMarker *marker) override
void generatePageNode(PageNode *pn, CodeMarker *marker) override
TemplateGenerator(FileResolver &file_resolver)
qsizetype generateAtom(const Atom *atom, const Node *relative, CodeMarker *marker) override
void generateDocs() override
Traverses the database recursively to generate all the documentation.
void terminateGenerator() override
void generateCollectionNode(CollectionNode *cn, CodeMarker *marker) override
QString format() const override
Returns the format identifier for this producer (e.g., "HTML", "DocBook", "template").
void generateQmlTypePage(QmlTypeNode *qcn, CodeMarker *marker) override
Combined button and popup list for selecting options.
Intermediate representation for a documentation topic.
The Node class is the base class for all the nodes in QDoc's parse tree.