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)
339 bool hasProjectName = !projectName.
isEmpty();
346 bool hasCookie = treeView || searchEngine ||
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE;
347 static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
352 cssFile =
"doxygen.css";
365 cssFile =
"doxygen.css";
372 for (
const auto &fileName : extraCssFile)
374 if (!fileName.empty())
379 extraCssText +=
"<link href=\""+htmlStyleSheet+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
386 extraCssText +=
"<link href=\"$relpath^"+
stripPath(fileName)+
"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
394 case TIMESTAMP_t::NO:
398 generatedBy =
theTranslator->trGeneratedAt(
"<span class=\"timestamp\"></span>",
404 treeViewCssJs =
"<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
405 "<script type=\"text/javascript\" src=\"$relpath^navtreedata.js\"></script>\n"
406 "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n";
411 searchCssJs =
"<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
412 if (!serverBasedSearch)
414 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/searchdata.js\"></script>\n";
416 searchCssJs +=
"<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n";
418 if (!serverBasedSearch)
422 searchCssJs +=
"<script type=\"text/javascript\">\n"
423 "document.addEventListener('DOMContentLoaded', init_search);\n"
431 searchCssJs +=
"<script type=\"text/javascript\">\n"
432 "document.addEventListener('DOMContentLoaded', () => {\n"
433 " if (document.querySelector('.searchresults')) { searchBox.DOMSearchField().focus(); }\n"
439 searchCssJs +=
"<link rel=\"search\" href=\"" + relPath +
440 "search_opensearch.php?v=opensearch.xml\" "
441 "type=\"application/opensearchdescription+xml\" title=\"" +
442 (hasProjectName ? projectName :
QCString(
"Doxygen")) +
449 if (mathJax && !isSource)
458 auto writeMathJax3Packages = [&mathJaxJs](
const StringVector &mathJaxExtensions)
460 mathJaxJs +=
" packages: ['base','configmacros'";
463 mathJaxJs+=
",'newcommand'";
465 for (
const auto &s : mathJaxExtensions)
467 mathJaxJs+=
",'"+s+
"'";
472 auto writeMathJax4Packages = [&mathJaxJs](
const StringVector &mathJaxExtensions)
474 mathJaxJs +=
" packages: {\n";
476 for (
const auto &s : mathJaxExtensions)
478 if (!first) mathJaxJs+=
",";
481 mathJaxJs+=
"\n '[-]': ['";
482 mathJaxJs+=s.
data()+1;
487 mathJaxJs+=
"\n '[+]': ['"+s+
"']";
491 mathJaxJs +=
"\n }\n";
494 auto writeMathJaxScript = [&path,&mathJaxJs](
const QCString &pathPostfix,
498 mathJaxJs +=
"<script type=\"text/javascript\">\n"
499 "window.MathJax = {\n"
501 " ignoreHtmlClass: 'tex2jax_ignore',\n"
502 " processHtmlClass: 'tex2jax_process'\n"
509 if (!mathJaxExtensions.empty())
512 mathJaxJs+=
" loader: {\n"
514 for (
const auto &s : mathJaxExtensions)
518 if (!first) mathJaxJs+=
",";
519 mathJaxJs+=
"'[tex]/"+s+
"'";
526 mathJaxJs+=
" tex: {\n"
533 writePackages(mathJaxExtensions);
547 mathJaxJs+=
"</script>\n";
548 mathJaxJs +=
"<script type=\"text/javascript\" id=\"MathJax-script\" async=\"async\" src=\"" +
549 path + pathPostfix +
"tex-" + mathJaxFormat.
lower() +
".js\">";
550 mathJaxJs+=
"</script>\n";
553 switch (mathJaxVersion)
555 case MATHJAX_VERSION_t::MathJax_4:
556 writeMathJaxScript(
"",writeMathJax4Packages);
558 case MATHJAX_VERSION_t::MathJax_3:
559 writeMathJaxScript(
"es5/",writeMathJax3Packages);
561 case MATHJAX_VERSION_t::MathJax_2:
564 mathJaxJs =
"<script type=\"text/x-mathjax-config\">\n"
565 "MathJax.Hub.Config({\n"
566 " extensions: [\"tex2jax.js\"";
568 for (
const auto &s : mathJaxExtensions)
570 mathJaxJs+=
", \""+
QCString(s)+
".js\"";
574 mathJaxFormat =
"HTML-CSS";
577 " jax: [\"input/TeX\",\"output/"+mathJaxFormat+
"\"],\n";
580 mathJaxJs +=
" TeX: { Macros: {\n";
585 mathJaxJs +=
"});\n";
591 mathJaxJs +=
"</script>\n";
592 mathJaxJs +=
"<script type=\"text/javascript\" async=\"async\" src=\"" + path +
"MathJax.js\"></script>\n";
601 darkModeJs=
"<script type=\"text/javascript\" src=\"$relpath^darkmode_toggle.js\"></script>\n";
605 if (mermaidRenderMode==
"CLIENT_SIDE" || mermaidRenderMode==
"AUTO")
608 mermaidJs =
"<script type=\"module\">\n"
609 "import mermaid from '" + mermaidJsUrl +
"';\n";
612 case HTML_COLORSTYLE_t::LIGHT:
613 mermaidJs +=
"const theme = 'default';\n";
615 case HTML_COLORSTYLE_t::DARK:
616 mermaidJs +=
"const theme = 'dark';\n";
618 case HTML_COLORSTYLE_t::AUTO_LIGHT:
619 case HTML_COLORSTYLE_t::AUTO_DARK:
620 mermaidJs +=
"const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'default';\n";
622 case HTML_COLORSTYLE_t::TOGGLE:
623 mermaidJs +=
"const theme = DarkModeToggle.darkModeEnabled ? 'dark' : 'default'\n";
626 mermaidJs +=
"mermaid.initialize({ startOnLoad: true, theme: theme });\n";
631 " const elementCode = '.mermaid';\n"
632 " const loadMermaid = function(theme) {\n"
633 " mermaid.initialize({theme})\n"
634 " mermaid.init({theme}, document.querySelectorAll(elementCode))\n"
636 " const saveOriginalData = function() {\n"
637 " return new Promise((resolve, reject) => {\n"
639 " var els = document.querySelectorAll(elementCode), count = els.length;\n"
640 " els.forEach(element => {\n"
641 " element.setAttribute('data-original-code', element.innerHTML)\n"
643 " if (count == 0) { resolve() }\n"
645 " } catch (error) { reject(error) }\n"
648 " const resetProcessed = function(){\n"
649 " return new Promise((resolve, reject) => {\n"
651 " var els = document.querySelectorAll(elementCode), count = els.length;\n"
652 " els.forEach(element => {\n"
653 " if (element.getAttribute('data-original-code') != null) {\n"
654 " element.removeAttribute('data-processed')\n"
655 " element.innerHTML = element.getAttribute('data-original-code')\n"
658 " if(count == 0) { resolve() }\n"
660 " } catch (error) { reject(error) }\n"
663 " saveOriginalData()\n"
664 " const original = DarkModeToggle.enableDarkMode.bind(DarkModeToggle);\n"
665 " DarkModeToggle.enableDarkMode = function(enable) {\n"
666 " original(enable);\n"
667 " resetProcessed().then(loadMermaid(enable ? 'dark' : 'default')).catch(console.error)\n"
671 mermaidJs +=
"</script>\n";
676 treeViewCssJs+=
"<script type=\"text/javascript\" src=\"$relpath^cookie.js\"></script>\n";
689 {
"$datetime", [&]() ->
QCString {
return "<span class=\"datetime\"></span>"; } },
690 {
"$date", [&]() ->
QCString {
return "<span class=\"date\"></span>"; } },
691 {
"$time", [&]() ->
QCString {
return "<span class=\"time\"></span>"; } },
692 {
"$year", [&]() ->
QCString {
return "<span class=\"year\"></span>"; } },
693 {
"$navpath", [&]() ->
QCString {
return navPath; } },
694 {
"$stylesheet", [&]() ->
QCString {
return cssFile; } },
695 {
"$treeview", [&]() ->
QCString {
return treeViewCssJs; } },
696 {
"$searchbox", [&]() ->
QCString {
return searchBox; } },
697 {
"$search", [&]() ->
QCString {
return searchCssJs; } },
698 {
"$mathjax", [&]() ->
QCString {
return mathJaxJs; } },
699 {
"$mermaidjs", [&]() ->
QCString {
return mermaidJs; } },
700 {
"$darkmode", [&]() ->
QCString {
return darkModeJs; } },
701 {
"$generatedby", [&]() ->
QCString {
return generatedBy; } },
702 {
"$extrastylesheet",[&]() ->
QCString {
return extraCssText; } },
703 {
"$relpath$", [&]() ->
QCString {
return relPath; } }
706 result =
substitute(result,
"$relpath^",relPath);
712 {
"FULL_SIDEBAR", hasFullSideBar },
713 {
"DISABLE_INDEX", disableIndex },
714 {
"GENERATE_TREEVIEW", treeView },
715 {
"SEARCHENGINE", searchEngine },
716 {
"TITLEAREA", titleArea },
717 {
"PROJECT_NAME", hasProjectName },
718 {
"PROJECT_NUMBER", hasProjectNumber },
719 {
"PROJECT_BRIEF", hasProjectBrief },
720 {
"PROJECT_LOGO", hasProjectLogo },
721 {
"PROJECT_ICON", hasProjectIcon },
722 {
"COPY_CLIPBOARD", hasCopyClipboard },
724 {
"HTML_DYNAMIC_SECTIONS", dynamicSections},
740 while ((i=definitions.
find(
'\n',p))!=-1)
745 int separator = line.
find(
':');
746 assert(separator!=-1);
747 std::string key = line.
left(separator).
str();
751 map.emplace(key,value);
762 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
766 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
779 while ((i=input.
find(
"var(",p))!=-1)
781 result+=input.
mid(p,i-p);
782 int j=input.
find(
")",i+4);
784 auto it = mapping.find(input.
mid(i+4,j-i-4).
str());
785 if (it==mapping.end())
787 err(
"failed to find value variable {}. It is not longer defined in doxygen.css\n",input.
mid(i+4,j-i-4));
801 if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
805 else if (colorStyle==HTML_COLORSTYLE_t::DARK)
841 const char *p=str.
data();
854 int spacesToNextTabStop = tabSize - (
m_col%tabSize);
855 while (spacesToNextTabStop--)
874 case '\'': *
m_t <<
"'";
m_col++;
876 case '"': *
m_t <<
""";
m_col++;
880 { *
m_t <<
"<"; p++; }
882 { *
m_t <<
">"; p++; }
884 { *
m_t <<
"\\‍[";
m_col++;p++; }
886 { *
m_t <<
"\\‍]";
m_col++;p++; }
888 { *
m_t <<
"\\‍(";
m_col++;p++; }
890 { *
m_t <<
"\\‍)";
m_col++;p++; }
897 uint8_t uc =
static_cast<uint8_t
>(c);
900 *
m_t <<
"$" <<
hex[uc>>4] <<
hex[uc&0xF] <<
";";
944 const QCString &anchor,
int l,
bool writeLineAnchor)
948 const int maxLineNrStr = 10;
949 char lineNumber[maxLineNrStr];
950 char lineAnchor[maxLineNrStr];
951 qsnprintf(lineNumber,maxLineNrStr,
"%5d",l);
952 qsnprintf(lineAnchor,maxLineNrStr,
"l%05d",l);
957 *
m_t <<
"<div class=\"line\">";
961 if (writeLineAnchor) *
m_t <<
"<a id=\"" << lineAnchor <<
"\" name=\"" << lineAnchor <<
"\"></a>";
962 *
m_t <<
"<span class=\"lineno\">";
1000 *
m_t <<
"<a class=\"" << className <<
"Ref\" ";
1005 *
m_t <<
"<a class=\"" << className <<
"\" ";
1025 *
m_t <<
"<div class=\"ttc\" id=\"" <<
id <<
"\">";
1026 *
m_t <<
"<div class=\"ttname\">";
1029 *
m_t <<
"<a href=\"";
1045 *
m_t <<
"<div class=\"ttdeci\">";
1052 *
m_t <<
"<div class=\"ttdoc\">";
1059 *
m_t <<
"<div class=\"ttdef\"><b>" <<
theTranslator->trDefinition() <<
"</b> ";
1062 *
m_t <<
"<a href=\"";
1078 *
m_t <<
"<div class=\"ttdecl\"><b>" <<
theTranslator->trDeclaration() <<
"</b> ";
1081 *
m_t <<
"<a href=\"";
1106 *
m_t <<
"<div class=\"line\">";
1130 *
m_t <<
"<span class=\"" << s <<
"\">";
1142 *
m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1147 *
m_t <<
"<div class=\"fragment\">";
1159 *
m_t <<
"</div><!-- fragment -->";
1169 const int maxLineNrStr = 10;
1170 char lineNumber[maxLineNrStr];
1171 qsnprintf(lineNumber,maxLineNrStr,
"%05d",lineNr);
1172 *
m_t <<
"<div class=\"foldopen\" id=\"foldopen" << lineNumber <<
1173 "\" data-start=\"" << startMarker <<
1174 "\" data-end=\"" << endMarker <<
1178 *
m_t <<
"<div class=\"line\">";
1186 *
m_t <<
"<div class=\"line\">";
1262 return (str.
contains(
"$datetime",
false) ||
1275 term(
"Could not create output directory {}\n",dname);
1454 searchCss = mgr.
getAsString(
"search_sidebar.css");
1460 searchCss = mgr.
getAsString(
"search_nomenu_toggle.css");
1469 searchCss = mgr.
getAsString(
"search_fixedtabs.css");
1476 searchCss += mgr.
getAsString(
"search_common.css");
1477 searchCss =
substitute(searchCss,
"$doxygenversion",getDoxygenVersion());
1485 t <<
"/* The standard CSS for doxygen " << getDoxygenVersion() <<
"*/\n\n";
1488 case HTML_COLORSTYLE_t::LIGHT:
1489 case HTML_COLORSTYLE_t::DARK:
1492 case HTML_COLORSTYLE_t::AUTO_LIGHT:
1493 case HTML_COLORSTYLE_t::TOGGLE:
1498 case HTML_COLORSTYLE_t::AUTO_DARK:
1504 if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_LIGHT)
1506 t <<
"@media (prefers-color-scheme: dark) {\n";
1507 t <<
" html:not(.dark-mode) {\n";
1508 t <<
" color-scheme: dark;\n\n";
1512 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_DARK)
1514 t <<
"@media (prefers-color-scheme: light) {\n";
1515 t <<
" html:not(.light-mode) {\n";
1516 t <<
" color-scheme: light;\n\n";
1520 else if (
Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
1522 t <<
"html.dark-mode {\n";
1533 " border-bottom: none;\n"
1534 " background-color: var(--nav-background-color);\n"
1535 " border-right: 1px solid var(--nav-border-color);\n"
1550 case TIMESTAMP_t::YES:
1551 case TIMESTAMP_t::DATETIME:
1554 case TIMESTAMP_t::DATE:
1560 t <<
"--timestamp: '" << timeStampStr <<
"';\n";
1573 t <<
"span.timestamp { content: ' '; }\n";
1574 t <<
"span.timestamp:before { content: var(--timestamp); }\n\n";
1578 t <<
"span.datetime { content: ' '; }\n";
1579 t <<
"span.datetime:before { content: var(--datetime); }\n\n";
1580 t <<
"span.date { content: ' '; }\n";
1581 t <<
"span.date:before { content: var(--date); }\n\n";
1582 t <<
"span.time { content: ' '; }\n";
1583 t <<
"span.time:before { content: var(--time); }\n\n";
1584 t <<
"span.year { content: ' '; }\n";
1585 t <<
"span.year:before { content: var(--year); }\n\n";
1592 bool addScrollbarStyling =
Config_getList(HTML_EXTRA_STYLESHEET).empty();
1593 if (addScrollbarStyling)
1608 t <<
"<!-- HTML header for doxygen " << getDoxygenVersion() <<
"-->\n";
1614 t <<
"<!-- HTML footer for doxygen " << getDoxygenVersion() <<
"-->\n";
1641 << getDoxygenVersion() <<
" -->\n";
1645 m_t <<
"<script type=\"text/javascript\">\n";
1646 m_t <<
"let searchBox = new SearchBox(\"searchBox\", \""
1648 m_t <<
"</script>\n";
1652 m_t <<
"<script type=\"text/javascript\">\n";
1653 m_t <<
"document.addEventListener('DOMContentLoaded', codefold.init);\n";
1654 m_t <<
"</script>\n";
1663 if (searchEngine && !serverBasedSearch)
1665 t <<
"<!-- window showing the filter options -->\n";
1666 t <<
"<div id=\"MSearchSelectWindow\"\n";
1667 t <<
" onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
1668 t <<
" onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
1669 t <<
" onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n";
1672 t <<
"<!-- iframe showing the search results (closed by default) -->\n";
1673 t <<
"<div id=\"MSearchResultsWindow\">\n";
1674 t <<
"<div id=\"MSearchResults\">\n";
1675 t <<
"<div class=\"SRPage\">\n";
1676 t <<
"<div id=\"SRIndex\">\n";
1677 t <<
"<div id=\"SRResults\"></div>\n";
1678 t <<
"<div class=\"SRStatus\" id=\"Loading\">" <<
theTranslator->trLoading() <<
"</div>\n";
1679 t <<
"<div class=\"SRStatus\" id=\"Searching\">" <<
theTranslator->trSearching() <<
"</div>\n";
1680 t <<
"<div class=\"SRStatus\" id=\"NoMatches\">" <<
theTranslator->trNoMatches() <<
"</div>\n";
1700 case TIMESTAMP_t::NO:
1704 result =
theTranslator->trGeneratedAt(
"<span class=\"timestamp\"></span>",
1708 result +=
" \n<a href=\"https://www.doxygen.org/index.html\">\n"
1709 "<img class=\"footer\" src=\"";
1711 result +=
"doxygen.svg\" width=\"104\" height=\"31\" alt=\"doxygen\"/></a> ";
1712 result += getDoxygenVersion();
1740 m_t <<
"<h3 class=\"version\">";
1769 err(
"style sheet {} does not exist or is not readable!\n",
Config_getString(HTML_STYLESHEET));
1784 for (
const auto &
fileName : extraCssFiles)
1829 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>";
1843 m_t <<
"\n<p class=\"" << classDef <<
"\">";
1875 m_t <<
"<a class=\"elRef\" ";
1880 m_t <<
"<a class=\"el\" ";
1918 m_t <<
"<a class=\"el\" href=\"" << fn <<
"\">";
1928 m_t <<
"<a class=\"elRef\" ";
1933 m_t <<
"<a class=\"el\" ";
1949 m_t <<
"<a href=\"";
1966 if (extraIndentLevel==2)
1970 else if (extraIndentLevel==1)
1982 m_t <<
" class=\"groupheader\">";
1987 if (extraIndentLevel==2)
1991 else if (extraIndentLevel==1)
2003 switch(
type.level())
2012 default:
ASSERT(0);
break;
2014 m_t <<
"<a id=\"" << lab <<
"\" name=\"" << lab <<
"\"></a>";
2019 switch(
type.level())
2028 default:
ASSERT(0);
break;
2041 const char *p=str.
data();
2047 case '<':
m_t <<
"<";
break;
2048 case '>':
m_t <<
">";
break;
2049 case '&':
m_t <<
"&";
break;
2050 case '"':
m_t <<
""";
break;
2051 case '-':
if (inHtmlComment)
m_t <<
"-";
else m_t <<
"-";
break;
2054 {
m_t <<
"<"; p++; }
2056 {
m_t <<
">"; p++; }
2058 {
m_t <<
"\\‍["; p++; }
2060 {
m_t <<
"\\‍]"; p++; }
2062 {
m_t <<
"\\‍("; p++; }
2064 {
m_t <<
"\\‍)"; p++; }
2085 const QCString &relPath,
int sectionCount)
2089 if (dynamicSections)
2091 t <<
"<div id=\"dynsection-" << sectionCount <<
"\" "
2092 "onclick=\"return dynsection.toggleVisibility(this)\" "
2093 "class=\"dynheader closed\" "
2094 "style=\"cursor:pointer;\">"
2095 "<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
2099 t <<
"<div class=\"dynheader\">\n";
2113 if (dynamicSections)
2115 t <<
"<div id=\"dynsection-" << sectionCount <<
"-summary\" "
2116 "class=\"dynsummary\" "
2117 "style=\"display:block;\">\n";
2125 if (dynamicSections)
2135 if (dynamicSections)
2137 t <<
"<div id=\"dynsection-" << sectionCount <<
"-content\" "
2138 "class=\"dyncontent\" "
2139 "style=\"display:none;\">\n";
2143 t <<
"<div class=\"dyncontent\">\n";
2171 m_t <<
" <div class=\"center\">\n";
2172 m_t <<
" <img src=\"";
2174 m_t <<
"_map\" alt=\"\"/>\n";
2184 m_t <<
" <div class=\"center\">\n";
2185 m_t <<
" <img src=\"";
2214 m_t <<
"<table class=\"memberdecls\">\n";
2220 if (dynamicSections)
m_t <<
" inherit";
2221 m_t <<
" " << inheritId;
2238 m_t <<
"</td></tr>\n";
2248 m_t <<
"</td></tr>\n";
2252 if (dynamicSections)
m_t <<
" inherit";
2253 m_t <<
" " << inheritId;
2255 m_t <<
" template\"><td class=\"memItemLeft\">";
2260 m_t <<
"<div class=\"compoundTemplParams\">";
2271 m_t <<
" </td><td class=\"memItemRight\">";
2276 if (!initTag)
m_t <<
" </td>";
2288 DBG_HTML(
m_t <<
"<!-- startMemberDescription -->\n")
2292 m_t <<
"<table class=\"memberdecls\">\n";
2295 m_t <<
"<tr class=\"memdesc:" << anchor;
2298 if (dynamicSections)
m_t <<
" inherit";
2299 m_t <<
" " << inheritId;
2302 m_t <<
"<td class=\"mdescLeft\"> </td>";
2303 if (typ)
m_t <<
"<td class=\"mdescLeft\"> </td>";
2304 m_t <<
"<td class=\"mdescRight\">";
2309 DBG_HTML(
m_t <<
"<!-- endMemberDescription -->\n")
2310 m_t <<
"<br /></td></tr>\n";
2326 m_t <<
"</table>\n";
2340 m_t <<
"<table class=\"memberdecls\">\n";
2343 m_t <<
"<tr class=\"heading\"><td colspan=\"" << typ <<
"\"><h2";
2346 m_t <<
" id=\"header-" << anchor <<
"\"";
2348 m_t <<
" class=\"groupheader\">";
2351 m_t <<
"<a id=\"" << anchor <<
"\" name=\"" << anchor <<
"\"></a>\n";
2358 m_t <<
"</h2></td></tr>\n";
2366 m_t <<
"<table class=\"memberdecls\">\n";
2369 m_t <<
"<tr><td class=\"ititle\" colspan=\"2\">";
2375 m_t <<
"</td></tr>\n";
2385 m_t <<
"</table>\n";
2420 int memCount,
int memTotal,
bool )
2423 m_t <<
"\n<h2 class=\"memtitle\">"
2424 <<
"<span class=\"permalink\"><a href=\"#" << anchor <<
"\">◆ </a></span>";
2428 m_t <<
" <span class=\"overload\">[" << memCount <<
"/" << memTotal <<
"]</span>";
2431 m_t <<
"\n<div class=\"memitem\">\n";
2432 m_t <<
"<div class=\"memproto\">\n";
2437 DBG_HTML(
m_t <<
"<!-- startMemberDocPrefixItem -->\n";)
2438 m_t <<
"<div class=\"memtemplate\">\n";
2443 DBG_HTML(
m_t <<
"<!-- endMemberDocPrefixItem -->\n";)
2451 m_t <<
" <table class=\"memname\">\n";
2454 m_t <<
" <td class=\"memname\">";
2467 if (openBracket)
m_t <<
"(";
2475 DBG_HTML(
m_t <<
"<!-- startFirstParameterType -->\n";)
2476 m_t <<
" <td class=\"paramtype\">";
2482 m_t <<
" <td class=\"paramkey\">" << key <<
"</td>\n";
2483 m_t <<
" <td></td>\n";
2484 m_t <<
" <td class=\"paramtype\">";
2497 m_t <<
" <td class=\"paramname\"><span class=\"paramname\"><em>";
2503 m_t <<
"</em></span>";
2508 DBG_HTML(
m_t <<
"<!-- startParameterExtra -->\n";)
2518 if (closeBracket)
m_t <<
"</td><td>)";
2525 if (closeBracket)
m_t <<
")";
2537 m_t <<
"<span class=\"paramdefsep\">";
2539 m_t <<
"</span><span class=\"paramdefval\">";
2562 m_t <<
" <td align=\"right\">";
2566 m_t <<
prefix <<
"</td><td>(</td><td colspan=\"2\">";
2567 else if (closeBracket)
2568 m_t <<
" )</td><td></td><td></td><td>";
2570 m_t <<
"</td><td></td><td colspan=\"2\">";
2580 m_t <<
" </table>\n";
2599 if (generateLegend && !umlLook)
2602 m_t <<
"<center><span class=\"legend\">[";
2605 if (generateTreeView)
m_t <<
"target=\"top\" ";
2611 m_t <<
"]</span></center>";
2697 m_t <<
"<tr id=\"" <<
id <<
"\" class=\"groupHeader\"><td colspan=\"2\"><div class=\"groupHeader\">";
2702 m_t <<
"</div></td></tr>\n";
2707 m_t <<
"<tr><td colspan=\"2\" class=\"ititle\"><div class=\"groupText\">";
2712 m_t <<
"</div></td></tr>\n";
2727 m_t <<
"<div class=\"memdoc\">\n";
2733 m_t <<
"\n</div>\n" <<
"</div>\n";
2742 for (
int i=0; i<n; i++)
2750 m_t <<
"<table class=\"fieldtable\">\n"
2751 <<
"<tr><th colspan=\"" << (hasInits?3:2) <<
"\">" << title <<
"</th></tr>";
2755 m_t <<
"</table>\n";
2770 m_t <<
"<td class=\"fieldname\">";
2775 m_t <<
" </td>";
2780 m_t <<
"<td class=\"fieldinit\">";
2785 m_t <<
" </td>";
2790 m_t <<
"<td class=\"fielddoc\">";
2800 m_t <<
"<dl class=\"section examples\"><dt>";
2813 if (astImpl && sectionLevel<=
m_tocState.maxLevel)
2817 std::visit(visitor,astImpl->
root);
2829 t <<
" <div id=\"navrow1\" class=\"tabs\">\n";
2833 t <<
" <div id=\"navrow2\" class=\"tabs2\">\n";
2835 t <<
" <ul class=\"tablist\">\n";
2863 t <<
" class=\"current\"";
2873 if (!l.
isEmpty()) t <<
"</a>";
2884 case LayoutNavEntry::MainPage:
return TRUE;
2885 case LayoutNavEntry::User:
return TRUE;
2886 case LayoutNavEntry::UserGroup:
return TRUE;
2887 case LayoutNavEntry::Pages:
return index.numIndexedPages()>0;
2888 case LayoutNavEntry::Topics:
return index.numDocumentedGroups()>0;
2889 case LayoutNavEntry::Modules:
return index.numDocumentedModules()>0;
2890 case LayoutNavEntry::ModuleList:
return index.numDocumentedModules()>0;
2892 case LayoutNavEntry::Namespaces:
return showNamespaces && index.numDocumentedNamespaces()>0;
2893 case LayoutNavEntry::NamespaceList:
return showNamespaces && index.numDocumentedNamespaces()>0;
2895 case LayoutNavEntry::Concepts:
return index.numDocumentedConcepts()>0;
2896 case LayoutNavEntry::Classes:
return index.numAnnotatedClasses()>0;
2897 case LayoutNavEntry::ClassList:
return index.numAnnotatedClasses()>0;
2898 case LayoutNavEntry::ClassIndex:
return index.numAnnotatedClasses()>0;
2899 case LayoutNavEntry::ClassHierarchy:
return index.numHierarchyClasses()>0;
2901 case LayoutNavEntry::Files:
return showFiles && index.numDocumentedFiles()>0;
2902 case LayoutNavEntry::FileList:
return showFiles && index.numDocumentedFiles()>0;
2905 case LayoutNavEntry::Interfaces:
return index.numAnnotatedInterfaces()>0;
2906 case LayoutNavEntry::InterfaceList:
return index.numAnnotatedInterfaces()>0;
2907 case LayoutNavEntry::InterfaceIndex:
return index.numAnnotatedInterfaces()>0;
2908 case LayoutNavEntry::InterfaceHierarchy:
return index.numHierarchyInterfaces()>0;
2909 case LayoutNavEntry::Structs:
return index.numAnnotatedStructs()>0;
2910 case LayoutNavEntry::StructList:
return index.numAnnotatedStructs()>0;
2911 case LayoutNavEntry::StructIndex:
return index.numAnnotatedStructs()>0;
2912 case LayoutNavEntry::Exceptions:
return index.numAnnotatedExceptions()>0;
2913 case LayoutNavEntry::ExceptionList:
return index.numAnnotatedExceptions()>0;
2914 case LayoutNavEntry::ExceptionIndex:
return index.numAnnotatedExceptions()>0;
2915 case LayoutNavEntry::ExceptionHierarchy:
return index.numHierarchyExceptions()>0;
2916 case LayoutNavEntry::None:
2917 assert(kind != LayoutNavEntry::None);
2927 for (
const auto &entry : root->
children())
2934 for (
const auto &entry : root->
children())
2939 t <<
"<li><a href=\"" << relPath << url <<
"\"><span>";
2941 t <<
"</span></a>\n";
2954 bool highlightParent,
bool highlightSearch)
2977 entry.get()==hlEntry &&
2978 (!entry->children().empty() ||
2979 (entry->kind()==kind && !highlightParent)
2997 if (disableIndex || !generateTreeView || !fullSidebar)
2999 if (!serverBasedSearch)
3007 if (!highlightSearch)
3048 bool highlightParent=
false;
3076 highlightParent =
true;
break;
3078 highlightParent =
true;
break;
3080 highlightParent =
true;
break;
3082 highlightParent =
true;
break;
3084 highlightParent =
true;
break;
3086 highlightParent =
true;
break;
3088 highlightParent =
true;
break;
3090 highlightParent =
true;
break;
3095 if (!disableIndex && dynamicMenus)
3104 searchPage =
"search.php";
3106 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menudata.js\"></script>\n";
3107 t <<
"<script type=\"text/javascript\" src=\"" << relPath <<
"menu.js\"></script>\n";
3108 t <<
"<script type=\"text/javascript\">\n";
3109 t <<
"document.addEventListener('DOMContentLoaded', () => {\n";
3110 t <<
" initMenu('" << relPath <<
"'," << (generateTreeView?
"true":
"false") <<
");\n";
3113 if (!serverBasedSearch)
3115 if (!disableIndex && dynamicMenus && !fullSidebar)
3117 t <<
" init_search();\n";
3122 t <<
" if (document.querySelector('.searchresults')) { searchBox.DOMSearchField().focus(); }\n";
3127 t <<
"<div id=\"main-nav-mobile\">\n";
3128 if (searchEngine && !fullSidebar)
3130 t <<
"<div class=\"sm sm-dox\"><input id=\"main-menu-state\" type=\"checkbox\"/>\n";
3131 t <<
"<label class=\"main-menu-btn\" for=\"main-menu-state\">\n";
3132 t <<
"<span class=\"main-menu-btn-icon\"></span> Toggle main menu visibility</label>\n";
3133 t <<
"<span id=\"searchBoxPos1\" style=\"position:absolute;right:8px;top:8px;height:36px;\">";
3137 t <<
"</div><!-- main-nav-mobile -->\n";
3138 t <<
"<div id=\"main-nav\">\n";
3139 t <<
" <ul class=\"sm sm-dox\" id=\"main-menu\">\n";
3140 t <<
" <li id=\"searchBoxPos2\" style=\"float:right\">\n";
3141 if (searchEngine && !(generateTreeView && fullSidebar))
3147 t <<
"</div><!-- main-nav -->\n";
3149 else if (!disableIndex)
3153 if (!hlEntry && altKind!=LayoutNavEntry::None) { hlEntry=root->
find(altKind); kind=altKind; }
3156 highlightParent=
TRUE;
3157 hlEntry = root->
children().front().get();
3158 if (hlEntry==
nullptr)
3163 if (kind==LayoutNavEntry::UserGroup)
3171 t <<
"<div id=\"main-nav\">\n";
3175 t <<
"</div><!-- main-nav -->\n";
3178 else if (!generateTreeView)
3182 if (generateTreeView && !disableIndex && fullSidebar && !extraTabs)
3184 t <<
"<div id=\"container\"><div id=\"doc-content\">\n";
3191 m_t <<
"</div><!-- top -->\n";
3192 if (!generateTreeView)
3194 m_t <<
"<div id=\"doc-content\">\n";
3203 if (generateTreeView)
3210 "<div id=\"side-nav\" class=\"ui-resizable side-nav-resizable\">\n");
3213 " <div id=\"nav-tree\">\n"
3214 " <div id=\"nav-tree-contents\">\n"
3215 " <div id=\"nav-sync\" class=\"sync\"></div>\n"
3218 " <div id=\"splitbar\" style=\"-moz-user-select:none;\" \n"
3219 " class=\"ui-resizable-handle\">\n"
3222 "<script type=\"text/javascript\">\n"
3223 "document.addEventListener('DOMContentLoaded',() => { initNavTree('" + fn +
"','" + relpath +
"','" + allMembersFile +
"'); });\n"
3227 result+=
"<div id=\"container\">\n<div id=\"doc-content\">\n";
3245 m_t <<
"<div class=\"contents\">\n";
3250 m_t <<
"</div><!-- contents -->\n";
3260 m_t <<
"</div><!-- PageDoc -->\n";
3274 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3279 QCString configFileName = htmlOutput+
"/search_config.php";
3285 t <<
"$config = array(\n";
3286 t <<
" 'PROJECT_NAME' => \"" <<
convertToHtml(projectName) <<
"\",\n";
3287 t <<
" 'GENERATE_TREEVIEW' => " << (generateTreeView?
"true":
"false") <<
",\n";
3288 t <<
" 'DISABLE_INDEX' => " << (disableIndex?
"true":
"false") <<
",\n";
3289 t <<
" 'FULL_SIDEBAR' => " << (fullSidebar?
"true":
"false") <<
",\n";
3291 t <<
"$translator = array(\n";
3292 t <<
" 'search_results_title' => \"" <<
theTranslator->trSearchResultsTitle() <<
"\",\n";
3293 t <<
" 'search_results' => array(\n";
3294 t <<
" 0 => \"" <<
theTranslator->trSearchResults(0) <<
"\",\n";
3295 t <<
" 1 => \"" <<
theTranslator->trSearchResults(1) <<
"\",\n";
3298 t <<
" 'search_matches' => \"" <<
theTranslator->trSearchMatches() <<
"\",\n";
3299 t <<
" 'search' => \"" <<
theTranslator->trSearch() <<
"\",\n";
3317 t <<
"<!-- " <<
theTranslator->trGeneratedBy() <<
" Doxygen "
3318 << getDoxygenVersion() <<
" -->\n";
3319 t <<
"<script type=\"text/javascript\">\n";
3320 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3324 if (!disableIndex && !quickLinksAfterSplitbar)
3328 if (generateTreeView)
3330 t <<
"</div><!-- top -->\n";
3333 if (quickLinksAfterSplitbar)
3337 t <<
"<!-- generated -->\n";
3340 t <<
"require_once \"search_functions.php\";\n";
3345 if (generateTreeView)
3347 t <<
"</div><!-- doc-content -->\n";
3348 t <<
"</div><!-- container -->\n";
3355 QCString scriptName = htmlOutput+
"/search/search.js";
3364 err(
"Failed to open file '{}' for writing...\n",scriptName);
3373 bool quickLinksAfterSplitbar = !disableIndex && generateTreeView && fullSidebar;
3382 t <<
"<!-- " <<
theTranslator->trGeneratedBy() <<
" Doxygen "
3383 << getDoxygenVersion() <<
" -->\n";
3384 t <<
"<script type=\"text/javascript\">\n";
3385 t <<
"let searchBox = new SearchBox(\"searchBox\", \""
3389 if (!disableIndex && !quickLinksAfterSplitbar)
3393 if (generateTreeView)
3395 t <<
"</div><!-- top -->\n";
3398 if (quickLinksAfterSplitbar)
3403 t <<
"<div class=\"header\">\n";
3404 t <<
" <div class=\"headertitle\">\n";
3405 t <<
" <div class=\"title\">" <<
theTranslator->trSearchResultsTitle() <<
"</div>\n";
3408 t <<
"<div class=\"contents\">\n";
3410 t <<
"<div id=\"searchresults\"></div>\n";
3413 if (generateTreeView)
3415 t <<
"</div><!-- doc-content -->\n";
3416 t <<
"</div><!-- container -->\n";
3424 QCString scriptName = dname+
"/search/search.js";
3429 t <<
"const searchResultsText=["
3433 t <<
"const serverUrl=\"" <<
Config_getString(SEARCHENGINE_URL) <<
"\";\n";
3434 t <<
"const tagMap = {\n";
3438 for (
const auto &ml : extraSearchMappings)
3441 int eqPos = mapLine.
find(
'=');
3448 if (!first) t <<
",\n";
3449 t <<
" \"" << tagName <<
"\": \"" << destName <<
"\"";
3454 if (!first) t <<
"\n";
3458 t <<
"document.addEventListener('DOMContentLoaded',() => {\n";
3459 t <<
" const query = trim(getURLParameter('query'));\n";
3460 t <<
" if (query) {\n";
3461 t <<
" searchFor(query,0,20);\n";
3463 t <<
" const results = document.getElementById('results');\n";
3464 t <<
" results.innerHtml = '<p>" <<
theTranslator->trSearchResults(0) <<
"</p>';\n";
3470 err(
"Failed to open file '{}' for writing...\n",scriptName);
3476 m_t <<
"<div class=\"typeconstraint\">\n";
3477 m_t <<
"<dl><dt><b>" << header <<
"</b></dt><dd>\n";
3478 m_t <<
"<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n";
3483 m_t <<
"<tr><td valign=\"top\"><em>";
3488 m_t <<
"</em></td>";
3493 m_t <<
"<td> :</td><td valign=\"top\"><em>";
3498 m_t <<
"</em></td>";
3503 m_t <<
"<td> ";
3508 m_t <<
"</td></tr>\n";
3513 m_t <<
"</table>\n";
3523 m_t <<
"<br class=\"" << style <<
"\" />\n";
3533 m_t <<
"<div class=\"header\">\n";
3538 m_t <<
" <div class=\"headertitle\">";
3550 m_t <<
"</div><!--header-->\n";
3557 m_t <<
"<table class=\"memberdecls\">\n";
3560 m_t <<
"<tr><td colspan=\"2\"><h3>";
3565 m_t <<
"</h3></td></tr>\n";
3570 DBG_HTML(
m_t <<
"<!-- startMemberDocSimple -->\n";)
3571 m_t <<
"<table class=\"fieldtable\">\n";
3572 m_t <<
"<tr><th colspan=\"" << (isEnum?
"2":
"3") <<
"\">";
3580 m_t <<
"</table>\n";
3585 DBG_HTML(
m_t <<
"<!-- startInlineMemberType -->\n";)
3586 m_t <<
"<tr><td class=\"fieldtype\">\n";
3591 DBG_HTML(
m_t <<
"<!-- endInlineMemberType -->\n";)
3597 DBG_HTML(
m_t <<
"<!-- startInlineMemberName -->\n";)
3598 m_t <<
"<td class=\"fieldname\">\n";
3603 DBG_HTML(
m_t <<
"<!-- endInlineMemberName -->\n";)
3609 DBG_HTML(
m_t <<
"<!-- startInlineMemberDoc -->\n";)
3610 m_t <<
"<td class=\"fielddoc\">\n";
3616 m_t <<
"</td></tr>\n";
3622 m_t <<
"<div class=\"embeddoc\" style=\"margin-left:" << indent <<
"ch;\">";
3634 m_t <<
"<span class=\"mlabels\">";
3639 DBG_HTML(
m_t <<
"<!-- writeLabel(" << label <<
") -->\n";)
3641 auto convertLabelToClass = [](
const std::string &lab) {
3654 for (
size_t i=0; i<l; i++)
3656 char c = input.
at(i);
3657 if (c<0 || (c>=
'a' && c<=
'z') || c==
'_')
3662 else if (nmstart && (c<0 || (c>=
'a' && c<=
'z') || (c>=
'0' && c<=
'9') || c==
'_'))
3666 else if (nmstart && (c==
' ' || c==
'-'))
3674 m_t <<
"<span class=\"mlabel " << convertLabelToClass(label.
stripWhiteSpace().
str()) <<
"\">" << label <<
"</span>";
3688 DBG_HTML(
m_t <<
"<!-- writeInheritedSectionTitle -->\n";)
3696 classLink +=
" href=\"";
3701 classLink +=
"href=\"";
3706 classLink=classLink+fn+a;
3708 m_t <<
"<tr class=\"inherit_header " <<
id <<
"\">";
3709 if (dynamicSections)
3711 m_t <<
"<td colspan=\"2\" onclick=\"javascript:dynsection.toggleInherit('" <<
id <<
"')\">";
3712 m_t <<
"<span class=\"dynarrow\"><span class=\"arrowhead closed\"></span></span>";
3716 m_t <<
"<td colspan=\"2\">";
3726 m_t <<
" <div class=\"summary\">\n";
3732 m_t <<
"<a href=\"";
3751 m_t <<
"<div id=\"page-nav\" class=\"page-nav-panel\">\n";
3752 m_t <<
"<div id=\"page-nav-resize-handle\"></div>\n";
3753 m_t <<
"<div id=\"page-nav-tree\">\n";
3754 m_t <<
"<div id=\"page-nav-contents\">\n";
3755 m_t <<
"</div><!-- page-nav-contents -->\n";
3756 m_t <<
"</div><!-- page-nav-tree -->\n";
3757 m_t <<
"</div><!-- page-nav -->\n";
3776 m_t <<
"<div class=\"toc\">";
3795 if (
type.isSection())
3798 int nextLevel =
type.level();
3806 char cs[2] = {
static_cast<char>(
'0'+l+1), 0 };
3807 const char *empty = (l!=nextLevel-1) ?
" empty" :
"";
3826 char cs[2] = {
static_cast<char>(
'0'+nextLevel), 0 };
3831 m_t <<
"<a href=\"#"+label+
"\">";
3839 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)