Doxygen
Loading...
Searching...
No Matches
DocPara Class Reference

Node representing a paragraph in the documentation tree. More...

#include <src/docnode.h>

Inheritance diagram for DocPara:
Collaboration diagram for DocPara:

Public Member Functions

 DocPara (DocParser *parser, DocNodeVariant *parent)
Token parse ()
bool isEmpty () const
void markFirst (bool v=TRUE)
void markLast (bool v=TRUE)
bool isFirst () const
bool isLast () const
Token handleCommand (char cmdChar, const QCString &cmdName)
Token handleHtmlStartTag (const QCString &tagName, const HtmlAttribList &tagHtmlAttribs)
Token handleHtmlEndTag (const QCString &tagName)
Token handleSimpleSection (DocSimpleSect::Type t, bool xmlContext=FALSE)
Token handleXRefItem ()
Token handleParamSection (const QCString &cmdName, DocParamSect::Type t, bool xmlContext, int direction)
void handleIncludeOperator (const QCString &cmdName, DocIncOperator::Type t)
template<class T>
void handleFile (const QCString &cmdName)
void handleInclude (const QCString &cmdName, DocInclude::Type t)
void handleLink (const QCString &cmdName, bool isJavaLink)
void handleCite (char cmdChar, const QCString &cmdName)
void handleDoxyConfig (char cmdChar, const QCString &cmdName)
void handleEmoji (char cmdChar, const QCString &cmdName)
void handleSection (char cmdChar, const QCString &cmdName)
void handleInheritDoc ()
void handleVhdlFlow ()
void handleShowDate (char cmdChar, const QCString &cmdName)
Token handleStartCode ()
Token handleHtmlHeader (const HtmlAttribList &tagHtmlAttribs, int level)
bool injectToken (Token tok, const QCString &tokText)
const HtmlAttribListattribs () const
void setAttribs (const HtmlAttribList &attribs)
Public Member Functions inherited from DocCompoundNode
 DocCompoundNode (DocParser *parser, DocNodeVariant *parent)
DocNodeListchildren ()
const DocNodeListchildren () const
Public Member Functions inherited from DocNode
 DocNode (DocParser *parser, DocNodeVariant *parent)
 ~DocNode ()=default
DocNodeVariantparent ()
const DocNodeVariantparent () const
DocNodeVariantthisVariant ()
const DocNodeVariantthisVariant () const
void setThisVariant (DocNodeVariant *thisVariant)
DocParserparser ()
const DocParserparser () const
void setParent (DocNodeVariant *parent)
bool isPreformatted () const

Private Attributes

bool m_isFirst = false
bool m_isLast = false
HtmlAttribList m_attribs

Additional Inherited Members

Protected Types inherited from DocNode
enum  RefType {
  Unknown , Anchor , Section , Table ,
  Requirement
}
Protected Member Functions inherited from DocNode
void setInsidePreformatted (bool p)

Detailed Description

Node representing a paragraph in the documentation tree.

Definition at line 1079 of file docnode.h.

Constructor & Destructor Documentation

◆ DocPara()

DocPara::DocPara ( DocParser * parser,
DocNodeVariant * parent )

Definition at line 3440 of file docnode.cpp.

3440 :
3443{
3444}
DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:141
DocParser * parser()
Definition docnode.h:98
DocNodeVariant * parent()
Definition docnode.h:90
bool m_isFirst
Definition docnode.h:1115
bool m_isLast
Definition docnode.h:1116
#define FALSE
Definition qcstring.h:34

References DocCompoundNode::DocCompoundNode(), FALSE, m_isFirst, m_isLast, DocNode::parent(), and DocNode::parser().

Referenced by parse().

Member Function Documentation

◆ attribs()

const HtmlAttribList & DocPara::attribs ( ) const
inline

Definition at line 1111 of file docnode.h.

1111{ return m_attribs; }
HtmlAttribList m_attribs
Definition docnode.h:1117

References m_attribs.

Referenced by HtmlDocVisitor::operator()(), and setAttribs().

◆ handleCite()

void DocPara::handleCite ( char cmdChar,
const QCString & cmdName )

Definition at line 3499 of file docnode.cpp.

3500{
3501 AUTO_TRACE();
3502 QCString saveCmdName = cmdName;
3503 // get the argument of the cite command.
3504 Token tok=parser()->tokenizer.lex();
3505
3506 CiteInfoOption option;
3507 if (tok.is(TokenRetval::TK_WORD) && parser()->context.token->name=="{")
3508 {
3510 parser()->tokenizer.lex();
3511 StringVector optList=split(parser()->context.token->name.str(),",");
3512 for (auto const &opt : optList)
3513 {
3514 if (opt == "number")
3515 {
3516 if (!option.isUnknown())
3517 {
3518 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3519 }
3520 else
3521 {
3522 option = CiteInfoOption::makeNumber();
3523 }
3524 }
3525 else if (opt == "year")
3526 {
3527 if (!option.isUnknown())
3528 {
3529 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3530 }
3531 else
3532 {
3533 option = CiteInfoOption::makeYear();
3534 }
3535 }
3536 else if (opt == "shortauthor")
3537 {
3538 if (!option.isUnknown())
3539 {
3540 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3541 }
3542 else
3543 {
3545 }
3546 }
3547 else if (opt == "nopar")
3548 {
3549 option.setNoPar();
3550 }
3551 else if (opt == "nocite")
3552 {
3553 option.setNoCite();
3554 }
3555 else
3556 {
3557 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3558 }
3559 }
3560
3561 if (option.isUnknown()) option.changeToNumber();
3562
3564 tok=parser()->tokenizer.lex();
3565 if (!tok.is(TokenRetval::TK_WHITESPACE))
3566 {
3567 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3568 saveCmdName);
3569 return;
3570 }
3571 }
3572 else if (!tok.is(TokenRetval::TK_WHITESPACE))
3573 {
3574 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3575 cmdChar,saveCmdName);
3576 return;
3577 }
3578 else
3579 {
3580 option = CiteInfoOption::makeNumber();
3581 }
3582
3584 tok=parser()->tokenizer.lex();
3585 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3586 {
3587 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"THE ONE unexpected end of comment block while parsing the "
3588 "argument of command '{:c}{}'",cmdChar,saveCmdName);
3589 return;
3590 }
3591 else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3592 {
3593 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3594 tok.to_string(),cmdChar,saveCmdName);
3595 return;
3596 }
3598 children().append<DocCite>(
3600
3602}
constexpr void setNoCite() noexcept
Definition cite.h:35
static constexpr CiteInfoOption makeNumber()
Definition cite.h:29
constexpr void changeToNumber() noexcept
Definition cite.h:33
constexpr void setNoPar() noexcept
Definition cite.h:34
constexpr bool isUnknown() const noexcept
Definition cite.h:37
static constexpr CiteInfoOption makeYear()
Definition cite.h:31
static constexpr CiteInfoOption makeShortAuthor()
Definition cite.h:30
DocNodeList & children()
Definition docnode.h:143
DocNodeVariant * thisVariant()
Definition docnode.h:93
DocTokenizer tokenizer
DocParserContext context
void setStateCite()
void setStateOptions()
void setStatePara()
bool is(TokenRetval rv) const
TOKEN_SPECIFICATIONS RETVAL_SPECIFICATIONS const char * to_string() const
bool is_any_of(ARGS... args) const
std::vector< std::string > StringVector
Definition containers.h:33
#define AUTO_TRACE(...)
Definition docnode.cpp:47
#define warn(file, line, fmt,...)
Definition message.h:97
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
void append(Args &&... args)
Append a new DocNodeVariant to the list by constructing it with type T and parameters Args.
Definition docnode.h:1396
TokenInfo * token
Definition docparser_p.h:95
QCString sectionId
QCString name
StringVector split(const std::string &s, const std::string &delimiter)
split input string s by string delimiter delimiter.
Definition util.cpp:6641

References DocNodeList::append(), AUTO_TRACE, CiteInfoOption::changeToNumber(), DocCompoundNode::children(), DocParser::context, DocParserContext::context, Token::is(), Token::is_any_of(), CiteInfoOption::isUnknown(), DocTokenizer::lex(), CiteInfoOption::makeNumber(), CiteInfoOption::makeShortAuthor(), CiteInfoOption::makeYear(), TokenInfo::name, DocNode::parser(), TokenInfo::sectionId, CiteInfoOption::setNoCite(), CiteInfoOption::setNoPar(), DocTokenizer::setStateCite(), DocTokenizer::setStateOptions(), DocTokenizer::setStatePara(), split(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, warn, and warn_doc_error.

Referenced by handleCommand().

◆ handleCommand()

Token DocPara::handleCommand ( char cmdChar,
const QCString & cmdName )

Definition at line 4192 of file docnode.cpp.

4193{
4194 AUTO_TRACE("cmdName={}",cmdName);
4195 Token retval = Token::make_RetVal_OK();
4196 CommandType cmdId = Mappers::cmdMapper->map(cmdName);
4197 switch (cmdId)
4198 {
4200 {
4201 std::string str{cmdChar};
4202 children().append<DocWord>(parser(),thisVariant(),str.c_str() + cmdName);
4203 if (isAliasCmd(cmdName.view()))
4204 {
4205 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Found unexpanded alias '{:c}{}'. Check if number of arguments passed is correct.",cmdChar,cmdName);
4206 }
4207 else
4208 {
4209 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Found unknown command '{:c}{}'",cmdChar,cmdName);
4210 }
4211 }
4212 break;
4214 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,cmdName,TRUE);
4215 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4216 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,cmdName,FALSE);
4217 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4218 break;
4220 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Bold,cmdName,TRUE);
4221 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4222 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Bold,cmdName,FALSE);
4223 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4224 break;
4226 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,cmdName,TRUE);
4227 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4228 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,cmdName,FALSE);
4229 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4230 break;
4233 break;
4236 break;
4239 break;
4242 break;
4245 break;
4248 break;
4251 break;
4254 break;
4257 break;
4260 break;
4264 break;
4269 break;
4272 break;
4275 break;
4278 break;
4281 break;
4284 break;
4287 break;
4290 break;
4295 break;
4299 break;
4302 break;
4305 break;
4308 break;
4311 break;
4314 break;
4317 break;
4320 break;
4323 break;
4326 break;
4329 break;
4332 break;
4335 break;
4338 break;
4341 break;
4344 break;
4346 {
4347 children().append<DocSimpleList>(parser(),thisVariant());
4348 retval = children().get_last<DocSimpleList>()->parse();
4349 }
4350 break;
4352 {
4353 handleSection(cmdChar,cmdName);
4354 retval = Token::make_RetVal_Section();
4355 }
4356 break;
4358 {
4359 handleSection(cmdChar,cmdName);
4360 retval = Token::make_RetVal_Subsection();
4361 }
4362 break;
4364 {
4365 handleSection(cmdChar,cmdName);
4366 retval = Token::make_RetVal_Subsubsection();
4367 }
4368 break;
4370 {
4371 handleSection(cmdChar,cmdName);
4372 retval = Token::make_RetVal_Paragraph();
4373 }
4374 break;
4376 {
4377 handleSection(cmdChar,cmdName);
4378 retval = Token::make_RetVal_SubParagraph();
4379 }
4380 break;
4382 {
4383 handleSection(cmdChar,cmdName);
4384 retval = Token::make_RetVal_SubSubParagraph();
4385 }
4386 break;
4388 {
4390 retval = handleStartCode();
4391 }
4392 break;
4394 {
4396 retval = handleStartCode();
4397 }
4398 break;
4400 {
4402 retval = parser()->tokenizer.lex();
4404 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4405 {
4406 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"htmlonly section ended without end marker");
4407 }
4409 }
4410 break;
4412 {
4414 retval = parser()->tokenizer.lex();
4416 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4417 {
4418 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"manonly section ended without end marker");
4419 }
4421 }
4422 break;
4424 {
4426 retval = parser()->tokenizer.lex();
4428 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4429 {
4430 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"rtfonly section ended without end marker");
4431 }
4433 }
4434 break;
4436 {
4438 retval = parser()->tokenizer.lex();
4440 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4441 {
4442 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"latexonly section ended without end marker");
4443 }
4445 }
4446 break;
4448 {
4450 retval = parser()->tokenizer.lex();
4452 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4453 {
4454 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"xmlonly section ended without end marker");
4455 }
4457 }
4458 break;
4460 {
4462 retval = parser()->tokenizer.lex();
4464 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4465 {
4466 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"docbookonly section ended without end marker");
4467 }
4469 }
4470 break;
4472 {
4475 parser()->tokenizer.lex();
4476
4477 QCString fullMatch = parser()->context.token->verb;
4478 int idx = fullMatch.find('{');
4479 int idxEnd = fullMatch.find("}",idx+1);
4480 StringVector optList;
4481 if (idx != -1) // options present
4482 {
4483 QCString optStr = fullMatch.mid(idx+1,idxEnd-idx-1).stripWhiteSpace();
4484 optList = split(optStr.str(),",");
4485 for (const auto &opt : optList)
4486 {
4487 if (opt.empty()) continue;
4488 QCString locOpt(opt);
4489 locOpt = locOpt.stripWhiteSpace().lower();
4490 if (locOpt == "code")
4491 {
4493 }
4494 else if (!locOpt.isEmpty())
4495 {
4496 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Unknown option '{}' for '\\iliteral'",opt);
4497 }
4498 }
4499 }
4500
4502 retval = parser()->tokenizer.lex();
4504 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4505 {
4506 if (t == DocVerbatim::JavaDocCode)
4507 {
4508 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"javadoc code section ended without end marker");
4509 }
4510 else
4511 {
4512 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"javadoc literal section ended without end marker");
4513 }
4514 }
4516 }
4517 break;
4520 {
4521 if (cmdId == CommandType::CMD_VERBATIM)
4522 {
4524 }
4525 else
4526 {
4528 }
4529 retval = parser()->tokenizer.lex();
4531 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4532 {
4533 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"verbatim section ended without end marker");
4534 }
4536 }
4537 break;
4539 {
4540 children().append<DocVerbatim>(parser(),thisVariant(),
4546 DocVerbatim *dv = children().get_last<DocVerbatim>();
4548 QCString width,height;
4549 parser()->defaultHandleTitleAndSize(CommandType::CMD_DOT,&children().back(),dv->children(),width,height);
4551 retval = parser()->tokenizer.lex();
4552 dv->setText(parser()->context.token->verb);
4553 dv->setWidth(width);
4554 dv->setHeight(height);
4555 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4556 if (!Config_getBool(HAVE_DOT))
4557 {
4558 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"ignoring \\dot command because HAVE_DOT is not set");
4559 children().pop_back();
4560 }
4561 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4562 {
4563 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"dot section ended without end marker");
4564 }
4566 }
4567 break;
4569 {
4570 children().append<DocVerbatim>(parser(),thisVariant(),
4576 DocVerbatim *dv = children().get_last<DocVerbatim>();
4578 QCString width,height;
4579 parser()->defaultHandleTitleAndSize(CommandType::CMD_MSC,&children().back(),dv->children(),width,height);
4581 retval = parser()->tokenizer.lex();
4582 dv->setText(parser()->context.token->verb);
4583 dv->setWidth(width);
4584 dv->setHeight(height);
4585 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4586 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4587 {
4588 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"msc section ended without end marker");
4589 }
4591 }
4592 break;
4594 {
4595 QCString jarPath = Config_getString(PLANTUML_JAR_PATH);
4597 parser()->tokenizer.lex();
4598 QCString fullMatch = parser()->context.token->sectionId;
4599 QCString sectionId = "";
4600 int idx = fullMatch.find('{');
4601 int idxEnd = fullMatch.find("}",idx+1);
4602 StringVector optList;
4603 QCString engine;
4604 if (idx != -1) // options present
4605 {
4606 QCString optStr = fullMatch.mid(idx+1,idxEnd-idx-1).stripWhiteSpace();
4607 optList = split(optStr.str(),",");
4608 for (const auto &opt : optList)
4609 {
4610 if (opt.empty()) continue;
4611 bool found = false;
4612 QCString locOpt(opt);
4613 locOpt = locOpt.stripWhiteSpace().lower();
4614 if (g_plantumlEngine.find(locOpt.str())!=g_plantumlEngine.end())
4615 {
4616 if (!engine.isEmpty())
4617 {
4618 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Multiple definition of engine for '\\startuml'");
4619 }
4620 engine = locOpt;
4621 found = true;
4622 }
4623 if (!found)
4624 {
4625 if (sectionId.isEmpty())
4626 {
4627 sectionId = opt;
4628 }
4629 else
4630 {
4631 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple use of filename for '\\startuml'");
4632 }
4633 }
4634 }
4635 }
4636 else
4637 {
4638 sectionId = parser()->context.token->sectionId;
4639 }
4640 if (engine.isEmpty()) engine = "uml";
4641
4642 if (sectionId.isEmpty())
4643 {
4645 retval = parser()->tokenizer.lex();
4646 assert(retval.is(TokenRetval::RetVal_OK));
4647
4648 sectionId = parser()->context.token->sectionId;
4649 sectionId = sectionId.stripWhiteSpace();
4650 }
4651
4652 QCString plantFile(sectionId);
4653 children().append<DocVerbatim>(parser(),thisVariant(),
4657 FALSE,plantFile);
4658 DocVerbatim *dv = children().get_last<DocVerbatim>();
4659 dv->setEngine(engine);
4661 QCString width,height;
4662 parser()->defaultHandleTitleAndSize(CommandType::CMD_STARTUML,&children().back(),dv->children(),width,height);
4664 retval = parser()->tokenizer.lex();
4665 int line = 0;
4666 QCString trimmedVerb = stripLeadingAndTrailingEmptyLines(parser()->context.token->verb,line);
4667 if (engine == "ditaa")
4668 {
4669 dv->setUseBitmap(true);
4670 }
4671 else if (engine == "uml")
4672 {
4673 int i = trimmedVerb.find('\n');
4674 QCString firstLine = i==-1 ? trimmedVerb : trimmedVerb.left(i);
4675 if (firstLine.stripWhiteSpace() == "ditaa") dv->setUseBitmap(true);
4676 }
4677 dv->setText(trimmedVerb);
4678 dv->setWidth(width);
4679 dv->setHeight(height);
4680 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4681 if (jarPath.isEmpty())
4682 {
4683 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
4684 children().pop_back();
4685 }
4686 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4687 {
4688 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"startuml section ended without end marker");
4689 }
4691 }
4692 break;
4694 retval = Token::make_RetVal_EndParBlock();
4695 break;
4711 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command {}",parser()->context.token->name);
4712 break;
4714 retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,parser()->context.token->paramDir);
4716 break;
4718 retval = handleParamSection(cmdName,DocParamSect::TemplateParam,FALSE,parser()->context.token->paramDir);
4719 break;
4721 retval = handleParamSection(cmdName,DocParamSect::RetVal);
4722 break;
4725 break;
4727 retval = handleXRefItem();
4728 break;
4730 {
4731 children().append<DocLineBreak>(parser(),thisVariant());
4732 }
4733 break;
4736 {
4738 }
4739 break;
4741 {
4743 }
4744 break;
4746 {
4747 children().append<DocIndexEntry>(parser(),thisVariant(),
4750 retval = children().get_last<DocIndexEntry>()->parse();
4751 }
4752 break;
4754 retval = Token::make_RetVal_Internal();
4755 break;
4757 retval = Token::make_RetVal_EndInternal();
4758 break;
4760 {
4761 children().append<DocParBlock>(parser(),thisVariant());
4762 retval = children().get_last<DocParBlock>()->parse();
4763 }
4764 break;
4765 case CommandType::CMD_COPYDOC: // fall through
4766 case CommandType::CMD_COPYBRIEF: // fall through
4768 //retval = Token::make_RetVal_CopyDoc();
4769 // these commands should already be resolved by processCopyDoc()
4770 break;
4773 break;
4776 break;
4779 break;
4782 break;
4785 break;
4788 break;
4791 break;
4794 break;
4797 break;
4800 break;
4803 break;
4806 break;
4809 break;
4812 break;
4815 break;
4818 break;
4821 break;
4823 if (!Config_getBool(HAVE_DOT))
4824 {
4825 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
4826 "ignoring \\dotfile command because HAVE_DOT is not set");
4827 }
4828 else
4829 {
4830 handleFile<DocDotFile>(cmdName);
4831 }
4832 break;
4835 break;
4837 handleFile<DocMscFile>(cmdName);
4838 break;
4840 handleFile<DocDiaFile>(cmdName);
4841 break;
4844 break;
4846 handleLink(cmdName,FALSE);
4847 break;
4849 handleLink(cmdName,TRUE);
4850 break;
4852 handleCite(cmdChar,cmdName);
4853 break;
4855 handleEmoji(cmdChar,cmdName);
4856 break;
4858 handleDoxyConfig(cmdChar,cmdName);
4859 break;
4861 // fall through
4863 parser()->handleRef(thisVariant(),children(),cmdChar,cmdName);
4864 break;
4866 {
4867 children().append<DocSecRefList>(parser(),thisVariant());
4868 children().get_last<DocSecRefList>()->parse();
4869 }
4870 break;
4872 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command '{:c}{}'",cmdChar,parser()->context.token->name);
4873 break;
4875 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command '{:c}{}'",cmdChar,parser()->context.token->name);
4876 break;
4878 {
4879 children().append<DocFormula>(parser(),thisVariant(),parser()->context.token->id);
4880 }
4881 break;
4882 //case CommandType::CMD_LANGSWITCH:
4883 // retval = handleLanguageSwitch();
4884 // break;
4886 //warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command {}",parser()->context.token->name);
4887 {
4890 }
4891 break;
4894 break;
4896 handleShowDate(cmdChar,cmdName);
4897 break;
4899 parser()->handleILine(cmdChar,cmdName);
4900 break;
4902 parser()->handleIFile(cmdChar,cmdName);
4903 break;
4905 {
4907 (void)parser()->tokenizer.lex();
4909 //printf("Found scope='%s'\n",qPrint(parser()->context.context));
4911 }
4912 break;
4913 default:
4914 // we should not get here!
4915 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected command '{}' in paragraph context",cmdName);
4916 break;
4917 }
4918 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_OK,TokenRetval::RetVal_SimpleSec
4919 TokenRetval::TK_LISTITEM,TokenRetval::TK_ENDLIST,TokenRetval::TK_NEWPARA
4920 TokenRetval::RetVal_Section,TokenRetval::RetVal_EndList
4921 TokenRetval::RetVal_Internal,TokenRetval::RetVal_SwitchLang
4922 TokenRetval::RetVal_EndInternal)
4923 );
4924 AUTO_TRACE_EXIT("retval={}",retval.to_string());
4925 return retval;
4926}
bool isAliasCmd(std::string_view aliasCmd)
Definition aliases.cpp:518
@ LatexInclude
Definition docnode.h:437
@ SnippetWithLines
Definition docnode.h:438
@ IncWithLines
Definition docnode.h:438
@ HtmlInclude
Definition docnode.h:437
@ VerbInclude
Definition docnode.h:437
@ DontInclude
Definition docnode.h:437
@ DocbookInclude
Definition docnode.h:439
Token handleSimpleSection(DocSimpleSect::Type t, bool xmlContext=FALSE)
Definition docnode.cpp:3446
void handleLink(const QCString &cmdName, bool isJavaLink)
Definition docnode.cpp:3924
void handleInheritDoc()
Definition docnode.cpp:4155
void handleCite(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3499
void handleInclude(const QCString &cmdName, DocInclude::Type t)
Definition docnode.cpp:3965
void handleDoxyConfig(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3635
void handleSection(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:4070
void handleFile(const QCString &cmdName)
Definition docnode.cpp:3885
Token handleParamSection(const QCString &cmdName, DocParamSect::Type t, bool xmlContext, int direction)
Definition docnode.cpp:3476
void handleEmoji(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3604
void handleIncludeOperator(const QCString &cmdName, DocIncOperator::Type t)
Definition docnode.cpp:3825
Token parse()
Definition docnode.cpp:5687
void handleVhdlFlow()
Definition docnode.cpp:3917
void handleShowDate(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3755
Token handleXRefItem()
Definition docnode.cpp:3733
Token handleStartCode()
Definition docnode.cpp:4119
void handleInternalRef(DocNodeVariant *parent, DocNodeList &children)
void handleRef(DocNodeVariant *parent, DocNodeList &children, char cmdChar, const QCString &cmdName)
void handleImage(DocNodeVariant *parent, DocNodeList &children)
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 defaultHandleTitleAndSize(const CommandType cmd, DocNodeVariant *parent, DocNodeList &children, QCString &width, QCString &height)
void setStateILiteralOpt()
void setStateILiteral()
void setStateCode()
void setStatePlantUMLOpt()
void setStateRtfOnly()
void setStateVerbatim()
void setStateLatexOnly()
void setStateManOnly()
void setStateDbOnly()
void setStateHtmlOnly()
void setStateICode()
void setStatePlantUML()
void setStateIVerbatim()
void setStateXmlOnly()
void setStateSetScope()
@ JavaDocLiteral
Definition docnode.h:378
static NamespaceDefMutable * globalScope
Definition doxygen.h:120
void pop_back()
removes the last element
Definition growvector.h:115
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:241
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:260
const std::string & str() const
Definition qcstring.h:552
std::string_view view() const
Definition qcstring.h:174
QCString left(size_t len) const
Definition qcstring.h:229
CommandType
Definition cmdmapper.h:29
@ CMD_ENDSECREFLIST
Definition cmdmapper.h:53
@ CMD_ENDLATEXONLY
Definition cmdmapper.h:51
@ CMD_ENDVERBATIM
Definition cmdmapper.h:54
@ CMD_DONTINCLUDE
Definition cmdmapper.h:46
@ CMD_SUBSUBSECTION
Definition cmdmapper.h:89
@ CMD_SUBSUBPARAGRAPH
Definition cmdmapper.h:161
@ CMD_INTERNALREF
Definition cmdmapper.h:65
@ CMD_ENDHTMLONLY
Definition cmdmapper.h:50
@ CMD_VERBINCLUDE
Definition cmdmapper.h:98
@ CMD_DOCBOOKINCLUDE
Definition cmdmapper.h:145
@ CMD_HTMLINCLUDE
Definition cmdmapper.h:60
@ CMD_SNIPWITHLINES
Definition cmdmapper.h:141
#define Config_getBool(name)
Definition config.h:33
#define Config_getString(name)
Definition config.h:32
static const StringUnorderedSet g_plantumlEngine
Definition docnode.cpp:70
#define INTERNAL_ASSERT(x)
Definition docnode.cpp:52
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:49
const Mapper< CommandType > * cmdMapper
#define TRUE
Definition qcstring.h:37
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1407
DocNodeStack nodeStack
Definition docparser_p.h:67
QCString exampleName
Definition docparser_p.h:82
const Definition * scope
Definition docparser_p.h:61
const MemberDef * memberDef
Definition docparser_p.h:80
QCString verb
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
Definition util.cpp:5033

References DocNodeList::append(), DocSimpleSect::Attention, DocSimpleSect::Author, DocSimpleSect::Authors, AUTO_TRACE, AUTO_TRACE_EXIT, DocStyleChange::Bold, DocCompoundNode::children(), CMD_ADDINDEX, CMD_AMP, CMD_ANCHOR, CMD_AT, CMD_ATTENTION, CMD_AUTHOR, CMD_AUTHORS, CMD_BOLD, CMD_BSLASH, CMD_CITE, CMD_CODE, CMD_COPYBRIEF, CMD_COPYDETAILS, CMD_COPYDOC, CMD_COPYRIGHT, CMD_DATE, CMD_DBONLY, CMD_DCOLON, CMD_DIAFILE, CMD_DOCBOOKINCLUDE, CMD_DOLLAR, CMD_DONTINCLUDE, CMD_DOT, CMD_DOTFILE, CMD_DOXYCONFIG, CMD_EMOJI, CMD_EMPHASIS, CMD_ENDCODE, CMD_ENDDBONLY, CMD_ENDDOT, CMD_ENDHTMLONLY, CMD_ENDICODE, CMD_ENDILITERAL, CMD_ENDINTERNAL, CMD_ENDIVERBATIM, CMD_ENDLATEXONLY, CMD_ENDLINK, CMD_ENDMANONLY, CMD_ENDMSC, CMD_ENDPARBLOCK, CMD_ENDRTFONLY, CMD_ENDSECREFLIST, CMD_ENDUML, CMD_ENDVERBATIM, CMD_ENDXMLONLY, CMD_EQUAL, CMD_EXCEPTION, CMD_EXCLAMATION, CMD_FORMULA, CMD_GREATER, CMD_HASH, CMD_HTMLINCLUDE, CMD_HTMLONLY, CMD_IANCHOR, CMD_IFILE, CMD_ILINE, CMD_ILITERAL, CMD_IMAGE, CMD_IMPORTANT, CMD_INCLUDE, CMD_INCWITHLINES, CMD_INHERITDOC, CMD_INTERNAL, CMD_INTERNALREF, CMD_INVARIANT, CMD_IPREFIX, CMD_ISTARTCODE, CMD_IVERBATIM, CMD_JAVALINK, CMD_LATEXINCLUDE, CMD_LATEXONLY, CMD_LESS, CMD_LI, CMD_LINE, CMD_LINEBREAK, CMD_LINK, CMD_MANINCLUDE, CMD_MANONLY, CMD_MDASH, CMD_MINUS, CMD_MSC, CMD_MSCFILE, CMD_NDASH, CMD_NOTE, CMD_PAR, CMD_PARAGRAPH, CMD_PARAM, CMD_PARBLOCK, CMD_PERCENT, CMD_PIPE, CMD_PLANTUMLFILE, CMD_PLUS, CMD_POST, CMD_PRE, CMD_PUNT, CMD_QUESTION, CMD_QUOTE, CMD_REF, CMD_REMARK, CMD_RETURN, CMD_RETVAL, CMD_RTFINCLUDE, CMD_RTFONLY, CMD_SA, CMD_SECREFITEM, CMD_SECREFLIST, CMD_SECTION, CMD_SETSCOPE, CMD_SHOWDATE, CMD_SINCE, CMD_SKIP, CMD_SKIPLINE, CMD_SNIPPET, CMD_SNIPWITHLINES, CMD_STARTCODE, CMD_STARTUML, CMD_SUBPAGE, CMD_SUBPARAGRAPH, CMD_SUBSECTION, CMD_SUBSUBPARAGRAPH, CMD_SUBSUBSECTION, CMD_TPARAM, CMD_UNTIL, CMD_VERBATIM, CMD_VERBINCLUDE, CMD_VERSION, CMD_VHDLFLOW, CMD_WARNING, CMD_XMLINCLUDE, CMD_XMLONLY, CMD_XREFITEM, Mappers::cmdMapper, DocStyleChange::Code, Config_getBool, Config_getString, DocParser::context, DocParserContext::context, DocSimpleSect::Copyright, DocSimpleSect::Date, DocParser::defaultHandleTitleAndSize(), DocInclude::DocbookInclude, DocVerbatim::DocbookOnly, DocInclude::DontInclude, DocVerbatim::Dot, DocParserContext::exampleName, DocParamSect::Exception, FALSE, QCString::find(), g_plantumlEngine, DocNodeList::get_last(), Doxygen::globalScope, DocParser::handleAnchor(), handleCite(), handleDoxyConfig(), handleEmoji(), handleFile(), DocParser::handleIFile(), DocParser::handleILine(), DocParser::handleImage(), handleInclude(), handleIncludeOperator(), handleInheritDoc(), DocParser::handleInternalRef(), handleLink(), handleParamSection(), DocParser::handlePrefix(), DocParser::handleRef(), handleSection(), handleShowDate(), handleSimpleSection(), handleStartCode(), DocParser::handleStyleArgument(), handleVhdlFlow(), handleXRefItem(), DocParserContext::hasReturnCommand, DocInclude::HtmlInclude, DocVerbatim::HtmlOnly, TokenInfo::id, DocSimpleSect::Important, DocInclude::Include, DocInclude::IncWithLines, DocParserContext::inSeeBlock, INTERNAL_ASSERT, DocSimpleSect::Invar, Token::is_any_of(), isAliasCmd(), QCString::isEmpty(), DocParserContext::isExample, DocStyleChange::Italic, DocVerbatim::JavaDocCode, DocVerbatim::JavaDocLiteral, DocInclude::LatexInclude, DocVerbatim::LatexOnly, QCString::left(), DocTokenizer::lex(), DocIncOperator::Line, QCString::lower(), DocInclude::ManInclude, DocVerbatim::ManOnly, DocParserContext::memberDef, QCString::mid(), DocVerbatim::Msc, TokenInfo::name, DocParserContext::nodeStack, DocSimpleSect::Note, DocParamSect::Param, DocParserContext::paramPosition, parse(), DocNode::parser(), DocVerbatim::PlantUML, GrowVector< T >::pop_back(), DocSimpleSect::Post, DocSimpleSect::Pre, DocSimpleSect::Remark, DocSimpleSect::Return, DocParamSect::RetVal, DocInclude::RtfInclude, DocVerbatim::RtfOnly, DocParserContext::scope, TokenInfo::sectionId, DocSimpleSect::See, DocVerbatim::setEngine(), DocTokenizer::setStateCode(), DocTokenizer::setStateDbOnly(), DocTokenizer::setStateDot(), DocTokenizer::setStateHtmlOnly(), DocTokenizer::setStateICode(), DocTokenizer::setStateILiteral(), DocTokenizer::setStateILiteralOpt(), DocTokenizer::setStateIVerbatim(), DocTokenizer::setStateLatexOnly(), DocTokenizer::setStateManOnly(), DocTokenizer::setStateMsc(), DocTokenizer::setStatePara(), DocTokenizer::setStatePlantUML(), DocTokenizer::setStatePlantUMLOpt(), DocTokenizer::setStateRtfOnly(), DocTokenizer::setStateSetScope(), DocTokenizer::setStateVerbatim(), DocTokenizer::setStateXmlOnly(), DocSimpleSect::Since, DocIncOperator::Skip, DocIncOperator::SkipLine, DocInclude::Snippet, DocInclude::SnippetWithLines, split(), QCString::str(), stripLeadingAndTrailingEmptyLines(), QCString::stripWhiteSpace(), HtmlEntityMapper::Sym_Amp, HtmlEntityMapper::Sym_At, HtmlEntityMapper::Sym_BSlash, HtmlEntityMapper::Sym_Dollar, HtmlEntityMapper::Sym_Dot, HtmlEntityMapper::Sym_DoubleColon, HtmlEntityMapper::Sym_Equal, HtmlEntityMapper::Sym_Exclam, HtmlEntityMapper::Sym_Greater, HtmlEntityMapper::Sym_Hash, HtmlEntityMapper::Sym_Less, HtmlEntityMapper::Sym_Minus, HtmlEntityMapper::Sym_Percent, HtmlEntityMapper::Sym_Pipe, HtmlEntityMapper::Sym_Plus, HtmlEntityMapper::Sym_Quest, HtmlEntityMapper::Sym_Quot, DocParamSect::TemplateParam, DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, TRUE, UNKNOWN, DocIncOperator::Until, DocSimpleSect::User, TokenInfo::verb, DocVerbatim::Verbatim, DocInclude::VerbInclude, DocSimpleSect::Version, QCString::view(), warn, warn_doc_error, DocSimpleSect::Warning, DocInclude::XmlInclude, and DocVerbatim::XmlOnly.

Referenced by parse().

◆ handleDoxyConfig()

void DocPara::handleDoxyConfig ( char cmdChar,
const QCString & cmdName )

Definition at line 3635 of file docnode.cpp.

3636{
3637 // get the argument of the cite command.
3638 Token tok=parser()->tokenizer.lex();
3639 if (!tok.is(TokenRetval::TK_WHITESPACE))
3640 {
3641 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3642 cmdChar,cmdName);
3643 return;
3644 }
3646 tok=parser()->tokenizer.lex();
3647 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3648 {
3649 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
3650 "argument of command '{:c}{}'",cmdChar,cmdName);
3651 return;
3652 }
3653 else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3654 {
3655 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3656 tok.to_string(),cmdChar,cmdName);
3657 return;
3658 }
3659 ConfigOption * opt = ConfigImpl::instance()->get(parser()->context.token->name);
3660 if (opt)
3661 {
3662 QCString optionValue;
3663 switch (opt->kind())
3664 {
3666 optionValue = *(static_cast<ConfigBool*>(opt)->valueStringRef());
3667 break;
3669 optionValue = *(static_cast<ConfigString*>(opt)->valueRef());
3670 break;
3672 optionValue = *(static_cast<ConfigEnum*>(opt)->valueRef());
3673 break;
3675 optionValue = *(static_cast<ConfigInt*>(opt)->valueStringRef());
3676 break;
3678 {
3679 StringVector *lst = static_cast<ConfigList*>(opt)->valueRef();
3680 optionValue="";
3681 if (!lst->empty())
3682 {
3683 std::string lstFormat = theTranslator->trWriteList(static_cast<int>(lst->size())).str();
3684 static const reg::Ex marker(R"(@(\d+))");
3685 reg::Iterator it(lstFormat,marker);
3686 reg::Iterator end;
3687 size_t index=0;
3688 // now replace all markers with the real text
3689 for ( ; it!=end ; ++it)
3690 {
3691 const auto &match = *it;
3692 size_t newIndex = match.position();
3693 size_t matchLen = match.length();
3694 optionValue += lstFormat.substr(index,newIndex-index);
3695 unsigned long entryIndex = std::stoul(match[1].str());
3696 if (entryIndex<(unsigned long)lst->size())
3697 {
3698 optionValue += lst->at(entryIndex);
3699 }
3700 index=newIndex+matchLen;
3701 }
3702 optionValue+=lstFormat.substr(index);
3703 }
3704 }
3705 break;
3707 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Obsolete setting for '{:c}{}': '{}'",
3708 cmdChar,cmdName,parser()->context.token->name);
3709 break;
3711 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),
3712 "Disabled setting (i.e. not supported in this doxygen executable) for '{:c}{}': '{}'",
3713 cmdChar,cmdName,parser()->context.token->name);
3714 break;
3716 // nothing to show here
3717 break;
3718 }
3719 if (!optionValue.isEmpty())
3720 {
3721 children().append<DocWord>(parser(),thisVariant(),optionValue);
3722 }
3723 }
3724 else
3725 {
3726 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Unknown option for '{:c}{}': '{}'",
3727 cmdChar,cmdName,parser()->context.token->name);
3729 }
3731}
static ConfigImpl * instance()
Definition configimpl.h:351
ConfigOption * get(const QCString &name) const
Definition configimpl.h:400
@ O_Disabled
Disabled compile time option.
Definition configimpl.h:55
@ O_List
A list of items.
Definition configimpl.h:49
@ O_Enum
A fixed set of items.
Definition configimpl.h:50
@ O_Bool
A boolean value.
Definition configimpl.h:53
@ O_String
A single item.
Definition configimpl.h:51
@ O_Obsolete
An obsolete option.
Definition configimpl.h:54
@ O_Int
An integer value.
Definition configimpl.h:52
@ O_Info
A section header.
Definition configimpl.h:48
OptionType kind() const
Definition configimpl.h:70
void setStateDoxyConfig()
virtual QCString trWriteList(int numEntries)=0
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175
Translator * theTranslator
Definition language.cpp:71
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Definition regex.cpp:855

References DocNodeList::append(), DocCompoundNode::children(), DocParser::context, end(), ConfigImpl::get(), ConfigImpl::instance(), Token::is(), Token::is_any_of(), QCString::isEmpty(), ConfigOption::kind(), DocTokenizer::lex(), TokenInfo::name, ConfigOption::O_Bool, ConfigOption::O_Disabled, ConfigOption::O_Enum, ConfigOption::O_Info, ConfigOption::O_Int, ConfigOption::O_List, ConfigOption::O_Obsolete, ConfigOption::O_String, DocNode::parser(), DocTokenizer::setStateDoxyConfig(), DocTokenizer::setStatePara(), theTranslator, DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, ConfigEnum::valueRef(), ConfigString::valueRef(), ConfigBool::valueStringRef(), ConfigInt::valueStringRef(), warn, and warn_doc_error.

Referenced by handleCommand().

◆ handleEmoji()

void DocPara::handleEmoji ( char cmdChar,
const QCString & cmdName )

Definition at line 3604 of file docnode.cpp.

3605{
3606 AUTO_TRACE();
3607 // get the argument of the emoji command.
3608 Token tok=parser()->tokenizer.lex();
3609 if (!tok.is(TokenRetval::TK_WHITESPACE))
3610 {
3611 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3612 cmdChar,cmdName);
3613 return;
3614 }
3616 tok=parser()->tokenizer.lex();
3617 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3618 {
3619 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"no emoji name given or unexpected end of comment block while parsing the "
3620 "argument of command '{:c}{}'",cmdChar,cmdName);
3622 return;
3623 }
3624 else if (!tok.is(TokenRetval::TK_WORD))
3625 {
3626 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3627 tok.to_string(),cmdChar,cmdName);
3629 return;
3630 }
3633}
void setStateEmoji()

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), DocParser::context, Token::is(), Token::is_any_of(), DocTokenizer::lex(), TokenInfo::name, DocNode::parser(), DocTokenizer::setStateEmoji(), DocTokenizer::setStatePara(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by handleCommand().

◆ handleFile()

template<class T>
void DocPara::handleFile ( const QCString & cmdName)

Definition at line 3885 of file docnode.cpp.

3886{
3887 AUTO_TRACE("cmdName={}",cmdName);
3888 QCString saveCmdName = cmdName;
3889 Token tok=parser()->tokenizer.lex();
3890 if (!tok.is(TokenRetval::TK_WHITESPACE))
3891 {
3892 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3893 saveCmdName);
3894 return;
3895 }
3897 tok=parser()->tokenizer.lex();
3899 if (!tok.is(TokenRetval::TK_WORD))
3900 {
3901 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of {}",
3902 tok.to_string(),saveCmdName);
3903 return;
3904 }
3905 QCString name = parser()->context.token->name;
3906 children().append<T>(parser(),thisVariant(),name,
3910 auto df = children().get_last<T>();
3911 if (!df->parse())
3912 {
3913 children().pop_back();
3914 }
3915}
void setStateFile()
int getLineNr() const
QCString fileName
Definition docparser_p.h:71

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), DocParser::context, DocParserContext::context, DocParserContext::fileName, DocNodeList::get_last(), DocTokenizer::getLineNr(), Token::is(), DocTokenizer::lex(), TokenInfo::name, DocNode::parser(), GrowVector< T >::pop_back(), DocTokenizer::setStateFile(), DocTokenizer::setStatePara(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by handleCommand().

◆ handleHtmlEndTag()

Token DocPara::handleHtmlEndTag ( const QCString & tagName)

Definition at line 5414 of file docnode.cpp.

5415{
5416 AUTO_TRACE("tagName={}",tagName);
5417 HtmlTagType tagId = Mappers::htmlTagMapper->map(tagName);
5418 Token retval = Token::make_RetVal_OK();
5419 switch (tagId)
5420 {
5422 if (!insideUL(thisVariant()))
5423 {
5424 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </ul> tag without matching <ul>");
5425 }
5426 else
5427 {
5428 retval = Token::make_RetVal_EndList();
5429 }
5430 break;
5432 if (!insideOL(thisVariant()))
5433 {
5434 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </ol> tag without matching <ol>");
5435 }
5436 else
5437 {
5438 retval = Token::make_RetVal_EndList();
5439 }
5440 break;
5442 if (!insideLI(thisVariant()))
5443 {
5444 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </li> tag without matching <li>");
5445 }
5446 else
5447 {
5448 // ignore </li> tags
5449 }
5450 break;
5452 if (!insideDetails(thisVariant()))
5453 {
5454 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </details> tag without matching <details>");
5455 }
5456 else
5457 {
5458 retval = Token::make_RetVal_EndHtmlDetails();
5459 }
5460 break;
5463 {
5464 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </blockquote> tag without matching <blockquote>");
5465 }
5466 else
5467 {
5468 retval = Token::make_RetVal_EndBlockQuote();
5469 }
5470 break;
5473 break;
5476 break;
5479 break;
5482 break;
5485 break;
5488 break;
5491 break;
5494 break;
5497 break;
5500 break;
5503 break;
5506 break;
5509 break;
5512 break;
5515 break;
5518 break;
5521 break;
5526 break;
5528 retval = Token::make_TK_NEWPARA();
5529 break;
5531 retval = Token::make_RetVal_EndDesc();
5532 break;
5534 // ignore </dt> tag
5535 break;
5537 // ignore </dd> tag
5538 break;
5540 retval = Token::make_RetVal_EndTable();
5541 break;
5543 retval = Token::make_RetVal_EndTableRow();
5544 break;
5546 retval = Token::make_RetVal_EndTableCell();
5547 break;
5549 retval = Token::make_RetVal_EndTableCell();
5550 break;
5554 // for time being ignore </t....> tag
5555 break;
5557 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </caption> found");
5558 break;
5560 //warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Illegal </br> tag found");
5561 break;
5563 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h1> found");
5564 break;
5566 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h2> found");
5567 break;
5569 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h3> found");
5570 break;
5572 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h4> found");
5573 break;
5575 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h5> found");
5576 break;
5578 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h6> found");
5579 break;
5581 break;
5583 // warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Illegal </hr> tag found");
5584 break;
5586 //warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </a> found");
5587 // ignore </a> tag (can be part of <a name=...></a>
5588 break;
5589
5591 break;
5593 retval = Token::make_TK_NEWPARA();
5594 break;
5607 retval = Token::make_RetVal_CloseXml();
5608 break;
5609 case HtmlTagType::XML_C:
5611 break;
5619 // These tags are defined in .Net but are currently unsupported
5620 break;
5622 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unsupported xml/html tag </{}> found", tagName);
5623 children().append<DocWord>(parser(),thisVariant(),"</"+tagName+">");
5624 break;
5625 default:
5626 // we should not get here!
5627 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected end tag {}",tagName);
5628 ASSERT(0);
5629 break;
5630 }
5631 AUTO_TRACE_EXIT("retval={}",retval.to_string());
5632 return retval;
5633}
void setInsidePreformatted(bool p)
Definition docnode.h:109
void handleStyleLeave(DocNodeVariant *parent, DocNodeList &children, DocStyleChange::Style s, const QCString &tagName)
void setInsidePre(bool b)
HtmlTagType
Definition cmdmapper.h:170
bool insideUL(const DocNodeVariant *n)
bool insideLI(const DocNodeVariant *n)
bool insideBlockQuote(const DocNodeVariant *n)
bool insideDetails(const DocNodeVariant *n)
bool insideOL(const DocNodeVariant *n)
const Mapper< HtmlTagType > * htmlTagMapper
#define ASSERT(x)
Definition qcstring.h:39

References DocNodeList::append(), ASSERT, AUTO_TRACE, AUTO_TRACE_EXIT, DocStyleChange::Bold, DocStyleChange::Center, DocCompoundNode::children(), DocStyleChange::Cite, DocStyleChange::Code, DocStyleChange::Del, DocStyleChange::Div, FALSE, DocParser::handleStyleLeave(), HTML_A, HTML_BLOCKQUOTE, HTML_BOLD, HTML_BR, HTML_CAPTION, HTML_CENTER, HTML_CITE, HTML_CODE, HTML_DD, HTML_DEL, HTML_DETAILS, HTML_DIV, HTML_DL, HTML_DT, HTML_EMPHASIS, HTML_H1, HTML_H2, HTML_H3, HTML_H4, HTML_H5, HTML_H6, HTML_HR, HTML_IMG, HTML_INS, HTML_KBD, HTML_LI, HTML_OL, HTML_P, HTML_PRE, HTML_S, HTML_SMALL, HTML_SPAN, HTML_STRIKE, HTML_SUB, HTML_SUP, HTML_TABLE, HTML_TBODY, HTML_TD, HTML_TFOOT, HTML_TH, HTML_THEAD, HTML_TR, HTML_TT, HTML_UL, HTML_UNDERLINE, Mappers::htmlTagMapper, DocStyleChange::Ins, insideBlockQuote(), insideDetails(), insideLI(), insideOL(), insideUL(), DocStyleChange::Italic, DocStyleChange::Kbd, DocNode::parser(), DocStyleChange::Preformatted, DocStyleChange::S, DocTokenizer::setInsidePre(), DocNode::setInsidePreformatted(), DocStyleChange::Small, DocStyleChange::Span, DocStyleChange::Strike, DocStyleChange::Subscript, DocStyleChange::Superscript, DocNode::thisVariant(), Token::to_string(), DocParser::tokenizer, DocStyleChange::Typewriter, DocStyleChange::Underline, UNKNOWN, warn_doc_error, XML_C, XML_DESCRIPTION, XML_EXAMPLE, XML_EXCEPTION, XML_INCLUDE, XML_INHERITDOC, XML_ITEM, XML_LIST, XML_LISTHEADER, XML_PARA, XML_PARAM, XML_PARAMREF, XML_PERMISSION, XML_REMARKS, XML_RETURNS, XML_SEE, XML_SEEALSO, XML_SUMMARY, XML_TERM, XML_TYPEPARAM, XML_TYPEPARAMREF, and XML_VALUE.

Referenced by parse().

◆ handleHtmlHeader()

Token DocPara::handleHtmlHeader ( const HtmlAttribList & tagHtmlAttribs,
int level )

Definition at line 4101 of file docnode.cpp.

4102{
4103 AUTO_TRACE();
4104 children().append<DocHtmlHeader>(parser(),thisVariant(),tagHtmlAttribs,level);
4105 Token retval = children().get_last<DocHtmlHeader>()->parse();
4106 return retval.is(TokenRetval::RetVal_OK) ? Token::make_TK_NEWPARA() : retval;
4107}

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), DocNodeList::get_last(), parse(), DocNode::parser(), and DocNode::thisVariant().

Referenced by handleHtmlStartTag().

◆ handleHtmlStartTag()

Token DocPara::handleHtmlStartTag ( const QCString & tagName,
const HtmlAttribList & tagHtmlAttribs )

Definition at line 4944 of file docnode.cpp.

4945{
4946 AUTO_TRACE("tagName={} #tagHtmlAttrs={}",tagName,tagHtmlAttribs.size());
4947 Token retval = Token::make_RetVal_OK();
4948 HtmlTagType tagId = Mappers::htmlTagMapper->map(tagName);
4949 if (parser()->context.token->emptyTag && !(tagId>HtmlTagType::XML_CmdMask) &&
4952 {
4953 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"HTML tag ('<{}/>') may not use the 'empty tag' XHTML syntax.",
4954 tagName);
4955 }
4956 switch (tagId)
4957 {
4959 if (!parser()->context.token->emptyTag)
4960 {
4961 children().append<DocHtmlList>(parser(),thisVariant(),
4962 tagHtmlAttribs,DocHtmlList::Unordered);
4963 retval=children().get_last<DocHtmlList>()->parse();
4964 }
4965 break;
4967 if (!parser()->context.token->emptyTag)
4968 {
4969 children().append<DocHtmlList>(parser(),thisVariant(),
4970 tagHtmlAttribs,DocHtmlList::Ordered);
4971 retval=children().get_last<DocHtmlList>()->parse();
4972 }
4973 break;
4975 if (parser()->context.token->emptyTag) break;
4977 {
4978 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"lonely <li> tag found");
4979 }
4980 else
4981 {
4982 retval = Token::make_RetVal_ListItem();
4983 }
4984 break;
4986 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Bold,tagName,&parser()->context.token->attribs);
4987 break;
4989 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::S,tagName,&parser()->context.token->attribs);
4990 break;
4992 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Strike,tagName,&parser()->context.token->attribs);
4993 break;
4995 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Del,tagName,&parser()->context.token->attribs);
4996 break;
4998 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Underline,tagName,&parser()->context.token->attribs);
4999 break;
5001 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Ins,tagName,&parser()->context.token->attribs);
5002 break;
5004 if (parser()->context.token->emptyTag) break;
5005 if (parser()->context.xmlComment)
5006 // for C# source or inside a <summary> or <remark> section we
5007 // treat <code> as an XML tag (so similar to @code)
5008 {
5010 retval = handleStartCode();
5011 }
5012 else // normal HTML markup
5013 {
5014 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Code,tagName,&parser()->context.token->attribs);
5015 }
5016 break;
5018 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Kbd,tagName,&parser()->context.token->attribs);
5019 break;
5021 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Typewriter,tagName,&parser()->context.token->attribs);
5022 break;
5024 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Italic,tagName,&parser()->context.token->attribs);
5025 break;
5027 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Div,tagName,&parser()->context.token->attribs);
5028 if (parser()->context.token->emptyTag) parser()->handleStyleLeave(thisVariant(),children(),DocStyleChange::Div,tagName);
5029 break;
5031 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Span,tagName,&parser()->context.token->attribs);
5032 if (parser()->context.token->emptyTag) parser()->handleStyleLeave(thisVariant(),children(),DocStyleChange::Span,tagName);
5033 break;
5035 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Subscript,tagName,&parser()->context.token->attribs);
5036 break;
5038 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Superscript,tagName,&parser()->context.token->attribs);
5039 break;
5041 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Center,tagName,&parser()->context.token->attribs);
5042 break;
5044 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Small,tagName,&parser()->context.token->attribs);
5045 break;
5047 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Cite,tagName,&parser()->context.token->attribs);
5048 break;
5050 if (parser()->context.token->emptyTag) break;
5051 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Preformatted,tagName,&parser()->context.token->attribs);
5054 break;
5056 retval = Token::make_TK_NEWPARA();
5057 break;
5059 if (!parser()->context.token->emptyTag)
5060 {
5061 children().append<DocHtmlDescList>(parser(),thisVariant(),tagHtmlAttribs);
5062 retval=children().get_last<DocHtmlDescList>()->parse();
5063 }
5064 break;
5066 if (insideDL(thisVariant()))
5067 {
5068 retval = Token::make_RetVal_DescTitle();
5069 }
5070 else
5071 {
5072 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag <dt> found");
5073 }
5074 break;
5076 if (insideDL(thisVariant()))
5077 {
5078 retval = Token::make_RetVal_DescData();
5079 }
5080 else
5081 {
5082 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag <dd> found");
5083 }
5084 break;
5086 if (!parser()->context.token->emptyTag)
5087 {
5088 children().append<DocHtmlTable>(parser(),thisVariant(),tagHtmlAttribs);
5089 retval=children().get_last<DocHtmlTable>()->parse();
5090 if (children().get_last<DocHtmlTable>()->children().empty()) children().pop_back();
5091 }
5092 break;
5094 retval = Token::make_RetVal_TableRow();
5095 break;
5097 retval = Token::make_RetVal_TableCell();
5098 break;
5100 retval = Token::make_RetVal_TableHCell();
5101 break;
5105 // for time being ignore </t....> tag
5106 break;
5108 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag <caption> found");
5109 break;
5111 {
5112 children().append<DocLineBreak>(parser(),thisVariant(),tagHtmlAttribs);
5113 }
5114 break;
5116 {
5117 children().append<DocHorRuler>(parser(),thisVariant(),tagHtmlAttribs);
5118 }
5119 break;
5121 retval = parser()->handleAHref(thisVariant(),children(),tagHtmlAttribs);
5122 break;
5124 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,1);
5125 break;
5127 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,2);
5128 break;
5130 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,3);
5131 break;
5133 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,4);
5134 break;
5136 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,5);
5137 break;
5139 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,6);
5140 break;
5142 {
5143 parser()->handleImg(thisVariant(),children(),tagHtmlAttribs);
5144 }
5145 break;
5147 if (!parser()->context.token->emptyTag)
5148 {
5149 children().append<DocHtmlDetails>(parser(),thisVariant(),tagHtmlAttribs);
5150 retval=children().get_last<DocHtmlDetails>()->parse();
5151 }
5152 break;
5154 if (!parser()->context.token->emptyTag)
5155 {
5156 children().append<DocHtmlBlockQuote>(parser(),thisVariant(),tagHtmlAttribs);
5157 retval = children().get_last<DocHtmlBlockQuote>()->parse();
5158 }
5159 break;
5160
5163 {
5164 if (!parser()->context.token->emptyTag)
5165 {
5167 while (n && !std::holds_alternative<DocHtmlDetails>(*n)) n=::parent(n);
5168 DocHtmlDetails *d = std::get_if<DocHtmlDetails>(n);
5169 if (d)
5170 {
5171 if (!d->summary()) // details section does not have a summary yet
5172 {
5173 d->parseSummary(n,parser()->context.token->attribs);
5174 }
5175 else
5176 {
5177 retval = Token::make_TK_NEWPARA();
5178 }
5179 }
5180 }
5181 }
5182 break;
5186 // fall through
5189 if (!children().empty())
5190 {
5191 retval = Token::make_TK_NEWPARA();
5192 }
5193 break;
5195 if (insideTable(thisVariant()))
5196 {
5197 retval = Token::make_RetVal_TableCell();
5198 }
5199 break;
5200 case HtmlTagType::XML_C:
5201 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Code,tagName,&parser()->context.token->attribs);
5202 break;
5205 {
5207 QCString paramName;
5208 if (findAttribute(tagHtmlAttribs,"name",&paramName))
5209 {
5210 if (paramName.isEmpty())
5211 {
5212 if (Config_getBool(WARN_NO_PARAMDOC))
5213 {
5214 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"empty 'name' attribute for <param{}> tag.",tagId==HtmlTagType::XML_PARAM?"":"type");
5215 }
5216 }
5217 else
5218 {
5219 retval = handleParamSection(paramName,
5221 TRUE);
5222 }
5223 }
5224 else
5225 {
5226 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'name' attribute from <param{}> tag.",tagId==HtmlTagType::XML_PARAM?"":"type");
5227 }
5228 }
5229 break;
5232 {
5233 QCString paramName;
5234 if (findAttribute(tagHtmlAttribs,"name",&paramName))
5235 {
5236 //printf("paramName=%s\n",qPrint(paramName));
5237 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,tagName,TRUE);
5238 children().append<DocWord>(parser(),thisVariant(),paramName);
5239 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,tagName,FALSE);
5240 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
5241 }
5242 else
5243 {
5244 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'name' attribute from <param{}ref> tag.",tagId==HtmlTagType::XML_PARAMREF?"":"type");
5245 }
5246 }
5247 break;
5249 {
5251 QCString exceptName;
5252 if (findAttribute(tagHtmlAttribs,"cref",&exceptName))
5253 {
5254 unescapeCRef(exceptName);
5255 retval = handleParamSection(exceptName,DocParamSect::Exception,TRUE);
5256 }
5257 else
5258 {
5259 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'cref' attribute from <exception> tag.");
5260 }
5261 }
5262 break;
5265 if (insideTable(thisVariant()))
5266 {
5267 retval = Token::make_RetVal_TableRow();
5268 }
5269 else if (insideUL(thisVariant()) || insideOL(thisVariant()))
5270 {
5271 retval = Token::make_RetVal_ListItem();
5272 }
5273 else
5274 {
5275 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"lonely <item> tag found");
5276 }
5277 break;
5282 break;
5284 if (insideTable(thisVariant()))
5285 {
5286 retval = Token::make_RetVal_TableCell();
5287 }
5288 break;
5290 // I'm not sure if <see> is the same as <seealso> or if it
5291 // should you link a member without producing a section. The
5292 // C# specification is extremely vague about this (but what else
5293 // can we expect from Microsoft...)
5294 {
5295 QCString cref;
5296 //printf("HtmlTagType::XML_SEE: empty tag=%d\n",parser()->context.token->emptyTag);
5297 if (findAttribute(tagHtmlAttribs,"cref",&cref))
5298 {
5299 unescapeCRef(cref);
5300 if (parser()->context.token->emptyTag) // <see cref="..."/> style
5301 {
5302 bool inSeeBlock = parser()->context.inSeeBlock;
5303 parser()->context.token->name = cref;
5306 parser()->context.inSeeBlock = inSeeBlock;
5307 }
5308 else // <see cref="...">...</see> style
5309 {
5311 children().append<DocLink>(parser(),thisVariant(),cref);
5312 DocLink *lnk = children().get_last<DocLink>();
5313 QCString leftOver = lnk->parse(FALSE,TRUE);
5314 if (!leftOver.isEmpty())
5315 {
5316 children().append<DocWord>(parser(),thisVariant(),leftOver);
5317 }
5318 }
5319 }
5320 else if (findAttribute(tagHtmlAttribs,"langword",&cref)) // <see langword="..."/> or <see langword="..."></see>
5321 {
5322 bool inSeeBlock = parser()->context.inSeeBlock;
5323 parser()->context.token->name = cref;
5325 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,tagName,TRUE);
5327 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,tagName,FALSE);
5328 parser()->context.inSeeBlock = inSeeBlock;
5329 }
5330 else
5331 {
5332 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'cref' or 'langword' attribute from <see> tag.");
5333 }
5334 }
5335 break;
5337 {
5339 QCString cref;
5340 if (findAttribute(tagHtmlAttribs,"cref",&cref))
5341 {
5342 unescapeCRef(cref);
5343 // Look for an existing "see" section
5344 DocNodeVariant *vss=nullptr;
5345 for (auto &n : children())
5346 {
5347 DocSimpleSect *candidate = std::get_if<DocSimpleSect>(&n);
5348 if (candidate && candidate->type()==DocSimpleSect::See)
5349 {
5350 vss = &n;
5351 }
5352 }
5353
5354 if (!vss) // start new section
5355 {
5356 children().append<DocSimpleSect>(parser(),thisVariant(),DocSimpleSect::See);
5357 vss = &children().back();
5358 }
5359
5360 std::get<DocSimpleSect>(*vss).appendLinkWord(cref);
5361 retval = Token::make_RetVal_OK();
5362 }
5363 else
5364 {
5365 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'cref' attribute from <seealso> tag.");
5366 }
5367 }
5368 break;
5370 {
5371 QCString type;
5372 findAttribute(tagHtmlAttribs,"type",&type);
5374 HtmlAttribList emptyList;
5375 if (type=="number")
5376 {
5377 listType=DocHtmlList::Ordered;
5378 }
5379 if (type=="table")
5380 {
5381 children().append<DocHtmlTable>(parser(),thisVariant(),emptyList);
5382 retval=children().get_last<DocHtmlTable>()->parseXml();
5383 if (children().get_last<DocHtmlTable>()->children().empty()) children().pop_back();
5384 }
5385 else
5386 {
5387 children().append<DocHtmlList>(parser(),thisVariant(),emptyList,listType);
5388 retval=children().get_last<DocHtmlList>()->parseXml();
5389 }
5390 }
5391 break;
5394 // These tags are defined in .Net but are currently unsupported
5396 break;
5398 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unsupported xml/html tag <{}> found", tagName);
5399 children().append<DocWord>(parser(),thisVariant(), "<"+tagName+parser()->context.token->attribsStr+">");
5400 break;
5403 break;
5404 default:
5405 // we should not get here!
5406 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected start tag {}",tagName);
5407 ASSERT(0);
5408 break;
5409 }
5410 AUTO_TRACE_EXIT("retval={}",retval.to_string());
5411 return retval;
5412}
void parseSummary(DocNodeVariant *, HtmlAttribList &attribs)
Definition docnode.cpp:1518
const DocNodeVariant * summary() const
Definition docnode.h:864
Token handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs, int level)
Definition docnode.cpp:4101
void handleLinkedWord(DocNodeVariant *parent, DocNodeList &children, bool ignoreAutoLinkFlag=FALSE)
Token handleAHref(DocNodeVariant *parent, DocNodeList &children, const HtmlAttribList &tagHtmlAttribs)
void handleStyleEnter(DocNodeVariant *parent, DocNodeList &children, DocStyleChange::Style s, const QCString &tagName, const HtmlAttribList *attribs)
void handleImg(DocNodeVariant *parent, DocNodeList &children, const HtmlAttribList &tagHtmlAttribs)
Type type() const
Definition docnode.h:1026
void setStateXmlCode()
T & back()
access the last element
Definition growvector.h:135
static void unescapeCRef(QCString &s)
Definition docnode.cpp:83
static bool findAttribute(const HtmlAttribList &tagHtmlAttribs, const char *attrName, QCString *result)
Definition docnode.cpp:4928
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
Definition docnode.h:67
bool insideTable(const DocNodeVariant *n)
bool insideDL(const DocNodeVariant *n)
QCString attribsStr

References DocNodeList::append(), ASSERT, TokenInfo::attribsStr, AUTO_TRACE, AUTO_TRACE_EXIT, GrowVector< T >::back(), DocStyleChange::Bold, DocStyleChange::Center, DocCompoundNode::children(), DocStyleChange::Cite, DocStyleChange::Code, Config_getBool, DocParser::context, DocStyleChange::Del, DocStyleChange::Div, DocParamSect::Exception, FALSE, findAttribute(), DocNodeList::get_last(), DocParser::handleAHref(), handleHtmlHeader(), DocParser::handleImg(), handleInheritDoc(), DocParser::handleLinkedWord(), handleParamSection(), handleSimpleSection(), handleStartCode(), DocParser::handleStyleEnter(), DocParser::handleStyleLeave(), DocParserContext::hasReturnCommand, HTML_A, HTML_BLOCKQUOTE, HTML_BOLD, HTML_BR, HTML_CAPTION, HTML_CENTER, HTML_CITE, HTML_CODE, HTML_DD, HTML_DEL, HTML_DETAILS, HTML_DIV, HTML_DL, HTML_DT, HTML_EMPHASIS, HTML_H1, HTML_H2, HTML_H3, HTML_H4, HTML_H5, HTML_H6, HTML_HR, HTML_IMG, HTML_INS, HTML_KBD, HTML_LI, HTML_OL, HTML_P, HTML_PRE, HTML_S, HTML_SMALL, HTML_SPAN, HTML_STRIKE, HTML_SUB, HTML_SUP, HTML_TABLE, HTML_TBODY, HTML_TD, HTML_TFOOT, HTML_TH, HTML_THEAD, HTML_TR, HTML_TT, HTML_UL, HTML_UNDERLINE, Mappers::htmlTagMapper, DocStyleChange::Ins, DocParserContext::inSeeBlock, insideDetails(), insideDL(), insideOL(), insideTable(), insideUL(), Token::is(), QCString::isEmpty(), DocStyleChange::Italic, DocStyleChange::Kbd, TokenInfo::name, DocParserContext::nodeStack, DocHtmlList::Ordered, DocParamSect::Param, DocNode::parent(), parse(), DocNode::parser(), DocHtmlDetails::parseSummary(), GrowVector< T >::pop_back(), DocStyleChange::Preformatted, DocSimpleSect::Return, DocStyleChange::S, DocSimpleSect::See, DocTokenizer::setInsidePre(), DocNode::setInsidePreformatted(), DocTokenizer::setStatePara(), DocTokenizer::setStateXmlCode(), DocStyleChange::Small, DocStyleChange::Span, DocStyleChange::Strike, DocStyleChange::Subscript, DocHtmlDetails::summary(), DocStyleChange::Superscript, DocParamSect::TemplateParam, DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, TRUE, DocSimpleSect::type(), DocStyleChange::Typewriter, DocStyleChange::Underline, unescapeCRef(), UNKNOWN, DocHtmlList::Unordered, warn_doc_error, XML_C, XML_CmdMask, XML_DESCRIPTION, XML_EXAMPLE, XML_EXCEPTION, XML_INCLUDE, XML_INHERITDOC, XML_ITEM, XML_LIST, XML_LISTHEADER, XML_PARA, XML_PARAM, XML_PARAMREF, XML_PERMISSION, XML_REMARKS, XML_RETURNS, XML_SEE, XML_SEEALSO, XML_SUMMARY, XML_TERM, XML_TYPEPARAM, XML_TYPEPARAMREF, XML_VALUE, and DocParserContext::xmlComment.

Referenced by parse().

◆ handleInclude()

void DocPara::handleInclude ( const QCString & cmdName,
DocInclude::Type t )

Definition at line 3965 of file docnode.cpp.

3966{
3967 AUTO_TRACE("cmdName={}",cmdName);
3968 QCString saveCmdName = cmdName;
3969 Token tok=parser()->tokenizer.lex();
3970 bool isBlock = false;
3971 bool trimLeft = false;
3972 bool localScope = false;
3973 bool stripCodeComments = Config_getBool(STRIP_CODE_COMMENTS);
3974 if (tok.is(TokenRetval::TK_WORD) && parser()->context.token->name=="{")
3975 {
3977 parser()->tokenizer.lex();
3979 StringVector optList=split(parser()->context.token->name.str(),",");
3980 auto contains = [&optList](const char *kw)
3981 {
3982 return std::find(optList.begin(),optList.end(),kw)!=optList.end();
3983 };
3984 localScope = contains("local");
3985 if (contains("nostrip"))
3986 {
3987 stripCodeComments = false;
3988 }
3989 else if (contains("strip"))
3990 {
3991 stripCodeComments = true;
3992 }
3993 if (t==DocInclude::Snippet && contains("trimleft"))
3994 {
3995 trimLeft = true;
3996 }
3997
3998 if (contains("lineno"))
3999 {
4003 }
4004 tok=parser()->tokenizer.lex();
4005 if (!tok.is(TokenRetval::TK_WHITESPACE))
4006 {
4007 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
4008 saveCmdName);
4009 return;
4010 }
4011 }
4012 else if (tok.is(TokenRetval::TK_WORD) && parser()->context.token->name=="[")
4013 {
4015 parser()->tokenizer.lex();
4016 isBlock = (parser()->context.token->name.stripWhiteSpace() == "block");
4018 parser()->tokenizer.lex();
4019 }
4020 else if (!tok.is(TokenRetval::TK_WHITESPACE))
4021 {
4022 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
4023 saveCmdName);
4024 return;
4025 }
4027 tok=parser()->tokenizer.lex();
4029 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4030 {
4031 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
4032 "argument of command {}",saveCmdName);
4033 return;
4034 }
4035 else if (!tok.is(TokenRetval::TK_WORD))
4036 {
4037 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of {}",
4038 tok.to_string(),saveCmdName);
4039 return;
4040 }
4041 QCString fileName = parser()->context.token->name;
4042 QCString blockId;
4044 {
4045 if (fileName == "this") fileName=parser()->context.fileName;
4047 tok=parser()->tokenizer.lex();
4049 if (!tok.is(TokenRetval::TK_WORD))
4050 {
4051 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected block identifier, but found token {} instead while parsing the {} command",
4052 tok.to_string(),saveCmdName);
4053 return;
4054 }
4055 blockId = "["+parser()->context.token->name+"]";
4056 }
4057
4058 children().append<DocInclude>(parser(),
4059 thisVariant(),
4060 fileName,
4061 localScope ? parser()->context.context : "",
4062 t,
4063 stripCodeComments,
4066 blockId,isBlock,trimLeft);
4067 children().get_last<DocInclude>()->parse();
4068}
@ DontIncWithLines
Definition docnode.h:439
void setStateSnippet()
void setStateBlock()

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), Config_getBool, DocParser::context, DocParserContext::context, DocInclude::DontInclude, DocInclude::DontIncWithLines, DocParserContext::exampleName, DocParserContext::fileName, DocNodeList::get_last(), DocInclude::Include, DocInclude::IncWithLines, Token::is(), Token::is_any_of(), DocParserContext::isExample, DocTokenizer::lex(), TokenInfo::name, parse(), DocNode::parser(), DocTokenizer::setStateBlock(), DocTokenizer::setStateFile(), DocTokenizer::setStateOptions(), DocTokenizer::setStatePara(), DocTokenizer::setStateSnippet(), DocInclude::Snippet, DocInclude::SnippetWithLines, split(), QCString::stripWhiteSpace(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by handleCommand().

◆ handleIncludeOperator()

void DocPara::handleIncludeOperator ( const QCString & cmdName,
DocIncOperator::Type t )

Definition at line 3825 of file docnode.cpp.

3826{
3827 AUTO_TRACE("cmdName={}",cmdName);
3828 QCString saveCmdName = cmdName;
3829 Token tok=parser()->tokenizer.lex();
3830 if (!tok.is(TokenRetval::TK_WHITESPACE))
3831 {
3832 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3833 saveCmdName);
3834 return;
3835 }
3837 tok=parser()->tokenizer.lex();
3839 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3840 {
3841 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
3842 "argument of command {}", saveCmdName);
3843 return;
3844 }
3845 else if (!tok.is(TokenRetval::TK_WORD))
3846 {
3847 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of {}",
3848 tok.to_string(),saveCmdName);
3849 return;
3850 }
3851 auto it1 = children().size()>=1 ? std::prev(children().end()) : children().end();
3852 auto it2 = children().size()>=2 ? std::prev(it1) : children().end();
3853 DocNodeVariant *n1 = it1!=children().end() ? &(*it1) : nullptr;
3854 DocNodeVariant *n2 = it2!=children().end() ? &(*it2) : nullptr;
3855 //TODO get from context the stripCodeComments()
3856 bool stripCodeComments = Config_getBool(STRIP_CODE_COMMENTS);
3857 children().append<DocIncOperator>(parser(),thisVariant(),t,
3860 stripCodeComments,
3863 );
3864 DocIncOperator *op = children().get_last<DocIncOperator>();
3865 DocIncOperator *n1_docIncOp = std::get_if<DocIncOperator>(n1);
3866 DocWhiteSpace *n1_docWs = std::get_if<DocWhiteSpace >(n1);
3867 DocIncOperator *n2_docIncOp = std::get_if<DocIncOperator>(n2);
3868 bool isFirst = !n1 || // no last node
3869 (!n1_docIncOp && !n1_docWs) || // last node is not operator or whitespace
3870 (n1_docWs && n2 && !n2_docIncOp); // last node is not operator
3871 op->markFirst(isFirst);
3872 op->markLast(true);
3873 if (n1_docIncOp)
3874 {
3875 n1_docIncOp->markLast(false);
3876 }
3877 else if (n1_docWs && n2_docIncOp)
3878 {
3879 n2_docIncOp->markLast(false);
3880 }
3881 op->parse();
3882}
void markLast(bool v=TRUE)
Definition docnode.h:505
bool isFirst() const
Definition docnode.h:1087
void setStatePattern()
size_t size() const
returns the number of elements
Definition growvector.h:93
iterator end()
returns an iterator to the end
Definition growvector.h:88

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), Config_getBool, DocParser::context, DocParserContext::context, end(), GrowVector< T >::end(), DocParserContext::exampleName, DocNodeList::get_last(), Token::is(), Token::is_any_of(), DocParserContext::isExample, isFirst(), DocTokenizer::lex(), DocIncOperator::markLast(), TokenInfo::name, DocNode::parser(), DocTokenizer::setStatePara(), DocTokenizer::setStatePattern(), GrowVector< T >::size(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by handleCommand().

◆ handleInheritDoc()

void DocPara::handleInheritDoc ( )

Definition at line 4155 of file docnode.cpp.

4156{
4157 if (parser()->context.memberDef) // inheriting docs from a member
4158 {
4159 const MemberDef *reMd = parser()->context.memberDef->reimplements();
4160 if (reMd) // member from which was inherited.
4161 {
4162 const MemberDef *thisMd = parser()->context.memberDef;
4163 //printf("{InheritDocs:%s=>%s}\n",qPrint(parser()->context.memberDef->qualifiedName()),qPrint(reMd->qualifiedName()));
4164 parser()->pushContext();
4165 parser()->context.scope=reMd->getOuterScope();
4166 if (parser()->context.scope!=Doxygen::globalScope)
4167 {
4169 }
4170 parser()->context.memberDef=reMd;
4171 while (!parser()->context.styleStack.empty()) parser()->context.styleStack.pop();
4172 while (!parser()->context.nodeStack.empty()) parser()->context.nodeStack.pop();
4173 parser()->context.copyStack.push_back(reMd);
4176 parser()->context.copyStack.pop_back();
4177 auto hasParamCommand = parser()->context.hasParamCommand;
4178 auto hasReturnCommand = parser()->context.hasReturnCommand;
4179 auto retvalsFound = parser()->context.retvalsFound;
4180 auto paramsFound = parser()->context.paramsFound;
4181 parser()->popContext();
4182 parser()->context.hasParamCommand = hasParamCommand;
4183 parser()->context.hasReturnCommand = hasReturnCommand;
4184 parser()->context.retvalsFound = retvalsFound;
4185 parser()->context.paramsFound = paramsFound;
4186 parser()->context.memberDef = thisMd;
4187 }
4188 }
4189}
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual QCString documentation() const =0
virtual Definition * getOuterScope() const =0
virtual const QCString & name() const =0
Token internalValidatingParseDoc(DocNodeVariant *parent, DocNodeList &children, const QCString &doc)
void popContext()
Definition docparser.cpp:75
void pushContext()
Definition docparser.cpp:60
virtual const MemberDef * reimplements() const =0
StringMultiSet retvalsFound
Definition docparser_p.h:76
DocStyleChangeStack styleStack
Definition docparser_p.h:68
StringMultiSet paramsFound
Definition docparser_p.h:77
DefinitionStack copyStack
Definition docparser_p.h:70

References Definition::briefDescription(), DocCompoundNode::children(), DocParser::context, DocParserContext::context, DocParserContext::copyStack, Definition::documentation(), Definition::getOuterScope(), Doxygen::globalScope, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParser::internalValidatingParseDoc(), DocParserContext::memberDef, Definition::name(), DocParserContext::nodeStack, DocParserContext::paramsFound, DocNode::parser(), DocParser::popContext(), DocParser::pushContext(), MemberDef::reimplements(), DocParserContext::retvalsFound, DocParserContext::scope, DocParserContext::styleStack, and DocNode::thisVariant().

Referenced by handleCommand(), and handleHtmlStartTag().

◆ handleLink()

void DocPara::handleLink ( const QCString & cmdName,
bool isJavaLink )

Definition at line 3924 of file docnode.cpp.

3925{
3926 AUTO_TRACE("cmdName={} isJavaLink={}",cmdName,isJavaLink);
3927 QCString saveCmdName = cmdName;
3928 Token tok=parser()->tokenizer.lex();
3929 if (!tok.is(TokenRetval::TK_WHITESPACE))
3930 {
3931 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3932 saveCmdName);
3933 return;
3934 }
3936 tok=parser()->tokenizer.lex();
3937 if (!tok.is(TokenRetval::TK_WORD))
3938 {
3939 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"{} as the argument of {}",
3940 tok.to_string(),saveCmdName);
3941 return;
3942 }
3943 if (saveCmdName == "javalink")
3944 {
3945 children().append<DocStyleChange>(parser(),thisVariant(),
3946 parser()->context.nodeStack.size(),
3947 DocStyleChange::Code,cmdName,TRUE);
3948 }
3951 DocLink *lnk = children().get_last<DocLink>();
3952 if (saveCmdName == "javalink")
3953 {
3954 children().append<DocStyleChange>(parser(),thisVariant(),
3955 parser()->context.nodeStack.size(),
3956 DocStyleChange::Code,cmdName,FALSE);
3957 }
3958 QCString leftOver = lnk->parse(isJavaLink);
3959 if (!leftOver.isEmpty())
3960 {
3961 children().append<DocWord>(parser(),thisVariant(),leftOver);
3962 }
3963}
void setStateLink()

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), DocStyleChange::Code, DocParser::context, FALSE, DocNodeList::get_last(), Token::is(), QCString::isEmpty(), DocTokenizer::lex(), TokenInfo::name, DocParserContext::nodeStack, DocNode::parser(), DocTokenizer::setStateLink(), DocTokenizer::setStatePara(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, TRUE, and warn_doc_error.

Referenced by handleCommand().

◆ handleParamSection()

Token DocPara::handleParamSection ( const QCString & cmdName,
DocParamSect::Type t,
bool xmlContext = FALSE,
int direction = DocParamSect::Unspecified )

Definition at line 3476 of file docnode.cpp.

3480{
3481 AUTO_TRACE();
3482 DocParamSect *ps = nullptr;
3483 if (!children().empty() && // previous element
3484 (ps=children().get_last<DocParamSect>()) && // was a param sect
3485 ps->type()==t) // of same type
3486 { // append to previous section ps
3487 }
3488 else // start new section
3489 {
3490 children().append<DocParamSect>(parser(),thisVariant(),t);
3491 ps = children().get_last<DocParamSect>();
3492 }
3493 Token rv=ps->parse(cmdName,xmlContext,
3494 static_cast<DocParamSect::Direction>(direction));
3495 AUTO_TRACE_EXIT("retval={}",rv.to_string());
3496 return (!rv.is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3497}
Token parse(const QCString &cmdName, bool xmlContext, Direction d)
Definition docnode.cpp:3397
Type type() const
Definition docnode.h:1068

References DocNodeList::append(), AUTO_TRACE, AUTO_TRACE_EXIT, DocCompoundNode::children(), FALSE, DocNodeList::get_last(), Token::is(), DocParamSect::parse(), DocNode::parser(), DocNode::thisVariant(), Token::to_string(), DocParamSect::type(), and DocParamSect::Unspecified.

Referenced by handleCommand(), and handleHtmlStartTag().

◆ handleSection()

void DocPara::handleSection ( char cmdChar,
const QCString & cmdName )

Definition at line 4070 of file docnode.cpp.

4071{
4072 AUTO_TRACE("cmdName={}",cmdName);
4073 QCString saveCmdName = cmdName;
4074 // get the argument of the section command.
4075 Token tok=parser()->tokenizer.lex();
4076 if (!tok.is(TokenRetval::TK_WHITESPACE))
4077 {
4078 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
4079 cmdChar,saveCmdName);
4080 return;
4081 }
4082 tok=parser()->tokenizer.lex();
4083 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4084 {
4085 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
4086 "argument of command '{:c}{}'", cmdChar,saveCmdName);
4087 return;
4088 }
4089 else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
4090 {
4091 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
4092 tok.to_string(),cmdChar,saveCmdName);
4093 return;
4094 }
4097 parser()->tokenizer.lex();
4099}
void setStateSkipTitle()

References AUTO_TRACE, DocParser::context, Token::is(), Token::is_any_of(), DocTokenizer::lex(), TokenInfo::name, DocNode::parser(), TokenInfo::sectionId, DocTokenizer::setStatePara(), DocTokenizer::setStateSkipTitle(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by handleCommand().

◆ handleShowDate()

void DocPara::handleShowDate ( char cmdChar,
const QCString & cmdName )

Definition at line 3755 of file docnode.cpp.

3756{
3757 AUTO_TRACE();
3758 QCString fmt;
3759 QCString date;
3760 Token tok=parser()->tokenizer.lex();
3761 if (!tok.is(TokenRetval::TK_WHITESPACE))
3762 {
3763 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3764 cmdChar,cmdName);
3765 return;
3766 }
3768 tok = parser()->tokenizer.lex();
3769 if (!tok.is(TokenRetval::TK_WORD))
3770 {
3771 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <format> argument for command '{:c}{}'",
3772 cmdChar,cmdName);
3774 return;
3775 }
3776 fmt = parser()->context.token->name;
3777
3779 tok = parser()->tokenizer.lex();
3780
3781 QCString specDateRaw = tok.is(TokenRetval::TK_WORD) ? parser()->context.token->name : QCString();
3782 QCString specDate = specDateRaw.stripWhiteSpace();
3783 bool specDateOnlyWS = !specDateRaw.isEmpty() && specDate.isEmpty();
3784 if (!specDate.isEmpty() && !tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3785 {
3786 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '{:c}{}'",
3787 cmdChar,cmdName);
3789 return;
3790 }
3791
3792 std::tm dat{};
3793 int specFormat=0;
3794 QCString err = dateTimeFromString(specDate,dat,specFormat);
3795 if (!err.isEmpty())
3796 {
3797 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '{:c}{}': {}",
3798 cmdChar,cmdName,err);
3800 return;
3801 }
3802
3803 int usedFormat=0;
3804 QCString dateTimeStr = formatDateTime(fmt,dat,usedFormat);
3805
3806 // warn the user if the format contains markers that are not explicitly filled in
3807 for (int i=0;i<SF_NumBits;i++)
3808 {
3809 int bitMask = 1<<i;
3810 if ((usedFormat&bitMask) && !(specFormat&bitMask)) // a part was used in the format string but its value was not specified.
3811 {
3812 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.",
3813 cmdChar,cmdName,fmt,SF_bit2str(i),specDate,SF_bit2str(i));
3814 }
3815 }
3816
3817 children().append<DocWord>(parser(),thisVariant(),dateTimeStr);
3818 if (specDateOnlyWS) // specDate is only whitespace
3819 {
3820 children().append<DocWhiteSpace>(parser(),thisVariant()," ");
3821 }
3823}
void setStateShowDate()
void setStateQuotedString()
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...
Definition datetime.cpp:174
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.
Definition datetime.cpp:133
constexpr const char * SF_bit2str(int bitNumber)
Helper function that returns the name related one of the SF bits.
Definition datetime.h:32
constexpr int SF_NumBits
number of bits in SF vector
Definition datetime.h:27
#define err(fmt,...)
Definition message.h:127

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), DocParser::context, dateTimeFromString(), err, formatDateTime(), Token::is(), Token::is_any_of(), QCString::isEmpty(), DocTokenizer::lex(), TokenInfo::name, DocNode::parser(), DocTokenizer::setStatePara(), DocTokenizer::setStateQuotedString(), DocTokenizer::setStateShowDate(), SF_bit2str(), SF_NumBits, QCString::stripWhiteSpace(), DocNode::thisVariant(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by handleCommand().

◆ handleSimpleSection()

Token DocPara::handleSimpleSection ( DocSimpleSect::Type t,
bool xmlContext = FALSE )

Definition at line 3446 of file docnode.cpp.

3447{
3448 AUTO_TRACE();
3449 DocSimpleSect *ss=nullptr;
3450 bool needsSeparator = FALSE;
3451 if (!children().empty() && // has previous element
3452 (ss=children().get_last<DocSimpleSect>()) && // was a simple sect
3453 ss->type()==t && // of same type
3454 t!=DocSimpleSect::User) // but not user defined
3455 {
3456 // append to previous section
3457 needsSeparator = TRUE;
3458 }
3459 else // start new section
3460 {
3461 children().append<DocSimpleSect>(parser(),thisVariant(),t);
3462 ss = children().get_last<DocSimpleSect>();
3463 }
3464 Token rv = Token::make_RetVal_OK();
3465 if (xmlContext)
3466 {
3467 return ss->parseXml();
3468 }
3469 else
3470 {
3471 rv = ss->parse(t==DocSimpleSect::User,needsSeparator);
3472 }
3473 return (!rv.is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3474}
Token parse(bool userTitle, bool needsSeparator)
Definition docnode.cpp:3109
Token parseXml()
Definition docnode.cpp:3163

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), FALSE, DocNodeList::get_last(), Token::is(), DocSimpleSect::parse(), DocNode::parser(), DocSimpleSect::parseXml(), DocNode::thisVariant(), TRUE, DocSimpleSect::type(), and DocSimpleSect::User.

Referenced by handleCommand(), and handleHtmlStartTag().

◆ handleStartCode()

Token DocPara::handleStartCode ( )

Definition at line 4119 of file docnode.cpp.

4120{
4121 AUTO_TRACE();
4122 Token retval = parser()->tokenizer.lex();
4123 QCString lang = parser()->context.token->name;
4124 if (!lang.isEmpty() && lang.at(0)!='.')
4125 {
4126 lang="."+lang;
4127 }
4128 if (parser()->context.xmlComment)
4129 {
4130 parser()->context.token->verb = substitute(substitute(parser()->context.token->verb,"&lt;","<"),"&gt;",">");
4131 }
4132 // search for the first non-whitespace line, index is stored in li
4133 size_t i=0,li=0,l=parser()->context.token->verb.length();
4134 while (i<l && (parser()->context.token->verb.at(i)==' ' || parser()->context.token->verb.at(i)=='\n'))
4135 {
4136 if (parser()->context.token->verb.at(i)=='\n') li=i+1;
4137 i++;
4138 }
4139 children().append<DocVerbatim>(parser(),thisVariant(),
4141 stripIndentation(parser()->context.token->verb.mid(li)),
4145 FALSE,lang);
4146 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4147 {
4148 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"code section ended without end marker");
4149 }
4151 AUTO_TRACE_EXIT("retval={}",retval.to_string());
4152 return retval;
4153}
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:593
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:571
QCString stripIndentation(const QCString &s, bool skipFirstLine)
Definition util.cpp:5972

References DocNodeList::append(), QCString::at(), AUTO_TRACE, AUTO_TRACE_EXIT, DocCompoundNode::children(), DocVerbatim::Code, DocParser::context, DocParserContext::context, DocParserContext::exampleName, FALSE, Token::is_any_of(), QCString::isEmpty(), DocParserContext::isExample, QCString::length(), DocTokenizer::lex(), TokenInfo::name, DocNode::parser(), DocTokenizer::setStatePara(), stripIndentation(), substitute(), DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, TokenInfo::verb, and warn_doc_error.

Referenced by handleCommand(), and handleHtmlStartTag().

◆ handleVhdlFlow()

void DocPara::handleVhdlFlow ( )

Definition at line 3917 of file docnode.cpp.

3918{
3919 AUTO_TRACE();
3920 children().append<DocVhdlFlow>(parser(),thisVariant());
3921 children().get_last<DocVhdlFlow>()->parse();
3922}

References DocNodeList::append(), AUTO_TRACE, DocCompoundNode::children(), DocNodeList::get_last(), parse(), DocNode::parser(), and DocNode::thisVariant().

Referenced by handleCommand().

◆ handleXRefItem()

Token DocPara::handleXRefItem ( )

Definition at line 3733 of file docnode.cpp.

3734{
3735 AUTO_TRACE();
3736 Token retval=parser()->tokenizer.lex();
3737 ASSERT(retval.is(TokenRetval::TK_WHITESPACE));
3739 retval=parser()->tokenizer.lex();
3740 if (retval.is(TokenRetval::RetVal_OK))
3741 {
3742 children().append<DocXRefItem>(parser(),thisVariant(),
3744 DocXRefItem *ref = children().get_last<DocXRefItem>();
3745 if (!ref->parse())
3746 {
3747 children().pop_back();
3748 }
3749 }
3751 return retval;
3752}
void setStateXRefItem()

References DocNodeList::append(), ASSERT, AUTO_TRACE, DocCompoundNode::children(), DocParser::context, DocNodeList::get_last(), TokenInfo::id, Token::is(), DocTokenizer::lex(), TokenInfo::name, DocNode::parser(), GrowVector< T >::pop_back(), DocTokenizer::setStatePara(), DocTokenizer::setStateXRefItem(), DocNode::thisVariant(), DocParserContext::token, and DocParser::tokenizer.

Referenced by handleCommand().

◆ injectToken()

bool DocPara::injectToken ( Token tok,
const QCString & tokText )

Definition at line 4112 of file docnode.cpp.

4113{
4114 AUTO_TRACE();
4115 parser()->context.token->name = tokText;
4116 return parser()->defaultHandleToken(thisVariant(),tok,children());
4117}
bool defaultHandleToken(DocNodeVariant *parent, Token tok, DocNodeList &children, bool handleWord=TRUE)

References AUTO_TRACE, DocCompoundNode::children(), DocParser::context, DocParser::defaultHandleToken(), TokenInfo::name, DocNode::parser(), DocNode::thisVariant(), and DocParserContext::token.

Referenced by DocSimpleSect::appendLinkWord().

◆ isEmpty()

bool DocPara::isEmpty ( ) const
inline

Definition at line 1084 of file docnode.h.

1084{ return children().empty(); }
bool empty() const
checks whether the container is empty
Definition growvector.h:140

References DocCompoundNode::children(), and GrowVector< T >::empty().

◆ isFirst()

bool DocPara::isFirst ( ) const
inline

Definition at line 1087 of file docnode.h.

1087{ return m_isFirst; }

References m_isFirst.

Referenced by handleIncludeOperator(), and DocParser::internalValidatingParseDoc().

◆ isLast()

bool DocPara::isLast ( ) const
inline

◆ markFirst()

◆ markLast()

◆ parse()

Token DocPara::parse ( )

Definition at line 5687 of file docnode.cpp.

5688{
5689 AUTO_TRACE();
5690 auto ns = AutoNodeStack(parser(),thisVariant());
5691 // handle style commands "inherited" from the previous paragraph
5693 Token tok=parser()->tokenizer.lex();
5694 Token retval = Token::make_TK_NONE();
5695 while (!tok.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF)) // get the next token
5696 {
5697reparsetoken:
5698 AUTO_TRACE_ADD("token '{}' at {}",tok.to_string(),parser()->tokenizer.getLineNr());
5699 if (tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD,TokenRetval::TK_SYMBOL,TokenRetval::TK_URL,
5700 TokenRetval::TK_COMMAND_AT,TokenRetval::TK_COMMAND_BS,TokenRetval::TK_HTMLTAG)
5701 )
5702 {
5703 AUTO_TRACE_ADD("name={}",parser()->context.token->name);
5704 }
5705 switch(tok.value())
5706 {
5707 case TokenRetval::TK_WORD:
5709 break;
5710 case TokenRetval::TK_LNKWORD:
5712 break;
5713 case TokenRetval::TK_URL:
5715 break;
5716 case TokenRetval::TK_WHITESPACE:
5717 {
5718 // prevent leading whitespace and collapse multiple whitespace areas
5719 if (insidePRE(thisVariant()) || // all whitespace is relevant
5720 (
5721 // remove leading whitespace
5722 !children().empty() &&
5723 // and whitespace after certain constructs
5724 !holds_one_of_alternatives<DocHtmlDescList, DocHtmlTable, DocHtmlList, DocSimpleSect,
5725 DocAutoList, DocSimpleList, DocHtmlHeader, DocHtmlBlockQuote,
5726 DocParamSect, DocHtmlDetails, DocXRefItem>(children().back())
5727 )
5728 )
5729 {
5730 children().append<DocWhiteSpace>(parser(),thisVariant(),parser()->context.token->chars);
5731 }
5732 }
5733 break;
5734 case TokenRetval::TK_LISTITEM:
5735 {
5736 AUTO_TRACE_ADD("found list item at {}",parser()->context.token->indent);
5737 const DocNodeVariant *n=parent();
5738 while (n && !std::holds_alternative<DocAutoList>(*n)) n=::parent(n);
5739 const DocAutoList *al = std::get_if<DocAutoList>(n);
5740 if (al) // we found an auto list up in the hierarchy
5741 {
5742 AUTO_TRACE_ADD("previous list item at {}",al->indent());
5743 if (al->indent()>=parser()->context.token->indent)
5744 // new item at the same or lower indent level
5745 {
5746 retval = Token::make_TK_LISTITEM();
5747 goto endparagraph;
5748 }
5749 }
5750
5751 // determine list depth
5752 int depth = 0;
5753 n=parent();
5754 while (n)
5755 {
5756 al = std::get_if<DocAutoList>(n);
5757 if (al && al->isEnumList()) depth++;
5758 n=::parent(n);
5759 }
5760
5761 // first item or sub list => create new list
5762 do
5763 {
5764 children().append<DocAutoList>(parser(),thisVariant(),
5766 parser()->context.token->isEnumList,depth,
5768 al = children().get_last<DocAutoList>();
5769 retval = children().get_last<DocAutoList>()->parse();
5770 } while (retval.is(TokenRetval::TK_LISTITEM) && // new list
5771 al->indent()==parser()->context.token->indent // at same indent level
5772 );
5773
5774 // check the return value
5775 if (retval.is(TokenRetval::RetVal_SimpleSec)) // auto list ended due to simple section command
5776 {
5777 // Reparse the token that ended the section at this level,
5778 // so a new simple section will be started at this level.
5779 // This is the same as unputting the last read token and continuing.
5781 if (parser()->context.token->name.startsWith("rcs:")) // RCS section
5782 {
5785 tok = Token::make_TK_RCSTAG();
5786 }
5787 else // other section
5788 {
5789 tok = Token::make_TK_COMMAND_BS();
5790 }
5791 AUTO_TRACE_ADD("reparsing command {}",parser()->context.token->name);
5792 goto reparsetoken;
5793 }
5794 else if (retval.is(TokenRetval::TK_ENDLIST))
5795 {
5796 if (al->indent()>parser()->context.token->indent) // end list
5797 {
5798 goto endparagraph;
5799 }
5800 else // continue with current paragraph
5801 {
5802 }
5803 }
5804 else // paragraph ended due to TokenRetval::TK_NEWPARA, TokenRetval::TK_LISTITEM, or EOF
5805 {
5806 goto endparagraph;
5807 }
5808 }
5809 break;
5810 case TokenRetval::TK_ENDLIST:
5811 AUTO_TRACE_ADD("Found end of list inside of paragraph at line {}",parser()->tokenizer.getLineNr());
5812 if (std::get_if<DocAutoListItem>(parent()))
5813 {
5814 const DocAutoList *al = std::get_if<DocAutoList>(::parent(parent()));
5815 if (al && al->indent()>=parser()->context.token->indent)
5816 {
5817 // end of list marker ends this paragraph
5818 retval = Token::make_TK_ENDLIST();
5819 goto endparagraph;
5820 }
5821 else
5822 {
5823 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"End of list marker found "
5824 "has invalid indent level");
5825 }
5826 }
5827 else
5828 {
5829 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"End of list marker found without any preceding "
5830 "list items");
5831 }
5832 break;
5833 case TokenRetval::TK_COMMAND_AT:
5834 // fall through
5835 case TokenRetval::TK_COMMAND_BS:
5836 {
5837 // see if we have to start a simple section
5838 CommandType cmd = Mappers::cmdMapper->map(parser()->context.token->name);
5839 const DocNodeVariant *n=parent();
5840 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5841 !std::holds_alternative<DocParamSect>(*n))
5842 {
5843 n=::parent(n);
5844 }
5846 {
5847 if (n) // already in a simple section
5848 {
5849 // simple section cannot start in this paragraph, need
5850 // to unwind the stack and remember the command.
5852 retval = Token::make_RetVal_SimpleSec();
5853 goto endparagraph;
5854 }
5855 }
5856 // see if we are in a simple list
5857 n=parent();
5858 while (n && !std::holds_alternative<DocSimpleListItem>(*n)) n=::parent(n);
5859 if (n)
5860 {
5861 if (cmd==CommandType::CMD_LI)
5862 {
5863 retval = Token::make_RetVal_ListItem();
5864 goto endparagraph;
5865 }
5866 }
5867
5868 // handle the command
5869 retval=handleCommand(tok.command_to_char(),parser()->context.token->name);
5870 AUTO_TRACE_ADD("handleCommand returns {}",retval.to_string());
5871
5872 // check the return value
5873 if (retval.is(TokenRetval::RetVal_SimpleSec))
5874 {
5875 // Reparse the token that ended the section at this level,
5876 // so a new simple section will be started at this level.
5877 // This is the same as unputting the last read token and continuing.
5879 if (parser()->context.token->name.startsWith("rcs:")) // RCS section
5880 {
5883 tok = Token::make_TK_RCSTAG();
5884 }
5885 else // other section
5886 {
5887 tok = Token::make_TK_COMMAND_BS();
5888 }
5889 AUTO_TRACE_ADD("reparsing command {}",parser()->context.token->name);
5890 goto reparsetoken;
5891 }
5892 else if (retval.value()>TokenRetval::TK_NONE && retval.value()<TokenRetval::RetVal_OK)
5893 {
5894 // the command ended with a new command, reparse this token
5895 tok = retval;
5896 goto reparsetoken;
5897 }
5898 else if (retval.value()!=TokenRetval::RetVal_OK) // end of file, end of paragraph, start or end of section
5899 // or some auto list marker
5900 {
5901 goto endparagraph;
5902 }
5903 }
5904 break;
5905 case TokenRetval::TK_HTMLTAG:
5906 {
5907 if (!parser()->context.token->endTag) // found a start tag
5908 {
5909 retval = handleHtmlStartTag(parser()->context.token->name,parser()->context.token->attribs);
5910 }
5911 else // found an end tag
5912 {
5914 {
5915 break; // new code has been pushed back to the scanner, need to reparse
5916 }
5917 retval = handleHtmlEndTag(parser()->context.token->name);
5918 }
5919 if (!retval.is(TokenRetval::RetVal_OK))
5920 {
5921 goto endparagraph;
5922 }
5923 }
5924 break;
5925 case TokenRetval::TK_SYMBOL:
5926 {
5927 HtmlEntityMapper::SymType s = DocSymbol::decodeSymbol(parser()->context.token->name);
5929 {
5930 children().append<DocSymbol>(parser(),thisVariant(),s);
5931 }
5932 else
5933 {
5935 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unsupported symbol '{}' found",
5936 parser()->context.token->name);
5937 }
5938 break;
5939 }
5940 case TokenRetval::TK_NEWPARA:
5941 retval = Token::make_TK_NEWPARA();
5942 goto endparagraph;
5943 case TokenRetval::TK_RCSTAG:
5944 {
5945 const DocNodeVariant *n=parent();
5946 while (n && !std::holds_alternative<DocSimpleSect>(*n) &&
5947 !std::holds_alternative<DocParamSect>(*n))
5948 {
5949 n=::parent(n);
5950 }
5951 if (n) // already in a simple section
5952 {
5953 // simple section cannot start in this paragraph, need
5954 // to unwind the stack and remember the command.
5957 retval = Token::make_RetVal_SimpleSec();
5958 goto endparagraph;
5959 }
5960
5961 // see if we are in a simple list
5962 children().append<DocSimpleSect>(parser(),thisVariant(),DocSimpleSect::Rcs);
5963 children().get_last<DocSimpleSect>()->parseRcs();
5964 }
5965 break;
5966 default:
5967 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5968 "Found unexpected token (id={})",tok.to_string());
5969 break;
5970 }
5971 tok=parser()->tokenizer.lex();
5972 }
5973 retval=Token::make_TK_NONE();
5974endparagraph:
5976 DocPara *par = std::get_if<DocPara>(parser()->context.nodeStack.top());
5977 if (!parser()->context.token->endTag && par &&
5978 retval.is(TokenRetval::TK_NEWPARA) && parser()->context.token->name.lower() == "p")
5979 {
5980 par->setAttribs(parser()->context.token->attribs);
5981 }
5982 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::TK_NEWPARA,TokenRetval::TK_LISTITEM,
5983 TokenRetval::TK_ENDLIST,TokenRetval::RetVal_OK)
5984 );
5985
5986 AUTO_TRACE_EXIT("retval={}",retval.to_string());
5987 return retval;
5988}
bool isEnumList() const
Definition docnode.h:580
int indent() const
Definition docnode.h:581
DocPara(DocParser *parser, DocNodeVariant *parent)
Definition docnode.cpp:3440
Token handleCommand(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:4192
Token handleHtmlStartTag(const QCString &tagName, const HtmlAttribList &tagHtmlAttribs)
Definition docnode.cpp:4944
void setAttribs(const HtmlAttribList &attribs)
Definition docnode.h:1112
Token handleHtmlEndTag(const QCString &tagName)
Definition docnode.cpp:5414
void handleInitialStyleCommands(DocNodeVariant *parent, DocNodeList &children)
void handlePendingStyleCommands(DocNodeVariant *parent, DocNodeList &children)
static HtmlEntityMapper::SymType decodeSymbol(const QCString &symName)
Definition docnode.cpp:154
TokenRetval value() const
char command_to_char() const
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:48
static bool checkIfHtmlEndTagEndsAutoList(DocParser *parser, const DocNodeVariant *n)
Definition docnode.cpp:5635
constexpr bool holds_one_of_alternatives(const DocNodeVariant &v)
returns true iff v holds one of types passed as template parameters
Definition docnode.h:1363
bool insidePRE(const DocNodeVariant *n)
bool isEnumList
QCString text
QCString chars
bool isCheckedList
QCString simpleSectText
bool isEMailAddr
QCString simpleSectName

References DocNodeList::append(), AUTO_TRACE, AUTO_TRACE_ADD, AUTO_TRACE_EXIT, TokenInfo::chars, checkIfHtmlEndTagEndsAutoList(), DocCompoundNode::children(), CMD_LI, Mappers::cmdMapper, Token::command_to_char(), DocParser::context, DocSymbol::decodeSymbol(), DocPara(), DocNodeList::get_last(), handleCommand(), handleHtmlEndTag(), handleHtmlStartTag(), DocParser::handleInitialStyleCommands(), DocParser::handleLinkedWord(), DocParser::handlePendingStyleCommands(), holds_one_of_alternatives(), DocAutoList::indent(), TokenInfo::indent, insidePRE(), INTERNAL_ASSERT, Token::is(), Token::is_any_of(), TokenInfo::isCheckedList, TokenInfo::isEMailAddr, DocAutoList::isEnumList(), TokenInfo::isEnumList, DocTokenizer::lex(), QCString::mid(), TokenInfo::name, DocNode::parent(), parse(), DocNode::parser(), DocSimpleSect::Rcs, setAttribs(), SIMPLESECT_BIT, TokenInfo::simpleSectName, TokenInfo::simpleSectText, HtmlEntityMapper::Sym_Unknown, TokenInfo::text, DocNode::thisVariant(), Token::to_string(), DocParserContext::token, DocParser::tokenizer, Token::value(), and warn_doc_error.

Referenced by handleCommand(), handleHtmlHeader(), handleHtmlStartTag(), handleInclude(), handleVhdlFlow(), DocHtmlBlockQuote::parse(), DocHtmlCell::parse(), DocHtmlDescData::parse(), DocHtmlDetails::parse(), DocHtmlListItem::parse(), parse(), DocParamList::parse(), DocParBlock::parse(), DocSimpleListItem::parse(), DocHtmlCell::parseXml(), and DocHtmlListItem::parseXml().

◆ setAttribs()

void DocPara::setAttribs ( const HtmlAttribList & attribs)
inline

Definition at line 1112 of file docnode.h.

1112{ m_attribs = attribs; }
const HtmlAttribList & attribs() const
Definition docnode.h:1111

References attribs(), and m_attribs.

Referenced by parse().

Member Data Documentation

◆ m_attribs

HtmlAttribList DocPara::m_attribs
private

Definition at line 1117 of file docnode.h.

Referenced by attribs(), and setAttribs().

◆ m_isFirst

bool DocPara::m_isFirst = false
private

Definition at line 1115 of file docnode.h.

Referenced by DocPara(), isFirst(), and markFirst().

◆ m_isLast

bool DocPara::m_isLast = false
private

Definition at line 1116 of file docnode.h.

Referenced by DocPara(), isLast(), and markLast().


The documentation for this class was generated from the following files: