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();
3266 while (tok.
is(TokenRetval::TK_WORD))
3271 if (typeSeparator!=-1)
3277 if (
parent() && std::holds_alternative<DocParamSect>(*
parent()))
3279 std::get<DocParamSect>(*
parent()).m_hasTypeSpecifier=
true;
3299 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3301 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3302 "argument of command {}",saveCmdName);
3303 retval = Token::make_RetVal_EndParBlock();
3306 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3308 if (!tok.
is(TokenRetval::TK_NEWPARA))
3310 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} in comment block while parsing the "
3311 "argument of command {}",tok.
to_string(),saveCmdName);
3313 retval = Token::make_RetVal_EndParBlock();
3319 retval = par->
parse();
3331 Token retval = Token::make_RetVal_OK();
3352 retval = par->parse();
3374 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3376 }
while (retval.
is(TokenRetval::RetVal_CloseXml) &&
3381 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3387 retval = Token::make_RetVal_OK();
3399 Token retval = Token::make_RetVal_OK();
3407 if (!
children().empty() && std::holds_alternative<DocParamList>(
children().back()))
3422 retval = pl->parseXml(cmdName);
3426 retval = pl->parse(cmdName);
3428 if (retval.
is(TokenRetval::RetVal_EndParBlock))
3430 retval = Token::make_RetVal_OK();
3449 bool needsSeparator =
FALSE;
3451 (ss=
children().get_last<DocSimpleSect>()) &&
3456 needsSeparator =
TRUE;
3463 Token rv = Token::make_RetVal_OK();
3472 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3477 bool xmlContext=
FALSE,
3483 (ps=
children().get_last<DocParamSect>()) &&
3495 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3506 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
3511 for (
auto const &opt : optList)
3513 if (opt ==
"number")
3517 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3524 else if (opt ==
"year")
3528 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3535 else if (opt ==
"shortauthor")
3539 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3546 else if (opt ==
"nopar")
3550 else if (opt ==
"nocite")
3556 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3564 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3571 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
3574 cmdChar,saveCmdName);
3584 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3586 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"THE ONE unexpected end of comment block while parsing the "
3587 "argument of command '{:c}{}'",cmdChar,saveCmdName);
3590 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3608 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3616 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3618 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"no emoji name given or unexpected end of comment block while parsing the "
3619 "argument of command '{:c}{}'",cmdChar,cmdName);
3623 else if (!tok.
is(TokenRetval::TK_WORD))
3638 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3646 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3648 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3649 "argument of command '{:c}{}'",cmdChar,cmdName);
3652 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3662 switch (opt->
kind())
3682 std::string lstFormat =
theTranslator->trWriteList(
static_cast<int>(lst->size())).str();
3683 static const reg::Ex marker(R
"(@(\d+))");
3688 for ( ; it!=
end ; ++it)
3690 const auto &match = *it;
3691 size_t newIndex = match.position();
3692 size_t matchLen = match.length();
3693 optionValue += lstFormat.substr(index,newIndex-index);
3694 unsigned long entryIndex = std::stoul(match[1].str());
3695 if (entryIndex<(
unsigned long)lst->size())
3697 optionValue += lst->at(entryIndex);
3699 index=newIndex+matchLen;
3701 optionValue+=lstFormat.substr(index);
3706 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Obsolete setting for '{:c}{}': '{}'",
3707 cmdChar,cmdName,
parser()->context.token->name);
3711 "Disabled setting (i.e. not supported in this doxygen executable) for '{:c}{}': '{}'",
3712 cmdChar,cmdName,
parser()->context.token->name);
3725 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option for '{:c}{}': '{}'",
3726 cmdChar,cmdName,
parser()->context.token->name);
3736 ASSERT(retval.
is(TokenRetval::TK_WHITESPACE));
3739 if (retval.
is(TokenRetval::RetVal_OK))
3760 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3768 if (!tok.
is(TokenRetval::TK_WORD))
3782 bool specDateOnlyWS = !specDateRaw.
isEmpty() && specDate.
isEmpty();
3783 if (!specDate.
isEmpty() && !tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3785 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}'",
3796 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}': {}",
3797 cmdChar,cmdName,
err);
3809 if ((usedFormat&bitMask) && !(specFormat&bitMask))
3811 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.",
3829 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3838 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3840 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3841 "argument of command {}", saveCmdName);
3844 else if (!tok.
is(TokenRetval::TK_WORD))
3868 (!n1_docIncOp && !n1_docWs) ||
3869 (n1_docWs && n2 && !n2_docIncOp);
3874 n1_docIncOp->markLast(
false);
3876 else if (n1_docWs && n2_docIncOp)
3889 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3898 if (!tok.
is(TokenRetval::TK_WORD))
3925 AUTO_TRACE(
"cmdName={} isJavaLink={}",cmdName,isJavaLink);
3928 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3936 if (!tok.
is(TokenRetval::TK_WORD))
3942 if (saveCmdName ==
"javalink")
3951 if (saveCmdName ==
"javalink")
3957 QCString leftOver = lnk->parse(isJavaLink);
3969 bool isBlock =
false;
3970 bool trimLeft =
false;
3971 bool localScope =
false;
3973 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
3979 auto contains = [&optList](
const char *kw)
3981 return std::find(optList.begin(),optList.end(),kw)!=optList.end();
3983 localScope = contains(
"local");
3984 if (contains(
"nostrip"))
3986 stripCodeComments =
false;
3988 else if (contains(
"strip"))
3990 stripCodeComments =
true;
3997 if (contains(
"lineno"))
4004 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4011 else if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"[")
4019 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
4028 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4030 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4031 "argument of command {}",saveCmdName);
4034 else if (!tok.
is(TokenRetval::TK_WORD))
4048 if (!tok.
is(TokenRetval::TK_WORD))
4050 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected block identifier, but found token {} instead while parsing the {} command",
4065 blockId,isBlock,trimLeft);
4075 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4078 cmdChar,saveCmdName);
4082 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4084 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4085 "argument of command '{:c}{}'", cmdChar,saveCmdName);
4088 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
4105 return retval.is(TokenRetval::RetVal_OK) ? Token::make_TK_NEWPARA() : retval;
4127 if (
parser()->context.xmlComment)
4133 while (i<l && (
parser()->context.token->verb.at(i)==
' ' ||
parser()->context.token->verb.at(i)==
'\n'))
4135 if (
parser()->context.token->verb.at(i)==
'\n') li=i+1;
4145 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4156 if (
parser()->context.memberDef)
4194 Token retval = Token::make_RetVal_OK();
4200 std::string str{cmdChar};
4204 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Found unexpanded alias '{:c}{}'. Check if number of arguments passed is correct.",cmdChar,cmdName);
4353 retval = Token::make_RetVal_Section();
4359 retval = Token::make_RetVal_Subsection();
4365 retval = Token::make_RetVal_Subsubsection();
4371 retval = Token::make_RetVal_Paragraph();
4377 retval = Token::make_RetVal_SubParagraph();
4383 retval = Token::make_RetVal_SubSubParagraph();
4403 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4415 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4427 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4439 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4451 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4463 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4477 int idx = fullMatch.
find(
'{');
4478 int idxEnd = fullMatch.
find(
"}",idx+1);
4484 for (
const auto &opt : optList)
4486 if (opt.empty())
continue;
4489 if (locOpt ==
"code")
4495 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option '{}' for '\\iliteral'",opt);
4503 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4511 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"javadoc literal section ended without end marker");
4530 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4551 dv->setText(
parser()->context.token->verb);
4552 dv->setWidth(width);
4553 dv->setHeight(height);
4554 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4557 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\dot command because HAVE_DOT is not set");
4560 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4581 dv->setText(
parser()->context.token->verb);
4582 dv->setWidth(width);
4583 dv->setHeight(height);
4584 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4585 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4599 int idx = fullMatch.
find(
'{');
4600 int idxEnd = fullMatch.
find(
"}",idx+1);
4607 for (
const auto &opt : optList)
4609 if (opt.empty())
continue;
4617 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple definition of engine for '\\startuml'");
4630 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple use of filename for '\\startuml'");
4639 if (engine.
isEmpty()) engine =
"uml";
4645 assert(retval.is(TokenRetval::RetVal_OK));
4666 if (engine ==
"ditaa")
4668 dv->setUseBitmap(
true);
4670 else if (engine ==
"uml")
4672 int i = trimmedVerb.
find(
'\n');
4673 QCString firstLine = i==-1 ? trimmedVerb : trimmedVerb.
left(i);
4676 dv->setText(trimmedVerb);
4677 dv->setWidth(width);
4678 dv->setHeight(height);
4679 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4682 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
4685 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4693 retval = Token::make_RetVal_EndParBlock();
4752 retval = Token::make_RetVal_Internal();
4755 retval = Token::make_RetVal_EndInternal();
4824 "ignoring \\dotfile command because HAVE_DOT is not set");
4913 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command '{}' in paragraph context",cmdName);
4916 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_OK,TokenRetval::RetVal_SimpleSec
4917 TokenRetval::TK_LISTITEM,TokenRetval::TK_ENDLIST,TokenRetval::TK_NEWPARA
4918 TokenRetval::RetVal_Section,TokenRetval::RetVal_EndList
4919 TokenRetval::RetVal_Internal,TokenRetval::RetVal_SwitchLang
4920 TokenRetval::RetVal_EndInternal)
4927 const char *attrName,
4931 for (
const auto &opt : tagHtmlAttribs)
4933 if (opt.name==attrName)
4935 *result = opt.value;
4944 AUTO_TRACE(
"tagName={} #tagHtmlAttrs={}",tagName,tagHtmlAttribs.size());
4945 Token retval = Token::make_RetVal_OK();
4951 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"HTML tag ('<{}/>') may not use the 'empty tag' XHTML syntax.",
4957 if (!
parser()->context.token->emptyTag)
4965 if (!
parser()->context.token->emptyTag)
4973 if (
parser()->context.token->emptyTag)
break;
4980 retval = Token::make_RetVal_ListItem();
5002 if (
parser()->context.token->emptyTag)
break;
5003 if (
parser()->context.xmlComment)
5048 if (
parser()->context.token->emptyTag)
break;
5054 retval = Token::make_TK_NEWPARA();
5057 if (!
parser()->context.token->emptyTag)
5066 retval = Token::make_RetVal_DescTitle();
5076 retval = Token::make_RetVal_DescData();
5084 if (!
parser()->context.token->emptyTag)
5092 retval = Token::make_RetVal_TableRow();
5095 retval = Token::make_RetVal_TableCell();
5098 retval = Token::make_RetVal_TableHCell();
5145 if (!
parser()->context.token->emptyTag)
5152 if (!
parser()->context.token->emptyTag)
5162 if (!
parser()->context.token->emptyTag)
5165 while (n && !std::holds_alternative<DocHtmlDetails>(*n)) n=
::parent(n);
5175 retval = Token::make_TK_NEWPARA();
5189 retval = Token::make_TK_NEWPARA();
5195 retval = Token::make_RetVal_TableCell();
5265 retval = Token::make_RetVal_TableRow();
5269 retval = Token::make_RetVal_ListItem();
5284 retval = Token::make_RetVal_TableCell();
5298 if (
parser()->context.token->emptyTag)
5312 if (!leftOver.isEmpty())
5330 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing 'cref' or 'langword' attribute from <see> tag.");
5358 std::get<DocSimpleSect>(*vss).appendLinkWord(cref);
5359 retval = Token::make_RetVal_OK();
5416 Token retval = Token::make_RetVal_OK();
5426 retval = Token::make_RetVal_EndList();
5436 retval = Token::make_RetVal_EndList();
5452 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </details> tag without matching <details>");
5456 retval = Token::make_RetVal_EndHtmlDetails();
5462 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </blockquote> tag without matching <blockquote>");
5466 retval = Token::make_RetVal_EndBlockQuote();
5526 retval = Token::make_TK_NEWPARA();
5529 retval = Token::make_RetVal_EndDesc();
5538 retval = Token::make_RetVal_EndTable();
5541 retval = Token::make_RetVal_EndTableRow();
5544 retval = Token::make_RetVal_EndTableCell();
5547 retval = Token::make_RetVal_EndTableCell();
5591 retval = Token::make_TK_NEWPARA();
5605 retval = Token::make_RetVal_CloseXml();
5641 if (!std::get_if<DocAutoListItem>(n))
5649 const auto docAutoList = std::get_if<DocAutoList>(n);
5652 indent = docAutoList->indent();
5661 const auto docPara = std::get_if<DocPara>(n);
5667 return std::get<DocStyleChange>(*stack.top());
5677 indentStr.
fill(
' ',indent);
5692 Token retval = Token::make_TK_NONE();
5693 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
5697 if (tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD,TokenRetval::TK_SYMBOL,TokenRetval::TK_URL,
5698 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS,TokenRetval::TK_HTMLTAG)
5705 case TokenRetval::TK_WORD:
5708 case TokenRetval::TK_LNKWORD:
5711 case TokenRetval::TK_URL:
5714 case TokenRetval::TK_WHITESPACE:
5732 case TokenRetval::TK_LISTITEM:
5736 while (n && !std::holds_alternative<DocAutoList>(*n)) n=
::parent(n);
5737 const DocAutoList *al = std::get_if<DocAutoList>(n);
5744 retval = Token::make_TK_LISTITEM();
5754 al = std::get_if<DocAutoList>(n);
5768 }
while (retval.
is(TokenRetval::TK_LISTITEM) &&
5773 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5779 if (
parser()->context.token->name.startsWith(
"rcs:"))
5783 tok = Token::make_TK_RCSTAG();
5787 tok = Token::make_TK_COMMAND_BS();
5792 else if (retval.
is(TokenRetval::TK_ENDLIST))
5808 case TokenRetval::TK_ENDLIST:
5809 AUTO_TRACE_ADD(
"Found end of list inside of paragraph at line {}",
parser()->tokenizer.getLineNr());
5810 if (std::get_if<DocAutoListItem>(
parent()))
5813 if (al && al->
indent()>=
parser()->context.token->indent)
5816 retval = Token::make_TK_ENDLIST();
5822 "has invalid indent level");
5831 case TokenRetval::TK_COMMAND_AT:
5833 case TokenRetval::TK_COMMAND_BS:
5838 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5839 !std::holds_alternative<DocParamSect>(*n))
5850 retval = Token::make_RetVal_SimpleSec();
5856 while (n && !std::holds_alternative<DocSimpleListItem>(*n)) n=
::parent(n);
5861 retval = Token::make_RetVal_ListItem();
5871 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5877 if (
parser()->context.token->name.startsWith(
"rcs:"))
5881 tok = Token::make_TK_RCSTAG();
5885 tok = Token::make_TK_COMMAND_BS();
5890 else if (retval.
value()>TokenRetval::TK_NONE && retval.
value()<TokenRetval::RetVal_OK)
5896 else if (retval.
value()!=TokenRetval::RetVal_OK)
5903 case TokenRetval::TK_HTMLTAG:
5905 if (!
parser()->context.token->endTag)
5917 if (!retval.
is(TokenRetval::RetVal_OK))
5923 case TokenRetval::TK_SYMBOL:
5934 parser()->context.token->name);
5938 case TokenRetval::TK_NEWPARA:
5939 retval = Token::make_TK_NEWPARA();
5941 case TokenRetval::TK_RCSTAG:
5944 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5945 !std::holds_alternative<DocParamSect>(*n))
5955 retval = Token::make_RetVal_SimpleSec();
5966 "Found unexpected token (id={})",tok.
to_string());
5971 retval=Token::make_TK_NONE();
5974 DocPara *par = std::get_if<DocPara>(
parser()->context.nodeStack.top());
5975 if (!
parser()->context.token->endTag && par &&
5976 retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->name.lower() ==
"p")
5980 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::TK_NEWPARA,TokenRetval::TK_LISTITEM,
5981 TokenRetval::TK_ENDLIST,TokenRetval::RetVal_OK)
5993 Token retval = Token::make_RetVal_OK();
5996 if (!
m_id.isEmpty())
6018 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6019 retval=par->parse();
6020 if (!par->isEmpty())
6029 if (retval.
is(TokenRetval::TK_LISTITEM))
6033 if (retval.
is(TokenRetval::RetVal_Internal))
6037 if (retval.is(TokenRetval::RetVal_EndInternal))
6039 retval = Token::make_RetVal_OK();
6042 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6043 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6044 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6051 if (retval.
is(TokenRetval::RetVal_Subsection) &&
m_level<=1)
6054 while (retval.
is(TokenRetval::RetVal_Subsection))
6063 else if (retval.
is(TokenRetval::RetVal_Subsubsection) &&
m_level<=2)
6069 parser()->tokenizer.getLineNr(),
6070 "Unexpected subsubsection command found inside {}!",
6074 while (retval.
is(TokenRetval::RetVal_Subsubsection))
6081 if (!(
m_level < 2 && retval.
is(TokenRetval::RetVal_Subsection)))
break;
6083 else if (retval.
is(TokenRetval::RetVal_Paragraph) &&
m_level<=3)
6089 "Unexpected paragraph command found inside {}!",
6093 while (retval.
is(TokenRetval::RetVal_Paragraph))
6100 if (!(
m_level<3 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection))))
break;
6102 else if (retval.
is(TokenRetval::RetVal_SubParagraph) &&
m_level<=4)
6108 "Unexpected subparagraph command found inside {}!",
6112 while (retval.
is(TokenRetval::RetVal_SubParagraph))
6119 if (!(
m_level<4 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph))))
break;
6121 else if (retval.
is(TokenRetval::RetVal_SubSubParagraph) &&
m_level<=5)
6127 "Unexpected subsubparagraph command found inside {}!",
6131 while (retval.
is(TokenRetval::RetVal_SubSubParagraph))
6138 if (!(
m_level<5 && (retval.
is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6139 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph))))
break;
6148 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6149 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6150 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6151 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6167 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
6171 case TokenRetval::TK_WORD:
6174 case TokenRetval::TK_WHITESPACE:
6177 case TokenRetval::TK_SYMBOL:
6187 parser()->context.token->name);
6191 case TokenRetval::TK_COMMAND_AT:
6193 case TokenRetval::TK_COMMAND_BS:
6255 parser()->context.token->name);
6279 Token retval = Token::make_TK_NONE();
6289 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6290 retval=par->parse();
6291 if (par->isEmpty() && par->attribs().empty())
6300 auto checkParagraph = [
this,&retval](
Token t,
int level,
const char *sectionType,
const char *parentSectionType) {
6306 parser()->tokenizer.getLineNr(),
6307 "found {} command (id: '{}') outside of {} context!",
6308 sectionType,
parser()->context.token->sectionId,parentSectionType);
6312 if (!
parser()->context.token->sectionId.isEmpty())
6325 sectionType,
parser()->context.token->sectionId,sectionType);
6326 retval = Token::make_TK_NONE();
6331 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing id for {}; ignoring {}",sectionType,sectionType);
6332 retval = Token::make_TK_NONE();
6337 checkParagraph(Token::make_RetVal_SubSubParagraph(), 6,
"subsubparagraph",
"subparagraph" );
6338 checkParagraph(Token::make_RetVal_SubParagraph(), 5,
"subparagraph",
"paragraph" );
6339 checkParagraph(Token::make_RetVal_Paragraph(), 4,
"paragraph",
"subsubsection" );
6340 checkParagraph(Token::make_RetVal_Subsubsection(), 3,
"subsubsection",
"subsection" );
6341 checkParagraph(Token::make_RetVal_Subsection(), 2,
"subsection",
"section" );
6343 if (retval.
is(TokenRetval::TK_LISTITEM))
6347 if (retval.
is(TokenRetval::RetVal_Internal))
6352 }
while (!retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_Section));
6357 while (retval.
is(TokenRetval::RetVal_Section))
6359 if (!
parser()->context.token->sectionId.isEmpty())
6372 retval = Token::make_TK_NONE();
6378 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.