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
1467 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1479 Token retval(TokenRetval::TK_NONE);
1490 retval=par->
parse();
1492 while (retval.
is(TokenRetval::TK_NEWPARA));
1495 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1497 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <details> block");
1508 return retval.
is(TokenRetval::RetVal_EndHtmlDetails) ? Token::make_RetVal_OK() : retval;
1524 Token retval(TokenRetval::RetVal_OK);
1528 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1532 switch (tok.
value())
1534 case TokenRetval::TK_HTMLTAG:
1547 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <a href=...> context",
1548 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
1559 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1562 " <a href=...> tag");
1574 Token retval(TokenRetval::RetVal_OK);
1584 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
1585 retval=par->parse();
1586 if (!par->isEmpty())
1595 if (retval.
is(TokenRetval::TK_LISTITEM))
1599 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
1600 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
1601 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
1602 TokenRetval::RetVal_EndInternal));
1606 while ((level==1 && retval.
is(TokenRetval::RetVal_Section)) ||
1607 (level==2 && retval.
is(TokenRetval::RetVal_Subsection)) ||
1608 (level==3 && retval.
is(TokenRetval::RetVal_Subsubsection)) ||
1609 (level==4 && retval.
is(TokenRetval::RetVal_Paragraph)) ||
1610 (level==5 && retval.
is(TokenRetval::RetVal_SubParagraph)) ||
1611 (level==6 && retval.
is(TokenRetval::RetVal_SubSubParagraph))
1620 if (retval.
is(TokenRetval::RetVal_Internal))
1622 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"\\internal command found inside internal section");
1634 Token retval(TokenRetval::RetVal_OK);
1637 if (!tok.
is(TokenRetval::TK_WHITESPACE))
1645 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1647 switch (tok.
value())
1649 case TokenRetval::TK_WHITESPACE:
1652 case TokenRetval::TK_WORD:
1653 case TokenRetval::TK_LNKWORD:
1656 case TokenRetval::TK_SYMBOL:
1678 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected symbol '{}' found as argument of \\addindex",
parser()->context.token->name);
1683 case TokenRetval::TK_COMMAND_AT:
1685 case TokenRetval::TK_COMMAND_BS:
1707 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command {} found as argument of \\addindex",
1708 parser()->context.token->name);
1732 for (
const auto &opt :
attribs)
1734 if (opt.name==
"id" && !opt.value.isEmpty())
1759 Token retval = Token::make_TK_NONE();
1762 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1766 switch (tok.
value())
1768 case TokenRetval::TK_HTMLTAG:
1773 retval = Token::make_RetVal_OK();
1778 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <caption> context",
1779 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
1790 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1805 Token retval = Token::make_RetVal_OK();
1816 retval=par->
parse();
1817 if (retval.
is(TokenRetval::TK_HTMLTAG))
1822 retval = Token::make_TK_NEWPARA();
1826 retval = Token::make_TK_NEWPARA();
1830 while (retval.
is_any_of(TokenRetval::TK_NEWPARA,TokenRetval::RetVal_EndParBlock));
1839 Token retval = Token::make_RetVal_OK();
1850 retval=par->
parse();
1851 if (retval.
is(TokenRetval::TK_HTMLTAG))
1856 retval = Token::make_TK_NEWPARA();
1860 retval = Token::make_TK_NEWPARA();
1864 while (retval.
is(TokenRetval::TK_NEWPARA));
1872 for (
const auto &attr :
attribs())
1874 if (attr.name.lower()==
"rowspan")
1876 return attr.value.toUInt();
1884 for (
const auto &attr :
attribs())
1886 if (attr.name.lower()==
"colspan")
1888 return std::max(1u,attr.value.toUInt());
1896 for (
const auto &attr :
attribs())
1900 if (attrName==
"align")
1902 if (attrValue==
"center")
1904 else if (attrValue==
"right")
1908 else if (attrName==
"class" && attrValue.
startsWith(
"markdowntable"))
1910 if (attrValue==
"markdowntableheadcenter")
1912 else if (attrValue==
"markdowntableheadright")
1914 else if (attrValue==
"markdowntableheadleft")
1916 else if (attrValue==
"markdowntableheadnone")
1918 else if (attrValue==
"markdowntablebodycenter")
1920 else if (attrValue==
"markdowntablebodyright")
1922 else if (attrValue==
"markdowntablebodyleft")
1924 else if (attrValue==
"markdowntablebodynone")
1934 for (
const auto &attr :
attribs())
1938 if (attrName==
"valign")
1940 if (attrValue==
"top")
1942 else if (attrValue==
"bottom")
1944 else if (attrValue==
"middle")
1959 const DocHtmlCell *cell = std::get_if<DocHtmlCell>(&n);
1975 while (tok.
is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA,TokenRetval::TK_HTMLTAG,
1976 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS))
1978 if (tok.
is(TokenRetval::TK_HTMLTAG))
1994 else if (tok.
is(TokenRetval::TK_COMMAND_AT) || tok.
is(TokenRetval::TK_COMMAND_BS))
2004 if (!tok.
is(TokenRetval::TK_WORD))
2032 Token retval = Token::make_RetVal_OK();
2041 if (tok.
is(TokenRetval::TK_HTMLTAG))
2054 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2059 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2062 " for a html description title");
2067 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td> or <th> tag but found {} token instead!",
2081 retval=cell->
parse();
2082 isHeading = retval.
is(TokenRetval::RetVal_TableHCell);
2084 if (retval.
is(TokenRetval::RetVal_EndTableCell))
2090 if (tok.
is(TokenRetval::TK_HTMLTAG))
2093 !
parser()->context.token->endTag)
2095 retval = Token::make_RetVal_TableCell();
2100 if (
parser()->context.token->endTag)
2102 retval = Token::make_RetVal_EndTableRow();
2106 retval = Token::make_RetVal_TableRow();
2111 retval = Token::make_RetVal_EndTable();
2116 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2123 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td>, <th> or <tr> tag but found {} token instead!",
2129 while (retval.
is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2139 Token retval = Token::make_RetVal_OK();
2150 if (tok.
is(TokenRetval::TK_HTMLTAG))
2162 "found <{}> instead!",
parser()->context.token->name);
2167 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2170 " for a html description title");
2175 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td> or <th> tag but found {} token instead!",
2188 while (retval.
is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2212 const DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2225 Token retval = Token::make_RetVal_OK();
2232 if (tok.
is(TokenRetval::TK_HTMLTAG))
2238 retval = Token::make_RetVal_TableRow();
2249 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2251 if (retval.
is(TokenRetval::RetVal_OK))
2260 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2263 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2266 " for a <tr> or <caption> tag");
2275 while (retval.
is(TokenRetval::RetVal_TableRow))
2280 if (retval.is(TokenRetval::RetVal_EndTableRow))
2288 retval = Token::make_RetVal_TableRow();
2292 retval = Token::make_RetVal_EndTable();
2294 else if (retval.is(TokenRetval::TK_HTMLTAG))
2297 "found <{}> instead!",
parser()->context.token->name);
2303 "found token {} instead!",retval.to_string());
2304 retval=Token::make_RetVal_OK();
2312 return retval.
is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2318 Token retval = Token::make_RetVal_OK();
2327 bool isHeader=
FALSE;
2328 if (tok.
is(TokenRetval::TK_HTMLTAG))
2333 retval = Token::make_RetVal_TableRow();
2337 retval = Token::make_RetVal_TableRow();
2343 while (retval.
is(TokenRetval::RetVal_TableRow))
2347 retval=tr->parseXml(isHeader);
2382 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2385 for (
auto &cellNode : row->
children())
2387 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2390 uint32_t rs = cell->
rowSpan();
2391 uint32_t cs = cell->
colSpan();
2393 for (
size_t i=0;i<rowSpans.size();i++)
2395 if (rowSpans[i].rowsLeft>0 &&
2396 rowSpans[i].column==colIdx)
2398 colIdx=rowSpans[i].column+1;
2402 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2410 for (
size_t i=0;i<rowSpans.size();i++)
2412 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2418 if (colIdx-1>maxCols) maxCols=colIdx-1;
2428 Token retval = Token::make_TK_NONE();
2432 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
2436 switch (tok.
value())
2438 case TokenRetval::TK_COMMAND_AT:
2440 case TokenRetval::TK_COMMAND_BS:
2443 bool isJavaLink=
FALSE;
2449 if (!tok.
is(TokenRetval::TK_WHITESPACE))
2458 if (!tok.
is(TokenRetval::TK_WORD))
2460 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} as the argument of '{:c}{}' command",
2478 if (!tok.
is(TokenRetval::TK_WHITESPACE))
2487 if (!tok.
is(TokenRetval::TK_WORD))
2489 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} as the argument of \\{} command",
2497 QCString leftOver = lnk->parse(isJavaLink);
2498 if (!leftOver.isEmpty())
2512 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Illegal command '{:c}{}' found as part of a <dt> tag",
2517 case TokenRetval::TK_SYMBOL:
2518 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unsupported symbol '{}' found as part of a <dt> tag",
2519 parser()->context.token->name);
2521 case TokenRetval::TK_HTMLTAG:
2526 retval = Token::make_RetVal_DescData();
2536 retval = Token::make_RetVal_DescTitle();
2541 retval = Token::make_RetVal_EndDesc();
2546 if (!
parser()->context.token->endTag)
2557 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <dt> context",
2558 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
2570 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2587 Token retval = Token::make_TK_NONE();
2597 retval=par->
parse();
2599 while (retval.
is(TokenRetval::TK_NEWPARA));
2610 Token retval = Token::make_RetVal_OK();
2618 if (tok.
is(TokenRetval::TK_HTMLTAG))
2628 "found <{}> instead!",
parser()->context.token->name);
2633 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2636 " for a html description title");
2653 if (retval.is(TokenRetval::RetVal_DescData))
2656 while (retval.is(TokenRetval::RetVal_DescData))
2663 else if (!retval.is(TokenRetval::RetVal_DescTitle))
2668 }
while (retval.
is(TokenRetval::RetVal_DescTitle));
2670 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2672 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <dl> block");
2677 return retval.
is(TokenRetval::RetVal_EndDesc) ? Token::make_RetVal_OK() : retval;
2685 Token retval = Token::make_TK_NONE();
2696 retval=par->
parse();
2698 while (retval.
is(TokenRetval::TK_NEWPARA));
2708 Token retval = Token::make_TK_NONE();
2719 retval=par->
parse();
2720 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
2724 if (retval.
is(TokenRetval::RetVal_ListItem))
2729 while (!retval.
is(TokenRetval::RetVal_CloseXml));
2742 Token retval = Token::make_RetVal_OK();
2751 if (tok.
is(TokenRetval::TK_HTMLTAG))
2760 ) &&
parser()->context.token->endTag
2766 retval = Token::make_RetVal_EndList();
2774 "found <{}{}> instead!",
parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
2779 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2784 " for a html list item");
2801 }
while (retval.
is(TokenRetval::RetVal_ListItem));
2803 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2805 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <{:c}l> block",
2811 return retval.
is(TokenRetval::RetVal_EndList) ? Token::make_RetVal_OK() : retval;
2817 Token retval = Token::make_RetVal_OK();
2826 if (tok.
is(TokenRetval::TK_HTMLTAG))
2837 "found <{}> instead!",
parser()->context.token->name);
2842 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2845 " for a html list item");
2859 retval=li->parseXml();
2860 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
2862 }
while (retval.
is(TokenRetval::RetVal_ListItem));
2864 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2866 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <list type=\"{}\"> block",
2872 return (retval.
is_any_of(TokenRetval::RetVal_EndList,TokenRetval::RetVal_CloseXml) ||
parser()->context.token->name==
"list") ?
2873 Token::make_RetVal_OK() : retval;
2881 Token retval = Token::make_TK_NONE();
2892 retval=par->
parse();
2894 while (retval.
is(TokenRetval::TK_NEWPARA));
2897 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2899 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <blockquote> block");
2903 return retval.
is(TokenRetval::RetVal_EndBlockQuote) ? Token::make_RetVal_OK() : retval;
2911 Token retval = Token::make_TK_NONE();
2922 retval=par->
parse();
2924 while (retval.
is(TokenRetval::TK_NEWPARA));
2928 return retval.
is(TokenRetval::RetVal_EndBlockQuote) ? Token::make_RetVal_OK() : retval;
2955 Token rv = Token::make_TK_NONE();
2961 }
while (rv.
is(TokenRetval::RetVal_ListItem));
2962 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
2975 Token retval = Token::make_RetVal_OK();
2985 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
2986 retval=par->parse();
2987 if (!par->isEmpty())
2998 }
while (retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->indent>
m_indent);
3017 Token retval = Token::make_RetVal_OK();
3024 switch (
parser()->context.token->id)
3046 while (retval.
is(TokenRetval::TK_LISTITEM) &&
3050 (
parser()->context.token->id==-1 ||
parser()->context.token->id>=num)
3067 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
3099 return m_title && std::get<DocTitle>(*m_title).hasTitle();
3111 std::get_if<DocTitle>(
m_title.get())->parse();
3115 if (!
children().empty() && std::holds_alternative<DocPara>(
children().back()))
3133 Token retval = par->parse();
3153 return Token::make_RetVal_OK();
3161 Token retval = Token::make_RetVal_OK();
3165 if (!
children().empty() && std::holds_alternative<DocPara>(
children().back()))
3167 std::get<DocPara>(
children().back()).markLast(
false);
3179 retval = par->parse();
3180 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3181 if (retval.
is(TokenRetval::RetVal_CloseXml))
3183 retval = Token::make_RetVal_OK();
3195 if (
children().empty() || (p=std::get_if<DocPara>(&
children().back()))==
nullptr)
3217 case See:
return "see";
3218 case Return:
return "return";
3220 case Authors:
return "author";
3221 case Version:
return "version";
3222 case Since:
return "since";
3223 case Date:
return "date";
3224 case Note:
return "note";
3225 case Warning:
return "warning";
3226 case Pre:
return "pre";
3227 case Post:
return "post";
3229 case Invar:
return "invariant";
3230 case Remark:
return "remark";
3233 case User:
return "user";
3234 case Rcs:
return "rcs";
3244 Token retval = Token::make_RetVal_OK();
3250 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3254 retval = Token::make_RetVal_EndParBlock();
3259 while (tok.
is(TokenRetval::TK_WORD))
3264 if (typeSeparator!=-1)
3270 if (
parent() && std::holds_alternative<DocParamSect>(*
parent()))
3272 std::get<DocParamSect>(*
parent()).m_hasTypeSpecifier=
true;
3291 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3293 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3294 "argument of command {}",saveCmdName);
3295 retval = Token::make_RetVal_EndParBlock();
3298 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3300 if (!tok.
is(TokenRetval::TK_NEWPARA))
3302 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} in comment block while parsing the "
3303 "argument of command {}",tok.
to_string(),saveCmdName);
3305 retval = Token::make_RetVal_EndParBlock();
3311 retval = par->
parse();
3323 Token retval = Token::make_RetVal_OK();
3344 retval = par->parse();
3366 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3368 }
while (retval.
is(TokenRetval::RetVal_CloseXml) &&
3373 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3379 retval = Token::make_RetVal_OK();
3391 Token retval = Token::make_RetVal_OK();
3399 if (!
children().empty() && std::holds_alternative<DocParamList>(
children().back()))
3414 retval = pl->parseXml(cmdName);
3418 retval = pl->parse(cmdName);
3420 if (retval.
is(TokenRetval::RetVal_EndParBlock))
3422 retval = Token::make_RetVal_OK();
3441 bool needsSeparator =
FALSE;
3443 (ss=
children().get_last<DocSimpleSect>()) &&
3448 needsSeparator =
TRUE;
3455 Token rv = Token::make_RetVal_OK();
3464 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3469 bool xmlContext=
FALSE,
3475 (ps=
children().get_last<DocParamSect>()) &&
3487 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3498 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
3503 for (
auto const &opt : optList)
3505 if (opt ==
"number")
3509 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3516 else if (opt ==
"year")
3520 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3527 else if (opt ==
"shortauthor")
3531 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3538 else if (opt ==
"nopar")
3542 else if (opt ==
"nocite")
3548 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3556 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3563 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
3566 cmdChar,saveCmdName);
3576 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3578 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"THE ONE unexpected end of comment block while parsing the "
3579 "argument of command '{:c}{}'",cmdChar,saveCmdName);
3582 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3600 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3608 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3610 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"no emoji name given or unexpected end of comment block while parsing the "
3611 "argument of command '{:c}{}'",cmdChar,cmdName);
3615 else if (!tok.
is(TokenRetval::TK_WORD))
3630 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3638 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3640 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3641 "argument of command '{:c}{}'",cmdChar,cmdName);
3644 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3654 switch (opt->
kind())
3674 std::string lstFormat =
theTranslator->trWriteList(
static_cast<int>(lst->size())).str();
3675 static const reg::Ex marker(R
"(@(\d+))");
3680 for ( ; it!=
end ; ++it)
3682 const auto &match = *it;
3683 size_t newIndex = match.position();
3684 size_t matchLen = match.length();
3685 optionValue += lstFormat.substr(index,newIndex-index);
3686 unsigned long entryIndex = std::stoul(match[1].str());
3687 if (entryIndex<(
unsigned long)lst->size())
3689 optionValue += lst->at(entryIndex);
3691 index=newIndex+matchLen;
3693 optionValue+=lstFormat.substr(index);
3698 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Obsolete setting for '{:c}{}': '{}'",
3699 cmdChar,cmdName,
parser()->context.token->name);
3703 "Disabled setting (i.e. not supported in this doxygen executable) for '{:c}{}': '{}'",
3704 cmdChar,cmdName,
parser()->context.token->name);
3717 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option for '{:c}{}': '{}'",
3718 cmdChar,cmdName,
parser()->context.token->name);
3728 ASSERT(retval.
is(TokenRetval::TK_WHITESPACE));
3731 if (retval.
is(TokenRetval::RetVal_OK))
3752 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3760 if (!tok.
is(TokenRetval::TK_WORD))
3774 bool specDateOnlyWS = !specDateRaw.
isEmpty() && specDate.
isEmpty();
3775 if (!specDate.
isEmpty() && !tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3777 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}'",
3788 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}': {}",
3789 cmdChar,cmdName,
err);
3801 if ((usedFormat&bitMask) && !(specFormat&bitMask))
3803 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.",
3821 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3830 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3832 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3833 "argument of command {}", saveCmdName);
3836 else if (!tok.
is(TokenRetval::TK_WORD))
3860 (!n1_docIncOp && !n1_docWs) ||
3861 (n1_docWs && n2 && !n2_docIncOp);
3866 n1_docIncOp->markLast(
false);
3868 else if (n1_docWs && n2_docIncOp)
3881 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3890 if (!tok.
is(TokenRetval::TK_WORD))
3917 AUTO_TRACE(
"cmdName={} isJavaLink={}",cmdName,isJavaLink);
3920 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3928 if (!tok.
is(TokenRetval::TK_WORD))
3934 if (saveCmdName ==
"javalink")
3943 if (saveCmdName ==
"javalink")
3949 QCString leftOver = lnk->parse(isJavaLink);
3961 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3964 cmdChar,
qPrint(saveCmdName));
3968 class AutoRestoreState
3972 ~AutoRestoreState() {
m_parser->tokenizer.setStatePara(); }
3976 AutoRestoreState rs(
parser());
3978 if (!tok.
is(TokenRetval::TK_WORD))
3997 bool isBlock =
false;
3998 bool trimLeft =
false;
3999 bool localScope =
false;
4001 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
4007 auto contains = [&optList](
const char *kw)
4009 return std::find(optList.begin(),optList.end(),kw)!=optList.end();
4011 localScope = contains(
"local");
4012 if (contains(
"nostrip"))
4014 stripCodeComments =
false;
4016 else if (contains(
"strip"))
4018 stripCodeComments =
true;
4025 if (contains(
"lineno"))
4032 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4039 else if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"[")
4047 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
4056 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4058 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4059 "argument of command {}",saveCmdName);
4062 else if (!tok.
is(TokenRetval::TK_WORD))
4076 if (!tok.
is(TokenRetval::TK_WORD))
4078 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected block identifier, but found token {} instead while parsing the {} command",
4093 blockId,isBlock,trimLeft);
4103 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4106 cmdChar,saveCmdName);
4110 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4112 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4113 "argument of command '{:c}{}'", cmdChar,saveCmdName);
4116 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
4133 return retval.is(TokenRetval::RetVal_OK) ? Token::make_TK_NEWPARA() : retval;
4155 if (
parser()->context.xmlComment)
4161 while (i<l && (
parser()->context.token->verb.at(i)==
' ' ||
parser()->context.token->verb.at(i)==
'\n'))
4163 if (
parser()->context.token->verb.at(i)==
'\n') li=i+1;
4173 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4184 if (
parser()->context.memberDef)
4222 Token retval = Token::make_RetVal_OK();
4228 std::string str{cmdChar};
4232 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Found unexpanded alias '{:c}{}'. Check if number of arguments passed is correct.",cmdChar,cmdName);
4381 retval = Token::make_RetVal_Section();
4387 retval = Token::make_RetVal_Subsection();
4393 retval = Token::make_RetVal_Subsubsection();
4399 retval = Token::make_RetVal_Paragraph();
4405 retval = Token::make_RetVal_SubParagraph();
4411 retval = Token::make_RetVal_SubSubParagraph();
4431 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4443 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4455 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4467 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4479 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4491 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4505 int idx = fullMatch.
find(
'{');
4506 int idxEnd = fullMatch.
find(
"}",idx+1);
4512 for (
const auto &opt : optList)
4514 if (opt.empty())
continue;
4517 if (locOpt ==
"code")
4523 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option '{}' for '\\iliteral'",opt);
4531 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4539 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"javadoc literal section ended without end marker");
4558 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4579 dv->setText(
parser()->context.token->verb);
4580 dv->setWidth(width);
4581 dv->setHeight(height);
4582 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4585 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\dot command because HAVE_DOT is not set");
4588 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4609 dv->setText(
parser()->context.token->verb);
4610 dv->setWidth(width);
4611 dv->setHeight(height);
4612 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4613 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4627 int idx = fullMatch.
find(
'{');
4628 int idxEnd = fullMatch.
find(
"}",idx+1);
4635 for (
const auto &opt : optList)
4637 if (opt.empty())
continue;
4645 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple definition of engine for '\\startuml'");
4658 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple use of filename for '\\startuml'");
4667 if (engine.
isEmpty()) engine =
"uml";
4673 assert(retval.is(TokenRetval::RetVal_OK));
4694 if (engine ==
"ditaa")
4696 dv->setUseBitmap(
true);
4698 else if (engine ==
"uml")
4700 int i = trimmedVerb.
find(
'\n');
4701 QCString firstLine = i==-1 ? trimmedVerb : trimmedVerb.
left(i);
4704 dv->setText(trimmedVerb);
4705 dv->setWidth(width);
4706 dv->setHeight(height);
4707 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4710 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
4713 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4721 retval = Token::make_RetVal_EndParBlock();
4784 retval = Token::make_RetVal_Internal();
4787 retval = Token::make_RetVal_EndInternal();
4856 "ignoring \\dotfile command because HAVE_DOT is not set");
4945 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command '{}' in paragraph context",cmdName);
4948 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_OK,TokenRetval::RetVal_SimpleSec
4949 TokenRetval::TK_LISTITEM,TokenRetval::TK_ENDLIST,TokenRetval::TK_NEWPARA
4950 TokenRetval::RetVal_Section,TokenRetval::RetVal_EndList
4951 TokenRetval::RetVal_Internal,TokenRetval::RetVal_SwitchLang
4952 TokenRetval::RetVal_EndInternal)
4959 const char *attrName,
4963 for (
const auto &opt : tagHtmlAttribs)
4965 if (opt.name==attrName)
4967 *result = opt.value;
4976 AUTO_TRACE(
"tagName={} #tagHtmlAttrs={}",tagName,tagHtmlAttribs.size());
4977 Token retval = Token::make_RetVal_OK();
4983 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"HTML tag ('<{}/>') may not use the 'empty tag' XHTML syntax.",
4989 if (!
parser()->context.token->emptyTag)
4997 if (!
parser()->context.token->emptyTag)
5005 if (
parser()->context.token->emptyTag)
break;
5012 retval = Token::make_RetVal_ListItem();
5034 if (
parser()->context.token->emptyTag)
break;
5035 if (
parser()->context.xmlComment)
5080 if (
parser()->context.token->emptyTag)
break;
5086 retval = Token::make_TK_NEWPARA();
5089 if (!
parser()->context.token->emptyTag)
5098 retval = Token::make_RetVal_DescTitle();
5108 retval = Token::make_RetVal_DescData();
5116 if (!
parser()->context.token->emptyTag)
5124 retval = Token::make_RetVal_TableRow();
5127 retval = Token::make_RetVal_TableCell();
5130 retval = Token::make_RetVal_TableHCell();
5177 if (!
parser()->context.token->emptyTag)
5184 if (!
parser()->context.token->emptyTag)
5194 if (!
parser()->context.token->emptyTag)
5197 while (n && !std::holds_alternative<DocHtmlDetails>(*n)) n=
::parent(n);
5207 retval = Token::make_TK_NEWPARA();
5221 retval = Token::make_TK_NEWPARA();
5227 retval = Token::make_RetVal_TableCell();
5297 retval = Token::make_RetVal_TableRow();
5301 retval = Token::make_RetVal_ListItem();
5316 retval = Token::make_RetVal_TableCell();
5330 if (
parser()->context.token->emptyTag)
5344 if (!leftOver.isEmpty())
5362 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing 'cref' or 'langword' attribute from <see> tag.");
5390 std::get<DocSimpleSect>(*vss).appendLinkWord(cref);
5391 retval = Token::make_RetVal_OK();
5448 Token retval = Token::make_RetVal_OK();
5458 retval = Token::make_RetVal_EndList();
5468 retval = Token::make_RetVal_EndList();
5484 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </details> tag without matching <details>");
5488 retval = Token::make_RetVal_EndHtmlDetails();
5494 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </blockquote> tag without matching <blockquote>");
5498 retval = Token::make_RetVal_EndBlockQuote();
5558 retval = Token::make_TK_NEWPARA();
5561 retval = Token::make_RetVal_EndDesc();
5570 retval = Token::make_RetVal_EndTable();
5573 retval = Token::make_RetVal_EndTableRow();
5576 retval = Token::make_RetVal_EndTableCell();
5579 retval = Token::make_RetVal_EndTableCell();
5623 retval = Token::make_TK_NEWPARA();
5637 retval = Token::make_RetVal_CloseXml();
5673 if (!std::get_if<DocAutoListItem>(n))
5681 const auto docAutoList = std::get_if<DocAutoList>(n);
5684 indent = docAutoList->indent();
5693 const auto docPara = std::get_if<DocPara>(n);
5699 return std::get<DocStyleChange>(*stack.top());
5709 indentStr.
fill(
' ',indent);
5724 Token retval = Token::make_TK_NONE();
5725 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
5729 if (tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD,TokenRetval::TK_SYMBOL,TokenRetval::TK_URL,
5730 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS,TokenRetval::TK_HTMLTAG)
5737 case TokenRetval::TK_WORD:
5740 case TokenRetval::TK_LNKWORD:
5743 case TokenRetval::TK_URL:
5746 case TokenRetval::TK_WHITESPACE:
5764 case TokenRetval::TK_LISTITEM:
5768 while (n && !std::holds_alternative<DocAutoList>(*n)) n=
::parent(n);
5769 const DocAutoList *al = std::get_if<DocAutoList>(n);
5776 retval = Token::make_TK_LISTITEM();
5786 al = std::get_if<DocAutoList>(n);
5800 }
while (retval.
is(TokenRetval::TK_LISTITEM) &&
5805 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5811 if (
parser()->context.token->name.startsWith(
"rcs:"))
5815 tok = Token::make_TK_RCSTAG();
5819 tok = Token::make_TK_COMMAND_BS();
5824 else if (retval.
is(TokenRetval::TK_ENDLIST))
5840 case TokenRetval::TK_ENDLIST:
5841 AUTO_TRACE_ADD(
"Found end of list inside of paragraph at line {}",
parser()->tokenizer.getLineNr());
5842 if (std::get_if<DocAutoListItem>(
parent()))
5845 if (al && al->
indent()>=
parser()->context.token->indent)
5848 retval = Token::make_TK_ENDLIST();
5854 "has invalid indent level");
5863 case TokenRetval::TK_COMMAND_AT:
5865 case TokenRetval::TK_COMMAND_BS:
5870 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5871 !std::holds_alternative<DocParamSect>(*n))
5882 retval = Token::make_RetVal_SimpleSec();
5888 while (n && !std::holds_alternative<DocSimpleListItem>(*n)) n=
::parent(n);
5893 retval = Token::make_RetVal_ListItem();
5903 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5909 if (
parser()->context.token->name.startsWith(
"rcs:"))
5913 tok = Token::make_TK_RCSTAG();
5917 tok = Token::make_TK_COMMAND_BS();
5922 else if (retval.
value()>TokenRetval::TK_NONE && retval.
value()<TokenRetval::RetVal_OK)
5928 else if (retval.
value()!=TokenRetval::RetVal_OK)
5935 case TokenRetval::TK_HTMLTAG:
5937 if (!
parser()->context.token->endTag)
5949 if (!retval.
is(TokenRetval::RetVal_OK))
5955 case TokenRetval::TK_SYMBOL:
5966 parser()->context.token->name);
5970 case TokenRetval::TK_NEWPARA:
5971 retval = Token::make_TK_NEWPARA();
5973 case TokenRetval::TK_RCSTAG:
5976 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5977 !std::holds_alternative<DocParamSect>(*n))
5987 retval = Token::make_RetVal_SimpleSec();
5998 "Found unexpected token (id={})",tok.
to_string());
6003 retval=Token::make_TK_NONE();
6006 DocPara *par = std::get_if<DocPara>(
parser()->context.nodeStack.top());
6007 if (!
parser()->context.token->endTag && par &&
6008 retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->name.lower() ==
"p")
6012 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::TK_NEWPARA,TokenRetval::TK_LISTITEM,
6013 TokenRetval::TK_ENDLIST,TokenRetval::RetVal_OK)
6025 Token retval = Token::make_RetVal_OK();
6028 if (!
m_id.isEmpty())
6050 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6051 retval=par->parse();
6052 if (!par->isEmpty())
6061 if (retval.
is(TokenRetval::TK_LISTITEM))
6065 if (retval.
is(TokenRetval::RetVal_Internal))
6069 if (retval.is(TokenRetval::RetVal_EndInternal))
6071 retval = Token::make_RetVal_OK();
6074 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6075 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6076 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6083 if (retval.
is(TokenRetval::RetVal_Subsection) &&
m_level<=1)
6086 while (retval.
is(TokenRetval::RetVal_Subsection))
6095 else if (retval.
is(TokenRetval::RetVal_Subsubsection) &&
m_level<=2)
6101 parser()->tokenizer.getLineNr(),
6102 "Unexpected subsubsection command found inside {}!",
6106 while (retval.
is(TokenRetval::RetVal_Subsubsection))
6113 if (!(
m_level < 2 && retval.
is(TokenRetval::RetVal_Subsection)))
break;
6115 else if (retval.
is(TokenRetval::RetVal_Paragraph) &&
m_level<=3)
6121 "Unexpected paragraph command found inside {}!",
6125 while (retval.
is(TokenRetval::RetVal_Paragraph))
6132 if (!(
m_level<3 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection))))
break;
6134 else if (retval.
is(TokenRetval::RetVal_SubParagraph) &&
m_level<=4)
6140 "Unexpected subparagraph command found inside {}!",
6144 while (retval.
is(TokenRetval::RetVal_SubParagraph))
6151 if (!(
m_level<4 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph))))
break;
6153 else if (retval.
is(TokenRetval::RetVal_SubSubParagraph) &&
m_level<=5)
6159 "Unexpected subsubparagraph command found inside {}!",
6163 while (retval.
is(TokenRetval::RetVal_SubSubParagraph))
6170 if (!(
m_level<5 && (retval.
is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6171 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph))))
break;
6180 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6181 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6182 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6183 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6199 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
6203 case TokenRetval::TK_WORD:
6206 case TokenRetval::TK_WHITESPACE:
6209 case TokenRetval::TK_SYMBOL:
6219 parser()->context.token->name);
6223 case TokenRetval::TK_COMMAND_AT:
6225 case TokenRetval::TK_COMMAND_BS:
6287 parser()->context.token->name);
6311 Token retval = Token::make_TK_NONE();
6321 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6322 retval=par->parse();
6323 if (par->isEmpty() && par->attribs().empty())
6332 auto checkParagraph = [
this,&retval](
Token t,
int level,
const char *sectionType,
const char *parentSectionType) {
6338 parser()->tokenizer.getLineNr(),
6339 "found {} command (id: '{}') outside of {} context!",
6340 sectionType,
parser()->context.token->sectionId,parentSectionType);
6344 if (!
parser()->context.token->sectionId.isEmpty())
6357 sectionType,
parser()->context.token->sectionId,sectionType);
6358 retval = Token::make_TK_NONE();
6363 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing id for {}; ignoring {}",sectionType,sectionType);
6364 retval = Token::make_TK_NONE();
6369 checkParagraph(Token::make_RetVal_SubSubParagraph(), 6,
"subsubparagraph",
"subparagraph" );
6370 checkParagraph(Token::make_RetVal_SubParagraph(), 5,
"subparagraph",
"paragraph" );
6371 checkParagraph(Token::make_RetVal_Paragraph(), 4,
"paragraph",
"subsubsection" );
6372 checkParagraph(Token::make_RetVal_Subsubsection(), 3,
"subsubsection",
"subsection" );
6373 checkParagraph(Token::make_RetVal_Subsection(), 2,
"subsection",
"section" );
6375 if (retval.
is(TokenRetval::TK_LISTITEM))
6379 if (retval.
is(TokenRetval::RetVal_Internal))
6384 }
while (!retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_Section));
6389 while (retval.
is(TokenRetval::RetVal_Section))
6391 if (!
parser()->context.token->sectionId.isEmpty())
6404 retval = Token::make_TK_NONE();
6410 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 handleRef(char cmdChar, const QCString &cmdName)
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)
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.