64static constexpr auto hex=
"0123456789ABCDEF";
72 t <<
" <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
73 t <<
" <span class=\"left\">\n";
74 t <<
" <span id=\"MSearchSelect\" class=\"search-icon\">";
75 t <<
"<span class=\"search-icon-dropdown\"></span></span>\n";
76 t <<
" <input type=\"text\" id=\"MSearchField\" value=\"\" placeholder=\""
78 t <<
" </span><span class=\"right\">\n";
79 t <<
" <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
80 <<
"<div id=\"MSearchCloseImg\" class=\"close-icon\"></div></a>\n";
90 t <<
" <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
91 t <<
" <div class=\"left\">\n";
92 t <<
" <form id=\"FSearchBox\" action=\"" << relPath;
101 t <<
"\" method=\"get\">\n";
102 t <<
" <span id=\"MSearchSelectExt\" class=\"search-icon\"></span>\n";
105 t <<
" <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" placeholder=\""
108 t <<
" </div><div class=\"right\"></div>\n";
139 if (macrofile.
empty())
return "";
145 const char *data = s.
data();
154 while (i < size && (data[i] ==
' ' || data[i] ==
'\t' || data[i] ==
'\n'))
156 if (data[i] ==
'\n') line++;
159 if (i >= size)
break;
163 warn(macrofile,line,
"file contains non valid code, expected '\\' got '{:c}'",data[i]);
169 i += strlen(
"newcommand");
173 i += strlen(
"renewcommand");
177 warn(macrofile,line,
"file contains non valid code, expected 'newcommand' or 'renewcommand'");
183 warn(macrofile,line,
"file contains non valid code, expected '{{' got '{:c}'",data[i]);
189 warn(macrofile,line,
"file contains non valid code, expected '\\' got '{:c}'",data[i]);
195 while (i < size && (data[i] !=
'}')) result+=data[i++];
198 warn(macrofile,line,
"file contains non valid code, no closing '}}' for command");
210 while (i < size && (data[i] !=
']')) nr += data[i++];
213 warn(macrofile,line,
"file contains non valid code, no closing ']'");
218 else if (data[i] !=
'{')
220 warn(macrofile,line,
"file contains non valid code, expected '[' or '{{' got '{:c}'",data[i]);
227 warn(macrofile,line,
"file contains non valid code, expected '{{' got '{:c}'",data[i]);
234 while (i < size && cnt)
246 else if (data[i] !=
'"') result+=data[i++];
254 if (cnt) result+=data[i];
272 warn(macrofile,line,
"file contains non valid code, no closing '}}' for replacement");
306 bool isSource =
false)
327 bool hasProjectName = !projectName.
empty();
334 bool hasCookie = treeView || searchEngine ||
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE;
335 static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
340 cssFile =
"doxygen.css";
353 cssFile =
"doxygen.css";
360 for (
const auto &fileName : extraCssFile)
362 if (!fileName.empty())
364 DString htmlStyleSheet = fileName;
367 extraCssText +=
"<link href=\""+htmlStyleSheet+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
374 extraCssText +=
"<link href=\"$relpath^"+
stripPath(fileName)+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
382 case TIMESTAMP_t::NO:
392 treeViewCssJs =
"<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
393 "<script type=\"text/javascript\" src=\"$relpath^navtreedata.js\"></script>\n"
394 "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n";
399 searchCssJs =
"<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
400 if (!serverBasedSearch)
402 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/searchdata.js\"></script>\n";
406 searchCssJs +=
"<style type=\"text/css\">\n"
408 " font-family: 'Material Symbols Outlined';\n"
409 " font-style: normal;\n"
410 " font-weight: 400;\n"
411 " src: url($relpath^MaterialSymbolsOutlined.min.woff2) format('woff2');\n"
413 ".material-symbols-outlined {\n"
414 " font-family: 'Material Symbols Outlined';\n"
415 " font-weight: normal;\n"
416 " font-style: normal;\n"
417 " font-size: 24px;\n"
419 " letter-spacing: normal;\n"
420 " text-transform: none;\n"
421 " display: inline-block;\n"
422 " white-space: nowrap;\n"
423 " word-wrap: normal;\n"
425 " -moz-font-feature-settings: 'liga';\n"
426 " -moz-osx-font-smoothing: grayscale;\n"
430 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n";
432 if (!serverBasedSearch)
438 searchCssJs +=
"<link rel=\"search\" href=\"" + relPath +
439 "search_opensearch.php?v=opensearch.xml\" "
440 "type=\"application/opensearchdescription+xml\" title=\"" +
441 (hasProjectName ? projectName :
DString(
"Doxygen")) +
445 searchBox =
getSearchBox(serverBasedSearch, relPath,
false);
448 if (mathJax && !isSource)
457 auto writeMathJax3Packages = [&mathJaxJs](
const StringVector &mathJaxExtensions)
459 mathJaxJs +=
" packages: ['base','configmacros'";
462 mathJaxJs+=
",'newcommand'";
464 for (
const auto &s : mathJaxExtensions)
466 mathJaxJs+=
",'"+s+
"'";
471 auto writeMathJax4Packages = [&mathJaxJs](
const StringVector &mathJaxExtensions)
473 mathJaxJs +=
" packages: {\n";
475 for (
const auto &s : mathJaxExtensions)
477 if (!first) mathJaxJs+=
",";
480 mathJaxJs+=
"\n '[-]': ['";
481 mathJaxJs+=s.
data()+1;
486 mathJaxJs+=
"\n '[+]': ['"+s+
"']";
490 mathJaxJs +=
"\n }\n";
493 auto writeMathJaxScript = [&path,&mathJaxJs](
const DString &pathPostfix,
497 mathJaxJs +=
"<script type=\"text/javascript\">\n"
498 "window.MathJax = {\n"
500 " ignoreHtmlClass: 'tex2jax_ignore',\n"
501 " processHtmlClass: 'tex2jax_process'\n"
508 if (!mathJaxExtensions.empty())
511 mathJaxJs+=
" loader: {\n"
513 for (
const auto &s : mathJaxExtensions)
517 if (!first) mathJaxJs+=
",";
518 mathJaxJs+=
"'[tex]/"+s+
"'";
525 mathJaxJs+=
" tex: {\n"
532 writePackages(mathJaxExtensions);
546 mathJaxJs+=
"</script>\n";
547 mathJaxJs +=
"<script type=\"text/javascript\" id=\"MathJax-script\" async=\"async\" src=\"" +
548 path + pathPostfix +
"tex-" + mathJaxFormat.
lower() +
".js\">";
549 mathJaxJs+=
"</script>\n";
552 switch (mathJaxVersion)
554 case MATHJAX_VERSION_t::MathJax_4:
555 writeMathJaxScript(
"",writeMathJax4Packages);
557 case MATHJAX_VERSION_t::MathJax_3:
558 writeMathJaxScript(
"es5/",writeMathJax3Packages);
560 case MATHJAX_VERSION_t::MathJax_2:
563 mathJaxJs =
"<script type=\"text/x-mathjax-config\">\n"
564 "MathJax.Hub.Config({\n"
565 " extensions: [\"tex2jax.js\"";
567 for (
const auto &s : mathJaxExtensions)
569 mathJaxJs+=
", \""+
DString(s)+
".js\"";
571 if (mathJaxFormat.
empty())
573 mathJaxFormat =
"HTML-CSS";
576 " jax: [\"input/TeX\",\"output/"+mathJaxFormat+
"\"],\n";
579 mathJaxJs +=
" TeX: { Macros: {\n";
584 mathJaxJs +=
"});\n";
590 mathJaxJs +=
"</script>\n";
591 mathJaxJs +=
"<script type=\"text/javascript\" async=\"async\" src=\"" + path +
"MathJax.js\"></script>\n";
600 darkModeJs=
"<script type=\"text/javascript\" src=\"$relpath^darkmode_toggle.js\"></script>\n";
606 mermaidJs =
"<script type=\"module\">\n"
607 "import mermaid from '" + mermaidJsUrl +
"';\n";
610 case HTML_COLORSTYLE_t::LIGHT:
611 mermaidJs +=
"const theme = 'default';\n";
613 case HTML_COLORSTYLE_t::DARK:
614 mermaidJs +=
"const theme = 'dark';\n";
616 case HTML_COLORSTYLE_t::AUTO_LIGHT:
617 case HTML_COLORSTYLE_t::AUTO_DARK:
618 mermaidJs +=
"const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'default';\n";
620 case HTML_COLORSTYLE_t::TOGGLE:
621 mermaidJs +=
"const theme = DarkModeToggle.darkModeEnabled ? 'dark' : 'default'\n";
624 mermaidJs +=
"mermaid.initialize({ startOnLoad: true, theme: theme });\n";
629 " const elementCode = '.mermaid';\n"
630 " const loadMermaid = function(theme) {\n"
631 " mermaid.initialize({theme})\n"
632 " mermaid.init({theme}, document.querySelectorAll(elementCode))\n"
634 " const saveOriginalData = function() {\n"
635 " return new Promise((resolve, reject) => {\n"
637 " var els = document.querySelectorAll(elementCode), count = els.length;\n"
638 " els.forEach(element => {\n"
639 " element.setAttribute('data-original-code', element.innerHTML)\n"
641 " if (count == 0) { resolve() }\n"
643 " } catch (error) { reject(error) }\n"
646 " const resetProcessed = function(){\n"
647 " return new Promise((resolve, reject) => {\n"
649 " var els = document.querySelectorAll(elementCode), count = els.length;\n"
650 " els.forEach(element => {\n"
651 " if (element.getAttribute('data-original-code') != null) {\n"
652 " element.removeAttribute('data-processed')\n"
653 " element.innerHTML = element.getAttribute('data-original-code')\n"
656 " if(count == 0) { resolve() }\n"
658 " } catch (error) { reject(error) }\n"
661 " saveOriginalData()\n"
662 " const original = DarkModeToggle.enableDarkMode.bind(DarkModeToggle);\n"
663 " DarkModeToggle.enableDarkMode = function(enable) {\n"
664 " original(enable);\n"
665 " resetProcessed().then(loadMermaid(enable ? 'dark' : 'default')).catch(console.error)\n"
669 mermaidJs +=
"</script>\n";
674 treeViewCssJs+=
"<script type=\"text/javascript\" src=\"$relpath^cookie.js\"></script>\n";
683 {
"$title", [&]() {
return !title.
empty() ? title : projName; } },
684 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
685 {
"$projectname", [&]() {
return projName; } },
695 {
"$datetime", [&]() ->
DString {
return "<span class=\"datetime\"></span>"; } },
696 {
"$date", [&]() ->
DString {
return "<span class=\"date\"></span>"; } },
697 {
"$time", [&]() ->
DString {
return "<span class=\"time\"></span>"; } },
698 {
"$year", [&]() ->
DString {
return "<span class=\"year\"></span>"; } },
699 {
"$navpath", [&]() ->
DString {
return navPath; } },
700 {
"$stylesheet", [&]() ->
DString {
return cssFile; } },
701 {
"$treeview", [&]() ->
DString {
return treeViewCssJs; } },
702 {
"$searchbox", [&]() ->
DString {
return searchBox; } },
703 {
"$search", [&]() ->
DString {
return searchCssJs; } },
704 {
"$mathjax", [&]() ->
DString {
return mathJaxJs; } },
705 {
"$mermaidjs", [&]() ->
DString {
return mermaidJs; } },
706 {
"$darkmode", [&]() ->
DString {
return darkModeJs; } },
707 {
"$generatedby", [&]() ->
DString {
return generatedBy; } },
708 {
"$extrastylesheet",[&]() ->
DString {
return extraCssText; } },
709 {
"$relpath$", [&]() ->
DString {
return relPath; } }
712 result =
substitute(result,
"$relpath^",relPath);
718 {
"FULL_SIDEBAR", hasFullSideBar },
719 {
"DISABLE_INDEX", disableIndex },
720 {
"GENERATE_TREEVIEW", treeView },
721 {
"SEARCHENGINE", searchEngine },
722 {
"TITLEAREA", titleArea },
723 {
"PROJECT_NAME", hasProjectName },
724 {
"PROJECT_NUMBER", hasProjectNumber },
725 {
"PROJECT_BRIEF", hasProjectBrief },
726 {
"PROJECT_LOGO", hasProjectLogo },
727 {
"PROJECT_ICON", hasProjectIcon },
728 {
"COPY_CLIPBOARD", hasCopyClipboard },
729 {
"HTML_CODE_FOLDING", codeFolding },
730 {
"HTML_DYNAMIC_SECTIONS", dynamicSections},
751 size_t separator = line.
find(
':');
753 std::string key = line.
left(separator).
str();
754 size_t semi = line.
rfind(
';');
757 map.emplace(key,value);
768 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
772 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
787 result+=input.
mid(p,i-p);
788 size_t j=input.
find(
")",i+4);
790 auto it = mapping.find(input.
mid(i+4,j-i-4).
str());
791 if (it==mapping.end())
793 err(
"failed to find value variable {}. It is not longer defined in doxygen.css\n",input.
mid(i+4,j-i-4));
807 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
811 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
847 const char *p=str.
data();
860 int spacesToNextTabStop = tabSize - (
m_col%tabSize);
861 while (spacesToNextTabStop--)
880 case '\'': *
m_t <<
"'";
m_col++;
882 case '"': *
m_t <<
""";
m_col++;
886 { *
m_t <<
"<"; p++; }
888 { *
m_t <<
">"; p++; }
890 { *
m_t <<
"\\‍[";
m_col++;p++; }
892 { *
m_t <<
"\\‍]";
m_col++;p++; }
894 { *
m_t <<
"\\‍(";
m_col++;p++; }
896 { *
m_t <<
"\\‍)";
m_col++;p++; }
903 uint8_t uc =
static_cast<uint8_t
>(c);
906 *
m_t <<
"$" <<
hex[uc>>4] <<
hex[uc&0xF] <<
";";
950 const DString &anchor,
int l,
bool writeLineAnchor)
954 const int maxLineNrStr = 10;
955 char lineNumber[maxLineNrStr];
956 char lineAnchor[maxLineNrStr];
957 snprintf(lineNumber,maxLineNrStr,
"%5d",l);
958 snprintf(lineAnchor,maxLineNrStr,
"l%05d",l);
963 *
m_t <<
"<div class=\"line\">";
967 if (writeLineAnchor) *
m_t <<
"<a id=\"" << lineAnchor <<
"\" name=\"" << lineAnchor <<
"\"></a>";
968 *
m_t <<
"<span class=\"lineno\">";
969 if (!filename.
empty())
1006 *
m_t <<
"<a class=\"" << className <<
"Ref\" ";
1011 *
m_t <<
"<a class=\"" << className <<
"\" ";
1031 *
m_t <<
"<div class=\"ttc\" id=\"" <<
id <<
"\">";
1032 *
m_t <<
"<div class=\"ttname\">";
1035 *
m_t <<
"<a href=\"";
1051 *
m_t <<
"<div class=\"ttdeci\">";
1058 *
m_t <<
"<div class=\"ttdoc\">";
1068 *
m_t <<
"<a href=\"";
1087 *
m_t <<
"<a href=\"";
1112 *
m_t <<
"<div class=\"line\">";
1136 *
m_t <<
"<span class=\"" << s <<
"\">";
1148 *
m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1153 *
m_t <<
"<div class=\"fragment\">";
1165 *
m_t <<
"</div><!-- fragment -->";
1175 const int maxLineNrStr = 10;
1176 char lineNumber[maxLineNrStr];
1177 snprintf(lineNumber,maxLineNrStr,
"%05d",lineNr);
1178 *
m_t <<
"<div class=\"foldopen\" id=\"foldopen" << lineNumber <<
1179 "\" data-start=\"" << startMarker <<
1180 "\" data-end=\"" << endMarker <<
1184 *
m_t <<
"<div class=\"line\">";
1192 *
m_t <<
"<div class=\"line\">";
1268 return (str.
contains(
"$datetime",
false) ||
1281 term(
"Could not create output directory {}\n",dname);
1448 mgr.
copyResource(
"MaterialSymbolsOutlined.min.woff2",dname);
1450 mgr.
copyResource(
"MaterialSymbolsOutlined_LICENSE.txt",dname);
1461 DString searchDirName = dname;
1471 searchCss = mgr.
getAsString(
"search_sidebar.css");
1477 searchCss = mgr.
getAsString(
"search_nomenu_toggle.css");
1486 searchCss = mgr.
getAsString(
"search_fixedtabs.css");
1493 searchCss += mgr.
getAsString(
"search_common.css");
1494 searchCss =
substitute(searchCss,
"$doxygenversion",getDoxygenVersion());
1502 t <<
"/* The standard CSS for doxygen " << getDoxygenVersion() <<
"*/\n\n";
1505 case HTML_COLORSTYLE_t::LIGHT:
1506 case HTML_COLORSTYLE_t::DARK:
1509 case HTML_COLORSTYLE_t::AUTO_LIGHT:
1510 case HTML_COLORSTYLE_t::TOGGLE:
1515 case HTML_COLORSTYLE_t::AUTO_DARK:
1521 if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_LIGHT)
1523 t <<
"@media (prefers-color-scheme: dark) {\n";
1524 t <<
" html:not(.dark-mode) {\n";
1525 t <<
" color-scheme: dark;\n\n";
1529 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_DARK)
1531 t <<
"@media (prefers-color-scheme: light) {\n";
1532 t <<
" html:not(.light-mode) {\n";
1533 t <<
" color-scheme: light;\n\n";
1537 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
1539 t <<
"html.dark-mode {\n";
1550 " border-bottom: none;\n"
1551 " background-color: var(--nav-background-color);\n"
1552 " border-right: 1px solid var(--nav-border-color);\n"
1567 case TIMESTAMP_t::YES:
1568 case TIMESTAMP_t::DATETIME:
1571 case TIMESTAMP_t::DATE:
1577 t <<
"--timestamp: '" << timeStampStr <<
"';\n";
1590 t <<
"span.timestamp { content: ' '; }\n";
1591 t <<
"span.timestamp:before { content: var(--timestamp); }\n\n";
1595 t <<
"span.datetime { content: ' '; }\n";
1596 t <<
"span.datetime:before { content: var(--datetime); }\n\n";
1597 t <<
"span.date { content: ' '; }\n";
1598 t <<
"span.date:before { content: var(--date); }\n\n";
1599 t <<
"span.time { content: ' '; }\n";
1600 t <<
"span.time:before { content: var(--time); }\n\n";
1601 t <<
"span.year { content: ' '; }\n";
1602 t <<
"span.year:before { content: var(--year); }\n\n";
1609 bool addScrollbarStyling =
Config_getList(HTML_EXTRA_STYLESHEET).empty();
1610 if (addScrollbarStyling)
1625 t <<
"<!-- HTML header for doxygen " << getDoxygenVersion() <<
"-->\n";
1631 t <<
"<!-- HTML footer for doxygen " << getDoxygenVersion() <<
"-->\n";
1638 const DString &title,
int ,
int )
1658 << getDoxygenVersion() <<
" -->\n";
1662 m_t <<
"<script type=\"text/javascript\">\n";
1663 m_t <<
"let searchBox = new SearchBox(\"searchBox\", \""
1665 m_t <<
"</script>\n";
1669 m_t <<
"<script type=\"text/javascript\">\n";
1670 m_t <<
"document.addEventListener('DOMContentLoaded', codefold.init);\n";
1671 m_t <<
"</script>\n";
1680 if (searchEngine && !serverBasedSearch)
1682 t <<
"<!-- window showing the filter options -->\n";
1683 t <<
"<div id=\"MSearchSelectWindow\">\n";
1686 t <<
"<!-- iframe showing the search results (closed by default) -->\n";
1687 t <<
"<div id=\"MSearchResultsWindow\">\n";
1688 t <<
"<div id=\"MSearchResults\">\n";
1689 t <<
"<div class=\"SRPage\">\n";
1690 t <<
"<div id=\"SRIndex\">\n";
1691 t <<
"<div id=\"SRResults\"></div>\n";
1714 case TIMESTAMP_t::NO:
1722 result +=
" \n<a href=\"https://www.doxygen.org/index.html\">\n"
1723 "<img class=\"footer\" src=\"";
1725 result +=
"doxygen.svg\" width=\"104\" height=\"31\" alt=\"doxygen\"/></a> ";
1726 result += getDoxygenVersion();
1754 m_t <<
"<h3 class=\"version\">";
1783 err(
"style sheet {} does not exist or is not readable!\n",
Config_getString(HTML_STYLESHEET));
1798 for (
const auto &
fileName : extraCssFiles)
1844 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1857 if (!classDef.
empty())
1858 m_t <<
"\n<p class=\"" << classDef <<
"\">";
1890 m_t <<
"<a class=\"elRef\" ";
1895 m_t <<
"<a class=\"el\" ";
1933 m_t <<
"<a class=\"el\" href=\"" << fn <<
"\">";
1943 m_t <<
"<a class=\"elRef\" ";
1948 m_t <<
"<a class=\"el\" ";
1964 m_t <<
"<a href=\"";
1981 if (extraIndentLevel==2)
1985 else if (extraIndentLevel==1)
1997 m_t <<
" class=\"groupheader\">";
2002 if (extraIndentLevel==2)
2006 else if (extraIndentLevel==1)
2027 default:
ASSERT(0);
break;
2029 m_t <<
"<a id=\"" << lab <<
"\" name=\"" << lab <<
"\"></a>";
2043 default:
ASSERT(0);
break;
2056 const char *p=str.
data();
2062 case '<':
m_t <<
"<";
break;
2063 case '>':
m_t <<
">";
break;
2064 case '&':
m_t <<
"&";
break;
2065 case '"':
m_t <<
""";
break;
2066 case '-':
if (inHtmlComment)
m_t <<
"-";
else m_t <<
"-";
break;
2069 {
m_t <<
"<"; p++; }
2071 {
m_t <<
">"; p++; }
2073 {
m_t <<
"\\‍["; p++; }
2075 {
m_t <<
"\\‍]"; p++; }
2077 {
m_t <<
"\\‍("; p++; }
2079 {
m_t <<
"\\‍)"; p++; }
2100 const DString &relPath,
int sectionCount)
2104 if (dynamicSections)
2106 t <<
"<div id=\"dynsection-" << sectionCount <<
"\" "
2107 "class=\"dynheader closed\">"
2108 "<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
2112 t <<
"<div class=\"dynheader\">\n";
2126 if (dynamicSections)
2128 t <<
"<div id=\"dynsection-" << sectionCount <<
"-summary\" "
2129 "class=\"dynsummary\">\n";
2137 if (dynamicSections)
2147 if (dynamicSections)
2149 t <<
"<div id=\"dynsection-" << sectionCount <<
"-content\" "
2150 "class=\"dyncontent hidden\">\n";
2154 t <<
"<div class=\"dyncontent\">\n";
2182 m_t <<
" <div class=\"center\">\n";
2183 m_t <<
" <img src=\"";
2185 m_t <<
"_map\" alt=\"\"/>\n";
2195 m_t <<
" <div class=\"center\">\n";
2196 m_t <<
" <img src=\"";
2225 m_t <<
"<table class=\"memberdecls\">\n";
2229 if (!inheritId.
empty())
2231 if (dynamicSections)
m_t <<
" inherit";
2232 m_t <<
" " << inheritId;
2235 if (!anchor.
empty())
2249 m_t <<
"</td></tr>\n";
2259 m_t <<
"</td></tr>\n";
2261 if (!inheritId.
empty())
2263 if (dynamicSections)
m_t <<
" inherit";
2264 m_t <<
" " << inheritId;
2266 m_t <<
" template\"><td class=\"memItemLeft\">";
2271 m_t <<
"<div class=\"compoundTemplParams\">";
2282 m_t <<
" </td><td class=\"memItemRight\">";
2287 if (!initTag)
m_t <<
" </td>";
2299 DBG_HTML(
m_t <<
"<!-- startMemberDescription -->\n")
2303 m_t <<
"<table class=\"memberdecls\">\n";
2306 m_t <<
"<tr class=\"memdesc:" << anchor;
2307 if (!inheritId.
empty())
2309 if (dynamicSections)
m_t <<
" inherit";
2310 m_t <<
" " << inheritId;
2313 m_t <<
"<td class=\"mdescLeft\"> </td>";
2314 if (typ)
m_t <<
"<td class=\"mdescLeft\"> </td>";
2315 m_t <<
"<td class=\"mdescRight\">";
2320 DBG_HTML(
m_t <<
"<!-- endMemberDescription -->\n")
2321 m_t <<
"<br /></td></tr>\n";
2337 m_t <<
"</table>\n";
2351 m_t <<
"<table class=\"memberdecls\">\n";
2354 m_t <<
"<tr class=\"heading\"><td colspan=\"" << typ <<
"\"><h2";
2355 if (!anchor.
empty())
2357 m_t <<
" id=\"header-" << anchor <<
"\"";
2359 m_t <<
" class=\"groupheader\">";
2360 if (!anchor.
empty())
2362 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>\n";
2369 m_t <<
"</h2></td></tr>\n";
2377 m_t <<
"<table class=\"memberdecls\">\n";
2380 m_t <<
"<tr><td class=\"ititle\" colspan=\"2\">";
2386 m_t <<
"</td></tr>\n";
2396 m_t <<
"</table>\n";
2431 int memCount,
int memTotal,
bool )
2434 m_t <<
"\n<h2 class=\"memtitle\">"
2435 <<
"<span class=\"permalink\"><a href=\"#" << anchor <<
"\">◆ </a></span>";
2439 m_t <<
" <span class=\"overload\">[" << memCount <<
"/" << memTotal <<
"]</span>";
2442 m_t <<
"\n<div class=\"memitem\">\n";
2443 m_t <<
"<div class=\"memproto\">\n";
2448 DBG_HTML(
m_t <<
"<!-- startMemberDocPrefixItem -->\n";)
2449 m_t <<
"<div class=\"memtemplate\">\n";
2454 DBG_HTML(
m_t <<
"<!-- endMemberDocPrefixItem -->\n";)
2462 m_t <<
" <table class=\"memname\">\n";
2465 m_t <<
" <td class=\"memname\">";
2478 if (openBracket)
m_t <<
"(";
2486 DBG_HTML(
m_t <<
"<!-- startFirstParameterType -->\n";)
2487 m_t <<
" <td class=\"paramtype\">";
2493 m_t <<
" <td class=\"paramkey\">" << key <<
"</td>\n";
2494 m_t <<
" <td></td>\n";
2495 m_t <<
" <td class=\"paramtype\">";
2508 m_t <<
" <td class=\"paramname\"><span class=\"paramname\"><em>";
2514 m_t <<
"</em></span>";
2519 DBG_HTML(
m_t <<
"<!-- startParameterExtra -->\n";)
2529 if (closeBracket)
m_t <<
"</td><td>)";
2536 if (closeBracket)
m_t <<
")";
2548 m_t <<
"<span class=\"paramdefsep\">";
2550 m_t <<
"</span><span class=\"paramdefval\">";
2573 m_t <<
" <td align=\"right\">";
2577 m_t <<
prefix <<
"</td><td>(</td><td colspan=\"2\">";
2578 else if (closeBracket)
2579 m_t <<
" )</td><td></td><td></td><td>";
2581 m_t <<
"</td><td></td><td colspan=\"2\">";
2591 m_t <<
" </table>\n";
2610 if (generateLegend && !umlLook)
2613 m_t <<
"<center><span class=\"legend\">[";
2616 if (generateTreeView)
m_t <<
"target=\"top\" ";
2622 m_t <<
"]</span></center>";
2708 m_t <<
"<tr id=\"" <<
id <<
"\" class=\"groupHeader\"><td colspan=\"2\"><div class=\"groupHeader\">";
2713 m_t <<
"</div></td></tr>\n";
2718 m_t <<
"<tr><td colspan=\"2\" class=\"ititle\"><div class=\"groupText\">";
2723 m_t <<
"</div></td></tr>\n";
2738 m_t <<
"<div class=\"memdoc\">\n";
2744 m_t <<
"\n</div>\n" <<
"</div>\n";
2753 for (
int i=0; i<n; i++)
2761 m_t <<
"<table class=\"fieldtable\">\n"
2762 <<
"<tr><th colspan=\"" << (hasInits?3:2) <<
"\">" << title <<
"</th></tr>";
2766 m_t <<
"</table>\n";
2781 m_t <<
"<td class=\"fieldname\">";
2786 m_t <<
" </td>";
2791 m_t <<
"<td class=\"fieldinit\">";
2796 m_t <<
" </td>";
2801 m_t <<
"<td class=\"fielddoc\">";
2811 m_t <<
"<dl class=\"section examples\"><dt>";
2828 std::visit(visitor,astImpl->
root);
2840 t <<
" <div id=\"navrow1\" class=\"tabs\">\n";
2844 t <<
" <div id=\"navrow2\" class=\"tabs2\">\n";
2846 t <<
" <ul class=\"tablist\">\n";
2874 t <<
" class=\"current\"";
2884 if (!l.
empty()) t <<
"</a>";
2895 case LayoutNavEntry::MainPage:
return true;
2896 case LayoutNavEntry::User:
return true;
2897 case LayoutNavEntry::UserGroup:
return true;
2898 case LayoutNavEntry::Pages:
return index.numIndexedPages()>0;
2899 case LayoutNavEntry::Topics:
return index.numDocumentedGroups()>0;
2900 case LayoutNavEntry::Modules:
return index.numDocumentedModules()>0;
2901 case LayoutNavEntry::ModuleList:
return index.numDocumentedModules()>0;
2903 case LayoutNavEntry::Namespaces:
return showNamespaces && index.numDocumentedNamespaces()>0;
2904 case LayoutNavEntry::NamespaceList:
return showNamespaces && index.numDocumentedNamespaces()>0;
2906 case LayoutNavEntry::Concepts:
return index.numDocumentedConcepts()>0;
2907 case LayoutNavEntry::Classes:
return index.numAnnotatedClasses()>0;
2908 case LayoutNavEntry::ClassList:
return index.numAnnotatedClasses()>0;
2909 case LayoutNavEntry::ClassIndex:
return index.numAnnotatedClasses()>0;
2910 case LayoutNavEntry::ClassHierarchy:
return index.numHierarchyClasses()>0;
2912 case LayoutNavEntry::Files:
return showFiles && index.numDocumentedFiles()>0;
2913 case LayoutNavEntry::FileList:
return showFiles && index.numDocumentedFiles()>0;
2916 case LayoutNavEntry::Interfaces:
return index.numAnnotatedInterfaces()>0;
2917 case LayoutNavEntry::InterfaceList:
return index.numAnnotatedInterfaces()>0;
2918 case LayoutNavEntry::InterfaceIndex:
return index.numAnnotatedInterfaces()>0;
2919 case LayoutNavEntry::InterfaceHierarchy:
return index.numHierarchyInterfaces()>0;
2920 case LayoutNavEntry::Structs:
return index.numAnnotatedStructs()>0;
2921 case LayoutNavEntry::StructList:
return index.numAnnotatedStructs()>0;
2922 case LayoutNavEntry::StructIndex:
return index.numAnnotatedStructs()>0;
2923 case LayoutNavEntry::Exceptions:
return index.numAnnotatedExceptions()>0;
2924 case LayoutNavEntry::ExceptionList:
return index.numAnnotatedExceptions()>0;
2925 case LayoutNavEntry::ExceptionIndex:
return index.numAnnotatedExceptions()>0;
2926 case LayoutNavEntry::ExceptionHierarchy:
return index.numHierarchyExceptions()>0;
2927 case LayoutNavEntry::None:
2928 ASSERT(kind != LayoutNavEntry::None);
2938 for (
const auto &entry : root->
children())
2945 for (
const auto &entry : root->
children())
2950 t <<
"<li><a href=\"" << relPath << url <<
"\"><span>";
2952 t <<
"</span></a>\n";
2965 bool highlightParent,
bool highlightSearch)
2988 entry.get()==hlEntry &&
2989 (!entry->children().empty() ||
2990 (entry->kind()==kind && !highlightParent)
3008 if (disableIndex || !generateTreeView || !fullSidebar)
3010 if (!serverBasedSearch)
3018 if (!highlightSearch)
3059 bool highlightParent=
false;
3087 highlightParent =
true;
break;
3089 highlightParent =
true;
break;
3091 highlightParent =
true;
break;
3093 highlightParent =
true;
break;
3095 highlightParent =
true;
break;
3097 highlightParent =
true;
break;
3099 highlightParent =
true;
break;
3101 highlightParent =
true;
break;
3106 t <<
"<script type=\"application/json\" id=\"doxygen-config\">\n";
3108 t <<
" \"relPath\": \"" << relPath <<
"\",\n";
3109 t <<
" \"generateTreeView\": " << (generateTreeView?
"true":
"false") <<
",\n";
3110 t <<
" \"searchEngine\": " << (searchEngine?
"true":
"false") <<
",\n";
3111 t <<
" \"serverBasedSearch\": " << (serverBasedSearch?
"true":
"false") <<
",\n";
3112 t <<
" \"disableIndex\": " << (disableIndex?
"true":
"false") <<
",\n";
3113 t <<
" \"dynamicMenus\": " << (dynamicMenus?
"true":
"false") <<
",\n";
3114 t <<
" \"fullSidebar\": " << (fullSidebar?
"true":
"false") <<
"\n";
3118 if (!disableIndex && dynamicMenus)
3127 searchPage =
"search.php";
3129 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menudata.js\"></script>\n";
3130 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menu.js\"></script>\n";
3131 t <<
"<div id=\"main-nav-mobile\">\n";
3132 if (searchEngine && !fullSidebar)
3134 t <<
"<div class=\"sm sm-dox\"><input id=\"main-menu-state\" type=\"checkbox\"/>\n";
3135 t <<
"<label class=\"main-menu-btn\" for=\"main-menu-state\">\n";
3136 t <<
"<span class=\"main-menu-btn-icon\"></span> Toggle main menu visibility</label>\n";
3137 t <<
"<span id=\"searchBoxPos1\">";
3141 t <<
"</div><!-- main-nav-mobile -->\n";
3142 t <<
"<div id=\"main-nav\">\n";
3143 t <<
" <ul class=\"sm sm-dox\" id=\"main-menu\">\n";
3144 t <<
" <li id=\"searchBoxPos2\">\n";
3145 if (searchEngine && !(generateTreeView && fullSidebar))
3151 t <<
"</div><!-- main-nav -->\n";
3153 else if (!disableIndex)
3157 if (!hlEntry && altKind!=LayoutNavEntry::None) { hlEntry=root->
find(altKind); kind=altKind; }
3160 highlightParent=
true;
3161 hlEntry = root->
children().front().get();
3162 if (hlEntry==
nullptr)
3167 if (kind==LayoutNavEntry::UserGroup)
3175 t <<
"<div id=\"main-nav\">\n";
3179 t <<
"</div><!-- main-nav -->\n";
3182 else if (!generateTreeView)
3186 if (generateTreeView && !disableIndex && fullSidebar && !extraTabs)
3188 t <<
"<div id=\"container\"><div id=\"doc-content\">\n";
3195 m_t <<
"</div><!-- top -->\n";
3196 if (!generateTreeView)
3198 m_t <<
"<div id=\"doc-content\">\n";
3207 if (generateTreeView)
3214 "<div id=\"side-nav\" class=\"ui-resizable side-nav-resizable\">\n");
3217 " <div id=\"nav-tree\">\n"
3218 " <div id=\"nav-tree-contents\">\n"
3219 " <div id=\"nav-sync\" class=\"sync\"></div>\n"
3222 " <div id=\"splitbar\" class=\"ui-resizable-handle\">\n"
3225 "<script type=\"text/javascript\">\n"
3226 "document.addEventListener('DOMContentLoaded',() => { initNavTree('" + fn +
"','" + relpath +
"','" + allMembersFile +
"'); });\n"
3230 result+=
"<div id=\"container\">\n<div id=\"doc-content\">\n";
3248 m_t <<
"<div class=\"contents\">\n";
3253 m_t <<
"</div><!-- contents -->\n";
3263 m_t <<
"</div><!-- PageDoc -->\n";
3277 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3282 DString configFileName = htmlOutput+
"/search_config.php";
3288 t <<
"$config = array(\n";
3289 t <<
" 'PROJECT_NAME' => \"" <<
convertToHtml(projectName) <<
"\",\n";
3290 t <<
" 'GENERATE_TREEVIEW' => " << (generateTreeView?
"true":
"false") <<
",\n";
3291 t <<
" 'DISABLE_INDEX' => " << (disableIndex?
"true":
"false") <<
",\n";
3292 t <<
" 'FULL_SIDEBAR' => " << (fullSidebar?
"true":
"false") <<
",\n";
3294 t <<
"$translator = array(\n";
3296 t <<
" 'search_results' => array(\n";
3321 << getDoxygenVersion() <<
" -->\n";
3322 t <<
"<script type=\"text/javascript\">\n";
3323 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3327 if (!disableIndex && !quickLinksAfterSplitbar)
3331 if (generateTreeView)
3333 t <<
"</div><!-- top -->\n";
3336 if (quickLinksAfterSplitbar)
3340 t <<
"<!-- generated -->\n";
3343 t <<
"require_once \"search_functions.php\";\n";
3348 if (generateTreeView)
3350 t <<
"</div><!-- doc-content -->\n";
3351 t <<
"</div><!-- container -->\n";
3358 DString scriptName = htmlOutput+
"/search/search.js";
3367 err(
"Failed to open file '{}' for writing...\n",scriptName);
3376 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3386 << getDoxygenVersion() <<
" -->\n";
3387 t <<
"<script type=\"text/javascript\">\n";
3388 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3392 if (!disableIndex && !quickLinksAfterSplitbar)
3396 if (generateTreeView)
3398 t <<
"</div><!-- top -->\n";
3401 if (quickLinksAfterSplitbar)
3406 t <<
"<div class=\"header\">\n";
3407 t <<
" <div class=\"headertitle\">\n";
3411 t <<
"<div class=\"contents\">\n";
3413 t <<
"<div id=\"searchresults\"></div>\n";
3416 if (generateTreeView)
3418 t <<
"</div><!-- doc-content -->\n";
3419 t <<
"</div><!-- container -->\n";
3427 DString scriptName = dname+
"/search/search.js";
3432 t <<
"const searchResultsText=["
3436 t <<
"const serverUrl=\"" <<
Config_getString(SEARCHENGINE_URL) <<
"\";\n";
3437 t <<
"const tagMap = {\n";
3441 for (
const auto &ml : extraSearchMappings)
3448 if (!tagName.
empty())
3450 if (!first) t <<
",\n";
3451 t <<
" \"" << tagName <<
"\": \"" << destName <<
"\"";
3456 if (!first) t <<
"\n";
3460 t <<
"document.addEventListener('DOMContentLoaded',() => {\n";
3461 t <<
" const query = trim(getURLParameter('query'));\n";
3462 t <<
" if (query) {\n";
3463 t <<
" searchFor(query,0,20);\n";
3465 t <<
" const results = document.getElementById('searchresults');\n";
3472 err(
"Failed to open file '{}' for writing...\n",scriptName);
3478 m_t <<
"<div class=\"typeconstraint\">\n";
3479 m_t <<
"<dl><dt><b>" << header <<
"</b></dt><dd>\n";
3480 m_t <<
"<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n";
3485 m_t <<
"<tr><td valign=\"top\"><em>";
3490 m_t <<
"</em></td>";
3495 m_t <<
"<td> :</td><td valign=\"top\"><em>";
3500 m_t <<
"</em></td>";
3505 m_t <<
"<td> ";
3510 m_t <<
"</td></tr>\n";
3515 m_t <<
"</table>\n";
3525 m_t <<
"<br class=\"" << style <<
"\" />\n";
3535 m_t <<
"<div class=\"header\">\n";
3540 m_t <<
" <div class=\"headertitle\">";
3552 m_t <<
"</div><!--header-->\n";
3559 m_t <<
"<table class=\"memberdecls memberdecls-inline\">\n";
3562 m_t <<
"<tr><th colspan=\"2\"><h3>";
3567 m_t <<
"</h3></th></tr>\n";
3572 DBG_HTML(
m_t <<
"<!-- startMemberDocSimple -->\n";)
3573 m_t <<
"<table class=\"fieldtable\">\n";
3574 m_t <<
"<tr><th colspan=\"" << (isEnum?
"2":
"3") <<
"\">";
3582 m_t <<
"</table>\n";
3587 DBG_HTML(
m_t <<
"<!-- startInlineMemberType -->\n";)
3588 m_t <<
"<tr><td class=\"fieldtype\">\n";
3593 DBG_HTML(
m_t <<
"<!-- endInlineMemberType -->\n";)
3599 DBG_HTML(
m_t <<
"<!-- startInlineMemberName -->\n";)
3600 m_t <<
"<td class=\"fieldname\">\n";
3605 DBG_HTML(
m_t <<
"<!-- endInlineMemberName -->\n";)
3611 DBG_HTML(
m_t <<
"<!-- startInlineMemberDoc -->\n";)
3612 m_t <<
"<td class=\"fielddoc\">\n";
3618 m_t <<
"</td></tr>\n";
3624 m_t <<
"<div class=\"embeddoc indent-" << indent <<
"\">";
3636 m_t <<
"<span class=\"mlabels\">";
3641 DBG_HTML(
m_t <<
"<!-- writeLabel(" << label <<
") -->\n";)
3643 auto convertLabelToClass = [](
const std::string &lab) {
3656 for (
size_t i=0; i<l; i++)
3658 char c = input.
at(i);
3659 if (
static_cast<signed char>(c)<0 || (c>=
'a' && c<=
'z') || c==
'_')
3664 else if (nmstart && (
static_cast<signed char>(c)<0 || (c>=
'a' && c<=
'z') || (c>=
'0' && c<=
'9') || c==
'_'))
3668 else if (nmstart && (c==
' ' || c==
'-'))
3676 m_t <<
"<span class=\"mlabel " << convertLabelToClass(label.
stripWhiteSpace().
str()) <<
"\">" << label <<
"</span>";
3690 DBG_HTML(
m_t <<
"<!-- writeInheritedSectionTitle -->\n";)
3698 classLink +=
" href=\"";
3703 classLink +=
"href=\"";
3708 classLink=classLink+fn+a;
3710 m_t <<
"<tr class=\"inherit_header " <<
id <<
"\">";
3711 if (dynamicSections)
3713 m_t <<
"<td colspan=\"2\" class=\"dyn-inherit\">";
3714 m_t <<
"<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
3718 m_t <<
"<td colspan=\"2\">";
3728 m_t <<
" <div class=\"summary\">\n";
3734 m_t <<
"<a href=\"";
3741 else if (!anchor.
empty())
3753 m_t <<
"<div id=\"page-nav\" class=\"page-nav-panel\">\n";
3754 m_t <<
"<div id=\"page-nav-resize-handle\"></div>\n";
3755 m_t <<
"<div id=\"page-nav-tree\">\n";
3756 m_t <<
"<div id=\"page-nav-contents\">\n";
3757 m_t <<
"</div><!-- page-nav-contents -->\n";
3758 m_t <<
"</div><!-- page-nav-tree -->\n";
3759 m_t <<
"</div><!-- page-nav -->\n";
3783 m_t <<
"<div class=\"toc\">";
3813 char cs[2] = {
static_cast<char>(
'0'+l+1), 0 };
3814 const char *empty = (l!=nextLevel-1) ?
" empty" :
"";
3833 char cs[2] = {
static_cast<char>(
'0'+nextLevel), 0 };
3838 m_t <<
"<a href=\"#"+label+
"\">";
Class representing a built-in class diagram.
void writeImage(TextStream &t, const DString &path, const DString &relPath, const DString &file, bool generateMap, bool toIndex) const
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
size_t rfind(char c, size_t pos=npos) const
DString mid(size_t index, size_t len=npos) const
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
char & at(size_t i)
Returns a reference to the character at index i.
DString & prepend(const char *s)
int contains(char c, bool cs=true) const
size_t find(char c, size_t pos=0) const
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
DString left(size_t len) const
const std::string & str() const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
bool startsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
The common base class of all entity definitions found in the sources.
Class representing a directory in the file system.
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
Class representing the abstract syntax tree of a documentation block.
Representation of an call graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
Representation of a class inheritance or dependency graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool TBRank=true, bool imageMap=true, int graphId=-1)
Representation of an directory dependency graph.
DString writeGraph(TextStream &out, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1, bool linkRelations=true)
Represents a graphical class hierarchy.
void writeGraph(TextStream &t, const DString &path, const DString &fileName)
Representation of a group collaboration graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
Representation of an include dependency graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
static PageLinkedMap * exampleLinkedMap
static IndexList * indexList
static DString htmlFileExtension
Minimal replacement for QFileInfo.
std::string fileName() const
std::string absFilePath() const
Generator for HTML code fragments.
void codify(const DString &text) override
void startSpecialComment() override
HtmlCodeGenerator(TextStream *t, const DString &relPath)
void endCodeLine() override
size_t m_stripIndentAmount
void writeCodeLink(CodeSymbolType type, const DString &ref, const DString &file, const DString &anchor, const DString &name, const DString &tooltip) override
void startCodeFragment(const DString &style) override
void startFold(int, const DString &, const DString &) override
void _writeCodeLink(const DString &className, const DString &ref, const DString &file, const DString &anchor, const DString &name, const DString &tooltip)
void startCodeLine(int) override
void setFileName(const DString fileName)
void startFontClass(const DString &s) override
void writeLineNumber(const DString &, const DString &, const DString &, int, bool) override
void setRelativePath(const DString &path)
void setStripIndentAmount(size_t amount) override
void endSpecialComment() override
void endFontClass() override
void writeCodeAnchor(const DString &anchor) override
void setTextStream(TextStream *t)
void writeTooltip(const DString &id, const DocLinkInfo &docInfo, const DString &decl, const DString &desc, const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo) override
void endCodeFragment(const DString &) override
void stripCodeComments(bool b) override
OutputType type() const override
Concrete visitor implementation for HTML output.
void startClassDiagram() override
void docify(const DString &text) override
static void writeSearchData(const DString &dir)
void startDescTable(const DString &title, const bool hasInits) override
void writeLogo() override
static DString getNavTreeCss()
void endParameterExtra(bool last, bool emptyList, bool closeBracket) override
void startTocEntry(const SectionInfo *si) override
void writeQuickLinks(HighlightedItem hli, const DString &file, bool extraTabs) override
void startInlineMemberName() override
void endDescTableInit() override
void startMemberGroupHeader(const DString &, bool) override
void startInlineMemberType() override
void endDescTable() override
void startParameterDefVal(const char *sep) override
void startIndexKey() override
void endClassDiagram(const ClassDiagram &, const DString &, const DString &) override
void startParameterName(bool) override
void startDoxyAnchor(const DString &fName, const DString &manName, const DString &anchor, const DString &name, const DString &args) override
static void writeSearchPage()
void startInclDepGraph() override
void insertMemberAlignLeft(MemberItemType, bool) override
void startGroupHeader(const DString &, int) override
void startMemberSubtitle() override
HtmlGenerator & operator=(const HtmlGenerator &)
void startTextLink(const DString &file, const DString &anchor) override
void startMemberDocName(bool) override
void startParagraph(const DString &classDef) override
void endParameterType() override
void startLabels() override
void startCallGraph() override
void endMemberList() override
void endIndexList() override
void writeSearchInfo() override
void startContents() override
void startDescTableRow() override
void startDirDepGraph() override
void startCompoundTemplateParams() override
void startConstraintParam() override
void endGroupHeader(int) override
void writeChar(char c) override
void endConstraintList() override
void endParameterList() override
static void writePageFooter(TextStream &t, const DString &, const DString &, const DString &)
void startDotGraph() override
void endIndent() override
void writeSplitBar(const DString &name, const DString &allMembersFile) override
void endParameterName() override
void endPageDoc() override
void startMemberDocList() override
void endDescTableRow() override
void startDescTableInit() override
void startMemberDescription(const DString &anchor, const DString &inheritId, bool typ) override
void startLocalToc(int level) override
void startMemberList() override
static void writeHeaderFile(TextStream &t, const DString &cssname)
void endQuickIndices() override
void startHeaderSection() override
void startDescTableTitle() override
void endIndexValue(const DString &, bool) override
void startMemberDoc(const DString &clName, const DString &memName, const DString &anchor, const DString &title, int memCount, int memTotal, bool showInline) override
void endDirDepGraph(DotDirDeps &g) override
void startIndexList() override
void startEmbeddedDoc(size_t) override
void endParameterDefVal() override
void endMemberGroup(bool) override
void lineBreak(const DString &style) override
void endInlineHeader() override
void endEmbeddedDoc() override
void startPageDoc(const DString &pageTitle) override
static void writeFooterFile(TextStream &t)
void endMemberDescription() override
void startGroupCollaboration() override
void endConstraintDocs() override
void writeNonBreakableSpace(int) override
void endMemberGroupHeader(bool) override
void writePageOutline() override
void startInlineMemberDoc() override
static void writeTabData()
Additional initialization after indices have been created.
void endExamples() override
void endIndexKey() override
void addLabel(const DString &, const DString &) override
void endMemberDocName() override
void endContents() override
void endInlineMemberType() override
void writeLabel(const DString &l, bool isLast) override
void startMemberGroupDocs() override
void startMemberDocSimple(bool) override
OutputType type() const override
void endHeaderSection() override
void startIndent() override
void writeStyleInfo(int part) override
void endMemberGroupDocs() override
void endDotGraph(DotClassGraph &g) override
void endMemberDeclaration(const DString &anchor, const DString &inheritId) override
void endMemberHeader() override
void startMemberItem(const DString &anchor, MemberItemType, const DString &inheritId) override
void endTextLink() override
void startConstraintList(const DString &) override
void startMemberSections() override
void startTitleHead(const DString &) override
void endMemberSections() override
void endMemberDocList() override
void endCompoundTemplateParams() override
void addIndexItem(const DString &, const DString &) override
static void writeExternalSearchPage()
void startSection(const DString &, const DString &, SectionType) override
void endDescTableData() override
void writeSummaryLink(const DString &file, const DString &anchor, const DString &title, bool first) override
void startDescTableData() override
void endParagraph() override
void insertMemberAlign(bool) override
static void writeStyleSheetFile(TextStream &t)
void startMemberTemplateParams() override
void writeFooter(const DString &navPath) override
void endLabels() override
HtmlCodeGenerator * m_codeGen
void startIndexItem(const DString &ref, const DString &file) override
void startMemberHeader(const DString &, int) override
void startIndexValue(bool) override
void endGroupCollaboration(DotGroupCollaboration &g) override
void endSection(const DString &, SectionType) override
void endLocalToc() override
std::unique_ptr< OutputCodeList > m_codeList
void startConstraintType() override
void endConstraintParam() override
void endMemberTemplateParams(const DString &anchor, const DString &inheritId) override
void addCodeGen(OutputCodeList &list) override
void startConstraintDocs() override
void docify_(const DString &text, bool inHtmlComment)
void endPlainFile() override
void startIndexListItem() override
void endProjectNumber() override
void writeDoc(const IDocNodeAST *node, const Definition *, const MemberDef *, int id, int sectionLevel) override
void endMemberDocPrefixItem() override
void endDescTableTitle() override
void startFile(const DString &name, bool isSource, const DString &manName, const DString &title, int id, int hierarchyLevel) override
void endInclDepGraph(DotInclDepGraph &g) override
void startParameterExtra() override
void writeNavigationPath(const DString &s) override
static DString writeLogoAsString(const DString &path)
void startProjectNumber() override
void endDoxyAnchor(const DString &fName, const DString &anchor) override
void startPlainFile(const DString &name) override
void writeString(const DString &text) override
void writeGraphicalHierarchy(DotGfxHierarchyTable &g) override
void startExamples() override
void endTitleHead(const DString &, const DString &) override
void writeInheritedSectionTitle(const DString &id, const DString &ref, const DString &file, const DString &anchor, const DString &title, const DString &name) override
void writeStartAnnoItem(const DString &type, const DString &file, const DString &path, const DString &name) override
void endInlineMemberDoc() override
void endCallGraph(DotCallGraph &g) override
void endConstraintType() override
void endMemberSubtitle() override
void startMemberDocPrefixItem() override
void endTocEntry(const SectionInfo *si) override
void endMemberItem(MemberItemType) override
void startMemberGroup() override
void endMemberDoc(bool) override
static void writeSearchInfoStatic(TextStream &t, const DString &relPath)
void endIndexItem(const DString &ref, const DString &file) override
void startInlineHeader() override
void endInlineMemberName() override
void endMemberDocSimple(bool) override
static DString fixSpaces(const DString &s)
void exceptionEntry(const DString &, bool) override
void writeObjectLink(const DString &ref, const DString &file, const DString &anchor, const DString &name) override
void endIndexListItem() override
void startParameterList(bool) override
static DString writeSplitBarAsString(const DString &name, const DString &relpath, const DString &allMembersFile)
void startParameterType(bool first, const DString &key) override
opaque representation of the abstract syntax tree (AST)
static Index & instance()
void addIndexFile(const DString &name)
void addImageFile(const DString &name)
void addStyleSheetFile(const DString &name)
static LayoutDocManager & instance()
Returns a reference to this singleton.
LayoutNavEntry * rootNavEntry() const
returns the (invisible) root of the navigation tree.
A model of a class/file/namespace member symbol.
static MermaidManager & instance()
Class representing a list of different code generators.
void add(OutputCodeIntfPtr &&p)
Abstract interface for output generators.
Singleton for managing resources compiled into an executable.
static ResourceMgr & instance()
Returns the one and only instance of this class.
bool copyResource(const DString &name, const DString &targetDir) const
Copies a registered resource to a given target directory.
DString getAsString(const DString &name) const
Gets the resource data as a C string.
class that provide information about a section.
constexpr bool isSection() const
static constexpr int Section
static constexpr int Subsection
static constexpr int Subsubsection
constexpr int level() const
static constexpr int Page
static constexpr int Paragraph
static constexpr int Subsubparagraph
static constexpr int Subparagraph
Text streaming class that buffers data.
bool empty() const
Returns true iff the buffer is empty.
std::string str() const
Return the contents of the buffer as a std::string object.
virtual DString trCompoundMembers()=0
virtual DString trLegend()=0
virtual DString trSearching()=0
virtual DString trGeneratedAt(const DString &date, const DString &projName)=0
virtual DString trInheritedFrom(const DString &members, const DString &what)=0
virtual DString trSearchResults(int numDocuments)=0
virtual DString trISOLang()=0
virtual DString trDeclaration()=0
virtual DString trSearchMatches()=0
virtual DString trSearch()=0
virtual DString trGeneratedBy()=0
virtual DString trDefinition()=0
virtual DString trEnumerationValues()=0
virtual DString trRTFTableOfContents()=0
virtual DString trNoMatches()=0
virtual DString trCopyToClipboard()=0
virtual DString trSearchResultsTitle()=0
virtual DString trLoading()=0
virtual DString trExamples()=0
#define Config_getInt(name)
#define Config_getList(name)
#define Config_getEnumAsString(name)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_getEnum(name)
std::vector< std::string > StringVector
std::unordered_map< std::string, std::string > StringUnorderedMap
std::vector< bool > BoolVector
DString yearToString()
Returns the current year as a string.
DString dateToString(DateTimeType includeTime)
Returns the current date, when includeTime is set also the time is provided.
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
static bool hasDateReplacement(const DString &str)
static constexpr auto hex
static DString getSearchBox(bool serverSide, DString relPath, bool highlightSearch)
static void startSectionHeader(TextStream &t, const DString &relPath, int sectionCount)
static void startSectionContent(TextStream &t, int sectionCount)
static void endQuickIndexList(TextStream &t)
static DString replaceVariables(const DString &input)
static DString substituteHtmlKeywords(const DString &file, const DString &str, const DString &title, const DString &relPath, const DString &navPath=DString(), bool isSource=false)
static void startSectionSummary(TextStream &t, int sectionCount)
static void startQuickIndexItem(TextStream &t, const DString &l, bool hl, bool, const DString &relPath)
static void startQuickIndexList(TextStream &t, bool topLevel=true)
static const SelectionMarkerInfo htmlMarkerInfo
static void fillColorStyleMap(const DString &definitions, StringUnorderedMap &map)
static void endQuickIndexItem(TextStream &t, const DString &l)
static void renderQuickLinksAsTree(TextStream &t, const DString &relPath, LayoutNavEntry *root)
static void endSectionContent(TextStream &t)
static DString g_latex_macro
static void writeServerSearchBox(TextStream &t, const DString &relPath, bool highlightSearch)
static void fillColorStyleMaps()
static StringUnorderedMap g_lightMap
static void writeDefaultStyleSheet(TextStream &t)
static bool quickLinkVisible(LayoutNavEntry::Kind kind)
static void renderQuickLinksAsTabs(TextStream &t, const DString &relPath, LayoutNavEntry *hlEntry, LayoutNavEntry::Kind kind, bool highlightParent, bool highlightSearch)
static std::mutex g_indexLock
static DString g_header_file
static DString getConvertLatexMacro()
Convert a set of LaTeX commands \(re)newcommand to a form readable by MathJax LaTeX syntax:
static void writeDefaultQuickLinks(TextStream &t, HighlightedItem hli, const DString &file, const DString &relPath, bool extraTabs)
static DString g_mathjax_code
static StringUnorderedMap g_darkMap
static void endSectionHeader(TextStream &t)
static void endSectionSummary(TextStream &t)
static void writeClientSearchBox(TextStream &t, const DString &relPath)
static DString g_footer_file
Translator * theTranslator
#define warn(file, line, fmt,...)
std::ofstream openOutputStream(const DString &name, bool append=false)
size_t updateColumnCount(const char *s, size_t col)
OutputCodeDefer< HtmlCodeGenerator > HtmlCodeGeneratorDefer
Portable versions of functions that are platform dependent.
Some helper functions for std::string.
bool literal_at(const char *data, const char(&str)[N])
returns true iff data points to a substring that matches string literal str
std::string removeEmptyLines(const std::string &s)
void writeIndent(TextStream &t)
void incIndent(TextStream &t, const DString &text)
void decIndent(TextStream &t, const DString &text)
Base class for the layout of a navigation item at the top of the HTML pages.
const LayoutNavEntryList & children() const
LayoutNavEntry * find(LayoutNavEntry::Kind k, const DString &file=DString()) const
LayoutNavEntry * parent() const
constexpr const char * codeSymbolType2Str(CodeSymbolType type) noexcept
std::string convertUTF8ToLower(const std::string &input)
Converts the input string into a lower case version, also taking into account non-ASCII characters th...
const char * writeUTF8Char(TextStream &t, const char *s)
Writes the UTF8 character pointed to by s to stream t and returns a pointer to the next character.
Various UTF8 related helper functions.
DString replaceColorMarkers(const DString &str)
Replaces any markers of the form ##AA in input string str by new markers of the form #AABBCC,...
DString filterTitle(const DString &title)
DString selectBlocks(const DString &s, const SelectionBlockList &blockList, const SelectionMarkerInfo &markerInfo)
remove disabled blocks and all block markers from s and return the result as a string
DString externalLinkTarget(const bool parent)
DString correctURL(const DString &url, const DString &relPath)
Corrects URL url according to the relative path relPath.
DString convertToId(const DString &s)
DString showDate(const DString &fmt)
void clearSubDirs(const Dir &d)
void createSubDirs(const Dir &d)
DString convertToHtml(const DString &s, bool keepEntities)
void addHtmlExtensionIfMissing(DString &fName)
void checkBlocks(const DString &s, const DString fileName, const SelectionMarkerInfo &markerInfo)
DString fileToString(const DString &name, bool filter, bool isSourceCode)
DString substituteKeywords(const DString &file, const DString &s, const KeywordSubstitutionList &keywords)
DString relativePathToRoot(const DString &name)
DString projectLogoFile()
DString createHtmlUrl(const DString &relPath, const DString &ref, bool isLocalFile, const DString &targetFileName, const DString &anchor)
DString projectLogoSize()
DString externalRef(const DString &relPath, const DString &ref)
DString stripPath(const DString &s)
A bunch of utility functions.