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

Node representing a normal section. More...

#include <src/docnode.h>

Inheritance diagram for DocSection:
Collaboration diagram for DocSection:

Public Member Functions

 DocSection (DocParser *parser, DocNodeVariant *parent, int level, const QCString &id)
int level () const
const DocNodeVarianttitle () const
QCString anchor () const
QCString id () const
QCString file () const
Token parse ()
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

int m_level = 0
QCString m_id
std::unique_ptr< DocNodeVariantm_title
QCString m_anchor
QCString m_file

Additional Inherited Members

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

Detailed Description

Node representing a normal section.

Definition at line 913 of file docnode.h.

Constructor & Destructor Documentation

◆ DocSection()

DocSection::DocSection ( DocParser * parser,
DocNodeVariant * parent,
int level,
const QCString & id )
inline

Definition at line 916 of file docnode.h.

916 :
DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:141
DocParser * parser()
Definition docnode.h:98
DocNodeVariant * parent()
Definition docnode.h:90
QCString m_id
Definition docnode.h:927
int level() const
Definition docnode.h:918
int m_level
Definition docnode.h:926

References DocCompoundNode::DocCompoundNode(), id(), level(), m_id, m_level, DocNode::parent(), and DocNode::parser().

Referenced by parse().

Member Function Documentation

◆ anchor()

QCString DocSection::anchor ( ) const
inline

◆ file()

QCString DocSection::file ( ) const
inline

Definition at line 922 of file docnode.h.

922{ return m_file; }
QCString m_file
Definition docnode.h:930

References m_file.

Referenced by DocbookDocVisitor::operator()(), LatexDocVisitor::operator()(), RTFDocVisitor::operator()(), and XmlDocVisitor::operator()().

◆ id()

QCString DocSection::id ( ) const
inline

Definition at line 921 of file docnode.h.

921{ return m_id; }

References m_id.

Referenced by DocSection().

◆ level()

◆ parse()

Token DocSection::parse ( )

Definition at line 5989 of file docnode.cpp.

5990{
5991 AUTO_TRACE("start {} level={}", parser()->context.token->sectionId, m_level);
5992 Token retval = Token::make_RetVal_OK();
5993 auto ns = AutoNodeStack(parser(),thisVariant());
5994
5995 if (!m_id.isEmpty())
5996 {
5997 const SectionInfo *sec = SectionManager::instance().find(m_id);
5998 if (sec)
5999 {
6000 m_file = sec->fileName();
6001 m_anchor = sec->label();
6002 QCString titleStr = sec->title();
6003 if (titleStr.isEmpty()) titleStr = sec->label();
6005 DocTitle *title = &std::get<DocTitle>(*m_title);
6006 title->parseFromString(thisVariant(),titleStr);
6007 }
6008 }
6009
6010 // first parse any number of paragraphs
6011 bool isFirst=TRUE;
6012 DocPara *lastPar=nullptr;
6013 do
6014 {
6015 children().append<DocPara>(parser(),thisVariant());
6016 DocPara *par = children().get_last<DocPara>();
6017 if (isFirst) { par->markFirst(); isFirst=FALSE; }
6018 retval=par->parse();
6019 if (!par->isEmpty())
6020 {
6021 if (lastPar) lastPar->markLast(FALSE);
6022 lastPar = par;
6023 }
6024 else
6025 {
6026 children().pop_back();
6027 }
6028 if (retval.is(TokenRetval::TK_LISTITEM))
6029 {
6030 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid list item found");
6031 }
6032 if (retval.is(TokenRetval::RetVal_Internal))
6033 {
6034 children().append<DocInternal>(parser(),thisVariant());
6035 retval = children().get_last<DocInternal>()->parse(m_level+1);
6036 if (retval.is(TokenRetval::RetVal_EndInternal))
6037 {
6038 retval = Token::make_RetVal_OK();
6039 }
6040 }
6041 } while (!retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6042 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6043 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6044 );
6045
6046 if (lastPar) lastPar->markLast();
6047
6048 while (true)
6049 {
6050 if (retval.is(TokenRetval::RetVal_Subsection) && m_level<=1)
6051 {
6052 // then parse any number of nested sections
6053 while (retval.is(TokenRetval::RetVal_Subsection)) // more sections follow
6054 {
6056 2,
6058 retval = children().get_last<DocSection>()->parse();
6059 }
6060 break;
6061 }
6062 else if (retval.is(TokenRetval::RetVal_Subsubsection) && m_level<=2)
6063 {
6064 if ((m_level <= 1) &&
6065 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6066 {
6067 warn_doc_error(parser()->context.fileName,
6068 parser()->tokenizer.getLineNr(),
6069 "Unexpected subsubsection command found inside {}!",
6071 }
6072 // then parse any number of nested sections
6073 while (retval.is(TokenRetval::RetVal_Subsubsection)) // more sections follow
6074 {
6076 3,
6078 retval = children().get_last<DocSection>()->parse();
6079 }
6080 if (!(m_level < 2 && retval.is(TokenRetval::RetVal_Subsection))) break;
6081 }
6082 else if (retval.is(TokenRetval::RetVal_Paragraph) && m_level<=3)
6083 {
6084 if ((m_level <= 2) &&
6085 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6086 {
6087 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6088 "Unexpected paragraph command found inside {}!",
6090 }
6091 // then parse any number of nested sections
6092 while (retval.is(TokenRetval::RetVal_Paragraph)) // more sections follow
6093 {
6095 4,
6097 retval = children().get_last<DocSection>()->parse();
6098 }
6099 if (!(m_level<3 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection)))) break;
6100 }
6101 else if (retval.is(TokenRetval::RetVal_SubParagraph) && m_level<=4)
6102 {
6103 if ((m_level <= 3) &&
6104 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6105 {
6106 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6107 "Unexpected subparagraph command found inside {}!",
6109 }
6110 // then parse any number of nested sections
6111 while (retval.is(TokenRetval::RetVal_SubParagraph)) // more sections follow
6112 {
6114 5,
6116 retval = children().get_last<DocSection>()->parse();
6117 }
6118 if (!(m_level<4 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph)))) break;
6119 }
6120 else if (retval.is(TokenRetval::RetVal_SubSubParagraph) && m_level<=5)
6121 {
6122 if ((m_level <= 4) &&
6123 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6124 {
6125 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6126 "Unexpected subsubparagraph command found inside {}!",
6128 }
6129 // then parse any number of nested sections
6130 while (retval.is(TokenRetval::RetVal_SubSubParagraph)) // more sections follow
6131 {
6133 6,
6135 retval = children().get_last<DocSection>()->parse();
6136 }
6137 if (!(m_level<5 && (retval.is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6138 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph)))) break;
6139 }
6140 else
6141 {
6142 break;
6143 }
6144 }
6145
6146 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
6147 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6148 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6149 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6150 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6151 );
6152
6153 AUTO_TRACE_EXIT("retval={}", retval.to_string());
6154 return retval;
6155}
static AnchorGenerator & instance()
Returns the singleton instance.
Definition anchor.cpp:38
DocNodeList & children()
Definition docnode.h:143
DocNodeVariant * thisVariant()
Definition docnode.h:93
void markLast(bool v=TRUE)
Definition docnode.h:1086
DocParserContext context
std::unique_ptr< DocNodeVariant > m_title
Definition docnode.h:928
Token parse()
Definition docnode.cpp:5989
DocSection(DocParser *parser, DocNodeVariant *parent, int level, const QCString &id)
Definition docnode.h:916
const DocNodeVariant * title() const
Definition docnode.h:919
void pop_back()
removes the last element
Definition growvector.h:115
const T * find(const std::string &key) const
Definition linkedmap.h:47
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString label() const
Definition section.h:69
QCString fileName() const
Definition section.h:74
QCString title() const
Definition section.h:70
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:179
bool is(TokenRetval rv) const
TOKEN_SPECIFICATIONS RETVAL_SPECIFICATIONS const char * to_string() const
bool is_any_of(ARGS... args) const
static const char * g_sectionLevelToName[]
Definition docnode.cpp:57
#define AUTO_TRACE(...)
Definition docnode.cpp:47
#define INTERNAL_ASSERT(x)
Definition docnode.cpp:52
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:49
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1492
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
void append(Args &&... args)
Append a new DocNodeVariant to the list by constructing it with type T and parameters Args.
Definition docnode.h:1396
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1407
TokenInfo * token
Definition docparser_p.h:93
QCString sectionId

References DocNodeList::append(), AUTO_TRACE, AUTO_TRACE_EXIT, DocCompoundNode::children(), DocParser::context, createDocNode(), DocSection(), FALSE, SectionInfo::fileName(), LinkedMap< T, Hash, KeyEqual, Map >::find(), g_sectionLevelToName, DocNodeList::get_last(), AnchorGenerator::instance(), SectionManager::instance(), INTERNAL_ASSERT, Token::is(), Token::is_any_of(), QCString::isEmpty(), SectionInfo::label(), m_anchor, m_file, m_id, m_level, m_title, DocPara::markLast(), parse(), DocNode::parser(), GrowVector< T >::pop_back(), TokenInfo::sectionId, DocNode::thisVariant(), title(), SectionInfo::title(), Token::to_string(), DocParserContext::token, TRUE, and warn_doc_error.

Referenced by parse().

◆ title()

Member Data Documentation

◆ m_anchor

QCString DocSection::m_anchor
private

Definition at line 929 of file docnode.h.

Referenced by anchor(), and parse().

◆ m_file

QCString DocSection::m_file
private

Definition at line 930 of file docnode.h.

Referenced by file(), and parse().

◆ m_id

QCString DocSection::m_id
private

Definition at line 927 of file docnode.h.

Referenced by DocSection(), id(), and parse().

◆ m_level

int DocSection::m_level = 0
private

Definition at line 926 of file docnode.h.

Referenced by DocSection(), level(), and parse().

◆ m_title

std::unique_ptr<DocNodeVariant> DocSection::m_title
private

Definition at line 928 of file docnode.h.

Referenced by parse(), and title().


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