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 handleRef (char cmdChar, const QCString &cmdName)
void handleSection (char cmdChar, const QCString &cmdName)
void handleInheritDoc ()
void handleVhdlFlow ()
void handleILine (char cmdChar, const QCString &cmdName)
void handleIFile (char cmdChar, const QCString &cmdName)
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 }
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 3411 of file docnode.cpp.

3411 :
3414{
3415}
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:1118
bool m_isLast
Definition docnode.h:1119
#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 1114 of file docnode.h.

1114{ return m_attribs; }
HtmlAttribList m_attribs
Definition docnode.h:1120

References m_attribs.

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

◆ handleCite()

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

Definition at line 3470 of file docnode.cpp.

3471{
3472 AUTO_TRACE();
3473 QCString saveCmdName = cmdName;
3474 // get the argument of the cite command.
3475 Token tok=parser()->tokenizer.lex();
3476
3477 CiteInfoOption option;
3478 if (tok.is(TokenRetval::TK_WORD) && parser()->context.token->name=="{")
3479 {
3481 parser()->tokenizer.lex();
3482 StringVector optList=split(parser()->context.token->name.str(),",");
3483 for (auto const &opt : optList)
3484 {
3485 if (opt == "number")
3486 {
3487 if (!option.isUnknown())
3488 {
3489 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3490 }
3491 else
3492 {
3493 option = CiteInfoOption::makeNumber();
3494 }
3495 }
3496 else if (opt == "year")
3497 {
3498 if (!option.isUnknown())
3499 {
3500 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3501 }
3502 else
3503 {
3504 option = CiteInfoOption::makeYear();
3505 }
3506 }
3507 else if (opt == "shortauthor")
3508 {
3509 if (!option.isUnknown())
3510 {
3511 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple options specified with \\{}, discarding '{}'", saveCmdName, opt);
3512 }
3513 else
3514 {
3516 }
3517 }
3518 else if (opt == "nopar")
3519 {
3520 option.setNoPar();
3521 }
3522 else if (opt == "nocite")
3523 {
3524 option.setNoCite();
3525 }
3526 else
3527 {
3528 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unknown option specified with \\{}, discarding '{}'", saveCmdName, opt);
3529 }
3530 }
3531
3532 if (option.isUnknown()) option.changeToNumber();
3533
3535 tok=parser()->tokenizer.lex();
3536 if (!tok.is(TokenRetval::TK_WHITESPACE))
3537 {
3538 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3539 saveCmdName);
3540 return;
3541 }
3542 }
3543 else if (!tok.is(TokenRetval::TK_WHITESPACE))
3544 {
3545 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3546 cmdChar,saveCmdName);
3547 return;
3548 }
3549 else
3550 {
3551 option = CiteInfoOption::makeNumber();
3552 }
3553
3555 tok=parser()->tokenizer.lex();
3556 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3557 {
3558 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"THE ONE unexpected end of comment block while parsing the "
3559 "argument of command '{:c}{}'",cmdChar,saveCmdName);
3560 return;
3561 }
3562 else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3563 {
3564 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3565 tok.to_string(),cmdChar,saveCmdName);
3566 return;
3567 }
3569 children().append<DocCite>(
3571
3573}
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:46
#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:1399
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:6568

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

4228{
4229 AUTO_TRACE("cmdName={}",cmdName);
4230 Token retval = Token::make_RetVal_OK();
4231 CommandType cmdId = Mappers::cmdMapper->map(cmdName);
4232 switch (cmdId)
4233 {
4235 {
4236 std::string str{cmdChar};
4237 children().append<DocWord>(parser(),thisVariant(),str.c_str() + cmdName);
4238 if (isAliasCmd(cmdName.view()))
4239 {
4240 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Found unexpanded alias '{:c}{}'. Check if number of arguments passed is correct.",cmdChar,cmdName);
4241 }
4242 else
4243 {
4244 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Found unknown command '{:c}{}'",cmdChar,cmdName);
4245 }
4246 }
4247 break;
4249 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,cmdName,TRUE);
4250 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4251 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,cmdName,FALSE);
4252 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4253 break;
4255 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Bold,cmdName,TRUE);
4256 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4257 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Bold,cmdName,FALSE);
4258 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4259 break;
4261 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,cmdName,TRUE);
4262 retval=parser()->handleStyleArgument(thisVariant(),children(),cmdName);
4263 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,cmdName,FALSE);
4264 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
4265 break;
4268 break;
4271 break;
4274 break;
4277 break;
4280 break;
4283 break;
4286 break;
4289 break;
4292 break;
4295 break;
4299 break;
4304 break;
4307 break;
4310 break;
4313 break;
4316 break;
4319 break;
4322 break;
4325 break;
4330 break;
4334 break;
4337 break;
4340 break;
4343 break;
4346 break;
4349 break;
4352 break;
4355 break;
4358 break;
4361 break;
4364 break;
4367 break;
4370 break;
4373 break;
4376 break;
4379 break;
4381 {
4382 children().append<DocSimpleList>(parser(),thisVariant());
4383 retval = children().get_last<DocSimpleList>()->parse();
4384 }
4385 break;
4387 {
4388 handleSection(cmdChar,cmdName);
4389 retval = Token::make_RetVal_Section();
4390 }
4391 break;
4393 {
4394 handleSection(cmdChar,cmdName);
4395 retval = Token::make_RetVal_Subsection();
4396 }
4397 break;
4399 {
4400 handleSection(cmdChar,cmdName);
4401 retval = Token::make_RetVal_Subsubsection();
4402 }
4403 break;
4405 {
4406 handleSection(cmdChar,cmdName);
4407 retval = Token::make_RetVal_Paragraph();
4408 }
4409 break;
4411 {
4412 handleSection(cmdChar,cmdName);
4413 retval = Token::make_RetVal_SubParagraph();
4414 }
4415 break;
4417 {
4418 handleSection(cmdChar,cmdName);
4419 retval = Token::make_RetVal_SubSubParagraph();
4420 }
4421 break;
4423 {
4425 retval = handleStartCode();
4426 }
4427 break;
4429 {
4431 retval = handleStartCode();
4432 }
4433 break;
4435 {
4437 retval = parser()->tokenizer.lex();
4439 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4440 {
4441 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"htmlonly section ended without end marker");
4442 }
4444 }
4445 break;
4447 {
4449 retval = parser()->tokenizer.lex();
4451 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4452 {
4453 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"manonly section ended without end marker");
4454 }
4456 }
4457 break;
4459 {
4461 retval = parser()->tokenizer.lex();
4463 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4464 {
4465 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"rtfonly section ended without end marker");
4466 }
4468 }
4469 break;
4471 {
4473 retval = parser()->tokenizer.lex();
4475 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4476 {
4477 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"latexonly section ended without end marker");
4478 }
4480 }
4481 break;
4483 {
4485 retval = parser()->tokenizer.lex();
4487 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4488 {
4489 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"xmlonly section ended without end marker");
4490 }
4492 }
4493 break;
4495 {
4497 retval = parser()->tokenizer.lex();
4499 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4500 {
4501 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"docbookonly section ended without end marker");
4502 }
4504 }
4505 break;
4507 {
4510 parser()->tokenizer.lex();
4511
4512 QCString fullMatch = parser()->context.token->verb;
4513 int idx = fullMatch.find('{');
4514 int idxEnd = fullMatch.find("}",idx+1);
4515 StringVector optList;
4516 if (idx != -1) // options present
4517 {
4518 QCString optStr = fullMatch.mid(idx+1,idxEnd-idx-1).stripWhiteSpace();
4519 optList = split(optStr.str(),",");
4520 for (const auto &opt : optList)
4521 {
4522 if (opt.empty()) continue;
4523 QCString locOpt(opt);
4524 locOpt = locOpt.stripWhiteSpace().lower();
4525 if (locOpt == "code")
4526 {
4528 }
4529 else if (!locOpt.isEmpty())
4530 {
4531 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Unknown option '{}' for '\\iliteral'",opt);
4532 }
4533 }
4534 }
4535
4537 retval = parser()->tokenizer.lex();
4539 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4540 {
4541 if (t == DocVerbatim::JavaDocCode)
4542 {
4543 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"javadoc code section ended without end marker");
4544 }
4545 else
4546 {
4547 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"javadoc literal section ended without end marker");
4548 }
4549 }
4551 }
4552 break;
4555 {
4556 if (cmdId == CommandType::CMD_VERBATIM)
4557 {
4559 }
4560 else
4561 {
4563 }
4564 retval = parser()->tokenizer.lex();
4566 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4567 {
4568 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"verbatim section ended without end marker");
4569 }
4571 }
4572 break;
4574 {
4575 children().append<DocVerbatim>(parser(),thisVariant(),
4581 DocVerbatim *dv = children().get_last<DocVerbatim>();
4583 QCString width,height;
4584 parser()->defaultHandleTitleAndSize(CommandType::CMD_DOT,&children().back(),dv->children(),width,height);
4586 retval = parser()->tokenizer.lex();
4587 dv->setText(parser()->context.token->verb);
4588 dv->setWidth(width);
4589 dv->setHeight(height);
4590 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4591 if (!Config_getBool(HAVE_DOT))
4592 {
4593 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"ignoring \\dot command because HAVE_DOT is not set");
4594 children().pop_back();
4595 }
4596 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4597 {
4598 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"dot section ended without end marker");
4599 }
4601 }
4602 break;
4604 {
4605 children().append<DocVerbatim>(parser(),thisVariant(),
4611 DocVerbatim *dv = children().get_last<DocVerbatim>();
4613 QCString width,height;
4614 parser()->defaultHandleTitleAndSize(CommandType::CMD_MSC,&children().back(),dv->children(),width,height);
4616 retval = parser()->tokenizer.lex();
4617 dv->setText(parser()->context.token->verb);
4618 dv->setWidth(width);
4619 dv->setHeight(height);
4620 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4621 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4622 {
4623 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"msc section ended without end marker");
4624 }
4626 }
4627 break;
4629 {
4630 QCString jarPath = Config_getString(PLANTUML_JAR_PATH);
4632 parser()->tokenizer.lex();
4633 QCString fullMatch = parser()->context.token->sectionId;
4634 QCString sectionId = "";
4635 int idx = fullMatch.find('{');
4636 int idxEnd = fullMatch.find("}",idx+1);
4637 StringVector optList;
4638 QCString engine;
4639 if (idx != -1) // options present
4640 {
4641 QCString optStr = fullMatch.mid(idx+1,idxEnd-idx-1).stripWhiteSpace();
4642 optList = split(optStr.str(),",");
4643 for (const auto &opt : optList)
4644 {
4645 if (opt.empty()) continue;
4646 bool found = false;
4647 QCString locOpt(opt);
4648 locOpt = locOpt.stripWhiteSpace().lower();
4649 if (g_plantumlEngine.find(locOpt.str())!=g_plantumlEngine.end())
4650 {
4651 if (!engine.isEmpty())
4652 {
4653 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Multiple definition of engine for '\\startuml'");
4654 }
4655 engine = locOpt;
4656 found = true;
4657 }
4658 if (!found)
4659 {
4660 if (sectionId.isEmpty())
4661 {
4662 sectionId = opt;
4663 }
4664 else
4665 {
4666 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Multiple use of filename for '\\startuml'");
4667 }
4668 }
4669 }
4670 }
4671 else
4672 {
4673 sectionId = parser()->context.token->sectionId;
4674 }
4675 if (engine.isEmpty()) engine = "uml";
4676
4677 if (sectionId.isEmpty())
4678 {
4680 retval = parser()->tokenizer.lex();
4681 assert(retval.is(TokenRetval::RetVal_OK));
4682
4683 sectionId = parser()->context.token->sectionId;
4684 sectionId = sectionId.stripWhiteSpace();
4685 }
4686
4687 QCString plantFile(sectionId);
4688 children().append<DocVerbatim>(parser(),thisVariant(),
4692 FALSE,plantFile);
4693 DocVerbatim *dv = children().get_last<DocVerbatim>();
4694 dv->setEngine(engine);
4696 QCString width,height;
4697 parser()->defaultHandleTitleAndSize(CommandType::CMD_STARTUML,&children().back(),dv->children(),width,height);
4699 retval = parser()->tokenizer.lex();
4700 int line = 0;
4701 QCString trimmedVerb = stripLeadingAndTrailingEmptyLines(parser()->context.token->verb,line);
4702 if (engine == "ditaa")
4703 {
4704 dv->setUseBitmap(true);
4705 }
4706 else if (engine == "uml")
4707 {
4708 int i = trimmedVerb.find('\n');
4709 QCString firstLine = i==-1 ? trimmedVerb : trimmedVerb.left(i);
4710 if (firstLine.stripWhiteSpace() == "ditaa") dv->setUseBitmap(true);
4711 }
4712 dv->setText(trimmedVerb);
4713 dv->setWidth(width);
4714 dv->setHeight(height);
4715 dv->setLocation(parser()->context.fileName,parser()->tokenizer.getLineNr());
4716 if (jarPath.isEmpty())
4717 {
4718 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
4719 children().pop_back();
4720 }
4721 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4722 {
4723 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"startuml section ended without end marker");
4724 }
4726 }
4727 break;
4729 retval = Token::make_RetVal_EndParBlock();
4730 break;
4746 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command {}",parser()->context.token->name);
4747 break;
4749 retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,parser()->context.token->paramDir);
4750 break;
4752 retval = handleParamSection(cmdName,DocParamSect::TemplateParam,FALSE,parser()->context.token->paramDir);
4753 break;
4755 retval = handleParamSection(cmdName,DocParamSect::RetVal);
4756 break;
4759 break;
4761 retval = handleXRefItem();
4762 break;
4764 {
4765 children().append<DocLineBreak>(parser(),thisVariant());
4766 }
4767 break;
4770 {
4772 }
4773 break;
4775 {
4777 }
4778 break;
4780 {
4781 children().append<DocIndexEntry>(parser(),thisVariant(),
4784 retval = children().get_last<DocIndexEntry>()->parse();
4785 }
4786 break;
4788 retval = Token::make_RetVal_Internal();
4789 break;
4791 retval = Token::make_RetVal_EndInternal();
4792 break;
4794 {
4795 children().append<DocParBlock>(parser(),thisVariant());
4796 retval = children().get_last<DocParBlock>()->parse();
4797 }
4798 break;
4799 case CommandType::CMD_COPYDOC: // fall through
4800 case CommandType::CMD_COPYBRIEF: // fall through
4802 //retval = Token::make_RetVal_CopyDoc();
4803 // these commands should already be resolved by processCopyDoc()
4804 break;
4807 break;
4810 break;
4813 break;
4816 break;
4819 break;
4822 break;
4825 break;
4828 break;
4831 break;
4834 break;
4837 break;
4840 break;
4843 break;
4846 break;
4849 break;
4852 break;
4855 break;
4857 if (!Config_getBool(HAVE_DOT))
4858 {
4859 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
4860 "ignoring \\dotfile command because HAVE_DOT is not set");
4861 }
4862 else
4863 {
4864 handleFile<DocDotFile>(cmdName);
4865 }
4866 break;
4869 break;
4871 handleFile<DocMscFile>(cmdName);
4872 break;
4874 handleFile<DocDiaFile>(cmdName);
4875 break;
4878 break;
4880 handleLink(cmdName,FALSE);
4881 break;
4883 handleLink(cmdName,TRUE);
4884 break;
4886 handleCite(cmdChar,cmdName);
4887 break;
4889 handleEmoji(cmdChar,cmdName);
4890 break;
4892 handleDoxyConfig(cmdChar,cmdName);
4893 break;
4894 case CommandType::CMD_REF: // fall through
4896 handleRef(cmdChar,cmdName);
4897 break;
4899 {
4900 children().append<DocSecRefList>(parser(),thisVariant());
4901 children().get_last<DocSecRefList>()->parse();
4902 }
4903 break;
4905 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command '{:c}{}'",cmdChar,parser()->context.token->name);
4906 break;
4908 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command '{:c}{}'",cmdChar,parser()->context.token->name);
4909 break;
4911 {
4912 children().append<DocFormula>(parser(),thisVariant(),parser()->context.token->id);
4913 }
4914 break;
4915 //case CommandType::CMD_LANGSWITCH:
4916 // retval = handleLanguageSwitch();
4917 // break;
4919 //warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected command {}",parser()->context.token->name);
4920 {
4923 }
4924 break;
4927 break;
4929 handleShowDate(cmdChar,cmdName);
4930 break;
4932 handleILine(cmdChar,cmdName);
4933 break;
4935 handleIFile(cmdChar,cmdName);
4936 break;
4938 {
4940 (void)parser()->tokenizer.lex();
4942 //printf("Found scope='%s'\n",qPrint(parser()->context.context));
4944 }
4945 break;
4946 default:
4947 // we should not get here!
4948 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected command '{}' in paragraph context",cmdName);
4949 break;
4950 }
4951 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_OK,TokenRetval::RetVal_SimpleSec
4952 TokenRetval::TK_LISTITEM,TokenRetval::TK_ENDLIST,TokenRetval::TK_NEWPARA
4953 TokenRetval::RetVal_Section,TokenRetval::RetVal_EndList
4954 TokenRetval::RetVal_Internal,TokenRetval::RetVal_SwitchLang
4955 TokenRetval::RetVal_EndInternal)
4956 );
4957 AUTO_TRACE_EXIT("retval={}",retval.to_string());
4958 return retval;
4959}
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:3417
void handleLink(const QCString &cmdName, bool isJavaLink)
Definition docnode.cpp:3932
void handleInheritDoc()
Definition docnode.cpp:4190
void handleCite(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3470
void handleInclude(const QCString &cmdName, DocInclude::Type t)
Definition docnode.cpp:4000
void handleDoxyConfig(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3606
void handleSection(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:4105
void handleFile(const QCString &cmdName)
Definition docnode.cpp:3893
void handleIFile(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3809
Token handleParamSection(const QCString &cmdName, DocParamSect::Type t, bool xmlContext, int direction)
Definition docnode.cpp:3447
void handleEmoji(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3575
void handleIncludeOperator(const QCString &cmdName, DocIncOperator::Type t)
Definition docnode.cpp:3833
void handleRef(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3973
void handleILine(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3795
Token parse()
Definition docnode.cpp:5723
void handleVhdlFlow()
Definition docnode.cpp:3925
void handleShowDate(char cmdChar, const QCString &cmdName)
Definition docnode.cpp:3725
Token handleXRefItem()
Definition docnode.cpp:3704
Token handleStartCode()
Definition docnode.cpp:4154
void handleInternalRef(DocNodeVariant *parent, DocNodeList &children)
void handleImage(DocNodeVariant *parent, DocNodeList &children)
void handlePrefix(DocNodeVariant *parent, DocNodeList &children)
Token handleStyleArgument(DocNodeVariant *parent, DocNodeList &children, 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:69
#define INTERNAL_ASSERT(x)
Definition docnode.cpp:51
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:48
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:1410
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:4966

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(), handleIFile(), handleILine(), DocParser::handleImage(), handleInclude(), handleIncludeOperator(), handleInheritDoc(), DocParser::handleInternalRef(), handleLink(), handleParamSection(), DocParser::handlePrefix(), 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 3606 of file docnode.cpp.

3607{
3608 // get the argument of the cite command.
3609 Token tok=parser()->tokenizer.lex();
3610 if (!tok.is(TokenRetval::TK_WHITESPACE))
3611 {
3612 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3613 cmdChar,cmdName);
3614 return;
3615 }
3617 tok=parser()->tokenizer.lex();
3618 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3619 {
3620 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
3621 "argument of command '{:c}{}'",cmdChar,cmdName);
3622 return;
3623 }
3624 else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
3625 {
3626 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3627 tok.to_string(),cmdChar,cmdName);
3628 return;
3629 }
3630 ConfigOption * opt = ConfigImpl::instance()->get(parser()->context.token->name);
3631 if (opt)
3632 {
3633 QCString optionValue;
3634 switch (opt->kind())
3635 {
3637 optionValue = *(static_cast<ConfigBool*>(opt)->valueStringRef());
3638 break;
3640 optionValue = *(static_cast<ConfigString*>(opt)->valueRef());
3641 break;
3643 optionValue = *(static_cast<ConfigEnum*>(opt)->valueRef());
3644 break;
3646 optionValue = *(static_cast<ConfigInt*>(opt)->valueStringRef());
3647 break;
3649 {
3650 StringVector *lst = static_cast<ConfigList*>(opt)->valueRef();
3651 optionValue="";
3652 if (!lst->empty())
3653 {
3654 std::string lstFormat = theTranslator->trWriteList(static_cast<int>(lst->size())).str();
3655 static const reg::Ex marker(R"(@(\d+))");
3656 reg::Iterator it(lstFormat,marker);
3657 reg::Iterator end;
3658 size_t index=0;
3659 // now replace all markers with the real text
3660 for ( ; it!=end ; ++it)
3661 {
3662 const auto &match = *it;
3663 size_t newIndex = match.position();
3664 size_t matchLen = match.length();
3665 optionValue += lstFormat.substr(index,newIndex-index);
3666 unsigned long entryIndex = std::stoul(match[1].str());
3667 if (entryIndex<(unsigned long)lst->size())
3668 {
3669 optionValue += lst->at(entryIndex);
3670 }
3671 index=newIndex+matchLen;
3672 }
3673 optionValue+=lstFormat.substr(index);
3674 }
3675 }
3676 break;
3678 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Obsolete setting for '{:c}{}': '{}'",
3679 cmdChar,cmdName,parser()->context.token->name);
3680 break;
3682 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(),
3683 "Disabled setting (i.e. not supported in this doxygen executable) for '{:c}{}': '{}'",
3684 cmdChar,cmdName,parser()->context.token->name);
3685 break;
3687 // nothing to show here
3688 break;
3689 }
3690 if (!optionValue.isEmpty())
3691 {
3692 children().append<DocWord>(parser(),thisVariant(),optionValue);
3693 }
3694 }
3695 else
3696 {
3697 warn(parser()->context.fileName,parser()->tokenizer.getLineNr(), "Unknown option for '{:c}{}': '{}'",
3698 cmdChar,cmdName,parser()->context.token->name);
3700 }
3702}
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 3575 of file docnode.cpp.

3576{
3577 AUTO_TRACE();
3578 // get the argument of the emoji command.
3579 Token tok=parser()->tokenizer.lex();
3580 if (!tok.is(TokenRetval::TK_WHITESPACE))
3581 {
3582 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3583 cmdChar,cmdName);
3584 return;
3585 }
3587 tok=parser()->tokenizer.lex();
3588 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3589 {
3590 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"no emoji name given or unexpected end of comment block while parsing the "
3591 "argument of command '{:c}{}'",cmdChar,cmdName);
3593 return;
3594 }
3595 else if (!tok.is(TokenRetval::TK_WORD))
3596 {
3597 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3598 tok.to_string(),cmdChar,cmdName);
3600 return;
3601 }
3604}
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 3893 of file docnode.cpp.

3894{
3895 AUTO_TRACE("cmdName={}",cmdName);
3896 QCString saveCmdName = cmdName;
3897 Token tok=parser()->tokenizer.lex();
3898 if (!tok.is(TokenRetval::TK_WHITESPACE))
3899 {
3900 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3901 saveCmdName);
3902 return;
3903 }
3905 tok=parser()->tokenizer.lex();
3907 if (!tok.is(TokenRetval::TK_WORD))
3908 {
3909 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of {}",
3910 tok.to_string(),saveCmdName);
3911 return;
3912 }
3913 QCString name = parser()->context.token->name;
3914 children().append<T>(parser(),thisVariant(),name,
3918 auto df = children().get_last<T>();
3919 if (!df->parse())
3920 {
3921 children().pop_back();
3922 }
3923}
void setStateFile()
int getLineNr(void)
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 5450 of file docnode.cpp.

5451{
5452 AUTO_TRACE("tagName={}",tagName);
5453 HtmlTagType tagId = Mappers::htmlTagMapper->map(tagName);
5454 Token retval = Token::make_RetVal_OK();
5455 switch (tagId)
5456 {
5458 if (!insideUL(thisVariant()))
5459 {
5460 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </ul> tag without matching <ul>");
5461 }
5462 else
5463 {
5464 retval = Token::make_RetVal_EndList();
5465 }
5466 break;
5468 if (!insideOL(thisVariant()))
5469 {
5470 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </ol> tag without matching <ol>");
5471 }
5472 else
5473 {
5474 retval = Token::make_RetVal_EndList();
5475 }
5476 break;
5478 if (!insideLI(thisVariant()))
5479 {
5480 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </li> tag without matching <li>");
5481 }
5482 else
5483 {
5484 // ignore </li> tags
5485 }
5486 break;
5488 if (!insideDetails(thisVariant()))
5489 {
5490 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </details> tag without matching <details>");
5491 }
5492 else
5493 {
5494 retval = Token::make_RetVal_EndHtmlDetails();
5495 }
5496 break;
5499 {
5500 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"found </blockquote> tag without matching <blockquote>");
5501 }
5502 else
5503 {
5504 retval = Token::make_RetVal_EndBlockQuote();
5505 }
5506 break;
5509 break;
5512 break;
5515 break;
5518 break;
5521 break;
5524 break;
5527 break;
5530 break;
5533 break;
5536 break;
5539 break;
5542 break;
5545 break;
5548 break;
5551 break;
5554 break;
5557 break;
5562 break;
5564 retval = Token::make_TK_NEWPARA();
5565 break;
5567 retval = Token::make_RetVal_EndDesc();
5568 break;
5570 // ignore </dt> tag
5571 break;
5573 // ignore </dd> tag
5574 break;
5576 retval = Token::make_RetVal_EndTable();
5577 break;
5579 retval = Token::make_RetVal_EndTableRow();
5580 break;
5582 retval = Token::make_RetVal_EndTableCell();
5583 break;
5585 retval = Token::make_RetVal_EndTableCell();
5586 break;
5590 // for time being ignore </t....> tag
5591 break;
5593 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </caption> found");
5594 break;
5596 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Illegal </br> tag found");
5597 break;
5599 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h1> found");
5600 break;
5602 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h2> found");
5603 break;
5605 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h3> found");
5606 break;
5608 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h4> found");
5609 break;
5611 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h5> found");
5612 break;
5614 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </h6> found");
5615 break;
5617 break;
5619 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Illegal </hr> tag found");
5620 break;
5622 //warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag </a> found");
5623 // ignore </a> tag (can be part of <a name=...></a>
5624 break;
5625
5627 break;
5629 retval = Token::make_TK_NEWPARA();
5630 break;
5643 retval = Token::make_RetVal_CloseXml();
5644 break;
5645 case HtmlTagType::XML_C:
5647 break;
5655 // These tags are defined in .Net but are currently unsupported
5656 break;
5658 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unsupported xml/html tag </{}> found", tagName);
5659 children().append<DocWord>(parser(),thisVariant(),"</"+tagName+">");
5660 break;
5661 default:
5662 // we should not get here!
5663 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected end tag {}",tagName);
5664 ASSERT(0);
5665 break;
5666 }
5667 AUTO_TRACE_EXIT("retval={}",retval.to_string());
5668 return retval;
5669}
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:169
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 4136 of file docnode.cpp.

4137{
4138 AUTO_TRACE();
4139 children().append<DocHtmlHeader>(parser(),thisVariant(),tagHtmlAttribs,level);
4140 Token retval = children().get_last<DocHtmlHeader>()->parse();
4141 return retval.is(TokenRetval::RetVal_OK) ? Token::make_TK_NEWPARA() : retval;
4142}

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

4978{
4979 AUTO_TRACE("tagName={} #tagHtmlAttrs={}",tagName,tagHtmlAttribs.size());
4980 Token retval = Token::make_RetVal_OK();
4981 HtmlTagType tagId = Mappers::htmlTagMapper->map(tagName);
4982 if (parser()->context.token->emptyTag && !(tagId>HtmlTagType::XML_CmdMask) &&
4985 {
4986 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"HTML tag ('<{}/>') may not use the 'empty tag' XHTML syntax.",
4987 tagName);
4988 }
4989 switch (tagId)
4990 {
4992 if (!parser()->context.token->emptyTag)
4993 {
4994 children().append<DocHtmlList>(parser(),thisVariant(),
4995 tagHtmlAttribs,DocHtmlList::Unordered);
4996 retval=children().get_last<DocHtmlList>()->parse();
4997 }
4998 break;
5000 if (!parser()->context.token->emptyTag)
5001 {
5002 children().append<DocHtmlList>(parser(),thisVariant(),
5003 tagHtmlAttribs,DocHtmlList::Ordered);
5004 retval=children().get_last<DocHtmlList>()->parse();
5005 }
5006 break;
5008 if (parser()->context.token->emptyTag) break;
5010 {
5011 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"lonely <li> tag found");
5012 }
5013 else
5014 {
5015 retval = Token::make_RetVal_ListItem();
5016 }
5017 break;
5019 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Bold,tagName,&parser()->context.token->attribs);
5020 break;
5022 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::S,tagName,&parser()->context.token->attribs);
5023 break;
5025 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Strike,tagName,&parser()->context.token->attribs);
5026 break;
5028 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Del,tagName,&parser()->context.token->attribs);
5029 break;
5031 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Underline,tagName,&parser()->context.token->attribs);
5032 break;
5034 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Ins,tagName,&parser()->context.token->attribs);
5035 break;
5037 if (parser()->context.token->emptyTag) break;
5038 if (parser()->context.xmlComment)
5039 // for C# source or inside a <summary> or <remark> section we
5040 // treat <code> as an XML tag (so similar to @code)
5041 {
5043 retval = handleStartCode();
5044 }
5045 else // normal HTML markup
5046 {
5047 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Code,tagName,&parser()->context.token->attribs);
5048 }
5049 break;
5051 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Kbd,tagName,&parser()->context.token->attribs);
5052 break;
5054 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Typewriter,tagName,&parser()->context.token->attribs);
5055 break;
5057 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Italic,tagName,&parser()->context.token->attribs);
5058 break;
5060 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Div,tagName,&parser()->context.token->attribs);
5061 if (parser()->context.token->emptyTag) parser()->handleStyleLeave(thisVariant(),children(),DocStyleChange::Div,tagName);
5062 break;
5064 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Span,tagName,&parser()->context.token->attribs);
5065 if (parser()->context.token->emptyTag) parser()->handleStyleLeave(thisVariant(),children(),DocStyleChange::Span,tagName);
5066 break;
5068 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Subscript,tagName,&parser()->context.token->attribs);
5069 break;
5071 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Superscript,tagName,&parser()->context.token->attribs);
5072 break;
5074 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Center,tagName,&parser()->context.token->attribs);
5075 break;
5077 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Small,tagName,&parser()->context.token->attribs);
5078 break;
5080 if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Cite,tagName,&parser()->context.token->attribs);
5081 break;
5083 if (parser()->context.token->emptyTag) break;
5084 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Preformatted,tagName,&parser()->context.token->attribs);
5087 break;
5089 retval = Token::make_TK_NEWPARA();
5090 break;
5092 if (!parser()->context.token->emptyTag)
5093 {
5094 children().append<DocHtmlDescList>(parser(),thisVariant(),tagHtmlAttribs);
5095 retval=children().get_last<DocHtmlDescList>()->parse();
5096 }
5097 break;
5099 if (insideDL(thisVariant()))
5100 {
5101 retval = Token::make_RetVal_DescTitle();
5102 }
5103 else
5104 {
5105 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag <dt> found");
5106 }
5107 break;
5109 if (insideDL(thisVariant()))
5110 {
5111 retval = Token::make_RetVal_DescData();
5112 }
5113 else
5114 {
5115 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag <dd> found");
5116 }
5117 break;
5119 if (!parser()->context.token->emptyTag)
5120 {
5121 children().append<DocHtmlTable>(parser(),thisVariant(),tagHtmlAttribs);
5122 retval=children().get_last<DocHtmlTable>()->parse();
5123 if (children().get_last<DocHtmlTable>()->children().empty()) children().pop_back();
5124 }
5125 break;
5127 retval = Token::make_RetVal_TableRow();
5128 break;
5130 retval = Token::make_RetVal_TableCell();
5131 break;
5133 retval = Token::make_RetVal_TableHCell();
5134 break;
5138 // for time being ignore </t....> tag
5139 break;
5141 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected tag <caption> found");
5142 break;
5144 {
5145 children().append<DocLineBreak>(parser(),thisVariant(),tagHtmlAttribs);
5146 }
5147 break;
5149 {
5150 children().append<DocHorRuler>(parser(),thisVariant(),tagHtmlAttribs);
5151 }
5152 break;
5154 retval = parser()->handleAHref(thisVariant(),children(),tagHtmlAttribs);
5155 break;
5157 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,1);
5158 break;
5160 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,2);
5161 break;
5163 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,3);
5164 break;
5166 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,4);
5167 break;
5169 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,5);
5170 break;
5172 if (!parser()->context.token->emptyTag) retval=handleHtmlHeader(tagHtmlAttribs,6);
5173 break;
5175 {
5176 parser()->handleImg(thisVariant(),children(),tagHtmlAttribs);
5177 }
5178 break;
5180 if (!parser()->context.token->emptyTag)
5181 {
5182 children().append<DocHtmlDetails>(parser(),thisVariant(),tagHtmlAttribs);
5183 retval=children().get_last<DocHtmlDetails>()->parse();
5184 }
5185 break;
5187 if (!parser()->context.token->emptyTag)
5188 {
5189 children().append<DocHtmlBlockQuote>(parser(),thisVariant(),tagHtmlAttribs);
5190 retval = children().get_last<DocHtmlBlockQuote>()->parse();
5191 }
5192 break;
5193
5196 {
5197 if (!parser()->context.token->emptyTag)
5198 {
5200 while (n && !std::holds_alternative<DocHtmlDetails>(*n)) n=::parent(n);
5201 DocHtmlDetails *d = std::get_if<DocHtmlDetails>(n);
5202 if (d)
5203 {
5204 if (!d->summary()) // details section does not have a summary yet
5205 {
5206 d->parseSummary(n,parser()->context.token->attribs);
5207 }
5208 else
5209 {
5210 retval = Token::make_TK_NEWPARA();
5211 }
5212 }
5213 }
5214 }
5215 break;
5219 // fall through
5222 if (!children().empty())
5223 {
5224 retval = Token::make_TK_NEWPARA();
5225 }
5226 break;
5228 if (insideTable(thisVariant()))
5229 {
5230 retval = Token::make_RetVal_TableCell();
5231 }
5232 break;
5233 case HtmlTagType::XML_C:
5234 parser()->handleStyleEnter(thisVariant(),children(),DocStyleChange::Code,tagName,&parser()->context.token->attribs);
5235 break;
5238 {
5240 QCString paramName;
5241 if (findAttribute(tagHtmlAttribs,"name",&paramName))
5242 {
5243 if (paramName.isEmpty())
5244 {
5245 if (Config_getBool(WARN_NO_PARAMDOC))
5246 {
5247 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"empty 'name' attribute for <param{}> tag.",tagId==HtmlTagType::XML_PARAM?"":"type");
5248 }
5249 }
5250 else
5251 {
5252 retval = handleParamSection(paramName,
5254 TRUE);
5255 }
5256 }
5257 else
5258 {
5259 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'name' attribute from <param{}> tag.",tagId==HtmlTagType::XML_PARAM?"":"type");
5260 }
5261 }
5262 break;
5265 {
5266 QCString paramName;
5267 if (findAttribute(tagHtmlAttribs,"name",&paramName))
5268 {
5269 //printf("paramName=%s\n",qPrint(paramName));
5270 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,tagName,TRUE);
5271 children().append<DocWord>(parser(),thisVariant(),paramName);
5272 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Italic,tagName,FALSE);
5273 if (!retval.is(TokenRetval::TK_WORD)) children().append<DocWhiteSpace>(parser(),thisVariant()," ");
5274 }
5275 else
5276 {
5277 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'name' attribute from <param{}ref> tag.",tagId==HtmlTagType::XML_PARAMREF?"":"type");
5278 }
5279 }
5280 break;
5282 {
5284 QCString exceptName;
5285 if (findAttribute(tagHtmlAttribs,"cref",&exceptName))
5286 {
5287 unescapeCRef(exceptName);
5288 retval = handleParamSection(exceptName,DocParamSect::Exception,TRUE);
5289 }
5290 else
5291 {
5292 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'cref' attribute from <exception> tag.");
5293 }
5294 }
5295 break;
5298 if (insideTable(thisVariant()))
5299 {
5300 retval = Token::make_RetVal_TableRow();
5301 }
5302 else if (insideUL(thisVariant()) || insideOL(thisVariant()))
5303 {
5304 retval = Token::make_RetVal_ListItem();
5305 }
5306 else
5307 {
5308 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"lonely <item> tag found");
5309 }
5310 break;
5315 break;
5317 if (insideTable(thisVariant()))
5318 {
5319 retval = Token::make_RetVal_TableCell();
5320 }
5321 break;
5323 // I'm not sure if <see> is the same as <seealso> or if it
5324 // should you link a member without producing a section. The
5325 // C# specification is extremely vague about this (but what else
5326 // can we expect from Microsoft...)
5327 {
5328 QCString cref;
5329 //printf("HtmlTagType::XML_SEE: empty tag=%d\n",parser()->context.token->emptyTag);
5330 if (findAttribute(tagHtmlAttribs,"cref",&cref))
5331 {
5332 unescapeCRef(cref);
5333 if (parser()->context.token->emptyTag) // <see cref="..."/> style
5334 {
5335 bool inSeeBlock = parser()->context.inSeeBlock;
5336 parser()->context.token->name = cref;
5339 parser()->context.inSeeBlock = inSeeBlock;
5340 }
5341 else // <see cref="...">...</see> style
5342 {
5343 //DocRef *ref = new DocRef(this,cref);
5344 //children().append(ref);
5345 //ref->parse();
5347 children().append<DocLink>(parser(),thisVariant(),cref);
5348 DocLink *lnk = children().get_last<DocLink>();
5349 QCString leftOver = lnk->parse(FALSE,TRUE);
5350 if (!leftOver.isEmpty())
5351 {
5352 children().append<DocWord>(parser(),thisVariant(),leftOver);
5353 }
5354 }
5355 }
5356 else if (findAttribute(tagHtmlAttribs,"langword",&cref)) // <see langword="..."/> or <see langword="..."></see>
5357 {
5358 bool inSeeBlock = parser()->context.inSeeBlock;
5359 parser()->context.token->name = cref;
5361 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,tagName,TRUE);
5363 children().append<DocStyleChange>(parser(),thisVariant(),parser()->context.nodeStack.size(),DocStyleChange::Code,tagName,FALSE);
5364 parser()->context.inSeeBlock = inSeeBlock;
5365 }
5366 else
5367 {
5368 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'cref' or 'langword' attribute from <see> tag.");
5369 }
5370 }
5371 break;
5373 {
5375 QCString cref;
5376 if (findAttribute(tagHtmlAttribs,"cref",&cref))
5377 {
5378 unescapeCRef(cref);
5379 // Look for an existing "see" section
5380 DocNodeVariant *vss=nullptr;
5381 for (auto &n : children())
5382 {
5383 DocSimpleSect *candidate = std::get_if<DocSimpleSect>(&n);
5384 if (candidate && candidate->type()==DocSimpleSect::See)
5385 {
5386 vss = &n;
5387 }
5388 }
5389
5390 if (!vss) // start new section
5391 {
5392 children().append<DocSimpleSect>(parser(),thisVariant(),DocSimpleSect::See);
5393 vss = &children().back();
5394 }
5395
5396 std::get<DocSimpleSect>(*vss).appendLinkWord(cref);
5397 retval = Token::make_RetVal_OK();
5398 }
5399 else
5400 {
5401 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing 'cref' attribute from <seealso> tag.");
5402 }
5403 }
5404 break;
5406 {
5407 QCString type;
5408 findAttribute(tagHtmlAttribs,"type",&type);
5410 HtmlAttribList emptyList;
5411 if (type=="number")
5412 {
5413 listType=DocHtmlList::Ordered;
5414 }
5415 if (type=="table")
5416 {
5417 children().append<DocHtmlTable>(parser(),thisVariant(),emptyList);
5418 retval=children().get_last<DocHtmlTable>()->parseXml();
5419 if (children().get_last<DocHtmlTable>()->children().empty()) children().pop_back();
5420 }
5421 else
5422 {
5423 children().append<DocHtmlList>(parser(),thisVariant(),emptyList,listType);
5424 retval=children().get_last<DocHtmlList>()->parseXml();
5425 }
5426 }
5427 break;
5430 // These tags are defined in .Net but are currently unsupported
5432 break;
5434 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unsupported xml/html tag <{}> found", tagName);
5435 children().append<DocWord>(parser(),thisVariant(), "<"+tagName+parser()->context.token->attribsStr+">");
5436 break;
5439 break;
5440 default:
5441 // we should not get here!
5442 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Unexpected start tag {}",tagName);
5443 ASSERT(0);
5444 break;
5445 }
5446 AUTO_TRACE_EXIT("retval={}",retval.to_string());
5447 return retval;
5448}
void parseSummary(DocNodeVariant *, HtmlAttribList &attribs)
Definition docnode.cpp:1498
const DocNodeVariant * summary() const
Definition docnode.h:864
Token handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs, int level)
Definition docnode.cpp:4136
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:81
static bool findAttribute(const HtmlAttribList &tagHtmlAttribs, const char *attrName, QCString *result)
Definition docnode.cpp:4961
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().

◆ handleIFile()

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

Definition at line 3809 of file docnode.cpp.

3810{
3811 AUTO_TRACE();
3812 Token tok=parser()->tokenizer.lex();
3813 if (!tok.is(TokenRetval::TK_WHITESPACE))
3814 {
3815 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3816 cmdChar,cmdName);
3817 return;
3818 }
3820 tok=parser()->tokenizer.lex();
3822 if (!tok.is(TokenRetval::TK_WORD))
3823 {
3824 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3825 tok.to_string(),cmdChar,cmdName);
3826 return;
3827 }
3830}

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

Referenced by handleCommand().

◆ handleILine()

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

Definition at line 3795 of file docnode.cpp.

3796{
3797 AUTO_TRACE();
3799 Token tok = parser()->tokenizer.lex();
3800 if (!tok.is(TokenRetval::TK_WORD))
3801 {
3802 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid argument for command '{:c}{}'",
3803 cmdChar,cmdName);
3804 return;
3805 }
3807}
void setStateILine()

References AUTO_TRACE, Token::is(), DocTokenizer::lex(), DocNode::parser(), DocTokenizer::setStateILine(), DocTokenizer::setStatePara(), DocParser::tokenizer, and warn_doc_error.

Referenced by handleCommand().

◆ handleInclude()

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

Definition at line 4000 of file docnode.cpp.

4001{
4002 AUTO_TRACE("cmdName={}",cmdName);
4003 QCString saveCmdName = cmdName;
4004 Token tok=parser()->tokenizer.lex();
4005 bool isBlock = false;
4006 bool trimLeft = false;
4007 bool localScope = false;
4008 bool stripCodeComments = Config_getBool(STRIP_CODE_COMMENTS);
4009 if (tok.is(TokenRetval::TK_WORD) && parser()->context.token->name=="{")
4010 {
4012 parser()->tokenizer.lex();
4014 StringVector optList=split(parser()->context.token->name.str(),",");
4015 auto contains = [&optList](const char *kw)
4016 {
4017 return std::find(optList.begin(),optList.end(),kw)!=optList.end();
4018 };
4019 localScope = contains("local");
4020 if (contains("nostrip"))
4021 {
4022 stripCodeComments = false;
4023 }
4024 else if (contains("strip"))
4025 {
4026 stripCodeComments = true;
4027 }
4028 if (t==DocInclude::Snippet && contains("trimleft"))
4029 {
4030 trimLeft = true;
4031 }
4032
4033 if (contains("lineno"))
4034 {
4038 }
4039 tok=parser()->tokenizer.lex();
4040 if (!tok.is(TokenRetval::TK_WHITESPACE))
4041 {
4042 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
4043 saveCmdName);
4044 return;
4045 }
4046 }
4047 else if (tok.is(TokenRetval::TK_WORD) && parser()->context.token->name=="[")
4048 {
4050 parser()->tokenizer.lex();
4051 isBlock = (parser()->context.token->name.stripWhiteSpace() == "block");
4053 parser()->tokenizer.lex();
4054 }
4055 else if (!tok.is(TokenRetval::TK_WHITESPACE))
4056 {
4057 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
4058 saveCmdName);
4059 return;
4060 }
4062 tok=parser()->tokenizer.lex();
4064 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4065 {
4066 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
4067 "argument of command {}",saveCmdName);
4068 return;
4069 }
4070 else if (!tok.is(TokenRetval::TK_WORD))
4071 {
4072 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of {}",
4073 tok.to_string(),saveCmdName);
4074 return;
4075 }
4076 QCString fileName = parser()->context.token->name;
4077 QCString blockId;
4079 {
4080 if (fileName == "this") fileName=parser()->context.fileName;
4082 tok=parser()->tokenizer.lex();
4084 if (!tok.is(TokenRetval::TK_WORD))
4085 {
4086 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected block identifier, but found token {} instead while parsing the {} command",
4087 tok.to_string(),saveCmdName);
4088 return;
4089 }
4090 blockId = "["+parser()->context.token->name+"]";
4091 }
4092
4093 children().append<DocInclude>(parser(),
4094 thisVariant(),
4095 fileName,
4096 localScope ? parser()->context.context : "",
4097 t,
4098 stripCodeComments,
4101 blockId,isBlock,trimLeft);
4102 children().get_last<DocInclude>()->parse();
4103}
@ 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 3833 of file docnode.cpp.

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

4191{
4192 if (parser()->context.memberDef) // inheriting docs from a member
4193 {
4194 const MemberDef *reMd = parser()->context.memberDef->reimplements();
4195 if (reMd) // member from which was inherited.
4196 {
4197 const MemberDef *thisMd = parser()->context.memberDef;
4198 //printf("{InheritDocs:%s=>%s}\n",qPrint(parser()->context.memberDef->qualifiedName()),qPrint(reMd->qualifiedName()));
4199 parser()->pushContext();
4200 parser()->context.scope=reMd->getOuterScope();
4201 if (parser()->context.scope!=Doxygen::globalScope)
4202 {
4204 }
4205 parser()->context.memberDef=reMd;
4206 while (!parser()->context.styleStack.empty()) parser()->context.styleStack.pop();
4207 while (!parser()->context.nodeStack.empty()) parser()->context.nodeStack.pop();
4208 parser()->context.copyStack.push_back(reMd);
4211 parser()->context.copyStack.pop_back();
4212 auto hasParamCommand = parser()->context.hasParamCommand;
4213 auto hasReturnCommand = parser()->context.hasReturnCommand;
4214 auto retvalsFound = parser()->context.retvalsFound;
4215 auto paramsFound = parser()->context.paramsFound;
4216 parser()->popContext();
4217 parser()->context.hasParamCommand = hasParamCommand;
4218 parser()->context.hasReturnCommand = hasReturnCommand;
4219 parser()->context.retvalsFound = retvalsFound;
4220 parser()->context.paramsFound = paramsFound;
4221 parser()->context.memberDef = thisMd;
4222 }
4223 }
4224}
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:74
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 3932 of file docnode.cpp.

3933{
3934 AUTO_TRACE("cmdName={} isJavaLink={}",cmdName,isJavaLink);
3935 QCString saveCmdName = cmdName;
3936 Token tok=parser()->tokenizer.lex();
3937 if (!tok.is(TokenRetval::TK_WHITESPACE))
3938 {
3939 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\{} command",
3940 saveCmdName);
3941 return;
3942 }
3944 tok=parser()->tokenizer.lex();
3945 if (!tok.is(TokenRetval::TK_WORD))
3946 {
3947 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"{} as the argument of {}",
3948 tok.to_string(),saveCmdName);
3949 return;
3950 }
3951 if (saveCmdName == "javalink")
3952 {
3953 children().append<DocStyleChange>(parser(),thisVariant(),
3954 parser()->context.nodeStack.size(),
3955 DocStyleChange::Code,cmdName,TRUE);
3956 }
3959 DocLink *lnk = children().get_last<DocLink>();
3960 if (saveCmdName == "javalink")
3961 {
3962 children().append<DocStyleChange>(parser(),thisVariant(),
3963 parser()->context.nodeStack.size(),
3964 DocStyleChange::Code,cmdName,FALSE);
3965 }
3966 QCString leftOver = lnk->parse(isJavaLink);
3967 if (!leftOver.isEmpty())
3968 {
3969 children().append<DocWord>(parser(),thisVariant(),leftOver);
3970 }
3971}
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 3447 of file docnode.cpp.

3451{
3452 AUTO_TRACE();
3453 DocParamSect *ps = nullptr;
3454 if (!children().empty() && // previous element
3455 (ps=children().get_last<DocParamSect>()) && // was a param sect
3456 ps->type()==t) // of same type
3457 { // append to previous section ps
3458 }
3459 else // start new section
3460 {
3461 children().append<DocParamSect>(parser(),thisVariant(),t);
3462 ps = children().get_last<DocParamSect>();
3463 }
3464 Token rv=ps->parse(cmdName,xmlContext,
3465 static_cast<DocParamSect::Direction>(direction));
3466 AUTO_TRACE_EXIT("retval={}",rv.to_string());
3467 return (!rv.is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3468}
Token parse(const QCString &cmdName, bool xmlContext, Direction d)
Definition docnode.cpp:3368
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().

◆ handleRef()

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

Definition at line 3973 of file docnode.cpp.

3974{
3975 AUTO_TRACE("cmdName={}",cmdName);
3976 QCString saveCmdName = cmdName;
3977 Token tok=parser()->tokenizer.lex();
3978 if (!tok.is(TokenRetval::TK_WHITESPACE))
3979 {
3980 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3981 cmdChar,qPrint(saveCmdName));
3982 return;
3983 }
3985 tok=parser()->tokenizer.lex(); // get the reference id
3986 if (!tok.is(TokenRetval::TK_WORD))
3987 {
3988 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
3989 tok.to_string(),cmdChar,saveCmdName);
3990 goto endref;
3991 }
3992 children().append<DocRef>(parser(),thisVariant(),
3995 children().get_last<DocRef>()->parse();
3996endref:
3998}
const char * qPrint(const char *s)
Definition qcstring.h:687

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

Referenced by handleCommand().

◆ handleSection()

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

Definition at line 4105 of file docnode.cpp.

4106{
4107 AUTO_TRACE("cmdName={}",cmdName);
4108 QCString saveCmdName = cmdName;
4109 // get the argument of the section command.
4110 Token tok=parser()->tokenizer.lex();
4111 if (!tok.is(TokenRetval::TK_WHITESPACE))
4112 {
4113 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
4114 cmdChar,saveCmdName);
4115 return;
4116 }
4117 tok=parser()->tokenizer.lex();
4118 if (tok.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4119 {
4120 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected end of comment block while parsing the "
4121 "argument of command '{:c}{}'", cmdChar,saveCmdName);
4122 return;
4123 }
4124 else if (!tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_LNKWORD))
4125 {
4126 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token {} as the argument of '{:c}{}'",
4127 tok.to_string(),cmdChar,saveCmdName);
4128 return;
4129 }
4132 parser()->tokenizer.lex();
4134}
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 3725 of file docnode.cpp.

3726{
3727 AUTO_TRACE();
3728 QCString fmt;
3729 QCString date;
3730 Token tok=parser()->tokenizer.lex();
3731 if (!tok.is(TokenRetval::TK_WHITESPACE))
3732 {
3733 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '{:c}{}' command",
3734 cmdChar,cmdName);
3735 return;
3736 }
3738 tok = parser()->tokenizer.lex();
3739 if (!tok.is(TokenRetval::TK_WORD))
3740 {
3741 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <format> argument for command '{:c}{}'",
3742 cmdChar,cmdName);
3744 return;
3745 }
3746 fmt = parser()->context.token->name;
3747
3749 tok = parser()->tokenizer.lex();
3750
3751 QCString specDateRaw = tok.is(TokenRetval::TK_WORD) ? parser()->context.token->name : QCString();
3752 QCString specDate = specDateRaw.stripWhiteSpace();
3753 bool specDateOnlyWS = !specDateRaw.isEmpty() && specDate.isEmpty();
3754 if (!specDate.isEmpty() && !tok.is_any_of(TokenRetval::TK_WORD,TokenRetval::TK_NONE,TokenRetval::TK_EOF))
3755 {
3756 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '{:c}{}'",
3757 cmdChar,cmdName);
3759 return;
3760 }
3761
3762 std::tm dat{};
3763 int specFormat=0;
3764 QCString err = dateTimeFromString(specDate,dat,specFormat);
3765 if (!err.isEmpty())
3766 {
3767 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '{:c}{}': {}",
3768 cmdChar,cmdName,err);
3770 return;
3771 }
3772
3773 int usedFormat=0;
3774 QCString dateTimeStr = formatDateTime(fmt,dat,usedFormat);
3775
3776 // warn the user if the format contains markers that are not explicitly filled in
3777 for (int i=0;i<SF_NumBits;i++)
3778 {
3779 int bitMask = 1<<i;
3780 if ((usedFormat&bitMask) && !(specFormat&bitMask)) // a part was used in the format string but its value was not specified.
3781 {
3782 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.",
3783 cmdChar,cmdName,fmt,SF_bit2str(i),specDate,SF_bit2str(i));
3784 }
3785 }
3786
3787 children().append<DocWord>(parser(),thisVariant(),dateTimeStr);
3788 if (specDateOnlyWS) // specDate is only whitespace
3789 {
3790 children().append<DocWhiteSpace>(parser(),thisVariant()," ");
3791 }
3793}
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 3417 of file docnode.cpp.

3418{
3419 AUTO_TRACE();
3420 DocSimpleSect *ss=nullptr;
3421 bool needsSeparator = FALSE;
3422 if (!children().empty() && // has previous element
3423 (ss=children().get_last<DocSimpleSect>()) && // was a simple sect
3424 ss->type()==t && // of same type
3425 t!=DocSimpleSect::User) // but not user defined
3426 {
3427 // append to previous section
3428 needsSeparator = TRUE;
3429 }
3430 else // start new section
3431 {
3432 children().append<DocSimpleSect>(parser(),thisVariant(),t);
3433 ss = children().get_last<DocSimpleSect>();
3434 }
3435 Token rv = Token::make_RetVal_OK();
3436 if (xmlContext)
3437 {
3438 return ss->parseXml();
3439 }
3440 else
3441 {
3442 rv = ss->parse(t==DocSimpleSect::User,needsSeparator);
3443 }
3444 return (!rv.is(TokenRetval::TK_NEWPARA)) ? rv : Token::make_RetVal_OK();
3445}
Token parse(bool userTitle, bool needsSeparator)
Definition docnode.cpp:3082
Token parseXml()
Definition docnode.cpp:3136

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

4155{
4156 AUTO_TRACE();
4157 Token retval = parser()->tokenizer.lex();
4158 QCString lang = parser()->context.token->name;
4159 if (!lang.isEmpty() && lang.at(0)!='.')
4160 {
4161 lang="."+lang;
4162 }
4163 if (parser()->context.xmlComment)
4164 {
4165 parser()->context.token->verb = substitute(substitute(parser()->context.token->verb,"&lt;","<"),"&gt;",">");
4166 }
4167 // search for the first non-whitespace line, index is stored in li
4168 size_t i=0,li=0,l=parser()->context.token->verb.length();
4169 while (i<l && (parser()->context.token->verb.at(i)==' ' || parser()->context.token->verb.at(i)=='\n'))
4170 {
4171 if (parser()->context.token->verb.at(i)=='\n') li=i+1;
4172 i++;
4173 }
4174 children().append<DocVerbatim>(parser(),thisVariant(),
4176 stripIndentation(parser()->context.token->verb.mid(li)),
4180 FALSE,lang);
4181 if (retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF))
4182 {
4183 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"code section ended without end marker");
4184 }
4186 AUTO_TRACE_EXIT("retval={}",retval.to_string());
4187 return retval;
4188}
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:5901

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

3926{
3927 AUTO_TRACE();
3928 children().append<DocVhdlFlow>(parser(),thisVariant());
3929 children().get_last<DocVhdlFlow>()->parse();
3930}

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

3705{
3706 AUTO_TRACE();
3707 Token retval=parser()->tokenizer.lex();
3708 ASSERT(retval.is(TokenRetval::TK_WHITESPACE));
3710 retval=parser()->tokenizer.lex();
3711 if (retval.is(TokenRetval::RetVal_OK))
3712 {
3713 children().append<DocXRefItem>(parser(),thisVariant(),
3715 DocXRefItem *ref = children().get_last<DocXRefItem>();
3716 if (!ref->parse())
3717 {
3718 children().pop_back();
3719 }
3720 }
3722 return retval;
3723}
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 4147 of file docnode.cpp.

4148{
4149 AUTO_TRACE();
4150 parser()->context.token->name = tokText;
4151 return parser()->defaultHandleToken(thisVariant(),tok,children());
4152}
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 5723 of file docnode.cpp.

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

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

References attribs(), and m_attribs.

Referenced by parse().

Member Data Documentation

◆ m_attribs

HtmlAttribList DocPara::m_attribs
private

Definition at line 1120 of file docnode.h.

Referenced by attribs(), and setAttribs().

◆ m_isFirst

bool DocPara::m_isFirst = false
private

Definition at line 1118 of file docnode.h.

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

◆ m_isLast

bool DocPara::m_isLast = false
private

Definition at line 1119 of file docnode.h.

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


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