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

5994{
5995 AUTO_TRACE("start {} level={}", parser()->context.token->sectionId, m_level);
5996 Token retval = Token::make_RetVal_OK();
5997 auto ns = AutoNodeStack(parser(),thisVariant());
5998
5999 if (!m_id.empty())
6000 {
6001 const SectionInfo *sec = SectionManager::instance().find(m_id);
6002 if (sec)
6003 {
6004 m_file = sec->fileName();
6005 m_anchor = sec->label();
6006 DString titleStr = sec->title();
6007 if (titleStr.empty()) titleStr = sec->label();
6009 DocTitle *title = &std::get<DocTitle>(*m_title);
6010 title->parseFromString(thisVariant(),titleStr);
6011 }
6012 }
6013
6014 // first parse any number of paragraphs
6015 bool isFirst=true;
6016 DocPara *lastPar=nullptr;
6017 do
6018 {
6019 children().append<DocPara>(parser(),thisVariant());
6020 DocPara *par = children().get_last<DocPara>();
6021 if (isFirst) { par->markFirst(); isFirst=false; }
6022 retval=par->parse();
6023 if (!par->empty())
6024 {
6025 if (lastPar) lastPar->markLast(false);
6026 lastPar = par;
6027 }
6028 else
6029 {
6030 children().pop_back();
6031 }
6032 if (retval.is(TokenRetval::TK_LISTITEM))
6033 {
6034 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid list item found");
6035 }
6036 if (retval.is(TokenRetval::RetVal_Internal))
6037 {
6038 children().append<DocInternal>(parser(),thisVariant());
6039 retval = children().get_last<DocInternal>()->parse(m_level+1);
6040 if (retval.is(TokenRetval::RetVal_EndInternal))
6041 {
6042 retval = Token::make_RetVal_OK();
6043 }
6044 }
6045 } while (!retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6046 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
6047 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
6048 );
6049
6050 if (lastPar) lastPar->markLast();
6051
6052 while (true)
6053 {
6054 if (retval.is(TokenRetval::RetVal_Subsection) && m_level<=1)
6055 {
6056 // then parse any number of nested sections
6057 while (retval.is(TokenRetval::RetVal_Subsection)) // more sections follow
6058 {
6060 2,
6062 retval = children().get_last<DocSection>()->parse();
6063 }
6064 break;
6065 }
6066 else if (retval.is(TokenRetval::RetVal_Subsubsection) && m_level<=2)
6067 {
6068 if ((m_level <= 1) &&
6069 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6070 {
6071 warn_doc_error(parser()->context.fileName,
6072 parser()->tokenizer.getLineNr(),
6073 "Unexpected subsubsection command found inside {}!",
6075 }
6076 // then parse any number of nested sections
6077 while (retval.is(TokenRetval::RetVal_Subsubsection)) // more sections follow
6078 {
6080 3,
6082 retval = children().get_last<DocSection>()->parse();
6083 }
6084 if (!(m_level < 2 && retval.is(TokenRetval::RetVal_Subsection))) break;
6085 }
6086 else if (retval.is(TokenRetval::RetVal_Paragraph) && m_level<=3)
6087 {
6088 if ((m_level <= 2) &&
6089 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6090 {
6091 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6092 "Unexpected paragraph command found inside {}!",
6094 }
6095 // then parse any number of nested sections
6096 while (retval.is(TokenRetval::RetVal_Paragraph)) // more sections follow
6097 {
6099 4,
6101 retval = children().get_last<DocSection>()->parse();
6102 }
6103 if (!(m_level<3 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection)))) break;
6104 }
6105 else if (retval.is(TokenRetval::RetVal_SubParagraph) && m_level<=4)
6106 {
6107 if ((m_level <= 3) &&
6108 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6109 {
6110 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6111 "Unexpected subparagraph command found inside {}!",
6113 }
6114 // then parse any number of nested sections
6115 while (retval.is(TokenRetval::RetVal_SubParagraph)) // more sections follow
6116 {
6118 5,
6120 retval = children().get_last<DocSection>()->parse();
6121 }
6122 if (!(m_level<4 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph)))) break;
6123 }
6124 else if (retval.is(TokenRetval::RetVal_SubSubParagraph) && m_level<=5)
6125 {
6126 if ((m_level <= 4) &&
6127 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6128 {
6129 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
6130 "Unexpected subsubparagraph command found inside {}!",
6132 }
6133 // then parse any number of nested sections
6134 while (retval.is(TokenRetval::RetVal_SubSubParagraph)) // more sections follow
6135 {
6137 6,
6139 retval = children().get_last<DocSection>()->parse();
6140 }
6141 if (!(m_level<5 && (retval.is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
6142 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph)))) break;
6143 }
6144 else
6145 {
6146 break;
6147 }
6148 }
6149
6150 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
6151 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
6152 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
6153 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
6154 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
6155 );
6156
6157 AUTO_TRACE_EXIT("retval={}", retval.to_string());
6158 return retval;
6159}
static AnchorGenerator & instance()
Returns the singleton instance.
Definition anchor.cpp:38
AutoNodeStack(DocParser *parser, DocNodeVariant *node)
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:152
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:5993
const DocNodeVariant * title() const
Definition docnode.h:928
void parseFromString(DocNodeVariant *, const DString &title)
Definition docnode.cpp:3130
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:61
#define AUTO_TRACE(...)
Definition docnode.cpp:51
#define INTERNAL_ASSERT(x)
Definition docnode.cpp:56
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:53
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, AutoNodeStack::AutoNodeStack(), 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: