42#if !ENABLE_DOCPARSER_TRACING
46#define AUTO_TRACE(...) (void)0
47#define AUTO_TRACE_ADD(...) (void)0
48#define AUTO_TRACE_EXIT(...) (void)0
51#define INTERNAL_ASSERT(x) do {} while(0)
70 "uml",
"bpm",
"wire",
"dot",
"ditaa",
71 "salt",
"math",
"latex",
"gantt",
"mindmap",
72 "wbs",
"yaml",
"creole",
"json",
"flow",
73 "board",
"git",
"hcl",
"regex",
"ebnf",
74 "files",
"chen",
"chronology"
84 const char *p = s.
data();
90 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)
619 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
621 if (tok.
is_any_of(TokenRetval::TK_COMMAND_AT, TokenRetval::TK_COMMAND_BS))
628 if (!tok.
is(TokenRetval::TK_WHITESPACE))
634 if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
648 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Illegal command '{:c}{}' as part of a \\secreflist",
653 else if (tok.
is(TokenRetval::TK_WHITESPACE))
659 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected token {} inside section reference list",
691 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
710 AUTO_TRACE(
"target='{}',context='{}'",target,context);
713 auto lang =
parser->context.lang;
715 if (sec==
nullptr && !
parser->context.prefix.isEmpty())
767 m_file = dd->getOutputFileBase();
774 bool isFile = compound ?
778 if (compound && lang==SrcLangExt::Markdown) lang = compound->
getLanguage();
811 toFileDef(compound)->generateSourceFile()
825 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"unable to resolve reference to '{}' for \\ref command",
831 for (
auto &&elem : elements)
841 for (
auto &dn : children)
843 DocPara *para = std::get_if<DocPara>(&dn);
855 for (
auto &cn : children)
862 for (
auto &ccn : *opt_children)
876 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
882 case TokenRetval::TK_HTMLTAG:
895 if (
parser()->context.insideHtmlLink)
900 "Potential recursion while resolving \\ref command!");
927 if (numBibFiles>0 && cite && !cite->
text().
isEmpty())
938 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"\\cite command found but no bib files specified via CITE_BIB_FILES!");
940 else if (cite==
nullptr)
942 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"unable to resolve reference to '{}' for \\cite command",
947 warn_doc_error(
parser->context.fileName,
parser->tokenizer.getLineNr(),
"\\cite command to '{}' does not have an associated number",
959 if (!opt.noPar()) txt +=
"[";
963 if (opt.isNumber()) txt += citeInfo->
text();
964 else if (opt.isShortAuthor()) txt += citeInfo->
shortAuthor();
965 else if (opt.isYear()) txt += citeInfo->
year();
968 if (!opt.noPar()) txt +=
"]";
983 m_refText = m_refText.right(m_refText.length()-1);
990 if (compound && compound->isLinkable())
992 m_file = compound->getOutputFileBase();
993 m_ref = compound->getReference();
996 (
toFileDef(compound))->generateSourceFile()
1006 warn_doc_error(parser->context.fileName,parser->tokenizer.getLineNr(),
"unable to resolve link to '{}' for \\link command",
1018 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1022 switch (tok.
value())
1024 case TokenRetval::TK_COMMAND_AT:
1026 case TokenRetval::TK_COMMAND_BS:
1042 case TokenRetval::TK_SYMBOL:
1043 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unsupported symbol '{}' found as part of a \\link",
1044 parser()->context.token->name);
1046 case TokenRetval::TK_HTMLTAG:
1047 if (
parser()->context.token->name!=
"see" || !isXmlLink)
1049 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected xml/html command {} found as part of a \\link",
1050 parser()->context.token->name);
1053 case TokenRetval::TK_LNKWORD:
1054 case TokenRetval::TK_WORD:
1063 else if ((p=w.
find(
'}'))!=-1)
1065 int l =
static_cast<int>(w.
length());
1069 result=w.
right(l-p-1);
1083 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1086 parser()->tokenizer.getLineNr(),
1087 "Unexpected end of comment while inside link command");
1107 p->relPath =
parser->context.relPath;
1117 if (fd==
nullptr && !
p->name.endsWith(
".dot"))
1128 "Possible candidates:\n{}",
p->name,
1136 "in any of the paths specified via DOTFILE_DIRS!",
p->name);
1145 p->relPath =
parser->context.relPath;
1155 if (fd==
nullptr && !
p->name.endsWith(
".msc"))
1166 "Possible candidates:\n{}",
qPrint(
p->name),
1174 "in any of the paths specified via MSCFILE_DIRS!",
p->name);
1185 p->relPath =
parser->context.relPath;
1195 if (fd==
nullptr && !
p->name.endsWith(
".dia"))
1206 "Possible candidates:\n{}",
p->name,
1214 "in any of the paths specified via DIAFILE_DIRS!",
p->name);
1224 p->relPath =
parser->context.relPath;
1234 if (fd==
nullptr && !
p->name.endsWith(
".puml"))
1237 if (fd==
nullptr && !
p->name.endsWith(
".pu"))
1249 "Possible candidates:\n{}",
p->name,
1257 "in any of the paths specified via PLANTUMLFILE_DIRS!",
p->name);
1275 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1302 QCString locName =
p->url.isEmpty() ?
p->name :
p->url;
1303 int len =
static_cast<int>(locName.
length());
1304 int fnd = locName.
find(
'?');
1305 if (fnd==-1) fnd=len;
1306 return fnd>=4 && locName.
mid(fnd-4,4)==
".svg";
1320 Token retval(TokenRetval::RetVal_OK);
1324 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1328 switch (tok.
value())
1330 case TokenRetval::TK_HTMLTAG:
1389 if (!
parser()->context.token->endTag)
1400 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <h{:d}> context",
1413 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1430 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1434 if (tok.
value()==TokenRetval::TK_HTMLTAG &&
1436 parser()->context.token->endTag
1448 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1460 Token retval(TokenRetval::TK_NONE);
1471 retval=par->
parse();
1473 while (retval.
is(TokenRetval::TK_NEWPARA));
1476 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1478 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <details> block");
1489 return retval.
is(TokenRetval::RetVal_EndHtmlDetails) ? Token::make_RetVal_OK() : retval;
1505 Token retval(TokenRetval::RetVal_OK);
1509 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1513 switch (tok.
value())
1515 case TokenRetval::TK_HTMLTAG:
1528 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <a href=...> context",
1529 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
1540 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1543 " <a href=...> tag");
1555 Token retval(TokenRetval::RetVal_OK);
1565 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
1566 retval=par->parse();
1567 if (!par->isEmpty())
1576 if (retval.
is(TokenRetval::TK_LISTITEM))
1580 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
1581 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
1582 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
1583 TokenRetval::RetVal_EndInternal));
1587 while ((level==1 && retval.
is(TokenRetval::RetVal_Section)) ||
1588 (level==2 && retval.
is(TokenRetval::RetVal_Subsection)) ||
1589 (level==3 && retval.
is(TokenRetval::RetVal_Subsubsection)) ||
1590 (level==4 && retval.
is(TokenRetval::RetVal_Paragraph)) ||
1591 (level==5 && retval.
is(TokenRetval::RetVal_SubParagraph)) ||
1592 (level==6 && retval.
is(TokenRetval::RetVal_SubSubParagraph))
1601 if (retval.
is(TokenRetval::RetVal_Internal))
1603 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"\\internal command found inside internal section");
1615 Token retval(TokenRetval::RetVal_OK);
1618 if (!tok.
is(TokenRetval::TK_WHITESPACE))
1626 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1628 switch (tok.
value())
1630 case TokenRetval::TK_WHITESPACE:
1633 case TokenRetval::TK_WORD:
1634 case TokenRetval::TK_LNKWORD:
1637 case TokenRetval::TK_SYMBOL:
1659 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected symbol '{}' found as argument of \\addindex",
parser()->context.token->name);
1664 case TokenRetval::TK_COMMAND_AT:
1666 case TokenRetval::TK_COMMAND_BS:
1688 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command {} found as argument of \\addindex",
1689 parser()->context.token->name);
1713 for (
const auto &opt :
attribs)
1715 if (opt.name==
"id" && !opt.value.isEmpty())
1740 Token retval = Token::make_TK_NONE();
1743 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
1747 switch (tok.
value())
1749 case TokenRetval::TK_HTMLTAG:
1754 retval = Token::make_RetVal_OK();
1759 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <caption> context",
1760 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
1771 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
1786 Token retval = Token::make_RetVal_OK();
1797 retval=par->
parse();
1798 if (retval.
is(TokenRetval::TK_HTMLTAG))
1803 retval = Token::make_TK_NEWPARA();
1807 retval = Token::make_TK_NEWPARA();
1811 while (retval.
is_any_of(TokenRetval::TK_NEWPARA,TokenRetval::RetVal_EndParBlock));
1820 Token retval = Token::make_RetVal_OK();
1831 retval=par->
parse();
1832 if (retval.
is(TokenRetval::TK_HTMLTAG))
1837 retval = Token::make_TK_NEWPARA();
1841 retval = Token::make_TK_NEWPARA();
1845 while (retval.
is(TokenRetval::TK_NEWPARA));
1853 for (
const auto &attr :
attribs())
1855 if (attr.name.lower()==
"rowspan")
1857 return attr.value.toUInt();
1865 for (
const auto &attr :
attribs())
1867 if (attr.name.lower()==
"colspan")
1869 return std::max(1u,attr.value.toUInt());
1877 for (
const auto &attr :
attribs())
1881 if (attrName==
"align")
1883 if (attrValue==
"center")
1885 else if (attrValue==
"right")
1889 else if (attrName==
"class" && attrValue.
startsWith(
"markdowntable"))
1891 if (attrValue==
"markdowntableheadcenter")
1893 else if (attrValue==
"markdowntableheadright")
1895 else if (attrValue==
"markdowntableheadleft")
1897 else if (attrValue==
"markdowntableheadnone")
1899 else if (attrValue==
"markdowntablebodycenter")
1901 else if (attrValue==
"markdowntablebodyright")
1903 else if (attrValue==
"markdowntablebodyleft")
1905 else if (attrValue==
"markdowntablebodynone")
1915 for (
const auto &attr :
attribs())
1919 if (attrName==
"valign")
1921 if (attrValue==
"top")
1923 else if (attrValue==
"bottom")
1925 else if (attrValue==
"middle")
1940 const DocHtmlCell *cell = std::get_if<DocHtmlCell>(&n);
1956 while (tok.
is_any_of(TokenRetval::TK_WHITESPACE,TokenRetval::TK_NEWPARA,TokenRetval::TK_HTMLTAG,
1957 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS))
1959 if (tok.
is(TokenRetval::TK_HTMLTAG))
1975 else if (tok.
is(TokenRetval::TK_COMMAND_AT) || tok.
is(TokenRetval::TK_COMMAND_BS))
1985 if (!tok.
is(TokenRetval::TK_WORD))
2013 Token retval = Token::make_RetVal_OK();
2022 if (tok.
is(TokenRetval::TK_HTMLTAG))
2035 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2040 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2043 " for a html description title");
2048 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td> or <th> tag but found {} token instead!",
2062 retval=cell->
parse();
2063 isHeading = retval.
is(TokenRetval::RetVal_TableHCell);
2065 if (retval.
is(TokenRetval::RetVal_EndTableCell))
2071 if (tok.
is(TokenRetval::TK_HTMLTAG))
2074 !
parser()->context.token->endTag)
2076 retval = Token::make_RetVal_TableCell();
2081 if (
parser()->context.token->endTag)
2083 retval = Token::make_RetVal_EndTableRow();
2087 retval = Token::make_RetVal_TableRow();
2092 retval = Token::make_RetVal_EndTable();
2097 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2104 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td>, <th> or <tr> tag but found {} token instead!",
2110 while (retval.
is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2120 Token retval = Token::make_RetVal_OK();
2131 if (tok.
is(TokenRetval::TK_HTMLTAG))
2143 "found <{}> instead!",
parser()->context.token->name);
2148 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2151 " for a html description title");
2156 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected <td> or <th> tag but found {} token instead!",
2169 while (retval.
is_any_of(TokenRetval::RetVal_TableCell,TokenRetval::RetVal_TableHCell));
2190 if (!
children().empty() && std::holds_alternative<DocHtmlRow>(
children().front()))
2200 Token retval = Token::make_RetVal_OK();
2207 if (tok.
is(TokenRetval::TK_HTMLTAG))
2213 retval = Token::make_RetVal_TableRow();
2224 retval=std::get<DocHtmlCaption>(*m_caption).parse();
2226 if (retval.
is(TokenRetval::RetVal_OK))
2235 "found <{}{}> instead!",
parser()->context.token->endTag ?
"/" :
"",
parser()->context.token->name);
2238 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2241 " for a <tr> or <caption> tag");
2250 while (retval.
is(TokenRetval::RetVal_TableRow))
2255 if (retval.is(TokenRetval::RetVal_EndTableRow))
2263 retval = Token::make_RetVal_TableRow();
2267 retval = Token::make_RetVal_EndTable();
2272 "found token {} instead!",retval.to_string());
2273 retval=Token::make_RetVal_OK();
2281 return retval.
is(TokenRetval::RetVal_EndTable) ? Token::make_RetVal_OK() : retval;
2287 Token retval = Token::make_RetVal_OK();
2296 bool isHeader=
FALSE;
2297 if (tok.
is(TokenRetval::TK_HTMLTAG))
2302 retval = Token::make_RetVal_TableRow();
2306 retval = Token::make_RetVal_TableRow();
2312 while (retval.
is(TokenRetval::RetVal_TableRow))
2316 retval=tr->parseXml(isHeader);
2351 DocHtmlRow *row = std::get_if<DocHtmlRow>(&rowNode);
2354 for (
auto &cellNode : row->
children())
2356 DocHtmlCell *cell = std::get_if<DocHtmlCell>(&cellNode);
2359 uint32_t rs = cell->
rowSpan();
2360 uint32_t cs = cell->
colSpan();
2362 for (
size_t i=0;i<rowSpans.size();i++)
2364 if (rowSpans[i].rowsLeft>0 &&
2365 rowSpans[i].column==colIdx)
2367 colIdx=rowSpans[i].column+1;
2371 if (rs>0) rowSpans.emplace_back(rs,colIdx);
2379 for (
size_t i=0;i<rowSpans.size();i++)
2381 if (rowSpans[i].rowsLeft>0) rowSpans[i].rowsLeft--;
2387 if (colIdx-1>maxCols) maxCols=colIdx-1;
2397 Token retval = Token::make_TK_NONE();
2401 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
2405 switch (tok.
value())
2407 case TokenRetval::TK_COMMAND_AT:
2409 case TokenRetval::TK_COMMAND_BS:
2412 bool isJavaLink=
FALSE;
2418 if (!tok.
is(TokenRetval::TK_WHITESPACE))
2427 if (!tok.
is(TokenRetval::TK_WORD))
2429 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} as the argument of '{:c}{}' command",
2447 if (!tok.
is(TokenRetval::TK_WHITESPACE))
2456 if (!tok.
is(TokenRetval::TK_WORD))
2458 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} as the argument of \\{} command",
2466 QCString leftOver = lnk->parse(isJavaLink);
2467 if (!leftOver.isEmpty())
2477 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Illegal command '{:c}{}' found as part of a <dt> tag",
2482 case TokenRetval::TK_SYMBOL:
2483 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unsupported symbol '{}' found as part of a <dt> tag",
2484 parser()->context.token->name);
2486 case TokenRetval::TK_HTMLTAG:
2491 retval = Token::make_RetVal_DescData();
2501 retval = Token::make_RetVal_DescTitle();
2506 retval = Token::make_RetVal_EndDesc();
2511 if (!
parser()->context.token->endTag)
2518 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected html tag <{}{}> found within <dt> context",
2519 parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
2531 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2547 Token retval = Token::make_TK_NONE();
2557 retval=par->
parse();
2559 while (retval.
is(TokenRetval::TK_NEWPARA));
2570 Token retval = Token::make_RetVal_OK();
2578 if (tok.
is(TokenRetval::TK_HTMLTAG))
2588 "found <{}> instead!",
parser()->context.token->name);
2593 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2596 " for a html description title");
2613 if (retval.is(TokenRetval::RetVal_DescData))
2616 while (retval.is(TokenRetval::RetVal_DescData))
2623 else if (!retval.is(TokenRetval::RetVal_DescTitle))
2628 }
while (retval.
is(TokenRetval::RetVal_DescTitle));
2630 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2632 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <dl> block");
2637 return retval.
is(TokenRetval::RetVal_EndDesc) ? Token::make_RetVal_OK() : retval;
2645 Token retval = Token::make_TK_NONE();
2656 retval=par->
parse();
2658 while (retval.
is(TokenRetval::TK_NEWPARA));
2668 Token retval = Token::make_TK_NONE();
2679 retval=par->
parse();
2680 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
2684 if (retval.
is(TokenRetval::RetVal_ListItem))
2689 while (!retval.
is(TokenRetval::RetVal_CloseXml));
2702 Token retval = Token::make_RetVal_OK();
2711 if (tok.
is(TokenRetval::TK_HTMLTAG))
2720 ) &&
parser()->context.token->endTag
2726 retval = Token::make_RetVal_EndList();
2734 "found <{}{}> instead!",
parser()->context.token->endTag?
"/":
"",
parser()->context.token->name);
2739 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2744 " for a html list item");
2761 }
while (retval.
is(TokenRetval::RetVal_ListItem));
2763 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2765 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <{:c}l> block",
2771 return retval.
is(TokenRetval::RetVal_EndList) ? Token::make_RetVal_OK() : retval;
2777 Token retval = Token::make_RetVal_OK();
2786 if (tok.
is(TokenRetval::TK_HTMLTAG))
2797 "found <{}> instead!",
parser()->context.token->name);
2802 else if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2805 " for a html list item");
2819 retval=li->parseXml();
2820 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
2822 }
while (retval.
is(TokenRetval::RetVal_ListItem));
2824 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2826 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <list type=\"{}\"> block",
2832 return (retval.
is_any_of(TokenRetval::RetVal_EndList,TokenRetval::RetVal_CloseXml) ||
parser()->context.token->name==
"list") ?
2833 Token::make_RetVal_OK() : retval;
2841 Token retval = Token::make_TK_NONE();
2852 retval=par->
parse();
2854 while (retval.
is(TokenRetval::TK_NEWPARA));
2857 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
2859 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment while inside <blockquote> block");
2863 return retval.
is(TokenRetval::RetVal_EndBlockQuote) ? Token::make_RetVal_OK() : retval;
2871 Token retval = Token::make_TK_NONE();
2882 retval=par->
parse();
2884 while (retval.
is(TokenRetval::TK_NEWPARA));
2888 return retval.
is(TokenRetval::RetVal_EndBlockQuote) ? Token::make_RetVal_OK() : retval;
2915 Token rv = Token::make_TK_NONE();
2921 }
while (rv.
is(TokenRetval::RetVal_ListItem));
2922 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
2935 Token retval = Token::make_RetVal_OK();
2945 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
2946 retval=par->parse();
2947 if (!par->isEmpty())
2958 }
while (retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->indent>
m_indent);
2977 Token retval = Token::make_RetVal_OK();
2984 switch (
parser()->context.token->id)
3006 while (retval.
is(TokenRetval::TK_LISTITEM) &&
3010 (
parser()->context.token->id==-1 ||
parser()->context.token->id>=num)
3026 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
3058 return m_title && std::get<DocTitle>(*m_title).hasTitle();
3070 std::get_if<DocTitle>(
m_title.get())->parse();
3074 if (!
children().empty() && std::holds_alternative<DocPara>(
children().back()))
3092 Token retval = par->parse();
3112 return Token::make_RetVal_OK();
3120 Token retval = Token::make_RetVal_OK();
3124 if (!
children().empty() && std::holds_alternative<DocPara>(
children().back()))
3126 std::get<DocPara>(
children().back()).markLast(
false);
3138 retval = par->parse();
3139 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3140 if (retval.
is(TokenRetval::RetVal_CloseXml))
3142 retval = Token::make_RetVal_OK();
3154 if (
children().empty() || (p=std::get_if<DocPara>(&
children().back()))==
nullptr)
3176 case See:
return "see";
3177 case Return:
return "return";
3179 case Authors:
return "author";
3180 case Version:
return "version";
3181 case Since:
return "since";
3182 case Date:
return "date";
3183 case Note:
return "note";
3184 case Warning:
return "warning";
3185 case Pre:
return "pre";
3186 case Post:
return "post";
3188 case Invar:
return "invariant";
3189 case Remark:
return "remark";
3192 case User:
return "user";
3193 case Rcs:
return "rcs";
3203 Token retval = Token::make_RetVal_OK();
3209 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3213 retval = Token::make_RetVal_EndParBlock();
3218 while (tok.
is(TokenRetval::TK_WORD))
3223 if (typeSeparator!=-1)
3229 if (
parent() && std::holds_alternative<DocParamSect>(*
parent()))
3231 std::get<DocParamSect>(*
parent()).m_hasTypeSpecifier=
true;
3250 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3252 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3253 "argument of command {}",saveCmdName);
3254 retval = Token::make_RetVal_EndParBlock();
3257 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3259 if (!tok.
is(TokenRetval::TK_NEWPARA))
3261 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected token {} in comment block while parsing the "
3262 "argument of command {}",tok.
to_string(),saveCmdName);
3264 retval = Token::make_RetVal_EndParBlock();
3270 retval = par->
parse();
3282 Token retval = Token::make_RetVal_OK();
3303 retval = par->parse();
3325 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
break;
3327 }
while (retval.
is(TokenRetval::RetVal_CloseXml) &&
3332 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3338 retval = Token::make_RetVal_OK();
3350 Token retval = Token::make_RetVal_OK();
3358 if (!
children().empty() && std::holds_alternative<DocParamList>(
children().back()))
3373 retval = pl->parseXml(cmdName);
3377 retval = pl->parse(cmdName);
3379 if (retval.
is(TokenRetval::RetVal_EndParBlock))
3381 retval = Token::make_RetVal_OK();
3400 bool needsSeparator =
FALSE;
3402 (ss=
children().get_last<DocSimpleSect>()) &&
3407 needsSeparator =
TRUE;
3414 Token rv = Token::make_RetVal_OK();
3423 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3428 bool xmlContext=
FALSE,
3434 (ps=
children().get_last<DocParamSect>()) &&
3446 return (!rv.
is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3457 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
3462 for (
auto const &opt : optList)
3464 if (opt ==
"number")
3468 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3475 else if (opt ==
"year")
3479 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3486 else if (opt ==
"shortauthor")
3490 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3497 else if (opt ==
"nopar")
3501 else if (opt ==
"nocite")
3507 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3515 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3522 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
3525 cmdChar,saveCmdName);
3535 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3537 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"THE ONE unexpected end of comment block while parsing the "
3538 "argument of command '{:c}{}'",cmdChar,saveCmdName);
3541 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3559 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3567 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3569 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"no emoji name given or unexpected end of comment block while parsing the "
3570 "argument of command '{:c}{}'",cmdChar,cmdName);
3574 else if (!tok.
is(TokenRetval::TK_WORD))
3589 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3597 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3599 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3600 "argument of command '{:c}{}'",cmdChar,cmdName);
3603 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3613 switch (opt->
kind())
3633 std::string lstFormat =
theTranslator->trWriteList(
static_cast<int>(lst->size())).str();
3634 static const reg::Ex marker(R
"(@(\d+))");
3639 for ( ; it!=
end ; ++it)
3641 const auto &match = *it;
3642 size_t newIndex = match.position();
3643 size_t matchLen = match.length();
3644 optionValue += lstFormat.substr(index,newIndex-index);
3645 unsigned long entryIndex = std::stoul(match[1].str());
3646 if (entryIndex<(
unsigned long)lst->size())
3648 optionValue += lst->at(entryIndex);
3650 index=newIndex+matchLen;
3652 optionValue+=lstFormat.substr(index);
3657 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Obsolete setting for '{:c}{}': '{}'",
3658 cmdChar,cmdName,
parser()->context.token->name);
3662 "Disabled setting (i.e. not supported in this doxygen executable) for '{:c}{}': '{}'",
3663 cmdChar,cmdName,
parser()->context.token->name);
3676 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option for '{:c}{}': '{}'",
3677 cmdChar,cmdName,
parser()->context.token->name);
3687 ASSERT(retval.
is(TokenRetval::TK_WHITESPACE));
3690 if (retval.
is(TokenRetval::RetVal_OK))
3710 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3718 if (!tok.
is(TokenRetval::TK_WORD))
3732 bool specDateOnlyWS = !specDateRaw.
isEmpty() && specDate.
isEmpty();
3733 if (!specDate.
isEmpty() && !tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3735 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}'",
3746 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"invalid <date_time> argument for command '{:c}{}': {}",
3747 cmdChar,cmdName,
err);
3759 if ((usedFormat&bitMask) && !(specFormat&bitMask))
3761 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.",
3779 if (!tok.
is(TokenRetval::TK_WORD))
3792 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3801 if (!tok.
is(TokenRetval::TK_WORD))
3817 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3826 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3828 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
3829 "argument of command {}", saveCmdName);
3832 else if (!tok.
is(TokenRetval::TK_WORD))
3856 (!n1_docIncOp && !n1_docWs) ||
3857 (n1_docWs && n2 && !n2_docIncOp);
3862 n1_docIncOp->markLast(
false);
3864 else if (n1_docWs && n2_docIncOp)
3877 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3886 if (!tok.
is(TokenRetval::TK_WORD))
3913 AUTO_TRACE(
"cmdName={} isJavaLink={}",cmdName,isJavaLink);
3916 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3924 if (!tok.
is(TokenRetval::TK_WORD))
3930 if (saveCmdName ==
"javalink")
3939 if (saveCmdName ==
"javalink")
3945 QCString leftOver = lnk->parse(isJavaLink);
3957 if (!tok.
is(TokenRetval::TK_WHITESPACE))
3960 cmdChar,
qPrint(saveCmdName));
3965 if (!tok.
is(TokenRetval::TK_WORD))
3984 bool isBlock =
false;
3985 bool trimLeft =
false;
3986 bool localScope =
false;
3988 if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"{")
3994 auto contains = [&optList](
const char *kw)
3996 return std::find(optList.begin(),optList.end(),kw)!=optList.end();
3998 localScope = contains(
"local");
3999 if (contains(
"nostrip"))
4001 stripCodeComments =
false;
4003 else if (contains(
"strip"))
4005 stripCodeComments =
true;
4012 if (contains(
"lineno"))
4019 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4026 else if (tok.
is(TokenRetval::TK_WORD) &&
parser()->context.token->name==
"[")
4034 else if (!tok.
is(TokenRetval::TK_WHITESPACE))
4043 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4045 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4046 "argument of command {}",saveCmdName);
4049 else if (!tok.
is(TokenRetval::TK_WORD))
4063 if (!tok.
is(TokenRetval::TK_WORD))
4065 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"expected block identifier, but found token {} instead while parsing the {} command",
4080 blockId,isBlock,trimLeft);
4090 if (!tok.
is(TokenRetval::TK_WHITESPACE))
4093 cmdChar,saveCmdName);
4097 if (tok.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4099 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"unexpected end of comment block while parsing the "
4100 "argument of command '{:c}{}'", cmdChar,saveCmdName);
4103 else if (!tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
4120 return retval.is(TokenRetval::RetVal_OK) ? Token::make_TK_NEWPARA() : retval;
4142 if (
parser()->context.xmlComment)
4148 while (i<l && (
parser()->context.token->verb.at(i)==
' ' ||
parser()->context.token->verb.at(i)==
'\n'))
4150 if (
parser()->context.token->verb.at(i)==
'\n') li=i+1;
4160 if (retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4171 if (
parser()->context.memberDef)
4209 Token retval = Token::make_RetVal_OK();
4215 std::string str{cmdChar};
4219 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Found unexpanded alias '{:c}{}'. Check if number of arguments passed is correct.",cmdChar,cmdName);
4368 retval = Token::make_RetVal_Section();
4374 retval = Token::make_RetVal_Subsection();
4380 retval = Token::make_RetVal_Subsubsection();
4386 retval = Token::make_RetVal_Paragraph();
4392 retval = Token::make_RetVal_SubParagraph();
4398 retval = Token::make_RetVal_SubSubParagraph();
4418 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4430 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4442 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4454 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4466 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4478 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4492 int idx = fullMatch.
find(
'{');
4493 int idxEnd = fullMatch.
find(
"}",idx+1);
4499 for (
const auto &opt : optList)
4501 if (opt.empty())
continue;
4504 if (locOpt ==
"code")
4510 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unknown option '{}' for '\\iliteral'",opt);
4518 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4526 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"javadoc literal section ended without end marker");
4545 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4566 dv->setText(
parser()->context.token->verb);
4567 dv->setWidth(width);
4568 dv->setHeight(height);
4569 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4572 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\dot command because HAVE_DOT is not set");
4575 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4596 dv->setText(
parser()->context.token->verb);
4597 dv->setWidth(width);
4598 dv->setHeight(height);
4599 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4600 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4614 int idx = fullMatch.
find(
'{');
4615 int idxEnd = fullMatch.
find(
"}",idx+1);
4622 for (
const auto &opt : optList)
4624 if (opt.empty())
continue;
4632 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple definition of engine for '\\startuml'");
4645 warn(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Multiple use of filename for '\\startuml'");
4654 if (engine.
isEmpty()) engine =
"uml";
4660 assert(retval.is(TokenRetval::RetVal_OK));
4681 if (engine ==
"ditaa")
4683 dv->setUseBitmap(
true);
4685 else if (engine ==
"uml")
4687 int i = trimmedVerb.
find(
'\n');
4688 QCString firstLine = i==-1 ? trimmedVerb : trimmedVerb.
left(i);
4691 dv->setText(trimmedVerb);
4692 dv->setWidth(width);
4693 dv->setHeight(height);
4694 dv->setLocation(
parser()->context.fileName,
parser()->tokenizer.getLineNr());
4697 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
4700 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4708 retval = Token::make_RetVal_EndParBlock();
4767 retval = Token::make_RetVal_Internal();
4770 retval = Token::make_RetVal_EndInternal();
4839 "ignoring \\dotfile command because HAVE_DOT is not set");
4927 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Unexpected command '{}' in paragraph context",cmdName);
4930 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_OK,TokenRetval::RetVal_SimpleSec
4931 TokenRetval::TK_LISTITEM,TokenRetval::TK_ENDLIST,TokenRetval::TK_NEWPARA
4932 TokenRetval::RetVal_Section,TokenRetval::RetVal_EndList
4933 TokenRetval::RetVal_Internal,TokenRetval::RetVal_SwitchLang
4934 TokenRetval::RetVal_EndInternal)
4941 const char *attrName,
4945 for (
const auto &opt : tagHtmlAttribs)
4947 if (opt.name==attrName)
4949 *result = opt.value;
4958 AUTO_TRACE(
"tagName={} #tagHtmlAttrs={}",tagName,tagHtmlAttribs.size());
4959 Token retval = Token::make_RetVal_OK();
4965 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"HTML tag ('<{}/>') may not use the 'empty tag' XHTML syntax.",
4971 if (!
parser()->context.token->emptyTag)
4979 if (!
parser()->context.token->emptyTag)
4987 if (
parser()->context.token->emptyTag)
break;
4994 retval = Token::make_RetVal_ListItem();
5016 if (
parser()->context.token->emptyTag)
break;
5017 if (
parser()->context.xmlComment)
5062 if (
parser()->context.token->emptyTag)
break;
5068 retval = Token::make_TK_NEWPARA();
5071 if (!
parser()->context.token->emptyTag)
5080 retval = Token::make_RetVal_DescTitle();
5090 retval = Token::make_RetVal_DescData();
5098 if (!
parser()->context.token->emptyTag)
5106 retval = Token::make_RetVal_TableRow();
5109 retval = Token::make_RetVal_TableCell();
5112 retval = Token::make_RetVal_TableHCell();
5159 if (!
parser()->context.token->emptyTag)
5166 if (!
parser()->context.token->emptyTag)
5176 if (!
parser()->context.token->emptyTag)
5179 while (n && !std::holds_alternative<DocHtmlDetails>(*n)) n=
::parent(n);
5189 retval = Token::make_TK_NEWPARA();
5203 retval = Token::make_TK_NEWPARA();
5209 retval = Token::make_RetVal_TableCell();
5279 retval = Token::make_RetVal_TableRow();
5283 retval = Token::make_RetVal_ListItem();
5298 retval = Token::make_RetVal_TableCell();
5312 if (
parser()->context.token->emptyTag)
5329 if (!leftOver.isEmpty())
5347 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing 'cref' or 'langword' attribute from <see> tag.");
5375 std::get<DocSimpleSect>(*vss).appendLinkWord(cref);
5376 retval = Token::make_RetVal_OK();
5433 Token retval = Token::make_RetVal_OK();
5443 retval = Token::make_RetVal_EndList();
5453 retval = Token::make_RetVal_EndList();
5469 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </details> tag without matching <details>");
5473 retval = Token::make_RetVal_EndHtmlDetails();
5479 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"found </blockquote> tag without matching <blockquote>");
5483 retval = Token::make_RetVal_EndBlockQuote();
5543 retval = Token::make_TK_NEWPARA();
5546 retval = Token::make_RetVal_EndDesc();
5555 retval = Token::make_RetVal_EndTable();
5558 retval = Token::make_RetVal_EndTableRow();
5561 retval = Token::make_RetVal_EndTableCell();
5564 retval = Token::make_RetVal_EndTableCell();
5608 retval = Token::make_TK_NEWPARA();
5622 retval = Token::make_RetVal_CloseXml();
5658 if (!std::get_if<DocAutoListItem>(n))
5666 const auto docAutoList = std::get_if<DocAutoList>(n);
5669 indent = docAutoList->indent();
5678 const auto docPara = std::get_if<DocPara>(n);
5684 return std::get<DocStyleChange>(*stack.top());
5694 indentStr.
fill(
' ',indent);
5709 Token retval = Token::make_TK_NONE();
5710 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
5714 if (tok.
is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD,TokenRetval::TK_SYMBOL,TokenRetval::TK_URL,
5715 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS,TokenRetval::TK_HTMLTAG)
5722 case TokenRetval::TK_WORD:
5725 case TokenRetval::TK_LNKWORD:
5728 case TokenRetval::TK_URL:
5731 case TokenRetval::TK_WHITESPACE:
5749 case TokenRetval::TK_LISTITEM:
5753 while (n && !std::holds_alternative<DocAutoList>(*n)) n=
::parent(n);
5754 const DocAutoList *al = std::get_if<DocAutoList>(n);
5761 retval = Token::make_TK_LISTITEM();
5771 al = std::get_if<DocAutoList>(n);
5785 }
while (retval.
is(TokenRetval::TK_LISTITEM) &&
5790 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5796 if (
parser()->context.token->name.startsWith(
"rcs:"))
5800 tok = Token::make_TK_RCSTAG();
5804 tok = Token::make_TK_COMMAND_BS();
5809 else if (retval.
is(TokenRetval::TK_ENDLIST))
5825 case TokenRetval::TK_ENDLIST:
5826 AUTO_TRACE_ADD(
"Found end of list inside of paragraph at line {}",
parser()->tokenizer.getLineNr());
5827 if (std::get_if<DocAutoListItem>(
parent()))
5830 if (al && al->
indent()>=
parser()->context.token->indent)
5833 retval = Token::make_TK_ENDLIST();
5839 "has invalid indent level");
5848 case TokenRetval::TK_COMMAND_AT:
5850 case TokenRetval::TK_COMMAND_BS:
5855 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5856 !std::holds_alternative<DocParamSect>(*n))
5867 retval = Token::make_RetVal_SimpleSec();
5873 while (n && !std::holds_alternative<DocSimpleListItem>(*n)) n=
::parent(n);
5878 retval = Token::make_RetVal_ListItem();
5888 if (retval.
is(TokenRetval::RetVal_SimpleSec))
5894 if (
parser()->context.token->name.startsWith(
"rcs:"))
5898 tok = Token::make_TK_RCSTAG();
5902 tok = Token::make_TK_COMMAND_BS();
5907 else if (retval.
value()>TokenRetval::TK_NONE && retval.
value()<TokenRetval::RetVal_OK)
5913 else if (retval.
value()!=TokenRetval::RetVal_OK)
5920 case TokenRetval::TK_HTMLTAG:
5922 if (!
parser()->context.token->endTag)
5934 if (!retval.
is(TokenRetval::RetVal_OK))
5940 case TokenRetval::TK_SYMBOL:
5951 parser()->context.token->name);
5955 case TokenRetval::TK_NEWPARA:
5956 retval = Token::make_TK_NEWPARA();
5958 case TokenRetval::TK_RCSTAG:
5961 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5962 !std::holds_alternative<DocParamSect>(*n))
5972 retval = Token::make_RetVal_SimpleSec();
5983 "Found unexpected token (id={})",tok.
to_string());
5988 retval=Token::make_TK_NONE();
5991 DocPara *par = std::get_if<DocPara>(
parser()->context.nodeStack.top());
5992 if (!
parser()->context.token->endTag && par &&
5993 retval.
is(TokenRetval::TK_NEWPARA) &&
parser()->context.token->name.lower() ==
"p")
5997 INTERNAL_ASSERT(retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::TK_NEWPARA,TokenRetval::TK_LISTITEM,
5998 TokenRetval::TK_ENDLIST,TokenRetval::RetVal_OK)
6010 Token retval = Token::make_RetVal_OK();
6013 if (!
m_id.isEmpty())
6035 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6036 retval=par->parse();
6037 if (!par->isEmpty())
6046 if (retval.
is(TokenRetval::TK_LISTITEM))
6050 if (retval.
is(TokenRetval::RetVal_Internal))
6054 if (retval.is(TokenRetval::RetVal_EndInternal))
6056 retval = Token::make_RetVal_OK();
6059 }
while (!retval.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6060 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6061 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6068 if (retval.
is(TokenRetval::RetVal_Subsection) &&
m_level<=1)
6071 while (retval.
is(TokenRetval::RetVal_Subsection))
6080 else if (retval.
is(TokenRetval::RetVal_Subsubsection) &&
m_level<=2)
6086 parser()->tokenizer.getLineNr(),
6087 "Unexpected subsubsection command found inside {}!",
6091 while (retval.
is(TokenRetval::RetVal_Subsubsection))
6098 if (!(
m_level < 2 && retval.
is(TokenRetval::RetVal_Subsection)))
break;
6100 else if (retval.
is(TokenRetval::RetVal_Paragraph) &&
m_level<=3)
6106 "Unexpected paragraph command found inside {}!",
6110 while (retval.
is(TokenRetval::RetVal_Paragraph))
6117 if (!(
m_level<3 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection))))
break;
6119 else if (retval.
is(TokenRetval::RetVal_SubParagraph) &&
m_level<=4)
6125 "Unexpected subparagraph command found inside {}!",
6129 while (retval.
is(TokenRetval::RetVal_SubParagraph))
6136 if (!(
m_level<4 && (retval.
is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph))))
break;
6138 else if (retval.
is(TokenRetval::RetVal_SubSubParagraph) &&
m_level<=5)
6144 "Unexpected subsubparagraph command found inside {}!",
6148 while (retval.
is(TokenRetval::RetVal_SubSubParagraph))
6155 if (!(
m_level<5 && (retval.
is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6156 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph))))
break;
6165 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6166 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6167 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6168 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6184 while (!tok.
is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
6188 case TokenRetval::TK_WORD:
6191 case TokenRetval::TK_WHITESPACE:
6194 case TokenRetval::TK_SYMBOL:
6204 parser()->context.token->name);
6208 case TokenRetval::TK_COMMAND_AT:
6210 case TokenRetval::TK_COMMAND_BS:
6272 parser()->context.token->name);
6296 Token retval = Token::make_TK_NONE();
6306 if (isFirst) { par->markFirst(); isFirst=
FALSE; }
6307 retval=par->parse();
6308 if (par->isEmpty() && par->attribs().empty())
6317 auto checkParagraph = [
this,&retval](
Token t,
int level,
const char *sectionType,
const char *parentSectionType) {
6323 parser()->tokenizer.getLineNr(),
6324 "found {} command (id: '{}') outside of {} context!",
6325 sectionType,
parser()->context.token->sectionId,parentSectionType);
6329 if (!
parser()->context.token->sectionId.isEmpty())
6342 sectionType,
parser()->context.token->sectionId,sectionType);
6343 retval = Token::make_TK_NONE();
6348 warn_doc_error(
parser()->context.fileName,
parser()->tokenizer.getLineNr(),
"Missing id for {}; ignoring {}",sectionType,sectionType);
6349 retval = Token::make_TK_NONE();
6354 checkParagraph(Token::make_RetVal_SubSubParagraph(), 6,
"subsubparagraph",
"subparagraph" );
6355 checkParagraph(Token::make_RetVal_SubParagraph(), 5,
"subparagraph",
"paragraph" );
6356 checkParagraph(Token::make_RetVal_Paragraph(), 4,
"paragraph",
"subsubsection" );
6357 checkParagraph(Token::make_RetVal_Subsubsection(), 3,
"subsubsection",
"subsection" );
6358 checkParagraph(Token::make_RetVal_Subsection(), 2,
"subsection",
"section" );
6360 if (retval.
is(TokenRetval::TK_LISTITEM))
6364 if (retval.
is(TokenRetval::RetVal_Internal))
6369 }
while (!retval.
is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_Section));
6374 while (retval.
is(TokenRetval::RetVal_Section))
6376 if (!
parser()->context.token->sectionId.isEmpty())
6389 retval = Token::make_TK_NONE();
6395 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
static CiteInfoOption makeYear()
static CiteInfoOption makeNumber()
static 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.
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 DocNodeVariant * firstRow() 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)
void handleIFile(char cmdChar, 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 handleILine(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 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)
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)
T & front()
access the first element
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
void fill(char c, int len=-1)
Fills a string with a predefined character.
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
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 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)
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
constexpr bool holds_one_of_alternatives(const DocNodeVariant &v)
returns true iff v holds one of types passed as template parameters
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.