Doxygen
Loading...
Searching...
No Matches
DocRef Class Reference

Node representing a reference to some item. More...

#include <src/docnode.h>

+ Inheritance diagram for DocRef:
+ Collaboration diagram for DocRef:

Public Member Functions

 DocRef (DocParser *parser, DocNodeVariant *parent, const QCString &target, const QCString &context)
 
void parse ()
 
QCString file () const
 
QCString relPath () const
 
QCString ref () const
 
QCString anchor () const
 
QCString targetTitle () const
 
SectionType sectionType () const
 
bool hasLinkText () const
 
bool refToAnchor () const
 
bool refToSection () const
 
bool refToTable () const
 
bool isSubPage () 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

RefType m_refType = Unknown
 
SectionType m_sectionType = SectionType::Anchor
 
bool m_isSubPage = false
 
QCString m_file
 
QCString m_relPath
 
QCString m_ref
 
QCString m_anchor
 
QCString m_text
 

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 reference to some item.

Definition at line 771 of file docnode.h.

Constructor & Destructor Documentation

◆ DocRef()

DocRef::DocRef ( DocParser * parser,
DocNodeVariant * parent,
const QCString & target,
const QCString & context )

Definition at line 705 of file docnode.cpp.

705 :
707{
708 const Definition *compound = nullptr;
709 QCString anchor;
710 //printf("DocRef::DocRef(target=%s,context=%s)\n",qPrint(target),qPrint(context));
711 ASSERT(!target.isEmpty());
712 m_relPath = parser->context.relPath;
713 const SectionInfo *sec = SectionManager::instance().find(parser->context.prefix+target);
714 if (sec==nullptr && getLanguageFromFileName(target)==SrcLangExt::Markdown) // lookup as markdown file
715 {
717 }
718 if (sec) // ref to section or anchor
719 {
720 PageDef *pd = nullptr;
721 int secLevel = sec->type().level();
722 if (secLevel==SectionType::Page)
723 {
724 pd = Doxygen::pageLinkedMap->find(target);
725 }
726 m_text = sec->title();
727 if (m_text.isEmpty()) m_text = sec->label();
728
729 m_ref = sec->ref();
731 if (secLevel==SectionType::Anchor)
732 {
734 }
735 else if (secLevel==SectionType::Table)
736 {
738 }
739 else
740 {
742 }
743 m_isSubPage = pd && pd->hasParentPage();
744 if (secLevel!=SectionType::Page || m_isSubPage) m_anchor = sec->label();
745 m_sectionType = sec->type();
746 //printf("m_text=%s,m_ref=%s,m_file=%s,type=%d\n",
747 // qPrint(m_text),qPrint(m_ref),qPrint(m_file),m_refType);
748 return;
749 }
750 else if (resolveLink(context,target,true,&compound,anchor,parser->context.prefix))
751 {
752 bool isFile = compound ?
753 (compound->definitionType()==Definition::TypeFile ||
755 FALSE;
756 m_text = linkToText(parser->context.lang,target,isFile);
758 if (compound && compound->isLinkable()) // ref to compound
759 {
760 if (anchor.isEmpty() && /* compound link */
761 compound->definitionType()==Definition::TypeGroup && /* is group */
762 !toGroupDef(compound)->groupTitle().isEmpty() /* with title */
763 )
764 {
765 m_text=(toGroupDef(compound))->groupTitle(); // use group's title as link
766 }
767 else if (compound->definitionType()==Definition::TypeMember &&
768 toMemberDef(compound)->isObjCMethod())
769 {
770 // Objective C Method
771 const MemberDef *member = toMemberDef(compound);
772 bool localLink = parser->context.memberDef ? member->getClassDef()==parser->context.memberDef->getClassDef() : FALSE;
773 m_text = member->objCMethodName(localLink,parser->context.inSeeBlock);
774 }
775 else if (Config_getBool(HIDE_SCOPE_NAMES))
776 {
778 }
779
780 m_file = compound->getOutputFileBase();
781 m_ref = compound->getReference();
782 //printf("isFile=%d compound=%s (%d)\n",isFile,qPrint(compound->name()),
783 // compound->definitionType());
784 return;
785 }
786 else if (compound && compound->definitionType()==Definition::TypeFile &&
787 toFileDef(compound)->generateSourceFile()
788 ) // undocumented file that has source code we can link to
789 {
790 m_file = compound->getSourceFileBase();
791 m_ref = compound->getReference();
792 return;
793 }
794 }
795 m_text = target;
796 warn_doc_error(parser->context.fileName,parser->tokenizer.getLineNr(),"unable to resolve reference to '%s' for \\ref command",
797 qPrint(target));
798}
virtual bool isLinkable() const =0
virtual DefType definitionType() const =0
virtual QCString getReference() const =0
virtual QCString getSourceFileBase() const =0
virtual QCString getOutputFileBase() const =0
DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:140
DocParser * parser()
Definition docnode.h:97
DocNodeVariant * parent()
Definition docnode.h:89
@ Unknown
Definition docnode.h:109
@ Table
Definition docnode.h:109
@ Section
Definition docnode.h:109
@ Anchor
Definition docnode.h:109
QCString anchor() const
Definition docnode.h:779
QCString m_file
Definition docnode.h:792
SectionType m_sectionType
Definition docnode.h:790
QCString m_text
Definition docnode.h:796
QCString m_ref
Definition docnode.h:794
QCString m_relPath
Definition docnode.h:793
RefType m_refType
Definition docnode.h:789
QCString m_anchor
Definition docnode.h:795
bool m_isSubPage
Definition docnode.h:791
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:100
const T * find(const std::string &key) const
Find an object given the key.
Definition linkedmap.h:47
virtual const ClassDef * getClassDef() const =0
virtual QCString objCMethodName(bool localLink, bool showStatic) const =0
virtual bool hasParentPage() const =0
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
QCString label() const
Definition section.h:68
QCString ref() const
Definition section.h:71
QCString fileName() const
Definition section.h:73
QCString title() const
Definition section.h:69
SectionType type() const
Definition section.h:70
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:175
static constexpr int Anchor
Definition section.h:40
static constexpr int Table
Definition section.h:41
constexpr int level() const
Definition section.h:45
static constexpr int Page
Definition section.h:31
#define Config_getBool(name)
Definition config.h:33
static QCString stripKnownExtensions(const QCString &text)
Definition docnode.cpp:103
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:1894
GroupDef * toGroupDef(Definition *d)
QCString markdownFileNameToId(const QCString &fileName)
processes string s and converts markdown into doxygen/html commands.
MemberDef * toMemberDef(Definition *d)
#define warn_doc_error(file, line, fmt,...)
Definition message.h:74
const char * qPrint(const char *s)
Definition qcstring.h:672
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
#define ASSERT(x)
Definition qcstring.h:39
@ Markdown
Definition types.h:57
QCString linkToText(SrcLangExt lang, const QCString &link, bool isFileName)
Definition util.cpp:3100
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5549
bool resolveLink(const QCString &scName, const QCString &lr, bool, const Definition **resContext, QCString &resAnchor, const QCString &prefix)
Definition util.cpp:3126
QCString stripScope(const QCString &name)
Definition util.cpp:4133

References DocNode::Anchor, SectionType::Anchor, anchor(), ASSERT, Config_getBool, Definition::definitionType(), DocCompoundNode::DocCompoundNode(), FALSE, SectionInfo::fileName(), LinkedMap< T, Hash, KeyEqual, Map >::find(), MemberDef::getClassDef(), getLanguageFromFileName(), Definition::getOutputFileBase(), Definition::getReference(), Definition::getSourceFileBase(), PageDef::hasParentPage(), SectionManager::instance(), QCString::isEmpty(), Definition::isLinkable(), SectionInfo::label(), SectionType::level(), linkToText(), m_anchor, m_file, m_isSubPage, m_ref, m_refType, m_relPath, m_sectionType, m_text, Markdown, markdownFileNameToId(), MemberDef::objCMethodName(), SectionType::Page, Doxygen::pageLinkedMap, DocNode::parent(), DocNode::parser(), qPrint(), SectionInfo::ref(), resolveLink(), DocNode::Section, stripKnownExtensions(), stripScope(), DocNode::Table, SectionType::Table, SectionInfo::title(), toFileDef(), toGroupDef(), toMemberDef(), TRUE, SectionInfo::type(), Definition::TypeFile, Definition::TypeGroup, Definition::TypeMember, Definition::TypePage, DocNode::Unknown, and warn_doc_error.

Member Function Documentation

◆ anchor()

◆ file()

◆ hasLinkText()

bool DocRef::hasLinkText ( ) const
inline

◆ isSubPage()

bool DocRef::isSubPage ( ) const
inline

◆ parse()

void DocRef::parse ( )

Definition at line 841 of file docnode.cpp.

842{
843 AUTO_TRACE();
844 auto ns = AutoNodeStack(parser(),thisVariant());
845
846 Token tok = parser()->tokenizer.lex();
847 while (!tok.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
848 {
849 if (!parser()->defaultHandleToken(thisVariant(),tok,children()))
850 {
851 switch (tok.value())
852 {
853 case TokenRetval::TK_HTMLTAG:
854 break;
855 default:
857 break;
858 }
859 }
860 tok=parser()->tokenizer.lex();
861 }
862
863 if (children().empty() && !m_text.isEmpty())
864 {
865 QCString text = m_text;
866 if (parser()->context.insideHtmlLink)
867 {
868 // we already in a link/title only output anchor
869 text = m_anchor;
870 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
871 "Potential recursion while resolving \\ref command!");
872 }
874 parser()->pushContext();
876 parser()->popContext();
880 }
881
883}
DocNodeVariant * thisVariant()
Definition docnode.h:92
DocTokenizer tokenizer
Token internalValidatingParseDoc(DocNodeVariant *parent, DocNodeList &children, const QCString &doc)
void handlePendingStyleCommands(DocNodeVariant *parent, DocNodeList &children)
void popContext()
Definition docparser.cpp:73
DocParserContext context
void pushContext()
Definition docparser.cpp:59
void errorHandleDefaultToken(DocNodeVariant *parent, Token tok, DocNodeList &children, const QCString &txt)
void setStatePara()
TokenRetval value() const
bool is_any_of(ARGS... args) const
#define AUTO_TRACE(...)
Definition docnode.cpp:46
static void flattenParagraphs(DocNodeVariant *root, DocNodeList &children)
Definition docnode.cpp:809

References AUTO_TRACE, DocCompoundNode::children(), DocParser::context, DocParser::errorHandleDefaultToken(), FALSE, flattenParagraphs(), DocParser::handlePendingStyleCommands(), DocParserContext::insideHtmlLink, DocParser::internalValidatingParseDoc(), Token::is_any_of(), DocTokenizer::lex(), m_anchor, m_text, DocNode::parser(), DocParser::popContext(), DocParser::pushContext(), DocTokenizer::setStatePara(), DocNode::thisVariant(), DocParser::tokenizer, TRUE, Token::value(), and warn_doc_error.

◆ ref()

◆ refToAnchor()

bool DocRef::refToAnchor ( ) const
inline

Definition at line 783 of file docnode.h.

783{ return m_refType==Anchor; }

References DocNode::Anchor, and m_refType.

Referenced by PrintDocVisitor::operator()().

◆ refToSection()

bool DocRef::refToSection ( ) const
inline

Definition at line 784 of file docnode.h.

784{ return m_refType==Section; }

References m_refType, and DocNode::Section.

Referenced by LatexDocVisitor::operator()(), and PrintDocVisitor::operator()().

◆ refToTable()

bool DocRef::refToTable ( ) const
inline

Definition at line 785 of file docnode.h.

785{ return m_refType==Table; }

References m_refType, and DocNode::Table.

Referenced by LatexDocVisitor::operator()(), and PrintDocVisitor::operator()().

◆ relPath()

QCString DocRef::relPath ( ) const
inline

Definition at line 777 of file docnode.h.

777{ return m_relPath; }

References m_relPath.

Referenced by HtmlDocVisitor::operator()().

◆ sectionType()

SectionType DocRef::sectionType ( ) const
inline

Definition at line 781 of file docnode.h.

781{ return m_sectionType; }

References m_sectionType.

Referenced by LatexDocVisitor::operator()().

◆ targetTitle()

Member Data Documentation

◆ m_anchor

QCString DocRef::m_anchor
private

Definition at line 795 of file docnode.h.

Referenced by anchor(), DocRef(), and parse().

◆ m_file

QCString DocRef::m_file
private

Definition at line 792 of file docnode.h.

Referenced by DocRef(), and file().

◆ m_isSubPage

bool DocRef::m_isSubPage = false
private

Definition at line 791 of file docnode.h.

Referenced by DocRef(), and isSubPage().

◆ m_ref

QCString DocRef::m_ref
private

Definition at line 794 of file docnode.h.

Referenced by DocRef(), and ref().

◆ m_refType

RefType DocRef::m_refType = Unknown
private

Definition at line 789 of file docnode.h.

Referenced by DocRef(), refToAnchor(), refToSection(), and refToTable().

◆ m_relPath

QCString DocRef::m_relPath
private

Definition at line 793 of file docnode.h.

Referenced by DocRef(), and relPath().

◆ m_sectionType

SectionType DocRef::m_sectionType = SectionType::Anchor
private

Definition at line 790 of file docnode.h.

Referenced by DocRef(), and sectionType().

◆ m_text

QCString DocRef::m_text
private

Definition at line 796 of file docnode.h.

Referenced by DocRef(), parse(), and targetTitle().


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