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

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 DString &id)
int level () const
const DocNodeVarianttitle () const
DString anchor () const
DString id () const
DString 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
DString m_id
std::unique_ptr< DocNodeVariantm_title
DString m_anchor
DString 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 DString & 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:97
DocNodeVariant * parent()
Definition docnode.h:89
int level() const
Definition docnode.h:927
DString m_id
Definition docnode.h:936
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()

DString DocSection::anchor ( ) const
inline

◆ file()

DString DocSection::file ( ) const
inline

◆ id()

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

6075{
6076 AUTO_TRACE("start {} level={}", parser()->context.token->sectionId, m_level);
6077 Token retval = Token::make_RetVal_OK();
6078 auto ns = AutoNodeStack(parser(),thisVariant());
6079
6080 if (!m_id.empty())
6081 {
6082 const SectionInfo *sec = SectionManager::instance().find(m_id);
6083 if (sec)
6084 {
6085 m_file = sec->fileName();
6086 m_anchor = sec->label();
6087 DString titleStr = sec->title();
6088 if (titleStr.empty()) titleStr = sec->label();
6090 DocTitle *title = &std::get<DocTitle>(*m_title);
6091 title->parseFromString(thisVariant(),titleStr);
6092 }
6093 }
6094
6095 // first parse any number of paragraphs
6096 bool isFirst=true;
6097 DocPara *lastPar=nullptr;
6098 do
6099 {
6100 children().append<DocPara>(parser(),thisVariant());
6101 DocPara *par = children().get_last<DocPara>();
6102 if (isFirst) { par->markFirst(); isFirst=false; }
6103 retval=par->parse();
6104 if (!par->empty())
6105 {
6106 if (lastPar) lastPar->markLast(false);
6107 lastPar = par;
6108 }
6109 else
6110 {
6111 children().pop_back();
6112 }
6113 if (retval.is(TokenRetval::TK_LISTITEM))
6114 {
6115 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid list item found");
6116 }
6117 if (retval.is(TokenRetval::RetVal_Internal))
6118 {
6119 children().append<DocInternal>(parser(),thisVariant());
6120 retval = children().get_last<DocInternal>()->parse(m_level+1);
6121 if (retval.is(TokenRetval::RetVal_EndInternal))
6122 {
6123 retval = Token::make_RetVal_OK();
6124 }
6125 }
6126 } while (!retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6127 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6128 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6129 );
6130
6131 if (lastPar) lastPar->markLast();
6132
6133 while (true)
6134 {
6135 if (retval.is(TokenRetval::RetVal_Subsection) && m_level<=1)
6136 {
6137 // then parse any number of nested sections
6138 while (retval.is(TokenRetval::RetVal_Subsection)) // more sections follow
6139 {
6141 2,
6143 retval = children().get_last<DocSection>()->parse();
6144 }
6145 break;
6146 }
6147 else if (retval.is(TokenRetval::RetVal_Subsubsection) && m_level<=2)
6148 {
6149 if ((m_level <= 1) &&
6150 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6151 {
6152 warn_doc_error(parser()->context.fileName,
6153 parser()->tokenizer.getLineNr(),
6154 "Unexpected subsubsection command found inside {}!",
6156 }
6157 // then parse any number of nested sections
6158 while (retval.is(TokenRetval::RetVal_Subsubsection)) // more sections follow
6159 {
6161 3,
6163 retval = children().get_last<DocSection>()->parse();
6164 }
6165 if (!(m_level < 2 && retval.is(TokenRetval::RetVal_Subsection))) break;
6166 }
6167 else if (retval.is(TokenRetval::RetVal_Paragraph) && m_level<=3)
6168 {
6169 if ((m_level <= 2) &&
6170 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6171 {
6172 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6173 "Unexpected paragraph command found inside {}!",
6175 }
6176 // then parse any number of nested sections
6177 while (retval.is(TokenRetval::RetVal_Paragraph)) // more sections follow
6178 {
6180 4,
6182 retval = children().get_last<DocSection>()->parse();
6183 }
6184 if (!(m_level<3 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection)))) break;
6185 }
6186 else if (retval.is(TokenRetval::RetVal_SubParagraph) && m_level<=4)
6187 {
6188 if ((m_level <= 3) &&
6189 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6190 {
6191 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6192 "Unexpected subparagraph command found inside {}!",
6194 }
6195 // then parse any number of nested sections
6196 while (retval.is(TokenRetval::RetVal_SubParagraph)) // more sections follow
6197 {
6199 5,
6201 retval = children().get_last<DocSection>()->parse();
6202 }
6203 if (!(m_level<4 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph)))) break;
6204 }
6205 else if (retval.is(TokenRetval::RetVal_SubSubParagraph) && m_level<=5)
6206 {
6207 if ((m_level <= 4) &&
6208 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6209 {
6210 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6211 "Unexpected subsubparagraph command found inside {}!",
6213 }
6214 // then parse any number of nested sections
6215 while (retval.is(TokenRetval::RetVal_SubSubParagraph)) // more sections follow
6216 {
6218 6,
6220 retval = children().get_last<DocSection>()->parse();
6221 }
6222 if (!(m_level<5 && (retval.is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6223 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph)))) break;
6224 }
6225 else
6226 {
6227 break;
6228 }
6229 }
6230
6231 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
6232 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6233 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6234 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6235 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6236 );
6237
6238 AUTO_TRACE_EXIT("retval={}", retval.to_string());
6239 return retval;
6240}
static AnchorGenerator & instance()
Returns the singleton instance.
Definition anchor.cpp:41
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
DocNodeList & children()
Definition docnode.h:143
DocNodeVariant * thisVariant()
Definition docnode.h:92
void append(Args &&... args)
Append a new DocNodeVariant to the list by constructing it with type T and parameters Args.
Definition docnode.h:1404
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1415
void markLast(bool v=true)
Definition docnode.h:1095
DocParserContext context
std::unique_ptr< DocNodeVariant > m_title
Definition docnode.h:937
DocSection(DocParser *parser, DocNodeVariant *parent, int level, const DString &id)
Definition docnode.h:925
Token parse()
Definition docnode.cpp:6074
const DocNodeVariant * title() const
Definition docnode.h:928
void parseFromString(DocNodeVariant *, const DString &title)
Definition docnode.cpp:3211
void pop_back()
removes the last element
Definition growvector.h:115
const T * find(const std::string &key) const
Definition linkedmap.h:47
DString fileName() const
Definition section.h:74
DString title() const
Definition section.h:70
DString label() const
Definition section.h:69
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
DString sectionId
static const char * g_sectionLevelToName[]
Definition docnode.cpp:63
#define AUTO_TRACE(...)
Definition docnode.cpp:53
#define INTERNAL_ASSERT(x)
Definition docnode.cpp:58
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:55
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1500
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
TokenInfo * token
Definition docparser_p.h:94

References DocNodeList::append(), AUTO_TRACE, AUTO_TRACE_EXIT, DocCompoundNode::children(), DocParser::context, createDocNode(), DocSection(), DString::empty(), 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(), SectionInfo::label(), m_anchor, m_file, m_id, m_level, m_title, DocPara::markLast(), parse(), DocTitle::parseFromString(), DocNode::parser(), GrowVector< T >::pop_back(), TokenInfo::sectionId, DocNode::thisVariant(), title(), SectionInfo::title(), Token::to_string(), DocParserContext::token, and warn_doc_error.

Referenced by parse().

◆ title()

Member Data Documentation

◆ m_anchor

DString DocSection::m_anchor
private

Definition at line 938 of file docnode.h.

Referenced by anchor(), and parse().

◆ m_file

DString DocSection::m_file
private

Definition at line 939 of file docnode.h.

Referenced by file(), and parse().

◆ m_id

DString 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: