70static constexpr auto hex=
"0123456789ABCDEF";
78 t <<
" <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
79 t <<
" <span class=\"left\">\n";
80 t <<
" <span id=\"MSearchSelect\" class=\"search-icon\" ";
81 t <<
"onmouseover=\"return searchBox.OnSearchSelectShow()\" ";
82 t <<
"onmouseout=\"return searchBox.OnSearchSelectHide()\">";
83 t <<
"<span class=\"search-icon-dropdown\"></span></span>\n";
84 t <<
" <input type=\"text\" id=\"MSearchField\" value=\"\" placeholder=\""
86 t <<
" onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
87 t <<
" onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
88 t <<
" onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n";
89 t <<
" </span><span class=\"right\">\n";
90 t <<
" <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
91 <<
"<div id=\"MSearchCloseImg\" class=\"close-icon\"></div></a>\n";
101 t <<
" <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
102 t <<
" <div class=\"left\">\n";
103 t <<
" <form id=\"FSearchBox\" action=\"" << relPath;
112 t <<
"\" method=\"get\">\n";
113 t <<
" <span id=\"MSearchSelectExt\" class=\"search-icon\"></span>\n";
116 t <<
" <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" placeholder=\""
117 <<
theTranslator->trSearch() <<
"\" size=\"20\" accesskey=\"S\" \n";
118 t <<
" onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
119 t <<
" onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
121 t <<
" </div><div class=\"right\"></div>\n";
152 if (macrofile.
isEmpty())
return "";
158 const char *data = s.
data();
167 while (i < size && (data[i] ==
' ' || data[i] ==
'\t' || data[i] ==
'\n'))
169 if (data[i] ==
'\n') line++;
172 if (i >= size)
break;
176 warn(macrofile,line,
"file contains non valid code, expected '\\' got '{:c}'",data[i]);
182 i += strlen(
"newcommand");
186 i += strlen(
"renewcommand");
190 warn(macrofile,line,
"file contains non valid code, expected 'newcommand' or 'renewcommand'");
196 warn(macrofile,line,
"file contains non valid code, expected '{{' got '{:c}'",data[i]);
202 warn(macrofile,line,
"file contains non valid code, expected '\\' got '{:c}'",data[i]);
208 while (i < size && (data[i] !=
'}')) result+=data[i++];
211 warn(macrofile,line,
"file contains non valid code, no closing '}}' for command");
223 while (i < size && (data[i] !=
']')) nr += data[i++];
226 warn(macrofile,line,
"file contains non valid code, no closing ']'");
231 else if (data[i] !=
'{')
233 warn(macrofile,line,
"file contains non valid code, expected '[' or '{{' got '{:c}'",data[i]);
240 warn(macrofile,line,
"file contains non valid code, expected '{{' got '{:c}'",data[i]);
247 while (i < size && cnt)
259 else if (data[i] !=
'"') result+=data[i++];
267 if (cnt) result+=data[i];
285 warn(macrofile,line,
"file contains non valid code, no closing '}}' for replacement");
319 bool isSource =
false)
338 bool hasProjectName = !projectName.
isEmpty();
345 bool hasCookie = treeView || searchEngine ||
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE;
346 static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
351 cssFile =
"doxygen.css";
364 cssFile =
"doxygen.css";
371 for (
const auto &fileName : extraCssFile)
373 if (!fileName.empty())
378 extraCssText +=
"<link href=\""+htmlStyleSheet+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
385 extraCssText +=
"<link href=\"$relpath^"+
stripPath(fileName)+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
393 case TIMESTAMP_t::NO:
397 generatedBy =
theTranslator->trGeneratedAt(
"<span class=\"timestamp\"></span>",
403 treeViewCssJs =
"<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
404 "<script type=\"text/javascript\" src=\"$relpath^navtreedata.js\"></script>\n"
405 "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n";
410 searchCssJs =
"<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
411 if (!serverBasedSearch)
413 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/searchdata.js\"></script>\n";
415 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n";
417 if (!serverBasedSearch)
421 searchCssJs +=
"<script type=\"text/javascript\">\n"
422 "document.addEventListener('DOMContentLoaded', init_search);\n"
430 searchCssJs +=
"<script type=\"text/javascript\">\n"
431 "document.addEventListener('DOMContentLoaded', () => {\n"
432 " if (document.querySelector('.searchresults')) { searchBox.DOMSearchField().focus(); }\n"
438 searchCssJs +=
"<link rel=\"search\" href=\"" + relPath +
439 "search_opensearch.php?v=opensearch.xml\" "
440 "type=\"application/opensearchdescription+xml\" title=\"" +
441 (hasProjectName ? projectName :
QCString(
"Doxygen")) +
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 QCString &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+=
", \""+
QCString(s)+
".js\"";
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";
605 treeViewCssJs+=
"<script type=\"text/javascript\" src=\"$relpath^cookie.js\"></script>\n";
618 {
"$datetime", [&]() ->
QCString {
return "<span class=\"datetime\"></span>"; } },
619 {
"$date", [&]() ->
QCString {
return "<span class=\"date\"></span>"; } },
620 {
"$time", [&]() ->
QCString {
return "<span class=\"time\"></span>"; } },
621 {
"$year", [&]() ->
QCString {
return "<span class=\"year\"></span>"; } },
622 {
"$navpath", [&]() ->
QCString {
return navPath; } },
623 {
"$stylesheet", [&]() ->
QCString {
return cssFile; } },
624 {
"$treeview", [&]() ->
QCString {
return treeViewCssJs; } },
625 {
"$searchbox", [&]() ->
QCString {
return searchBox; } },
626 {
"$search", [&]() ->
QCString {
return searchCssJs; } },
627 {
"$mathjax", [&]() ->
QCString {
return mathJaxJs; } },
628 {
"$darkmode", [&]() ->
QCString {
return darkModeJs; } },
629 {
"$generatedby", [&]() ->
QCString {
return generatedBy; } },
630 {
"$extrastylesheet",[&]() ->
QCString {
return extraCssText; } },
631 {
"$relpath$", [&]() ->
QCString {
return relPath; } }
634 result =
substitute(result,
"$relpath^",relPath);
640 {
"FULL_SIDEBAR", hasFullSideBar },
641 {
"DISABLE_INDEX", disableIndex },
642 {
"GENERATE_TREEVIEW", treeView },
643 {
"SEARCHENGINE", searchEngine },
644 {
"TITLEAREA", titleArea },
645 {
"PROJECT_NAME", hasProjectName },
646 {
"PROJECT_NUMBER", hasProjectNumber },
647 {
"PROJECT_BRIEF", hasProjectBrief },
648 {
"PROJECT_LOGO", hasProjectLogo },
649 {
"PROJECT_ICON", hasProjectIcon },
650 {
"COPY_CLIPBOARD", hasCopyClipboard },
652 {
"HTML_DYNAMIC_SECTIONS", dynamicSections},
668 while ((i=definitions.
find(
'\n',p))!=-1)
673 int separator = line.
find(
':');
674 assert(separator!=-1);
675 std::string key = line.
left(separator).
str();
679 map.emplace(key,value);
690 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
694 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
707 while ((i=input.
find(
"var(",p))!=-1)
709 result+=input.
mid(p,i-p);
710 int j=input.
find(
")",i+4);
712 auto it = mapping.find(input.
mid(i+4,j-i-4).
str());
713 if (it==mapping.end())
715 err(
"failed to find value variable {}. It is not longer defined in doxygen.css\n",input.
mid(i+4,j-i-4));
729 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
733 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
769 const char *p=str.
data();
782 int spacesToNextTabStop = tabSize - (
m_col%tabSize);
783 while (spacesToNextTabStop--)
802 case '\'': *
m_t <<
"'";
m_col++;
804 case '"': *
m_t <<
""";
m_col++;
808 { *
m_t <<
"<"; p++; }
810 { *
m_t <<
">"; p++; }
812 { *
m_t <<
"\\‍[";
m_col++;p++; }
814 { *
m_t <<
"\\‍]";
m_col++;p++; }
816 { *
m_t <<
"\\‍(";
m_col++;p++; }
818 { *
m_t <<
"\\‍)";
m_col++;p++; }
825 uint8_t uc =
static_cast<uint8_t
>(c);
828 *
m_t <<
"$" <<
hex[uc>>4] <<
hex[uc&0xF] <<
";";
872 const QCString &anchor,
int l,
bool writeLineAnchor)
876 const int maxLineNrStr = 10;
877 char lineNumber[maxLineNrStr];
878 char lineAnchor[maxLineNrStr];
879 qsnprintf(lineNumber,maxLineNrStr,
"%5d",l);
880 qsnprintf(lineAnchor,maxLineNrStr,
"l%05d",l);
885 *
m_t <<
"<div class=\"line\">";
889 if (writeLineAnchor) *
m_t <<
"<a id=\"" << lineAnchor <<
"\" name=\"" << lineAnchor <<
"\"></a>";
890 *
m_t <<
"<span class=\"lineno\">";
928 *
m_t <<
"<a class=\"" << className <<
"Ref\" ";
933 *
m_t <<
"<a class=\"" << className <<
"\" ";
953 *
m_t <<
"<div class=\"ttc\" id=\"" <<
id <<
"\">";
954 *
m_t <<
"<div class=\"ttname\">";
957 *
m_t <<
"<a href=\"";
973 *
m_t <<
"<div class=\"ttdeci\">";
980 *
m_t <<
"<div class=\"ttdoc\">";
987 *
m_t <<
"<div class=\"ttdef\"><b>" <<
theTranslator->trDefinition() <<
"</b> ";
990 *
m_t <<
"<a href=\"";
1006 *
m_t <<
"<div class=\"ttdecl\"><b>" <<
theTranslator->trDeclaration() <<
"</b> ";
1009 *
m_t <<
"<a href=\"";
1034 *
m_t <<
"<div class=\"line\">";
1058 *
m_t <<
"<span class=\"" << s <<
"\">";
1070 *
m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1075 *
m_t <<
"<div class=\"fragment\">";
1087 *
m_t <<
"</div><!-- fragment -->";
1097 const int maxLineNrStr = 10;
1098 char lineNumber[maxLineNrStr];
1099 qsnprintf(lineNumber,maxLineNrStr,
"%05d",lineNr);
1100 *
m_t <<
"<div class=\"foldopen\" id=\"foldopen" << lineNumber <<
1101 "\" data-start=\"" << startMarker <<
1102 "\" data-end=\"" << endMarker <<
1106 *
m_t <<
"<div class=\"line\">";
1114 *
m_t <<
"<div class=\"line\">";
1190 return (str.
contains(
"$datetime",
false) ||
1203 term(
"Could not create output directory {}\n",dname);
1382 searchCss = mgr.
getAsString(
"search_sidebar.css");
1388 searchCss = mgr.
getAsString(
"search_nomenu_toggle.css");
1397 searchCss = mgr.
getAsString(
"search_fixedtabs.css");
1404 searchCss += mgr.
getAsString(
"search_common.css");
1405 searchCss =
substitute(searchCss,
"$doxygenversion",getDoxygenVersion());
1413 t <<
"/* The standard CSS for doxygen " << getDoxygenVersion() <<
"*/\n\n";
1416 case HTML_COLORSTYLE_t::LIGHT:
1417 case HTML_COLORSTYLE_t::DARK:
1420 case HTML_COLORSTYLE_t::AUTO_LIGHT:
1421 case HTML_COLORSTYLE_t::TOGGLE:
1426 case HTML_COLORSTYLE_t::AUTO_DARK:
1432 if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_LIGHT)
1434 t <<
"@media (prefers-color-scheme: dark) {\n";
1435 t <<
" html:not(.dark-mode) {\n";
1436 t <<
" color-scheme: dark;\n\n";
1440 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_DARK)
1442 t <<
"@media (prefers-color-scheme: light) {\n";
1443 t <<
" html:not(.light-mode) {\n";
1444 t <<
" color-scheme: light;\n\n";
1448 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
1450 t <<
"html.dark-mode {\n";
1461 " border-bottom: none;\n"
1462 " background-color: var(--nav-background-color);\n"
1463 " border-right: 1px solid var(--nav-border-color);\n"
1478 case TIMESTAMP_t::YES:
1479 case TIMESTAMP_t::DATETIME:
1482 case TIMESTAMP_t::DATE:
1488 t <<
"--timestamp: '" << timeStampStr <<
"';\n";
1501 t <<
"span.timestamp { content: ' '; }\n";
1502 t <<
"span.timestamp:before { content: var(--timestamp); }\n\n";
1506 t <<
"span.datetime { content: ' '; }\n";
1507 t <<
"span.datetime:before { content: var(--datetime); }\n\n";
1508 t <<
"span.date { content: ' '; }\n";
1509 t <<
"span.date:before { content: var(--date); }\n\n";
1510 t <<
"span.time { content: ' '; }\n";
1511 t <<
"span.time:before { content: var(--time); }\n\n";
1512 t <<
"span.year { content: ' '; }\n";
1513 t <<
"span.year:before { content: var(--year); }\n\n";
1520 bool addScrollbarStyling =
Config_getList(HTML_EXTRA_STYLESHEET).empty();
1521 if (addScrollbarStyling)
1536 t <<
"<!-- HTML header for doxygen " << getDoxygenVersion() <<
"-->\n";
1542 t <<
"<!-- HTML footer for doxygen " << getDoxygenVersion() <<
"-->\n";
1569 << getDoxygenVersion() <<
" -->\n";
1573 m_t <<
"<script type=\"text/javascript\">\n";
1574 m_t <<
"let searchBox = new SearchBox(\"searchBox\", \""
1576 m_t <<
"</script>\n";
1580 m_t <<
"<script type=\"text/javascript\">\n";
1581 m_t <<
"document.addEventListener('DOMContentLoaded', codefold.init);\n";
1582 m_t <<
"</script>\n";
1591 if (searchEngine && !serverBasedSearch)
1593 t <<
"<!-- window showing the filter options -->\n";
1594 t <<
"<div id=\"MSearchSelectWindow\"\n";
1595 t <<
" onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
1596 t <<
" onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
1597 t <<
" onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n";
1600 t <<
"<!-- iframe showing the search results (closed by default) -->\n";
1601 t <<
"<div id=\"MSearchResultsWindow\">\n";
1602 t <<
"<div id=\"MSearchResults\">\n";
1603 t <<
"<div class=\"SRPage\">\n";
1604 t <<
"<div id=\"SRIndex\">\n";
1605 t <<
"<div id=\"SRResults\"></div>\n";
1606 t <<
"<div class=\"SRStatus\" id=\"Loading\">" <<
theTranslator->trLoading() <<
"</div>\n";
1607 t <<
"<div class=\"SRStatus\" id=\"Searching\">" <<
theTranslator->trSearching() <<
"</div>\n";
1608 t <<
"<div class=\"SRStatus\" id=\"NoMatches\">" <<
theTranslator->trNoMatches() <<
"</div>\n";
1628 case TIMESTAMP_t::NO:
1632 result =
theTranslator->trGeneratedAt(
"<span class=\"timestamp\"></span>",
1636 result +=
" \n<a href=\"https://www.doxygen.org/index.html\">\n"
1637 "<img class=\"footer\" src=\"";
1639 result +=
"doxygen.svg\" width=\"104\" height=\"31\" alt=\"doxygen\"/></a> ";
1640 result += getDoxygenVersion();
1668 m_t <<
"<h3 class=\"version\">";
1697 err(
"style sheet {} does not exist or is not readable!\n",
Config_getString(HTML_STYLESHEET));
1712 for (
const auto &
fileName : extraCssFiles)
1757 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1771 m_t <<
"\n<p class=\"" << classDef <<
"\">";
1803 m_t <<
"<a class=\"elRef\" ";
1808 m_t <<
"<a class=\"el\" ";
1846 m_t <<
"<a class=\"el\" href=\"" << fn <<
"\">";
1856 m_t <<
"<a class=\"elRef\" ";
1861 m_t <<
"<a class=\"el\" ";
1877 m_t <<
"<a href=\"";
1894 if (extraIndentLevel==2)
1898 else if (extraIndentLevel==1)
1910 m_t <<
" class=\"groupheader\">";
1915 if (extraIndentLevel==2)
1919 else if (extraIndentLevel==1)
1931 switch(
type.level())
1940 default:
ASSERT(0);
break;
1942 m_t <<
"<a id=\"" << lab <<
"\" name=\"" << lab <<
"\"></a>";
1947 switch(
type.level())
1956 default:
ASSERT(0);
break;
1969 const char *p=str.
data();
1975 case '<':
m_t <<
"<";
break;
1976 case '>':
m_t <<
">";
break;
1977 case '&':
m_t <<
"&";
break;
1978 case '"':
m_t <<
""";
break;
1979 case '-':
if (inHtmlComment)
m_t <<
"-";
else m_t <<
"-";
break;
1982 {
m_t <<
"<"; p++; }
1984 {
m_t <<
">"; p++; }
1986 {
m_t <<
"\\‍["; p++; }
1988 {
m_t <<
"\\‍]"; p++; }
1990 {
m_t <<
"\\‍("; p++; }
1992 {
m_t <<
"\\‍)"; p++; }
2013 const QCString &relPath,
int sectionCount)
2017 if (dynamicSections)
2019 t <<
"<div id=\"dynsection-" << sectionCount <<
"\" "
2020 "onclick=\"return dynsection.toggleVisibility(this)\" "
2021 "class=\"dynheader closed\" "
2022 "style=\"cursor:pointer;\">"
2023 "<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
2027 t <<
"<div class=\"dynheader\">\n";
2041 if (dynamicSections)
2043 t <<
"<div id=\"dynsection-" << sectionCount <<
"-summary\" "
2044 "class=\"dynsummary\" "
2045 "style=\"display:block;\">\n";
2053 if (dynamicSections)
2063 if (dynamicSections)
2065 t <<
"<div id=\"dynsection-" << sectionCount <<
"-content\" "
2066 "class=\"dyncontent\" "
2067 "style=\"display:none;\">\n";
2071 t <<
"<div class=\"dyncontent\">\n";
2099 m_t <<
" <div class=\"center\">\n";
2100 m_t <<
" <img src=\"";
2102 m_t <<
"_map\" alt=\"\"/>\n";
2112 m_t <<
" <div class=\"center\">\n";
2113 m_t <<
" <img src=\"";
2142 m_t <<
"<table class=\"memberdecls\">\n";
2148 if (dynamicSections)
m_t <<
" inherit";
2149 m_t <<
" " << inheritId;
2166 m_t <<
"</td></tr>\n";
2176 m_t <<
"</td></tr>\n";
2180 if (dynamicSections)
m_t <<
" inherit";
2181 m_t <<
" " << inheritId;
2183 m_t <<
" template\"><td class=\"memItemLeft\">";
2188 m_t <<
"<div class=\"compoundTemplParams\">";
2199 m_t <<
" </td><td class=\"memItemRight\">";
2204 if (!initTag)
m_t <<
" </td>";
2216 DBG_HTML(
m_t <<
"<!-- startMemberDescription -->\n")
2220 m_t <<
"<table class=\"memberdecls\">\n";
2223 m_t <<
"<tr class=\"memdesc:" << anchor;
2226 if (dynamicSections)
m_t <<
" inherit";
2227 m_t <<
" " << inheritId;
2230 m_t <<
"<td class=\"mdescLeft\"> </td>";
2231 if (typ)
m_t <<
"<td class=\"mdescLeft\"> </td>";
2232 m_t <<
"<td class=\"mdescRight\">";
2237 DBG_HTML(
m_t <<
"<!-- endMemberDescription -->\n")
2238 m_t <<
"<br /></td></tr>\n";
2254 m_t <<
"</table>\n";
2268 m_t <<
"<table class=\"memberdecls\">\n";
2271 m_t <<
"<tr class=\"heading\"><td colspan=\"" << typ <<
"\"><h2";
2274 m_t <<
" id=\"header-" << anchor <<
"\"";
2276 m_t <<
" class=\"groupheader\">";
2279 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>\n";
2286 m_t <<
"</h2></td></tr>\n";
2294 m_t <<
"<table class=\"memberdecls\">\n";
2297 m_t <<
"<tr><td class=\"ititle\" colspan=\"2\">";
2303 m_t <<
"</td></tr>\n";
2313 m_t <<
"</table>\n";
2348 int memCount,
int memTotal,
bool )
2351 m_t <<
"\n<h2 class=\"memtitle\">"
2352 <<
"<span class=\"permalink\"><a href=\"#" << anchor <<
"\">◆ </a></span>";
2356 m_t <<
" <span class=\"overload\">[" << memCount <<
"/" << memTotal <<
"]</span>";
2359 m_t <<
"\n<div class=\"memitem\">\n";
2360 m_t <<
"<div class=\"memproto\">\n";
2365 DBG_HTML(
m_t <<
"<!-- startMemberDocPrefixItem -->\n";)
2366 m_t <<
"<div class=\"memtemplate\">\n";
2371 DBG_HTML(
m_t <<
"<!-- endMemberDocPrefixItem -->\n";)
2379 m_t <<
" <table class=\"memname\">\n";
2382 m_t <<
" <td class=\"memname\">";
2395 if (openBracket)
m_t <<
"(";
2403 DBG_HTML(
m_t <<
"<!-- startFirstParameterType -->\n";)
2404 m_t <<
" <td class=\"paramtype\">";
2410 m_t <<
" <td class=\"paramkey\">" << key <<
"</td>\n";
2411 m_t <<
" <td></td>\n";
2412 m_t <<
" <td class=\"paramtype\">";
2425 m_t <<
" <td class=\"paramname\"><span class=\"paramname\"><em>";
2431 m_t <<
"</em></span>";
2436 DBG_HTML(
m_t <<
"<!-- startParameterExtra -->\n";)
2446 if (closeBracket)
m_t <<
"</td><td>)";
2453 if (closeBracket)
m_t <<
")";
2465 m_t <<
"<span class=\"paramdefsep\">";
2467 m_t <<
"</span><span class=\"paramdefval\">";
2490 m_t <<
" <td align=\"right\">";
2494 m_t <<
prefix <<
"</td><td>(</td><td colspan=\"2\">";
2495 else if (closeBracket)
2496 m_t <<
" )</td><td></td><td></td><td>";
2498 m_t <<
"</td><td></td><td colspan=\"2\">";
2508 m_t <<
" </table>\n";
2527 if (generateLegend && !umlLook)
2530 m_t <<
"<center><span class=\"legend\">[";
2533 if (generateTreeView)
m_t <<
"target=\"top\" ";
2539 m_t <<
"]</span></center>";
2625 m_t <<
"<tr id=\"" <<
id <<
"\" class=\"groupHeader\"><td colspan=\"2\"><div class=\"groupHeader\">";
2630 m_t <<
"</div></td></tr>\n";
2635 m_t <<
"<tr><td colspan=\"2\" class=\"ititle\"><div class=\"groupText\">";
2640 m_t <<
"</div></td></tr>\n";
2655 m_t <<
"<div class=\"memdoc\">\n";
2661 m_t <<
"\n</div>\n" <<
"</div>\n";
2670 for (
int i=0; i<n; i++)
2678 m_t <<
"<table class=\"fieldtable\">\n"
2679 <<
"<tr><th colspan=\"" << (hasInits?3:2) <<
"\">" << title <<
"</th></tr>";
2683 m_t <<
"</table>\n";
2698 m_t <<
"<td class=\"fieldname\">";
2703 m_t <<
" </td>";
2708 m_t <<
"<td class=\"fieldinit\">";
2713 m_t <<
" </td>";
2718 m_t <<
"<td class=\"fielddoc\">";
2728 m_t <<
"<dl class=\"section examples\"><dt>";
2741 if (astImpl && sectionLevel<=
m_tocState.maxLevel)
2745 std::visit(visitor,astImpl->
root);
2757 t <<
" <div id=\"navrow1\" class=\"tabs\">\n";
2761 t <<
" <div id=\"navrow2\" class=\"tabs2\">\n";
2763 t <<
" <ul class=\"tablist\">\n";
2791 t <<
" class=\"current\"";
2801 if (!l.
isEmpty()) t <<
"</a>";
2812 case LayoutNavEntry::MainPage:
return TRUE;
2813 case LayoutNavEntry::User:
return TRUE;
2814 case LayoutNavEntry::UserGroup:
return TRUE;
2815 case LayoutNavEntry::Pages:
return index.numIndexedPages()>0;
2816 case LayoutNavEntry::Topics:
return index.numDocumentedGroups()>0;
2817 case LayoutNavEntry::Modules:
return index.numDocumentedModules()>0;
2818 case LayoutNavEntry::ModuleList:
return index.numDocumentedModules()>0;
2820 case LayoutNavEntry::Namespaces:
return showNamespaces && index.numDocumentedNamespaces()>0;
2821 case LayoutNavEntry::NamespaceList:
return showNamespaces && index.numDocumentedNamespaces()>0;
2823 case LayoutNavEntry::Concepts:
return index.numDocumentedConcepts()>0;
2824 case LayoutNavEntry::Classes:
return index.numAnnotatedClasses()>0;
2825 case LayoutNavEntry::ClassList:
return index.numAnnotatedClasses()>0;
2826 case LayoutNavEntry::ClassIndex:
return index.numAnnotatedClasses()>0;
2827 case LayoutNavEntry::ClassHierarchy:
return index.numHierarchyClasses()>0;
2829 case LayoutNavEntry::Files:
return showFiles && index.numDocumentedFiles()>0;
2830 case LayoutNavEntry::FileList:
return showFiles && index.numDocumentedFiles()>0;
2833 case LayoutNavEntry::Interfaces:
return index.numAnnotatedInterfaces()>0;
2834 case LayoutNavEntry::InterfaceList:
return index.numAnnotatedInterfaces()>0;
2835 case LayoutNavEntry::InterfaceIndex:
return index.numAnnotatedInterfaces()>0;
2836 case LayoutNavEntry::InterfaceHierarchy:
return index.numHierarchyInterfaces()>0;
2837 case LayoutNavEntry::Structs:
return index.numAnnotatedStructs()>0;
2838 case LayoutNavEntry::StructList:
return index.numAnnotatedStructs()>0;
2839 case LayoutNavEntry::StructIndex:
return index.numAnnotatedStructs()>0;
2840 case LayoutNavEntry::Exceptions:
return index.numAnnotatedExceptions()>0;
2841 case LayoutNavEntry::ExceptionList:
return index.numAnnotatedExceptions()>0;
2842 case LayoutNavEntry::ExceptionIndex:
return index.numAnnotatedExceptions()>0;
2843 case LayoutNavEntry::ExceptionHierarchy:
return index.numHierarchyExceptions()>0;
2844 case LayoutNavEntry::None:
2845 assert(kind != LayoutNavEntry::None);
2855 for (
const auto &entry : root->
children())
2862 for (
const auto &entry : root->
children())
2867 t <<
"<li><a href=\"" << relPath << url <<
"\"><span>";
2869 t <<
"</span></a>\n";
2882 bool highlightParent,
bool highlightSearch)
2905 entry.get()==hlEntry &&
2906 (!entry->children().empty() ||
2907 (entry->kind()==kind && !highlightParent)
2925 if (disableIndex || !generateTreeView || !fullSidebar)
2927 if (!serverBasedSearch)
2935 if (!highlightSearch)
2976 bool highlightParent=
false;
3004 highlightParent =
true;
break;
3006 highlightParent =
true;
break;
3008 highlightParent =
true;
break;
3010 highlightParent =
true;
break;
3012 highlightParent =
true;
break;
3014 highlightParent =
true;
break;
3016 highlightParent =
true;
break;
3018 highlightParent =
true;
break;
3023 if (!disableIndex && dynamicMenus)
3032 searchPage =
"search.php";
3034 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menudata.js\"></script>\n";
3035 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menu.js\"></script>\n";
3036 t <<
"<script type=\"text/javascript\">\n";
3037 t <<
"document.addEventListener('DOMContentLoaded', () => {\n";
3038 t <<
" initMenu('" << relPath <<
"'," << (generateTreeView?
"true":
"false") <<
");\n";
3041 if (!serverBasedSearch)
3043 if (!disableIndex && dynamicMenus && !fullSidebar)
3045 t <<
" init_search();\n";
3050 t <<
" if (document.querySelector('.searchresults')) { searchBox.DOMSearchField().focus(); }\n";
3055 t <<
"<div id=\"main-nav-mobile\">\n";
3056 if (searchEngine && !fullSidebar)
3058 t <<
"<div class=\"sm sm-dox\"><input id=\"main-menu-state\" type=\"checkbox\"/>\n";
3059 t <<
"<label class=\"main-menu-btn\" for=\"main-menu-state\">\n";
3060 t <<
"<span class=\"main-menu-btn-icon\"></span> Toggle main menu visibility</label>\n";
3061 t <<
"<span id=\"searchBoxPos1\" style=\"position:absolute;right:8px;top:8px;height:36px;\">";
3065 t <<
"</div><!-- main-nav-mobile -->\n";
3066 t <<
"<div id=\"main-nav\">\n";
3067 t <<
" <ul class=\"sm sm-dox\" id=\"main-menu\">\n";
3068 t <<
" <li id=\"searchBoxPos2\" style=\"float:right\">\n";
3069 if (searchEngine && !(generateTreeView && fullSidebar))
3075 t <<
"</div><!-- main-nav -->\n";
3077 else if (!disableIndex)
3081 if (!hlEntry && altKind!=LayoutNavEntry::None) { hlEntry=root->
find(altKind); kind=altKind; }
3084 highlightParent=
TRUE;
3085 hlEntry = root->
children().front().get();
3086 if (hlEntry==
nullptr)
3091 if (kind==LayoutNavEntry::UserGroup)
3099 t <<
"<div id=\"main-nav\">\n";
3103 t <<
"</div><!-- main-nav -->\n";
3106 else if (!generateTreeView)
3110 if (generateTreeView && !disableIndex && fullSidebar && !extraTabs)
3112 t <<
"<div id=\"container\"><div id=\"doc-content\">\n";
3119 m_t <<
"</div><!-- top -->\n";
3120 if (!generateTreeView)
3122 m_t <<
"<div id=\"doc-content\">\n";
3131 if (generateTreeView)
3138 "<div id=\"side-nav\" class=\"ui-resizable side-nav-resizable\">\n");
3141 " <div id=\"nav-tree\">\n"
3142 " <div id=\"nav-tree-contents\">\n"
3143 " <div id=\"nav-sync\" class=\"sync\"></div>\n"
3146 " <div id=\"splitbar\" style=\"-moz-user-select:none;\" \n"
3147 " class=\"ui-resizable-handle\">\n"
3150 "<script type=\"text/javascript\">\n"
3151 "document.addEventListener('DOMContentLoaded',() => { initNavTree('" + fn +
"','" + relpath +
"','" + allMembersFile +
"'); });\n"
3155 result+=
"<div id=\"container\">\n<div id=\"doc-content\">\n";
3173 m_t <<
"<div class=\"contents\">\n";
3178 m_t <<
"</div><!-- contents -->\n";
3188 m_t <<
"</div><!-- PageDoc -->\n";
3202 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3207 QCString configFileName = htmlOutput+
"/search_config.php";
3213 t <<
"$config = array(\n";
3214 t <<
" 'PROJECT_NAME' => \"" <<
convertToHtml(projectName) <<
"\",\n";
3215 t <<
" 'GENERATE_TREEVIEW' => " << (generateTreeView?
"true":
"false") <<
",\n";
3216 t <<
" 'DISABLE_INDEX' => " << (disableIndex?
"true":
"false") <<
",\n";
3217 t <<
" 'FULL_SIDEBAR' => " << (fullSidebar?
"true":
"false") <<
",\n";
3219 t <<
"$translator = array(\n";
3220 t <<
" 'search_results_title' => \"" <<
theTranslator->trSearchResultsTitle() <<
"\",\n";
3221 t <<
" 'search_results' => array(\n";
3222 t <<
" 0 => \"" <<
theTranslator->trSearchResults(0) <<
"\",\n";
3223 t <<
" 1 => \"" <<
theTranslator->trSearchResults(1) <<
"\",\n";
3226 t <<
" 'search_matches' => \"" <<
theTranslator->trSearchMatches() <<
"\",\n";
3227 t <<
" 'search' => \"" <<
theTranslator->trSearch() <<
"\",\n";
3245 t <<
"<!-- " <<
theTranslator->trGeneratedBy() <<
" Doxygen "
3246 << getDoxygenVersion() <<
" -->\n";
3247 t <<
"<script type=\"text/javascript\">\n";
3248 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3252 if (!disableIndex && !quickLinksAfterSplitbar)
3256 if (generateTreeView)
3258 t <<
"</div><!-- top -->\n";
3261 if (quickLinksAfterSplitbar)
3265 t <<
"<!-- generated -->\n";
3268 t <<
"require_once \"search_functions.php\";\n";
3273 if (generateTreeView)
3275 t <<
"</div><!-- doc-content -->\n";
3276 t <<
"</div><!-- container -->\n";
3283 QCString scriptName = htmlOutput+
"/search/search.js";
3292 err(
"Failed to open file '{}' for writing...\n",scriptName);
3301 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3310 t <<
"<!-- " <<
theTranslator->trGeneratedBy() <<
" Doxygen "
3311 << getDoxygenVersion() <<
" -->\n";
3312 t <<
"<script type=\"text/javascript\">\n";
3313 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3317 if (!disableIndex && !quickLinksAfterSplitbar)
3321 if (generateTreeView)
3323 t <<
"</div><!-- top -->\n";
3326 if (quickLinksAfterSplitbar)
3331 t <<
"<div class=\"header\">\n";
3332 t <<
" <div class=\"headertitle\">\n";
3333 t <<
" <div class=\"title\">" <<
theTranslator->trSearchResultsTitle() <<
"</div>\n";
3336 t <<
"<div class=\"contents\">\n";
3338 t <<
"<div id=\"searchresults\"></div>\n";
3341 if (generateTreeView)
3343 t <<
"</div><!-- doc-content -->\n";
3344 t <<
"</div><!-- container -->\n";
3352 QCString scriptName = dname+
"/search/search.js";
3357 t <<
"const searchResultsText=["
3361 t <<
"const serverUrl=\"" <<
Config_getString(SEARCHENGINE_URL) <<
"\";\n";
3362 t <<
"const tagMap = {\n";
3366 for (
const auto &ml : extraSearchMappings)
3369 int eqPos = mapLine.
find(
'=');
3376 if (!first) t <<
",\n";
3377 t <<
" \"" << tagName <<
"\": \"" << destName <<
"\"";
3382 if (!first) t <<
"\n";
3386 t <<
"document.addEventListener('DOMContentLoaded',() => {\n";
3387 t <<
" const query = trim(getURLParameter('query'));\n";
3388 t <<
" if (query) {\n";
3389 t <<
" searchFor(query,0,20);\n";
3391 t <<
" const results = document.getElementById('results');\n";
3392 t <<
" results.innerHtml = '<p>" <<
theTranslator->trSearchResults(0) <<
"</p>';\n";
3398 err(
"Failed to open file '{}' for writing...\n",scriptName);
3404 m_t <<
"<div class=\"typeconstraint\">\n";
3405 m_t <<
"<dl><dt><b>" << header <<
"</b></dt><dd>\n";
3406 m_t <<
"<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n";
3411 m_t <<
"<tr><td valign=\"top\"><em>";
3416 m_t <<
"</em></td>";
3421 m_t <<
"<td> :</td><td valign=\"top\"><em>";
3426 m_t <<
"</em></td>";
3431 m_t <<
"<td> ";
3436 m_t <<
"</td></tr>\n";
3441 m_t <<
"</table>\n";
3451 m_t <<
"<br class=\"" << style <<
"\" />\n";
3461 m_t <<
"<div class=\"header\">\n";
3466 m_t <<
" <div class=\"headertitle\">";
3478 m_t <<
"</div><!--header-->\n";
3485 m_t <<
"<table class=\"memberdecls\">\n";
3488 m_t <<
"<tr><td colspan=\"2\"><h3>";
3493 m_t <<
"</h3></td></tr>\n";
3498 DBG_HTML(
m_t <<
"<!-- startMemberDocSimple -->\n";)
3499 m_t <<
"<table class=\"fieldtable\">\n";
3500 m_t <<
"<tr><th colspan=\"" << (isEnum?
"2":
"3") <<
"\">";
3508 m_t <<
"</table>\n";
3513 DBG_HTML(
m_t <<
"<!-- startInlineMemberType -->\n";)
3514 m_t <<
"<tr><td class=\"fieldtype\">\n";
3519 DBG_HTML(
m_t <<
"<!-- endInlineMemberType -->\n";)
3525 DBG_HTML(
m_t <<
"<!-- startInlineMemberName -->\n";)
3526 m_t <<
"<td class=\"fieldname\">\n";
3531 DBG_HTML(
m_t <<
"<!-- endInlineMemberName -->\n";)
3537 DBG_HTML(
m_t <<
"<!-- startInlineMemberDoc -->\n";)
3538 m_t <<
"<td class=\"fielddoc\">\n";
3544 m_t <<
"</td></tr>\n";
3550 m_t <<
"<div class=\"embeddoc\" style=\"margin-left:" << indent <<
"ch;\">";
3562 m_t <<
"<span class=\"mlabels\">";
3567 DBG_HTML(
m_t <<
"<!-- writeLabel(" << label <<
") -->\n";)
3569 auto convertLabelToClass = [](
const std::string &lab) {
3582 for (
size_t i=0; i<l; i++)
3584 char c = input.
at(i);
3585 if (c<0 || (c>=
'a' && c<=
'z') || c==
'_')
3590 else if (nmstart && (c<0 || (c>=
'a' && c<=
'z') || (c>=
'0' && c<=
'9') || c==
'_'))
3594 else if (nmstart && (c==
' ' || c==
'-'))
3602 m_t <<
"<span class=\"mlabel " << convertLabelToClass(label.
stripWhiteSpace().
str()) <<
"\">" << label <<
"</span>";
3616 DBG_HTML(
m_t <<
"<!-- writeInheritedSectionTitle -->\n";)
3624 classLink +=
" href=\"";
3629 classLink +=
"href=\"";
3634 classLink=classLink+fn+a;
3636 m_t <<
"<tr class=\"inherit_header " <<
id <<
"\">";
3637 if (dynamicSections)
3639 m_t <<
"<td colspan=\"2\" onclick=\"javascript:dynsection.toggleInherit('" <<
id <<
"')\">";
3640 m_t <<
"<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
3644 m_t <<
"<td colspan=\"2\">";
3654 m_t <<
" <div class=\"summary\">\n";
3660 m_t <<
"<a href=\"";
3679 m_t <<
"<div id=\"page-nav\" class=\"page-nav-panel\">\n";
3680 m_t <<
"<div id=\"page-nav-resize-handle\"></div>\n";
3681 m_t <<
"<div id=\"page-nav-tree\">\n";
3682 m_t <<
"<div id=\"page-nav-contents\">\n";
3683 m_t <<
"</div><!-- page-nav-contents -->\n";
3684 m_t <<
"</div><!-- page-nav-tree -->\n";
3685 m_t <<
"</div><!-- page-nav -->\n";
3704 m_t <<
"<div class=\"toc\">";
3723 if (
type.isSection())
3726 int nextLevel =
type.level();
3734 char cs[2] = {
static_cast<char>(
'0'+l+1), 0 };
3735 const char *empty = (l!=nextLevel-1) ?
" empty" :
"";
3754 char cs[2] = {
static_cast<char>(
'0'+nextLevel), 0 };
3759 m_t <<
"<a href=\"#"+label+
"\">";
3767 int nextLevel =
type.level();
Class representing a built-in class diagram.
void writeImage(TextStream &t, const QCString &path, const QCString &relPath, const QCString &file, bool generateMap=true) const
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.
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1)
Representation of a class inheritance or dependency graph.
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool TBRank=TRUE, bool imageMap=TRUE, int graphId=-1)
Representation of an directory dependency graph.
QCString writeGraph(TextStream &out, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1, bool linkRelations=TRUE)
Represents a graphical class hierarchy.
void writeGraph(TextStream &t, const QCString &path, const QCString &fileName)
Representation of a group collaboration graph.
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1)
Representation of an include dependency graph.
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1)
static PageLinkedMap * exampleLinkedMap
static IndexList * indexList
static QCString htmlFileExtension
Minimal replacement for QFileInfo.
std::string fileName() const
std::string absFilePath() const
Generator for HTML code fragments.
void codify(const QCString &text) override
void startSpecialComment() override
void endCodeLine() override
void startFontClass(const QCString &s) override
void writeCodeAnchor(const QCString &anchor) override
size_t m_stripIndentAmount
void writeCodeLink(CodeSymbolType type, const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name, const QCString &tooltip) override
void startFold(int, const QCString &, const QCString &) override
void writeLineNumber(const QCString &, const QCString &, const QCString &, int, bool) override
void startCodeLine(int) override
void _writeCodeLink(const QCString &className, const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name, const QCString &tooltip)
void setRelativePath(const QCString &path)
void setStripIndentAmount(size_t amount) override
void endSpecialComment() override
HtmlCodeGenerator(TextStream *t, const QCString &relPath)
void writeTooltip(const QCString &id, const DocLinkInfo &docInfo, const QCString &decl, const QCString &desc, const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo) override
void endFontClass() override
void startCodeFragment(const QCString &style) override
void endCodeFragment(const QCString &) override
void stripCodeComments(bool b) override
OutputType type() const override
Concrete visitor implementation for HTML output.
void startClassDiagram() override
void writeLogo() override
void endParameterExtra(bool last, bool emptyList, bool closeBracket) override
void startTocEntry(const SectionInfo *si) override
void startInlineMemberName() override
void endDescTableInit() override
void startTextLink(const QCString &file, const QCString &anchor) override
void startInlineMemberType() override
void endDescTable() override
void startParameterDefVal(const char *sep) override
void startIndexKey() override
void lineBreak(const QCString &style) override
void startParameterName(bool) override
void startMemberItem(const QCString &anchor, MemberItemType, const QCString &inheritId) override
static void writeSearchPage()
void startInclDepGraph() override
void insertMemberAlignLeft(MemberItemType, bool) override
void writeQuickLinks(HighlightedItem hli, const QCString &file, bool extraTabs) override
void startMemberSubtitle() override
HtmlGenerator & operator=(const HtmlGenerator &)
void writeFooter(const QCString &navPath) override
void startMemberDocName(bool) override
void endParameterType() override
void startLabels() override
void startCallGraph() override
void endMemberList() override
static QCString getNavTreeCss()
void startParagraph(const QCString &classDef) override
void endIndexList() override
void writeSearchInfo() override
void startContents() override
void startMemberDoc(const QCString &clName, const QCString &memName, const QCString &anchor, const QCString &title, int memCount, int memTotal, bool showInline) override
void startDescTableRow() override
void startDoxyAnchor(const QCString &fName, const QCString &manName, const QCString &anchor, const QCString &name, const QCString &args) override
void startDirDepGraph() override
void startCompoundTemplateParams() override
void startConstraintParam() override
void startEmbeddedDoc(int) override
void endGroupHeader(int) override
void writeNavigationPath(const QCString &s) override
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name) override
void startMemberDescription(const QCString &anchor, const QCString &inheritId, bool typ) override
void writeChar(char c) override
void endConstraintList() override
void endParameterList() override
void startMemberGroupHeader(const QCString &, bool) override
void startDotGraph() override
void startFile(const QCString &name, bool isSource, const QCString &manName, const QCString &title, int id, int hierarchyLevel) override
void endIndent() override
void endParameterName() override
void endPageDoc() override
void startMemberDocList() override
static QCString writeLogoAsString(const QCString &path)
void endDescTableRow() override
void startParameterType(bool first, const QCString &key) override
void startDescTableInit() override
void startLocalToc(int level) override
void startMemberList() override
void endQuickIndices() override
void startHeaderSection() override
void startDescTableTitle() override
void endDirDepGraph(DotDirDeps &g) override
void startIndexList() override
void endParameterDefVal() override
void endMemberGroup(bool) override
void endInlineHeader() override
void endEmbeddedDoc() override
static void writeFooterFile(TextStream &t)
void endMemberDescription() override
void startGroupCollaboration() override
void endClassDiagram(const ClassDiagram &, const QCString &, const QCString &) override
void startConstraintList(const QCString &) override
void startDescTable(const QCString &title, const bool hasInits) override
void endConstraintDocs() override
void writeNonBreakableSpace(int) override
void endMemberGroupHeader(bool) override
void writePageOutline() override
void startInlineMemberDoc() override
void exceptionEntry(const QCString &, bool) override
static void writeTabData()
Additional initialization after indices have been created.
void endExamples() override
void endIndexKey() override
void writeString(const QCString &text) override
void endMemberDocName() override
void endContents() override
void endInlineMemberType() override
void startMemberGroupDocs() override
void startMemberDocSimple(bool) override
void startIndexItem(const QCString &ref, const QCString &file) override
OutputType type() const override
void endHeaderSection() override
void startIndent() override
void writeStyleInfo(int part) override
void addIndexItem(const QCString &, const QCString &) override
void docify_(const QCString &text, bool inHtmlComment)
void endMemberGroupDocs() override
void endDotGraph(DotClassGraph &g) override
void endMemberHeader() override
void endTextLink() override
void writeLabel(const QCString &l, bool isLast) override
void startMemberSections() override
static void writeSearchData(const QCString &dir)
void endMemberSections() override
void endMemberDocList() override
void endCompoundTemplateParams() override
static void writeExternalSearchPage()
void endDescTableData() override
void startDescTableData() override
void writeStartAnnoItem(const QCString &type, const QCString &file, const QCString &path, const QCString &name) override
static void writePageFooter(TextStream &t, const QCString &, const QCString &, const QCString &)
void endParagraph() override
void insertMemberAlign(bool) override
static void writeStyleSheetFile(TextStream &t)
void endDoxyAnchor(const QCString &fName, const QCString &anchor) override
void startMemberTemplateParams() override
void endLabels() override
void startPageDoc(const QCString &pageTitle) override
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId) override
HtmlCodeGenerator * m_codeGen
void startIndexValue(bool) override
void endGroupCollaboration(DotGroupCollaboration &g) override
static void writeSearchInfoStatic(TextStream &t, const QCString &relPath)
void endLocalToc() override
std::unique_ptr< OutputCodeList > m_codeList
static void writeHeaderFile(TextStream &t, const QCString &cssname)
void startConstraintType() override
void endConstraintParam() override
static QCString writeSplitBarAsString(const QCString &name, const QCString &relpath, const QCString &allMembersFile)
void startTitleHead(const QCString &) override
void endIndexValue(const QCString &, bool) override
void addCodeGen(OutputCodeList &list) override
void startConstraintDocs() override
void endMemberTemplateParams(const QCString &anchor, const QCString &inheritId) override
void endPlainFile() override
void startIndexListItem() override
void endProjectNumber() override
void writeDoc(const IDocNodeAST *node, const Definition *, const MemberDef *, int id, int sectionLevel) override
void writeSummaryLink(const QCString &file, const QCString &anchor, const QCString &title, bool first) override
void endMemberDocPrefixItem() override
void endDescTableTitle() override
void addLabel(const QCString &, const QCString &) override
void startGroupHeader(const QCString &, int) override
void endInclDepGraph(DotInclDepGraph &g) override
void startParameterExtra() override
void startProjectNumber() override
void writeGraphicalHierarchy(DotGfxHierarchyTable &g) override
void startExamples() override
void docify(const QCString &text) override
void endInlineMemberDoc() override
void writeSplitBar(const QCString &name, const QCString &allMembersFile) override
void endCallGraph(DotCallGraph &g) override
void endConstraintType() override
void endMemberSubtitle() override
void startMemberDocPrefixItem() override
void startSection(const QCString &, const QCString &, SectionType) override
void endTocEntry(const SectionInfo *si) override
void endMemberItem(MemberItemType) override
void startMemberGroup() override
void endMemberDoc(bool) override
void endIndexItem(const QCString &ref, const QCString &file) override
void startMemberHeader(const QCString &, int) override
void endTitleHead(const QCString &, const QCString &) override
void endSection(const QCString &, SectionType) override
void startInlineHeader() override
void endInlineMemberName() override
void endMemberDocSimple(bool) override
void writeInheritedSectionTitle(const QCString &id, const QCString &ref, const QCString &file, const QCString &anchor, const QCString &title, const QCString &name) override
void endIndexListItem() override
void startParameterList(bool) override
void startPlainFile(const QCString &name) override
opaque representation of the abstract syntax tree (AST)
static Index & instance()
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.
Class representing a list of different code generators.
void add(OutputCodeIntfPtr &&p)
Abstract interface for output generators.
QCString fileName() const
This is an alternative implementation of QCString.
int find(char c, int index=0, bool cs=TRUE) const
QCString & prepend(const char *s)
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
char & at(size_t i)
Returns a reference to the character at index i.
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
const std::string & str() const
QCString right(size_t len) const
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
int findRev(char c, int index=-1, bool cs=TRUE) const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
QCString left(size_t len) const
int contains(char c, bool cs=TRUE) const
Singleton for managing resources compiled into an executable.
static ResourceMgr & instance()
Returns the one and only instance of this class.
bool copyResource(const QCString &name, const QCString &targetDir) const
Copies a registered resource to a given target directory.
QCString getAsString(const QCString &name) const
Gets the resource data as a C string.
class that provide information about a section.
static constexpr int Section
static constexpr int Subsection
static constexpr int Subsubsection
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.
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
QCString dateToString(DateTimeType includeTime)
Returns the current date, when includeTime is set also the time is provided.
QCString yearToString()
Returns the current year as a string.
static constexpr auto hex
static QCString replaceVariables(const QCString &input)
static void fillColorStyleMap(const QCString &definitions, StringUnorderedMap &map)
static void startSectionContent(TextStream &t, int sectionCount)
static QCString g_header_file
static void endQuickIndexList(TextStream &t)
static QCString g_mathjax_code
static void writeServerSearchBox(TextStream &t, const QCString &relPath, bool highlightSearch)
static void startQuickIndexList(TextStream &t, bool topLevel=TRUE)
static void startSectionSummary(TextStream &t, int sectionCount)
static void startQuickIndexItem(TextStream &t, const QCString &l, bool hl, bool, const QCString &relPath)
static void renderQuickLinksAsTabs(TextStream &t, const QCString &relPath, LayoutNavEntry *hlEntry, LayoutNavEntry::Kind kind, bool highlightParent, bool highlightSearch)
static const SelectionMarkerInfo htmlMarkerInfo
static QCString 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 QCString &file, const QCString &relPath, bool extraTabs)
static QCString g_footer_file
static void endSectionContent(TextStream &t)
static bool hasDateReplacement(const QCString &str)
static QCString getSearchBox(bool serverSide, QCString relPath, bool highlightSearch)
static QCString g_latex_macro
static void fillColorStyleMaps()
static void endQuickIndexItem(TextStream &t, const QCString &l)
static StringUnorderedMap g_lightMap
static void startSectionHeader(TextStream &t, const QCString &relPath, int sectionCount)
static void writeDefaultStyleSheet(TextStream &t)
static void renderQuickLinksAsTree(TextStream &t, const QCString &relPath, LayoutNavEntry *root)
static bool quickLinkVisible(LayoutNavEntry::Kind kind)
static std::mutex g_indexLock
static StringUnorderedMap g_darkMap
static void endSectionHeader(TextStream &t)
static void writeClientSearchBox(TextStream &t, const QCString &relPath)
static void endSectionSummary(TextStream &t)
static QCString substituteHtmlKeywords(const QCString &file, const QCString &str, const QCString &title, const QCString &relPath, const QCString &navPath=QCString(), bool isSource=false)
Translator * theTranslator
#define warn(file, line, fmt,...)
std::ofstream openOutputStream(const QCString &name, bool append=false)
OutputCodeDefer< HtmlCodeGenerator > HtmlCodeGeneratorDefer
Portable versions of functions that are platform dependent.
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
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
Base class for the layout of a navigation item at the top of the HTML pages.
const LayoutNavEntryList & children() const
LayoutNavEntry * parent() const
LayoutNavEntry * find(LayoutNavEntry::Kind k, const QCString &file=QCString()) 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.
QCString externalRef(const QCString &relPath, const QCString &ref, bool href)
size_t updateColumnCount(const char *s, size_t col)
QCString convertToHtml(const QCString &s, bool keepEntities)
void checkBlocks(const QCString &s, const QCString fileName, const SelectionMarkerInfo &markerInfo)
QCString correctURL(const QCString &url, const QCString &relPath)
Corrects URL url according to the relative path relPath.
QCString stripPath(const QCString &s)
QCString removeEmptyLines(const QCString &s)
QCString selectBlocks(const QCString &s, const SelectionBlockList &blockList, const SelectionMarkerInfo &markerInfo)
remove disabled blocks and all block markers from s and return the result as a string
QCString substituteKeywords(const QCString &file, const QCString &s, const KeywordSubstitutionList &keywords)
QCString relativePathToRoot(const QCString &name)
void clearSubDirs(const Dir &d)
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
QCString filterTitle(const QCString &title)
void createSubDirs(const Dir &d)
QCString externalLinkTarget(const bool parent)
QCString replaceColorMarkers(const QCString &str)
Replaces any markers of the form ##AA in input string str by new markers of the form #AABBCC,...
QCString convertToId(const QCString &s)
void addHtmlExtensionIfMissing(QCString &fName)
QCString createHtmlUrl(const QCString &relPath, const QCString &ref, bool href, bool isLocalFile, const QCString &targetFileName, const QCString &anchor)
A bunch of utility functions.
QCString fixSpaces(const QCString &s)