43#if !ENABLE_DOCPARSER_TRACING
47#define AUTO_TRACE(...) (void)0
48#define AUTO_TRACE_ADD(...) (void)0
49#define AUTO_TRACE_EXIT(...) (void)0
52#define INTERNAL_ASSERT(x) do {} while(0)
71 "uml",
"bpm",
"wire",
"dot",
"ditaa",
72 "salt",
"math",
"latex",
"gantt",
"mindmap",
73 "wbs",
"yaml",
"creole",
"json",
"flow",
74 "board",
"git",
"hcl",
"regex",
"ebnf",
75 "files",
"chen",
"chronology"
85 const char *p = s.
data();
91 if (c==
'{') c=
'<';
else if (c==
'}') c=
'>';
120 std::visit([&](
auto &&x)->
decltype(
auto) {
return x.setParent(newParent); }, *n);
164 size_t len=locSymName.
length();
167 if (locSymName.
at(len-1)!=
':') locSymName.
append(
":");
168 if (locSymName.
at(0)!=
':') locSymName.
prepend(
":");
186 Doxygen::searchIndex.addWord(word,false);
203 Doxygen::searchIndex.addWord(word,false);
219 if (
id.left(anchorPrefix.
length()) == anchorPrefix)
309 parser()->tokenizer.getLineNr(),
310 "block marked with {} for \\snippet should appear twice in file {}, found it {:d} times",
324 "No previous '\\include' or '\\dontinclude' command for '\\{}' present",
335 size_t so = o, bo = 0;
336 bool nonEmpty =
FALSE;
349 else if (!isspace(
static_cast<uint8_t
>(c)))
379 else if (!isspace(
static_cast<uint8_t
>(c)))
412 else if (!isspace(
static_cast<uint8_t
>(c)))
443 else if (!isspace(
static_cast<uint8_t
>(c)))
487 if (
parser()->context.memberDef &&
parser()->context.memberDef->name().at(0)==
'@')
546 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
560 if (sec==
nullptr &&
parser()->context.lang==SrcLangExt::Markdown)
622 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
624 if (tok.
is_any_of(TokenRetval::TK_COMMAND_AT, TokenRetval::TK_COMMAND_BS))
631 if (!tok.
is(TokenRetval::TK_WHITESPACE))
637 if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
651 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Illegal command '{:c}{}' as part of a \\secreflist",
656 else if (tok.
is(TokenRetval::TK_WHITESPACE))
662 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected token {} inside section reference list",
694 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
713 AUTO_TRACE(
"target='{}',context='{}'",target,context);
716 auto lang =
parser->context.lang;
718 if (sec==
nullptr && !
parser->context.prefix.isEmpty())
778 m_file = dd->getOutputFileBase();
785 bool isFile = compound ?
789 if (compound && lang==SrcLangExt::Markdown) lang = compound->
getLanguage();
811 int funcPos =
m_text.find(
'(');
830 toFileDef(compound)->generateSourceFile()
844 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"unable to resolve reference to '{}' for \\ref command",
850 for (
auto &&elem : elements)
860 for (
auto &dn : children)
862 DocPara *para = std::get_if<DocPara>(&dn);
874 for (
auto &cn : children)
881 for (
auto &ccn : *opt_children)
893 char cmdCharStr[2] = { cmdChar, 0 };
896 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
902 case TokenRetval::TK_HTMLTAG:
915 if (
parser()->context.insideHtmlLink)
920 "Potential recursion while resolving {:c}{} command!",cmdChar,cmdName);
947 if (numBibFiles>0 && cite && !cite->
text().
isEmpty())
958 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"\\cite command found but no bib files specified via CITE_BIB_FILES!");
960 else if (cite==
nullptr)
962 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"unable to resolve reference to '{}' for \\cite command",
967 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"\\cite command to '{}' does not have an associated number",
979 if (!opt.noPar()) txt +=
"[";
983 if (opt.isNumber()) txt += citeInfo->
text();
984 else if (opt.isShortAuthor()) txt += citeInfo->
shortAuthor();
985 else if (opt.isYear()) txt += citeInfo->
year();
988 if (!opt.noPar()) txt +=
"]";
1003 m_refText = m_refText.right(m_refText.length()-1);
1010 if (compound && compound->isLinkable())
1012 m_file = compound->getOutputFileBase();
1013 m_ref = compound->getReference();
1016 (
toFileDef(compound))->generateSourceFile()
1026 warn_doc_error(parser->context.fileName,parser->tokenizer.getLineNr(),
"unable to resolve link to '{}' for \\link command",
1038 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1042 switch (tok.
value())
1044 case TokenRetval::TK_COMMAND_AT:
1046 case TokenRetval::TK_COMMAND_BS:
1062 case TokenRetval::TK_SYMBOL:
1063 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unsupported symbol '{}' found as part of a \\link",
1064 parser()->context.token->name);
1066 case TokenRetval::TK_HTMLTAG:
1067 if (
parser()->context.token->name!=
"see" || !isXmlLink)
1069 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected xml/html command {} found as part of a \\link",
1070 parser()->context.token->name);
1073 case TokenRetval::TK_LNKWORD:
1074 case TokenRetval::TK_WORD:
1083 else if ((p=w.
find(
'}'))!=-1)
1085 int l =
static_cast<int>(w.
length());
1089 result=w.
right(l-p-1);
1103 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1106 parser()->tokenizer.getLineNr(),
1107 "Unexpected end of comment while inside link command");
1127 p->relPath =
parser->context.relPath;
1137 if (fd==
nullptr && !
p->name.endsWith(
".dot"))
1148 "Possible candidates:\n{}",
p->name,
1156 "in any of the paths specified via DOTFILE_DIRS!",
p->name);
1165 p->relPath =
parser->context.relPath;
1175 if (fd==
nullptr && !
p->name.endsWith(
".msc"))
1186 "Possible candidates:\n{}",
qPrint(
p->name),
1194 "in any of the paths specified via MSCFILE_DIRS!",
p->name);
1205 p->relPath =
parser->context.relPath;
1215 if (fd==
nullptr && !
p->name.endsWith(
".dia"))
1226 "Possible candidates:\n{}",
p->name,
1234 "in any of the paths specified via DIAFILE_DIRS!",
p->name);
1244 p->relPath =
parser->context.relPath;
1254 if (fd==
nullptr && !
p->name.endsWith(
".puml"))
1257 if (fd==
nullptr && !
p->name.endsWith(
".pu"))
1269 "Possible candidates:\n{}",
p->name,
1277 "in any of the paths specified via PLANTUMLFILE_DIRS!",
p->name);
1295 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1322 QCString locName =
p->url.isEmpty() ?
p->name :
p->url;
1323 int len =
static_cast<int>(locName.
length());
1324 int fnd = locName.
find(
'?');
1325 if (fnd==-1) fnd=len;
1326 return fnd>=4 && locName.
mid(fnd-4,4)==
".svg";
1340 Token retval(TokenRetval::RetVal_OK);
1344 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1348 switch (tok.
value())
1350 case TokenRetval::TK_HTMLTAG:
1409 if (!
parser()->context.token->endTag)
1420 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <h{:d}> context",
1433 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1450 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1453 if (tok.
value()==TokenRetval::TK_HTMLTAG &&
1455 parser()->context.token->endTag
1460 else if (tok.
is_any_of(TokenRetval::TK_COMMAND_AT, TokenRetval::TK_COMMAND_BS) &&
1473 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1485 Token retval(TokenRetval::TK_NONE);
1496 retval=par->
parse();
1498 while (retval.
is(TokenRetval::TK_NEWPARA));
1501 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1503 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <details> block");
1514 return retval.
is(TokenRetval::RetVal_EndHtmlDetails) ? Token::make_RetVal_OK() : retval;
1530 Token retval(TokenRetval::RetVal_OK);
1534 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1538 switch (tok.
value())
1540 case TokenRetval::TK_HTMLTAG:
1553 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <a href=...> context",
1554 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
1565 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1568 " <a href=...> tag");
1580 Token retval(TokenRetval::RetVal_OK);
1590 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
1591 retval=par->parse();
1592 if (!par->isEmpty())
1601 if (retval.
is(TokenRetval::TK_LISTITEM))
1605 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
1606 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
1607 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
1608 TokenRetval::RetVal_EndInternal));
1612 while ((level==1 && retval.
is(TokenRetval::RetVal_Section)) ||
1613 (level==2 && retval.
is(TokenRetval::RetVal_Subsection)) ||
1614 (level==3 && retval.
is(TokenRetval::RetVal_Subsubsection)) ||
1615 (level==4 && retval.
is(TokenRetval::RetVal_Paragraph)) ||
1616 (level==5 && retval.
is(TokenRetval::RetVal_SubParagraph)) ||
1617 (level==6 && retval.
is(TokenRetval::RetVal_SubSubParagraph))
1626 if (retval.
is(TokenRetval::RetVal_Internal))
1628 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"\\internal command found inside internal section");
1640 Token retval(TokenRetval::RetVal_OK);
1643 if (!tok.
is(TokenRetval::TK_WHITESPACE))
1651 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1653 switch (tok.
value())
1655 case TokenRetval::TK_WHITESPACE:
1658 case TokenRetval::TK_WORD:
1659 case TokenRetval::TK_LNKWORD:
1662 case TokenRetval::TK_SYMBOL:
1684 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected symbol '{}' found as argument of \\addindex",
parser()->context.token->name);
1689 case TokenRetval::TK_COMMAND_AT:
1691 case TokenRetval::TK_COMMAND_BS:
1713 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command {} found as argument of \\addindex",
1714 parser()->context.token->name);
1738 for (
const auto &opt :
attribs)
1740 if (opt.name==
"id" && !opt.value.isEmpty())
1765 Token retval = Token::make_TK_NONE();
1768 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1772 switch (tok.
value())
1774 case TokenRetval::TK_HTMLTAG:
1779 retval = Token::make_RetVal_OK();
1784 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <caption> context",
1785 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
1796 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1811 Token retval = Token::make_RetVal_OK();
1822 retval=par->
parse();
1823 if (retval.
is(TokenRetval::TK_HTMLTAG))
1828 retval = Token::make_TK_NEWPARA();
1832 retval = Token::make_TK_NEWPARA();
1836 while (retval.
is_any_of(TokenRetval::TK_NEWPARA,TokenRetval::RetVal_EndParBlock));
1845 Token retval = Token::make_RetVal_OK();
1856 retval=par->
parse();
1857 if (retval.
is(TokenRetval::TK_HTMLTAG))
1862 retval = Token::make_TK_NEWPARA();
1866 retval = Token::make_TK_NEWPARA();
1870 while (retval.
is(TokenRetval::TK_NEWPARA));
1878 for (
const auto &attr :
attribs())
1880 if (attr.name.lower()==
"rowspan")
1882 return attr.value.toUInt();
1890 for (
const auto &attr :
attribs())
1892 if (attr.name.lower()==
"colspan")
1894 return std::max(1u,attr.value.toUInt());
1902 for (
const auto &attr :
attribs())
1906 if (attrName==
"align")
1908 if (attrValue==
"center")
1910 else if (attrValue==
"right")
1914 else if (attrName==
"class" && attrValue.
startsWith(
"markdowntable"))
1916 if (attrValue==
"markdowntableheadcenter")
1918 else if (attrValue==
"markdowntableheadright")
1920 else if (attrValue==
"markdowntableheadleft")
1922 else if (attrValue==
"markdowntableheadnone")
1924 else if (attrValue==
"markdowntablebodycenter")
1926 else if (attrValue==
"markdowntablebodyright")
1928 else if (attrValue==
"markdowntablebodyleft")
1930 else if (attrValue==
"markdowntablebodynone")
1940 for (
const auto &attr :
attribs())
1944 if (attrName==
"valign")
1946 if (attrValue==
"top")
1948 else if (attrValue==
"bottom")
1950 else if (attrValue==
"middle")
1965 const DocHtmlCell *cell = std::get_if<DocHtmlCell>(&n);
1981 while (tok.
is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA,TokenRetval::TK_HTMLTAG,
1982 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS))
1984 if (tok.
is(TokenRetval::TK_HTMLTAG))
2000 else if (tok.
is_any_of(TokenRetval::TK_COMMAND_AT, TokenRetval::TK_COMMAND_BS))
2010 if (!tok.
is(TokenRetval::TK_WORD))
2038 Token retval = Token::make_RetVal_OK();
2047 if (tok.
is(TokenRetval::TK_HTMLTAG))
2060 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2065 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2068 " for a html description title");
2073 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td> or <th> tag but found {} token instead!",
2087 retval=cell->
parse();
2088 isHeading = retval.
is(TokenRetval::RetVal_TableHCell);
2090 if (retval.
is(TokenRetval::RetVal_EndTableCell))
2096 if (tok.
is(TokenRetval::TK_HTMLTAG))
2099 !
parser()->context.token->endTag)
2101 retval = Token::make_RetVal_TableCell();
2106 if (
parser()->context.token->endTag)
2108 retval = Token::make_RetVal_EndTableRow();
2112 retval = Token::make_RetVal_TableRow();
2117 retval = Token::make_RetVal_EndTable();
2122 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2129 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td>, <th> or <tr> tag but found {} token instead!",
2135 while (retval.
is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2145 Token retval = Token::make_RetVal_OK();
2156 if (tok.
is(TokenRetval::TK_HTMLTAG))
2168 "found <{}> instead!",
parser()->context.token->name);
2173 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2176 " for a html description title");
2181 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td> or <th> tag but found {} token instead!",
2194 while (retval.
is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2218 const DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2231 Token retval = Token::make_RetVal_OK();
2238 if (tok.
is(TokenRetval::TK_HTMLTAG))
2244 retval = Token::make_RetVal_TableRow();
2255 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2257 if (retval.
is(TokenRetval::RetVal_OK))
2266 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2269 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2272 " for a <tr> or <caption> tag");
2281 while (retval.
is(TokenRetval::RetVal_TableRow))
2286 if (retval.is(TokenRetval::RetVal_EndTableRow))
2294 retval = Token::make_RetVal_TableRow();
2298 retval = Token::make_RetVal_EndTable();
2300 else if (retval.is(TokenRetval::TK_HTMLTAG))
2303 "found <{}> instead!",
parser()->context.token->name);
2309 "found token {} instead!",retval.to_string());
2310 retval=Token::make_RetVal_OK();
2318 return retval.
is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2324 Token retval = Token::make_RetVal_OK();
2333 bool isHeader=
FALSE;
2334 if (tok.
is(TokenRetval::TK_HTMLTAG))
2339 retval = Token::make_RetVal_TableRow();
2343 retval = Token::make_RetVal_TableRow();
2349 while (retval.
is(TokenRetval::RetVal_TableRow))
2353 retval=tr->parseXml(isHeader);
2388 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2391 for (
auto &cellNode : row->
children())
2393 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2396 uint32_t rs = cell->
rowSpan();
2397 uint32_t cs = cell->
colSpan();
2399 for (
size_t i=0;i<rowSpans.size();i++)
2401 if (rowSpans[i].rowsLeft>0 &&
2402 rowSpans[i].column==colIdx)
2404 colIdx=rowSpans[i].column+1;
2408 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2416 for (
size_t i=0;i<rowSpans.size();i++)
2418 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2424 if (colIdx-1>maxCols) maxCols=colIdx-1;
2434 Token retval = Token::make_TK_NONE();
2438 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
2442 switch (tok.
value())
2444 case TokenRetval::TK_COMMAND_AT:
2446 case TokenRetval::TK_COMMAND_BS:
2449 bool isJavaLink=
FALSE;
2455 if (!tok.
is(TokenRetval::TK_WHITESPACE))
2464 if (!tok.
is(TokenRetval::TK_WORD))
2466 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} as the argument of '{:c}{}' command",
2484 if (!tok.
is(TokenRetval::TK_WHITESPACE))
2493 if (!tok.
is(TokenRetval::TK_WORD))
2495 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} as the argument of \\{} command",
2503 QCString leftOver = lnk->parse(isJavaLink);
2504 if (!leftOver.isEmpty())
2518 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Illegal command '{:c}{}' found as part of a <dt> tag",
2523 case TokenRetval::TK_SYMBOL:
2524 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unsupported symbol '{}' found as part of a <dt> tag",
2525 parser()->context.token->name);
2527 case TokenRetval::TK_HTMLTAG:
2532 retval = Token::make_RetVal_DescData();
2542 retval = Token::make_RetVal_DescTitle();
2547 retval = Token::make_RetVal_EndDesc();
2552 if (!
parser()->context.token->endTag)
2563 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <dt> context",
2564 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
2576 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2593 Token retval = Token::make_TK_NONE();
2603 retval=par->
parse();
2605 while (retval.
is(TokenRetval::TK_NEWPARA));
2616 Token retval = Token::make_RetVal_OK();
2624 if (tok.
is(TokenRetval::TK_HTMLTAG))
2634 "found <{}> instead!",
parser()->context.token->name);
2639 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2642 " for a html description title");
2659 if (retval.is(TokenRetval::RetVal_DescData))
2662 while (retval.is(TokenRetval::RetVal_DescData))
2669 else if (!retval.is(TokenRetval::RetVal_DescTitle))
2674 }
while (retval.
is(TokenRetval::RetVal_DescTitle));
2676 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2678 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <dl> block");
2683 return retval.
is(TokenRetval::RetVal_EndDesc) ? Token::make_RetVal_OK() : retval;
2691 Token retval = Token::make_TK_NONE();
2702 retval=par->
parse();
2704 while (retval.
is(TokenRetval::TK_NEWPARA));
2714 Token retval = Token::make_TK_NONE();
2725 retval=par->
parse();
2726 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
2730 if (retval.
is(TokenRetval::RetVal_ListItem))
2735 while (!retval.
is(TokenRetval::RetVal_CloseXml));
2748 Token retval = Token::make_RetVal_OK();
2757 if (tok.
is(TokenRetval::TK_HTMLTAG))
2766 ) &&
parser()->context.token->endTag
2772 retval = Token::make_RetVal_EndList();
2780 "found <{}{}> instead!",
parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
2785 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2790 " for a html list item");
2807 }
while (retval.
is(TokenRetval::RetVal_ListItem));
2809 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2811 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <{:c}l> block",
2817 return retval.
is(TokenRetval::RetVal_EndList) ? Token::make_RetVal_OK() : retval;
2823 Token retval = Token::make_RetVal_OK();
2832 if (tok.
is(TokenRetval::TK_HTMLTAG))
2843 "found <{}> instead!",
parser()->context.token->name);
2848 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2851 " for a html list item");
2865 retval=li->parseXml();
2866 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
2868 }
while (retval.
is(TokenRetval::RetVal_ListItem));
2870 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2872 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <list type=\"{}\"> block",
2878 return (retval.
is_any_of(TokenRetval::RetVal_EndList,TokenRetval::RetVal_CloseXml) ||
parser()->context.token->name==
"list") ?
2879 Token::make_RetVal_OK() : retval;
2887 Token retval = Token::make_TK_NONE();
2898 retval=par->
parse();
2900 while (retval.
is(TokenRetval::TK_NEWPARA));
2903 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2905 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <blockquote> block");
2909 return retval.
is(TokenRetval::RetVal_EndBlockQuote) ? Token::make_RetVal_OK() : retval;
2917 Token retval = Token::make_TK_NONE();
2928 retval=par->
parse();
2930 while (retval.
is(TokenRetval::TK_NEWPARA));
2934 return retval.
is(TokenRetval::RetVal_EndBlockQuote) ? Token::make_RetVal_OK() : retval;
2961 Token rv = Token::make_TK_NONE();
2967 }
while (rv.
is(TokenRetval::RetVal_ListItem));
2968 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
2981 Token retval = Token::make_RetVal_OK();
2991 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
2992 retval=par->parse();
2993 if (!par->isEmpty())
3004 }
while (retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->indent>
m_indent);
3023 Token retval = Token::make_RetVal_OK();
3030 switch (
parser()->context.token->id)
3052 while (retval.
is(TokenRetval::TK_LISTITEM) &&
3056 (
parser()->context.token->id==-1 ||
parser()->context.token->id>=num)
3073 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
3105 return m_title && std::get<DocTitle>(*m_title).hasTitle();
3117 std::get_if<DocTitle>(
m_title.get())->parse();
3121 if (!
children().empty() && std::holds_alternative<DocPara>(
children().back()))
3139 Token retval = par->parse();
3159 return Token::make_RetVal_OK();
3167 Token retval = Token::make_RetVal_OK();
3171 if (!
children().empty() && std::holds_alternative<DocPara>(
children().back()))
3173 std::get<DocPara>(
children().back()).markLast(
false);
3185 retval = par->parse();
3186 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3187 if (retval.
is(TokenRetval::RetVal_CloseXml))
3189 retval = Token::make_RetVal_OK();
3201 if (
children().empty() || (p=std::get_if<DocPara>(&
children().back()))==
nullptr)
3223 case See:
return "see";
3224 case Return:
return "return";
3226 case Authors:
return "author";
3227 case Version:
return "version";
3228 case Since:
return "since";
3229 case Date:
return "date";
3230 case Note:
return "note";
3231 case Warning:
return "warning";
3232 case Pre:
return "pre";
3233 case Post:
return "post";
3235 case Invar:
return "invariant";
3236 case Remark:
return "remark";
3239 case User:
return "user";
3240 case Rcs:
return "rcs";
3250 Token retval = Token::make_RetVal_OK();
3256 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3260 retval = Token::make_RetVal_EndParBlock();
3265 while (tok.
is(TokenRetval::TK_WORD))
3270 if (typeSeparator!=-1)
3276 if (
parent() && std::holds_alternative<DocParamSect>(*
parent()))
3278 std::get<DocParamSect>(*
parent()).m_hasTypeSpecifier=
true;
3298 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3300 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3301 "argument of command {}",saveCmdName);
3302 retval = Token::make_RetVal_EndParBlock();
3305 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3307 if (!tok.
is(TokenRetval::TK_NEWPARA))
3309 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} in comment block while parsing the "
3310 "argument of command {}",tok.
to_string(),saveCmdName);
3312 retval = Token::make_RetVal_EndParBlock();
3318 retval = par->
parse();
3330 Token retval = Token::make_RetVal_OK();
3351 retval = par->parse();
3373 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3375 }
while (retval.
is(TokenRetval::RetVal_CloseXml) &&
3380 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3386 retval = Token::make_RetVal_OK();
3398 Token retval = Token::make_RetVal_OK();
3406 if (!
children().empty() && std::holds_alternative<DocParamList>(
children().back()))
3421 retval = pl->parseXml(cmdName);
3425 retval = pl->parse(cmdName);
3427 if (retval.
is(TokenRetval::RetVal_EndParBlock))
3429 retval = Token::make_RetVal_OK();
3448 bool needsSeparator =
FALSE;
3450 (ss=
children().get_last<DocSimpleSect>()) &&
3455 needsSeparator =
TRUE;
3462 Token rv = Token::make_RetVal_OK();
3471 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3476 bool xmlContext=
FALSE,
3482 (ps=
children().get_last<DocParamSect>()) &&
3494 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3505 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
3510 for (
auto const &opt : optList)
3512 if (opt ==
"number")
3516 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3523 else if (opt ==
"year")
3527 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3534 else if (opt ==
"shortauthor")
3538 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3545 else if (opt ==
"nopar")
3549 else if (opt ==
"nocite")
3555 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3563 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3570 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
3573 cmdChar,saveCmdName);
3583 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3585 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"THE ONE unexpected end of comment block while parsing the "
3586 "argument of command '{:c}{}'",cmdChar,saveCmdName);
3589 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3607 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3615 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3617 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"no emoji name given or unexpected end of comment block while parsing the "
3618 "argument of command '{:c}{}'",cmdChar,cmdName);
3622 else if (!tok.
is(TokenRetval::TK_WORD))
3637 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3645 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3647 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3648 "argument of command '{:c}{}'",cmdChar,cmdName);
3651 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3661 switch (opt->
kind())
3681 std::string lstFormat =
theTranslator->trWriteList(
static_cast<int>(lst->size())).str();
3682 static const reg::Ex marker(R
"(@(\d+))");
3687 for ( ; it!=
end ; ++it)
3689 const auto &match = *it;
3690 size_t newIndex = match.position();
3691 size_t matchLen = match.length();
3692 optionValue += lstFormat.substr(index,newIndex-index);
3693 unsigned long entryIndex = std::stoul(match[1].str());
3694 if (entryIndex<(
unsigned long)lst->size())
3696 optionValue += lst->at(entryIndex);
3698 index=newIndex+matchLen;
3700 optionValue+=lstFormat.substr(index);
3705 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Obsolete setting for '{:c}{}': '{}'",
3706 cmdChar,cmdName,
parser()->context.token->name);
3710 "Disabled setting (i.e. not supported in this doxygen executable) for '{:c}{}': '{}'",
3711 cmdChar,cmdName,
parser()->context.token->name);
3724 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option for '{:c}{}': '{}'",
3725 cmdChar,cmdName,
parser()->context.token->name);
3735 ASSERT(retval.
is(TokenRetval::TK_WHITESPACE));
3738 if (retval.
is(TokenRetval::RetVal_OK))
3759 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3767 if (!tok.
is(TokenRetval::TK_WORD))
3781 bool specDateOnlyWS = !specDateRaw.
isEmpty() && specDate.
isEmpty();
3782 if (!specDate.
isEmpty() && !tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3784 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}'",
3795 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}': {}",
3796 cmdChar,cmdName,
err);
3808 if ((usedFormat&bitMask) && !(specFormat&bitMask))
3810 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"'{:c}{}' <format> parameter '{}' has {} related markers which are not specified in the <date_time> parameter '{}'. Filling in the current value for {} instead.",
3828 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3837 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3839 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3840 "argument of command {}", saveCmdName);
3843 else if (!tok.
is(TokenRetval::TK_WORD))
3867 (!n1_docIncOp && !n1_docWs) ||
3868 (n1_docWs && n2 && !n2_docIncOp);
3873 n1_docIncOp->markLast(
false);
3875 else if (n1_docWs && n2_docIncOp)
3888 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3897 if (!tok.
is(TokenRetval::TK_WORD))
3924 AUTO_TRACE(
"cmdName={} isJavaLink={}",cmdName,isJavaLink);
3927 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3935 if (!tok.
is(TokenRetval::TK_WORD))
3941 if (saveCmdName ==
"javalink")
3950 if (saveCmdName ==
"javalink")
3956 QCString leftOver = lnk->parse(isJavaLink);
3968 bool isBlock =
false;
3969 bool trimLeft =
false;
3970 bool localScope =
false;
3972 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
3978 auto contains = [&optList](
const char *kw)
3980 return std::find(optList.begin(),optList.end(),kw)!=optList.end();
3982 localScope = contains(
"local");
3983 if (contains(
"nostrip"))
3985 stripCodeComments =
false;
3987 else if (contains(
"strip"))
3989 stripCodeComments =
true;
3996 if (contains(
"lineno"))
4003 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4010 else if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"[")
4018 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
4027 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4029 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4030 "argument of command {}",saveCmdName);
4033 else if (!tok.
is(TokenRetval::TK_WORD))
4047 if (!tok.
is(TokenRetval::TK_WORD))
4049 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected block identifier, but found token {} instead while parsing the {} command",
4064 blockId,isBlock,trimLeft);
4074 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4077 cmdChar,saveCmdName);
4081 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4083 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4084 "argument of command '{:c}{}'", cmdChar,saveCmdName);
4087 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
4104 return retval.is(TokenRetval::RetVal_OK) ? Token::make_TK_NEWPARA() : retval;
4126 if (
parser()->context.xmlComment)
4132 while (i<l && (
parser()->context.token->verb.at(i)==
' ' ||
parser()->context.token->verb.at(i)==
'\n'))
4134 if (
parser()->context.token->verb.at(i)==
'\n') li=i+1;
4144 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4155 if (
parser()->context.memberDef)
4193 Token retval = Token::make_RetVal_OK();
4199 std::string str{cmdChar};
4203 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Found unexpanded alias '{:c}{}'. Check if number of arguments passed is correct.",cmdChar,cmdName);
4352 retval = Token::make_RetVal_Section();
4358 retval = Token::make_RetVal_Subsection();
4364 retval = Token::make_RetVal_Subsubsection();
4370 retval = Token::make_RetVal_Paragraph();
4376 retval = Token::make_RetVal_SubParagraph();
4382 retval = Token::make_RetVal_SubSubParagraph();
4402 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4414 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4426 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4438 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4450 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4462 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4476 int idx = fullMatch.
find(
'{');
4477 int idxEnd = fullMatch.
find(
"}",idx+1);
4483 for (
const auto &opt : optList)
4485 if (opt.empty())
continue;
4488 if (locOpt ==
"code")
4494 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option '{}' for '\\iliteral'",opt);
4502 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4510 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"javadoc literal section ended without end marker");
4529 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4550 dv->setText(
parser()->context.token->verb);
4551 dv->setWidth(width);
4552 dv->setHeight(height);
4553 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4556 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\dot command because HAVE_DOT is not set");
4559 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4580 dv->setText(
parser()->context.token->verb);
4581 dv->setWidth(width);
4582 dv->setHeight(height);
4583 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4584 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4598 int idx = fullMatch.
find(
'{');
4599 int idxEnd = fullMatch.
find(
"}",idx+1);
4606 for (
const auto &opt : optList)
4608 if (opt.empty())
continue;
4616 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple definition of engine for '\\startuml'");
4629 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple use of filename for '\\startuml'");
4638 if (engine.
isEmpty()) engine =
"uml";
4644 assert(retval.is(TokenRetval::RetVal_OK));
4665 if (engine ==
"ditaa")
4667 dv->setUseBitmap(
true);
4669 else if (engine ==
"uml")
4671 int i = trimmedVerb.
find(
'\n');
4672 QCString firstLine = i==-1 ? trimmedVerb : trimmedVerb.
left(i);
4675 dv->setText(trimmedVerb);
4676 dv->setWidth(width);
4677 dv->setHeight(height);
4678 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4681 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
4684 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4692 retval = Token::make_RetVal_EndParBlock();
4751 retval = Token::make_RetVal_Internal();
4754 retval = Token::make_RetVal_EndInternal();
4823 "ignoring \\dotfile command because HAVE_DOT is not set");
4912 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command '{}' in paragraph context",cmdName);
4915 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_OK,TokenRetval::RetVal_SimpleSec
4916 TokenRetval::TK_LISTITEM,TokenRetval::TK_ENDLIST,TokenRetval::TK_NEWPARA
4917 TokenRetval::RetVal_Section,TokenRetval::RetVal_EndList
4918 TokenRetval::RetVal_Internal,TokenRetval::RetVal_SwitchLang
4919 TokenRetval::RetVal_EndInternal)
4926 const char *attrName,
4930 for (
const auto &opt : tagHtmlAttribs)
4932 if (opt.name==attrName)
4934 *result = opt.value;
4943 AUTO_TRACE(
"tagName={} #tagHtmlAttrs={}",tagName,tagHtmlAttribs.size());
4944 Token retval = Token::make_RetVal_OK();
4950 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"HTML tag ('<{}/>') may not use the 'empty tag' XHTML syntax.",
4956 if (!
parser()->context.token->emptyTag)
4964 if (!
parser()->context.token->emptyTag)
4972 if (
parser()->context.token->emptyTag)
break;
4979 retval = Token::make_RetVal_ListItem();
5001 if (
parser()->context.token->emptyTag)
break;
5002 if (
parser()->context.xmlComment)
5047 if (
parser()->context.token->emptyTag)
break;
5053 retval = Token::make_TK_NEWPARA();
5056 if (!
parser()->context.token->emptyTag)
5065 retval = Token::make_RetVal_DescTitle();
5075 retval = Token::make_RetVal_DescData();
5083 if (!
parser()->context.token->emptyTag)
5091 retval = Token::make_RetVal_TableRow();
5094 retval = Token::make_RetVal_TableCell();
5097 retval = Token::make_RetVal_TableHCell();
5144 if (!
parser()->context.token->emptyTag)
5151 if (!
parser()->context.token->emptyTag)
5161 if (!
parser()->context.token->emptyTag)
5164 while (n && !std::holds_alternative<DocHtmlDetails>(*n)) n=
::parent(n);
5174 retval = Token::make_TK_NEWPARA();
5188 retval = Token::make_TK_NEWPARA();
5194 retval = Token::make_RetVal_TableCell();
5264 retval = Token::make_RetVal_TableRow();
5268 retval = Token::make_RetVal_ListItem();
5283 retval = Token::make_RetVal_TableCell();
5297 if (
parser()->context.token->emptyTag)
5311 if (!leftOver.isEmpty())
5329 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing 'cref' or 'langword' attribute from <see> tag.");
5357 std::get<DocSimpleSect>(*vss).appendLinkWord(cref);
5358 retval = Token::make_RetVal_OK();
5415 Token retval = Token::make_RetVal_OK();
5425 retval = Token::make_RetVal_EndList();
5435 retval = Token::make_RetVal_EndList();
5451 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </details> tag without matching <details>");
5455 retval = Token::make_RetVal_EndHtmlDetails();
5461 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </blockquote> tag without matching <blockquote>");
5465 retval = Token::make_RetVal_EndBlockQuote();
5525 retval = Token::make_TK_NEWPARA();
5528 retval = Token::make_RetVal_EndDesc();
5537 retval = Token::make_RetVal_EndTable();
5540 retval = Token::make_RetVal_EndTableRow();
5543 retval = Token::make_RetVal_EndTableCell();
5546 retval = Token::make_RetVal_EndTableCell();
5590 retval = Token::make_TK_NEWPARA();
5604 retval = Token::make_RetVal_CloseXml();
5640 if (!std::get_if<DocAutoListItem>(n))
5648 const auto docAutoList = std::get_if<DocAutoList>(n);
5651 indent = docAutoList->indent();
5660 const auto docPara = std::get_if<DocPara>(n);
5666 return std::get<DocStyleChange>(*stack.top());
5676 indentStr.
fill(
' ',indent);
5691 Token retval = Token::make_TK_NONE();
5692 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
5696 if (tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD,TokenRetval::TK_SYMBOL,TokenRetval::TK_URL,
5697 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS,TokenRetval::TK_HTMLTAG)
5704 case TokenRetval::TK_WORD:
5707 case TokenRetval::TK_LNKWORD:
5710 case TokenRetval::TK_URL:
5713 case TokenRetval::TK_WHITESPACE:
5731 case TokenRetval::TK_LISTITEM:
5735 while (n && !std::holds_alternative<DocAutoList>(*n)) n=
::parent(n);
5736 const DocAutoList *al = std::get_if<DocAutoList>(n);
5743 retval = Token::make_TK_LISTITEM();
5753 al = std::get_if<DocAutoList>(n);
5767 }
while (retval.
is(TokenRetval::TK_LISTITEM) &&
5772 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5778 if (
parser()->context.token->name.startsWith(
"rcs:"))
5782 tok = Token::make_TK_RCSTAG();
5786 tok = Token::make_TK_COMMAND_BS();
5791 else if (retval.
is(TokenRetval::TK_ENDLIST))
5807 case TokenRetval::TK_ENDLIST:
5808 AUTO_TRACE_ADD(
"Found end of list inside of paragraph at line {}",
parser()->tokenizer.getLineNr());
5809 if (std::get_if<DocAutoListItem>(
parent()))
5812 if (al && al->
indent()>=
parser()->context.token->indent)
5815 retval = Token::make_TK_ENDLIST();
5821 "has invalid indent level");
5830 case TokenRetval::TK_COMMAND_AT:
5832 case TokenRetval::TK_COMMAND_BS:
5837 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5838 !std::holds_alternative<DocParamSect>(*n))
5849 retval = Token::make_RetVal_SimpleSec();
5855 while (n && !std::holds_alternative<DocSimpleListItem>(*n)) n=
::parent(n);
5860 retval = Token::make_RetVal_ListItem();
5870 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5876 if (
parser()->context.token->name.startsWith(
"rcs:"))
5880 tok = Token::make_TK_RCSTAG();
5884 tok = Token::make_TK_COMMAND_BS();
5889 else if (retval.
value()>TokenRetval::TK_NONE && retval.
value()<TokenRetval::RetVal_OK)
5895 else if (retval.
value()!=TokenRetval::RetVal_OK)
5902 case TokenRetval::TK_HTMLTAG:
5904 if (!
parser()->context.token->endTag)
5916 if (!retval.
is(TokenRetval::RetVal_OK))
5922 case TokenRetval::TK_SYMBOL:
5933 parser()->context.token->name);
5937 case TokenRetval::TK_NEWPARA:
5938 retval = Token::make_TK_NEWPARA();
5940 case TokenRetval::TK_RCSTAG:
5943 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5944 !std::holds_alternative<DocParamSect>(*n))
5954 retval = Token::make_RetVal_SimpleSec();
5965 "Found unexpected token (id={})",tok.
to_string());
5970 retval=Token::make_TK_NONE();
5973 DocPara *par = std::get_if<DocPara>(
parser()->context.nodeStack.top());
5974 if (!
parser()->context.token->endTag && par &&
5975 retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->name.lower() ==
"p")
5979 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::TK_NEWPARA,TokenRetval::TK_LISTITEM,
5980 TokenRetval::TK_ENDLIST,TokenRetval::RetVal_OK)
5992 Token retval = Token::make_RetVal_OK();
5995 if (!
m_id.isEmpty())
6017 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6018 retval=par->parse();
6019 if (!par->isEmpty())
6028 if (retval.
is(TokenRetval::TK_LISTITEM))
6032 if (retval.
is(TokenRetval::RetVal_Internal))
6036 if (retval.is(TokenRetval::RetVal_EndInternal))
6038 retval = Token::make_RetVal_OK();
6041 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6042 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6043 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6050 if (retval.
is(TokenRetval::RetVal_Subsection) &&
m_level<=1)
6053 while (retval.
is(TokenRetval::RetVal_Subsection))
6062 else if (retval.
is(TokenRetval::RetVal_Subsubsection) &&
m_level<=2)
6068 parser()->tokenizer.getLineNr(),
6069 "Unexpected subsubsection command found inside {}!",
6073 while (retval.
is(TokenRetval::RetVal_Subsubsection))
6080 if (!(
m_level < 2 && retval.
is(TokenRetval::RetVal_Subsection)))
break;
6082 else if (retval.
is(TokenRetval::RetVal_Paragraph) &&
m_level<=3)
6088 "Unexpected paragraph command found inside {}!",
6092 while (retval.
is(TokenRetval::RetVal_Paragraph))
6099 if (!(
m_level<3 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection))))
break;
6101 else if (retval.
is(TokenRetval::RetVal_SubParagraph) &&
m_level<=4)
6107 "Unexpected subparagraph command found inside {}!",
6111 while (retval.
is(TokenRetval::RetVal_SubParagraph))
6118 if (!(
m_level<4 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph))))
break;
6120 else if (retval.
is(TokenRetval::RetVal_SubSubParagraph) &&
m_level<=5)
6126 "Unexpected subsubparagraph command found inside {}!",
6130 while (retval.
is(TokenRetval::RetVal_SubSubParagraph))
6137 if (!(
m_level<5 && (retval.
is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6138 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph))))
break;
6147 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6148 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6149 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6150 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6166 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
6170 case TokenRetval::TK_WORD:
6173 case TokenRetval::TK_WHITESPACE:
6176 case TokenRetval::TK_SYMBOL:
6186 parser()->context.token->name);
6190 case TokenRetval::TK_COMMAND_AT:
6192 case TokenRetval::TK_COMMAND_BS:
6254 parser()->context.token->name);
6278 Token retval = Token::make_TK_NONE();
6288 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6289 retval=par->parse();
6290 if (par->isEmpty() && par->attribs().empty())
6299 auto checkParagraph = [
this,&retval](
Token t,
int level,
const char *sectionType,
const char *parentSectionType) {
6305 parser()->tokenizer.getLineNr(),
6306 "found {} command (id: '{}') outside of {} context!",
6307 sectionType,
parser()->context.token->sectionId,parentSectionType);
6311 if (!
parser()->context.token->sectionId.isEmpty())
6324 sectionType,
parser()->context.token->sectionId,sectionType);
6325 retval = Token::make_TK_NONE();
6330 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing id for {}; ignoring {}",sectionType,sectionType);
6331 retval = Token::make_TK_NONE();
6336 checkParagraph(Token::make_RetVal_SubSubParagraph(), 6,
"subsubparagraph",
"subparagraph" );
6337 checkParagraph(Token::make_RetVal_SubParagraph(), 5,
"subparagraph",
"paragraph" );
6338 checkParagraph(Token::make_RetVal_Paragraph(), 4,
"paragraph",
"subsubsection" );
6339 checkParagraph(Token::make_RetVal_Subsubsection(), 3,
"subsubsection",
"subsection" );
6340 checkParagraph(Token::make_RetVal_Subsection(), 2,
"subsection",
"section" );
6342 if (retval.
is(TokenRetval::TK_LISTITEM))
6346 if (retval.
is(TokenRetval::RetVal_Internal))
6351 }
while (!retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_Section));
6356 while (retval.
is(TokenRetval::RetVal_Section))
6358 if (!
parser()->context.token->sectionId.isEmpty())
6371 retval = Token::make_TK_NONE();
6377 retval = Token::make_TK_NONE();
bool isAliasCmd(std::string_view aliasCmd)
static AnchorGenerator & instance()
Returns the singleton instance.
QCString anchorPrefix() const
const CiteInfo * find(const QCString &label) const
Return the citation info for a given label.
static CitationManager & instance()
QCString fileName() const
constexpr void setNoCite() noexcept
static constexpr CiteInfoOption makeNumber()
constexpr void changeToNumber() noexcept
constexpr void setNoPar() noexcept
constexpr bool isUnknown() const noexcept
static constexpr CiteInfoOption makeYear()
static constexpr CiteInfoOption makeShortAuthor()
Class representing a Boolean type option.
QCString * valueStringRef()
Class representing an enum type option.
static ConfigImpl * instance()
ConfigOption * get(const QCString &name) const
Class representing an integer type option.
QCString * valueStringRef()
Class representing a list type option.
Abstract base class for any configuration option.
@ O_Disabled
Disabled compile time option.
@ O_Enum
A fixed set of items.
@ O_Obsolete
An obsolete option.
@ O_Info
A section header.
Class representing a string type option.
The common base class of all entity definitions found in the sources.
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual bool isLinkable() const =0
virtual DefType definitionType() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual QCString getReference() const =0
virtual QCString getSourceFileBase() const =0
virtual QCString documentation() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual const QCString & name() const =0
DocAnchor(DocParser *parser, DocNodeVariant *parent, const QCString &id, bool newAnchor)
Node representing an auto List.
bool isCheckedList() const
DocAutoList(DocParser *parser, DocNodeVariant *parent, int indent, bool isEnumList, int depth, bool isCheckedList)
Node representing an item of a auto list.
DocAutoListItem(DocParser *parser, DocNodeVariant *parent, int indent, int num)
Node representing a citation of some bibliographic reference.
DocCite(DocParser *parser, DocNodeVariant *parent, const QCString &target, const QCString &context, CiteInfoOption opt)
DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
DocDiaFile(DocParser *parser, DocNodeVariant *parent, const QCString &name, const QCString &context, const QCString &srcFile, int srcLine)
std::unique_ptr< Private > p
DocDiagramFileBase(DocParser *parser, DocNodeVariant *parent, const QCString &name, const QCString &context, const QCString &srcFile, int srcLine)
DocDotFile(DocParser *parser, DocNodeVariant *parent, const QCString &name, const QCString &context, const QCString &srcFile, int srcLine)
Node representing an emoji.
DocEmoji(DocParser *parser, DocNodeVariant *parent, const QCString &symName)
Node representing a horizontal ruler.
Node representing an HTML blockquote.
DocHtmlCaption(DocParser *parser, DocNodeVariant *parent, const HtmlAttribList &attribs)
const HtmlAttribList & attribs() const
Node representing a HTML table cell.
Valignment valignment() const
void setColumnIndex(uint32_t idx)
void setRowIndex(uint32_t idx)
void markLast(bool v=TRUE)
void markFirst(bool v=TRUE)
Alignment alignment() const
const HtmlAttribList & attribs() const
Node representing a HTML description data.
Node representing a Html description list.
Node representing a Html description item.
const HtmlAttribList & attribs() const
void parseSummary(DocNodeVariant *, HtmlAttribList &attribs)
const DocNodeVariant * summary() const
std::unique_ptr< DocNodeVariant > m_summary
Node representing a Html list.
Node representing a HTML list item.
Node representing a HTML table row.
Token parseXml(bool header)
void setVisibleCells(uint32_t n)
void setRowIndex(uint32_t idx)
Node representing a HTML table.
size_t numberHeaderRows() const
std::unique_ptr< DocNodeVariant > m_caption
void computeTableGrid()
determines the location of all cells in a grid, resolving row and column spans.
const DocNodeVariant * caption() const
const HtmlAttribList & attribs() const
DocImage(DocParser *parser, DocNodeVariant *parent, const HtmlAttribList &attribs, const QCString &name, Type t, const QCString &url=QCString(), bool inlineImage=TRUE)
std::unique_ptr< Private > p
Node representing a include/dontinclude operator block.
const char * typeAsString() const
QCString m_includeFileName
void markLast(bool v=TRUE)
Node representing an included text block from file.
Node representing an entry in the index.
Node representing an internal section of documentation.
DocInternalRef(DocParser *parser, DocNodeVariant *parent, const QCString &target)
Node representing a line break.
Node representing a link to some item.
DocLink(DocParser *parser, DocNodeVariant *parent, const QCString &target)
QCString parse(bool, bool isXmlLink=FALSE)
DocLinkedWord(DocParser *parser, DocNodeVariant *parent, const QCString &word, const QCString &ref, const QCString &file, const QCString &anchor, const QCString &tooltip)
DocMscFile(DocParser *parser, DocNodeVariant *parent, const QCString &name, const QCString &context, const QCString &srcFile, int srcLine)
DocNode(DocParser *parser, DocNodeVariant *parent)
void setInsidePreformatted(bool p)
DocNodeVariant * thisVariant()
DocNodeVariant * parent()
Node representing an block of paragraphs.
Node representing a paragraph in the documentation tree.
Token handleSimpleSection(DocSimpleSect::Type t, bool xmlContext=FALSE)
void handleLink(const QCString &cmdName, bool isJavaLink)
void handleCite(char cmdChar, const QCString &cmdName)
DocPara(DocParser *parser, DocNodeVariant *parent)
void handleInclude(const QCString &cmdName, DocInclude::Type t)
Token handleCommand(char cmdChar, const QCString &cmdName)
void handleDoxyConfig(char cmdChar, const QCString &cmdName)
void handleSection(char cmdChar, const QCString &cmdName)
void handleFile(const QCString &cmdName)
Token handleParamSection(const QCString &cmdName, DocParamSect::Type t, bool xmlContext, int direction)
void markLast(bool v=TRUE)
Token handleHtmlStartTag(const QCString &tagName, const HtmlAttribList &tagHtmlAttribs)
void handleEmoji(char cmdChar, const QCString &cmdName)
void handleIncludeOperator(const QCString &cmdName, DocIncOperator::Type t)
void markFirst(bool v=TRUE)
void setAttribs(const HtmlAttribList &attribs)
Token handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs, int level)
void handleShowDate(char cmdChar, const QCString &cmdName)
Token handleHtmlEndTag(const QCString &tagName)
bool injectToken(Token tok, const QCString &tokText)
void markFirst(bool b=TRUE)
Token parseXml(const QCString ¶mName)
void markLast(bool b=TRUE)
Token parse(const QCString &cmdName)
DocParamSect::Type m_type
Node representing a parameter section.
friend class DocParamList
Token parse(const QCString &cmdName, bool xmlContext, Direction d)
bool defaultHandleToken(DocNodeVariant *parent, Token tok, DocNodeList &children, bool handleWord=TRUE)
void handleLinkedWord(DocNodeVariant *parent, DocNodeList &children, bool ignoreAutoLinkFlag=FALSE)
void handleInternalRef(DocNodeVariant *parent, DocNodeList &children)
void handleParameterType(DocNodeVariant *parent, DocNodeList &children, const QCString ¶mTypes)
void readTextFileByName(const QCString &file, QCString &text)
void handleRef(DocNodeVariant *parent, DocNodeList &children, char cmdChar, const QCString &cmdName)
Token handleAHref(DocNodeVariant *parent, DocNodeList &children, const HtmlAttribList &tagHtmlAttribs)
Token internalValidatingParseDoc(DocNodeVariant *parent, DocNodeList &children, const QCString &doc)
void handleInitialStyleCommands(DocNodeVariant *parent, DocNodeList &children)
void handleStyleLeave(DocNodeVariant *parent, DocNodeList &children, DocStyleChange::Style s, const QCString &tagName)
void handlePendingStyleCommands(DocNodeVariant *parent, DocNodeList &children)
void handleImage(DocNodeVariant *parent, DocNodeList &children)
void handleStyleEnter(DocNodeVariant *parent, DocNodeList &children, DocStyleChange::Style s, const QCString &tagName, const HtmlAttribList *attribs)
void handlePrefix(DocNodeVariant *parent, DocNodeList &children)
Token handleStyleArgument(DocNodeVariant *parent, DocNodeList &children, const QCString &cmdName)
void handleIFile(char cmdChar, const QCString &cmdName)
void handleILine(char cmdChar, const QCString &cmdName)
void handleAnchor(DocNodeVariant *parent, DocNodeList &children)
void handleImg(DocNodeVariant *parent, DocNodeList &children, const HtmlAttribList &tagHtmlAttribs)
void defaultHandleTitleAndSize(const CommandType cmd, DocNodeVariant *parent, DocNodeList &children, QCString &width, QCString &height)
void handleUnclosedStyleCommands()
void errorHandleDefaultToken(DocNodeVariant *parent, Token tok, DocNodeList &children, const QCString &txt)
DocPlantUmlFile(DocParser *parser, DocNodeVariant *parent, const QCString &name, const QCString &context, const QCString &srcFile, int srcLine)
Node representing a reference to some item.
SectionType m_sectionType
DocRef(DocParser *parser, DocNodeVariant *parent, const QCString &target, const QCString &context)
void parse(char cmdChar, const QCString &cmdName)
Node representing a reference to a section.
DocSecRefItem(DocParser *parser, DocNodeVariant *parent, const QCString &target)
Node representing a list of section references.
Node representing a normal section.
std::unique_ptr< DocNodeVariant > m_title
DocSection(DocParser *parser, DocNodeVariant *parent, int level, const QCString &id)
const DocNodeVariant * title() const
Node representing a simple list.
Node representing a simple list item.
std::unique_ptr< DocNodeVariant > m_paragraph
DocSimpleListItem(DocParser *parser, DocNodeVariant *parent)
Node representing a simple section.
QCString typeString() const
Token parse(bool userTitle, bool needsSeparator)
DocSimpleSect(DocParser *parser, DocNodeVariant *parent, Type t)
const DocNodeVariant * title() const
void appendLinkWord(const QCString &word)
std::unique_ptr< DocNodeVariant > m_title
Node representing a separator between two simple sections of the same type.
Node representing a style change.
const char * styleString() const
Node representing a special symbol.
static HtmlEntityMapper::SymType decodeSymbol(const QCString &symName)
Node representing a simple section title.
void parseFromString(DocNodeVariant *, const QCString &title)
void setStateILiteralOpt()
void setStatePlantUMLOpt()
void setInsidePre(bool b)
void unputString(const QCString &tag)
void setStateDoxyConfig()
void setStateQuotedString()
void pushBackHtmlTag(const QCString &tag)
Node representing a URL (or email address).
Node representing a verbatim, unparsed text fragment.
DocVerbatim(DocParser *parser, DocNodeVariant *parent, const QCString &context, const QCString &text, Type t, bool isExample, const QCString &exampleFile, bool isBlock=FALSE, const QCString &lang=QCString())
std::unique_ptr< Private > p
QCString exampleFile() const
void setEngine(const QCString &e)
Node representing a VHDL flow chart.
DocVhdlFlow(DocParser *parser, DocNodeVariant *parent)
Node representing some amount of white space.
Node representing a word.
DocWord(DocParser *parser, DocNodeVariant *parent, const QCString &word)
Node representing an item of a cross-referenced list.
DocXRefItem(DocParser *parser, DocNodeVariant *parent, int id, const QCString &key)
static FileNameLinkedMap * plantUmlFileNameLinkedMap
static FileNameLinkedMap * dotFileNameLinkedMap
static NamespaceDefMutable * globalScope
static FileNameLinkedMap * mscFileNameLinkedMap
static FileNameLinkedMap * diaFileNameLinkedMap
static QCString htmlFileExtension
static PageLinkedMap * pageLinkedMap
static DirLinkedMap * dirLinkedMap
static SearchIndexIntf searchIndex
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
int symbol2index(const std::string &symName) const
Returns a code for the requested Emoji entity name.
A model of a file symbol.
virtual QCString absFilePath() const =0
void clear()
clears the contents
size_t size() const
returns the number of elements
iterator end()
returns an iterator to the end
T & back()
access the last element
void pop_back()
removes the last element
bool empty() const
checks whether the container is empty
void emplace_back(Args &&...args)
Class representing a list of HTML attributes.
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
SymType name2sym(const QCString &symName) const
Give code of the requested HTML entity name.
const T * find(const std::string &key) const
A model of a class/file/namespace member symbol.
virtual const ClassDef * getClassDef() const =0
virtual const MemberDef * reimplements() const =0
virtual QCString objCMethodName(bool localLink, bool showStatic) const =0
A model of a page symbol.
virtual bool hasParentPage() const =0
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
bool endsWith(const char *s) 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
QCString fill(char c, int len=-1)
Fills a string with a predefined character.
const std::string & str() const
QCString & append(char c)
QCString right(size_t len) const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
std::string_view view() const
QCString left(size_t len) const
This struct represents an item in the list of references.
List of cross-referenced items.
QCString sectionTitle() const
QCString fileName() const
RefItem * find(int itemId)
static RefListManager & instance()
class that provide information about a section.
QCString fileName() const
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Anchor
static constexpr int Table
constexpr int level() const
static constexpr int Requirement
static constexpr int Page
bool is(TokenRetval rv) const
TOKEN_SPECIFICATIONS RETVAL_SPECIFICATIONS const char * to_string() const
TokenRetval value() const
bool is_any_of(ARGS... args) const
char command_to_char() const
static void createFlowChart(const MemberDef *)
Class representing a regular expression.
Class to iterate through matches.
#define Config_getList(name)
#define Config_getBool(name)
#define Config_getString(name)
std::unordered_set< std::string > StringUnorderedSet
std::vector< std::string > StringVector
QCString formatDateTime(const QCString &format, const std::tm &dt, int &formatUsed)
Return a string representation for a given std::tm value that is formatted according to the pattern g...
QCString dateTimeFromString(const QCString &spec, std::tm &dt, int &format)
Returns the filled in std::tm for a given string representing a date and/or time.
constexpr const char * SF_bit2str(int bitNumber)
Helper function that returns the name related one of the SF bits.
constexpr int SF_NumBits
number of bits in SF vector
DirIterator end(const DirIterator &) noexcept
#define AUTO_TRACE_ADD(...)
static const char * g_sectionLevelToName[]
static QCString stripKnownExtensions(const QCString &text)
static void unescapeCRef(QCString &s)
static const StringUnorderedSet g_plantumlEngine
#define INTERNAL_ASSERT(x)
static void flattenParagraphs(DocNodeVariant *root, DocNodeList &children)
static Token skipSpacesForTable(DocParser *parser)
#define AUTO_TRACE_EXIT(...)
static bool findAttribute(const HtmlAttribList &tagHtmlAttribs, const char *attrName, QCString *result)
std::vector< ActiveRowSpan > RowSpanList
List of ActiveRowSpan classes.
static void setParent(DocNodeVariant *n, DocNodeVariant *newParent)
static bool checkIfHtmlEndTagEndsAutoList(DocParser *parser, const DocNodeVariant *n)
constexpr bool holds_one_of_alternatives(const DocNodeVariant &v)
returns true iff v holds one of types passed as template parameters
std::variant< DocWord, DocLinkedWord, DocURL, DocLineBreak, DocHorRuler, DocAnchor, DocCite, DocStyleChange, DocSymbol, DocEmoji, DocWhiteSpace, DocSeparator, DocVerbatim, DocInclude, DocIncOperator, DocFormula, DocIndexEntry, DocAutoList, DocAutoListItem, DocTitle, DocXRefItem, DocImage, DocDotFile, DocMscFile, DocDiaFile, DocVhdlFlow, DocLink, DocRef, DocInternalRef, DocHRef, DocHtmlHeader, DocHtmlDescTitle, DocHtmlDescList, DocSection, DocSecRefItem, DocSecRefList, DocInternal, DocParBlock, DocSimpleList, DocHtmlList, DocSimpleSect, DocSimpleSectSep, DocParamSect, DocPara, DocParamList, DocSimpleListItem, DocHtmlListItem, DocHtmlDescData, DocHtmlCell, DocHtmlCaption, DocHtmlRow, DocHtmlTable, DocHtmlBlockQuote, DocText, DocRoot, DocHtmlDetails, DocHtmlSummary, DocPlantUmlFile > DocNodeVariant
DocNodeList * call_method_children(DocNodeVariant *v)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Private header shared between docparser.cpp and docnode.cpp.
bool insideUL(const DocNodeVariant *n)
bool insideTable(const DocNodeVariant *n)
IterableStack< const DocNodeVariant * > DocStyleChangeStack
bool insidePRE(const DocNodeVariant *n)
bool insideLI(const DocNodeVariant *n)
bool insideDL(const DocNodeVariant *n)
bool insideBlockQuote(const DocNodeVariant *n)
bool insideDetails(const DocNodeVariant *n)
bool insideOL(const DocNodeVariant *n)
FileDef * toFileDef(Definition *d)
GroupDef * toGroupDef(Definition *d)
Translator * theTranslator
QCString markdownFileNameToId(const QCString &fileName)
processes string s and converts markdown into doxygen/html commands.
MemberDef * toMemberDef(Definition *d)
#define warn(file, line, fmt,...)
#define warn_doc_error(file, line, fmt,...)
const Mapper< HtmlTagType > * htmlTagMapper
const Mapper< CommandType > * cmdMapper
QCString trunc(const QCString &s, size_t numChars=15)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
const char * qPrint(const char *s)
ActiveRowSpan(uint32_t rows, uint32_t col)
virtual QCString text() const =0
virtual QCString shortAuthor() const =0
virtual QCString label() const =0
virtual QCString year() const =0
void move_append(DocNodeList &l)
moves the element of list l at the end of this list.
void append(Args &&... args)
Append a new DocNodeVariant to the list by constructing it with type T and parameters Args.
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
StringMultiSet retvalsFound
bool includeFileShowLineNo
DocStyleChangeStack styleStack
StringMultiSet paramsFound
DefinitionStack copyStack
const MemberDef * memberDef
QCString linkToText(SrcLangExt lang, const QCString &link, bool isFileName)
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
QCString stripIndentation(const QCString &s, bool skipFirstLine)
QCString showFileDefMatches(const FileNameLinkedMap *fnMap, const QCString &n)
QCString stripScope(const QCString &name)
bool resolveLink(const QCString &scName, const QCString &lr, bool, const Definition **resContext, QCString &resAnchor, SrcLangExt lang, const QCString &prefix)
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
StringVector split(const std::string &s, const std::string &delimiter)
split input string s by string delimiter delimiter.
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
FileDef * findFileDef(const FileNameLinkedMap *fnMap, const QCString &n, bool &ambig)
A bunch of utility functions.