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

Constructor & Destructor Documentation

◆ DocSection()

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

Definition at line 896 of file docnode.h.

896 :
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:907
int level() const
Definition docnode.h:898
int m_level
Definition docnode.h:906

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

902{ return m_file; }
QCString m_file
Definition docnode.h:910

References m_file.

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

◆ id()

QCString DocSection::id ( ) const
inline

Definition at line 901 of file docnode.h.

901{ return m_id; }

References m_id.

Referenced by DocSection().

◆ level()

◆ parse()

Token DocSection::parse ( )

Definition at line 5756 of file docnode.cpp.

5757{
5758 AUTO_TRACE("start {} level={}", parser()->context.token->sectionId, m_level);
5759 Token retval = Token::make_RetVal_OK();
5760 auto ns = AutoNodeStack(parser(),thisVariant());
5761
5762 if (!m_id.isEmpty())
5763 {
5764 const SectionInfo *sec = SectionManager::instance().find(m_id);
5765 if (sec)
5766 {
5767 m_file = sec->fileName();
5768 m_anchor = sec->label();
5769 QCString titleStr = sec->title();
5770 if (titleStr.isEmpty()) titleStr = sec->label();
5772 DocTitle *title = &std::get<DocTitle>(*m_title);
5773 title->parseFromString(thisVariant(),titleStr);
5774 }
5775 }
5776
5777 // first parse any number of paragraphs
5778 bool isFirst=TRUE;
5779 DocPara *lastPar=nullptr;
5780 do
5781 {
5782 children().append<DocPara>(parser(),thisVariant());
5783 DocPara *par = children().get_last<DocPara>();
5784 if (isFirst) { par->markFirst(); isFirst=FALSE; }
5785 retval=par->parse();
5786 if (!par->isEmpty())
5787 {
5788 if (lastPar) lastPar->markLast(FALSE);
5789 lastPar = par;
5790 }
5791 else
5792 {
5793 children().pop_back();
5794 }
5795 if (retval.is(TokenRetval::TK_LISTITEM))
5796 {
5797 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid list item found");
5798 }
5799 if (retval.is(TokenRetval::RetVal_Internal))
5800 {
5801 children().append<DocInternal>(parser(),thisVariant());
5802 retval = children().get_last<DocInternal>()->parse(m_level+1);
5803 if (retval.is(TokenRetval::RetVal_EndInternal))
5804 {
5805 retval = Token::make_RetVal_OK();
5806 }
5807 }
5808 } while (!retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
5809 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
5810 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
5811 );
5812
5813 if (lastPar) lastPar->markLast();
5814
5815 while (true)
5816 {
5817 if (retval.is(TokenRetval::RetVal_Subsection) && m_level<=1)
5818 {
5819 // then parse any number of nested sections
5820 while (retval.is(TokenRetval::RetVal_Subsection)) // more sections follow
5821 {
5823 2,
5825 retval = children().get_last<DocSection>()->parse();
5826 }
5827 break;
5828 }
5829 else if (retval.is(TokenRetval::RetVal_Subsubsection) && m_level<=2)
5830 {
5831 if ((m_level <= 1) &&
5832 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5833 {
5834 warn_doc_error(parser()->context.fileName,
5835 parser()->tokenizer.getLineNr(),
5836 "Unexpected subsubsection command found inside %s!",
5838 }
5839 // then parse any number of nested sections
5840 while (retval.is(TokenRetval::RetVal_Subsubsection)) // more sections follow
5841 {
5843 3,
5845 retval = children().get_last<DocSection>()->parse();
5846 }
5847 if (!(m_level < 2 && retval.is(TokenRetval::RetVal_Subsection))) break;
5848 }
5849 else if (retval.is(TokenRetval::RetVal_Paragraph) && m_level<=3)
5850 {
5851 if ((m_level <= 2) &&
5852 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5853 {
5854 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5855 "Unexpected paragraph command found inside %s!",
5857 }
5858 // then parse any number of nested sections
5859 while (retval.is(TokenRetval::RetVal_Paragraph)) // more sections follow
5860 {
5862 4,
5864 retval = children().get_last<DocSection>()->parse();
5865 }
5866 if (!(m_level<3 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection)))) break;
5867 }
5868 else if (retval.is(TokenRetval::RetVal_SubParagraph) && m_level<=4)
5869 {
5870 if ((m_level <= 3) &&
5871 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5872 {
5873 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5874 "Unexpected subparagraph command found inside %s!",
5876 }
5877 // then parse any number of nested sections
5878 while (retval.is(TokenRetval::RetVal_SubParagraph)) // more sections follow
5879 {
5881 5,
5883 retval = children().get_last<DocSection>()->parse();
5884 }
5885 if (!(m_level<4 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph)))) break;
5886 }
5887 else if (retval.is(TokenRetval::RetVal_SubSubParagraph) && m_level<=5)
5888 {
5889 if ((m_level <= 4) &&
5890 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5891 {
5892 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5893 "Unexpected subsubparagraph command found inside %s!",
5895 }
5896 // then parse any number of nested sections
5897 while (retval.is(TokenRetval::RetVal_SubSubParagraph)) // more sections follow
5898 {
5900 6,
5902 retval = children().get_last<DocSection>()->parse();
5903 }
5904 if (!(m_level<5 && (retval.is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
5905 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph)))) break;
5906 }
5907 else
5908 {
5909 break;
5910 }
5911 }
5912
5913 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
5914 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
5915 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
5916 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
5917 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
5918 );
5919
5920 AUTO_TRACE_EXIT("retval={}", retval.to_string());
5921 return retval;
5922}
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:1066
DocParserContext context
std::unique_ptr< DocNodeVariant > m_title
Definition docnode.h:908
Token parse()
Definition docnode.cpp:5756
DocSection(DocParser *parser, DocNodeVariant *parent, int level, const QCString &id)
Definition docnode.h:896
const DocNodeVariant * title() const
Definition docnode.h:899
void pop_back()
removes the last element
Definition growvector.h:115
const T * find(const std::string &key) const
Find an object given the key.
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:1471
#define warn_doc_error(file, line, fmt,...)
Definition message.h:74
#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:1379
T * get_last()
Returns a pointer to the last element in the list if that element exists and holds a T,...
Definition docnode.h:1390
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 909 of file docnode.h.

Referenced by anchor(), and parse().

◆ m_file

QCString DocSection::m_file
private

Definition at line 910 of file docnode.h.

Referenced by file(), and parse().

◆ m_id

QCString DocSection::m_id
private

Definition at line 907 of file docnode.h.

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

◆ m_level

int DocSection::m_level = 0
private

Definition at line 906 of file docnode.h.

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

◆ m_title

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

Definition at line 908 of file docnode.h.

Referenced by parse(), and title().


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