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 <<
"<span class=\"search-icon-dropdown\"></span></span>\n";
82 t <<
" <input type=\"text\" id=\"MSearchField\" value=\"\" placeholder=\""
84 t <<
" </span><span class=\"right\">\n";
85 t <<
" <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
86 <<
"<div id=\"MSearchCloseImg\" class=\"close-icon\"></div></a>\n";
96 t <<
" <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
97 t <<
" <div class=\"left\">\n";
98 t <<
" <form id=\"FSearchBox\" action=\"" << relPath;
107 t <<
"\" method=\"get\">\n";
108 t <<
" <span id=\"MSearchSelectExt\" class=\"search-icon\"></span>\n";
111 t <<
" <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" placeholder=\""
112 <<
theTranslator->trSearch() <<
"\" size=\"20\" accesskey=\"S\"/>\n";
114 t <<
" </div><div class=\"right\"></div>\n";
145 if (macrofile.
isEmpty())
return "";
151 const char *data = s.
data();
160 while (i < size && (data[i] ==
' ' || data[i] ==
'\t' || data[i] ==
'\n'))
162 if (data[i] ==
'\n') line++;
165 if (i >= size)
break;
169 warn(macrofile,line,
"file contains non valid code, expected '\\' got '{:c}'",data[i]);
175 i += strlen(
"newcommand");
179 i += strlen(
"renewcommand");
183 warn(macrofile,line,
"file contains non valid code, expected 'newcommand' or 'renewcommand'");
189 warn(macrofile,line,
"file contains non valid code, expected '{{' got '{:c}'",data[i]);
195 warn(macrofile,line,
"file contains non valid code, expected '\\' got '{:c}'",data[i]);
201 while (i < size && (data[i] !=
'}')) result+=data[i++];
204 warn(macrofile,line,
"file contains non valid code, no closing '}}' for command");
216 while (i < size && (data[i] !=
']')) nr += data[i++];
219 warn(macrofile,line,
"file contains non valid code, no closing ']'");
224 else if (data[i] !=
'{')
226 warn(macrofile,line,
"file contains non valid code, expected '[' or '{{' got '{:c}'",data[i]);
233 warn(macrofile,line,
"file contains non valid code, expected '{{' got '{:c}'",data[i]);
240 while (i < size && cnt)
252 else if (data[i] !=
'"') result+=data[i++];
260 if (cnt) result+=data[i];
278 warn(macrofile,line,
"file contains non valid code, no closing '}}' for replacement");
312 bool isSource =
false)
332 bool hasProjectName = !projectName.
isEmpty();
339 bool hasCookie = treeView || searchEngine ||
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE;
340 static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
345 cssFile =
"doxygen.css";
358 cssFile =
"doxygen.css";
365 for (
const auto &fileName : extraCssFile)
367 if (!fileName.empty())
372 extraCssText +=
"<link href=\""+htmlStyleSheet+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
379 extraCssText +=
"<link href=\"$relpath^"+
stripPath(fileName)+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
387 case TIMESTAMP_t::NO:
391 generatedBy =
theTranslator->trGeneratedAt(
"<span class=\"timestamp\"></span>",
397 treeViewCssJs =
"<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
398 "<script type=\"text/javascript\" src=\"$relpath^navtreedata.js\"></script>\n"
399 "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n";
404 searchCssJs =
"<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
405 if (!serverBasedSearch)
407 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/searchdata.js\"></script>\n";
409 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n";
411 if (!serverBasedSearch)
417 searchCssJs +=
"<link rel=\"search\" href=\"" + relPath +
418 "search_opensearch.php?v=opensearch.xml\" "
419 "type=\"application/opensearchdescription+xml\" title=\"" +
420 (hasProjectName ? projectName :
QCString(
"Doxygen")) +
427 if (mathJax && !isSource)
436 auto writeMathJax3Packages = [&mathJaxJs](
const StringVector &mathJaxExtensions)
438 mathJaxJs +=
" packages: ['base','configmacros'";
441 mathJaxJs+=
",'newcommand'";
443 for (
const auto &s : mathJaxExtensions)
445 mathJaxJs+=
",'"+s+
"'";
450 auto writeMathJax4Packages = [&mathJaxJs](
const StringVector &mathJaxExtensions)
452 mathJaxJs +=
" packages: {\n";
454 for (
const auto &s : mathJaxExtensions)
456 if (!first) mathJaxJs+=
",";
459 mathJaxJs+=
"\n '[-]': ['";
460 mathJaxJs+=s.
data()+1;
465 mathJaxJs+=
"\n '[+]': ['"+s+
"']";
469 mathJaxJs +=
"\n }\n";
472 auto writeMathJaxScript = [&path,&mathJaxJs](
const QCString &pathPostfix,
476 mathJaxJs +=
"<script type=\"text/javascript\">\n"
477 "window.MathJax = {\n"
479 " ignoreHtmlClass: 'tex2jax_ignore',\n"
480 " processHtmlClass: 'tex2jax_process'\n"
487 if (!mathJaxExtensions.empty())
490 mathJaxJs+=
" loader: {\n"
492 for (
const auto &s : mathJaxExtensions)
496 if (!first) mathJaxJs+=
",";
497 mathJaxJs+=
"'[tex]/"+s+
"'";
504 mathJaxJs+=
" tex: {\n"
511 writePackages(mathJaxExtensions);
525 mathJaxJs+=
"</script>\n";
526 mathJaxJs +=
"<script type=\"text/javascript\" id=\"MathJax-script\" async=\"async\" src=\"" +
527 path + pathPostfix +
"tex-" + mathJaxFormat.
lower() +
".js\">";
528 mathJaxJs+=
"</script>\n";
531 switch (mathJaxVersion)
533 case MATHJAX_VERSION_t::MathJax_4:
534 writeMathJaxScript(
"",writeMathJax4Packages);
536 case MATHJAX_VERSION_t::MathJax_3:
537 writeMathJaxScript(
"es5/",writeMathJax3Packages);
539 case MATHJAX_VERSION_t::MathJax_2:
542 mathJaxJs =
"<script type=\"text/x-mathjax-config\">\n"
543 "MathJax.Hub.Config({\n"
544 " extensions: [\"tex2jax.js\"";
546 for (
const auto &s : mathJaxExtensions)
548 mathJaxJs+=
", \""+
QCString(s)+
".js\"";
552 mathJaxFormat =
"HTML-CSS";
555 " jax: [\"input/TeX\",\"output/"+mathJaxFormat+
"\"],\n";
558 mathJaxJs +=
" TeX: { Macros: {\n";
563 mathJaxJs +=
"});\n";
569 mathJaxJs +=
"</script>\n";
570 mathJaxJs +=
"<script type=\"text/javascript\" async=\"async\" src=\"" + path +
"MathJax.js\"></script>\n";
579 darkModeJs=
"<script type=\"text/javascript\" src=\"$relpath^darkmode_toggle.js\"></script>\n";
583 if (mermaidRenderMode==
"CLIENT_SIDE" || mermaidRenderMode==
"AUTO")
586 mermaidJs =
"<script type=\"module\">\n"
587 "import mermaid from '" + mermaidJsUrl +
"';\n";
590 case HTML_COLORSTYLE_t::LIGHT:
591 mermaidJs +=
"const theme = 'default';\n";
593 case HTML_COLORSTYLE_t::DARK:
594 mermaidJs +=
"const theme = 'dark';\n";
596 case HTML_COLORSTYLE_t::AUTO_LIGHT:
597 case HTML_COLORSTYLE_t::AUTO_DARK:
598 mermaidJs +=
"const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'default';\n";
600 case HTML_COLORSTYLE_t::TOGGLE:
601 mermaidJs +=
"const theme = DarkModeToggle.darkModeEnabled ? 'dark' : 'default'\n";
604 mermaidJs +=
"mermaid.initialize({ startOnLoad: true, theme: theme });\n";
609 " const elementCode = '.mermaid';\n"
610 " const loadMermaid = function(theme) {\n"
611 " mermaid.initialize({theme})\n"
612 " mermaid.init({theme}, document.querySelectorAll(elementCode))\n"
614 " const saveOriginalData = function() {\n"
615 " return new Promise((resolve, reject) => {\n"
617 " var els = document.querySelectorAll(elementCode), count = els.length;\n"
618 " els.forEach(element => {\n"
619 " element.setAttribute('data-original-code', element.innerHTML)\n"
621 " if (count == 0) { resolve() }\n"
623 " } catch (error) { reject(error) }\n"
626 " const resetProcessed = function(){\n"
627 " return new Promise((resolve, reject) => {\n"
629 " var els = document.querySelectorAll(elementCode), count = els.length;\n"
630 " els.forEach(element => {\n"
631 " if (element.getAttribute('data-original-code') != null) {\n"
632 " element.removeAttribute('data-processed')\n"
633 " element.innerHTML = element.getAttribute('data-original-code')\n"
636 " if(count == 0) { resolve() }\n"
638 " } catch (error) { reject(error) }\n"
641 " saveOriginalData()\n"
642 " const original = DarkModeToggle.enableDarkMode.bind(DarkModeToggle);\n"
643 " DarkModeToggle.enableDarkMode = function(enable) {\n"
644 " original(enable);\n"
645 " resetProcessed().then(loadMermaid(enable ? 'dark' : 'default')).catch(console.error)\n"
649 mermaidJs +=
"</script>\n";
654 treeViewCssJs+=
"<script type=\"text/javascript\" src=\"$relpath^cookie.js\"></script>\n";
667 {
"$datetime", [&]() ->
QCString {
return "<span class=\"datetime\"></span>"; } },
668 {
"$date", [&]() ->
QCString {
return "<span class=\"date\"></span>"; } },
669 {
"$time", [&]() ->
QCString {
return "<span class=\"time\"></span>"; } },
670 {
"$year", [&]() ->
QCString {
return "<span class=\"year\"></span>"; } },
671 {
"$navpath", [&]() ->
QCString {
return navPath; } },
672 {
"$stylesheet", [&]() ->
QCString {
return cssFile; } },
673 {
"$treeview", [&]() ->
QCString {
return treeViewCssJs; } },
674 {
"$searchbox", [&]() ->
QCString {
return searchBox; } },
675 {
"$search", [&]() ->
QCString {
return searchCssJs; } },
676 {
"$mathjax", [&]() ->
QCString {
return mathJaxJs; } },
677 {
"$mermaidjs", [&]() ->
QCString {
return mermaidJs; } },
678 {
"$darkmode", [&]() ->
QCString {
return darkModeJs; } },
679 {
"$generatedby", [&]() ->
QCString {
return generatedBy; } },
680 {
"$extrastylesheet",[&]() ->
QCString {
return extraCssText; } },
681 {
"$relpath$", [&]() ->
QCString {
return relPath; } }
684 result =
substitute(result,
"$relpath^",relPath);
690 {
"FULL_SIDEBAR", hasFullSideBar },
691 {
"DISABLE_INDEX", disableIndex },
692 {
"GENERATE_TREEVIEW", treeView },
693 {
"SEARCHENGINE", searchEngine },
694 {
"TITLEAREA", titleArea },
695 {
"PROJECT_NAME", hasProjectName },
696 {
"PROJECT_NUMBER", hasProjectNumber },
697 {
"PROJECT_BRIEF", hasProjectBrief },
698 {
"PROJECT_LOGO", hasProjectLogo },
699 {
"PROJECT_ICON", hasProjectIcon },
700 {
"COPY_CLIPBOARD", hasCopyClipboard },
702 {
"HTML_DYNAMIC_SECTIONS", dynamicSections},
718 while ((i=definitions.
find(
'\n',p))!=-1)
723 int separator = line.
find(
':');
724 assert(separator!=-1);
725 std::string key = line.
left(separator).
str();
729 map.emplace(key,value);
740 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
744 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
757 while ((i=input.
find(
"var(",p))!=-1)
759 result+=input.
mid(p,i-p);
760 int j=input.
find(
")",i+4);
762 auto it = mapping.find(input.
mid(i+4,j-i-4).
str());
763 if (it==mapping.end())
765 err(
"failed to find value variable {}. It is not longer defined in doxygen.css\n",input.
mid(i+4,j-i-4));
779 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
783 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
819 const char *p=str.
data();
832 int spacesToNextTabStop = tabSize - (
m_col%tabSize);
833 while (spacesToNextTabStop--)
852 case '\'': *
m_t <<
"'";
m_col++;
854 case '"': *
m_t <<
""";
m_col++;
858 { *
m_t <<
"<"; p++; }
860 { *
m_t <<
">"; p++; }
862 { *
m_t <<
"\\‍[";
m_col++;p++; }
864 { *
m_t <<
"\\‍]";
m_col++;p++; }
866 { *
m_t <<
"\\‍(";
m_col++;p++; }
868 { *
m_t <<
"\\‍)";
m_col++;p++; }
875 uint8_t uc =
static_cast<uint8_t
>(c);
878 *
m_t <<
"$" <<
hex[uc>>4] <<
hex[uc&0xF] <<
";";
922 const QCString &anchor,
int l,
bool writeLineAnchor)
926 const int maxLineNrStr = 10;
927 char lineNumber[maxLineNrStr];
928 char lineAnchor[maxLineNrStr];
929 qsnprintf(lineNumber,maxLineNrStr,
"%5d",l);
930 qsnprintf(lineAnchor,maxLineNrStr,
"l%05d",l);
935 *
m_t <<
"<div class=\"line\">";
939 if (writeLineAnchor) *
m_t <<
"<a id=\"" << lineAnchor <<
"\" name=\"" << lineAnchor <<
"\"></a>";
940 *
m_t <<
"<span class=\"lineno\">";
978 *
m_t <<
"<a class=\"" << className <<
"Ref\" ";
983 *
m_t <<
"<a class=\"" << className <<
"\" ";
1003 *
m_t <<
"<div class=\"ttc\" id=\"" <<
id <<
"\">";
1004 *
m_t <<
"<div class=\"ttname\">";
1007 *
m_t <<
"<a href=\"";
1023 *
m_t <<
"<div class=\"ttdeci\">";
1030 *
m_t <<
"<div class=\"ttdoc\">";
1037 *
m_t <<
"<div class=\"ttdef\"><b>" <<
theTranslator->trDefinition() <<
"</b> ";
1040 *
m_t <<
"<a href=\"";
1056 *
m_t <<
"<div class=\"ttdecl\"><b>" <<
theTranslator->trDeclaration() <<
"</b> ";
1059 *
m_t <<
"<a href=\"";
1084 *
m_t <<
"<div class=\"line\">";
1108 *
m_t <<
"<span class=\"" << s <<
"\">";
1120 *
m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1125 *
m_t <<
"<div class=\"fragment\">";
1137 *
m_t <<
"</div><!-- fragment -->";
1147 const int maxLineNrStr = 10;
1148 char lineNumber[maxLineNrStr];
1149 qsnprintf(lineNumber,maxLineNrStr,
"%05d",lineNr);
1150 *
m_t <<
"<div class=\"foldopen\" id=\"foldopen" << lineNumber <<
1151 "\" data-start=\"" << startMarker <<
1152 "\" data-end=\"" << endMarker <<
1156 *
m_t <<
"<div class=\"line\">";
1164 *
m_t <<
"<div class=\"line\">";
1240 return (str.
contains(
"$datetime",
false) ||
1253 term(
"Could not create output directory {}\n",dname);
1432 searchCss = mgr.
getAsString(
"search_sidebar.css");
1438 searchCss = mgr.
getAsString(
"search_nomenu_toggle.css");
1447 searchCss = mgr.
getAsString(
"search_fixedtabs.css");
1454 searchCss += mgr.
getAsString(
"search_common.css");
1455 searchCss =
substitute(searchCss,
"$doxygenversion",getDoxygenVersion());
1463 t <<
"/* The standard CSS for doxygen " << getDoxygenVersion() <<
"*/\n\n";
1466 case HTML_COLORSTYLE_t::LIGHT:
1467 case HTML_COLORSTYLE_t::DARK:
1470 case HTML_COLORSTYLE_t::AUTO_LIGHT:
1471 case HTML_COLORSTYLE_t::TOGGLE:
1476 case HTML_COLORSTYLE_t::AUTO_DARK:
1482 if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_LIGHT)
1484 t <<
"@media (prefers-color-scheme: dark) {\n";
1485 t <<
" html:not(.dark-mode) {\n";
1486 t <<
" color-scheme: dark;\n\n";
1490 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_DARK)
1492 t <<
"@media (prefers-color-scheme: light) {\n";
1493 t <<
" html:not(.light-mode) {\n";
1494 t <<
" color-scheme: light;\n\n";
1498 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
1500 t <<
"html.dark-mode {\n";
1511 " border-bottom: none;\n"
1512 " background-color: var(--nav-background-color);\n"
1513 " border-right: 1px solid var(--nav-border-color);\n"
1528 case TIMESTAMP_t::YES:
1529 case TIMESTAMP_t::DATETIME:
1532 case TIMESTAMP_t::DATE:
1538 t <<
"--timestamp: '" << timeStampStr <<
"';\n";
1551 t <<
"span.timestamp { content: ' '; }\n";
1552 t <<
"span.timestamp:before { content: var(--timestamp); }\n\n";
1556 t <<
"span.datetime { content: ' '; }\n";
1557 t <<
"span.datetime:before { content: var(--datetime); }\n\n";
1558 t <<
"span.date { content: ' '; }\n";
1559 t <<
"span.date:before { content: var(--date); }\n\n";
1560 t <<
"span.time { content: ' '; }\n";
1561 t <<
"span.time:before { content: var(--time); }\n\n";
1562 t <<
"span.year { content: ' '; }\n";
1563 t <<
"span.year:before { content: var(--year); }\n\n";
1570 bool addScrollbarStyling =
Config_getList(HTML_EXTRA_STYLESHEET).empty();
1571 if (addScrollbarStyling)
1586 t <<
"<!-- HTML header for doxygen " << getDoxygenVersion() <<
"-->\n";
1592 t <<
"<!-- HTML footer for doxygen " << getDoxygenVersion() <<
"-->\n";
1619 << getDoxygenVersion() <<
" -->\n";
1623 m_t <<
"<script type=\"text/javascript\">\n";
1624 m_t <<
"let searchBox = new SearchBox(\"searchBox\", \""
1626 m_t <<
"</script>\n";
1630 m_t <<
"<script type=\"text/javascript\">\n";
1631 m_t <<
"document.addEventListener('DOMContentLoaded', codefold.init);\n";
1632 m_t <<
"</script>\n";
1641 if (searchEngine && !serverBasedSearch)
1643 t <<
"<!-- window showing the filter options -->\n";
1644 t <<
"<div id=\"MSearchSelectWindow\">\n";
1647 t <<
"<!-- iframe showing the search results (closed by default) -->\n";
1648 t <<
"<div id=\"MSearchResultsWindow\">\n";
1649 t <<
"<div id=\"MSearchResults\">\n";
1650 t <<
"<div class=\"SRPage\">\n";
1651 t <<
"<div id=\"SRIndex\">\n";
1652 t <<
"<div id=\"SRResults\"></div>\n";
1653 t <<
"<div class=\"SRStatus\" id=\"Loading\">" <<
theTranslator->trLoading() <<
"</div>\n";
1654 t <<
"<div class=\"SRStatus\" id=\"Searching\">" <<
theTranslator->trSearching() <<
"</div>\n";
1655 t <<
"<div class=\"SRStatus\" id=\"NoMatches\">" <<
theTranslator->trNoMatches() <<
"</div>\n";
1675 case TIMESTAMP_t::NO:
1679 result =
theTranslator->trGeneratedAt(
"<span class=\"timestamp\"></span>",
1683 result +=
" \n<a href=\"https://www.doxygen.org/index.html\">\n"
1684 "<img class=\"footer\" src=\"";
1686 result +=
"doxygen.svg\" width=\"104\" height=\"31\" alt=\"doxygen\"/></a> ";
1687 result += getDoxygenVersion();
1715 m_t <<
"<h3 class=\"version\">";
1744 err(
"style sheet {} does not exist or is not readable!\n",
Config_getString(HTML_STYLESHEET));
1759 for (
const auto &
fileName : extraCssFiles)
1804 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1818 m_t <<
"\n<p class=\"" << classDef <<
"\">";
1850 m_t <<
"<a class=\"elRef\" ";
1855 m_t <<
"<a class=\"el\" ";
1893 m_t <<
"<a class=\"el\" href=\"" << fn <<
"\">";
1903 m_t <<
"<a class=\"elRef\" ";
1908 m_t <<
"<a class=\"el\" ";
1924 m_t <<
"<a href=\"";
1941 if (extraIndentLevel==2)
1945 else if (extraIndentLevel==1)
1957 m_t <<
" class=\"groupheader\">";
1962 if (extraIndentLevel==2)
1966 else if (extraIndentLevel==1)
1978 switch(
type.level())
1987 default:
ASSERT(0);
break;
1989 m_t <<
"<a id=\"" << lab <<
"\" name=\"" << lab <<
"\"></a>";
1994 switch(
type.level())
2003 default:
ASSERT(0);
break;
2016 const char *p=str.
data();
2022 case '<':
m_t <<
"<";
break;
2023 case '>':
m_t <<
">";
break;
2024 case '&':
m_t <<
"&";
break;
2025 case '"':
m_t <<
""";
break;
2026 case '-':
if (inHtmlComment)
m_t <<
"-";
else m_t <<
"-";
break;
2029 {
m_t <<
"<"; p++; }
2031 {
m_t <<
">"; p++; }
2033 {
m_t <<
"\\‍["; p++; }
2035 {
m_t <<
"\\‍]"; p++; }
2037 {
m_t <<
"\\‍("; p++; }
2039 {
m_t <<
"\\‍)"; p++; }
2060 const QCString &relPath,
int sectionCount)
2064 if (dynamicSections)
2066 t <<
"<div id=\"dynsection-" << sectionCount <<
"\" "
2067 "class=\"dynheader closed\">"
2068 "<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
2072 t <<
"<div class=\"dynheader\">\n";
2086 if (dynamicSections)
2088 t <<
"<div id=\"dynsection-" << sectionCount <<
"-summary\" "
2089 "class=\"dynsummary\">\n";
2097 if (dynamicSections)
2107 if (dynamicSections)
2109 t <<
"<div id=\"dynsection-" << sectionCount <<
"-content\" "
2110 "class=\"dyncontent hidden\">\n";
2114 t <<
"<div class=\"dyncontent\">\n";
2142 m_t <<
" <div class=\"center\">\n";
2143 m_t <<
" <img src=\"";
2145 m_t <<
"_map\" alt=\"\"/>\n";
2155 m_t <<
" <div class=\"center\">\n";
2156 m_t <<
" <img src=\"";
2185 m_t <<
"<table class=\"memberdecls\">\n";
2191 if (dynamicSections)
m_t <<
" inherit";
2192 m_t <<
" " << inheritId;
2209 m_t <<
"</td></tr>\n";
2219 m_t <<
"</td></tr>\n";
2223 if (dynamicSections)
m_t <<
" inherit";
2224 m_t <<
" " << inheritId;
2226 m_t <<
" template\"><td class=\"memItemLeft\">";
2231 m_t <<
"<div class=\"compoundTemplParams\">";
2242 m_t <<
" </td><td class=\"memItemRight\">";
2247 if (!initTag)
m_t <<
" </td>";
2259 DBG_HTML(
m_t <<
"<!-- startMemberDescription -->\n")
2263 m_t <<
"<table class=\"memberdecls\">\n";
2266 m_t <<
"<tr class=\"memdesc:" << anchor;
2269 if (dynamicSections)
m_t <<
" inherit";
2270 m_t <<
" " << inheritId;
2273 m_t <<
"<td class=\"mdescLeft\"> </td>";
2274 if (typ)
m_t <<
"<td class=\"mdescLeft\"> </td>";
2275 m_t <<
"<td class=\"mdescRight\">";
2280 DBG_HTML(
m_t <<
"<!-- endMemberDescription -->\n")
2281 m_t <<
"<br /></td></tr>\n";
2297 m_t <<
"</table>\n";
2311 m_t <<
"<table class=\"memberdecls\">\n";
2314 m_t <<
"<tr class=\"heading\"><td colspan=\"" << typ <<
"\"><h2";
2317 m_t <<
" id=\"header-" << anchor <<
"\"";
2319 m_t <<
" class=\"groupheader\">";
2322 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>\n";
2329 m_t <<
"</h2></td></tr>\n";
2337 m_t <<
"<table class=\"memberdecls\">\n";
2340 m_t <<
"<tr><td class=\"ititle\" colspan=\"2\">";
2346 m_t <<
"</td></tr>\n";
2356 m_t <<
"</table>\n";
2391 int memCount,
int memTotal,
bool )
2394 m_t <<
"\n<h2 class=\"memtitle\">"
2395 <<
"<span class=\"permalink\"><a href=\"#" << anchor <<
"\">◆ </a></span>";
2399 m_t <<
" <span class=\"overload\">[" << memCount <<
"/" << memTotal <<
"]</span>";
2402 m_t <<
"\n<div class=\"memitem\">\n";
2403 m_t <<
"<div class=\"memproto\">\n";
2408 DBG_HTML(
m_t <<
"<!-- startMemberDocPrefixItem -->\n";)
2409 m_t <<
"<div class=\"memtemplate\">\n";
2414 DBG_HTML(
m_t <<
"<!-- endMemberDocPrefixItem -->\n";)
2422 m_t <<
" <table class=\"memname\">\n";
2425 m_t <<
" <td class=\"memname\">";
2438 if (openBracket)
m_t <<
"(";
2446 DBG_HTML(
m_t <<
"<!-- startFirstParameterType -->\n";)
2447 m_t <<
" <td class=\"paramtype\">";
2453 m_t <<
" <td class=\"paramkey\">" << key <<
"</td>\n";
2454 m_t <<
" <td></td>\n";
2455 m_t <<
" <td class=\"paramtype\">";
2468 m_t <<
" <td class=\"paramname\"><span class=\"paramname\"><em>";
2474 m_t <<
"</em></span>";
2479 DBG_HTML(
m_t <<
"<!-- startParameterExtra -->\n";)
2489 if (closeBracket)
m_t <<
"</td><td>)";
2496 if (closeBracket)
m_t <<
")";
2508 m_t <<
"<span class=\"paramdefsep\">";
2510 m_t <<
"</span><span class=\"paramdefval\">";
2533 m_t <<
" <td align=\"right\">";
2537 m_t <<
prefix <<
"</td><td>(</td><td colspan=\"2\">";
2538 else if (closeBracket)
2539 m_t <<
" )</td><td></td><td></td><td>";
2541 m_t <<
"</td><td></td><td colspan=\"2\">";
2551 m_t <<
" </table>\n";
2570 if (generateLegend && !umlLook)
2573 m_t <<
"<center><span class=\"legend\">[";
2576 if (generateTreeView)
m_t <<
"target=\"top\" ";
2582 m_t <<
"]</span></center>";
2668 m_t <<
"<tr id=\"" <<
id <<
"\" class=\"groupHeader\"><td colspan=\"2\"><div class=\"groupHeader\">";
2673 m_t <<
"</div></td></tr>\n";
2678 m_t <<
"<tr><td colspan=\"2\" class=\"ititle\"><div class=\"groupText\">";
2683 m_t <<
"</div></td></tr>\n";
2698 m_t <<
"<div class=\"memdoc\">\n";
2704 m_t <<
"\n</div>\n" <<
"</div>\n";
2713 for (
int i=0; i<n; i++)
2721 m_t <<
"<table class=\"fieldtable\">\n"
2722 <<
"<tr><th colspan=\"" << (hasInits?3:2) <<
"\">" << title <<
"</th></tr>";
2726 m_t <<
"</table>\n";
2741 m_t <<
"<td class=\"fieldname\">";
2746 m_t <<
" </td>";
2751 m_t <<
"<td class=\"fieldinit\">";
2756 m_t <<
" </td>";
2761 m_t <<
"<td class=\"fielddoc\">";
2771 m_t <<
"<dl class=\"section examples\"><dt>";
2784 if (astImpl && sectionLevel<=
m_tocState.maxLevel)
2788 std::visit(visitor,astImpl->
root);
2800 t <<
" <div id=\"navrow1\" class=\"tabs\">\n";
2804 t <<
" <div id=\"navrow2\" class=\"tabs2\">\n";
2806 t <<
" <ul class=\"tablist\">\n";
2834 t <<
" class=\"current\"";
2844 if (!l.
isEmpty()) t <<
"</a>";
2855 case LayoutNavEntry::MainPage:
return TRUE;
2856 case LayoutNavEntry::User:
return TRUE;
2857 case LayoutNavEntry::UserGroup:
return TRUE;
2858 case LayoutNavEntry::Pages:
return index.numIndexedPages()>0;
2859 case LayoutNavEntry::Topics:
return index.numDocumentedGroups()>0;
2860 case LayoutNavEntry::Modules:
return index.numDocumentedModules()>0;
2861 case LayoutNavEntry::ModuleList:
return index.numDocumentedModules()>0;
2863 case LayoutNavEntry::Namespaces:
return showNamespaces && index.numDocumentedNamespaces()>0;
2864 case LayoutNavEntry::NamespaceList:
return showNamespaces && index.numDocumentedNamespaces()>0;
2866 case LayoutNavEntry::Concepts:
return index.numDocumentedConcepts()>0;
2867 case LayoutNavEntry::Classes:
return index.numAnnotatedClasses()>0;
2868 case LayoutNavEntry::ClassList:
return index.numAnnotatedClasses()>0;
2869 case LayoutNavEntry::ClassIndex:
return index.numAnnotatedClasses()>0;
2870 case LayoutNavEntry::ClassHierarchy:
return index.numHierarchyClasses()>0;
2872 case LayoutNavEntry::Files:
return showFiles && index.numDocumentedFiles()>0;
2873 case LayoutNavEntry::FileList:
return showFiles && index.numDocumentedFiles()>0;
2876 case LayoutNavEntry::Interfaces:
return index.numAnnotatedInterfaces()>0;
2877 case LayoutNavEntry::InterfaceList:
return index.numAnnotatedInterfaces()>0;
2878 case LayoutNavEntry::InterfaceIndex:
return index.numAnnotatedInterfaces()>0;
2879 case LayoutNavEntry::InterfaceHierarchy:
return index.numHierarchyInterfaces()>0;
2880 case LayoutNavEntry::Structs:
return index.numAnnotatedStructs()>0;
2881 case LayoutNavEntry::StructList:
return index.numAnnotatedStructs()>0;
2882 case LayoutNavEntry::StructIndex:
return index.numAnnotatedStructs()>0;
2883 case LayoutNavEntry::Exceptions:
return index.numAnnotatedExceptions()>0;
2884 case LayoutNavEntry::ExceptionList:
return index.numAnnotatedExceptions()>0;
2885 case LayoutNavEntry::ExceptionIndex:
return index.numAnnotatedExceptions()>0;
2886 case LayoutNavEntry::ExceptionHierarchy:
return index.numHierarchyExceptions()>0;
2887 case LayoutNavEntry::None:
2888 assert(kind != LayoutNavEntry::None);
2898 for (
const auto &entry : root->
children())
2905 for (
const auto &entry : root->
children())
2910 t <<
"<li><a href=\"" << relPath << url <<
"\"><span>";
2912 t <<
"</span></a>\n";
2925 bool highlightParent,
bool highlightSearch)
2948 entry.get()==hlEntry &&
2949 (!entry->children().empty() ||
2950 (entry->kind()==kind && !highlightParent)
2968 if (disableIndex || !generateTreeView || !fullSidebar)
2970 if (!serverBasedSearch)
2978 if (!highlightSearch)
3019 bool highlightParent=
false;
3047 highlightParent =
true;
break;
3049 highlightParent =
true;
break;
3051 highlightParent =
true;
break;
3053 highlightParent =
true;
break;
3055 highlightParent =
true;
break;
3057 highlightParent =
true;
break;
3059 highlightParent =
true;
break;
3061 highlightParent =
true;
break;
3066 t <<
"<script type=\"application/json\" id=\"doxygen-config\">\n";
3068 t <<
" \"relPath\": \"" << relPath <<
"\",\n";
3069 t <<
" \"generateTreeView\": " << (generateTreeView?
"true":
"false") <<
",\n";
3070 t <<
" \"searchEngine\": " << (searchEngine?
"true":
"false") <<
",\n";
3071 t <<
" \"serverBasedSearch\": " << (serverBasedSearch?
"true":
"false") <<
",\n";
3072 t <<
" \"disableIndex\": " << (disableIndex?
"true":
"false") <<
",\n";
3073 t <<
" \"dynamicMenus\": " << (dynamicMenus?
"true":
"false") <<
",\n";
3074 t <<
" \"fullSidebar\": " << (fullSidebar?
"true":
"false") <<
"\n";
3078 if (!disableIndex && dynamicMenus)
3087 searchPage =
"search.php";
3089 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menudata.js\"></script>\n";
3090 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menu.js\"></script>\n";
3091 t <<
"<div id=\"main-nav-mobile\">\n";
3092 if (searchEngine && !fullSidebar)
3094 t <<
"<div class=\"sm sm-dox\"><input id=\"main-menu-state\" type=\"checkbox\"/>\n";
3095 t <<
"<label class=\"main-menu-btn\" for=\"main-menu-state\">\n";
3096 t <<
"<span class=\"main-menu-btn-icon\"></span> Toggle main menu visibility</label>\n";
3097 t <<
"<span id=\"searchBoxPos1\">";
3101 t <<
"</div><!-- main-nav-mobile -->\n";
3102 t <<
"<div id=\"main-nav\">\n";
3103 t <<
" <ul class=\"sm sm-dox\" id=\"main-menu\">\n";
3104 t <<
" <li id=\"searchBoxPos2\">\n";
3105 if (searchEngine && !(generateTreeView && fullSidebar))
3111 t <<
"</div><!-- main-nav -->\n";
3113 else if (!disableIndex)
3117 if (!hlEntry && altKind!=LayoutNavEntry::None) { hlEntry=root->
find(altKind); kind=altKind; }
3120 highlightParent=
TRUE;
3121 hlEntry = root->
children().front().get();
3122 if (hlEntry==
nullptr)
3127 if (kind==LayoutNavEntry::UserGroup)
3135 t <<
"<div id=\"main-nav\">\n";
3139 t <<
"</div><!-- main-nav -->\n";
3142 else if (!generateTreeView)
3146 if (generateTreeView && !disableIndex && fullSidebar && !extraTabs)
3148 t <<
"<div id=\"container\"><div id=\"doc-content\">\n";
3155 m_t <<
"</div><!-- top -->\n";
3156 if (!generateTreeView)
3158 m_t <<
"<div id=\"doc-content\">\n";
3167 if (generateTreeView)
3174 "<div id=\"side-nav\" class=\"ui-resizable side-nav-resizable\">\n");
3177 " <div id=\"nav-tree\">\n"
3178 " <div id=\"nav-tree-contents\">\n"
3179 " <div id=\"nav-sync\" class=\"sync\"></div>\n"
3182 " <div id=\"splitbar\" class=\"ui-resizable-handle\">\n"
3185 "<script type=\"text/javascript\">\n"
3186 "document.addEventListener('DOMContentLoaded',() => { initNavTree('" + fn +
"','" + relpath +
"','" + allMembersFile +
"'); });\n"
3190 result+=
"<div id=\"container\">\n<div id=\"doc-content\">\n";
3208 m_t <<
"<div class=\"contents\">\n";
3213 m_t <<
"</div><!-- contents -->\n";
3223 m_t <<
"</div><!-- PageDoc -->\n";
3237 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3242 QCString configFileName = htmlOutput+
"/search_config.php";
3248 t <<
"$config = array(\n";
3249 t <<
" 'PROJECT_NAME' => \"" <<
convertToHtml(projectName) <<
"\",\n";
3250 t <<
" 'GENERATE_TREEVIEW' => " << (generateTreeView?
"true":
"false") <<
",\n";
3251 t <<
" 'DISABLE_INDEX' => " << (disableIndex?
"true":
"false") <<
",\n";
3252 t <<
" 'FULL_SIDEBAR' => " << (fullSidebar?
"true":
"false") <<
",\n";
3254 t <<
"$translator = array(\n";
3255 t <<
" 'search_results_title' => \"" <<
theTranslator->trSearchResultsTitle() <<
"\",\n";
3256 t <<
" 'search_results' => array(\n";
3257 t <<
" 0 => \"" <<
theTranslator->trSearchResults(0) <<
"\",\n";
3258 t <<
" 1 => \"" <<
theTranslator->trSearchResults(1) <<
"\",\n";
3261 t <<
" 'search_matches' => \"" <<
theTranslator->trSearchMatches() <<
"\",\n";
3262 t <<
" 'search' => \"" <<
theTranslator->trSearch() <<
"\",\n";
3280 t <<
"<!-- " <<
theTranslator->trGeneratedBy() <<
" Doxygen "
3281 << getDoxygenVersion() <<
" -->\n";
3282 t <<
"<script type=\"text/javascript\">\n";
3283 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3287 if (!disableIndex && !quickLinksAfterSplitbar)
3291 if (generateTreeView)
3293 t <<
"</div><!-- top -->\n";
3296 if (quickLinksAfterSplitbar)
3300 t <<
"<!-- generated -->\n";
3303 t <<
"require_once \"search_functions.php\";\n";
3308 if (generateTreeView)
3310 t <<
"</div><!-- doc-content -->\n";
3311 t <<
"</div><!-- container -->\n";
3318 QCString scriptName = htmlOutput+
"/search/search.js";
3327 err(
"Failed to open file '{}' for writing...\n",scriptName);
3336 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3345 t <<
"<!-- " <<
theTranslator->trGeneratedBy() <<
" Doxygen "
3346 << getDoxygenVersion() <<
" -->\n";
3347 t <<
"<script type=\"text/javascript\">\n";
3348 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3352 if (!disableIndex && !quickLinksAfterSplitbar)
3356 if (generateTreeView)
3358 t <<
"</div><!-- top -->\n";
3361 if (quickLinksAfterSplitbar)
3366 t <<
"<div class=\"header\">\n";
3367 t <<
" <div class=\"headertitle\">\n";
3368 t <<
" <div class=\"title\">" <<
theTranslator->trSearchResultsTitle() <<
"</div>\n";
3371 t <<
"<div class=\"contents\">\n";
3373 t <<
"<div id=\"searchresults\"></div>\n";
3376 if (generateTreeView)
3378 t <<
"</div><!-- doc-content -->\n";
3379 t <<
"</div><!-- container -->\n";
3387 QCString scriptName = dname+
"/search/search.js";
3392 t <<
"const searchResultsText=["
3396 t <<
"const serverUrl=\"" <<
Config_getString(SEARCHENGINE_URL) <<
"\";\n";
3397 t <<
"const tagMap = {\n";
3401 for (
const auto &ml : extraSearchMappings)
3404 int eqPos = mapLine.
find(
'=');
3411 if (!first) t <<
",\n";
3412 t <<
" \"" << tagName <<
"\": \"" << destName <<
"\"";
3417 if (!first) t <<
"\n";
3421 t <<
"document.addEventListener('DOMContentLoaded',() => {\n";
3422 t <<
" const query = trim(getURLParameter('query'));\n";
3423 t <<
" if (query) {\n";
3424 t <<
" searchFor(query,0,20);\n";
3426 t <<
" const results = document.getElementById('results');\n";
3427 t <<
" results.innerHtml = '<p>" <<
theTranslator->trSearchResults(0) <<
"</p>';\n";
3433 err(
"Failed to open file '{}' for writing...\n",scriptName);
3439 m_t <<
"<div class=\"typeconstraint\">\n";
3440 m_t <<
"<dl><dt><b>" << header <<
"</b></dt><dd>\n";
3441 m_t <<
"<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n";
3446 m_t <<
"<tr><td valign=\"top\"><em>";
3451 m_t <<
"</em></td>";
3456 m_t <<
"<td> :</td><td valign=\"top\"><em>";
3461 m_t <<
"</em></td>";
3466 m_t <<
"<td> ";
3471 m_t <<
"</td></tr>\n";
3476 m_t <<
"</table>\n";
3486 m_t <<
"<br class=\"" << style <<
"\" />\n";
3496 m_t <<
"<div class=\"header\">\n";
3501 m_t <<
" <div class=\"headertitle\">";
3513 m_t <<
"</div><!--header-->\n";
3520 m_t <<
"<table class=\"memberdecls\">\n";
3523 m_t <<
"<tr><td colspan=\"2\"><h3>";
3528 m_t <<
"</h3></td></tr>\n";
3533 DBG_HTML(
m_t <<
"<!-- startMemberDocSimple -->\n";)
3534 m_t <<
"<table class=\"fieldtable\">\n";
3535 m_t <<
"<tr><th colspan=\"" << (isEnum?
"2":
"3") <<
"\">";
3543 m_t <<
"</table>\n";
3548 DBG_HTML(
m_t <<
"<!-- startInlineMemberType -->\n";)
3549 m_t <<
"<tr><td class=\"fieldtype\">\n";
3554 DBG_HTML(
m_t <<
"<!-- endInlineMemberType -->\n";)
3560 DBG_HTML(
m_t <<
"<!-- startInlineMemberName -->\n";)
3561 m_t <<
"<td class=\"fieldname\">\n";
3566 DBG_HTML(
m_t <<
"<!-- endInlineMemberName -->\n";)
3572 DBG_HTML(
m_t <<
"<!-- startInlineMemberDoc -->\n";)
3573 m_t <<
"<td class=\"fielddoc\">\n";
3579 m_t <<
"</td></tr>\n";
3585 m_t <<
"<div class=\"embeddoc indent-" << indent <<
"\">";
3597 m_t <<
"<span class=\"mlabels\">";
3602 DBG_HTML(
m_t <<
"<!-- writeLabel(" << label <<
") -->\n";)
3604 auto convertLabelToClass = [](
const std::string &lab) {
3617 for (
size_t i=0; i<l; i++)
3619 char c = input.
at(i);
3620 if (c<0 || (c>=
'a' && c<=
'z') || c==
'_')
3625 else if (nmstart && (c<0 || (c>=
'a' && c<=
'z') || (c>=
'0' && c<=
'9') || c==
'_'))
3629 else if (nmstart && (c==
' ' || c==
'-'))
3637 m_t <<
"<span class=\"mlabel " << convertLabelToClass(label.
stripWhiteSpace().
str()) <<
"\">" << label <<
"</span>";
3651 DBG_HTML(
m_t <<
"<!-- writeInheritedSectionTitle -->\n";)
3659 classLink +=
" href=\"";
3664 classLink +=
"href=\"";
3669 classLink=classLink+fn+a;
3671 m_t <<
"<tr class=\"inherit_header " <<
id <<
"\">";
3672 if (dynamicSections)
3674 m_t <<
"<td colspan=\"2\" class=\"dyn-inherit\">";
3675 m_t <<
"<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
3679 m_t <<
"<td colspan=\"2\">";
3689 m_t <<
" <div class=\"summary\">\n";
3695 m_t <<
"<a href=\"";
3714 m_t <<
"<div id=\"page-nav\" class=\"page-nav-panel\">\n";
3715 m_t <<
"<div id=\"page-nav-resize-handle\"></div>\n";
3716 m_t <<
"<div id=\"page-nav-tree\">\n";
3717 m_t <<
"<div id=\"page-nav-contents\">\n";
3718 m_t <<
"</div><!-- page-nav-contents -->\n";
3719 m_t <<
"</div><!-- page-nav-tree -->\n";
3720 m_t <<
"</div><!-- page-nav -->\n";
3739 m_t <<
"<div class=\"toc\">";
3758 if (
type.isSection())
3761 int nextLevel =
type.level();
3769 char cs[2] = {
static_cast<char>(
'0'+l+1), 0 };
3770 const char *empty = (l!=nextLevel-1) ?
" empty" :
"";
3789 char cs[2] = {
static_cast<char>(
'0'+nextLevel), 0 };
3794 m_t <<
"<a href=\"#"+label+
"\">";
3802 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, bool toIndex) 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)