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 3438 of file docnode.cpp.

3438 :
3441{
3442}
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 3497 of file docnode.cpp.

3498{
3499 AUTO_TRACE();
3500 QCString saveCmdName = cmdName;
3501 // get the argument of the cite command.
3502 Token tok=parser()->tokenizer.lex();
3503
3504 CiteInfoOption option;
3505 if (tok.is(TokenRetval::TK_WORD) && parser()->context.token->name=="{")
3506 {
3508 parser()->tokenizer.lex();
3509 StringVector optList=split(parser()->context.token->name.str(),",");
3510 for (auto const &opt : optList)
3511 {
3512 if (opt == "number")
3513 {
3514 if (!option.isUnknown())
3515 {
3516 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3517 }
3518 else
3519 {
3520 option = CiteInfoOption::makeNumber();
3521 }
3522 }
3523 else if (opt == "year")
3524 {
3525 if (!option.isUnknown())
3526 {
3527 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3528 }
3529 else
3530 {
3531 option = CiteInfoOption::makeYear();
3532 }
3533 }
3534 else if (opt == "shortauthor")
3535 {
3536 if (!option.isUnknown())
3537 {
3538 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3539 }
3540 else
3541 {
3543 }
3544 }
3545 else if (opt == "nopar")
3546 {
3547 option.setNoPar();
3548 }
3549 else if (opt == "nocite")
3550 {
3551 option.setNoCite();
3552 }
3553 else
3554 {
3555 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3556 }
3557 }
3558
3559 if (option.isUnknown()) option.changeToNumber();
3560
3562 tok=parser()->tokenizer.lex();
3563 if (!tok.is(TokenRetval::TK_WHITESPACE))
3564 {
3565 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3566 saveCmdName);
3567 return;
3568 }
3569 }
3570 else if (!tok.is(TokenRetval::TK_WHITESPACE))
3571 {
3572 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3573 cmdChar,saveCmdName);
3574 return;
3575 }
3576 else
3577 {
3578 option = CiteInfoOption::makeNumber();
3579 }
3580
3582 tok=parser()->tokenizer.lex();
3583 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3584 {
3585 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"THE ONE unexpected end of comment block while parsing the "
3586 "argument of command '{:c}{}'",cmdChar,saveCmdName);
3587 return;
3588 }
3589 else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3590 {
3591 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3592 tok.to_string(),cmdChar,saveCmdName);
3593 return;
3594 }
3596 children().append<DocCite>(
3598
3600}
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:93
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:6618

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 4190 of file docnode.cpp.

4191{
4192 AUTO_TRACE("cmdName={}",cmdName);
4193 Token retval = Token::make_RetVal_OK();
4194 CommandType cmdId = Mappers::cmdMapper->map(cmdName);
4195 switch (cmdId)
4196 {
4198 {
4199 std::string str{cmdChar};
4200 children().append<DocWord>(parser(),thisVariant(),str.c_str() + cmdName);
4201 if (isAliasCmd(cmdName.view()))
4202 {
4203 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Found unexpanded alias '{:c}{}'. Check if number of arguments passed is correct.",cmdChar,cmdName);
4204 }
4205 else
4206 {
4207 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Found unknown command '{:c}{}'",cmdChar,cmdName);
4208 }
4209 }
4210 break;
4212 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,cmdName,TRUE);
4213 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4214 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,cmdName,FALSE);
4215 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4216 break;
4218 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Bold,cmdName,TRUE);
4219 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4220 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Bold,cmdName,FALSE);
4221 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4222 break;
4224 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,cmdName,TRUE);
4225 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4226 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,cmdName,FALSE);
4227 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4228 break;
4231 break;
4234 break;
4237 break;
4240 break;
4243 break;
4246 break;
4249 break;
4252 break;
4255 break;
4258 break;
4262 break;
4267 break;
4270 break;
4273 break;
4276 break;
4279 break;
4282 break;
4285 break;
4288 break;
4293 break;
4297 break;
4300 break;
4303 break;
4306 break;
4309 break;
4312 break;
4315 break;
4318 break;
4321 break;
4324 break;
4327 break;
4330 break;
4333 break;
4336 break;
4339 break;
4342 break;
4344 {
4345 children().append<DocSimpleList>(parser(),thisVariant());
4346 retval = children().get_last<DocSimpleList>()->parse();
4347 }
4348 break;
4350 {
4351 handleSection(cmdChar,cmdName);
4352 retval = Token::make_RetVal_Section();
4353 }
4354 break;
4356 {
4357 handleSection(cmdChar,cmdName);
4358 retval = Token::make_RetVal_Subsection();
4359 }
4360 break;
4362 {
4363 handleSection(cmdChar,cmdName);
4364 retval = Token::make_RetVal_Subsubsection();
4365 }
4366 break;
4368 {
4369 handleSection(cmdChar,cmdName);
4370 retval = Token::make_RetVal_Paragraph();
4371 }
4372 break;
4374 {
4375 handleSection(cmdChar,cmdName);
4376 retval = Token::make_RetVal_SubParagraph();
4377 }
4378 break;
4380 {
4381 handleSection(cmdChar,cmdName);
4382 retval = Token::make_RetVal_SubSubParagraph();
4383 }
4384 break;
4386 {
4388 retval = handleStartCode();
4389 }
4390 break;
4392 {
4394 retval = handleStartCode();
4395 }
4396 break;
4398 {
4400 retval = parser()->tokenizer.lex();
4402 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4403 {
4404 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"htmlonly section ended without end marker");
4405 }
4407 }
4408 break;
4410 {
4412 retval = parser()->tokenizer.lex();
4414 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4415 {
4416 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"manonly section ended without end marker");
4417 }
4419 }
4420 break;
4422 {
4424 retval = parser()->tokenizer.lex();
4426 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4427 {
4428 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"rtfonly section ended without end marker");
4429 }
4431 }
4432 break;
4434 {
4436 retval = parser()->tokenizer.lex();
4438 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4439 {
4440 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"latexonly section ended without end marker");
4441 }
4443 }
4444 break;
4446 {
4448 retval = parser()->tokenizer.lex();
4450 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4451 {
4452 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"xmlonly section ended without end marker");
4453 }
4455 }
4456 break;
4458 {
4460 retval = parser()->tokenizer.lex();
4462 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4463 {
4464 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"docbookonly section ended without end marker");
4465 }
4467 }
4468 break;
4470 {
4473 parser()->tokenizer.lex();
4474
4475 QCString fullMatch = parser()->context.token->verb;
4476 int idx = fullMatch.find('{');
4477 int idxEnd = fullMatch.find("}",idx+1);
4478 StringVector optList;
4479 if (idx != -1) // options present
4480 {
4481 QCString optStr = fullMatch.mid(idx+1,idxEnd-idx-1).stripWhiteSpace();
4482 optList = split(optStr.str(),",");
4483 for (const auto &opt : optList)
4484 {
4485 if (opt.empty()) continue;
4486 QCString locOpt(opt);
4487 locOpt = locOpt.stripWhiteSpace().lower();
4488 if (locOpt == "code")
4489 {
4491 }
4492 else if (!locOpt.isEmpty())
4493 {
4494 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Unknown option '{}' for '\\iliteral'",opt);
4495 }
4496 }
4497 }
4498
4500 retval = parser()->tokenizer.lex();
4502 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4503 {
4504 if (t == DocVerbatim::JavaDocCode)
4505 {
4506 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"javadoc code section ended without end marker");
4507 }
4508 else
4509 {
4510 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"javadoc literal section ended without end marker");
4511 }
4512 }
4514 }
4515 break;
4518 {
4519 if (cmdId == CommandType::CMD_VERBATIM)
4520 {
4522 }
4523 else
4524 {
4526 }
4527 retval = parser()->tokenizer.lex();
4529 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4530 {
4531 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"verbatim section ended without end marker");
4532 }
4534 }
4535 break;
4537 {
4538 children().append<DocVerbatim>(parser(),thisVariant(),
4544 DocVerbatim *dv = children().get_last<DocVerbatim>();
4546 QCString width,height;
4547 parser()->defaultHandleTitleAndSize(CommandType::CMD_DOT,&children().back(),dv->children(),width,height);
4549 retval = parser()->tokenizer.lex();
4550 dv->setText(parser()->context.token->verb);
4551 dv->setWidth(width);
4552 dv->setHeight(height);
4553 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4554 if (!Config_getBool(HAVE_DOT))
4555 {
4556 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"ignoring \\dot command because HAVE_DOT is not set");
4557 children().pop_back();
4558 }
4559 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4560 {
4561 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"dot section ended without end marker");
4562 }
4564 }
4565 break;
4567 {
4568 children().append<DocVerbatim>(parser(),thisVariant(),
4574 DocVerbatim *dv = children().get_last<DocVerbatim>();
4576 QCString width,height;
4577 parser()->defaultHandleTitleAndSize(CommandType::CMD_MSC,&children().back(),dv->children(),width,height);
4579 retval = parser()->tokenizer.lex();
4580 dv->setText(parser()->context.token->verb);
4581 dv->setWidth(width);
4582 dv->setHeight(height);
4583 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4584 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4585 {
4586 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"msc section ended without end marker");
4587 }
4589 }
4590 break;
4592 {
4593 QCString jarPath = Config_getString(PLANTUML_JAR_PATH);
4595 parser()->tokenizer.lex();
4596 QCString fullMatch = parser()->context.token->sectionId;
4597 QCString sectionId = "";
4598 int idx = fullMatch.find('{');
4599 int idxEnd = fullMatch.find("}",idx+1);
4600 StringVector optList;
4601 QCString engine;
4602 if (idx != -1) // options present
4603 {
4604 QCString optStr = fullMatch.mid(idx+1,idxEnd-idx-1).stripWhiteSpace();
4605 optList = split(optStr.str(),",");
4606 for (const auto &opt : optList)
4607 {
4608 if (opt.empty()) continue;
4609 bool found = false;
4610 QCString locOpt(opt);
4611 locOpt = locOpt.stripWhiteSpace().lower();
4612 if (g_plantumlEngine.find(locOpt.str())!=g_plantumlEngine.end())
4613 {
4614 if (!engine.isEmpty())
4615 {
4616 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Multiple definition of engine for '\\startuml'");
4617 }
4618 engine = locOpt;
4619 found = true;
4620 }
4621 if (!found)
4622 {
4623 if (sectionId.isEmpty())
4624 {
4625 sectionId = opt;
4626 }
4627 else
4628 {
4629 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple use of filename for '\\startuml'");
4630 }
4631 }
4632 }
4633 }
4634 else
4635 {
4636 sectionId = parser()->context.token->sectionId;
4637 }
4638 if (engine.isEmpty()) engine = "uml";
4639
4640 if (sectionId.isEmpty())
4641 {
4643 retval = parser()->tokenizer.lex();
4644 assert(retval.is(TokenRetval::RetVal_OK));
4645
4646 sectionId = parser()->context.token->sectionId;
4647 sectionId = sectionId.stripWhiteSpace();
4648 }
4649
4650 QCString plantFile(sectionId);
4651 children().append<DocVerbatim>(parser(),thisVariant(),
4655 FALSE,plantFile);
4656 DocVerbatim *dv = children().get_last<DocVerbatim>();
4657 dv->setEngine(engine);
4659 QCString width,height;
4660 parser()->defaultHandleTitleAndSize(CommandType::CMD_STARTUML,&children().back(),dv->children(),width,height);
4662 retval = parser()->tokenizer.lex();
4663 int line = 0;
4664 QCString trimmedVerb = stripLeadingAndTrailingEmptyLines(parser()->context.token->verb,line);
4665 if (engine == "ditaa")
4666 {
4667 dv->setUseBitmap(true);
4668 }
4669 else if (engine == "uml")
4670 {
4671 int i = trimmedVerb.find('\n');
4672 QCString firstLine = i==-1 ? trimmedVerb : trimmedVerb.left(i);
4673 if (firstLine.stripWhiteSpace() == "ditaa") dv->setUseBitmap(true);
4674 }
4675 dv->setText(trimmedVerb);
4676 dv->setWidth(width);
4677 dv->setHeight(height);
4678 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4679 if (jarPath.isEmpty())
4680 {
4681 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
4682 children().pop_back();
4683 }
4684 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4685 {
4686 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"startuml section ended without end marker");
4687 }
4689 }
4690 break;
4692 retval = Token::make_RetVal_EndParBlock();
4693 break;
4709 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command {}",parser()->context.token->name);
4710 break;
4712 retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,parser()->context.token->paramDir);
4713 break;
4715 retval = handleParamSection(cmdName,DocParamSect::TemplateParam,FALSE,parser()->context.token->paramDir);
4716 break;
4718 retval = handleParamSection(cmdName,DocParamSect::RetVal);
4719 break;
4722 break;
4724 retval = handleXRefItem();
4725 break;
4727 {
4728 children().append<DocLineBreak>(parser(),thisVariant());
4729 }
4730 break;
4733 {
4735 }
4736 break;
4738 {
4740 }
4741 break;
4743 {
4744 children().append<DocIndexEntry>(parser(),thisVariant(),
4747 retval = children().get_last<DocIndexEntry>()->parse();
4748 }
4749 break;
4751 retval = Token::make_RetVal_Internal();
4752 break;
4754 retval = Token::make_RetVal_EndInternal();
4755 break;
4757 {
4758 children().append<DocParBlock>(parser(),thisVariant());
4759 retval = children().get_last<DocParBlock>()->parse();
4760 }
4761 break;
4762 case CommandType::CMD_COPYDOC: // fall through
4763 case CommandType::CMD_COPYBRIEF: // fall through
4765 //retval = Token::make_RetVal_CopyDoc();
4766 // these commands should already be resolved by processCopyDoc()
4767 break;
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;
4820 if (!Config_getBool(HAVE_DOT))
4821 {
4822 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
4823 "ignoring \\dotfile command because HAVE_DOT is not set");
4824 }
4825 else
4826 {
4827 handleFile<DocDotFile>(cmdName);
4828 }
4829 break;
4832 break;
4834 handleFile<DocMscFile>(cmdName);
4835 break;
4837 handleFile<DocDiaFile>(cmdName);
4838 break;
4841 break;
4843 handleLink(cmdName,FALSE);
4844 break;
4846 handleLink(cmdName,TRUE);
4847 break;
4849 handleCite(cmdChar,cmdName);
4850 break;
4852 handleEmoji(cmdChar,cmdName);
4853 break;
4855 handleDoxyConfig(cmdChar,cmdName);
4856 break;
4858 // fall through
4860 parser()->handleRef(thisVariant(),children(),cmdChar,cmdName);
4861 break;
4863 {
4864 children().append<DocSecRefList>(parser(),thisVariant());
4865 children().get_last<DocSecRefList>()->parse();
4866 }
4867 break;
4869 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command '{:c}{}'",cmdChar,parser()->context.token->name);
4870 break;
4872 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command '{:c}{}'",cmdChar,parser()->context.token->name);
4873 break;
4875 {
4876 children().append<DocFormula>(parser(),thisVariant(),parser()->context.token->id);
4877 }
4878 break;
4879 //case CommandType::CMD_LANGSWITCH:
4880 // retval = handleLanguageSwitch();
4881 // break;
4883 //warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command {}",parser()->context.token->name);
4884 {
4887 }
4888 break;
4891 break;
4893 handleShowDate(cmdChar,cmdName);
4894 break;
4896 parser()->handleILine(cmdChar,cmdName);
4897 break;
4899 parser()->handleIFile(cmdChar,cmdName);
4900 break;
4902 {
4904 (void)parser()->tokenizer.lex();
4906 //printf("Found scope='%s'\n",qPrint(parser()->context.context));
4908 }
4909 break;
4910 default:
4911 // we should not get here!
4912 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected command '{}' in paragraph context",cmdName);
4913 break;
4914 }
4915 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_OK,TokenRetval::RetVal_SimpleSec
4916 TokenRetval::TK_LISTITEM,TokenRetval::TK_ENDLIST,TokenRetval::TK_NEWPARA
4917 TokenRetval::RetVal_Section,TokenRetval::RetVal_EndList
4918 TokenRetval::RetVal_Internal,TokenRetval::RetVal_SwitchLang
4919 TokenRetval::RetVal_EndInternal)
4920 );
4921 AUTO_TRACE_EXIT("retval={}",retval.to_string());
4922 return retval;
4923}
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:3444
void handleLink(const QCString &cmdName, bool isJavaLink)
Definition docnode.cpp:3922
void handleInheritDoc()
Definition docnode.cpp:4153
void handleCite(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3497
void handleInclude(const QCString &cmdName, DocInclude::Type t)
Definition docnode.cpp:3963
void handleDoxyConfig(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3633
void handleSection(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:4068
void handleFile(const QCString &cmdName)
Definition docnode.cpp:3883
Token handleParamSection(const QCString &cmdName, DocParamSect::Type t, bool xmlContext, int direction)
Definition docnode.cpp:3474
void handleEmoji(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3602
void handleIncludeOperator(const QCString &cmdName, DocIncOperator::Type t)
Definition docnode.cpp:3823
Token parse()
Definition docnode.cpp:5684
void handleVhdlFlow()
Definition docnode.cpp:3915
void handleShowDate(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3753
Token handleXRefItem()
Definition docnode.cpp:3731
Token handleStartCode()
Definition docnode.cpp:4117
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:80
const Definition * scope
Definition docparser_p.h:61
const MemberDef * memberDef
Definition docparser_p.h:78
QCString verb
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
Definition util.cpp:5010

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, 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 3633 of file docnode.cpp.

3634{
3635 // get the argument of the cite command.
3636 Token tok=parser()->tokenizer.lex();
3637 if (!tok.is(TokenRetval::TK_WHITESPACE))
3638 {
3639 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3640 cmdChar,cmdName);
3641 return;
3642 }
3644 tok=parser()->tokenizer.lex();
3645 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3646 {
3647 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
3648 "argument of command '{:c}{}'",cmdChar,cmdName);
3649 return;
3650 }
3651 else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3652 {
3653 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3654 tok.to_string(),cmdChar,cmdName);
3655 return;
3656 }
3657 ConfigOption * opt = ConfigImpl::instance()->get(parser()->context.token->name);
3658 if (opt)
3659 {
3660 QCString optionValue;
3661 switch (opt->kind())
3662 {
3664 optionValue = *(static_cast<ConfigBool*>(opt)->valueStringRef());
3665 break;
3667 optionValue = *(static_cast<ConfigString*>(opt)->valueRef());
3668 break;
3670 optionValue = *(static_cast<ConfigEnum*>(opt)->valueRef());
3671 break;
3673 optionValue = *(static_cast<ConfigInt*>(opt)->valueStringRef());
3674 break;
3676 {
3677 StringVector *lst = static_cast<ConfigList*>(opt)->valueRef();
3678 optionValue="";
3679 if (!lst->empty())
3680 {
3681 std::string lstFormat = theTranslator->trWriteList(static_cast<int>(lst->size())).str();
3682 static const reg::Ex marker(R"(@(\d+))");
3683 reg::Iterator it(lstFormat,marker);
3684 reg::Iterator end;
3685 size_t index=0;
3686 // now replace all markers with the real text
3687 for ( ; it!=end ; ++it)
3688 {
3689 const auto &match = *it;
3690 size_t newIndex = match.position();
3691 size_t matchLen = match.length();
3692 optionValue += lstFormat.substr(index,newIndex-index);
3693 unsigned long entryIndex = std::stoul(match[1].str());
3694 if (entryIndex<(unsigned long)lst->size())
3695 {
3696 optionValue += lst->at(entryIndex);
3697 }
3698 index=newIndex+matchLen;
3699 }
3700 optionValue+=lstFormat.substr(index);
3701 }
3702 }
3703 break;
3705 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Obsolete setting for '{:c}{}': '{}'",
3706 cmdChar,cmdName,parser()->context.token->name);
3707 break;
3709 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),
3710 "Disabled setting (i.e. not supported in this doxygen executable) for '{:c}{}': '{}'",
3711 cmdChar,cmdName,parser()->context.token->name);
3712 break;
3714 // nothing to show here
3715 break;
3716 }
3717 if (!optionValue.isEmpty())
3718 {
3719 children().append<DocWord>(parser(),thisVariant(),optionValue);
3720 }
3721 }
3722 else
3723 {
3724 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Unknown option for '{:c}{}': '{}'",
3725 cmdChar,cmdName,parser()->context.token->name);
3727 }
3729}
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()
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:593
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 3602 of file docnode.cpp.

3603{
3604 AUTO_TRACE();
3605 // get the argument of the emoji command.
3606 Token tok=parser()->tokenizer.lex();
3607 if (!tok.is(TokenRetval::TK_WHITESPACE))
3608 {
3609 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3610 cmdChar,cmdName);
3611 return;
3612 }
3614 tok=parser()->tokenizer.lex();
3615 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3616 {
3617 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"no emoji name given or unexpected end of comment block while parsing the "
3618 "argument of command '{:c}{}'",cmdChar,cmdName);
3620 return;
3621 }
3622 else if (!tok.is(TokenRetval::TK_WORD))
3623 {
3624 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3625 tok.to_string(),cmdChar,cmdName);
3627 return;
3628 }
3631}
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 3883 of file docnode.cpp.

3884{
3885 AUTO_TRACE("cmdName={}",cmdName);
3886 QCString saveCmdName = cmdName;
3887 Token tok=parser()->tokenizer.lex();
3888 if (!tok.is(TokenRetval::TK_WHITESPACE))
3889 {
3890 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3891 saveCmdName);
3892 return;
3893 }
3895 tok=parser()->tokenizer.lex();
3897 if (!tok.is(TokenRetval::TK_WORD))
3898 {
3899 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of {}",
3900 tok.to_string(),saveCmdName);
3901 return;
3902 }
3903 QCString name = parser()->context.token->name;
3904 children().append<T>(parser(),thisVariant(),name,
3908 auto df = children().get_last<T>();
3909 if (!df->parse())
3910 {
3911 children().pop_back();
3912 }
3913}
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 5411 of file docnode.cpp.

5412{
5413 AUTO_TRACE("tagName={}",tagName);
5414 HtmlTagType tagId = Mappers::htmlTagMapper->map(tagName);
5415 Token retval = Token::make_RetVal_OK();
5416 switch (tagId)
5417 {
5419 if (!insideUL(thisVariant()))
5420 {
5421 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </ul> tag without matching <ul>");
5422 }
5423 else
5424 {
5425 retval = Token::make_RetVal_EndList();
5426 }
5427 break;
5429 if (!insideOL(thisVariant()))
5430 {
5431 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </ol> tag without matching <ol>");
5432 }
5433 else
5434 {
5435 retval = Token::make_RetVal_EndList();
5436 }
5437 break;
5439 if (!insideLI(thisVariant()))
5440 {
5441 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </li> tag without matching <li>");
5442 }
5443 else
5444 {
5445 // ignore </li> tags
5446 }
5447 break;
5449 if (!insideDetails(thisVariant()))
5450 {
5451 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </details> tag without matching <details>");
5452 }
5453 else
5454 {
5455 retval = Token::make_RetVal_EndHtmlDetails();
5456 }
5457 break;
5460 {
5461 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </blockquote> tag without matching <blockquote>");
5462 }
5463 else
5464 {
5465 retval = Token::make_RetVal_EndBlockQuote();
5466 }
5467 break;
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;
5523 break;
5525 retval = Token::make_TK_NEWPARA();
5526 break;
5528 retval = Token::make_RetVal_EndDesc();
5529 break;
5531 // ignore </dt> tag
5532 break;
5534 // ignore </dd> tag
5535 break;
5537 retval = Token::make_RetVal_EndTable();
5538 break;
5540 retval = Token::make_RetVal_EndTableRow();
5541 break;
5543 retval = Token::make_RetVal_EndTableCell();
5544 break;
5546 retval = Token::make_RetVal_EndTableCell();
5547 break;
5551 // for time being ignore </t....> tag
5552 break;
5554 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </caption> found");
5555 break;
5557 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Illegal </br> tag found");
5558 break;
5560 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h1> found");
5561 break;
5563 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h2> found");
5564 break;
5566 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h3> found");
5567 break;
5569 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h4> found");
5570 break;
5572 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h5> found");
5573 break;
5575 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h6> found");
5576 break;
5578 break;
5580 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Illegal </hr> tag found");
5581 break;
5583 //warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </a> found");
5584 // ignore </a> tag (can be part of <a name=...></a>
5585 break;
5586
5588 break;
5590 retval = Token::make_TK_NEWPARA();
5591 break;
5604 retval = Token::make_RetVal_CloseXml();
5605 break;
5606 case HtmlTagType::XML_C:
5608 break;
5616 // These tags are defined in .Net but are currently unsupported
5617 break;
5619 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unsupported xml/html tag </{}> found", tagName);
5620 children().append<DocWord>(parser(),thisVariant(),"</"+tagName+">");
5621 break;
5622 default:
5623 // we should not get here!
5624 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected end tag {}",tagName);
5625 ASSERT(0);
5626 break;
5627 }
5628 AUTO_TRACE_EXIT("retval={}",retval.to_string());
5629 return retval;
5630}
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 4099 of file docnode.cpp.

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

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 4941 of file docnode.cpp.

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

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

3824{
3825 AUTO_TRACE("cmdName={}",cmdName);
3826 QCString saveCmdName = cmdName;
3827 Token tok=parser()->tokenizer.lex();
3828 if (!tok.is(TokenRetval::TK_WHITESPACE))
3829 {
3830 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3831 saveCmdName);
3832 return;
3833 }
3835 tok=parser()->tokenizer.lex();
3837 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3838 {
3839 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
3840 "argument of command {}", saveCmdName);
3841 return;
3842 }
3843 else if (!tok.is(TokenRetval::TK_WORD))
3844 {
3845 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of {}",
3846 tok.to_string(),saveCmdName);
3847 return;
3848 }
3849 auto it1 = children().size()>=1 ? std::prev(children().end()) : children().end();
3850 auto it2 = children().size()>=2 ? std::prev(it1) : children().end();
3851 DocNodeVariant *n1 = it1!=children().end() ? &(*it1) : nullptr;
3852 DocNodeVariant *n2 = it2!=children().end() ? &(*it2) : nullptr;
3853 //TODO get from context the stripCodeComments()
3854 bool stripCodeComments = Config_getBool(STRIP_CODE_COMMENTS);
3855 children().append<DocIncOperator>(parser(),thisVariant(),t,
3858 stripCodeComments,
3861 );
3862 DocIncOperator *op = children().get_last<DocIncOperator>();
3863 DocIncOperator *n1_docIncOp = std::get_if<DocIncOperator>(n1);
3864 DocWhiteSpace *n1_docWs = std::get_if<DocWhiteSpace >(n1);
3865 DocIncOperator *n2_docIncOp = std::get_if<DocIncOperator>(n2);
3866 bool isFirst = !n1 || // no last node
3867 (!n1_docIncOp && !n1_docWs) || // last node is not operator or whitespace
3868 (n1_docWs && n2 && !n2_docIncOp); // last node is not operator
3869 op->markFirst(isFirst);
3870 op->markLast(true);
3871 if (n1_docIncOp)
3872 {
3873 n1_docIncOp->markLast(false);
3874 }
3875 else if (n1_docWs && n2_docIncOp)
3876 {
3877 n2_docIncOp->markLast(false);
3878 }
3879 op->parse();
3880}
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 4153 of file docnode.cpp.

4154{
4155 if (parser()->context.memberDef) // inheriting docs from a member
4156 {
4157 const MemberDef *reMd = parser()->context.memberDef->reimplements();
4158 if (reMd) // member from which was inherited.
4159 {
4160 const MemberDef *thisMd = parser()->context.memberDef;
4161 //printf("{InheritDocs:%s=>%s}\n",qPrint(parser()->context.memberDef->qualifiedName()),qPrint(reMd->qualifiedName()));
4162 parser()->pushContext();
4163 parser()->context.scope=reMd->getOuterScope();
4164 if (parser()->context.scope!=Doxygen::globalScope)
4165 {
4167 }
4168 parser()->context.memberDef=reMd;
4169 while (!parser()->context.styleStack.empty()) parser()->context.styleStack.pop();
4170 while (!parser()->context.nodeStack.empty()) parser()->context.nodeStack.pop();
4171 parser()->context.copyStack.push_back(reMd);
4174 parser()->context.copyStack.pop_back();
4175 auto hasParamCommand = parser()->context.hasParamCommand;
4176 auto hasReturnCommand = parser()->context.hasReturnCommand;
4177 auto retvalsFound = parser()->context.retvalsFound;
4178 auto paramsFound = parser()->context.paramsFound;
4179 parser()->popContext();
4180 parser()->context.hasParamCommand = hasParamCommand;
4181 parser()->context.hasReturnCommand = hasReturnCommand;
4182 parser()->context.retvalsFound = retvalsFound;
4183 parser()->context.paramsFound = paramsFound;
4184 parser()->context.memberDef = thisMd;
4185 }
4186 }
4187}
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 3922 of file docnode.cpp.

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

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

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

3754{
3755 AUTO_TRACE();
3756 QCString fmt;
3757 QCString date;
3758 Token tok=parser()->tokenizer.lex();
3759 if (!tok.is(TokenRetval::TK_WHITESPACE))
3760 {
3761 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3762 cmdChar,cmdName);
3763 return;
3764 }
3766 tok = parser()->tokenizer.lex();
3767 if (!tok.is(TokenRetval::TK_WORD))
3768 {
3769 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <format> argument for command '{:c}{}'",
3770 cmdChar,cmdName);
3772 return;
3773 }
3774 fmt = parser()->context.token->name;
3775
3777 tok = parser()->tokenizer.lex();
3778
3779 QCString specDateRaw = tok.is(TokenRetval::TK_WORD) ? parser()->context.token->name : QCString();
3780 QCString specDate = specDateRaw.stripWhiteSpace();
3781 bool specDateOnlyWS = !specDateRaw.isEmpty() && specDate.isEmpty();
3782 if (!specDate.isEmpty() && !tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3783 {
3784 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '{:c}{}'",
3785 cmdChar,cmdName);
3787 return;
3788 }
3789
3790 std::tm dat{};
3791 int specFormat=0;
3792 QCString err = dateTimeFromString(specDate,dat,specFormat);
3793 if (!err.isEmpty())
3794 {
3795 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '{:c}{}': {}",
3796 cmdChar,cmdName,err);
3798 return;
3799 }
3800
3801 int usedFormat=0;
3802 QCString dateTimeStr = formatDateTime(fmt,dat,usedFormat);
3803
3804 // warn the user if the format contains markers that are not explicitly filled in
3805 for (int i=0;i<SF_NumBits;i++)
3806 {
3807 int bitMask = 1<<i;
3808 if ((usedFormat&bitMask) && !(specFormat&bitMask)) // a part was used in the format string but its value was not specified.
3809 {
3810 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.",
3811 cmdChar,cmdName,fmt,SF_bit2str(i),specDate,SF_bit2str(i));
3812 }
3813 }
3814
3815 children().append<DocWord>(parser(),thisVariant(),dateTimeStr);
3816 if (specDateOnlyWS) // specDate is only whitespace
3817 {
3818 children().append<DocWhiteSpace>(parser(),thisVariant()," ");
3819 }
3821}
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 3444 of file docnode.cpp.

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

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 4117 of file docnode.cpp.

4118{
4119 AUTO_TRACE();
4120 Token retval = parser()->tokenizer.lex();
4121 QCString lang = parser()->context.token->name;
4122 if (!lang.isEmpty() && lang.at(0)!='.')
4123 {
4124 lang="."+lang;
4125 }
4126 if (parser()->context.xmlComment)
4127 {
4128 parser()->context.token->verb = substitute(substitute(parser()->context.token->verb,"&lt;","<"),"&gt;",">");
4129 }
4130 // search for the first non-whitespace line, index is stored in li
4131 size_t i=0,li=0,l=parser()->context.token->verb.length();
4132 while (i<l && (parser()->context.token->verb.at(i)==' ' || parser()->context.token->verb.at(i)=='\n'))
4133 {
4134 if (parser()->context.token->verb.at(i)=='\n') li=i+1;
4135 i++;
4136 }
4137 children().append<DocVerbatim>(parser(),thisVariant(),
4139 stripIndentation(parser()->context.token->verb.mid(li)),
4143 FALSE,lang);
4144 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4145 {
4146 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"code section ended without end marker");
4147 }
4149 AUTO_TRACE_EXIT("retval={}",retval.to_string());
4150 return retval;
4151}
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
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:5949

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 3915 of file docnode.cpp.

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

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 3731 of file docnode.cpp.

3732{
3733 AUTO_TRACE();
3734 Token retval=parser()->tokenizer.lex();
3735 ASSERT(retval.is(TokenRetval::TK_WHITESPACE));
3737 retval=parser()->tokenizer.lex();
3738 if (retval.is(TokenRetval::RetVal_OK))
3739 {
3740 children().append<DocXRefItem>(parser(),thisVariant(),
3742 DocXRefItem *ref = children().get_last<DocXRefItem>();
3743 if (!ref->parse())
3744 {
3745 children().pop_back();
3746 }
3747 }
3749 return retval;
3750}
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 4110 of file docnode.cpp.

4111{
4112 AUTO_TRACE();
4113 parser()->context.token->name = tokText;
4114 return parser()->defaultHandleToken(thisVariant(),tok,children());
4115}
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 5684 of file docnode.cpp.

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