Doxygen
Loading...
Searching...
No Matches
layout.cpp File Reference
#include "layout.h"
#include <array>
#include "config.h"
#include "debug.h"
#include "docnode.h"
#include "docparser.h"
#include "language.h"
#include "message.h"
#include "regex.h"
#include "resourcemgr.h"
#include "textstream.h"
#include "types.h"
#include "util.h"
#include "version.h"
#include "xml.h"
Include dependency graph for layout.cpp:

Go to the source code of this file.

Classes

class  LayoutParser
struct  anonymous_namespace{layout.cpp}::ElementCallbacks
class  LayoutDocManager::Private

Namespaces

namespace  anonymous_namespace{layout.cpp}

Functions

DString compileOptions (const DString &def)
DString compileOptions (const DString &def, SrcLangExt langId1, const DString &value1)
DString compileOptions (const DString &def, SrcLangExt langId1, const DString &value1, SrcLangExt langId2, const DString &value2)
DString compileOptions (const DString &def, SrcLangExt langId1, const DString &value1, SrcLangExt langId2, const DString &value2, SrcLangExt langId3, const DString &value3)
DString compileOptions (const DString &def, SrcLangExt langId1, const DString &value1, SrcLangExt langId2, const DString &value2, SrcLangExt langId3, const DString &value3, SrcLangExt langId4, const DString &value4)
DString compileOptions (const DString &def, SrcLangExt langId1, const DString &value1, SrcLangExt langId2, const DString &value2, SrcLangExt langId3, const DString &value3, SrcLangExt langId4, const DString &value4, SrcLangExt langId5, const DString &value5)
static bool elemIsVisible (const XMLHandlers::Attributes &attrib, bool defVal=true)
template<class... Args>
static auto anonymous_namespace{layout.cpp}::startCb (void(LayoutParser::*fn)(Args...))
template<class... Args>
static auto anonymous_namespace{layout.cpp}::startCb (void(LayoutParser::*fn)(Args...), LayoutDocEntry::Kind kind)
template<class... Args>
static auto anonymous_namespace{layout.cpp}::startCb (void(LayoutParser::*fn)(Args...), LayoutDocEntry::Kind kind, const std::function< DString()> &title)
template<class... Args>
static auto anonymous_namespace{layout.cpp}::startCb (void(LayoutParser::*fn)(Args...), MemberListType type, const std::function< DString()> &title)
template<class... Args>
static auto anonymous_namespace{layout.cpp}::startCb (void(LayoutParser::*fn)(Args...), MemberListType type, const std::function< DString()> &title, const std::function< DString()> &subtitle)
template<class... Args>
static auto anonymous_namespace{layout.cpp}::startCb (void(LayoutParser::*fn)(Args...), LayoutDocManager::LayoutPart part, const DString &scope, LayoutNavEntry::Kind nav)
template<class... Args>
static auto anonymous_namespace{layout.cpp}::endCb (void(LayoutParser::*fn)(Args...))
static LayoutNavEntry * findNavEntryRec (LayoutNavEntry *root, const std::string &id)
static void mergeNavTreeNodesRec (LayoutNavEntry *targetTree, LayoutNavEntry *sourceTree)
static void mergeDocEntryLists (const DString &fileName, LayoutDocEntryList &targetList, LayoutDocEntryList &sourceList)
void writeDefaultLayoutFile (const DString &fileName)
DString extractLanguageSpecificTitle (const DString &input, SrcLangExt lang)
static void printNavLayout (LayoutNavEntry *root, int indent)
void printLayout ()

Variables

static const std::map< std::string, ElementCallbacks > anonymous_namespace{layout.cpp}::g_elementHandlers

Function Documentation

◆ compileOptions() [1/6]

DString compileOptions ( const DString & def)
inline

Definition at line 37 of file layout.cpp.

38{
39 return def;
40}

Referenced by compileOptions(), compileOptions(), compileOptions(), compileOptions(), and compileOptions().

◆ compileOptions() [2/6]

DString compileOptions ( const DString & def,
SrcLangExt langId1,
const DString & value1 )
inline

Definition at line 42 of file layout.cpp.

43{
44 return compileOptions(def)+"|"+DString().setNum(static_cast<long>(langId1))+"="+value1;
45}
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
DString & setNum(short n)
Definition dstring.h:552
DString compileOptions(const DString &def)
Definition layout.cpp:37

References compileOptions(), and DString::setNum().

◆ compileOptions() [3/6]

DString compileOptions ( const DString & def,
SrcLangExt langId1,
const DString & value1,
SrcLangExt langId2,
const DString & value2 )
inline

Definition at line 47 of file layout.cpp.

49{
50 return compileOptions(def,langId1,value1)+
51 "|"+DString().setNum(static_cast<long>(langId2))+"="+value2;
52}

References compileOptions(), and DString::setNum().

◆ compileOptions() [4/6]

DString compileOptions ( const DString & def,
SrcLangExt langId1,
const DString & value1,
SrcLangExt langId2,
const DString & value2,
SrcLangExt langId3,
const DString & value3 )
inline

Definition at line 54 of file layout.cpp.

57{
58 return compileOptions(def,langId1,value1,langId2,value2)+
59 "|"+DString().setNum(static_cast<long>(langId3))+"="+value3;
60}

References compileOptions(), and DString::setNum().

◆ compileOptions() [5/6]

DString compileOptions ( const DString & def,
SrcLangExt langId1,
const DString & value1,
SrcLangExt langId2,
const DString & value2,
SrcLangExt langId3,
const DString & value3,
SrcLangExt langId4,
const DString & value4 )
inline

Definition at line 62 of file layout.cpp.

66{
67 return compileOptions(def,langId1,value1,langId2,value2,langId3,value3)+
68 "|"+DString().setNum(static_cast<long>(langId4))+"="+value4;
69}

References compileOptions(), and DString::setNum().

◆ compileOptions() [6/6]

DString compileOptions ( const DString & def,
SrcLangExt langId1,
const DString & value1,
SrcLangExt langId2,
const DString & value2,
SrcLangExt langId3,
const DString & value3,
SrcLangExt langId4,
const DString & value4,
SrcLangExt langId5,
const DString & value5 )
inline

Definition at line 71 of file layout.cpp.

76{
77 return compileOptions(def,langId1,value1,langId2,value2,langId3,value3,langId4,value4)+
78 "|"+DString().setNum(static_cast<long>(langId5))+"="+value5;
79}

References compileOptions(), and DString::setNum().

◆ elemIsVisible()

bool elemIsVisible ( const XMLHandlers::Attributes & attrib,
bool defVal = true )
static

Definition at line 81 of file layout.cpp.

82{
83 DString visible = XMLHandlers::value(attrib,"visible");
84 //printf("visible_attribute=%s\n",qPrint(visible));
85 if (visible.empty()) return defVal;
86 if (visible.at(0)=='$' && visible.length()>1)
87 {
88 DString id = visible.mid(1);
89 const ConfigValues::Info *opt = ConfigValues::instance().get(id);
90 if (opt && opt->type==ConfigValues::Info::Bool)
91 {
92 return ConfigValues::instance().*(opt->value.b);
93 }
94 else if (opt && opt->type==ConfigValues::Info::String)
95 {
96 return opt->getBooleanRepresentation();
97 }
98 else if (!opt)
99 {
100 err("found unsupported value '{}' for visible attribute in layout file, reverting to '{}'\n",
101 visible,(defVal?"yes":"no"));
102 return defVal;
103 }
104 }
105 DString visibleLow = visible.lower();
106 if (visibleLow=="no" || visibleLow=="false" || visibleLow=="0") return false;
107 else if (visibleLow=="yes" || visibleLow=="true" || visibleLow=="1") return true;
108 else
109 {
110 err("found unsupported value '{}' for visible attribute in layout file, reverting to '{}'\n",
111 visible,(defVal?"yes":"no"));
112 return defVal;
113 }
114}
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:318
DString lower() const
Definition dstring.h:326
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:686
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:151
static std::string value(const Attributes &attrib, const std::string &key)
Definition xml.h:44
#define err(fmt,...)
Definition message.h:127

References DString::at(), DString::empty(), err, DString::length(), DString::lower(), DString::mid(), and XMLHandlers::value().

Referenced by LayoutParser::startMemberDecl(), LayoutParser::startMemberDeclEntry(), LayoutParser::startMemberDef(), LayoutParser::startMemberDefEntry(), LayoutParser::startNavEntry(), LayoutParser::startSectionEntry(), LayoutParser::startSimpleEntry(), and LayoutParser::startTop().

◆ extractLanguageSpecificTitle()

DString extractLanguageSpecificTitle ( const DString & input,
SrcLangExt lang )

Definition at line 1770 of file layout.cpp.

1771{
1772 size_t s=0,e=input.find('|');
1773 if (e==DString::npos) return input; // simple title case
1774 size_t e1=e;
1775 while (e!=DString::npos) // look for 'number=title' pattern separated by '|'
1776 {
1777 s=e+1;
1778 e=input.find('|',s);
1779 size_t i=input.find('=',s);
1780 ASSERT(i!=DString::npos && i>s);
1781 SrcLangExt key= static_cast<SrcLangExt>(input.mid(s,i-s).toUInt());
1782 if (key==lang) // found matching key
1783 {
1784 if (e==DString::npos) e=input.length();
1785 return input.mid(i+1,e-i-1);
1786 }
1787 }
1788 return input.left(e1); // fallback, no explicit language key found
1789}
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:178
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
DString left(size_t len) const
Definition dstring.h:306
#define ASSERT(x)
Definition message.h:142
SrcLangExt
Definition types.h:207

References ASSERT, DString::find(), DString::left(), DString::length(), DString::mid(), and DString::npos.

Referenced by LayoutDocEntryMemberDecl::subtitle(), LayoutDocEntryMemberDecl::title(), LayoutDocEntryMemberDef::title(), and LayoutDocEntrySection::title().

◆ findNavEntryRec()

LayoutNavEntry * findNavEntryRec ( LayoutNavEntry * root,
const std::string & id )
static

Definition at line 1554 of file layout.cpp.

1555{
1556 if (root)
1557 {
1558 if (root->id()==id) return root;
1559 for (auto &child : root->children())
1560 {
1561 LayoutNavEntry *childNavEntry = findNavEntryRec(child.get(),id);
1562 if (childNavEntry) return childNavEntry;
1563 }
1564 }
1565 return nullptr;
1566}
static LayoutNavEntry * findNavEntryRec(LayoutNavEntry *root, const std::string &id)
Definition layout.cpp:1554
Base class for the layout of a navigation item at the top of the HTML pages.
Definition layout.h:155
const LayoutNavEntryList & children() const
Definition layout.h:219
std::string id() const
Definition layout.h:214

References LayoutNavEntry::children(), findNavEntryRec(), and LayoutNavEntry::id().

Referenced by findNavEntryRec(), and mergeNavTreeNodesRec().

◆ mergeDocEntryLists()

void mergeDocEntryLists ( const DString & fileName,
LayoutDocEntryList & targetList,
LayoutDocEntryList & sourceList )
static

Definition at line 1652 of file layout.cpp.

1653{
1654 using IdSet = std::unordered_set<std::string>;
1655 using IdMap = std::unordered_map<std::string,size_t>;
1656
1657 auto prepareSet = [](const LayoutDocEntryList &list, IdSet &set) {
1658 //size_t idx=0;
1659 for (const auto &e : list)
1660 {
1661 //printf("idx=%zu set(%s)\n",idx,qPrint(e->id()));
1662 set.insert(e->id());
1663 //idx++;
1664 }
1665 };
1666
1667 auto prepareMap = [](const LayoutDocEntryList &list, const IdSet &set, IdMap &map) {
1668 for (size_t i=0; i<list.size(); i++)
1669 {
1670 std::string id = list[i]->id();
1671 auto it = set.find(id);
1672 if (it != set.end())
1673 {
1674 //printf("map %s->%zu\n",qPrint(id),i);
1675 map[id]=i;
1676 }
1677 }
1678 };
1679
1680 IdSet sourceSet, targetSet;
1681 //printf("---- sourceSet\n");
1682 prepareSet(sourceList,sourceSet);
1683 //printf("---- targetSet\n");
1684 prepareSet(targetList,targetSet);
1685
1686 IdMap sourceMap, targetMap;
1687 //printf("---- targetMap\n");
1688 prepareMap(targetList,sourceSet,targetMap);
1689 //printf("---- sourceMap\n");
1690 prepareMap(sourceList,targetSet,sourceMap);
1691
1692 // calculate list of insertion positions in the target list for each id in the source list
1693 std::vector<size_t> insertionList;
1694 for (size_t i=0; i<sourceList.size(); i++)
1695 {
1696 std::string id = sourceList[i]->id();
1697 // If an id in the source list appears before a set of shared ids we want it also to
1698 // appear before these id in the target list. To do this find the lowest target index of all shared
1699 // ids that come after position i in the source list
1700 size_t minIdx = targetList.size();
1701 for (const auto &kv : sourceMap) // iterator over shared ids
1702 {
1703 if (i < kv.second) // i appears before this shared id
1704 {
1705 size_t idx = targetMap[kv.first]; // get the corresponding index in the target list
1706 //printf(" evaluating %s->%zu min=%zu\n",qPrint(kv.first),idx,minIdx);
1707 if (idx<minIdx) // update minimum
1708 {
1709 minIdx=idx;
1710 }
1711 }
1712 }
1713 //printf("insertion %s->%zu\n",qPrint(id),minIdx);
1714 insertionList.push_back(minIdx);
1715 }
1716
1717 // Insert the missing elements of the source list into the target list.
1718 // Work backwards so the calculated insertion points don't change due to insertions.
1719 size_t idx = sourceList.size()-1;
1720 for (auto it=insertionList.rbegin(); it!=insertionList.rend(); ++it, idx--)
1721 {
1722 std::string id = sourceList[idx]->id();
1723 //printf("idx=%zu entry %s\n",idx,qPrint(id));
1724 if (targetSet.find(id)==targetSet.end()) // need to add id
1725 {
1726 // for efficiency we move the elements from the source list to the target list, thus modifying the source list!
1727 //printf("--> insert at %zu before %s\n",*it,qPrint(*it<targetList.size()?targetList[*it]->id():"none"));
1728 warn_layout(fileName,1,"User defined layout misses entry '{}'. Using default value.",id);
1729 targetList.insert(targetList.begin()+*it, std::move(sourceList[idx]));
1730 }
1731 }
1732
1733}
std::vector< LayoutDocEntryPtr > LayoutDocEntryList
Definition layout.h:147
#define warn_layout(file, line, fmt,...)
Definition message.h:117

References warn_layout.

Referenced by LayoutDocManager::mergeDocEntries().

◆ mergeNavTreeNodesRec()

void mergeNavTreeNodesRec ( LayoutNavEntry * targetTree,
LayoutNavEntry * sourceTree )
static

Definition at line 1569 of file layout.cpp.

1570{
1571 using IdSet = std::unordered_set<std::string>;
1572 using IdMap = std::unordered_map<std::string,size_t>;
1573
1574 auto prepareSet = [](const LayoutNavEntry *tree, IdSet &set) {
1575 for (const auto &e : tree->children())
1576 {
1577 set.insert(e->id());
1578 }
1579 };
1580
1581 auto prepareMap = [](const LayoutNavEntry *tree, const IdSet &set, IdMap &map) {
1582 for (size_t i=0; i<tree->children().size(); i++)
1583 {
1584 std::string id = tree->children()[i]->id();
1585 auto it = set.find(id);
1586 if (it != set.end())
1587 {
1588 map[id]=i;
1589 }
1590 }
1591 };
1592
1593 IdSet sourceSet, targetSet;
1594 prepareSet(sourceTree,sourceSet);
1595 prepareSet(targetTree,targetSet);
1596
1597 IdMap sourceMap, targetMap;
1598 prepareMap(targetTree,sourceSet,targetMap);
1599 prepareMap(sourceTree,targetSet,sourceMap);
1600
1601 // calculate list of insertion positions in the target list for each id in the source list
1602 std::vector<size_t> insertionList;
1603 for (size_t i=0; i<sourceTree->children().size(); i++)
1604 {
1605 std::string id = sourceTree->children()[i]->id();
1606 // If an id in the source list appears before a set of shared ids we want it also to
1607 // appear before these id in the target list. To do this find the lowest target index of all shared
1608 // ids that come after position i in the source list
1609 size_t minIdx = targetTree->children().size();
1610 for (const auto &kv : sourceMap) // iterator over shared ids
1611 {
1612 if (i < kv.second) // i appears before this shared id
1613 {
1614 size_t idx = targetMap[kv.first]; // get the corresponding index in the target list
1615 if (idx<minIdx) // update minimum
1616 {
1617 minIdx=idx;
1618 }
1619 }
1620 }
1621 insertionList.push_back(minIdx);
1622 }
1623
1624 // Insert the missing elements of the source list into the target list.
1625 // Work backwards so the calculated insertion points don't change due to insertions.
1626 size_t idx = sourceTree->children().size()-1;
1627 for (auto it=insertionList.rbegin(); it!=insertionList.rend(); ++it, idx--)
1628 {
1629 std::string id = sourceTree->children()[idx]->id();
1630 if (targetSet.find(id)==targetSet.end()) // need to add id
1631 {
1632 // for efficiency we move the elements from the source list to the target list, thus modifying the source list!
1633 targetTree->insertChild(*it, std::move(sourceTree->children()[idx]));
1634 }
1635 }
1636
1637 for (auto &targetChild : targetTree->children())
1638 {
1639 auto *node = findNavEntryRec(sourceTree,targetChild->id());
1640 if (node)
1641 {
1642 mergeNavTreeNodesRec(targetChild.get(),node);
1643 }
1644 }
1645}
static void mergeNavTreeNodesRec(LayoutNavEntry *targetTree, LayoutNavEntry *sourceTree)
Definition layout.cpp:1569
void insertChild(size_t pos, std::unique_ptr< LayoutNavEntry > &&e)
Definition layout.cpp:129

References LayoutNavEntry::children(), findNavEntryRec(), LayoutNavEntry::id(), LayoutNavEntry::insertChild(), and mergeNavTreeNodesRec().

Referenced by LayoutDocManager::mergeNavEntries(), and mergeNavTreeNodesRec().

◆ printLayout()

void printLayout ( )

Definition at line 1834 of file layout.cpp.

1835{
1836 bool extraIndent = false;
1837
1838 auto &mgr = LayoutDocManager::instance();
1839 Debug::print(Debug::Layout,0,"Layout version {}.{}\n",mgr.majorVersion(),mgr.minorVersion());
1840
1841 Debug::print(Debug::Layout,0,"Part: Navigation index\n");
1842 for (const auto &e : mgr.rootNavEntry()->children())
1843 {
1844 printNavLayout(e.get(),2);
1845 }
1846
1847 for (int i = 0; i < LayoutDocManager::NrParts; i++)
1848 {
1850 for (const auto &lde : mgr.docEntries(static_cast<LayoutDocManager::LayoutPart>(i)))
1851 {
1852 if (const LayoutDocEntrySimple *ldes = dynamic_cast<const LayoutDocEntrySimple*>(lde.get()))
1853 {
1854 if (lde->kind() == LayoutDocEntry::MemberDeclEnd || lde->kind() == LayoutDocEntry::MemberDefEnd) extraIndent = false;
1855 Debug::print(Debug::Layout,0," {}kind: {}, visible={}\n",
1856 extraIndent? " " : "",lde->entryToString(), ldes->visible());
1857 if (lde->kind() == LayoutDocEntry::MemberDeclStart || lde->kind() == LayoutDocEntry::MemberDefStart) extraIndent = true;
1858 }
1859 else if (const LayoutDocEntryMemberDecl *lmdecl = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get()))
1860 {
1861 Debug::print(Debug::Layout,0," {}complex kind: {}, visible={}, type: {}\n",
1862 extraIndent? " " : "",lde->entryToString(),lmdecl->visible(),lmdecl->type.to_string());
1863 }
1864 else if (const LayoutDocEntryMemberDef *lmdef = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get()))
1865 {
1866 Debug::print(Debug::Layout,0," {}complex kind: {}, visible={}, type: {}\n",
1867 extraIndent? " " : "",lde->entryToString(),lmdef->visible(),lmdef->type.to_string());
1868 }
1869 else
1870 {
1871 // should not happen
1872 Debug::print(Debug::Layout,0," {}not handled kind: {}\n",extraIndent? " " : "",lde->entryToString());
1873 }
1874 }
1875 }
1876}
@ Layout
Definition debug.h:51
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:78
static std::string partToString(int k)
Definition layout.h:272
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1449
static void printNavLayout(LayoutNavEntry *root, int indent)
Definition layout.cpp:1819
Represents of a member declaration list with configurable title and subtitle.
Definition layout.h:111
Represents of a member definition list with configurable title.
Definition layout.h:131
Represents of a piece of a documentation page without configurable parts.
Definition layout.h:88

References LayoutDocManager::instance(), Debug::Layout, LayoutDocManager::partToString(), Debug::print(), and printNavLayout().

Referenced by LayoutDocManager::LayoutParser, and parseInput().

◆ printNavLayout()

void printNavLayout ( LayoutNavEntry * root,
int indent )
static

Definition at line 1819 of file layout.cpp.

1820{
1822 {
1823 DString indentStr;
1824 indentStr.fill(' ',indent);
1825 Debug::print(Debug::Layout,0,"{}kind={} visible={} title='{}'\n",
1826 indentStr, root->navToString(), root->visible(), root->title());
1827 for (const auto &e : root->children())
1828 {
1829 printNavLayout(e.get(),indent+2);
1830 }
1831 }
1832}
DString fill(char c, size_t len)
Fills a string with a predefined character.
Definition dstring.h:278
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:132
DString title() const
Definition layout.cpp:194
bool visible() const
Definition layout.h:222
std::string navToString() const
Definition layout.h:197

References LayoutNavEntry::children(), DString::fill(), Debug::isFlagSet(), Debug::Layout, LayoutNavEntry::navToString(), Debug::print(), printNavLayout(), LayoutNavEntry::title(), and LayoutNavEntry::visible().

Referenced by printLayout(), and printNavLayout().

◆ writeDefaultLayoutFile()

void writeDefaultLayoutFile ( const DString & fileName)

Definition at line 1746 of file layout.cpp.

1747{
1748 std::ofstream f;
1749 if (openOutputFile(fileName,f))
1750 {
1751 TextStream t(&f);
1752 DString layout_default = ResourceMgr::instance().getAsString("layout_default.xml");
1753 t << substitute(layout_default,"$doxygenversion",getDoxygenVersion());
1754 }
1755 else
1756 {
1757 err("Failed to open file {} for writing!\n",fileName);
1758 return;
1759 }
1760 f.close();
1761}
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
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
Definition dstring.cpp:485
bool openOutputFile(const DString &outFile, std::ofstream &f)
Definition util.cpp:4996

References err, ResourceMgr::getAsString(), ResourceMgr::instance(), openOutputFile(), and substitute().

Referenced by LayoutDocManager::LayoutParser, and readConfiguration().