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 }
 
Protected Member Functions inherited from DocNode
void setInsidePreformatted (bool p)
 

Detailed Description

Node representing a normal section.

Definition at line 907 of file docnode.h.

Constructor & Destructor Documentation

◆ DocSection()

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

Definition at line 910 of file docnode.h.

910 :
DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:140
DocParser * parser()
Definition docnode.h:97
DocNodeVariant * parent()
Definition docnode.h:89
QCString m_id
Definition docnode.h:921
int level() const
Definition docnode.h:912
int m_level
Definition docnode.h:920

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

916{ return m_file; }
QCString m_file
Definition docnode.h:924

References m_file.

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

◆ id()

QCString DocSection::id ( ) const
inline

Definition at line 915 of file docnode.h.

915{ return m_id; }

References m_id.

Referenced by DocSection().

◆ level()

◆ parse()

Token DocSection::parse ( )

Definition at line 5772 of file docnode.cpp.

5773{
5774 AUTO_TRACE("start {} level={}", parser()->context.token->sectionId, m_level);
5775 Token retval = Token::make_RetVal_OK();
5776 auto ns = AutoNodeStack(parser(),thisVariant());
5777
5778 if (!m_id.isEmpty())
5779 {
5780 const SectionInfo *sec = SectionManager::instance().find(m_id);
5781 if (sec)
5782 {
5783 m_file = sec->fileName();
5784 m_anchor = sec->label();
5785 QCString titleStr = sec->title();
5786 if (titleStr.isEmpty()) titleStr = sec->label();
5788 DocTitle *title = &std::get<DocTitle>(*m_title);
5789 title->parseFromString(thisVariant(),titleStr);
5790 }
5791 }
5792
5793 // first parse any number of paragraphs
5794 bool isFirst=TRUE;
5795 DocPara *lastPar=nullptr;
5796 do
5797 {
5798 children().append<DocPara>(parser(),thisVariant());
5799 DocPara *par = children().get_last<DocPara>();
5800 if (isFirst) { par->markFirst(); isFirst=FALSE; }
5801 retval=par->parse();
5802 if (!par->isEmpty())
5803 {
5804 if (lastPar) lastPar->markLast(FALSE);
5805 lastPar = par;
5806 }
5807 else
5808 {
5809 children().pop_back();
5810 }
5811 if (retval.is(TokenRetval::TK_LISTITEM))
5812 {
5813 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid list item found");
5814 }
5815 if (retval.is(TokenRetval::RetVal_Internal))
5816 {
5817 children().append<DocInternal>(parser(),thisVariant());
5818 retval = children().get_last<DocInternal>()->parse(m_level+1);
5819 if (retval.is(TokenRetval::RetVal_EndInternal))
5820 {
5821 retval = Token::make_RetVal_OK();
5822 }
5823 }
5824 } while (!retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
5825 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
5826 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
5827 );
5828
5829 if (lastPar) lastPar->markLast();
5830
5831 while (true)
5832 {
5833 if (retval.is(TokenRetval::RetVal_Subsection) && m_level<=1)
5834 {
5835 // then parse any number of nested sections
5836 while (retval.is(TokenRetval::RetVal_Subsection)) // more sections follow
5837 {
5839 2,
5841 retval = children().get_last<DocSection>()->parse();
5842 }
5843 break;
5844 }
5845 else if (retval.is(TokenRetval::RetVal_Subsubsection) && m_level<=2)
5846 {
5847 if ((m_level <= 1) &&
5848 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5849 {
5850 warn_doc_error(parser()->context.fileName,
5851 parser()->tokenizer.getLineNr(),
5852 "Unexpected subsubsection command found inside {}!",
5854 }
5855 // then parse any number of nested sections
5856 while (retval.is(TokenRetval::RetVal_Subsubsection)) // more sections follow
5857 {
5859 3,
5861 retval = children().get_last<DocSection>()->parse();
5862 }
5863 if (!(m_level < 2 && retval.is(TokenRetval::RetVal_Subsection))) break;
5864 }
5865 else if (retval.is(TokenRetval::RetVal_Paragraph) && m_level<=3)
5866 {
5867 if ((m_level <= 2) &&
5868 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5869 {
5870 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5871 "Unexpected paragraph command found inside {}!",
5873 }
5874 // then parse any number of nested sections
5875 while (retval.is(TokenRetval::RetVal_Paragraph)) // more sections follow
5876 {
5878 4,
5880 retval = children().get_last<DocSection>()->parse();
5881 }
5882 if (!(m_level<3 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection)))) break;
5883 }
5884 else if (retval.is(TokenRetval::RetVal_SubParagraph) && m_level<=4)
5885 {
5886 if ((m_level <= 3) &&
5887 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5888 {
5889 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5890 "Unexpected subparagraph command found inside {}!",
5892 }
5893 // then parse any number of nested sections
5894 while (retval.is(TokenRetval::RetVal_SubParagraph)) // more sections follow
5895 {
5897 5,
5899 retval = children().get_last<DocSection>()->parse();
5900 }
5901 if (!(m_level<4 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph)))) break;
5902 }
5903 else if (retval.is(TokenRetval::RetVal_SubSubParagraph) && m_level<=5)
5904 {
5905 if ((m_level <= 4) &&
5906 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5907 {
5908 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5909 "Unexpected subsubparagraph command found inside {}!",
5911 }
5912 // then parse any number of nested sections
5913 while (retval.is(TokenRetval::RetVal_SubSubParagraph)) // more sections follow
5914 {
5916 6,
5918 retval = children().get_last<DocSection>()->parse();
5919 }
5920 if (!(m_level<5 && (retval.is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
5921 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph)))) break;
5922 }
5923 else
5924 {
5925 break;
5926 }
5927 }
5928
5929 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
5930 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
5931 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
5932 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
5933 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
5934 );
5935
5936 AUTO_TRACE_EXIT("retval={}", retval.to_string());
5937 return retval;
5938}
static AnchorGenerator & instance()
Returns the singleton instance.
Definition anchor.cpp:38
DocNodeList & children()
Definition docnode.h:142
DocNodeVariant * thisVariant()
Definition docnode.h:92
void markLast(bool v=TRUE)
Definition docnode.h:1080
DocParserContext context
std::unique_ptr< DocNodeVariant > m_title
Definition docnode.h:922
Token parse()
Definition docnode.cpp:5772
DocSection(DocParser *parser, DocNodeVariant *parent, int level, const QCString &id)
Definition docnode.h:910
const DocNodeVariant * title() const
Definition docnode.h:913
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:150
QCString label() const
Definition section.h:68
QCString fileName() const
Definition section.h:73
QCString title() const
Definition section.h:69
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:175
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:56
#define AUTO_TRACE(...)
Definition docnode.cpp:46
#define INTERNAL_ASSERT(x)
Definition docnode.cpp:51
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:48
std::unique_ptr< DocNodeVariant > createDocNode(Args &&...args)
Definition docnode.h:1485
#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:1393
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1404
TokenInfo * token
Definition docparser_p.h:92
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 923 of file docnode.h.

Referenced by anchor(), and parse().

◆ m_file

QCString DocSection::m_file
private

Definition at line 924 of file docnode.h.

Referenced by file(), and parse().

◆ m_id

QCString DocSection::m_id
private

Definition at line 921 of file docnode.h.

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

◆ m_level

int DocSection::m_level = 0
private

Definition at line 920 of file docnode.h.

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

◆ m_title

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

Definition at line 922 of file docnode.h.

Referenced by parse(), and title().


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