4#ifdef QDOC_TEMPLATE_GENERATOR_ENABLED
6#include "catalogentrysource.h"
8#include "collectionnode.h"
10#include "hrefresolver.h"
11#include "inclusionfilter.h"
13#include "qdocdatabase.h"
23using namespace Qt::Literals::StringLiterals;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
45QString extractBrief(
const Node *node)
54 if (node->isTextPageNode()) {
55 const QString &reconstituted = node->reconstitutedBrief();
56 if (!reconstituted.isEmpty())
58 return node->doc().briefText().toString();
60 const Text brief = node->doc().trimmedBriefText(node->name());
62 return brief.toString();
63 return node->reconstitutedBrief();
66QString resolveEntryHref(
const HrefResolver &resolver,
const Node *target,
76 auto result = resolver.hrefForNode(target, relative);
77 if (std::get_if<HrefSuppressReason>(&result))
79 return std::get<QString>(std::move(result));
82std::optional<IR::CatalogEntry> buildEntry(
const Node *node,
84 const HrefResolver &resolver,
85 const InclusionPolicy &policy)
87 const NodeContext context = node->createContext();
88 if (!InclusionFilter::isIncluded(policy, context))
91 const QString href = resolveEntryHref(resolver, node, relative);
95 IR::CatalogEntry entry;
96 entry.name = node->fullName(relative);
98 entry.brief = extractBrief(node);
99 entry.since = node->since();
100 entry.isDeprecated = node->isDeprecated();
104void sortEntries(QList<IR::CatalogEntry> &entries, Qt::SortOrder order)
106 auto ascending = [](
const IR::CatalogEntry &a,
const IR::CatalogEntry &b) {
107 return QString::localeAwareCompare(a.name, b.name) < 0;
109 if (order == Qt::DescendingOrder) {
110 std::sort(entries.begin(), entries.end(),
111 [&](
const IR::CatalogEntry &a,
const IR::CatalogEntry &b) {
112 return ascending(b, a);
115 std::sort(entries.begin(), entries.end(), ascending);
121CatalogEntrySource::CatalogEntrySource(QDocDatabase &qdb,
122 const HrefResolver &hrefResolver,
123 InclusionPolicy policy)
125 m_hrefResolver(hrefResolver),
126 m_inclusionPolicy(std::move(policy))
131
132
133
134
135
136
137
138
139QList<IR::CatalogEntry> CatalogEntrySource::collectCppClasses(
140 const Node *relative, Qt::SortOrder sortOrder)
const
142 QList<IR::CatalogEntry> entries;
143 const NodeMultiMap &nmm = m_qdb.getCppClasses();
144 entries.reserve(nmm.size());
146 for (
const Node *node : nmm.values()) {
147 auto entry = buildEntry(node, relative, m_hrefResolver,
150 entries.append(*entry);
153 sortEntries(entries, sortOrder);
158
159
160
161
162
163
164
165
166QList<IR::CatalogEntryGroup> CatalogEntrySource::collectExamplesGrouped(
167 const Node *relative)
const
169 QList<IR::CatalogEntryGroup> groups;
170 const NodeMultiMap &nmm = m_qdb.getExamples();
171 const QList<QString> keys = nmm.uniqueKeys();
173 for (
const QString &key : keys) {
174 IR::CatalogEntryGroup group;
176 group.anchorId = TextUtils::asAsciiPrintable(key);
178 for (
const Node *node : nmm.values(key)) {
179 auto entry = buildEntry(node, relative, m_hrefResolver,
182 group.entries.append(*entry);
184 sortEntries(group.entries, Qt::AscendingOrder);
186 if (!group.entries.isEmpty())
187 groups.append(std::move(group));
194
195
196
197
198
199
200
201
202
203
204
205
206QList<IR::CatalogEntry> CatalogEntrySource::collectCompactClasses(
207 const Node *relative,
const QString &rootName)
const
209 QList<IR::CatalogEntry> entries;
210 const NodeMultiMap &nmm = m_qdb.getCppClasses();
211 entries.reserve(nmm.size());
213 for (
const Node *node : nmm.values()) {
214 if (!rootName.isEmpty()
215 && !node->name().startsWith(rootName, Qt::CaseInsensitive)) {
218 auto entry = buildEntry(node, relative, m_hrefResolver,
221 entries.append(*entry);
224 sortEntries(entries, Qt::AscendingOrder);
229
230
231
232
233
234
235QList<IR::CatalogEntry> CatalogEntrySource::collectGroupMembers(
236 const Node *relative,
const QString &groupName,
237 Qt::SortOrder sortOrder)
const
239 QList<IR::CatalogEntry> entries;
240 if (groupName.isEmpty())
247 auto *cn =
const_cast<CollectionNode *>(
248 m_qdb.getCollectionNode(groupName, NodeType::Group));
254 m_qdb.mergeCollections(cn);
255 Q_ASSERT(cn->isMerged());
257 for (
const Node *node : cn->members()) {
258 auto entry = buildEntry(node, relative, m_hrefResolver,
261 entries.append(*entry);
264 sortEntries(entries, sortOrder);