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

5765{
5766 AUTO_TRACE("start {} level={}", parser()->context.token->sectionId, m_level);
5767 Token retval = Token::make_RetVal_OK();
5768 auto ns = AutoNodeStack(parser(),thisVariant());
5769
5770 if (!m_id.isEmpty())
5771 {
5772 const SectionInfo *sec = SectionManager::instance().find(m_id);
5773 if (sec)
5774 {
5775 m_file = sec->fileName();
5776 m_anchor = sec->label();
5777 QCString titleStr = sec->title();
5778 if (titleStr.isEmpty()) titleStr = sec->label();
5780 DocTitle *title = &std::get<DocTitle>(*m_title);
5781 title->parseFromString(thisVariant(),titleStr);
5782 }
5783 }
5784
5785 // first parse any number of paragraphs
5786 bool isFirst=TRUE;
5787 DocPara *lastPar=nullptr;
5788 do
5789 {
5790 children().append<DocPara>(parser(),thisVariant());
5791 DocPara *par = children().get_last<DocPara>();
5792 if (isFirst) { par->markFirst(); isFirst=FALSE; }
5793 retval=par->parse();
5794 if (!par->isEmpty())
5795 {
5796 if (lastPar) lastPar->markLast(FALSE);
5797 lastPar = par;
5798 }
5799 else
5800 {
5801 children().pop_back();
5802 }
5803 if (retval.is(TokenRetval::TK_LISTITEM))
5804 {
5805 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid list item found");
5806 }
5807 if (retval.is(TokenRetval::RetVal_Internal))
5808 {
5809 children().append<DocInternal>(parser(),thisVariant());
5810 retval = children().get_last<DocInternal>()->parse(m_level+1);
5811 if (retval.is(TokenRetval::RetVal_EndInternal))
5812 {
5813 retval = Token::make_RetVal_OK();
5814 }
5815 }
5816 } while (!retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF, TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
5817 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph,
5818 TokenRetval::RetVal_SubSubParagraph, TokenRetval::RetVal_EndInternal)
5819 );
5820
5821 if (lastPar) lastPar->markLast();
5822
5823 while (true)
5824 {
5825 if (retval.is(TokenRetval::RetVal_Subsection) && m_level<=1)
5826 {
5827 // then parse any number of nested sections
5828 while (retval.is(TokenRetval::RetVal_Subsection)) // more sections follow
5829 {
5831 2,
5833 retval = children().get_last<DocSection>()->parse();
5834 }
5835 break;
5836 }
5837 else if (retval.is(TokenRetval::RetVal_Subsubsection) && m_level<=2)
5838 {
5839 if ((m_level <= 1) &&
5840 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5841 {
5842 warn_doc_error(parser()->context.fileName,
5843 parser()->tokenizer.getLineNr(),
5844 "Unexpected subsubsection command found inside %s!",
5846 }
5847 // then parse any number of nested sections
5848 while (retval.is(TokenRetval::RetVal_Subsubsection)) // more sections follow
5849 {
5851 3,
5853 retval = children().get_last<DocSection>()->parse();
5854 }
5855 if (!(m_level < 2 && retval.is(TokenRetval::RetVal_Subsection))) break;
5856 }
5857 else if (retval.is(TokenRetval::RetVal_Paragraph) && m_level<=3)
5858 {
5859 if ((m_level <= 2) &&
5860 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5861 {
5862 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5863 "Unexpected paragraph command found inside %s!",
5865 }
5866 // then parse any number of nested sections
5867 while (retval.is(TokenRetval::RetVal_Paragraph)) // more sections follow
5868 {
5870 4,
5872 retval = children().get_last<DocSection>()->parse();
5873 }
5874 if (!(m_level<3 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection)))) break;
5875 }
5876 else if (retval.is(TokenRetval::RetVal_SubParagraph) && m_level<=4)
5877 {
5878 if ((m_level <= 3) &&
5879 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5880 {
5881 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5882 "Unexpected subparagraph command found inside %s!",
5884 }
5885 // then parse any number of nested sections
5886 while (retval.is(TokenRetval::RetVal_SubParagraph)) // more sections follow
5887 {
5889 5,
5891 retval = children().get_last<DocSection>()->parse();
5892 }
5893 if (!(m_level<4 && (retval.is_any_of(TokenRetval::RetVal_Subsection,TokenRetval::RetVal_Subsubsection,TokenRetval::RetVal_Paragraph)))) break;
5894 }
5895 else if (retval.is(TokenRetval::RetVal_SubSubParagraph) && m_level<=5)
5896 {
5897 if ((m_level <= 4) &&
5898 !AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
5899 {
5900 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
5901 "Unexpected subsubparagraph command found inside %s!",
5903 }
5904 // then parse any number of nested sections
5905 while (retval.is(TokenRetval::RetVal_SubSubParagraph)) // more sections follow
5906 {
5908 6,
5910 retval = children().get_last<DocSection>()->parse();
5911 }
5912 if (!(m_level<5 && (retval.is_any_of( TokenRetval::RetVal_Subsection, TokenRetval::RetVal_Subsubsection,
5913 TokenRetval::RetVal_Paragraph, TokenRetval::RetVal_SubParagraph)))) break;
5914 }
5915 else
5916 {
5917 break;
5918 }
5919 }
5920
5921 INTERNAL_ASSERT(retval.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF,
5922 TokenRetval::RetVal_Section, TokenRetval::RetVal_Subsection,
5923 TokenRetval::RetVal_Subsubsection, TokenRetval::RetVal_Paragraph,
5924 TokenRetval::RetVal_SubParagraph, TokenRetval::RetVal_SubSubParagraph,
5925 TokenRetval::RetVal_Internal, TokenRetval::RetVal_EndInternal)
5926 );
5927
5928 AUTO_TRACE_EXIT("retval={}", retval.to_string());
5929 return retval;
5930}
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:5764
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
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:1485
#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: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: