Doxygen
Loading...
Searching...
No Matches
DocRoot Class Referencefinal

Root node of documentation tree. More...

#include <src/docnode.h>

Inheritance diagram for DocRoot:
Collaboration diagram for DocRoot:

Public Member Functions

 DocRoot (DocParser *parser, bool indent, bool sl)
void parse ()
bool indent () const
bool singleLine () const
bool empty () const
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

bool m_indent = false
bool m_singleLine = false

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

Root node of documentation tree.

Definition at line 1317 of file docnode.h.

Constructor & Destructor Documentation

◆ DocRoot()

DocRoot::DocRoot ( DocParser * parser,
bool indent,
bool sl )
inline

Definition at line 1320 of file docnode.h.

DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:141
DocParser * parser()
Definition docnode.h:97
bool indent() const
Definition docnode.h:1323
bool m_singleLine
Definition docnode.h:1329
bool m_indent
Definition docnode.h:1328

References DocCompoundNode::DocCompoundNode(), indent(), m_indent, m_singleLine, and DocNode::parser().

Referenced by validatingParseDoc().

Member Function Documentation

◆ empty()

bool DocRoot::empty ( ) const
inline

Definition at line 1325 of file docnode.h.

1325{ return children().empty(); }
DocNodeList & children()
Definition docnode.h:143
bool empty() const
checks whether the container is empty
Definition growvector.h:140

References DocCompoundNode::children(), and GrowVector< T >::empty().

◆ indent()

bool DocRoot::indent ( ) const
inline

Definition at line 1323 of file docnode.h.

1323{ return m_indent; }

References m_indent.

Referenced by DocRoot(), and RTFDocVisitor::operator()().

◆ parse()

void DocRoot::parse ( )

Definition at line 6277 of file docnode.cpp.

6278{
6279 AUTO_TRACE();
6280 auto ns = AutoNodeStack(parser(),thisVariant());
6282 Token retval = Token::make_TK_NONE();
6283
6284 // first parse any number of paragraphs
6285 bool isFirst=true;
6286 DocPara *lastPar = nullptr;
6287 do
6288 {
6289 {
6290 children().append<DocPara>(parser(),thisVariant());
6291 DocPara *par = children().get_last<DocPara>();
6292 if (isFirst) { par->markFirst(); isFirst=false; }
6293 retval=par->parse();
6294 if (par->empty() && par->attribs().empty())
6295 {
6296 children().pop_back();
6297 }
6298 else
6299 {
6300 lastPar = par;
6301 }
6302 }
6303 auto checkParagraph = [this,&retval](Token t,int level,const char *sectionType,const char *parentSectionType) {
6304 if (retval == t)
6305 {
6306 if (!AnchorGenerator::instance().isGenerated(parser()->context.token->sectionId.str()))
6307 {
6308 warn_doc_error(parser()->context.fileName,
6309 parser()->tokenizer.getLineNr(),
6310 "found {} command (id: '{}') outside of {} context!",
6311 sectionType,parser()->context.token->sectionId,parentSectionType);
6312 }
6313 while (retval==t)
6314 {
6315 if (!parser()->context.token->sectionId.empty())
6316 {
6317 const SectionInfo *sec=SectionManager::instance().find(parser()->context.token->sectionId);
6318 if (sec)
6319 {
6320 children().append<DocSection>(parser(),thisVariant(),
6321 level,
6323 retval = children().get_last<DocSection>()->parse();
6324 }
6325 else
6326 {
6327 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid {} id '{}'; ignoring {}",
6328 sectionType,parser()->context.token->sectionId,sectionType);
6329 retval = Token::make_TK_NONE();
6330 }
6331 }
6332 else
6333 {
6334 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing id for {}; ignoring {}",sectionType,sectionType);
6335 retval = Token::make_TK_NONE();
6336 }
6337 }
6338 }
6339 };
6340 checkParagraph(Token::make_RetVal_SubSubParagraph(), 6, "subsubparagraph", "subparagraph" );
6341 checkParagraph(Token::make_RetVal_SubParagraph(), 5, "subparagraph", "paragraph" );
6342 checkParagraph(Token::make_RetVal_Paragraph(), 4, "paragraph", "subsubsection" );
6343 checkParagraph(Token::make_RetVal_Subsubsection(), 3, "subsubsection", "subsection" );
6344 checkParagraph(Token::make_RetVal_Subsection(), 2, "subsection", "section" );
6345
6346 if (retval.is(TokenRetval::TK_LISTITEM))
6347 {
6348 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid list item found");
6349 }
6350 if (retval.is(TokenRetval::RetVal_Internal))
6351 {
6352 children().append<DocInternal>(parser(),thisVariant());
6353 retval = children().get_last<DocInternal>()->parse(1);
6354 }
6355 } while (!retval.is_any_of(TokenRetval::TK_NONE,TokenRetval::TK_EOF,TokenRetval::RetVal_Section));
6356 if (lastPar) lastPar->markLast();
6357
6358 //printf("DocRoot::parse() retval=%d %d\n",retval,TokenRetval::RetVal_Section);
6359 // then parse any number of level1 sections
6360 while (retval.is(TokenRetval::RetVal_Section))
6361 {
6362 if (!parser()->context.token->sectionId.empty())
6363 {
6364 const SectionInfo *sec=SectionManager::instance().find(parser()->context.token->sectionId);
6365 if (sec)
6366 {
6367 children().append<DocSection>(parser(),thisVariant(),
6368 1,
6370 retval = children().get_last<DocSection>()->parse();
6371 }
6372 else
6373 {
6374 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Invalid section id '{}'; ignoring section",parser()->context.token->sectionId);
6375 retval = Token::make_TK_NONE();
6376 }
6377 }
6378 else
6379 {
6380 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"Missing id for section; ignoring section");
6381 retval = Token::make_TK_NONE();
6382 }
6383 }
6384
6386}
static AnchorGenerator & instance()
Returns the singleton instance.
Definition anchor.cpp:38
AutoNodeStack(DocParser *parser, DocNodeVariant *node)
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
DocTokenizer tokenizer
DocParserContext context
void handleUnclosedStyleCommands()
void parse()
Definition docnode.cpp:6277
void setStatePara()
void pop_back()
removes the last element
Definition growvector.h:115
const T * find(const std::string &key) const
Definition linkedmap.h:47
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:179
bool is(TokenRetval rv) const
bool is_any_of(ARGS... args) const
DString sectionId
#define AUTO_TRACE(...)
Definition docnode.cpp:51
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
TokenInfo * token
Definition docparser_p.h:94

References DocNodeList::append(), AUTO_TRACE, AutoNodeStack::AutoNodeStack(), DocCompoundNode::children(), DocParser::context, LinkedMap< T, Hash, KeyEqual, Map >::find(), DocNodeList::get_last(), DocParser::handleUnclosedStyleCommands(), AnchorGenerator::instance(), SectionManager::instance(), Token::is(), Token::is_any_of(), DocPara::markLast(), parse(), DocNode::parser(), GrowVector< T >::pop_back(), TokenInfo::sectionId, DocTokenizer::setStatePara(), DocNode::thisVariant(), DocParserContext::token, DocParser::tokenizer, and warn_doc_error.

Referenced by parse().

◆ singleLine()

bool DocRoot::singleLine ( ) const
inline

Definition at line 1324 of file docnode.h.

1324{ return m_singleLine; }

References m_singleLine.

Referenced by RTFDocVisitor::operator()().

Member Data Documentation

◆ m_indent

bool DocRoot::m_indent = false
private

Definition at line 1328 of file docnode.h.

Referenced by DocRoot(), and indent().

◆ m_singleLine

bool DocRoot::m_singleLine = false
private

Definition at line 1329 of file docnode.h.

Referenced by DocRoot(), and singleLine().


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