Doxygen
Loading...
Searching...
No Matches
layout.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2024 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16#include <array>
17
18#include <assert.h>
19
20#include "types.h"
21#include "layout.h"
22#include "message.h"
23#include "language.h"
24#include "util.h"
25#include "doxygen.h"
26#include "version.h"
27#include "config.h"
28#include "xml.h"
29#include "resourcemgr.h"
30#include "docparser.h"
31#include "docnode.h"
32#include "debug.h"
33#include "regex.h"
34#include "textstream.h"
35
36inline DString compileOptions(const DString &def)
37{
38 return def;
39}
40
41inline DString compileOptions(const DString &def,SrcLangExt langId1,const DString &value1)
42{
43 return compileOptions(def)+"|"+DString().setNum(static_cast<long>(langId1))+"="+value1;
44}
45
46inline DString compileOptions(const DString &def,SrcLangExt langId1,const DString &value1,
47 SrcLangExt langId2,const DString &value2)
48{
49 return compileOptions(def,langId1,value1)+
50 "|"+DString().setNum(static_cast<long>(langId2))+"="+value2;
51}
52
53inline DString compileOptions(const DString &def,SrcLangExt langId1,const DString &value1,
54 SrcLangExt langId2,const DString &value2,
55 SrcLangExt langId3,const DString &value3)
56{
57 return compileOptions(def,langId1,value1,langId2,value2)+
58 "|"+DString().setNum(static_cast<long>(langId3))+"="+value3;
59}
60
61inline DString compileOptions(const DString &def,SrcLangExt langId1,const DString &value1,
62 SrcLangExt langId2,const DString &value2,
63 SrcLangExt langId3,const DString &value3,
64 SrcLangExt langId4,const DString &value4)
65{
66 return compileOptions(def,langId1,value1,langId2,value2,langId3,value3)+
67 "|"+DString().setNum(static_cast<long>(langId4))+"="+value4;
68}
69
70inline DString compileOptions(const DString &def,SrcLangExt langId1,const DString &value1,
71 SrcLangExt langId2,const DString &value2,
72 SrcLangExt langId3,const DString &value3,
73 SrcLangExt langId4,const DString &value4,
74 SrcLangExt langId5,const DString &value5)
75{
76 return compileOptions(def,langId1,value1,langId2,value2,langId3,value3,langId4,value4)+
77 "|"+DString().setNum(static_cast<long>(langId5))+"="+value5;
78}
79
80static bool elemIsVisible(const XMLHandlers::Attributes &attrib,bool defVal=true)
81{
82 DString visible = XMLHandlers::value(attrib,"visible");
83 //printf("visible_attribute=%s\n",qPrint(visible));
84 if (visible.empty()) return defVal;
85 if (visible.at(0)=='$' && visible.length()>1)
86 {
87 DString id = visible.mid(1);
88 const ConfigValues::Info *opt = ConfigValues::instance().get(id);
89 if (opt && opt->type==ConfigValues::Info::Bool)
90 {
91 return ConfigValues::instance().*(opt->value.b);
92 }
93 else if (opt && opt->type==ConfigValues::Info::String)
94 {
95 return opt->getBooleanRepresentation();
96 }
97 else if (!opt)
98 {
99 err("found unsupported value '{}' for visible attribute in layout file, reverting to '{}'\n",
100 visible,(defVal?"yes":"no"));
101 return defVal;
102 }
103 }
104 DString visibleLow = visible.lower();
105 if (visibleLow=="no" || visibleLow=="false" || visibleLow=="0") return false;
106 else if (visibleLow=="yes" || visibleLow=="true" || visibleLow=="1") return true;
107 else
108 {
109 err("found unsupported value '{}' for visible attribute in layout file, reverting to '{}'\n",
110 visible,(defVal?"yes":"no"));
111 return defVal;
112 }
113}
114
115//---------------------------------------------------------------------------------
116
118{
119 m_visible = m_visible && (parent==nullptr || parent->visible());
120}
121
122void LayoutNavEntry::appendChild(std::unique_ptr<LayoutNavEntry> &&e)
123{
124 e->updateVisibility(this);
125 m_children.push_back(std::move(e));
126}
127
128void LayoutNavEntry::insertChild(size_t pos,std::unique_ptr<LayoutNavEntry> &&e)
129{
130 e->updateVisibility(this);
131 m_children.insert(m_children.begin()+pos,std::move(e));
132}
133
135 const DString &file) const
136{
137 LayoutNavEntry *result=nullptr;
138 for (const auto &entry : m_children)
139 {
140 // depth first search, needed to find the entry furthest from the
141 // root in case an entry is in the tree twice
142 result = entry->find(kind,file);
143 if (result) return result;
144 if (entry->kind()==kind && (file==DString() || entry->baseFile()==file))
145 {
146 return entry.get();
147 }
148 }
149 return result;
150}
151
153{
155 if ((kind()!=LayoutNavEntry::User && kind()!=LayoutNavEntry::UserGroup) ||
156 (kind()==LayoutNavEntry::UserGroup && url.startsWith("usergroup")))
157 {
159 }
160 else if (url.startsWith("@ref ") || url.startsWith("\\ref "))
161 {
162 bool found=false;
163 DString relPath = "";
164 DString context = DString();
165 auto parser { createDocParser() };
166 auto dfAst { createRef( *parser.get(), url.mid(5).stripWhiteSpace(), context ) };
167 auto dfAstImpl = dynamic_cast<const DocNodeAST*>(dfAst.get());
168 const DocRef *df = std::get_if<DocRef>(&dfAstImpl->root);
169 if (!df->file().empty() || !df->anchor().empty())
170 {
171 found = true;
172 url=externalRef(relPath,df->ref());
173 if (!df->file().empty())
174 {
175 DString fn = df->file();
177 url += fn;
178 }
179 if (!df->anchor().empty())
180 {
181 url += "#" + df->anchor();
182 }
183 }
184 if (!found)
185 {
186 msg("explicit link request to '{}' in layout file '{}' could not be resolved\n",url.mid(5),Config_getString(LAYOUT_FILE));
187 }
188 }
189 //printf("LayoutNavEntry::url()=%s\n",qPrint(url));
190 return url;
191}
192
193//---------------------------------------------------------------------------------
194
196{
197 public:
199
200 // =========== XMLHandler events
201 void setDocumentLocator(const XMLLocator *locator)
202 {
203 m_locator = locator;
204 }
205 void error( const std::string &fileName,int lineNr,const std::string &msg)
206 {
207 warn_layout(fileName,lineNr,"{}",msg);
208 }
209 void startElement( const std::string &name, const XMLHandlers::Attributes& attrib );
210 void endElement( const std::string &name );
211
212 void startSimpleEntry(LayoutDocEntry::Kind k,const std::string &id,const XMLHandlers::Attributes &attrib)
213 {
214 bool isVisible = m_visible && elemIsVisible(attrib);
215 if (m_part!=LayoutDocManager::Undefined)
216 {
217 auto elem = std::make_unique<LayoutDocEntrySimple>(k,id,isVisible);
218 //printf("startSimpleEntry(%s) isVisible=%d visible=%d\n",qPrint(elem->entryToString()),isVisible,elem->visible());
219 m_layoutDocManager.addEntry(m_part,std::move(elem));
220 }
221 }
222
223 // ============ Specific callbacks
224
225 void startSectionEntry(LayoutDocEntry::Kind k,const std::string &id,const XMLHandlers::Attributes &attrib,
226 const DString &title)
227 {
228 bool isVisible = m_visible && elemIsVisible(attrib);
229 DString userTitle = XMLHandlers::value(attrib,"title");
230 //printf("startSectionEntry: title='%s' userTitle='%s'\n",
231 // qPrint(title),qPrint(userTitle));
232 if (userTitle.empty()) userTitle = title;
233 if (m_part!=LayoutDocManager::Undefined)
234 {
235 m_layoutDocManager.addEntry(m_part,std::make_unique<LayoutDocEntrySection>(k,id,userTitle,isVisible));
236 }
237 }
238
239
240 void startMemberDeclEntry(const std::string &id,const XMLHandlers::Attributes &attrib,MemberListType type,
241 const DString &title,const DString &subscript)
242 {
243 DString userTitle = XMLHandlers::value(attrib,"title");
244 DString userSubscript = XMLHandlers::value(attrib,"subtitle");
245 if (userTitle.empty()) userTitle = title;
246 if (userSubscript.empty()) userSubscript = subscript;
247 bool isVisible = m_visible && elemIsVisible(attrib);
248 if (m_part!=LayoutDocManager::Undefined)
249 {
250 m_layoutDocManager.addEntry(m_part,std::make_unique<LayoutDocEntryMemberDecl>(type,id,userTitle,userSubscript,isVisible));
251 }
252 }
253
254 void startMemberDefEntry(const std::string &id,const XMLHandlers::Attributes &attrib,MemberListType type,
255 const DString &title,const DString &)
256 {
257 DString userTitle = XMLHandlers::value(attrib,"title");
258 if (userTitle.empty()) userTitle = title;
259 //printf("memberdef: %s\n",qPrint(userTitle));
260 bool isVisible = m_visible && elemIsVisible(attrib);
261 if (m_part!=LayoutDocManager::Undefined)
262 {
263 m_layoutDocManager.addEntry(m_part,std::make_unique<LayoutDocEntryMemberDef>(type,id,userTitle,isVisible));
264 }
265 }
266
267 void startLayout(const std::string &,const XMLHandlers::Attributes &attrib)
268 {
269 // extract and store version number
270 DString version = XMLHandlers::value(attrib,"version");
271 static const reg::Ex re(R"((\d+)\.(\d+))");
272 reg::Match match;
273 if (reg::match(version.view(),match,re))
274 {
275 m_majorVersion = atoi(match[1].str().c_str());
276 m_minorVersion = atoi(match[2].str().c_str());
277 //printf("layout version %d.%d\n",m_versionMajor,m_versionMinor);
278 }
279 }
280
281 void startNavIndex(const std::string &,const XMLHandlers::Attributes &)
282 {
283 m_scope="navindex/";
285 }
286
287 void endNavIndex(const std::string &)
288 {
289 m_scope="";
290 if (m_rootNav && !m_rootNav->find(LayoutNavEntry::MainPage))
291 {
292 // no MainPage node... add one as the first item of the root node...
293 m_rootNav->insertChild(0,std::make_unique<LayoutNavEntry>(m_rootNav,LayoutNavEntry::MainPage, true,
294 "index",theTranslator->trMainPage(),""));
295 }
296 }
297
298 void startNavEntry(const std::string &,const XMLHandlers::Attributes &attrib)
299 {
300 bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
301 bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
302 bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
303 bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
304 bool hasGraphicalHierarchy = Config_getBool(HAVE_DOT) &&
305 Config_getBool(GRAPHICAL_HIERARCHY);
306 bool extractAll = Config_getBool(EXTRACT_ALL);
307 static struct NavEntryMap
308 {
309 const char *typeStr; // type attribute name in the XML file
310 LayoutNavEntry::Kind kind; // corresponding enum name
311 DString mainName; // default title for an item if it has children
312 DString subName; // optional name for an item if it is rendered as a child
313 DString intro; // introduction text to be put on the index page
314 DString baseFile; // base name of the file containing the index page
315 } mapping[] =
316 {
317 { "mainpage",
318 LayoutNavEntry::MainPage,
320 DString(),
321 DString(),
322 "index"
323 },
324 { "pages",
325 LayoutNavEntry::Pages,
327 DString(),
329 "pages"
330 },
331 { "topics",
332 LayoutNavEntry::Topics,
334 DString(),
336 "topics"
337 },
338 { "modules",
339 LayoutNavEntry::Modules,
343 "modules"
344 },
345 { "modulelist",
346 LayoutNavEntry::ModuleList,
348 DString(),
350 "modules"
351 },
352 { "modulemembers",
353 LayoutNavEntry::ModuleMembers,
355 DString(),
357 "modulemembers"
358 },
359 { "namespaces",
360 LayoutNavEntry::Namespaces,
361 javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt || sliceOpt ? theTranslator->trModules() : theTranslator->trNamespaces(),
362 javaOpt || vhdlOpt ? theTranslator->trPackageList() : fortranOpt || sliceOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
363 javaOpt || vhdlOpt ? theTranslator->trPackageListDescription() : fortranOpt || sliceOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
364 "namespaces"
365 },
366 { "namespacelist",
367 LayoutNavEntry::NamespaceList,
368 javaOpt || vhdlOpt ? theTranslator->trPackageList() : fortranOpt || sliceOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
369 DString(),
370 javaOpt || vhdlOpt ? theTranslator->trPackageListDescription() : fortranOpt || sliceOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
371 "namespaces"
372 },
373 { "namespacemembers",
374 LayoutNavEntry::NamespaceMembers,
375 javaOpt || vhdlOpt ? theTranslator->trPackageMembers() : fortranOpt || sliceOpt ? theTranslator->trModulesMembers() : theTranslator->trNamespaceMembers(),
376 DString(),
377 fortranOpt || sliceOpt ? theTranslator->trModulesMemberDescription(extractAll) : theTranslator->trNamespaceMemberDescription(extractAll),
378 "namespacemembers"
379 },
380 { "concepts",
381 LayoutNavEntry::Concepts,
382 theTranslator->trConcept(true,false),
385 "concepts"
386 },
387 { "classindex",
388 LayoutNavEntry::ClassIndex,
390 DString(),
391 DString(),
392 "classes"
393 },
394 { "classes",
395 LayoutNavEntry::Classes,
399 "annotated"
400 },
401 { "classlist",
402 LayoutNavEntry::ClassList,
404 DString(),
406 "annotated"
407 },
408 { "hierarchy",
409 LayoutNavEntry::ClassHierarchy,
411 DString(),
413 hasGraphicalHierarchy ? "inherits" : "hierarchy"
414 },
415 { "classmembers",
416 LayoutNavEntry::ClassMembers,
418 DString(),
420 "functions"
421 },
422 { "interfaceindex",
423 LayoutNavEntry::InterfaceIndex,
425 DString(),
426 DString(),
427 "interfaces"
428 },
429 { "interfaces",
430 LayoutNavEntry::Interfaces,
434 "annotatedinterfaces"
435 },
436 { "interfacelist",
437 LayoutNavEntry::InterfaceList,
439 DString(),
441 "annotatedinterfaces"
442 },
443 { "interfacehierarchy",
444 LayoutNavEntry::InterfaceHierarchy,
446 DString(),
448 hasGraphicalHierarchy ? "interfaceinherits" : "interfacehierarchy"
449 },
450 { "structindex",
451 LayoutNavEntry::StructIndex,
453 DString(),
454 DString(),
455 "structs"
456 },
457 { "structs",
458 LayoutNavEntry::Structs,
462 "annotatedstructs"
463 },
464 { "structlist",
465 LayoutNavEntry::StructList,
467 DString(),
469 "annotatedstructs"
470 },
471 { "exceptionindex",
472 LayoutNavEntry::ExceptionIndex,
474 DString(),
475 DString(),
476 "exceptions"
477 },
478 { "exceptions",
479 LayoutNavEntry::Exceptions,
483 "annotatedexceptions"
484 },
485 { "exceptionlist",
486 LayoutNavEntry::ExceptionList,
488 DString(),
490 "annotatedexceptions"
491 },
492 { "exceptionhierarchy",
493 LayoutNavEntry::ExceptionHierarchy,
495 DString(),
497 hasGraphicalHierarchy ? "exceptioninherits" : "exceptionhierarchy"
498 },
499 { "files",
500 LayoutNavEntry::Files,
501 theTranslator->trFile(true,false),
504 "files"
505 },
506 { "filelist",
507 LayoutNavEntry::FileList,
509 DString(),
511 "files"
512 },
513 { "globals",
514 LayoutNavEntry::FileGlobals,
516 DString(),
518 "globals"
519 },
520 { "examples",
521 LayoutNavEntry::Examples,
523 DString(),
525 "examples"
526 },
527 { "user",
528 LayoutNavEntry::User,
529 DString(),
530 DString(),
531 DString(),
532 "user"
533 },
534 { "usergroup",
535 LayoutNavEntry::UserGroup,
536 DString(),
537 DString(),
538 DString(),
539 "usergroup"
540 },
541 { nullptr, // end of list
542 static_cast<LayoutNavEntry::Kind>(0),
543 DString(),
544 DString(),
545 DString(),
546 DString()
547 }
548 };
549 // find type in the table
550 int i=0;
551 DString type = XMLHandlers::value(attrib,"type");
552 while (mapping[i].typeStr)
553 {
554 if (mapping[i].typeStr==type)
555 break;
556 i++;
557 }
558 if (mapping[i].typeStr==nullptr)
559 {
560 DString fileName = m_locator->fileName();
561 if (type.empty())
562 {
563 warn_layout(fileName,m_locator->lineNr(),"an entry tag within a navindex has no type attribute! Check your layout file!");
564 }
565 else
566 {
567 warn_layout(fileName,m_locator->lineNr(),"the type '{}' is not supported for the entry tag within a navindex! Check your layout file!",type);
568 }
569 m_invalidEntry=true;
570 return;
571 }
572 LayoutNavEntry::Kind kind = mapping[i].kind;
573 DString baseFile = mapping[i].baseFile;
574 DString title = XMLHandlers::value(attrib,"title");
575 bool isVisible = m_visible && elemIsVisible(attrib);
576 if (title.empty()) // use default title
577 {
578 title = mapping[i].mainName; // use title for main row
579 if (m_rootNav!=m_layoutDocManager.rootNavEntry() && !mapping[i].subName.empty())
580 {
581 title = mapping[i].subName; // if this is a child of another row, use the subName if available
582 // this is mainly done to get compatible naming with older versions.
583 }
584 }
585 DString intro = XMLHandlers::value(attrib,"intro");
586 if (intro.empty()) // use default intro text
587 {
588 intro = mapping[i].intro;
589 }
590 DString url = XMLHandlers::value(attrib,"url");
591 if (mapping[i].kind==LayoutNavEntry::User && !url.empty())
592 {
593 baseFile=url;
594 }
595 else if (kind==LayoutNavEntry::UserGroup)
596 {
597 if (!url.empty())
598 {
599 if (url == "[none]")
600 {
601 baseFile = DString();
602 }
603 else
604 {
605 baseFile=url;
606 }
607 }
608 else
609 {
610 baseFile+=DString().sprintf("%d",m_userGroupCount++);
611 }
612 }
613 // create new item and make it the new root
614 m_rootNav = m_layoutDocManager.createChildNavEntry(m_rootNav,kind,isVisible,baseFile,title,intro);
615 }
616
617 void endNavEntry(const std::string &)
618 {
619 // set the root back to the parent
621 m_invalidEntry=false;
622 }
623
624 void startTop(const std::string &,const XMLHandlers::Attributes &attrib,LayoutDocManager::LayoutPart part,
625 const DString &scope, LayoutNavEntry::Kind nav)
626 {
627 //printf("startTop(scope=%s)\n",qPrint(scope));
628 m_scope = scope;
629 m_part = part;
630 m_visible = elemIsVisible(attrib);
631 }
632
633 void endTop(const std::string &)
634 {
635 m_scope="";
636 m_part = LayoutDocManager::Undefined;
637 }
638
639 void startMemberDef(const std::string &id,const XMLHandlers::Attributes &attrib)
640 {
641 m_scope+="memberdef/";
642 bool isVisible = m_visible && elemIsVisible(attrib);
643 if (m_part!=LayoutDocManager::Undefined)
644 {
645 m_layoutDocManager.addEntry(m_part,std::make_unique<LayoutDocEntrySimple>(LayoutDocEntry::MemberDefStart,id,isVisible));
646 }
647 }
648
649 void endMemberDef(const std::string &id)
650 {
651 DString scopeOrg = m_scope;
652 if (size_t i=m_scope.rfind("memberdef/"); i!=DString::npos)
653 {
655 bool isVisible = true;
656 for (const auto &lde : m_layoutDocManager.docEntries(m_part))
657 {
658 if (lde->kind() == LayoutDocEntry::MemberDefStart)
659 {
660 isVisible = static_cast<const LayoutDocEntrySimple*>(lde.get())->visible();
661 break;
662 }
663 }
664 if (m_part!=LayoutDocManager::Undefined)
665 {
666 m_layoutDocManager.addEntry(m_part,std::make_unique<LayoutDocEntrySimple>(LayoutDocEntry::MemberDefEnd,id,isVisible));
667 }
668 }
669 }
670
671 void startMemberDecl(const std::string &id,const XMLHandlers::Attributes &attrib)
672 {
673 m_scope+="memberdecl/";
674 bool isVisible = m_visible && elemIsVisible(attrib);
675 if (m_part!=LayoutDocManager::Undefined)
676 {
677 m_layoutDocManager.addEntry(m_part,std::make_unique<LayoutDocEntrySimple>(LayoutDocEntry::MemberDeclStart,id,isVisible));
678 }
679 }
680
681 void endMemberDecl(const std::string &id)
682 {
683 if (size_t i=m_scope.rfind("memberdecl/"); i!=DString::npos)
684 {
686 bool isVisible = true;
687 for (const auto &lde : m_layoutDocManager.docEntries(m_part))
688 {
689 if (lde->kind() == LayoutDocEntry::MemberDeclStart)
690 {
691 isVisible = static_cast<const LayoutDocEntrySimple*>(lde.get())->visible();
692 break;
693 }
694 }
695 if (m_part!=LayoutDocManager::Undefined)
696 {
697 m_layoutDocManager.addEntry(m_part,std::make_unique<LayoutDocEntrySimple>(LayoutDocEntry::MemberDeclEnd,id,isVisible));
698 }
699 }
700 }
701
702 int majorVersion() const { return m_majorVersion; }
703 int minorVersion() const { return m_minorVersion; }
704
705 private:
708 LayoutDocManager::LayoutPart m_part = LayoutDocManager::Undefined;
710 bool m_invalidEntry = false;
711 bool m_visible = true;
713 const XMLLocator *m_locator = nullptr;
716};
717
718//---------------------------------------------------------------------------------
719
720namespace {
721
723{
724 using StartCallback = std::function<void(LayoutParser&,const std::string &,const XMLHandlers::Attributes&)>;
725 using EndCallback = std::function<void(LayoutParser&,const std::string &)>;
726
728 EndCallback endCb = [](LayoutParser &,const std::string &){};
729};
730
731template<class...Args>
732static auto startCb(void (LayoutParser::*fn)(Args...))
733{
734 return [=](LayoutParser &parser,const std::string &id,const XMLHandlers::Attributes &attr) { (parser.*fn)(id,attr); };
735}
736
737template<class...Args>
738static auto startCb(void (LayoutParser::*fn)(Args...),
740 )
741{
742 return [=](LayoutParser &parser,const std::string &id,const XMLHandlers::Attributes &attr) { (parser.*fn)(kind,id,attr); };
743}
744
745template<class...Args>
746static auto startCb(void (LayoutParser::*fn)(Args...),
748 const std::function<DString()> &title
749 )
750{
751 return [=](LayoutParser &parser,const std::string &id,const XMLHandlers::Attributes &attr) { (parser.*fn)(kind,id,attr,title()); };
752}
753
754template<class...Args>
755static auto startCb(void (LayoutParser::*fn)(Args...),
756 MemberListType type,
757 const std::function<DString()> &title
758 )
759{
760 return [=](LayoutParser &parser,const std::string &id,const XMLHandlers::Attributes &attr) { (parser.*fn)(id,attr,type,title(),DString()); };
761}
762
763template<class...Args>
764static auto startCb(void (LayoutParser::*fn)(Args...),
765 MemberListType type,
766 const std::function<DString()> &title,
767 const std::function<DString()> &subtitle
768 )
769{
770 return [=](LayoutParser &parser,const std::string &id,const XMLHandlers::Attributes &attr) { (parser.*fn)(id,attr,type,title(),subtitle()); };
771}
772
773template<class...Args>
774static auto startCb(void (LayoutParser::*fn)(Args...),
776 const DString &scope,
778 )
779{
780 return [=](LayoutParser &parser,const std::string &id,const XMLHandlers::Attributes &attr) { (parser.*fn)(id,attr,part,scope,nav); };
781}
782
783template<class...Args>
784static auto endCb(void (LayoutParser::*fn)(Args...))
785{
786 return [=](LayoutParser &parser,const std::string &id) { (parser.*fn)(id); };
787}
788
789// clang-format off
790static const std::map< std::string, ElementCallbacks > g_elementHandlers =
791{
792 // path/name
793 { "doxygenlayout", { startCb(&LayoutParser::startLayout) } },
795 { "navindex/tab", { startCb(&LayoutParser::startNavEntry),
797 } },
798
799 // class layout handlers
800 { "class", { startCb(&LayoutParser::startTop,LayoutDocManager::Class,"class/",LayoutNavEntry::Classes),
802 } },
803 { "class/briefdescription", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::BriefDesc) } },
804 { "class/detaileddescription", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::DetailedDesc,
806 } },
807 { "class/authorsection", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::AuthorSection) } },
808 { "class/includes", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassIncludes) } },
809 { "class/inheritancegraph", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassInheritanceGraph) } },
810 { "class/collaborationgraph", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassCollaborationGraph) } },
811 { "class/allmemberslink", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassAllMembersLink) } },
812 { "class/usedfiles", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassUsedFiles) } },
814 { "class/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::MemberGroups) } },
815 { "class/memberdecl/nestedclasses", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::ClassNestedClasses,
816 []() { return compileOptions(/*default*/ theTranslator->trCompounds(),
817 SrcLangExt::VHDL, theTranslator->trVhdlType(VhdlSpecifier::ENTITY,false),
818 SrcLangExt::Fortran,theTranslator->trDataTypes()); })
819 } },
820 { "class/memberdecl/services", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType::Services(),
821 []() { return compileOptions(theTranslator->trServices()); })
822 } },
823 { "class/memberdecl/interfaces", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType::Interfaces(),
824 []() { return compileOptions(theTranslator->trInterfaces()); })
825 } },
826 { "class/memberdecl/publictypes", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType::PubTypes(),
827 []() { return compileOptions(theTranslator->trPublicTypes()); })
828 } },
829 { "class/memberdecl/publicslots", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType::PubSlots(),
830 []() { return compileOptions(theTranslator->trPublicSlots()); })
831 } },
832 { "class/memberdecl/signals", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType::Signals(),
833 []() { return compileOptions(theTranslator->trSignals()); })
834 } },
835 { "class/memberdecl/publicmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PubMethods(),
836 []() { return compileOptions(/* default */ theTranslator->trPublicMembers(),
837 SrcLangExt::ObjC, theTranslator->trInstanceMethods(),
838 SrcLangExt::Slice,theTranslator->trOperations()); })
839 } },
840 { "class/memberdecl/publicstaticmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PubStaticMethods(),
841 []() { return compileOptions(/* default */ theTranslator->trStaticPublicMembers(),
842 SrcLangExt::ObjC, theTranslator->trClassMethods()); })
843 } },
844 { "class/memberdecl/publicattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PubAttribs(),
845 []() { return compileOptions(/* default */ theTranslator->trPublicAttribs(),
846 SrcLangExt::Slice,theTranslator->trDataMembers()); })
847 } },
848 { "class/memberdecl/publicstaticattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PubStaticAttribs(),
850 } },
851 { "class/memberdecl/protectedtypes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::ProTypes(),
852 []() { return compileOptions(theTranslator->trProtectedTypes()); })
853 } },
854 { "class/memberdecl/protectedslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::ProSlots(),
855 []() { return compileOptions(theTranslator->trProtectedSlots()); })
856 } },
857 { "class/memberdecl/protectedmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::ProMethods(),
859 } },
860 { "class/memberdecl/protectedstaticmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::ProStaticMethods(),
862 } },
863 { "class/memberdecl/protectedattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::ProAttribs(),
865 } },
866 { "class/memberdecl/protectedstaticattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::ProStaticAttribs(),
868 } },
869 { "class/memberdecl/packagetypes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PacTypes(),
870 []() { return compileOptions(theTranslator->trPackageTypes()); })
871 } },
872 { "class/memberdecl/packagemethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PacMethods(),
874 } },
875 { "class/memberdecl/packagestaticmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PacStaticMethods(),
877 } },
878 { "class/memberdecl/packageattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PacAttribs(),
879 []() { return compileOptions(theTranslator->trPackageAttribs()); })
880 } },
881 { "class/memberdecl/packagestaticattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PacStaticAttribs(),
883 } },
884 { "class/memberdecl/properties", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::Properties(),
885 []() { return compileOptions(theTranslator->trProperties()); })
886 } },
887 { "class/memberdecl/events", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::Events(),
888 []() { return compileOptions(theTranslator->trEvents()); })
889 } },
890 { "class/memberdecl/privatetypes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PriTypes(),
891 []() { return compileOptions(theTranslator->trPrivateTypes()); })
892 } },
893 { "class/memberdecl/privateslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PriSlots(),
894 []() { return compileOptions(theTranslator->trPrivateSlots()); })
895 } },
896 { "class/memberdecl/privatemethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PriMethods(),
897 []() { return compileOptions(theTranslator->trPrivateMembers()); })
898 } },
899 { "class/memberdecl/privatestaticmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PriStaticMethods(),
901 } },
902 { "class/memberdecl/privateattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PriAttribs(),
903 []() { return compileOptions(theTranslator->trPrivateAttribs()); })
904 } },
905 { "class/memberdecl/privatestaticattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::PriStaticAttribs(),
907 } },
908 { "class/memberdecl/friends", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::Friends(),
909 []() { return compileOptions(theTranslator->trFriends()); })
910 } },
911 { "class/memberdecl/related", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::Related(),
912 []() { return compileOptions(theTranslator->trRelatedSymbols()); },
914 } },
916 { "class/memberdef/inlineclasses", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::ClassInlineClasses,
917 []() { return compileOptions(/* default */ theTranslator->trClassDocumentation(),
918 SrcLangExt::Fortran,theTranslator->trTypeDocumentation()); })
919 } },
920 { "class/memberdef/typedefs", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::TypedefMembers(),
922 } },
923 { "class/memberdef/enums", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::EnumMembers(),
925 } },
926 { "class/memberdef/services", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::ServiceMembers(),
927 []() { return compileOptions(theTranslator->trInterfaces()); })
928 } },
929 { "class/memberdef/interfaces", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::InterfaceMembers(),
930 []() { return compileOptions(theTranslator->trInterfaces()); })
931 } },
932 { "class/memberdef/constructors", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::Constructors(),
934 } },
935 { "class/memberdef/functions", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::FunctionMembers(),
936 []() { return compileOptions(/* default */ theTranslator->trMemberFunctionDocumentation(), SrcLangExt::ObjC, theTranslator->trMethodDocumentation(),
938 SrcLangExt::Slice, theTranslator->trOperationDocumentation()); })
939 } },
940 { "class/memberdef/related", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::RelatedMembers(),
942 } },
943 { "class/memberdef/variables", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::VariableMembers(),
944 []() { return compileOptions(/* default */ theTranslator->trMemberDataDocumentation(),
945 SrcLangExt::Slice, theTranslator->trDataMemberDocumentation()); })
946 } },
947 { "class/memberdef/properties", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::PropertyMembers(),
949 } },
950 { "class/memberdef/events", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::EventMembers(),
952 } },
953
954 // concept layout handlers
955 { "concept", { startCb(&LayoutParser::startTop,LayoutDocManager::Concept,"concept/",LayoutNavEntry::Concepts),
957 } },
958 { "concept/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc) } },
959 { "concept/definition", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::ConceptDefinition,
961 } },
962 { "concept/includes", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::ClassIncludes) } },
963 { "concept/sourcelink", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileSourceLink) } },
964 { "concept/detaileddescription", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::DetailedDesc,
966 } },
967 { "concept/authorsection", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::AuthorSection) } },
968 // namespace layout handlers
969 { "namespace", { startCb(&LayoutParser::startTop,LayoutDocManager::Namespace,"namespace/",LayoutNavEntry::Namespaces),
971 } },
972 { "namespace/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc) } },
973 { "namespace/detaileddescription", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::DetailedDesc,
975 } },
976 { "namespace/authorsection", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::AuthorSection) } },
977 { "namespace/memberdecl", { startCb(&LayoutParser::startMemberDecl),
979 } },
980 { "namespace/memberdecl/nestednamespaces", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::NamespaceNestedNamespaces,
981 []() { return compileOptions(/* default */ theTranslator->trNamespaces(),
982 SrcLangExt::Java, theTranslator->trPackages(),
983 SrcLangExt::VHDL, theTranslator->trPackages(),
984 SrcLangExt::IDL, theTranslator->trModules(),
985 SrcLangExt::Fortran,theTranslator->trModules(),
986 SrcLangExt::Slice,(Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
989 } },
990 { "namespace/memberdecl/constantgroups", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::NamespaceNestedConstantGroups,
991 []() { return compileOptions(theTranslator->trConstantGroups()); })
992 } },
993 { "namespace/memberdecl/interfaces", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::NamespaceInterfaces,
995 } },
996 { "namespace/memberdecl/classes", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::NamespaceClasses,
997 []() { return compileOptions(/* default */ theTranslator->trCompounds(),
998 SrcLangExt::VHDL, theTranslator->trVhdlType(VhdlSpecifier::ENTITY,false),
999 SrcLangExt::Fortran,theTranslator->trDataTypes()); })
1000 } },
1001 { "namespace/memberdecl/concepts", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::NamespaceConcepts,
1002 []() { return compileOptions(theTranslator->trConcept(true,false)); })
1003 } },
1004 { "namespace/memberdecl/structs", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::NamespaceStructs,
1005 []() { return compileOptions(theTranslator->trStructs()); })
1006 } },
1007 { "namespace/memberdecl/exceptions", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::NamespaceExceptions,
1008 []() { return compileOptions(theTranslator->trExceptions()); })
1009 } },
1010 { "namespace/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::MemberGroups) } },
1011 { "namespace/memberdecl/typedefs", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecTypedefMembers(),
1012 []() { return compileOptions(theTranslator->trTypedefs()); })
1013 } },
1014 { "namespace/memberdecl/sequences", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecSequenceMembers(),
1015 []() { return compileOptions(theTranslator->trSequences()); })
1016 } },
1017 { "namespace/memberdecl/dictionaries", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecDictionaryMembers(),
1018 []() { return compileOptions(theTranslator->trDictionaries()); })
1019 } },
1020 { "namespace/memberdecl/enums", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecEnumMembers(),
1021 []() { return compileOptions(theTranslator->trEnumerations()); })
1022 } },
1023 { "namespace/memberdecl/functions", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecFuncMembers(),
1024 []() { return compileOptions(/* default */ theTranslator->trFunctions(),
1025 SrcLangExt::Fortran,theTranslator->trSubprograms(),
1026 SrcLangExt::VHDL, theTranslator->trFunctionAndProc()); })
1027 } },
1028 { "namespace/memberdecl/variables", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecVarMembers(),
1029 []() { return compileOptions(Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
1032 } },
1033 { "namespace/memberdecl/properties", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::Properties(),
1034 []() { return compileOptions(theTranslator->trProperties()); })
1035 } },
1036 { "namespace/memberdef", { startCb(&LayoutParser::startMemberDef), endCb(&LayoutParser::endMemberDef) } },
1037 { "namespace/memberdef/inlineclasses", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::NamespaceInlineClasses,
1038 []() { return compileOptions(/* default */ theTranslator->trClassDocumentation(),
1039 SrcLangExt::Fortran,theTranslator->trTypeDocumentation()); })
1040 } },
1041 { "namespace/memberdef/typedefs", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocTypedefMembers(),
1043 } },
1044 { "namespace/memberdef/sequences", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocSequenceMembers(),
1046 } },
1047 { "namespace/memberdef/dictionaries", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocDictionaryMembers(),
1049 } },
1050 { "namespace/memberdef/enums", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocEnumMembers(),
1052 } },
1053 { "namespace/memberdef/functions", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocFuncMembers(),
1054 []() { return compileOptions(/* default */ theTranslator->trFunctionDocumentation(),
1055 SrcLangExt::Fortran,theTranslator->trSubprogramDocumentation()); })
1056 } },
1057 { "namespace/memberdef/variables", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocVarMembers(),
1058 []() { return compileOptions(Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
1061 } },
1062 { "namespace/memberdef/properties", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::PropertyMembers(),
1064 } },
1065
1066 // file layout handlers
1067 { "file", { startCb(&LayoutParser::startTop,LayoutDocManager::File,"file/",LayoutNavEntry::Files),
1069 } },
1070 { "file/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc) } },
1071 { "file/detaileddescription", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::DetailedDesc,
1073 } },
1074 { "file/authorsection", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::AuthorSection) } },
1075 { "file/includes", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileIncludes) } },
1076 { "file/includegraph", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileIncludeGraph) } },
1077 { "file/includedbygraph", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileIncludedByGraph) } },
1078 { "file/sourcelink", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileSourceLink) } },
1079 { "file/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::MemberGroups) } },
1081 { "file/memberdecl/interfaces", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileInterfaces,
1082 []() { return compileOptions(theTranslator->trSliceInterfaces()); })
1083 } },
1084 { "file/memberdecl/classes", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileClasses,
1085 []() { return compileOptions(/* default */ theTranslator->trCompounds(),
1086 SrcLangExt::VHDL, theTranslator->trVhdlType(VhdlSpecifier::ENTITY,false),
1087 SrcLangExt::Fortran,theTranslator->trDataTypes()); })
1088 } },
1089 { "file/memberdecl/concepts", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::FileConcepts,
1090 []() { return compileOptions(theTranslator->trConcept(true,false)); })
1091 } },
1092 { "file/memberdecl/structs", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileStructs,
1093 []() { return compileOptions(theTranslator->trStructs()); })
1094 } },
1095 { "file/memberdecl/exceptions", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileExceptions,
1096 []() { return compileOptions(theTranslator->trExceptions()); })
1097 } },
1098 { "file/memberdecl/namespaces", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileNamespaces,
1099 []() { return compileOptions(/* default */ theTranslator->trNamespaces(),
1100 SrcLangExt::Java, theTranslator->trPackages(),
1101 SrcLangExt::IDL, theTranslator->trModules(),
1102 SrcLangExt::Fortran,theTranslator->trModules(),
1103 SrcLangExt::Slice, theTranslator->trModules()); })
1104 } },
1105 { "file/memberdecl/constantgroups", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileConstantGroups,
1106 []() { return compileOptions(theTranslator->trConstantGroups()); })
1107 } },
1108 { "file/memberdecl/defines", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecDefineMembers(),
1109 []() { return compileOptions(theTranslator->trDefines()); })
1110 } },
1111 { "file/memberdecl/typedefs", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecTypedefMembers(),
1112 []() { return compileOptions(theTranslator->trTypedefs()); })
1113 } },
1114 { "file/memberdecl/sequences", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecSequenceMembers(),
1115 []() { return compileOptions(theTranslator->trSequences()); })
1116 } },
1117 { "file/memberdecl/dictionaries", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecDictionaryMembers(),
1118 []() { return compileOptions(theTranslator->trDictionaries()); })
1119 } },
1120 { "file/memberdecl/enums", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecEnumMembers(),
1121 []() { return compileOptions(theTranslator->trEnumerations()); })
1122 } },
1123 { "file/memberdecl/functions", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecFuncMembers(),
1124 []() { return compileOptions(/* default */ theTranslator->trFunctions(),
1125 SrcLangExt::Fortran,theTranslator->trSubprograms(),
1126 SrcLangExt::VHDL, theTranslator->trFunctionAndProc()); })
1127 } },
1128 { "file/memberdecl/variables", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecVarMembers(),
1129 []() { return compileOptions(Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
1132 } },
1133 { "file/memberdecl/properties", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::Properties(),
1134 []() { return compileOptions(theTranslator->trProperties()); })
1135 } },
1137
1138 { "file/memberdef/inlineclasses", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileInlineClasses,
1139 []() { return compileOptions(/* default */ theTranslator->trClassDocumentation(),
1140 SrcLangExt::Fortran, theTranslator->trTypeDocumentation()); })
1141 } },
1142 { "file/memberdef/defines", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocDefineMembers(),
1144 } },
1145 { "file/memberdef/typedefs", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocTypedefMembers(),
1147 } },
1148 { "file/memberdef/sequences", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocSequenceMembers(),
1150 } },
1151 { "file/memberdef/dictionaries", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocDictionaryMembers(),
1153 } },
1154 { "file/memberdef/enums", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocEnumMembers(),
1156 } },
1157 { "file/memberdef/functions", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocFuncMembers(),
1158 []() { return compileOptions(/* default */ theTranslator->trFunctionDocumentation(),
1159 SrcLangExt::Fortran, theTranslator->trSubprogramDocumentation()); })
1160 } },
1161 { "file/memberdef/variables", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocVarMembers(),
1163 } },
1164
1165 { "file/memberdef/properties", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::PropertyMembers(),
1167 } },
1168 // group layout handlers
1169 { "group", { startCb(&LayoutParser::startTop,LayoutDocManager::Group,"group/",LayoutNavEntry::None),
1171 } },
1172 { "group/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc) } },
1173 { "group/detaileddescription", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::DetailedDesc,
1175 } },
1176 { "group/authorsection", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::AuthorSection) } },
1177 { "group/groupgraph", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::GroupGraph) } },
1179 { "group/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::MemberGroups) } },
1180 { "group/memberdecl/classes", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupClasses,
1181 []() { return compileOptions(/* default */ theTranslator->trCompounds(),
1182 SrcLangExt::VHDL, theTranslator->trVhdlType(VhdlSpecifier::ENTITY,false),
1183 SrcLangExt::Fortran, theTranslator->trDataTypes()); })
1184 } },
1185 { "group/memberdecl/concepts", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupConcepts,
1186 []() { return compileOptions(theTranslator->trConcept(true,false)); })
1187 } },
1188 { "group/memberdecl/modules", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupModules,
1189 []() { return compileOptions(theTranslator->trModule(true,false)); })
1190 } },
1191 { "group/memberdecl/namespaces", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupNamespaces,
1192 []() { return compileOptions(/* default */ theTranslator->trNamespaces(),
1193 SrcLangExt::Java, theTranslator->trPackages(),
1194 SrcLangExt::Fortran, theTranslator->trModules()); })
1195 } },
1196 { "group/memberdecl/dirs", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupDirs,
1197 []() { return compileOptions(theTranslator->trDirectories()); })
1198 } },
1199 { "group/memberdecl/nestedgroups", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupNestedGroups,
1200 []() { return compileOptions(theTranslator->trTopics()); })
1201 } },
1202 { "group/memberdecl/files", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupFiles,
1203 []() { return compileOptions(theTranslator->trFile(true,false)); })
1204 } },
1205 { "group/memberdecl/defines", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecDefineMembers(),
1206 []() { return compileOptions(theTranslator->trDefines()); })
1207 } },
1208 { "group/memberdecl/typedefs", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecTypedefMembers(),
1209 []() { return compileOptions(theTranslator->trTypedefs()); })
1210 } },
1211 { "group/memberdecl/sequences", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecSequenceMembers(),
1212 []() { return compileOptions(theTranslator->trSequences()); })
1213 } },
1214 { "group/memberdecl/dictionaries", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecDictionaryMembers(),
1215 []() { return compileOptions(theTranslator->trDictionaries()); })
1216 } },
1217 { "group/memberdecl/enums", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecEnumMembers(),
1218 []() { return compileOptions(theTranslator->trEnumerations()); })
1219 } },
1220 { "group/memberdecl/enumvalues", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecEnumValMembers(),
1222 } },
1223 { "group/memberdecl/functions", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecFuncMembers(),
1224 []() { return compileOptions(/* default */ theTranslator->trFunctions(),
1225 SrcLangExt::Fortran,theTranslator->trSubprograms(),
1226 SrcLangExt::VHDL, theTranslator->trFunctionAndProc()); })
1227 } },
1228 { "group/memberdecl/variables", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecVarMembers(),
1229 []() { return compileOptions(theTranslator->trVariables()); })
1230 } },
1231 { "group/memberdecl/signals", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecSignalMembers(),
1232 []() { return compileOptions(theTranslator->trSignals()); })
1233 } },
1234 { "group/memberdecl/publicslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecPubSlotMembers(),
1235 []() { return compileOptions(theTranslator->trPublicSlots()); })
1236 } },
1237 { "group/memberdecl/protectedslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecProSlotMembers(),
1238 []() { return compileOptions(theTranslator->trProtectedSlots()); })
1239 } },
1240 { "group/memberdecl/privateslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecPriSlotMembers(),
1241 []() { return compileOptions(theTranslator->trPrivateSlots()); })
1242 } },
1243 { "group/memberdecl/events", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecEventMembers(),
1244 []() { return compileOptions(theTranslator->trEvents()); })
1245 } },
1246 { "group/memberdecl/properties", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecPropMembers(),
1247 []() { return compileOptions(theTranslator->trProperties()); })
1248 } },
1249 { "group/memberdecl/friends", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecFriendMembers(),
1250 []() { return compileOptions(theTranslator->trFriends()); })
1251 } },
1253 { "group/memberdef/pagedocs", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::GroupPageDocs) } },
1254 { "group/memberdef/inlineclasses", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupInlineClasses,
1255 []() { return compileOptions(/* default */ theTranslator->trClassDocumentation(),
1256 SrcLangExt::Fortran,theTranslator->trTypeDocumentation()); })
1257 } },
1258 { "group/memberdef/defines", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocDefineMembers(),
1260 } },
1261 { "group/memberdef/typedefs", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocTypedefMembers(),
1263 } },
1264 { "group/memberdef/sequences", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocSequenceMembers(),
1266 } },
1267 { "group/memberdef/dictionaries", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocDictionaryMembers(),
1269 } },
1270 { "group/memberdef/enums", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocEnumMembers(),
1272 } },
1273 { "group/memberdef/enumvalues", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocEnumValMembers(),
1275 } },
1276 { "group/memberdef/functions", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocFuncMembers(),
1277 []() { return compileOptions(/* default */ theTranslator->trFunctionDocumentation(),
1278 SrcLangExt::Fortran,theTranslator->trSubprogramDocumentation()); })
1279 } },
1280 { "group/memberdef/variables", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocVarMembers(),
1282 } },
1283 { "group/memberdef/signals", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocSignalMembers(),
1284 []() { return compileOptions(theTranslator->trSignals()); })
1285 } },
1286 { "group/memberdef/publicslots", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocPubSlotMembers(),
1287 []() { return compileOptions(theTranslator->trPublicSlots()); })
1288 } },
1289 { "group/memberdef/protectedslots", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocProSlotMembers(),
1290 []() { return compileOptions(theTranslator->trProtectedSlots()); })
1291 } },
1292 { "group/memberdef/privateslots", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocPriSlotMembers(),
1293 []() { return compileOptions(theTranslator->trPrivateSlots()); })
1294 } },
1295 { "group/memberdef/events", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocEventMembers(),
1296 []() { return compileOptions(theTranslator->trEvents()); })
1297 } },
1298 { "group/memberdef/properties", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocPropMembers(),
1299 []() { return compileOptions(theTranslator->trProperties()); })
1300 } },
1301 { "group/memberdef/friends", { startCb(&LayoutParser::startMemberDefEntry, MemberListType::DocFriendMembers(),
1302 []() { return compileOptions(theTranslator->trFriends()); })
1303 } },
1304
1305 // module layout handlers
1306 { "module", { startCb(&LayoutParser::startTop,LayoutDocManager::Module,"module/",LayoutNavEntry::Modules),
1308 } },
1309 { "module/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc) } },
1310 { "module/exportedmodules", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::ModuleExports,
1311 []() { return compileOptions(theTranslator->trExportedModules()); })
1312 } },
1313 { "module/detaileddescription", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::DetailedDesc,
1315 } },
1316 { "module/authorsection", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::AuthorSection) } },
1318 { "module/memberdecl/concepts", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::ModuleConcepts,
1319 []() { return compileOptions(theTranslator->trConcept(true,false)); })
1320 } },
1321 { "module/memberdecl/classes", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::ModuleClasses,
1322 []() { return compileOptions(theTranslator->trCompounds()); })
1323 } },
1324 { "module/memberdecl/enums", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecEnumMembers(),
1325 []() { return compileOptions(theTranslator->trEnumerations()); })
1326 } },
1327 { "module/memberdecl/typedefs", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecTypedefMembers(),
1328 []() { return compileOptions(theTranslator->trTypedefs()); })
1329 } },
1330 { "module/memberdecl/functions", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecFuncMembers(),
1331 []() { return compileOptions(theTranslator->trFunctions()); })
1332 } },
1333 { "module/memberdecl/variables", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType::DecVarMembers(),
1334 []() { return compileOptions(theTranslator->trVariables()); })
1335 } },
1336 { "module/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::MemberGroups) } },
1337 { "module/memberdecl/files", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::ModuleUsedFiles,
1338 []() { return compileOptions(theTranslator->trFile(true,false)); })
1339 } },
1340
1341 // directory layout handlers
1342 { "directory", { startCb(&LayoutParser::startTop,LayoutDocManager::Directory,"directory/",LayoutNavEntry::None),
1344 } },
1345 { "directory/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc) } },
1346 { "directory/detaileddescription", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::DetailedDesc,
1348 } },
1349 { "directory/directorygraph", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::DirGraph) } },
1350 { "directory/memberdecl", { startCb(&LayoutParser::startMemberDecl), endCb(&LayoutParser::endMemberDecl) } },
1351 { "directory/memberdecl/dirs", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::DirSubDirs) } },
1352 { "directory/memberdecl/files", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::DirFiles) } },
1353};
1354// clang-format on
1355
1356} // namespace
1357
1358void LayoutParser::startElement( const std::string &name, const XMLHandlers::Attributes& attrib )
1359{
1360 //printf("startElement [%s]::[%s]\n",qPrint(m_scope),qPrint(name));
1361 auto it = g_elementHandlers.find(m_scope.str()+name);
1362 if (it!=g_elementHandlers.end())
1363 {
1364 it->second.startCb(*this,it->first,attrib);
1365 }
1366 else
1367 {
1368 DString fileName = m_locator->fileName();
1369 warn_layout(fileName,m_locator->lineNr(),"Unexpected start tag '{}' found in scope='{}'!",
1370 name,m_scope);
1371 }
1372}
1373
1374void LayoutParser::endElement( const std::string &name )
1375{
1376 //printf("endElement [%s]::[%s]\n",qPrint(m_scope),qPrint(name));
1377 auto it=g_elementHandlers.end();
1378
1379 if (!m_scope.empty() && m_scope.right(name.length()+1)==name+"/")
1380 { // element ends current scope
1381 it = g_elementHandlers.find(m_scope.left(m_scope.length()-1).str());
1382 }
1383 else // continue with current scope
1384 {
1385 it = g_elementHandlers.find(m_scope.str()+name);
1386 }
1387 if (it!=g_elementHandlers.end())
1388 {
1389 it->second.endCb(*this,it->first+" end"); // added end to id to make it unique
1390 }
1391}
1392
1393//---------------------------------------------------------------------------------
1394
1396
1397//---------------------------------------------------------------------------------
1398
1400{
1401 public:
1402 std::array<LayoutDocEntryList,LayoutDocManager::NrParts> docEntries;
1406};
1407
1409{
1410}
1411
1415
1417{
1419 XMLHandlers handlers;
1420 handlers.startElement = [&layoutParser](const std::string &name,const XMLHandlers::Attributes &attrs) { layoutParser.startElement(name,attrs); };
1421 handlers.endElement = [&layoutParser](const std::string &name) { layoutParser.endElement(name); };
1422 handlers.error = [&layoutParser](const std::string &fileName,int lineNr,const std::string &msg) { layoutParser.error(fileName,lineNr,msg); };
1423 XMLParser parser(handlers);
1424 layoutParser.setDocumentLocator(&parser);
1425 constexpr auto layoutFile = "layout_default.xml";
1426 DString layout_default = ResourceMgr::instance().getAsString(layoutFile);
1427 parser.parse(layoutFile,layout_default.data(),Debug::isFlagSet(Debug::Lex_xml),
1428 [&]() { DebugLex::print(Debug::Lex_xml,"Entering","libxml/xml.l",layoutFile); },
1429 [&]() { DebugLex::print(Debug::Lex_xml,"Finished", "libxml/xml.l",layoutFile); }
1430 );
1432 d->majorVersion = layoutParser.majorVersion();
1433 d->minorVersion = layoutParser.minorVersion();
1434}
1435
1437{
1438 static LayoutDocManager theInstance;
1439 return theInstance;
1440}
1441
1443{
1444 return d->docEntries[static_cast<int>(part)];
1445}
1446
1448{
1449 return &d->rootNav;
1450}
1451
1453 LayoutNavEntry::Kind k,bool vs,const DString &bf,
1454 const DString &tl,const DString &intro)
1455{
1456 if (parent==nullptr) parent = &d->rootNav;
1457 auto ptr = std::make_unique<LayoutNavEntry>(parent,k,vs,bf,tl,intro);
1458 auto child = ptr.get();
1459 parent->appendChild(std::move(ptr));
1460 return child;
1461}
1462
1464{
1465 auto &docEntry = d->docEntries[static_cast<int>(p)];
1466 docEntry.push_back(std::move(e)); // add
1467}
1468
1469void LayoutDocManager::parse(const DString &fileName, const char *data)
1470{
1471 //printf("============ LayoutDocManager::parse(%s)\n",qPrint(fileName));
1472 LayoutDocManager layoutDocManager;
1473 LayoutParser layoutParser(layoutDocManager);
1474 XMLHandlers handlers;
1475 handlers.startElement = [&layoutParser](const std::string &name,const XMLHandlers::Attributes &attrs) { layoutParser.startElement(name,attrs); };
1476 handlers.endElement = [&layoutParser](const std::string &name) { layoutParser.endElement(name); };
1477 handlers.error = [&layoutParser](const std::string &fn,int lineNr,const std::string &msg) { layoutParser.error(fn,lineNr,msg); };
1478 XMLParser parser(handlers);
1479 layoutParser.setDocumentLocator(&parser);
1480 parser.parse(fileName.data(),
1481 data ? data : fileToString(fileName).data(),
1483 [&]() { DebugLex::print(Debug::Lex_xml,"Entering","libxml/xml.l",qPrint(fileName)); },
1484 [&]() { DebugLex::print(Debug::Lex_xml,"Finished", "libxml/xml.l",qPrint(fileName)); },
1486 );
1487
1488 // version in the user defined layout overrides default one
1489 d->majorVersion = layoutParser.majorVersion();
1490 d->minorVersion = layoutParser.minorVersion();
1491
1492 // merge missing parts of the default layout into the user defined layout
1493 // For now merging in defaults has been disabled for navigation entries
1494 // to avoid "extra entries" for projects that work with partial layout files.
1495 //mergeNavEntries(layoutDocManager);
1496
1497 // for compatibility reasons we only merge defaults when the user defined layout has at least version 2.0 or higher
1498 if (d->majorVersion>=2)
1499 {
1500 mergeDocEntries(fileName,layoutDocManager);
1501 }
1502
1503 layoutDocManager.removeInvisibleDocEntries();
1504
1505 // replace default layout with merged layout
1506 d->docEntries.swap(layoutDocManager.d->docEntries);
1507 d->rootNav.swap(layoutDocManager.d->rootNav);
1508}
1509
1511{
1512 // remove invisible entries
1513 for (auto &list : d->docEntries)
1514 {
1515 auto it = list.begin();
1516 while (it!=list.end())
1517 {
1518 if (*it==nullptr || !(*it)->visible())
1519 {
1520 it = list.erase(it);
1521 }
1522 else
1523 {
1524 ++it;
1525 }
1526 }
1527 }
1528}
1529
1531{
1532 return d->majorVersion;
1533}
1534
1536{
1537 return d->minorVersion;
1538}
1539
1540// search for candidate node in tree with root target. Returns the match target node if found, or nullptr otherwise.
1541static LayoutNavEntry *findNavEntryRec(LayoutNavEntry *root, const std::string &id)
1542{
1543 if (root)
1544 {
1545 if (root->id()==id) return root;
1546 for (auto &child : root->children())
1547 {
1548 LayoutNavEntry *childNavEntry = findNavEntryRec(child.get(),id);
1549 if (childNavEntry) return childNavEntry;
1550 }
1551 }
1552 return nullptr;
1553}
1554
1555// merge the missing nodes
1556static void mergeNavTreeNodesRec(LayoutNavEntry *targetTree,LayoutNavEntry *sourceTree)
1557{
1558 using IdSet = std::unordered_set<std::string>;
1559 using IdMap = std::unordered_map<std::string,size_t>;
1560
1561 auto prepareSet = [](const LayoutNavEntry *tree, IdSet &set) {
1562 for (const auto &e : tree->children())
1563 {
1564 set.insert(e->id());
1565 }
1566 };
1567
1568 auto prepareMap = [](const LayoutNavEntry *tree, const IdSet &set, IdMap &map) {
1569 for (size_t i=0; i<tree->children().size(); i++)
1570 {
1571 std::string id = tree->children()[i]->id();
1572 auto it = set.find(id);
1573 if (it != set.end())
1574 {
1575 map[id]=i;
1576 }
1577 }
1578 };
1579
1580 IdSet sourceSet, targetSet;
1581 prepareSet(sourceTree,sourceSet);
1582 prepareSet(targetTree,targetSet);
1583
1584 IdMap sourceMap, targetMap;
1585 prepareMap(targetTree,sourceSet,targetMap);
1586 prepareMap(sourceTree,targetSet,sourceMap);
1587
1588 // calculate list of insertion positions in the target list for each id in the source list
1589 std::vector<size_t> insertionList;
1590 for (size_t i=0; i<sourceTree->children().size(); i++)
1591 {
1592 std::string id = sourceTree->children()[i]->id();
1593 // If an id in the source list appears before a set of shared ids we want it also to
1594 // appear before these id in the target list. To do this find the lowest target index of all shared
1595 // ids that come after position i in the source list
1596 size_t minIdx = targetTree->children().size();
1597 for (const auto &kv : sourceMap) // iterator over shared ids
1598 {
1599 if (i < kv.second) // i appears before this shared id
1600 {
1601 size_t idx = targetMap[kv.first]; // get the corresponding index in the target list
1602 if (idx<minIdx) // update minimum
1603 {
1604 minIdx=idx;
1605 }
1606 }
1607 }
1608 insertionList.push_back(minIdx);
1609 }
1610
1611 // Insert the missing elements of the source list into the target list.
1612 // Work backwards so the calculated insertion points don't change due to insertions.
1613 size_t idx = sourceTree->children().size()-1;
1614 for (auto it=insertionList.rbegin(); it!=insertionList.rend(); ++it, idx--)
1615 {
1616 std::string id = sourceTree->children()[idx]->id();
1617 if (targetSet.find(id)==targetSet.end()) // need to add id
1618 {
1619 // for efficiency we move the elements from the source list to the target list, thus modifying the source list!
1620 targetTree->insertChild(*it, std::move(sourceTree->children()[idx]));
1621 }
1622 }
1623
1624 for (auto &targetChild : targetTree->children())
1625 {
1626 auto *node = findNavEntryRec(sourceTree,targetChild->id());
1627 if (node)
1628 {
1629 mergeNavTreeNodesRec(targetChild.get(),node);
1630 }
1631 }
1632}
1633
1638
1639static void mergeDocEntryLists(const DString &fileName,LayoutDocEntryList &targetList,LayoutDocEntryList &sourceList)
1640{
1641 using IdSet = std::unordered_set<std::string>;
1642 using IdMap = std::unordered_map<std::string,size_t>;
1643
1644 auto prepareSet = [](const LayoutDocEntryList &list, IdSet &set) {
1645 //size_t idx=0;
1646 for (const auto &e : list)
1647 {
1648 //printf("idx=%zu set(%s)\n",idx,qPrint(e->id()));
1649 set.insert(e->id());
1650 //idx++;
1651 }
1652 };
1653
1654 auto prepareMap = [](const LayoutDocEntryList &list, const IdSet &set, IdMap &map) {
1655 for (size_t i=0; i<list.size(); i++)
1656 {
1657 std::string id = list[i]->id();
1658 auto it = set.find(id);
1659 if (it != set.end())
1660 {
1661 //printf("map %s->%zu\n",qPrint(id),i);
1662 map[id]=i;
1663 }
1664 }
1665 };
1666
1667 IdSet sourceSet, targetSet;
1668 //printf("---- sourceSet\n");
1669 prepareSet(sourceList,sourceSet);
1670 //printf("---- targetSet\n");
1671 prepareSet(targetList,targetSet);
1672
1673 IdMap sourceMap, targetMap;
1674 //printf("---- targetMap\n");
1675 prepareMap(targetList,sourceSet,targetMap);
1676 //printf("---- sourceMap\n");
1677 prepareMap(sourceList,targetSet,sourceMap);
1678
1679 // calculate list of insertion positions in the target list for each id in the source list
1680 std::vector<size_t> insertionList;
1681 for (size_t i=0; i<sourceList.size(); i++)
1682 {
1683 std::string id = sourceList[i]->id();
1684 // If an id in the source list appears before a set of shared ids we want it also to
1685 // appear before these id in the target list. To do this find the lowest target index of all shared
1686 // ids that come after position i in the source list
1687 size_t minIdx = targetList.size();
1688 for (const auto &kv : sourceMap) // iterator over shared ids
1689 {
1690 if (i < kv.second) // i appears before this shared id
1691 {
1692 size_t idx = targetMap[kv.first]; // get the corresponding index in the target list
1693 //printf(" evaluating %s->%zu min=%zu\n",qPrint(kv.first),idx,minIdx);
1694 if (idx<minIdx) // update minimum
1695 {
1696 minIdx=idx;
1697 }
1698 }
1699 }
1700 //printf("insertion %s->%zu\n",qPrint(id),minIdx);
1701 insertionList.push_back(minIdx);
1702 }
1703
1704 // Insert the missing elements of the source list into the target list.
1705 // Work backwards so the calculated insertion points don't change due to insertions.
1706 size_t idx = sourceList.size()-1;
1707 for (auto it=insertionList.rbegin(); it!=insertionList.rend(); ++it, idx--)
1708 {
1709 std::string id = sourceList[idx]->id();
1710 //printf("idx=%zu entry %s\n",idx,qPrint(id));
1711 if (targetSet.find(id)==targetSet.end()) // need to add id
1712 {
1713 // for efficiency we move the elements from the source list to the target list, thus modifying the source list!
1714 //printf("--> insert at %zu before %s\n",*it,qPrint(*it<targetList.size()?targetList[*it]->id():"none"));
1715 warn_layout(fileName,1,"User defined layout misses entry '{}'. Using default value.",id);
1716 targetList.insert(targetList.begin()+*it, std::move(sourceList[idx]));
1717 }
1718 }
1719
1720}
1721
1723{
1724 for (size_t i=0; i<d->docEntries.size(); i++)
1725 {
1726 //printf("========= part %zu\n",i);
1727 mergeDocEntryLists(fileName,other.d->docEntries[i],d->docEntries[i]);
1728 }
1729}
1730
1731//---------------------------------------------------------------------------------
1732
1733void writeDefaultLayoutFile(const DString &fileName)
1734{
1735 std::ofstream f;
1736 if (openOutputFile(fileName,f))
1737 {
1738 TextStream t(&f);
1739 DString layout_default = ResourceMgr::instance().getAsString("layout_default.xml");
1740 t << substitute(layout_default,"$doxygenversion",getDoxygenVersion());
1741 }
1742 else
1743 {
1744 err("Failed to open file {} for writing!\n",fileName);
1745 return;
1746 }
1747 f.close();
1748}
1749
1750//----------------------------------------------------------------------------------
1751
1752// Convert input to a title.
1753// The format of input can be a simple title "A title" or in case there are different
1754// titles for some programming languages they can take the following form:
1755// "A title|16=Another title|8=Yet Another title"
1756// where the number is a value of SrcLangExt in decimal notation (i.e. 16=Java, 8=IDL).
1758{
1759 size_t s=0,e=input.find('|');
1760 if (e==DString::npos) return input; // simple title case
1761 size_t e1=e;
1762 while (e!=DString::npos) // look for 'number=title' pattern separated by '|'
1763 {
1764 s=e+1;
1765 e=input.find('|',s);
1766 size_t i=input.find('=',s);
1767 assert(i!=DString::npos && i>s);
1768 SrcLangExt key= static_cast<SrcLangExt>(input.mid(s,i-s).toUInt());
1769 if (key==lang) // found matching key
1770 {
1771 if (e==DString::npos) e=input.length();
1772 return input.mid(i+1,e-i-1);
1773 }
1774 }
1775 return input.left(e1); // fallback, no explicit language key found
1776}
1777
1778//----------------------------------------------------------------------------------
1779
1784
1785//----------------------------------------------------------------------------------
1786
1791
1796
1797//----------------------------------------------------------------------------------
1798
1803
1804//----------------------------------------------------------------------------------
1805
1806static void printNavLayout(LayoutNavEntry *root,int indent)
1807{
1809 {
1810 DString indentStr;
1811 indentStr.fill(' ',indent);
1812 Debug::print(Debug::Layout,0,"{}kind={} visible={} title='{}'\n",
1813 indentStr, root->navToString(), root->visible(), root->title());
1814 for (const auto &e : root->children())
1815 {
1816 printNavLayout(e.get(),indent+2);
1817 }
1818 }
1819}
1820
1822{
1823 bool extraIndent = false;
1824
1825 auto &mgr = LayoutDocManager::instance();
1826 Debug::print(Debug::Layout,0,"Layout version {}.{}\n",mgr.majorVersion(),mgr.minorVersion());
1827
1828 Debug::print(Debug::Layout,0,"Part: Navigation index\n");
1829 for (const auto &e : mgr.rootNavEntry()->children())
1830 {
1831 printNavLayout(e.get(),2);
1832 }
1833
1834 for (int i = 0; i < LayoutDocManager::NrParts; i++)
1835 {
1837 for (const auto &lde : mgr.docEntries(static_cast<LayoutDocManager::LayoutPart>(i)))
1838 {
1839 if (const LayoutDocEntrySimple *ldes = dynamic_cast<const LayoutDocEntrySimple*>(lde.get()))
1840 {
1841 if (lde->kind() == LayoutDocEntry::MemberDeclEnd || lde->kind() == LayoutDocEntry::MemberDefEnd) extraIndent = false;
1842 Debug::print(Debug::Layout,0," {}kind: {}, visible={}\n",
1843 extraIndent? " " : "",lde->entryToString(), ldes->visible());
1844 if (lde->kind() == LayoutDocEntry::MemberDeclStart || lde->kind() == LayoutDocEntry::MemberDefStart) extraIndent = true;
1845 }
1846 else if (const LayoutDocEntryMemberDecl *lmdecl = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get()))
1847 {
1848 Debug::print(Debug::Layout,0," {}complex kind: {}, visible={}, type: {}\n",
1849 extraIndent? " " : "",lde->entryToString(),lmdecl->visible(),lmdecl->type.to_string());
1850 }
1851 else if (const LayoutDocEntryMemberDef *lmdef = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get()))
1852 {
1853 Debug::print(Debug::Layout,0," {}complex kind: {}, visible={}, type: {}\n",
1854 extraIndent? " " : "",lde->entryToString(),lmdef->visible(),lmdef->type.to_string());
1855 }
1856 else
1857 {
1858 // should not happen
1859 Debug::print(Debug::Layout,0," {}not handled kind: {}\n",extraIndent? " " : "",lde->entryToString());
1860 }
1861 }
1862 }
1863}
1864
1865
1866
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:88
DString & setNum(short n)
Definition dstring.h:556
DString()=default
size_t rfind(char c, size_t pos=npos) const
Definition dstring.h:248
DString fill(char c, size_t len)
Fills a string with a predefined character.
Definition dstring.h:282
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:322
DString lower() const
Definition dstring.h:330
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:152
std::string_view view() const
Definition dstring.h:166
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:182
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:690
DString right(size_t len) const
Definition dstring.h:315
size_t find(char c, size_t pos=0) const
Definition dstring.h:243
DString & sprintf(const char *format,...)
Definition dstring.cpp:30
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:341
DString left(size_t len) const
Definition dstring.h:310
const std::string & str() const
Definition dstring.h:649
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:161
bool startsWith(const char *s) const
Definition dstring.h:604
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:155
@ Layout
Definition debug.h:51
@ Lex_xml
Definition debug.h:72
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:133
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:78
static void print(Debug::DebugMask mask, const char *state, const char *lexName, const char *fileName)
Definition debug.cpp:157
Class representing the abstract syntax tree of a documentation block.
Definition docnode.h:1471
Node representing a reference to some item.
Definition docnode.h:787
DString ref() const
Definition docnode.h:793
DString file() const
Definition docnode.h:791
DString anchor() const
Definition docnode.h:794
std::array< LayoutDocEntryList, LayoutDocManager::NrParts > docEntries
Definition layout.cpp:1402
LayoutNavEntry rootNav
Definition layout.cpp:1403
Singleton providing access to the (user configurable) layout of the documentation.
Definition layout.h:260
void mergeNavEntries(LayoutDocManager &manager)
Definition layout.cpp:1634
static std::string partToString(int k)
Definition layout.h:271
void parse(const DString &fileName, const char *data=nullptr)
Parses a user provided layout.
Definition layout.cpp:1469
std::unique_ptr< Private > d
Definition layout.h:303
LayoutNavEntry * createChildNavEntry(LayoutNavEntry *root, LayoutNavEntry::Kind k, bool vs, const DString &bf, const DString &tl, const DString &intro)
append a new node as a child to root.
Definition layout.cpp:1452
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1436
int majorVersion() const
Definition layout.cpp:1530
int minorVersion() const
Definition layout.cpp:1535
friend class LayoutParser
Definition layout.h:304
void mergeDocEntries(const DString &fileName, LayoutDocManager &manager)
Definition layout.cpp:1722
void addEntry(LayoutPart p, LayoutDocEntryPtr &&e)
Definition layout.cpp:1463
LayoutNavEntry * rootNavEntry() const
returns the (invisible) root of the navigation tree.
Definition layout.cpp:1447
void removeInvisibleDocEntries()
Definition layout.cpp:1510
const LayoutDocEntryList & docEntries(LayoutPart part) const
Returns the list of LayoutDocEntry's in representation order for a given page identified by part.
Definition layout.cpp:1442
void endTop(const std::string &)
Definition layout.cpp:633
void endNavIndex(const std::string &)
Definition layout.cpp:287
void setDocumentLocator(const XMLLocator *locator)
Definition layout.cpp:201
static int m_userGroupCount
Definition layout.cpp:712
void startMemberDefEntry(const std::string &id, const XMLHandlers::Attributes &attrib, MemberListType type, const DString &title, const DString &)
Definition layout.cpp:254
void startSimpleEntry(LayoutDocEntry::Kind k, const std::string &id, const XMLHandlers::Attributes &attrib)
Definition layout.cpp:212
void startNavIndex(const std::string &, const XMLHandlers::Attributes &)
Definition layout.cpp:281
LayoutParser(LayoutDocManager &manager)
Definition layout.cpp:198
void startTop(const std::string &, const XMLHandlers::Attributes &attrib, LayoutDocManager::LayoutPart part, const DString &scope, LayoutNavEntry::Kind nav)
Definition layout.cpp:624
void error(const std::string &fileName, int lineNr, const std::string &msg)
Definition layout.cpp:205
const XMLLocator * m_locator
Definition layout.cpp:713
int m_minorVersion
Definition layout.cpp:715
int majorVersion() const
Definition layout.cpp:702
void startMemberDecl(const std::string &id, const XMLHandlers::Attributes &attrib)
Definition layout.cpp:671
void endMemberDecl(const std::string &id)
Definition layout.cpp:681
void endMemberDef(const std::string &id)
Definition layout.cpp:649
int minorVersion() const
Definition layout.cpp:703
bool m_invalidEntry
Definition layout.cpp:710
void endNavEntry(const std::string &)
Definition layout.cpp:617
void startSectionEntry(LayoutDocEntry::Kind k, const std::string &id, const XMLHandlers::Attributes &attrib, const DString &title)
Definition layout.cpp:225
LayoutDocManager & m_layoutDocManager
Definition layout.cpp:707
void startMemberDeclEntry(const std::string &id, const XMLHandlers::Attributes &attrib, MemberListType type, const DString &title, const DString &subscript)
Definition layout.cpp:240
void startNavEntry(const std::string &, const XMLHandlers::Attributes &attrib)
Definition layout.cpp:298
void startMemberDef(const std::string &id, const XMLHandlers::Attributes &attrib)
Definition layout.cpp:639
bool m_visible
Definition layout.cpp:711
void endElement(const std::string &name)
Definition layout.cpp:1374
DString m_scope
Definition layout.cpp:706
LayoutNavEntry * m_rootNav
Definition layout.cpp:709
void startLayout(const std::string &, const XMLHandlers::Attributes &attrib)
Definition layout.cpp:267
void startElement(const std::string &name, const XMLHandlers::Attributes &attrib)
Definition layout.cpp:1358
LayoutDocManager::LayoutPart m_part
Definition layout.cpp:708
int m_majorVersion
Definition layout.cpp:714
Wrapper class for the MemberListType type.
Definition types.h:346
static ResourceMgr & instance()
Returns the one and only instance of this class.
DString getAsString(const DString &name) const
Gets the resource data as a C string.
Text streaming class that buffers data.
Definition textstream.h:36
virtual DString trCompoundMembers()=0
virtual DString trFunctionAndProc()=0
virtual DString trStaticProtectedAttribs()=0
virtual DString trProtectedTypes()=0
virtual DString trTypedefs()=0
virtual DString trConceptList()=0
virtual DString trTopics()=0
virtual DString trModulesMembers()=0
virtual DString trCompoundMembersFortran()=0
virtual DString trStaticProtectedMembers()=0
virtual DString trPublicAttribs()=0
virtual DString trExceptions()=0
virtual DString trModulesList()=0
virtual DString trEnumerations()=0
virtual DString trRelatedSymbolDocumentation()=0
virtual DString trClasses()=0
virtual DString trDetailedDescription()=0
virtual DString trDataMemberDocumentation()=0
virtual DString trInterfaceIndex()=0
virtual DString trNamespaceMembers()=0
virtual DString trVariableDocumentation()=0
virtual DString trNamespaceMemberDescription(bool extractAll)=0
virtual DString trFileMembersDescription(bool extractAll)=0
virtual DString trPackageMembers()=0
virtual DString trNamespaceList()=0
virtual DString trPrivateAttribs()=0
virtual DString trExceptionList()=0
virtual DString trSequenceDocumentation()=0
virtual DString trTypedefDocumentation()=0
virtual DString trPrivateSlots()=0
virtual DString trStructs()=0
virtual DString trPrivateTypes()=0
virtual DString trClassDocumentation()=0
virtual DString trExceptionHierarchyDescription()=0
virtual DString trOperationDocumentation()=0
virtual DString trInterfaceList()=0
virtual DString trSequences()=0
virtual DString trClassMethods()=0
virtual DString trFunctions()=0
virtual DString trMemberEnumerationDocumentation()=0
virtual DString trProtectedSlots()=0
virtual DString trInterfaceListDescription()=0
virtual DString trFriends()=0
virtual DString trPropertyDocumentation()=0
virtual DString trInstanceMethods()=0
virtual DString trExceptionHierarchy()=0
virtual DString trCompoundList()=0
virtual DString trPackageAttribs()=0
virtual DString trEnumerationTypeDocumentation()=0
virtual DString trInterfaceHierarchy()=0
virtual DString trTypeDocumentation()=0
virtual DString trPackageList()=0
virtual DString trMemberTypedefDocumentation()=0
virtual DString trEnumerationValueDocumentation()=0
virtual DString trModulesDescription()=0
virtual DString trStaticPackageAttribs()=0
virtual DString trStructListDescription()=0
virtual DString trOperations()=0
virtual DString trConceptDefinition()=0
virtual DString trDefineDocumentation()=0
virtual DString trDesignUnitListDescription()=0
virtual DString trExamplesDescription()=0
virtual DString trCompounds()=0
virtual DString trFileList()=0
virtual DString trModules()=0
virtual DString trDefines()=0
virtual DString trRelatedPages()=0
virtual DString trPublicMembers()=0
virtual DString trSubprogramDocumentation()=0
virtual DString trCompoundListDescriptionFortran()=0
virtual DString trVhdlType(VhdlSpecifier type, bool single)=0
virtual DString trInterfaces()=0
virtual DString trRelatedSymbols()=0
virtual DString trFileMembers()=0
virtual DString trDesignUnitHierarchy()=0
virtual DString trDesignUnits()=0
virtual DString trProtectedMembers()=0
virtual DString trDirectories()=0
virtual DString trInterfaceHierarchyDescription()=0
virtual DString trStaticPrivateAttribs()=0
virtual DString trStructIndex()=0
virtual DString trExceptionIndex()=0
virtual DString trConstructorDocumentation()=0
virtual DString trPackageTypes()=0
virtual DString trExportedModules()=0
virtual DString trModule(bool first_capital, bool singular)=0
virtual DString trDictionaryDocumentation()=0
virtual DString trProtectedAttribs()=0
virtual DString trDesignUnitMembers()=0
virtual DString trConstantGroups()=0
virtual DString trExceptionListDescription()=0
virtual DString trProperties()=0
virtual DString trRelatedPagesDescription()=0
virtual DString trDesignUnitList()=0
virtual DString trModulesMemberDescription(bool extractAll)=0
virtual DString trCompoundIndexFortran()=0
virtual DString trDataTypes()=0
virtual DString trCompoundListDescription()=0
virtual DString trConcept(bool first_capital, bool singular)=0
virtual DString trTopicListDescription()=0
virtual DString trDataMembers()=0
virtual DString trFileListDescription(bool extractAll)=0
virtual DString trClassHierarchyDescription()=0
virtual DString trSliceInterfaces()=0
virtual DString trConceptListDescription(bool extractAll)=0
virtual DString trFunctionDocumentation()=0
virtual DString trSubprograms()=0
virtual DString trMemberFunctionDocumentationFortran()=0
virtual DString trMemberFunctionDocumentation()=0
virtual DString trCompoundListFortran()=0
virtual DString trPackageFunctions()=0
virtual DString trPackages()=0
virtual DString trPrivateMembers()=0
virtual DString trPackageListDescription()=0
virtual DString trConstantDocumentation()=0
virtual DString trPublicTypes()=0
virtual DString trVariables()=0
virtual DString trStaticPublicMembers()=0
virtual DString trMethodDocumentation()=0
virtual DString trEnumerationValues()=0
virtual DString trRelatedSymbolsSubscript()=0
virtual DString trStaticPublicAttribs()=0
virtual DString trModulesListDescription(bool extractAll)=0
virtual DString trServices()=0
virtual DString trStructList()=0
virtual DString trNamespaceListDescription(bool extractAll)=0
virtual DString trSignals()=0
virtual DString trClassHierarchy()=0
virtual DString trPublicSlots()=0
virtual DString trCompoundIndex()=0
virtual DString trFile(bool first_capital, bool singular)=0
virtual DString trDesignUnitIndex()=0
virtual DString trConstants()=0
virtual DString trCompoundMembersDescription(bool extractAll)=0
virtual DString trEventDocumentation()=0
virtual DString trMainPage()=0
virtual DString trNamespaces()=0
virtual DString trCompoundMembersDescriptionFortran(bool extractAll)=0
virtual DString trMemberDataDocumentation()=0
virtual DString trEvents()=0
virtual DString trDictionaries()=0
virtual DString trStaticPackageFunctions()=0
virtual DString trExamples()=0
virtual DString trStaticPrivateMembers()=0
Event handlers that can installed by the client and called while parsing a XML document.
Definition xml.h:27
std::unordered_map< std::string, std::string > Attributes
Definition xml.h:29
std::function< EndElementType > endElement
handler invoked when a closing tag has been found
Definition xml.h:40
std::function< StartElementType > startElement
handler invoked when an opening tag has been found
Definition xml.h:39
static std::string value(const Attributes &attrib, const std::string &key)
Definition xml.h:44
std::function< ErrorType > error
handler invoked when the parser encounters an error
Definition xml.h:42
virtual int lineNr() const =0
virtual std::string fileName() const =0
void parse(const char *fileName, const char *inputString, bool debugEnabled, std::function< void()> debugStart, std::function< void()> debugEnd, std::function< Transcode > transcoder=[](std::string &s, const char *){ return true;})
Definition xml.l:447
Class representing a regular expression.
Definition regex.h:39
Object representing the matching results.
Definition regex.h:154
#define Config_getBool(name)
Definition config.h:33
#define Config_getString(name)
Definition config.h:32
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
Definition docnode.h:1335
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:59
IDocNodeASTPtr createRef(IDocParser &parserIntf, const DString &target, const DString &context, const DString &srcFile, int srcLine)
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
Definition dstring.cpp:481
const char * qPrint(const char *s)
Definition dstring.h:787
Translator * theTranslator
Definition language.cpp:71
static void mergeNavTreeNodesRec(LayoutNavEntry *targetTree, LayoutNavEntry *sourceTree)
Definition layout.cpp:1556
static void mergeDocEntryLists(const DString &fileName, LayoutDocEntryList &targetList, LayoutDocEntryList &sourceList)
Definition layout.cpp:1639
static bool elemIsVisible(const XMLHandlers::Attributes &attrib, bool defVal=true)
Definition layout.cpp:80
DString extractLanguageSpecificTitle(const DString &input, SrcLangExt lang)
Definition layout.cpp:1757
static LayoutNavEntry * findNavEntryRec(LayoutNavEntry *root, const std::string &id)
Definition layout.cpp:1541
DString compileOptions(const DString &def)
Definition layout.cpp:36
void writeDefaultLayoutFile(const DString &fileName)
Definition layout.cpp:1733
void printLayout()
Definition layout.cpp:1821
static void printNavLayout(LayoutNavEntry *root, int indent)
Definition layout.cpp:1806
std::unique_ptr< LayoutDocEntry > LayoutDocEntryPtr
Definition layout.h:146
std::vector< LayoutDocEntryPtr > LayoutDocEntryList
Definition layout.h:147
#define msg(fmt,...)
Definition message.h:94
#define err(fmt,...)
Definition message.h:127
#define warn_layout(file, line, fmt,...)
Definition message.h:117
static auto startCb(void(LayoutParser::*fn)(Args...))
Definition layout.cpp:732
static const std::map< std::string, ElementCallbacks > g_elementHandlers
Definition layout.cpp:790
static auto endCb(void(LayoutParser::*fn)(Args...))
Definition layout.cpp:784
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Definition regex.cpp:858
Definition dstring.h:917
Kind
Definition layout.h:66
Represents of a member declaration list with configurable title and subtitle.
Definition layout.h:111
DString m_title
Definition layout.h:124
DString subtitle(SrcLangExt lang) const
Definition layout.cpp:1792
DString m_subscript
Definition layout.h:125
DString title(SrcLangExt lang) const
Definition layout.cpp:1787
Represents of a member definition list with configurable title.
Definition layout.h:131
DString m_title
Definition layout.h:142
DString title(SrcLangExt lang) const
Definition layout.cpp:1799
DString title(SrcLangExt lang) const
Definition layout.cpp:1780
DString m_title
Definition layout.h:106
Represents of a piece of a documentation page without configurable parts.
Definition layout.h:88
bool visible() const override
Definition layout.h:92
Base class for the layout of a navigation item at the top of the HTML pages.
Definition layout.h:155
bool m_visible
Definition layout.h:246
LayoutNavEntryList m_children
Definition layout.h:250
const LayoutNavEntryList & children() const
Definition layout.h:218
LayoutNavEntry * find(LayoutNavEntry::Kind k, const DString &file=DString()) const
Definition layout.cpp:134
std::string id() const
Definition layout.h:214
void updateVisibility(LayoutNavEntry *parent)
Definition layout.cpp:117
void appendChild(std::unique_ptr< LayoutNavEntry > &&e)
Definition layout.cpp:122
void insertChild(size_t pos, std::unique_ptr< LayoutNavEntry > &&e)
Definition layout.cpp:128
LayoutNavEntry * parent() const
Definition layout.h:211
DString title() const
Definition layout.h:215
DString url() const
Definition layout.cpp:152
DString baseFile() const
Definition layout.h:213
Kind kind() const
Definition layout.h:212
bool visible() const
Definition layout.h:221
LayoutNavEntry(LayoutNavEntry *parent, Kind k, bool vs, const DString &bf, const DString &tl, const DString &intro)
Definition layout.h:208
Kind
Definition layout.h:192
std::string navToString() const
Definition layout.h:197
std::function< void(LayoutParser &, const std::string &)> EndCallback
Definition layout.cpp:725
std::function< void(LayoutParser &, const std::string &, const XMLHandlers::Attributes &)> StartCallback
Definition layout.cpp:724
This file contains a number of basic enums and types.
SrcLangExt
Definition types.h:207
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
Recodes the input string from the given input encoding to UTF8.
Definition utf8.cpp:241
void addHtmlExtensionIfMissing(DString &fName)
Definition util.cpp:3933
DString fileToString(const DString &name, bool filter, bool isSourceCode)
Definition util.cpp:1055
DString externalRef(const DString &relPath, const DString &ref)
Definition util.cpp:4540
bool openOutputFile(const DString &outFile, std::ofstream &f)
Definition util.cpp:4973
A bunch of utility functions.