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 922 of file docnode.h.

Constructor & Destructor Documentation

◆ DocSection()

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

Definition at line 925 of file docnode.h.

925 :
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:936
int level() const
Definition docnode.h:927
int m_level
Definition docnode.h:935

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 931 of file docnode.h.

931{ return m_file; }
QCString m_file
Definition docnode.h:939

References m_file.

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

◆ id()

QCString DocSection::id ( ) const
inline

Definition at line 930 of file docnode.h.

930{ return m_id; }

References m_id.

Referenced by DocSection().

◆ level()

◆ parse()

Token DocSection::parse ( )

Definition at line 6089 of file docnode.cpp.

6090{
6091 AUTO_TRACE("start {} level={}", parser()->context.token->sectionId, m_level);
6092 Token retval = Token::make_RetVal_OK();
6093 auto ns = AutoNodeStack(parser(),thisVariant());
6094
6095 if (!m_id.isEmpty())
6096 {
6097 const SectionInfo *sec = SectionManager::instance().find(m_id);
6098 if (sec)
6099 {
6100 m_file = sec->fileName();
6101 m_anchor = sec->label();
6102 QCString titleStr = sec->title();
6103 if (titleStr.isEmpty()) titleStr = sec->label();
6105 DocTitle *title = &std::get<DocTitle>(*m_title);
6106 title->parseFromString(thisVariant(),titleStr);
6107 }
6108 }
6109
6110 // first parse any number of paragraphs
6111 bool isFirst=TRUE;
6112 DocPara *lastPar=nullptr;
6113 do
6114 {
6115 children().append<DocPara>(parser(),thisVariant());
6116 DocPara *par = children().get_last<DocPara>();
6117 if (isFirst) { par->markFirst(); isFirst=FALSE; }
6118 retval=par->parse();
6119 if (!par->isEmpty())
6120 {
6121 if (lastPar) lastPar->markLast(FALSE);
6122 lastPar = par;
6123 }
6124 else
6125 {
6126 children().pop_back();
6127 }
6128 if (retval.is(TokenRetval::TK_LISTITEM))
6129 {
6130 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid list item found");
6131 }
6132 if (retval.is(TokenRetval::RetVal_Internal))
6133 {
6134 children().append<DocInternal>(parser(),thisVariant());
6135 retval = children().get_last<DocInternal>()->parse(m_level+1);
6136 if (retval.is(TokenRetval::RetVal_EndInternal))
6137 {
6138 retval = Token::make_RetVal_OK();
6139 }
6140 }
6141 } while (!retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6142 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6143 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6144 );
6145
6146 if (lastPar) lastPar->markLast();
6147
6148 while (true)
6149 {
6150 if (retval.is(TokenRetval::RetVal_Subsection) && m_level<=1)
6151 {
6152 // then parse any number of nested sections
6153 while (retval.is(TokenRetval::RetVal_Subsection)) // more sections follow
6154 {
6156 2,
6158 retval = children().get_last<DocSection>()->parse();
6159 }
6160 break;
6161 }
6162 else if (retval.is(TokenRetval::RetVal_Subsubsection) && m_level<=2)
6163 {
6164 if ((m_level <= 1) &&
6165 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6166 {
6167 warn_doc_error(parser()->context.fileName,
6168 parser()->tokenizer.getLineNr(),
6169 "Unexpected subsubsection command found inside {}!",
6171 }
6172 // then parse any number of nested sections
6173 while (retval.is(TokenRetval::RetVal_Subsubsection)) // more sections follow
6174 {
6176 3,
6178 retval = children().get_last<DocSection>()->parse();
6179 }
6180 if (!(m_level < 2 && retval.is(TokenRetval::RetVal_Subsection))) break;
6181 }
6182 else if (retval.is(TokenRetval::RetVal_Paragraph) && m_level<=3)
6183 {
6184 if ((m_level <= 2) &&
6185 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6186 {
6187 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6188 "Unexpected paragraph command found inside {}!",
6190 }
6191 // then parse any number of nested sections
6192 while (retval.is(TokenRetval::RetVal_Paragraph)) // more sections follow
6193 {
6195 4,
6197 retval = children().get_last<DocSection>()->parse();
6198 }
6199 if (!(m_level<3 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection)))) break;
6200 }
6201 else if (retval.is(TokenRetval::RetVal_SubParagraph) && m_level<=4)
6202 {
6203 if ((m_level <= 3) &&
6204 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6205 {
6206 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6207 "Unexpected subparagraph command found inside {}!",
6209 }
6210 // then parse any number of nested sections
6211 while (retval.is(TokenRetval::RetVal_SubParagraph)) // more sections follow
6212 {
6214 5,
6216 retval = children().get_last<DocSection>()->parse();
6217 }
6218 if (!(m_level<4 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph)))) break;
6219 }
6220 else if (retval.is(TokenRetval::RetVal_SubSubParagraph) && m_level<=5)
6221 {
6222 if ((m_level <= 4) &&
6223 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6224 {
6225 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6226 "Unexpected subsubparagraph command found inside {}!",
6228 }
6229 // then parse any number of nested sections
6230 while (retval.is(TokenRetval::RetVal_SubSubParagraph)) // more sections follow
6231 {
6233 6,
6235 retval = children().get_last<DocSection>()->parse();
6236 }
6237 if (!(m_level<5 && (retval.is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6238 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph)))) break;
6239 }
6240 else
6241 {
6242 break;
6243 }
6244 }
6245
6246 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
6247 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6248 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6249 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6250 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6251 );
6252
6253 AUTO_TRACE_EXIT("retval={}", retval.to_string());
6254 return retval;
6255}
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:1095
DocParserContext context
std::unique_ptr< DocNodeVariant > m_title
Definition docnode.h:937
Token parse()
Definition docnode.cpp:6089
DocSection(DocParser *parser, DocNodeVariant *parent, int level, const QCString &id)
Definition docnode.h:925
const DocNodeVariant * title() const
Definition docnode.h:928
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:58
#define AUTO_TRACE(...)
Definition docnode.cpp:48
#define INTERNAL_ASSERT(x)
Definition docnode.cpp:53
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:50
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1501
#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:1405
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1416
TokenInfo * token
Definition docparser_p.h:95
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 938 of file docnode.h.

Referenced by anchor(), and parse().

◆ m_file

QCString DocSection::m_file
private

Definition at line 939 of file docnode.h.

Referenced by file(), and parse().

◆ m_id

QCString DocSection::m_id
private

Definition at line 936 of file docnode.h.

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

◆ m_level

int DocSection::m_level = 0
private

Definition at line 935 of file docnode.h.

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

◆ m_title

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

Definition at line 937 of file docnode.h.

Referenced by parse(), and title().


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