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 777 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 AUTO_TRACE("target='{}',context='{}'",target,context);
711 ASSERT(!target.isEmpty());
712 m_relPath = parser->context.relPath;
713 auto lang = parser->context.lang;
714 const SectionInfo *sec = SectionManager::instance().find(parser->context.prefix+target);
715 if (sec==nullptr && !parser->context.prefix.isEmpty())
716 {
717 sec = SectionManager::instance().find(target);
718 }
719
720 if (sec==nullptr && getLanguageFromFileName(target)==SrcLangExt::Markdown) // lookup as markdown file
721 {
723 }
724 if (sec) // ref to section or anchor
725 {
726 PageDef *pd = nullptr;
727 int secLevel = sec->type().level();
728 if (secLevel==SectionType::Page)
729 {
730 pd = Doxygen::pageLinkedMap->find(target);
731 }
732 m_text = sec->title();
733 if (m_text.isEmpty()) m_text = sec->label();
734
735 m_ref = sec->ref();
737 if (secLevel==SectionType::Anchor)
738 {
740 }
741 else if (secLevel==SectionType::Table)
742 {
744 }
745 else
746 {
748 }
749 m_isSubPage = pd && pd->hasParentPage();
750 if (secLevel!=SectionType::Page || m_isSubPage)
751 {
752 m_anchor = pd ? pd->getOutputFileBase() : sec->label();
753 }
754 m_sectionType = sec->type();
755 //printf("m_text=%s,m_ref=%s,m_file=%s,type=%d\n",
756 // qPrint(m_text),qPrint(m_ref),qPrint(m_file),m_refType);
757 AUTO_TRACE_EXIT("section");
758 return;
759 }
760 else if (resolveLink(context,target,true,&compound,anchor,lang,parser->context.prefix))
761 {
762 bool isFile = compound ?
763 (compound->definitionType()==Definition::TypeFile ||
765 FALSE;
766 m_text = linkToText(lang,target,isFile);
768 if (compound && compound->isLinkable()) // ref to compound
769 {
770 if (anchor.isEmpty() && /* compound link */
771 compound->definitionType()==Definition::TypeGroup && /* is group */
772 !toGroupDef(compound)->groupTitle().isEmpty() /* with title */
773 )
774 {
775 m_text=(toGroupDef(compound))->groupTitle(); // use group's title as link
776 }
777 else if (compound->definitionType()==Definition::TypeMember &&
778 toMemberDef(compound)->isObjCMethod())
779 {
780 // Objective C Method
781 const MemberDef *member = toMemberDef(compound);
782 bool localLink = parser->context.memberDef ? member->getClassDef()==parser->context.memberDef->getClassDef() : FALSE;
783 m_text = member->objCMethodName(localLink,parser->context.inSeeBlock);
784 }
785 else if (Config_getBool(HIDE_SCOPE_NAMES))
786 {
788 }
789
790 m_file = compound->getOutputFileBase();
791 m_ref = compound->getReference();
792 //printf("isFile=%d compound=%s (%d)\n",isFile,qPrint(compound->name()),
793 // compound->definitionType());
794 AUTO_TRACE_EXIT("compound");
795 return;
796 }
797 else if (compound && compound->definitionType()==Definition::TypeFile &&
798 toFileDef(compound)->generateSourceFile()
799 ) // undocumented file that has source code we can link to
800 {
801 m_file = compound->getSourceFileBase();
802 m_ref = compound->getReference();
803 AUTO_TRACE_EXIT("source");
804 return;
805 }
806 else
807 {
808 AUTO_TRACE_EXIT("compound '{}' not linkable",compound?compound->name():"none");
809 }
810 }
811 m_text = target;
812 warn_doc_error(parser->context.fileName,parser->tokenizer.getLineNr(),"unable to resolve reference to '{}' for \\ref command",
813 target);
814}
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
virtual const QCString & name() const =0
DocCompoundNode(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:141
DocParser * parser()
Definition docnode.h:98
DocNodeVariant * parent()
Definition docnode.h:90
@ Unknown
Definition docnode.h:110
@ Table
Definition docnode.h:110
@ Section
Definition docnode.h:110
@ Anchor
Definition docnode.h:110
QCString anchor() const
Definition docnode.h:785
QCString m_file
Definition docnode.h:798
SectionType m_sectionType
Definition docnode.h:796
QCString m_text
Definition docnode.h:802
QCString m_ref
Definition docnode.h:800
QCString m_relPath
Definition docnode.h:799
RefType m_refType
Definition docnode.h:795
QCString m_anchor
Definition docnode.h:801
bool m_isSubPage
Definition docnode.h:797
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:100
const T * find(const std::string &key) const
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:178
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
#define AUTO_TRACE(...)
Definition docnode.cpp:46
static QCString stripKnownExtensions(const QCString &text)
Definition docnode.cpp:103
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:48
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:1932
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:112
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
#define ASSERT(x)
Definition qcstring.h:39
QCString linkToText(SrcLangExt lang, const QCString &link, bool isFileName)
Definition util.cpp:3220
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5718
QCString stripScope(const QCString &name)
Definition util.cpp:4292
bool resolveLink(const QCString &scName, const QCString &lr, bool, const Definition **resContext, QCString &resAnchor, SrcLangExt lang, const QCString &prefix)
Definition util.cpp:3246

References DocNode::Anchor, SectionType::Anchor, anchor(), ASSERT, AUTO_TRACE, AUTO_TRACE_EXIT, 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, markdownFileNameToId(), Definition::name(), MemberDef::objCMethodName(), SectionType::Page, Doxygen::pageLinkedMap, DocNode::parent(), DocNode::parser(), 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 857 of file docnode.cpp.

858{
859 AUTO_TRACE();
860 auto ns = AutoNodeStack(parser(),thisVariant());
861
862 Token tok = parser()->tokenizer.lex();
863 while (!tok.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
864 {
865 if (!parser()->defaultHandleToken(thisVariant(),tok,children()))
866 {
867 switch (tok.value())
868 {
869 case TokenRetval::TK_HTMLTAG:
870 break;
871 default:
873 break;
874 }
875 }
876 tok=parser()->tokenizer.lex();
877 }
878
879 if (children().empty() && !m_text.isEmpty())
880 {
881 QCString text = m_text;
882 if (parser()->context.insideHtmlLink)
883 {
884 // we already in a link/title only output anchor
885 text = m_anchor;
886 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
887 "Potential recursion while resolving \\ref command!");
888 }
890 parser()->pushContext();
892 parser()->popContext();
896 }
897
899}
DocNodeVariant * thisVariant()
Definition docnode.h:93
DocTokenizer tokenizer
Token internalValidatingParseDoc(DocNodeVariant *parent, DocNodeList &children, const QCString &doc)
void handlePendingStyleCommands(DocNodeVariant *parent, DocNodeList &children)
void popContext()
Definition docparser.cpp:74
DocParserContext context
void pushContext()
Definition docparser.cpp:60
void errorHandleDefaultToken(DocNodeVariant *parent, Token tok, DocNodeList &children, const QCString &txt)
void setStatePara()
TokenRetval value() const
bool is_any_of(ARGS... args) const
static void flattenParagraphs(DocNodeVariant *root, DocNodeList &children)
Definition docnode.cpp:825

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

789{ return m_refType==Anchor; }

References DocNode::Anchor, and m_refType.

Referenced by PrintDocVisitor::operator()().

◆ refToSection()

bool DocRef::refToSection ( ) const
inline

Definition at line 790 of file docnode.h.

790{ 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 791 of file docnode.h.

791{ 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 783 of file docnode.h.

783{ return m_relPath; }

References m_relPath.

Referenced by HtmlDocVisitor::operator()().

◆ sectionType()

SectionType DocRef::sectionType ( ) const
inline

Definition at line 787 of file docnode.h.

787{ return m_sectionType; }

References m_sectionType.

Referenced by LatexDocVisitor::operator()().

◆ targetTitle()

Member Data Documentation

◆ m_anchor

QCString DocRef::m_anchor
private

Definition at line 801 of file docnode.h.

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

◆ m_file

QCString DocRef::m_file
private

Definition at line 798 of file docnode.h.

Referenced by DocRef(), and file().

◆ m_isSubPage

bool DocRef::m_isSubPage = false
private

Definition at line 797 of file docnode.h.

Referenced by DocRef(), and isSubPage().

◆ m_ref

QCString DocRef::m_ref
private

Definition at line 800 of file docnode.h.

Referenced by DocRef(), and ref().

◆ m_refType

RefType DocRef::m_refType = Unknown
private

Definition at line 795 of file docnode.h.

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

◆ m_relPath

QCString DocRef::m_relPath
private

Definition at line 799 of file docnode.h.

Referenced by DocRef(), and relPath().

◆ m_sectionType

SectionType DocRef::m_sectionType = SectionType::Anchor
private

Definition at line 796 of file docnode.h.

Referenced by DocRef(), and sectionType().

◆ m_text

QCString DocRef::m_text
private

Definition at line 802 of file docnode.h.

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


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