71static constexpr auto hex=
"0123456789ABCDEF";
79 t <<
" <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
80 t <<
" <span class=\"left\">\n";
81 t <<
" <span id=\"MSearchSelect\" class=\"search-icon\">";
82 t <<
"<span class=\"search-icon-dropdown\"></span></span>\n";
83 t <<
" <input type=\"text\" id=\"MSearchField\" value=\"\" placeholder=\""
85 t <<
" </span><span class=\"right\">\n";
86 t <<
" <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
87 <<
"<div id=\"MSearchCloseImg\" class=\"close-icon\"></div></a>\n";
97 t <<
" <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
98 t <<
" <div class=\"left\">\n";
99 t <<
" <form id=\"FSearchBox\" action=\"" << relPath;
108 t <<
"\" method=\"get\">\n";
109 t <<
" <span id=\"MSearchSelectExt\" class=\"search-icon\"></span>\n";
112 t <<
" <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" placeholder=\""
115 t <<
" </div><div class=\"right\"></div>\n";
146 if (macrofile.
empty())
return "";
148 macrofile =
FileInfo(macrofile.
str()).absFilePath();
152 const char *data = s.
data();
161 while (i < size && (data[i] ==
' ' || data[i] ==
'\t' || data[i] ==
'\n'))
163 if (data[i] ==
'\n') line++;
166 if (i >= size)
break;
170 warn(macrofile,line,
"file contains non valid code, expected '\\' got '{:c}'",data[i]);
176 i += strlen(
"newcommand");
180 i += strlen(
"renewcommand");
184 warn(macrofile,line,
"file contains non valid code, expected 'newcommand' or 'renewcommand'");
190 warn(macrofile,line,
"file contains non valid code, expected '{{' got '{:c}'",data[i]);
196 warn(macrofile,line,
"file contains non valid code, expected '\\' got '{:c}'",data[i]);
202 while (i < size && (data[i] !=
'}')) result+=data[i++];
205 warn(macrofile,line,
"file contains non valid code, no closing '}}' for command");
217 while (i < size && (data[i] !=
']')) nr += data[i++];
220 warn(macrofile,line,
"file contains non valid code, no closing ']'");
225 else if (data[i] !=
'{')
227 warn(macrofile,line,
"file contains non valid code, expected '[' or '{{' got '{:c}'",data[i]);
234 warn(macrofile,line,
"file contains non valid code, expected '{{' got '{:c}'",data[i]);
241 while (i < size && cnt)
253 else if (data[i] !=
'"') result+=data[i++];
261 if (cnt) result+=data[i];
279 warn(macrofile,line,
"file contains non valid code, no closing '}}' for replacement");
313 bool isSource =
false)
334 bool hasProjectName = !projectName.
empty();
341 bool hasCookie = treeView || searchEngine ||
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE;
342 static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
347 cssFile =
"doxygen.css";
360 cssFile =
"doxygen.css";
367 for (
const auto &fileName : extraCssFile)
369 if (!fileName.empty())
371 DString htmlStyleSheet = fileName;
374 extraCssText +=
"<link href=\""+htmlStyleSheet+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
381 extraCssText +=
"<link href=\"$relpath^"+
stripPath(fileName)+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
389 case TIMESTAMP_t::NO:
399 treeViewCssJs =
"<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
400 "<script type=\"text/javascript\" src=\"$relpath^navtreedata.js\"></script>\n"
401 "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n";
406 searchCssJs =
"<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
407 if (!serverBasedSearch)
409 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/searchdata.js\"></script>\n";
413 searchCssJs +=
"<style type=\"text/css\">\n"
415 " font-family: 'Material Symbols Outlined';\n"
416 " font-style: normal;\n"
417 " font-weight: 400;\n"
418 " src: url($relpath^MaterialSymbolsOutlined.min.woff2) format('woff2');\n"
420 ".material-symbols-outlined {\n"
421 " font-family: 'Material Symbols Outlined';\n"
422 " font-weight: normal;\n"
423 " font-style: normal;\n"
424 " font-size: 24px;\n"
426 " letter-spacing: normal;\n"
427 " text-transform: none;\n"
428 " display: inline-block;\n"
429 " white-space: nowrap;\n"
430 " word-wrap: normal;\n"
432 " -moz-font-feature-settings: 'liga';\n"
433 " -moz-osx-font-smoothing: grayscale;\n"
437 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n";
439 if (!serverBasedSearch)
445 searchCssJs +=
"<link rel=\"search\" href=\"" + relPath +
446 "search_opensearch.php?v=opensearch.xml\" "
447 "type=\"application/opensearchdescription+xml\" title=\"" +
448 (hasProjectName ? projectName :
DString(
"Doxygen")) +
452 searchBox =
getSearchBox(serverBasedSearch, relPath,
false);
455 if (mathJax && !isSource)
464 auto writeMathJax3Packages = [&mathJaxJs](
const StringVector &mathJaxExtensions)
466 mathJaxJs +=
" packages: ['base','configmacros'";
469 mathJaxJs+=
",'newcommand'";
471 for (
const auto &s : mathJaxExtensions)
473 mathJaxJs+=
",'"+s+
"'";
478 auto writeMathJax4Packages = [&mathJaxJs](
const StringVector &mathJaxExtensions)
480 mathJaxJs +=
" packages: {\n";
482 for (
const auto &s : mathJaxExtensions)
484 if (!first) mathJaxJs+=
",";
487 mathJaxJs+=
"\n '[-]': ['";
488 mathJaxJs+=s.
data()+1;
493 mathJaxJs+=
"\n '[+]': ['"+s+
"']";
497 mathJaxJs +=
"\n }\n";
500 auto writeMathJaxScript = [&path,&mathJaxJs](
const DString &pathPostfix,
504 mathJaxJs +=
"<script type=\"text/javascript\">\n"
505 "window.MathJax = {\n"
507 " ignoreHtmlClass: 'tex2jax_ignore',\n"
508 " processHtmlClass: 'tex2jax_process'\n"
515 if (!mathJaxExtensions.empty())
518 mathJaxJs+=
" loader: {\n"
520 for (
const auto &s : mathJaxExtensions)
524 if (!first) mathJaxJs+=
",";
525 mathJaxJs+=
"'[tex]/"+s+
"'";
532 mathJaxJs+=
" tex: {\n"
539 writePackages(mathJaxExtensions);
553 mathJaxJs+=
"</script>\n";
554 mathJaxJs +=
"<script type=\"text/javascript\" id=\"MathJax-script\" async=\"async\" src=\"" +
555 path + pathPostfix +
"tex-" + mathJaxFormat.
lower() +
".js\">";
556 mathJaxJs+=
"</script>\n";
559 switch (mathJaxVersion)
561 case MATHJAX_VERSION_t::MathJax_4:
562 writeMathJaxScript(
"",writeMathJax4Packages);
564 case MATHJAX_VERSION_t::MathJax_3:
565 writeMathJaxScript(
"es5/",writeMathJax3Packages);
567 case MATHJAX_VERSION_t::MathJax_2:
570 mathJaxJs =
"<script type=\"text/x-mathjax-config\">\n"
571 "MathJax.Hub.Config({\n"
572 " extensions: [\"tex2jax.js\"";
574 for (
const auto &s : mathJaxExtensions)
576 mathJaxJs+=
", \""+
DString(s)+
".js\"";
578 if (mathJaxFormat.
empty())
580 mathJaxFormat =
"HTML-CSS";
583 " jax: [\"input/TeX\",\"output/"+mathJaxFormat+
"\"],\n";
586 mathJaxJs +=
" TeX: { Macros: {\n";
591 mathJaxJs +=
"});\n";
597 mathJaxJs +=
"</script>\n";
598 mathJaxJs +=
"<script type=\"text/javascript\" async=\"async\" src=\"" + path +
"MathJax.js\"></script>\n";
607 darkModeJs=
"<script type=\"text/javascript\" src=\"$relpath^darkmode_toggle.js\"></script>\n";
613 mermaidJs =
"<script type=\"module\">\n"
614 "import mermaid from '" + mermaidJsUrl +
"';\n";
617 case HTML_COLORSTYLE_t::LIGHT:
618 mermaidJs +=
"const theme = 'default';\n";
620 case HTML_COLORSTYLE_t::DARK:
621 mermaidJs +=
"const theme = 'dark';\n";
623 case HTML_COLORSTYLE_t::AUTO_LIGHT:
624 case HTML_COLORSTYLE_t::AUTO_DARK:
625 mermaidJs +=
"const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'default';\n";
627 case HTML_COLORSTYLE_t::TOGGLE:
628 mermaidJs +=
"const theme = DarkModeToggle.darkModeEnabled ? 'dark' : 'default'\n";
631 mermaidJs +=
"mermaid.initialize({ startOnLoad: true, theme: theme });\n";
636 " const elementCode = '.mermaid';\n"
637 " const loadMermaid = function(theme) {\n"
638 " mermaid.initialize({theme})\n"
639 " mermaid.init({theme}, document.querySelectorAll(elementCode))\n"
641 " const saveOriginalData = function() {\n"
642 " return new Promise((resolve, reject) => {\n"
644 " var els = document.querySelectorAll(elementCode), count = els.length;\n"
645 " els.forEach(element => {\n"
646 " element.setAttribute('data-original-code', element.innerHTML)\n"
648 " if (count == 0) { resolve() }\n"
650 " } catch (error) { reject(error) }\n"
653 " const resetProcessed = function(){\n"
654 " return new Promise((resolve, reject) => {\n"
656 " var els = document.querySelectorAll(elementCode), count = els.length;\n"
657 " els.forEach(element => {\n"
658 " if (element.getAttribute('data-original-code') != null) {\n"
659 " element.removeAttribute('data-processed')\n"
660 " element.innerHTML = element.getAttribute('data-original-code')\n"
663 " if(count == 0) { resolve() }\n"
665 " } catch (error) { reject(error) }\n"
668 " saveOriginalData()\n"
669 " const original = DarkModeToggle.enableDarkMode.bind(DarkModeToggle);\n"
670 " DarkModeToggle.enableDarkMode = function(enable) {\n"
671 " original(enable);\n"
672 " resetProcessed().then(loadMermaid(enable ? 'dark' : 'default')).catch(console.error)\n"
676 mermaidJs +=
"</script>\n";
681 treeViewCssJs+=
"<script type=\"text/javascript\" src=\"$relpath^cookie.js\"></script>\n";
690 {
"$title", [&]() {
return !title.
empty() ? title : projName; } },
691 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
692 {
"$projectname", [&]() {
return projName; } },
702 {
"$datetime", [&]() ->
DString {
return "<span class=\"datetime\"></span>"; } },
703 {
"$date", [&]() ->
DString {
return "<span class=\"date\"></span>"; } },
704 {
"$time", [&]() ->
DString {
return "<span class=\"time\"></span>"; } },
705 {
"$year", [&]() ->
DString {
return "<span class=\"year\"></span>"; } },
706 {
"$navpath", [&]() ->
DString {
return navPath; } },
707 {
"$stylesheet", [&]() ->
DString {
return cssFile; } },
708 {
"$treeview", [&]() ->
DString {
return treeViewCssJs; } },
709 {
"$searchbox", [&]() ->
DString {
return searchBox; } },
710 {
"$search", [&]() ->
DString {
return searchCssJs; } },
711 {
"$mathjax", [&]() ->
DString {
return mathJaxJs; } },
712 {
"$mermaidjs", [&]() ->
DString {
return mermaidJs; } },
713 {
"$darkmode", [&]() ->
DString {
return darkModeJs; } },
714 {
"$generatedby", [&]() ->
DString {
return generatedBy; } },
715 {
"$extrastylesheet",[&]() ->
DString {
return extraCssText; } },
716 {
"$relpath$", [&]() ->
DString {
return relPath; } }
719 result =
substitute(result,
"$relpath^",relPath);
725 {
"FULL_SIDEBAR", hasFullSideBar },
726 {
"DISABLE_INDEX", disableIndex },
727 {
"GENERATE_TREEVIEW", treeView },
728 {
"SEARCHENGINE", searchEngine },
729 {
"TITLEAREA", titleArea },
730 {
"PROJECT_NAME", hasProjectName },
731 {
"PROJECT_NUMBER", hasProjectNumber },
732 {
"PROJECT_BRIEF", hasProjectBrief },
733 {
"PROJECT_LOGO", hasProjectLogo },
734 {
"PROJECT_ICON", hasProjectIcon },
735 {
"COPY_CLIPBOARD", hasCopyClipboard },
737 {
"HTML_DYNAMIC_SECTIONS", dynamicSections},
758 size_t separator = line.
find(
':');
760 std::string key = line.
left(separator).
str();
761 size_t semi = line.
rfind(
';');
764 map.emplace(key,value);
775 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
779 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
794 result+=input.
mid(p,i-p);
795 size_t j=input.
find(
")",i+4);
797 auto it = mapping.find(input.
mid(i+4,j-i-4).
str());
798 if (it==mapping.end())
800 err(
"failed to find value variable {}. It is not longer defined in doxygen.css\n",input.
mid(i+4,j-i-4));
814 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
818 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
854 const char *p=str.
data();
867 int spacesToNextTabStop = tabSize - (
m_col%tabSize);
868 while (spacesToNextTabStop--)
887 case '\'': *
m_t <<
"'";
m_col++;
889 case '"': *
m_t <<
""";
m_col++;
893 { *
m_t <<
"<"; p++; }
895 { *
m_t <<
">"; p++; }
897 { *
m_t <<
"\\‍[";
m_col++;p++; }
899 { *
m_t <<
"\\‍]";
m_col++;p++; }
901 { *
m_t <<
"\\‍(";
m_col++;p++; }
903 { *
m_t <<
"\\‍)";
m_col++;p++; }
910 uint8_t uc =
static_cast<uint8_t
>(c);
913 *
m_t <<
"$" <<
hex[uc>>4] <<
hex[uc&0xF] <<
";";
957 const DString &anchor,
int l,
bool writeLineAnchor)
961 const int maxLineNrStr = 10;
962 char lineNumber[maxLineNrStr];
963 char lineAnchor[maxLineNrStr];
964 snprintf(lineNumber,maxLineNrStr,
"%5d",l);
965 snprintf(lineAnchor,maxLineNrStr,
"l%05d",l);
970 *
m_t <<
"<div class=\"line\">";
974 if (writeLineAnchor) *
m_t <<
"<a id=\"" << lineAnchor <<
"\" name=\"" << lineAnchor <<
"\"></a>";
975 *
m_t <<
"<span class=\"lineno\">";
976 if (!filename.
empty())
1013 *
m_t <<
"<a class=\"" << className <<
"Ref\" ";
1018 *
m_t <<
"<a class=\"" << className <<
"\" ";
1038 *
m_t <<
"<div class=\"ttc\" id=\"" <<
id <<
"\">";
1039 *
m_t <<
"<div class=\"ttname\">";
1042 *
m_t <<
"<a href=\"";
1058 *
m_t <<
"<div class=\"ttdeci\">";
1065 *
m_t <<
"<div class=\"ttdoc\">";
1075 *
m_t <<
"<a href=\"";
1094 *
m_t <<
"<a href=\"";
1119 *
m_t <<
"<div class=\"line\">";
1143 *
m_t <<
"<span class=\"" << s <<
"\">";
1155 *
m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1160 *
m_t <<
"<div class=\"fragment\">";
1172 *
m_t <<
"</div><!-- fragment -->";
1182 const int maxLineNrStr = 10;
1183 char lineNumber[maxLineNrStr];
1184 snprintf(lineNumber,maxLineNrStr,
"%05d",lineNr);
1185 *
m_t <<
"<div class=\"foldopen\" id=\"foldopen" << lineNumber <<
1186 "\" data-start=\"" << startMarker <<
1187 "\" data-end=\"" << endMarker <<
1191 *
m_t <<
"<div class=\"line\">";
1199 *
m_t <<
"<div class=\"line\">";
1275 return (str.
contains(
"$datetime",
false) ||
1288 term(
"Could not create output directory {}\n",dname);
1455 mgr.
copyResource(
"MaterialSymbolsOutlined.min.woff2",dname);
1457 mgr.
copyResource(
"MaterialSymbolsOutlined_LICENSE.txt",dname);
1468 DString searchDirName = dname;
1478 searchCss = mgr.
getAsString(
"search_sidebar.css");
1484 searchCss = mgr.
getAsString(
"search_nomenu_toggle.css");
1493 searchCss = mgr.
getAsString(
"search_fixedtabs.css");
1500 searchCss += mgr.
getAsString(
"search_common.css");
1501 searchCss =
substitute(searchCss,
"$doxygenversion",getDoxygenVersion());
1509 t <<
"/* The standard CSS for doxygen " << getDoxygenVersion() <<
"*/\n\n";
1512 case HTML_COLORSTYLE_t::LIGHT:
1513 case HTML_COLORSTYLE_t::DARK:
1516 case HTML_COLORSTYLE_t::AUTO_LIGHT:
1517 case HTML_COLORSTYLE_t::TOGGLE:
1522 case HTML_COLORSTYLE_t::AUTO_DARK:
1528 if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_LIGHT)
1530 t <<
"@media (prefers-color-scheme: dark) {\n";
1531 t <<
" html:not(.dark-mode) {\n";
1532 t <<
" color-scheme: dark;\n\n";
1536 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_DARK)
1538 t <<
"@media (prefers-color-scheme: light) {\n";
1539 t <<
" html:not(.light-mode) {\n";
1540 t <<
" color-scheme: light;\n\n";
1544 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
1546 t <<
"html.dark-mode {\n";
1557 " border-bottom: none;\n"
1558 " background-color: var(--nav-background-color);\n"
1559 " border-right: 1px solid var(--nav-border-color);\n"
1574 case TIMESTAMP_t::YES:
1575 case TIMESTAMP_t::DATETIME:
1578 case TIMESTAMP_t::DATE:
1584 t <<
"--timestamp: '" << timeStampStr <<
"';\n";
1597 t <<
"span.timestamp { content: ' '; }\n";
1598 t <<
"span.timestamp:before { content: var(--timestamp); }\n\n";
1602 t <<
"span.datetime { content: ' '; }\n";
1603 t <<
"span.datetime:before { content: var(--datetime); }\n\n";
1604 t <<
"span.date { content: ' '; }\n";
1605 t <<
"span.date:before { content: var(--date); }\n\n";
1606 t <<
"span.time { content: ' '; }\n";
1607 t <<
"span.time:before { content: var(--time); }\n\n";
1608 t <<
"span.year { content: ' '; }\n";
1609 t <<
"span.year:before { content: var(--year); }\n\n";
1616 bool addScrollbarStyling =
Config_getList(HTML_EXTRA_STYLESHEET).empty();
1617 if (addScrollbarStyling)
1632 t <<
"<!-- HTML header for doxygen " << getDoxygenVersion() <<
"-->\n";
1638 t <<
"<!-- HTML footer for doxygen " << getDoxygenVersion() <<
"-->\n";
1645 const DString &title,
int ,
int )
1665 << getDoxygenVersion() <<
" -->\n";
1669 m_t <<
"<script type=\"text/javascript\">\n";
1670 m_t <<
"let searchBox = new SearchBox(\"searchBox\", \""
1672 m_t <<
"</script>\n";
1676 m_t <<
"<script type=\"text/javascript\">\n";
1677 m_t <<
"document.addEventListener('DOMContentLoaded', codefold.init);\n";
1678 m_t <<
"</script>\n";
1687 if (searchEngine && !serverBasedSearch)
1689 t <<
"<!-- window showing the filter options -->\n";
1690 t <<
"<div id=\"MSearchSelectWindow\">\n";
1693 t <<
"<!-- iframe showing the search results (closed by default) -->\n";
1694 t <<
"<div id=\"MSearchResultsWindow\">\n";
1695 t <<
"<div id=\"MSearchResults\">\n";
1696 t <<
"<div class=\"SRPage\">\n";
1697 t <<
"<div id=\"SRIndex\">\n";
1698 t <<
"<div id=\"SRResults\"></div>\n";
1721 case TIMESTAMP_t::NO:
1729 result +=
" \n<a href=\"https://www.doxygen.org/index.html\">\n"
1730 "<img class=\"footer\" src=\"";
1732 result +=
"doxygen.svg\" width=\"104\" height=\"31\" alt=\"doxygen\"/></a> ";
1733 result += getDoxygenVersion();
1761 m_t <<
"<h3 class=\"version\">";
1790 err(
"style sheet {} does not exist or is not readable!\n",
Config_getString(HTML_STYLESHEET));
1805 for (
const auto &
fileName : extraCssFiles)
1851 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1864 if (!classDef.
empty())
1865 m_t <<
"\n<p class=\"" << classDef <<
"\">";
1897 m_t <<
"<a class=\"elRef\" ";
1902 m_t <<
"<a class=\"el\" ";
1940 m_t <<
"<a class=\"el\" href=\"" << fn <<
"\">";
1950 m_t <<
"<a class=\"elRef\" ";
1955 m_t <<
"<a class=\"el\" ";
1971 m_t <<
"<a href=\"";
1988 if (extraIndentLevel==2)
1992 else if (extraIndentLevel==1)
2004 m_t <<
" class=\"groupheader\">";
2009 if (extraIndentLevel==2)
2013 else if (extraIndentLevel==1)
2034 default:
ASSERT(0);
break;
2036 m_t <<
"<a id=\"" << lab <<
"\" name=\"" << lab <<
"\"></a>";
2050 default:
ASSERT(0);
break;
2063 const char *p=str.
data();
2069 case '<':
m_t <<
"<";
break;
2070 case '>':
m_t <<
">";
break;
2071 case '&':
m_t <<
"&";
break;
2072 case '"':
m_t <<
""";
break;
2073 case '-':
if (inHtmlComment)
m_t <<
"-";
else m_t <<
"-";
break;
2076 {
m_t <<
"<"; p++; }
2078 {
m_t <<
">"; p++; }
2080 {
m_t <<
"\\‍["; p++; }
2082 {
m_t <<
"\\‍]"; p++; }
2084 {
m_t <<
"\\‍("; p++; }
2086 {
m_t <<
"\\‍)"; p++; }
2107 const DString &relPath,
int sectionCount)
2111 if (dynamicSections)
2113 t <<
"<div id=\"dynsection-" << sectionCount <<
"\" "
2114 "class=\"dynheader closed\">"
2115 "<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
2119 t <<
"<div class=\"dynheader\">\n";
2133 if (dynamicSections)
2135 t <<
"<div id=\"dynsection-" << sectionCount <<
"-summary\" "
2136 "class=\"dynsummary\">\n";
2144 if (dynamicSections)
2154 if (dynamicSections)
2156 t <<
"<div id=\"dynsection-" << sectionCount <<
"-content\" "
2157 "class=\"dyncontent hidden\">\n";
2161 t <<
"<div class=\"dyncontent\">\n";
2189 m_t <<
" <div class=\"center\">\n";
2190 m_t <<
" <img src=\"";
2192 m_t <<
"_map\" alt=\"\"/>\n";
2202 m_t <<
" <div class=\"center\">\n";
2203 m_t <<
" <img src=\"";
2232 m_t <<
"<table class=\"memberdecls\">\n";
2236 if (!inheritId.
empty())
2238 if (dynamicSections)
m_t <<
" inherit";
2239 m_t <<
" " << inheritId;
2242 if (!anchor.
empty())
2256 m_t <<
"</td></tr>\n";
2266 m_t <<
"</td></tr>\n";
2268 if (!inheritId.
empty())
2270 if (dynamicSections)
m_t <<
" inherit";
2271 m_t <<
" " << inheritId;
2273 m_t <<
" template\"><td class=\"memItemLeft\">";
2278 m_t <<
"<div class=\"compoundTemplParams\">";
2289 m_t <<
" </td><td class=\"memItemRight\">";
2294 if (!initTag)
m_t <<
" </td>";
2306 DBG_HTML(
m_t <<
"<!-- startMemberDescription -->\n")
2310 m_t <<
"<table class=\"memberdecls\">\n";
2313 m_t <<
"<tr class=\"memdesc:" << anchor;
2314 if (!inheritId.
empty())
2316 if (dynamicSections)
m_t <<
" inherit";
2317 m_t <<
" " << inheritId;
2320 m_t <<
"<td class=\"mdescLeft\"> </td>";
2321 if (typ)
m_t <<
"<td class=\"mdescLeft\"> </td>";
2322 m_t <<
"<td class=\"mdescRight\">";
2327 DBG_HTML(
m_t <<
"<!-- endMemberDescription -->\n")
2328 m_t <<
"<br /></td></tr>\n";
2344 m_t <<
"</table>\n";
2358 m_t <<
"<table class=\"memberdecls\">\n";
2361 m_t <<
"<tr class=\"heading\"><td colspan=\"" << typ <<
"\"><h2";
2362 if (!anchor.
empty())
2364 m_t <<
" id=\"header-" << anchor <<
"\"";
2366 m_t <<
" class=\"groupheader\">";
2367 if (!anchor.
empty())
2369 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>\n";
2376 m_t <<
"</h2></td></tr>\n";
2384 m_t <<
"<table class=\"memberdecls\">\n";
2387 m_t <<
"<tr><td class=\"ititle\" colspan=\"2\">";
2393 m_t <<
"</td></tr>\n";
2403 m_t <<
"</table>\n";
2438 int memCount,
int memTotal,
bool )
2441 m_t <<
"\n<h2 class=\"memtitle\">"
2442 <<
"<span class=\"permalink\"><a href=\"#" << anchor <<
"\">◆ </a></span>";
2446 m_t <<
" <span class=\"overload\">[" << memCount <<
"/" << memTotal <<
"]</span>";
2449 m_t <<
"\n<div class=\"memitem\">\n";
2450 m_t <<
"<div class=\"memproto\">\n";
2455 DBG_HTML(
m_t <<
"<!-- startMemberDocPrefixItem -->\n";)
2456 m_t <<
"<div class=\"memtemplate\">\n";
2461 DBG_HTML(
m_t <<
"<!-- endMemberDocPrefixItem -->\n";)
2469 m_t <<
" <table class=\"memname\">\n";
2472 m_t <<
" <td class=\"memname\">";
2485 if (openBracket)
m_t <<
"(";
2493 DBG_HTML(
m_t <<
"<!-- startFirstParameterType -->\n";)
2494 m_t <<
" <td class=\"paramtype\">";
2500 m_t <<
" <td class=\"paramkey\">" << key <<
"</td>\n";
2501 m_t <<
" <td></td>\n";
2502 m_t <<
" <td class=\"paramtype\">";
2515 m_t <<
" <td class=\"paramname\"><span class=\"paramname\"><em>";
2521 m_t <<
"</em></span>";
2526 DBG_HTML(
m_t <<
"<!-- startParameterExtra -->\n";)
2536 if (closeBracket)
m_t <<
"</td><td>)";
2543 if (closeBracket)
m_t <<
")";
2555 m_t <<
"<span class=\"paramdefsep\">";
2557 m_t <<
"</span><span class=\"paramdefval\">";
2580 m_t <<
" <td align=\"right\">";
2584 m_t <<
prefix <<
"</td><td>(</td><td colspan=\"2\">";
2585 else if (closeBracket)
2586 m_t <<
" )</td><td></td><td></td><td>";
2588 m_t <<
"</td><td></td><td colspan=\"2\">";
2598 m_t <<
" </table>\n";
2617 if (generateLegend && !umlLook)
2620 m_t <<
"<center><span class=\"legend\">[";
2623 if (generateTreeView)
m_t <<
"target=\"top\" ";
2629 m_t <<
"]</span></center>";
2715 m_t <<
"<tr id=\"" <<
id <<
"\" class=\"groupHeader\"><td colspan=\"2\"><div class=\"groupHeader\">";
2720 m_t <<
"</div></td></tr>\n";
2725 m_t <<
"<tr><td colspan=\"2\" class=\"ititle\"><div class=\"groupText\">";
2730 m_t <<
"</div></td></tr>\n";
2745 m_t <<
"<div class=\"memdoc\">\n";
2751 m_t <<
"\n</div>\n" <<
"</div>\n";
2760 for (
int i=0; i<n; i++)
2768 m_t <<
"<table class=\"fieldtable\">\n"
2769 <<
"<tr><th colspan=\"" << (hasInits?3:2) <<
"\">" << title <<
"</th></tr>";
2773 m_t <<
"</table>\n";
2788 m_t <<
"<td class=\"fieldname\">";
2793 m_t <<
" </td>";
2798 m_t <<
"<td class=\"fieldinit\">";
2803 m_t <<
" </td>";
2808 m_t <<
"<td class=\"fielddoc\">";
2818 m_t <<
"<dl class=\"section examples\"><dt>";
2835 std::visit(visitor,astImpl->
root);
2847 t <<
" <div id=\"navrow1\" class=\"tabs\">\n";
2851 t <<
" <div id=\"navrow2\" class=\"tabs2\">\n";
2853 t <<
" <ul class=\"tablist\">\n";
2881 t <<
" class=\"current\"";
2891 if (!l.
empty()) t <<
"</a>";
2902 case LayoutNavEntry::MainPage:
return true;
2903 case LayoutNavEntry::User:
return true;
2904 case LayoutNavEntry::UserGroup:
return true;
2905 case LayoutNavEntry::Pages:
return index.numIndexedPages()>0;
2906 case LayoutNavEntry::Topics:
return index.numDocumentedGroups()>0;
2907 case LayoutNavEntry::Modules:
return index.numDocumentedModules()>0;
2908 case LayoutNavEntry::ModuleList:
return index.numDocumentedModules()>0;
2910 case LayoutNavEntry::Namespaces:
return showNamespaces && index.numDocumentedNamespaces()>0;
2911 case LayoutNavEntry::NamespaceList:
return showNamespaces && index.numDocumentedNamespaces()>0;
2913 case LayoutNavEntry::Concepts:
return index.numDocumentedConcepts()>0;
2914 case LayoutNavEntry::Classes:
return index.numAnnotatedClasses()>0;
2915 case LayoutNavEntry::ClassList:
return index.numAnnotatedClasses()>0;
2916 case LayoutNavEntry::ClassIndex:
return index.numAnnotatedClasses()>0;
2917 case LayoutNavEntry::ClassHierarchy:
return index.numHierarchyClasses()>0;
2919 case LayoutNavEntry::Files:
return showFiles && index.numDocumentedFiles()>0;
2920 case LayoutNavEntry::FileList:
return showFiles && index.numDocumentedFiles()>0;
2923 case LayoutNavEntry::Interfaces:
return index.numAnnotatedInterfaces()>0;
2924 case LayoutNavEntry::InterfaceList:
return index.numAnnotatedInterfaces()>0;
2925 case LayoutNavEntry::InterfaceIndex:
return index.numAnnotatedInterfaces()>0;
2926 case LayoutNavEntry::InterfaceHierarchy:
return index.numHierarchyInterfaces()>0;
2927 case LayoutNavEntry::Structs:
return index.numAnnotatedStructs()>0;
2928 case LayoutNavEntry::StructList:
return index.numAnnotatedStructs()>0;
2929 case LayoutNavEntry::StructIndex:
return index.numAnnotatedStructs()>0;
2930 case LayoutNavEntry::Exceptions:
return index.numAnnotatedExceptions()>0;
2931 case LayoutNavEntry::ExceptionList:
return index.numAnnotatedExceptions()>0;
2932 case LayoutNavEntry::ExceptionIndex:
return index.numAnnotatedExceptions()>0;
2933 case LayoutNavEntry::ExceptionHierarchy:
return index.numHierarchyExceptions()>0;
2934 case LayoutNavEntry::None:
2935 assert(kind != LayoutNavEntry::None);
2945 for (
const auto &entry : root->
children())
2952 for (
const auto &entry : root->
children())
2957 t <<
"<li><a href=\"" << relPath << url <<
"\"><span>";
2959 t <<
"</span></a>\n";
2972 bool highlightParent,
bool highlightSearch)
2995 entry.get()==hlEntry &&
2996 (!entry->children().empty() ||
2997 (entry->kind()==kind && !highlightParent)
3015 if (disableIndex || !generateTreeView || !fullSidebar)
3017 if (!serverBasedSearch)
3025 if (!highlightSearch)
3066 bool highlightParent=
false;
3094 highlightParent =
true;
break;
3096 highlightParent =
true;
break;
3098 highlightParent =
true;
break;
3100 highlightParent =
true;
break;
3102 highlightParent =
true;
break;
3104 highlightParent =
true;
break;
3106 highlightParent =
true;
break;
3108 highlightParent =
true;
break;
3113 t <<
"<script type=\"application/json\" id=\"doxygen-config\">\n";
3115 t <<
" \"relPath\": \"" << relPath <<
"\",\n";
3116 t <<
" \"generateTreeView\": " << (generateTreeView?
"true":
"false") <<
",\n";
3117 t <<
" \"searchEngine\": " << (searchEngine?
"true":
"false") <<
",\n";
3118 t <<
" \"serverBasedSearch\": " << (serverBasedSearch?
"true":
"false") <<
",\n";
3119 t <<
" \"disableIndex\": " << (disableIndex?
"true":
"false") <<
",\n";
3120 t <<
" \"dynamicMenus\": " << (dynamicMenus?
"true":
"false") <<
",\n";
3121 t <<
" \"fullSidebar\": " << (fullSidebar?
"true":
"false") <<
"\n";
3125 if (!disableIndex && dynamicMenus)
3134 searchPage =
"search.php";
3136 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menudata.js\"></script>\n";
3137 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menu.js\"></script>\n";
3138 t <<
"<div id=\"main-nav-mobile\">\n";
3139 if (searchEngine && !fullSidebar)
3141 t <<
"<div class=\"sm sm-dox\"><input id=\"main-menu-state\" type=\"checkbox\"/>\n";
3142 t <<
"<label class=\"main-menu-btn\" for=\"main-menu-state\">\n";
3143 t <<
"<span class=\"main-menu-btn-icon\"></span> Toggle main menu visibility</label>\n";
3144 t <<
"<span id=\"searchBoxPos1\">";
3148 t <<
"</div><!-- main-nav-mobile -->\n";
3149 t <<
"<div id=\"main-nav\">\n";
3150 t <<
" <ul class=\"sm sm-dox\" id=\"main-menu\">\n";
3151 t <<
" <li id=\"searchBoxPos2\">\n";
3152 if (searchEngine && !(generateTreeView && fullSidebar))
3158 t <<
"</div><!-- main-nav -->\n";
3160 else if (!disableIndex)
3164 if (!hlEntry && altKind!=LayoutNavEntry::None) { hlEntry=root->
find(altKind); kind=altKind; }
3167 highlightParent=
true;
3168 hlEntry = root->
children().front().get();
3169 if (hlEntry==
nullptr)
3174 if (kind==LayoutNavEntry::UserGroup)
3182 t <<
"<div id=\"main-nav\">\n";
3186 t <<
"</div><!-- main-nav -->\n";
3189 else if (!generateTreeView)
3193 if (generateTreeView && !disableIndex && fullSidebar && !extraTabs)
3195 t <<
"<div id=\"container\"><div id=\"doc-content\">\n";
3202 m_t <<
"</div><!-- top -->\n";
3203 if (!generateTreeView)
3205 m_t <<
"<div id=\"doc-content\">\n";
3214 if (generateTreeView)
3221 "<div id=\"side-nav\" class=\"ui-resizable side-nav-resizable\">\n");
3224 " <div id=\"nav-tree\">\n"
3225 " <div id=\"nav-tree-contents\">\n"
3226 " <div id=\"nav-sync\" class=\"sync\"></div>\n"
3229 " <div id=\"splitbar\" class=\"ui-resizable-handle\">\n"
3232 "<script type=\"text/javascript\">\n"
3233 "document.addEventListener('DOMContentLoaded',() => { initNavTree('" + fn +
"','" + relpath +
"','" + allMembersFile +
"'); });\n"
3237 result+=
"<div id=\"container\">\n<div id=\"doc-content\">\n";
3255 m_t <<
"<div class=\"contents\">\n";
3260 m_t <<
"</div><!-- contents -->\n";
3270 m_t <<
"</div><!-- PageDoc -->\n";
3284 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3289 DString configFileName = htmlOutput+
"/search_config.php";
3295 t <<
"$config = array(\n";
3296 t <<
" 'PROJECT_NAME' => \"" <<
convertToHtml(projectName) <<
"\",\n";
3297 t <<
" 'GENERATE_TREEVIEW' => " << (generateTreeView?
"true":
"false") <<
",\n";
3298 t <<
" 'DISABLE_INDEX' => " << (disableIndex?
"true":
"false") <<
",\n";
3299 t <<
" 'FULL_SIDEBAR' => " << (fullSidebar?
"true":
"false") <<
",\n";
3301 t <<
"$translator = array(\n";
3303 t <<
" 'search_results' => array(\n";
3328 << getDoxygenVersion() <<
" -->\n";
3329 t <<
"<script type=\"text/javascript\">\n";
3330 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3334 if (!disableIndex && !quickLinksAfterSplitbar)
3338 if (generateTreeView)
3340 t <<
"</div><!-- top -->\n";
3343 if (quickLinksAfterSplitbar)
3347 t <<
"<!-- generated -->\n";
3350 t <<
"require_once \"search_functions.php\";\n";
3355 if (generateTreeView)
3357 t <<
"</div><!-- doc-content -->\n";
3358 t <<
"</div><!-- container -->\n";
3365 DString scriptName = htmlOutput+
"/search/search.js";
3374 err(
"Failed to open file '{}' for writing...\n",scriptName);
3383 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3393 << getDoxygenVersion() <<
" -->\n";
3394 t <<
"<script type=\"text/javascript\">\n";
3395 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3399 if (!disableIndex && !quickLinksAfterSplitbar)
3403 if (generateTreeView)
3405 t <<
"</div><!-- top -->\n";
3408 if (quickLinksAfterSplitbar)
3413 t <<
"<div class=\"header\">\n";
3414 t <<
" <div class=\"headertitle\">\n";
3418 t <<
"<div class=\"contents\">\n";
3420 t <<
"<div id=\"searchresults\"></div>\n";
3423 if (generateTreeView)
3425 t <<
"</div><!-- doc-content -->\n";
3426 t <<
"</div><!-- container -->\n";
3434 DString scriptName = dname+
"/search/search.js";
3439 t <<
"const searchResultsText=["
3443 t <<
"const serverUrl=\"" <<
Config_getString(SEARCHENGINE_URL) <<
"\";\n";
3444 t <<
"const tagMap = {\n";
3448 for (
const auto &ml : extraSearchMappings)
3455 if (!tagName.
empty())
3457 if (!first) t <<
",\n";
3458 t <<
" \"" << tagName <<
"\": \"" << destName <<
"\"";
3463 if (!first) t <<
"\n";
3467 t <<
"document.addEventListener('DOMContentLoaded',() => {\n";
3468 t <<
" const query = trim(getURLParameter('query'));\n";
3469 t <<
" if (query) {\n";
3470 t <<
" searchFor(query,0,20);\n";
3472 t <<
" const results = document.getElementById('searchresults');\n";
3479 err(
"Failed to open file '{}' for writing...\n",scriptName);
3485 m_t <<
"<div class=\"typeconstraint\">\n";
3486 m_t <<
"<dl><dt><b>" << header <<
"</b></dt><dd>\n";
3487 m_t <<
"<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n";
3492 m_t <<
"<tr><td valign=\"top\"><em>";
3497 m_t <<
"</em></td>";
3502 m_t <<
"<td> :</td><td valign=\"top\"><em>";
3507 m_t <<
"</em></td>";
3512 m_t <<
"<td> ";
3517 m_t <<
"</td></tr>\n";
3522 m_t <<
"</table>\n";
3532 m_t <<
"<br class=\"" << style <<
"\" />\n";
3542 m_t <<
"<div class=\"header\">\n";
3547 m_t <<
" <div class=\"headertitle\">";
3559 m_t <<
"</div><!--header-->\n";
3566 m_t <<
"<table class=\"memberdecls memberdecls-inline\">\n";
3569 m_t <<
"<tr><th colspan=\"2\"><h3>";
3574 m_t <<
"</h3></th></tr>\n";
3579 DBG_HTML(
m_t <<
"<!-- startMemberDocSimple -->\n";)
3580 m_t <<
"<table class=\"fieldtable\">\n";
3581 m_t <<
"<tr><th colspan=\"" << (isEnum?
"2":
"3") <<
"\">";
3589 m_t <<
"</table>\n";
3594 DBG_HTML(
m_t <<
"<!-- startInlineMemberType -->\n";)
3595 m_t <<
"<tr><td class=\"fieldtype\">\n";
3600 DBG_HTML(
m_t <<
"<!-- endInlineMemberType -->\n";)
3606 DBG_HTML(
m_t <<
"<!-- startInlineMemberName -->\n";)
3607 m_t <<
"<td class=\"fieldname\">\n";
3612 DBG_HTML(
m_t <<
"<!-- endInlineMemberName -->\n";)
3618 DBG_HTML(
m_t <<
"<!-- startInlineMemberDoc -->\n";)
3619 m_t <<
"<td class=\"fielddoc\">\n";
3625 m_t <<
"</td></tr>\n";
3631 m_t <<
"<div class=\"embeddoc indent-" << indent <<
"\">";
3643 m_t <<
"<span class=\"mlabels\">";
3648 DBG_HTML(
m_t <<
"<!-- writeLabel(" << label <<
") -->\n";)
3650 auto convertLabelToClass = [](
const std::string &lab) {
3663 for (
size_t i=0; i<l; i++)
3665 char c = input.
at(i);
3666 if (c<0 || (c>=
'a' && c<=
'z') || c==
'_')
3671 else if (nmstart && (c<0 || (c>=
'a' && c<=
'z') || (c>=
'0' && c<=
'9') || c==
'_'))
3675 else if (nmstart && (c==
' ' || c==
'-'))
3683 m_t <<
"<span class=\"mlabel " << convertLabelToClass(label.
stripWhiteSpace().
str()) <<
"\">" << label <<
"</span>";
3697 DBG_HTML(
m_t <<
"<!-- writeInheritedSectionTitle -->\n";)
3705 classLink +=
" href=\"";
3710 classLink +=
"href=\"";
3715 classLink=classLink+fn+a;
3717 m_t <<
"<tr class=\"inherit_header " <<
id <<
"\">";
3718 if (dynamicSections)
3720 m_t <<
"<td colspan=\"2\" class=\"dyn-inherit\">";
3721 m_t <<
"<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
3725 m_t <<
"<td colspan=\"2\">";
3735 m_t <<
" <div class=\"summary\">\n";
3741 m_t <<
"<a href=\"";
3748 else if (!anchor.
empty())
3760 m_t <<
"<div id=\"page-nav\" class=\"page-nav-panel\">\n";
3761 m_t <<
"<div id=\"page-nav-resize-handle\"></div>\n";
3762 m_t <<
"<div id=\"page-nav-tree\">\n";
3763 m_t <<
"<div id=\"page-nav-contents\">\n";
3764 m_t <<
"</div><!-- page-nav-contents -->\n";
3765 m_t <<
"</div><!-- page-nav-tree -->\n";
3766 m_t <<
"</div><!-- page-nav -->\n";
3790 m_t <<
"<div class=\"toc\">";
3820 char cs[2] = {
static_cast<char>(
'0'+l+1), 0 };
3821 const char *empty = (l!=nextLevel-1) ?
" empty" :
"";
3840 char cs[2] = {
static_cast<char>(
'0'+nextLevel), 0 };
3845 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.
FileInfo(const std::string &name)
std::string fileName() 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
static void codeFolding(yyscan_t yyscanner, const Definition *d)
#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.
Web server based search engine.
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.