44#if !ENABLE_DOCPARSER_TRACING
48#define AUTO_TRACE(...) (void)0
49#define AUTO_TRACE_ADD(...) (void)0
50#define AUTO_TRACE_EXIT(...) (void)0
53#define INTERNAL_ASSERT(x) do {} while(0)
72 "uml",
"bpm",
"wire",
"dot",
"ditaa",
73 "salt",
"math",
"latex",
"gantt",
"mindmap",
74 "wbs",
"yaml",
"creole",
"json",
"flow",
75 "board",
"git",
"hcl",
"regex",
"ebnf",
76 "files",
"chen",
"chronology",
"chart",
"nwdiag",
77 "packetdiag",
"project",
"sprites"
87 const char *p = s.
data();
93 if (c==
'{') c=
'<';
else if (c==
'}') c=
'>';
122 std::visit([&](
auto &&x)->
decltype(
auto) {
return x.setParent(newParent); }, *n);
166 size_t len=locSymName.
length();
169 if (locSymName.
at(len-1)!=
':') locSymName.
append(
":");
170 if (locSymName.
at(0)!=
':') locSymName.
prepend(
":");
188 Doxygen::searchIndex.addWord(word,false);
205 Doxygen::searchIndex.addWord(word,false);
221 if (
id.left(anchorPrefix.
length()) == anchorPrefix)
311 parser()->tokenizer.getLineNr(),
312 "block marked with {} for \\snippet should appear twice in file {}, found it {:d} times",
326 "No previous '\\include' or '\\dontinclude' command for '\\{}' present",
337 size_t so = o, bo = 0;
338 bool nonEmpty =
FALSE;
351 else if (!isspace(
static_cast<uint8_t
>(c)))
381 else if (!isspace(
static_cast<uint8_t
>(c)))
414 else if (!isspace(
static_cast<uint8_t
>(c)))
445 else if (!isspace(
static_cast<uint8_t
>(c)))
489 if (
parser()->context.memberDef &&
parser()->context.memberDef->name().at(0)==
'@')
548 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
562 if (sec==
nullptr &&
parser()->context.lang==SrcLangExt::Markdown)
624 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
626 if (tok.
is_any_of(TokenRetval::TK_COMMAND_AT, TokenRetval::TK_COMMAND_BS))
633 if (!tok.
is(TokenRetval::TK_WHITESPACE))
639 if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
653 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Illegal command '{:c}{}' as part of a \\secreflist",
658 else if (tok.
is(TokenRetval::TK_WHITESPACE))
664 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected token {} inside section reference list",
696 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
715 AUTO_TRACE(
"target='{}',context='{}'",target,context);
718 auto lang =
parser->context.lang;
720 if (sec==
nullptr && !
parser->context.prefix.isEmpty())
780 m_file = dd->getOutputFileBase();
787 bool isFile = compound ?
791 if (compound && lang==SrcLangExt::Markdown) lang = compound->
getLanguage();
813 int funcPos =
m_text.find(
'(');
832 toFileDef(compound)->generateSourceFile()
846 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"unable to resolve reference to '{}' for \\ref command",
852 for (
auto &&elem : elements)
862 for (
auto &dn : children)
864 DocPara *para = std::get_if<DocPara>(&dn);
876 for (
auto &cn : children)
883 for (
auto &ccn : *opt_children)
895 char cmdCharStr[2] = { cmdChar, 0 };
898 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
904 case TokenRetval::TK_HTMLTAG:
917 if (
parser()->context.insideHtmlLink)
922 "Potential recursion while resolving {:c}{} command!",cmdChar,cmdName);
949 if (numBibFiles>0 && cite && !cite->
text().
isEmpty())
960 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"\\cite command found but no bib files specified via CITE_BIB_FILES!");
962 else if (cite==
nullptr)
964 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"unable to resolve reference to '{}' for \\cite command",
969 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"\\cite command to '{}' does not have an associated number",
981 if (!opt.noPar()) txt +=
"[";
985 if (opt.isNumber()) txt += citeInfo->
text();
986 else if (opt.isShortAuthor()) txt += citeInfo->
shortAuthor();
987 else if (opt.isYear()) txt += citeInfo->
year();
990 if (!opt.noPar()) txt +=
"]";
1005 m_refText = m_refText.right(m_refText.length()-1);
1012 if (compound && compound->isLinkable())
1014 m_file = compound->getOutputFileBase();
1015 m_ref = compound->getReference();
1018 (
toFileDef(compound))->generateSourceFile()
1028 warn_doc_error(parser->context.fileName,parser->tokenizer.getLineNr(),
"unable to resolve link to '{}' for \\link command",
1040 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1044 switch (tok.
value())
1046 case TokenRetval::TK_COMMAND_AT:
1048 case TokenRetval::TK_COMMAND_BS:
1064 case TokenRetval::TK_SYMBOL:
1065 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unsupported symbol '{}' found as part of a \\link",
1066 parser()->context.token->name);
1068 case TokenRetval::TK_HTMLTAG:
1069 if (
parser()->context.token->name!=
"see" || !isXmlLink)
1071 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected xml/html command {} found as part of a \\link",
1072 parser()->context.token->name);
1075 case TokenRetval::TK_LNKWORD:
1076 case TokenRetval::TK_WORD:
1085 else if ((p=w.
find(
'}'))!=-1)
1087 int l =
static_cast<int>(w.
length());
1091 result=w.
right(l-p-1);
1105 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1108 parser()->tokenizer.getLineNr(),
1109 "Unexpected end of comment while inside link command");
1129 p->relPath =
parser->context.relPath;
1139 if (fd==
nullptr && !
p->name.endsWith(
".dot"))
1150 "Possible candidates:\n{}",
p->name,
1158 "in any of the paths specified via DOTFILE_DIRS!",
p->name);
1167 p->relPath =
parser->context.relPath;
1177 if (fd==
nullptr && !
p->name.endsWith(
".msc"))
1188 "Possible candidates:\n{}",
qPrint(
p->name),
1196 "in any of the paths specified via MSCFILE_DIRS!",
p->name);
1207 p->relPath =
parser->context.relPath;
1217 if (fd==
nullptr && !
p->name.endsWith(
".dia"))
1228 "Possible candidates:\n{}",
p->name,
1236 "in any of the paths specified via DIAFILE_DIRS!",
p->name);
1246 p->relPath =
parser->context.relPath;
1256 if (fd==
nullptr && !
p->name.endsWith(
".puml"))
1259 if (fd==
nullptr && !
p->name.endsWith(
".pu"))
1271 "Possible candidates:\n{}",
p->name,
1279 "in any of the paths specified via PLANTUMLFILE_DIRS!",
p->name);
1290 p->relPath =
parser->context.relPath;
1300 if (fd==
nullptr && !
p->name.endsWith(
".mmd"))
1311 "Possible candidates:\n{}",
p->name,
1319 "in any of the paths specified via MERMAIDFILE_DIRS!",
p->name);
1337 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1364 QCString locName =
p->url.isEmpty() ?
p->name :
p->url;
1365 int len =
static_cast<int>(locName.
length());
1366 int fnd = locName.
find(
'?');
1367 if (fnd==-1) fnd=len;
1368 return fnd>=4 && locName.
mid(fnd-4,4)==
".svg";
1382 Token retval(TokenRetval::RetVal_OK);
1386 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1390 switch (tok.
value())
1392 case TokenRetval::TK_HTMLTAG:
1451 if (!
parser()->context.token->endTag)
1462 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <h{:d}> context",
1475 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1492 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1495 if (tok.
value()==TokenRetval::TK_HTMLTAG &&
1497 parser()->context.token->endTag
1502 else if (tok.
is_any_of(TokenRetval::TK_COMMAND_AT, TokenRetval::TK_COMMAND_BS) &&
1515 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1527 Token retval(TokenRetval::TK_NONE);
1538 retval=par->
parse();
1540 while (retval.
is(TokenRetval::TK_NEWPARA));
1543 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1545 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <details> block");
1556 return retval.
is(TokenRetval::RetVal_EndHtmlDetails) ? Token::make_RetVal_OK() : retval;
1572 Token retval(TokenRetval::RetVal_OK);
1576 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1580 switch (tok.
value())
1582 case TokenRetval::TK_HTMLTAG:
1595 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <a href=...> context",
1596 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
1607 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1610 " <a href=...> tag");
1622 Token retval(TokenRetval::RetVal_OK);
1632 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
1633 retval=par->parse();
1634 if (!par->isEmpty())
1643 if (retval.
is(TokenRetval::TK_LISTITEM))
1647 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
1648 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
1649 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
1650 TokenRetval::RetVal_EndInternal));
1654 while ((level==1 && retval.
is(TokenRetval::RetVal_Section)) ||
1655 (level==2 && retval.
is(TokenRetval::RetVal_Subsection)) ||
1656 (level==3 && retval.
is(TokenRetval::RetVal_Subsubsection)) ||
1657 (level==4 && retval.
is(TokenRetval::RetVal_Paragraph)) ||
1658 (level==5 && retval.
is(TokenRetval::RetVal_SubParagraph)) ||
1659 (level==6 && retval.
is(TokenRetval::RetVal_SubSubParagraph))
1668 if (retval.
is(TokenRetval::RetVal_Internal))
1670 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"\\internal command found inside internal section");
1682 Token retval(TokenRetval::RetVal_OK);
1685 if (!tok.
is(TokenRetval::TK_WHITESPACE))
1693 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1695 switch (tok.
value())
1697 case TokenRetval::TK_WHITESPACE:
1700 case TokenRetval::TK_WORD:
1701 case TokenRetval::TK_LNKWORD:
1704 case TokenRetval::TK_SYMBOL:
1726 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected symbol '{}' found as argument of \\addindex",
parser()->context.token->name);
1731 case TokenRetval::TK_COMMAND_AT:
1733 case TokenRetval::TK_COMMAND_BS:
1755 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command {} found as argument of \\addindex",
1756 parser()->context.token->name);
1780 for (
const auto &opt :
attribs)
1782 if (opt.name==
"id" && !opt.value.isEmpty())
1807 Token retval = Token::make_TK_NONE();
1810 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1814 switch (tok.
value())
1816 case TokenRetval::TK_HTMLTAG:
1821 retval = Token::make_RetVal_OK();
1826 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <caption> context",
1827 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
1838 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1853 Token retval = Token::make_RetVal_OK();
1864 retval=par->
parse();
1865 if (retval.
is(TokenRetval::TK_HTMLTAG))
1870 retval = Token::make_TK_NEWPARA();
1874 retval = Token::make_TK_NEWPARA();
1878 while (retval.
is_any_of(TokenRetval::TK_NEWPARA,TokenRetval::RetVal_EndParBlock));
1887 Token retval = Token::make_RetVal_OK();
1898 retval=par->
parse();
1899 if (retval.
is(TokenRetval::TK_HTMLTAG))
1904 retval = Token::make_TK_NEWPARA();
1908 retval = Token::make_TK_NEWPARA();
1912 while (retval.
is(TokenRetval::TK_NEWPARA));
1920 for (
const auto &attr :
attribs())
1922 if (attr.name.lower()==
"rowspan")
1924 return attr.value.toUInt();
1932 for (
const auto &attr :
attribs())
1934 if (attr.name.lower()==
"colspan")
1936 return std::max(1u,attr.value.toUInt());
1944 for (
const auto &attr :
attribs())
1948 if (attrName==
"align")
1950 if (attrValue==
"center")
1952 else if (attrValue==
"right")
1956 else if (attrName==
"class" && attrValue.
startsWith(
"markdowntable"))
1958 if (attrValue==
"markdowntableheadcenter")
1960 else if (attrValue==
"markdowntableheadright")
1962 else if (attrValue==
"markdowntableheadleft")
1964 else if (attrValue==
"markdowntableheadnone")
1966 else if (attrValue==
"markdowntablebodycenter")
1968 else if (attrValue==
"markdowntablebodyright")
1970 else if (attrValue==
"markdowntablebodyleft")
1972 else if (attrValue==
"markdowntablebodynone")
1982 for (
const auto &attr :
attribs())
1986 if (attrName==
"valign")
1988 if (attrValue==
"top")
1990 else if (attrValue==
"bottom")
1992 else if (attrValue==
"middle")
2007 const DocHtmlCell *cell = std::get_if<DocHtmlCell>(&n);
2023 while (tok.
is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA,TokenRetval::TK_HTMLTAG,
2024 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS))
2026 if (tok.
is(TokenRetval::TK_HTMLTAG))
2042 else if (tok.
is_any_of(TokenRetval::TK_COMMAND_AT, TokenRetval::TK_COMMAND_BS))
2052 if (!tok.
is(TokenRetval::TK_WORD))
2080 Token retval = Token::make_RetVal_OK();
2089 if (tok.
is(TokenRetval::TK_HTMLTAG))
2102 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2107 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2110 " for a html description title");
2115 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td> or <th> tag but found {} token instead!",
2129 retval=cell->
parse();
2130 isHeading = retval.
is(TokenRetval::RetVal_TableHCell);
2132 if (retval.
is(TokenRetval::RetVal_EndTableCell))
2138 if (tok.
is(TokenRetval::TK_HTMLTAG))
2141 !
parser()->context.token->endTag)
2143 retval = Token::make_RetVal_TableCell();
2148 if (
parser()->context.token->endTag)
2150 retval = Token::make_RetVal_EndTableRow();
2154 retval = Token::make_RetVal_TableRow();
2159 retval = Token::make_RetVal_EndTable();
2164 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2171 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td>, <th> or <tr> tag but found {} token instead!",
2177 while (retval.
is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2187 Token retval = Token::make_RetVal_OK();
2198 if (tok.
is(TokenRetval::TK_HTMLTAG))
2210 "found <{}> instead!",
parser()->context.token->name);
2215 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2218 " for a html description title");
2223 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td> or <th> tag but found {} token instead!",
2236 while (retval.
is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2260 const DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2273 Token retval = Token::make_RetVal_OK();
2280 if (tok.
is(TokenRetval::TK_HTMLTAG))
2286 retval = Token::make_RetVal_TableRow();
2297 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2299 if (retval.
is(TokenRetval::RetVal_OK))
2308 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2311 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2314 " for a <tr> or <caption> tag");
2323 while (retval.
is(TokenRetval::RetVal_TableRow))
2328 if (retval.is(TokenRetval::RetVal_EndTableRow))
2336 retval = Token::make_RetVal_TableRow();
2340 retval = Token::make_RetVal_EndTable();
2342 else if (retval.is(TokenRetval::TK_HTMLTAG))
2345 "found <{}> instead!",
parser()->context.token->name);
2351 "found token {} instead!",retval.to_string());
2352 retval=Token::make_RetVal_OK();
2360 return retval.
is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2366 Token retval = Token::make_RetVal_OK();
2375 bool isHeader=
FALSE;
2376 if (tok.
is(TokenRetval::TK_HTMLTAG))
2381 retval = Token::make_RetVal_TableRow();
2385 retval = Token::make_RetVal_TableRow();
2391 while (retval.
is(TokenRetval::RetVal_TableRow))
2395 retval=tr->parseXml(isHeader);
2430 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2433 for (
auto &cellNode : row->
children())
2435 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2438 uint32_t rs = cell->
rowSpan();
2439 uint32_t cs = cell->
colSpan();
2441 for (
size_t i=0;i<rowSpans.size();i++)
2443 if (rowSpans[i].rowsLeft>0 &&
2444 rowSpans[i].column==colIdx)
2446 colIdx=rowSpans[i].column+1;
2450 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2458 for (
size_t i=0;i<rowSpans.size();i++)
2460 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2466 if (colIdx-1>maxCols) maxCols=colIdx-1;
2476 Token retval = Token::make_TK_NONE();
2480 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
2484 switch (tok.
value())
2486 case TokenRetval::TK_COMMAND_AT:
2488 case TokenRetval::TK_COMMAND_BS:
2491 bool isJavaLink=
FALSE;
2497 if (!tok.
is(TokenRetval::TK_WHITESPACE))
2506 if (!tok.
is(TokenRetval::TK_WORD))
2508 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} as the argument of '{:c}{}' command",
2526 if (!tok.
is(TokenRetval::TK_WHITESPACE))
2535 if (!tok.
is(TokenRetval::TK_WORD))
2537 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} as the argument of \\{} command",
2545 QCString leftOver = lnk->parse(isJavaLink);
2546 if (!leftOver.isEmpty())
2560 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Illegal command '{:c}{}' found as part of a <dt> tag",
2565 case TokenRetval::TK_SYMBOL:
2566 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unsupported symbol '{}' found as part of a <dt> tag",
2567 parser()->context.token->name);
2569 case TokenRetval::TK_HTMLTAG:
2574 retval = Token::make_RetVal_DescData();
2584 retval = Token::make_RetVal_DescTitle();
2589 retval = Token::make_RetVal_EndDesc();
2594 if (!
parser()->context.token->endTag)
2605 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <dt> context",
2606 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
2618 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2635 Token retval = Token::make_TK_NONE();
2645 retval=par->
parse();
2647 while (retval.
is(TokenRetval::TK_NEWPARA));
2658 Token retval = Token::make_RetVal_OK();
2666 if (tok.
is(TokenRetval::TK_HTMLTAG))
2676 "found <{}> instead!",
parser()->context.token->name);
2681 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2684 " for a html description title");
2701 if (retval.is(TokenRetval::RetVal_DescData))
2704 while (retval.is(TokenRetval::RetVal_DescData))
2711 else if (!retval.is(TokenRetval::RetVal_DescTitle))
2716 }
while (retval.
is(TokenRetval::RetVal_DescTitle));
2718 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2720 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <dl> block");
2725 return retval.
is(TokenRetval::RetVal_EndDesc) ? Token::make_RetVal_OK() : retval;
2733 Token retval = Token::make_TK_NONE();
2744 retval=par->
parse();
2746 while (retval.
is(TokenRetval::TK_NEWPARA));
2756 Token retval = Token::make_TK_NONE();
2767 retval=par->
parse();
2768 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
2772 if (retval.
is(TokenRetval::RetVal_ListItem))
2777 while (!retval.
is(TokenRetval::RetVal_CloseXml));
2790 Token retval = Token::make_RetVal_OK();
2799 if (tok.
is(TokenRetval::TK_HTMLTAG))
2808 ) &&
parser()->context.token->endTag
2814 retval = Token::make_RetVal_EndList();
2822 "found <{}{}> instead!",
parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
2827 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2832 " for a html list item");
2849 }
while (retval.
is(TokenRetval::RetVal_ListItem));
2851 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2853 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <{:c}l> block",
2859 return retval.
is(TokenRetval::RetVal_EndList) ? Token::make_RetVal_OK() : retval;
2865 Token retval = Token::make_RetVal_OK();
2874 if (tok.
is(TokenRetval::TK_HTMLTAG))
2885 "found <{}> instead!",
parser()->context.token->name);
2890 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2893 " for a html list item");
2907 retval=li->parseXml();
2908 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
2910 }
while (retval.
is(TokenRetval::RetVal_ListItem));
2912 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2914 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <list type=\"{}\"> block",
2920 return (retval.
is_any_of(TokenRetval::RetVal_EndList,TokenRetval::RetVal_CloseXml) ||
parser()->context.token->name==
"list") ?
2921 Token::make_RetVal_OK() : retval;
2929 Token retval = Token::make_TK_NONE();
2940 retval=par->
parse();
2942 while (retval.
is(TokenRetval::TK_NEWPARA));
2945 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2947 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <blockquote> block");
2951 return retval.
is(TokenRetval::RetVal_EndBlockQuote) ? Token::make_RetVal_OK() : retval;
2959 Token retval = Token::make_TK_NONE();
2970 retval=par->
parse();
2972 while (retval.
is(TokenRetval::TK_NEWPARA));
2976 return retval.
is(TokenRetval::RetVal_EndBlockQuote) ? Token::make_RetVal_OK() : retval;
3003 Token rv = Token::make_TK_NONE();
3009 }
while (rv.
is(TokenRetval::RetVal_ListItem));
3010 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3023 Token retval = Token::make_RetVal_OK();
3033 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
3034 retval=par->parse();
3035 if (!par->isEmpty())
3046 }
while (retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->indent>
m_indent);
3065 Token retval = Token::make_RetVal_OK();
3072 switch (
parser()->context.token->id)
3094 while (retval.
is(TokenRetval::TK_LISTITEM) &&
3098 (
parser()->context.token->id==-1 ||
parser()->context.token->id>=num)
3115 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
3147 return m_title && std::get<DocTitle>(*m_title).hasTitle();
3159 std::get_if<DocTitle>(
m_title.get())->parse();
3163 if (!
children().empty() && std::holds_alternative<DocPara>(
children().back()))
3181 Token retval = par->parse();
3201 return Token::make_RetVal_OK();
3209 Token retval = Token::make_RetVal_OK();
3213 if (!
children().empty() && std::holds_alternative<DocPara>(
children().back()))
3215 std::get<DocPara>(
children().back()).markLast(
false);
3227 retval = par->parse();
3228 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3229 if (retval.
is(TokenRetval::RetVal_CloseXml))
3231 retval = Token::make_RetVal_OK();
3243 if (
children().empty() || (p=std::get_if<DocPara>(&
children().back()))==
nullptr)
3265 case See:
return "see";
3266 case Return:
return "return";
3268 case Authors:
return "author";
3269 case Version:
return "version";
3270 case Since:
return "since";
3271 case Date:
return "date";
3272 case Note:
return "note";
3273 case Warning:
return "warning";
3274 case Pre:
return "pre";
3275 case Post:
return "post";
3277 case Invar:
return "invariant";
3278 case Remark:
return "remark";
3281 case User:
return "user";
3282 case Rcs:
return "rcs";
3292 Token retval = Token::make_RetVal_OK();
3300 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3304 retval = Token::make_RetVal_EndParBlock();
3308 tok=tokenizer.
lex();
3309 while (tok.
is(TokenRetval::TK_WORD))
3314 if (typeSeparator!=-1)
3319 if (
parent() && std::holds_alternative<DocParamSect>(*
parent()))
3321 std::get<DocParamSect>(*
parent()).m_hasTypeSpecifier=
true;
3338 tok=tokenizer.
lex();
3341 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3344 "argument of command {}",saveCmdName);
3345 retval = Token::make_RetVal_EndParBlock();
3348 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3350 if (!tok.
is(TokenRetval::TK_NEWPARA))
3353 "argument of command {}",tok.
to_string(),saveCmdName);
3355 retval = Token::make_RetVal_EndParBlock();
3361 retval = par->
parse();
3373 Token retval = Token::make_RetVal_OK();
3394 retval = par->parse();
3416 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3418 }
while (retval.
is(TokenRetval::RetVal_CloseXml) &&
3423 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3429 retval = Token::make_RetVal_OK();
3441 Token retval = Token::make_RetVal_OK();
3449 if (!
children().empty() && std::holds_alternative<DocParamList>(
children().back()))
3464 retval = pl->parseXml(cmdName);
3468 retval = pl->parse(cmdName);
3470 if (retval.
is(TokenRetval::RetVal_EndParBlock))
3472 retval = Token::make_RetVal_OK();
3491 bool needsSeparator =
FALSE;
3493 (ss=
children().get_last<DocSimpleSect>()) &&
3498 needsSeparator =
TRUE;
3505 Token rv = Token::make_RetVal_OK();
3514 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3519 bool xmlContext=
FALSE,
3525 (ps=
children().get_last<DocParamSect>()) &&
3537 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3548 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
3553 for (
auto const &opt : optList)
3555 if (opt ==
"number")
3559 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3566 else if (opt ==
"year")
3570 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3577 else if (opt ==
"shortauthor")
3581 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3588 else if (opt ==
"nopar")
3592 else if (opt ==
"nocite")
3598 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3606 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3613 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
3616 cmdChar,saveCmdName);
3626 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3628 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"THE ONE unexpected end of comment block while parsing the "
3629 "argument of command '{:c}{}'",cmdChar,saveCmdName);
3632 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3650 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3658 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3660 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"no emoji name given or unexpected end of comment block while parsing the "
3661 "argument of command '{:c}{}'",cmdChar,cmdName);
3665 else if (!tok.
is(TokenRetval::TK_WORD))
3680 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3688 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3690 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3691 "argument of command '{:c}{}'",cmdChar,cmdName);
3694 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3704 switch (opt->
kind())
3724 std::string lstFormat =
theTranslator->trWriteList(
static_cast<int>(lst->size())).str();
3725 static const reg::Ex marker(R
"(@(\d+))");
3730 for ( ; it!=
end ; ++it)
3732 const auto &match = *it;
3733 size_t newIndex = match.position();
3734 size_t matchLen = match.length();
3735 optionValue += lstFormat.substr(index,newIndex-index);
3736 unsigned long entryIndex = std::stoul(match[1].str());
3737 if (entryIndex<(
unsigned long)lst->size())
3739 optionValue += lst->at(entryIndex);
3741 index=newIndex+matchLen;
3743 optionValue+=lstFormat.substr(index);
3748 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Obsolete setting for '{:c}{}': '{}'",
3749 cmdChar,cmdName,
parser()->context.token->name);
3753 "Disabled setting (i.e. not supported in this doxygen executable) for '{:c}{}': '{}'",
3754 cmdChar,cmdName,
parser()->context.token->name);
3767 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option for '{:c}{}': '{}'",
3768 cmdChar,cmdName,
parser()->context.token->name);
3778 ASSERT(retval.
is(TokenRetval::TK_WHITESPACE));
3781 if (retval.
is(TokenRetval::RetVal_OK))
3802 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3810 if (!tok.
is(TokenRetval::TK_WORD))
3824 bool specDateOnlyWS = !specDateRaw.
isEmpty() && specDate.
isEmpty();
3825 if (!specDate.
isEmpty() && !tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3827 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}'",
3838 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}': {}",
3839 cmdChar,cmdName,
err);
3851 if ((usedFormat&bitMask) && !(specFormat&bitMask))
3853 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.",
3871 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3880 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3882 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3883 "argument of command {}", saveCmdName);
3886 else if (!tok.
is(TokenRetval::TK_WORD))
3910 (!n1_docIncOp && !n1_docWs) ||
3911 (n1_docWs && n2 && !n2_docIncOp);
3916 n1_docIncOp->markLast(
false);
3918 else if (n1_docWs && n2_docIncOp)
3931 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3940 if (!tok.
is(TokenRetval::TK_WORD))
3967 AUTO_TRACE(
"cmdName={} isJavaLink={}",cmdName,isJavaLink);
3970 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3978 if (!tok.
is(TokenRetval::TK_WORD))
3984 if (saveCmdName ==
"javalink")
3993 if (saveCmdName ==
"javalink")
3999 QCString leftOver = lnk->parse(isJavaLink);
4011 bool isBlock =
false;
4012 bool trimLeft =
false;
4013 bool localScope =
false;
4015 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
4021 auto contains = [&optList](
const char *kw)
4023 return std::find(optList.begin(),optList.end(),kw)!=optList.end();
4025 localScope = contains(
"local");
4026 if (contains(
"nostrip"))
4028 stripCodeComments =
false;
4030 else if (contains(
"strip"))
4032 stripCodeComments =
true;
4039 if (contains(
"lineno"))
4046 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4053 else if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"[")
4061 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
4070 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4072 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4073 "argument of command {}",saveCmdName);
4076 else if (!tok.
is(TokenRetval::TK_WORD))
4090 if (!tok.
is(TokenRetval::TK_WORD))
4092 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected block identifier, but found token {} instead while parsing the {} command",
4107 blockId,isBlock,trimLeft);
4117 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4120 cmdChar,saveCmdName);
4124 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4126 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4127 "argument of command '{:c}{}'", cmdChar,saveCmdName);
4130 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
4147 return retval.is(TokenRetval::RetVal_OK) ? Token::make_TK_NEWPARA() : retval;
4169 if (
parser()->context.xmlComment)
4175 while (i<l && (
parser()->context.token->verb.at(i)==
' ' ||
parser()->context.token->verb.at(i)==
'\n'))
4177 if (
parser()->context.token->verb.at(i)==
'\n') li=i+1;
4187 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4198 if (
parser()->context.memberDef)
4236 Token retval = Token::make_RetVal_OK();
4242 std::string str{cmdChar};
4246 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Found unexpanded alias '{:c}{}'. Check if number of arguments passed is correct.",cmdChar,cmdName);
4395 retval = Token::make_RetVal_Section();
4401 retval = Token::make_RetVal_Subsection();
4407 retval = Token::make_RetVal_Subsubsection();
4413 retval = Token::make_RetVal_Paragraph();
4419 retval = Token::make_RetVal_SubParagraph();
4425 retval = Token::make_RetVal_SubSubParagraph();
4445 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4457 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4469 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4481 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4493 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4505 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4519 int idx = fullMatch.
find(
'{');
4520 int idxEnd = fullMatch.
find(
"}",idx+1);
4526 for (
const auto &opt : optList)
4528 if (opt.empty())
continue;
4531 if (locOpt ==
"code")
4537 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option '{}' for '\\iliteral'",opt);
4545 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4553 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"javadoc literal section ended without end marker");
4572 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4593 dv->setText(
parser()->context.token->verb);
4594 dv->setWidth(width);
4595 dv->setHeight(height);
4596 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4599 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\dot command because HAVE_DOT is not set");
4602 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4623 dv->setText(
parser()->context.token->verb);
4624 dv->setWidth(width);
4625 dv->setHeight(height);
4626 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4627 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4641 int idx = fullMatch.
find(
'{');
4642 int idxEnd = fullMatch.
find(
"}",idx+1);
4649 for (
const auto &opt : optList)
4651 if (opt.empty())
continue;
4659 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple definition of engine for '\\startuml'");
4672 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple use of filename for '\\startuml'");
4681 if (engine.
isEmpty()) engine =
"uml";
4687 assert(retval.is(TokenRetval::RetVal_OK));
4708 if (engine ==
"ditaa")
4710 dv->setUseBitmap(
true);
4712 else if (engine ==
"uml")
4714 int i = trimmedVerb.
find(
'\n');
4715 QCString firstLine = i==-1 ? trimmedVerb : trimmedVerb.
left(i);
4718 dv->setText(trimmedVerb);
4719 dv->setWidth(width);
4720 dv->setHeight(height);
4721 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4724 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
4727 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4740 int idx = fullMatch.
find(
'{');
4741 int idxEnd = fullMatch.
find(
"}",idx+1);
4755 assert(retval.is(TokenRetval::RetVal_OK));
4775 dv->setText(trimmedVerb);
4776 dv->setWidth(width);
4777 dv->setHeight(height);
4778 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4779 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4787 retval = Token::make_RetVal_EndParBlock();
4848 retval = Token::make_RetVal_Internal();
4851 retval = Token::make_RetVal_EndInternal();
4920 "ignoring \\dotfile command because HAVE_DOT is not set");
5012 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command '{}' in paragraph context",cmdName);
5015 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_OK,TokenRetval::RetVal_SimpleSec
5016 TokenRetval::TK_LISTITEM,TokenRetval::TK_ENDLIST,TokenRetval::TK_NEWPARA
5017 TokenRetval::RetVal_Section,TokenRetval::RetVal_EndList
5018 TokenRetval::RetVal_Internal,TokenRetval::RetVal_SwitchLang
5019 TokenRetval::RetVal_EndInternal)
5026 const char *attrName,
5030 for (
const auto &opt : tagHtmlAttribs)
5032 if (opt.name==attrName)
5034 *result = opt.value;
5043 AUTO_TRACE(
"tagName={} #tagHtmlAttrs={}",tagName,tagHtmlAttribs.size());
5044 Token retval = Token::make_RetVal_OK();
5050 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"HTML tag ('<{}/>') may not use the 'empty tag' XHTML syntax.",
5056 if (!
parser()->context.token->emptyTag)
5064 if (!
parser()->context.token->emptyTag)
5072 if (
parser()->context.token->emptyTag)
break;
5079 retval = Token::make_RetVal_ListItem();
5101 if (
parser()->context.token->emptyTag)
break;
5102 if (
parser()->context.xmlComment)
5147 if (
parser()->context.token->emptyTag)
break;
5153 retval = Token::make_TK_NEWPARA();
5156 if (!
parser()->context.token->emptyTag)
5165 retval = Token::make_RetVal_DescTitle();
5175 retval = Token::make_RetVal_DescData();
5183 if (!
parser()->context.token->emptyTag)
5191 retval = Token::make_RetVal_TableRow();
5194 retval = Token::make_RetVal_TableCell();
5197 retval = Token::make_RetVal_TableHCell();
5244 if (!
parser()->context.token->emptyTag)
5251 if (!
parser()->context.token->emptyTag)
5261 if (!
parser()->context.token->emptyTag)
5264 while (n && !std::holds_alternative<DocHtmlDetails>(*n)) n=
::parent(n);
5274 retval = Token::make_TK_NEWPARA();
5288 retval = Token::make_TK_NEWPARA();
5294 retval = Token::make_RetVal_TableCell();
5364 retval = Token::make_RetVal_TableRow();
5368 retval = Token::make_RetVal_ListItem();
5383 retval = Token::make_RetVal_TableCell();
5397 if (
parser()->context.token->emptyTag)
5411 if (!leftOver.isEmpty())
5429 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing 'cref' or 'langword' attribute from <see> tag.");
5457 std::get<DocSimpleSect>(*vss).appendLinkWord(cref);
5458 retval = Token::make_RetVal_OK();
5515 Token retval = Token::make_RetVal_OK();
5525 retval = Token::make_RetVal_EndList();
5535 retval = Token::make_RetVal_EndList();
5551 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </details> tag without matching <details>");
5555 retval = Token::make_RetVal_EndHtmlDetails();
5561 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </blockquote> tag without matching <blockquote>");
5565 retval = Token::make_RetVal_EndBlockQuote();
5625 retval = Token::make_TK_NEWPARA();
5628 retval = Token::make_RetVal_EndDesc();
5637 retval = Token::make_RetVal_EndTable();
5640 retval = Token::make_RetVal_EndTableRow();
5643 retval = Token::make_RetVal_EndTableCell();
5646 retval = Token::make_RetVal_EndTableCell();
5690 retval = Token::make_TK_NEWPARA();
5704 retval = Token::make_RetVal_CloseXml();
5740 if (!std::get_if<DocAutoListItem>(n))
5748 const auto docAutoList = std::get_if<DocAutoList>(n);
5751 indent = docAutoList->indent();
5760 const auto docPara = std::get_if<DocPara>(n);
5766 return std::get<DocStyleChange>(*stack.top());
5776 indentStr.
fill(
' ',indent);
5791 Token retval = Token::make_TK_NONE();
5792 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
5796 if (tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD,TokenRetval::TK_SYMBOL,TokenRetval::TK_URL,
5797 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS,TokenRetval::TK_HTMLTAG)
5804 case TokenRetval::TK_WORD:
5807 case TokenRetval::TK_LNKWORD:
5810 case TokenRetval::TK_URL:
5813 case TokenRetval::TK_WHITESPACE:
5831 case TokenRetval::TK_LISTITEM:
5835 while (n && !std::holds_alternative<DocAutoList>(*n)) n=
::parent(n);
5836 const DocAutoList *al = std::get_if<DocAutoList>(n);
5843 retval = Token::make_TK_LISTITEM();
5853 al = std::get_if<DocAutoList>(n);
5867 }
while (retval.
is(TokenRetval::TK_LISTITEM) &&
5872 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5878 if (
parser()->context.token->name.startsWith(
"rcs:"))
5882 tok = Token::make_TK_RCSTAG();
5886 tok = Token::make_TK_COMMAND_BS();
5891 else if (retval.
is(TokenRetval::TK_ENDLIST))
5907 case TokenRetval::TK_ENDLIST:
5908 AUTO_TRACE_ADD(
"Found end of list inside of paragraph at line {}",
parser()->tokenizer.getLineNr());
5909 if (std::get_if<DocAutoListItem>(
parent()))
5912 if (al && al->
indent()>=
parser()->context.token->indent)
5915 retval = Token::make_TK_ENDLIST();
5921 "has invalid indent level");
5930 case TokenRetval::TK_COMMAND_AT:
5932 case TokenRetval::TK_COMMAND_BS:
5937 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5938 !std::holds_alternative<DocParamSect>(*n))
5949 retval = Token::make_RetVal_SimpleSec();
5955 while (n && !std::holds_alternative<DocSimpleListItem>(*n)) n=
::parent(n);
5960 retval = Token::make_RetVal_ListItem();
5970 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5976 if (
parser()->context.token->name.startsWith(
"rcs:"))
5980 tok = Token::make_TK_RCSTAG();
5984 tok = Token::make_TK_COMMAND_BS();
5989 else if (retval.
value()>TokenRetval::TK_NONE && retval.
value()<TokenRetval::RetVal_OK)
5995 else if (retval.
value()!=TokenRetval::RetVal_OK)
6002 case TokenRetval::TK_HTMLTAG:
6004 if (!
parser()->context.token->endTag)
6016 if (!retval.
is(TokenRetval::RetVal_OK))
6022 case TokenRetval::TK_SYMBOL:
6033 parser()->context.token->name);
6037 case TokenRetval::TK_NEWPARA:
6038 retval = Token::make_TK_NEWPARA();
6040 case TokenRetval::TK_RCSTAG:
6043 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
6044 !std::holds_alternative<DocParamSect>(*n))
6054 retval = Token::make_RetVal_SimpleSec();
6065 "Found unexpected token (id={})",tok.
to_string());
6070 retval=Token::make_TK_NONE();
6073 DocPara *par = std::get_if<DocPara>(
parser()->context.nodeStack.top());
6074 if (!
parser()->context.token->endTag && par &&
6075 retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->name.lower() ==
"p")
6079 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::TK_NEWPARA,TokenRetval::TK_LISTITEM,
6080 TokenRetval::TK_ENDLIST,TokenRetval::RetVal_OK)
6092 Token retval = Token::make_RetVal_OK();
6095 if (!
m_id.isEmpty())
6117 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6118 retval=par->parse();
6119 if (!par->isEmpty())
6128 if (retval.
is(TokenRetval::TK_LISTITEM))
6132 if (retval.
is(TokenRetval::RetVal_Internal))
6136 if (retval.is(TokenRetval::RetVal_EndInternal))
6138 retval = Token::make_RetVal_OK();
6141 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6142 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6143 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6150 if (retval.
is(TokenRetval::RetVal_Subsection) &&
m_level<=1)
6153 while (retval.
is(TokenRetval::RetVal_Subsection))
6162 else if (retval.
is(TokenRetval::RetVal_Subsubsection) &&
m_level<=2)
6168 parser()->tokenizer.getLineNr(),
6169 "Unexpected subsubsection command found inside {}!",
6173 while (retval.
is(TokenRetval::RetVal_Subsubsection))
6180 if (!(
m_level < 2 && retval.
is(TokenRetval::RetVal_Subsection)))
break;
6182 else if (retval.
is(TokenRetval::RetVal_Paragraph) &&
m_level<=3)
6188 "Unexpected paragraph command found inside {}!",
6192 while (retval.
is(TokenRetval::RetVal_Paragraph))
6199 if (!(
m_level<3 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection))))
break;
6201 else if (retval.
is(TokenRetval::RetVal_SubParagraph) &&
m_level<=4)
6207 "Unexpected subparagraph command found inside {}!",
6211 while (retval.
is(TokenRetval::RetVal_SubParagraph))
6218 if (!(
m_level<4 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph))))
break;
6220 else if (retval.
is(TokenRetval::RetVal_SubSubParagraph) &&
m_level<=5)
6226 "Unexpected subsubparagraph command found inside {}!",
6230 while (retval.
is(TokenRetval::RetVal_SubSubParagraph))
6237 if (!(
m_level<5 && (retval.
is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6238 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph))))
break;
6247 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6248 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6249 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6250 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6266 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
6270 case TokenRetval::TK_WORD:
6273 case TokenRetval::TK_WHITESPACE:
6276 case TokenRetval::TK_SYMBOL:
6286 parser()->context.token->name);
6290 case TokenRetval::TK_COMMAND_AT:
6292 case TokenRetval::TK_COMMAND_BS:
6354 parser()->context.token->name);
6378 Token retval = Token::make_TK_NONE();
6388 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6389 retval=par->parse();
6390 if (par->isEmpty() && par->attribs().empty())
6399 auto checkParagraph = [
this,&retval](
Token t,
int level,
const char *sectionType,
const char *parentSectionType) {
6405 parser()->tokenizer.getLineNr(),
6406 "found {} command (id: '{}') outside of {} context!",
6407 sectionType,
parser()->context.token->sectionId,parentSectionType);
6411 if (!
parser()->context.token->sectionId.isEmpty())
6424 sectionType,
parser()->context.token->sectionId,sectionType);
6425 retval = Token::make_TK_NONE();
6430 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing id for {}; ignoring {}",sectionType,sectionType);
6431 retval = Token::make_TK_NONE();
6436 checkParagraph(Token::make_RetVal_SubSubParagraph(), 6,
"subsubparagraph",
"subparagraph" );
6437 checkParagraph(Token::make_RetVal_SubParagraph(), 5,
"subparagraph",
"paragraph" );
6438 checkParagraph(Token::make_RetVal_Paragraph(), 4,
"paragraph",
"subsubsection" );
6439 checkParagraph(Token::make_RetVal_Subsubsection(), 3,
"subsubsection",
"subsection" );
6440 checkParagraph(Token::make_RetVal_Subsection(), 2,
"subsection",
"section" );
6442 if (retval.
is(TokenRetval::TK_LISTITEM))
6446 if (retval.
is(TokenRetval::RetVal_Internal))
6451 }
while (!retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_Section));
6456 while (retval.
is(TokenRetval::RetVal_Section))
6458 if (!
parser()->context.token->sectionId.isEmpty())
6471 retval = Token::make_TK_NONE();
6477 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)
DocMermaidFile(DocParser *parser, DocNodeVariant *parent, const QCString &name, const QCString &context, const QCString &srcFile, int srcLine)
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)
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)
bool defaultHandleToken(DocNodeVariant *parent, Token &tok, DocNodeList &children, bool handleWord=TRUE)
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 setStateMermaidOpt()
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 * mermaidFileNameLinkedMap
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, DocMermaidFile > 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,...
Parser's context to store all global variables.
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.