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: