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 (char cmdChar, const QCString &cmdName)
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 ,
  Requirement
}
Protected Member Functions inherited from DocNode
void setInsidePreformatted (bool p)

Detailed Description

Node representing a reference to some item.

Definition at line 786 of file docnode.h.

Constructor & Destructor Documentation

◆ DocRef()

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

Definition at line 710 of file docnode.cpp.

710 :
712{
713 const Definition *compound = nullptr;
714 QCString anchor;
715 AUTO_TRACE("target='{}',context='{}'",target,context);
716 ASSERT(!target.isEmpty());
717 m_relPath = parser->context.relPath;
718 auto lang = parser->context.lang;
719 const SectionInfo *sec = SectionManager::instance().find(parser->context.prefix+target);
720 if (sec==nullptr && !parser->context.prefix.isEmpty())
721 {
722 sec = SectionManager::instance().find(target);
723 }
724
725 if (sec==nullptr && getLanguageFromFileName(target)==SrcLangExt::Markdown) // lookup as markdown file
726 {
728 }
729 if (sec) // ref to section or anchor
730 {
731 PageDef *pd = nullptr;
732 int secLevel = sec->type().level();
733 if (secLevel==SectionType::Page)
734 {
735 pd = Doxygen::pageLinkedMap->find(target);
736 }
737 m_text = sec->title();
738 if (m_text.isEmpty()) m_text = sec->label();
739
740 m_ref = sec->ref();
742 if (secLevel==SectionType::Anchor)
743 {
745 }
746 else if (secLevel==SectionType::Table)
747 {
749 }
750 else if (secLevel==SectionType::Requirement)
751 {
753 if (!Config_getBool(GENERATE_REQUIREMENTS))
754 {
755 m_file.clear(); // prevent link when there is no requirements page
756 }
757 }
758 else
759 {
761 }
762 m_isSubPage = pd && pd->hasParentPage();
763 if (secLevel!=SectionType::Page || m_isSubPage)
764 {
765 m_anchor = pd ? pd->getOutputFileBase() : sec->label();
766 }
767 m_sectionType = sec->type();
768 //printf("m_text=%s,m_ref=%s,m_file=%s,type=%d\n",
769 // qPrint(m_text),qPrint(m_ref),qPrint(m_file),m_refType);
770 AUTO_TRACE_EXIT("section");
771 return;
772 }
773 else if (Config_getBool(IMPLICIT_DIR_DOCS) && target.lower().endsWith("/readme.md"))
774 {
775 QCString dirTarget = target.left(target.length() - 9); // strip readme.md part
776 const auto &dd = Doxygen::dirLinkedMap->find(dirTarget);
777 if (dd)
778 {
779 m_text = target;
780 m_file = dd->getOutputFileBase();
781 AUTO_TRACE_EXIT("directory");
782 return;
783 }
784 }
785 else if (resolveLink(context,target,true,&compound,anchor,lang,parser->context.prefix))
786 {
787 bool isFile = compound ?
788 (compound->definitionType()==Definition::TypeFile ||
790 FALSE;
791 if (compound && lang==SrcLangExt::Markdown) lang = compound->getLanguage();
792 m_text = linkToText(lang,target,isFile);
794 if (compound && compound->isLinkable()) // ref to compound
795 {
796 if (anchor.isEmpty() && /* compound link */
797 compound->definitionType()==Definition::TypeGroup && /* is group */
798 !toGroupDef(compound)->groupTitle().isEmpty() /* with title */
799 )
800 {
801 m_text=(toGroupDef(compound))->groupTitle(); // use group's title as link
802 }
803 else if (compound->definitionType()==Definition::TypeMember &&
804 toMemberDef(compound)->isObjCMethod())
805 {
806 // Objective C Method
807 const MemberDef *member = toMemberDef(compound);
808 bool localLink = parser->context.memberDef ? member->getClassDef()==parser->context.memberDef->getClassDef() : FALSE;
809 m_text = member->objCMethodName(localLink,parser->context.inSeeBlock);
810 }
811 else if (Config_getBool(HIDE_SCOPE_NAMES))
812 {
813 int funcPos = m_text.find('(');
814 if (funcPos!=-1) // see issue #11834
815 {
816 m_text=stripScope(m_text.left(funcPos))+m_text.mid(funcPos);
817 }
818 else
819 {
821 }
822 }
823
824 m_file = compound->getOutputFileBase();
825 m_ref = compound->getReference();
826 //printf("isFile=%d compound=%s (%d)\n",isFile,qPrint(compound->name()),
827 // compound->definitionType());
828 AUTO_TRACE_EXIT("compound");
829 return;
830 }
831 else if (compound && compound->definitionType()==Definition::TypeFile &&
832 toFileDef(compound)->generateSourceFile()
833 ) // undocumented file that has source code we can link to
834 {
835 m_file = compound->getSourceFileBase();
836 m_ref = compound->getReference();
837 AUTO_TRACE_EXIT("source");
838 return;
839 }
840 else
841 {
842 AUTO_TRACE_EXIT("compound '{}' not linkable",compound?compound->name():"none");
843 }
844 }
845 m_text = target;
846 warn_doc_error(parser->context.fileName,parser->tokenizer.getLineNr(),"unable to resolve reference to '{}' for \\ref command",
847 target);
848}
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
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
@ Requirement
Definition docnode.h:110
@ Section
Definition docnode.h:110
@ Anchor
Definition docnode.h:110
QCString anchor() const
Definition docnode.h:794
QCString m_file
Definition docnode.h:807
SectionType m_sectionType
Definition docnode.h:805
QCString m_text
Definition docnode.h:811
QCString m_ref
Definition docnode.h:809
QCString m_relPath
Definition docnode.h:808
RefType m_refType
Definition docnode.h:804
QCString m_anchor
Definition docnode.h:810
bool m_isSubPage
Definition docnode.h:806
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:99
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:127
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
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
QCString lower() const
Definition qcstring.h:249
bool endsWith(const char *s) const
Definition qcstring.h:524
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString left(size_t len) const
Definition qcstring.h:229
QCString label() const
Definition section.h:69
QCString ref() const
Definition section.h:72
QCString fileName() const
Definition section.h:74
QCString title() const
Definition section.h:70
SectionType type() const
Definition section.h:71
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:179
static constexpr int Anchor
Definition section.h:40
static constexpr int Table
Definition section.h:41
constexpr int level() const
Definition section.h:46
static constexpr int Requirement
Definition section.h:42
static constexpr int Page
Definition section.h:31
#define Config_getBool(name)
Definition config.h:33
#define AUTO_TRACE(...)
Definition docnode.cpp:48
static QCString stripKnownExtensions(const QCString &text)
Definition docnode.cpp:106
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:50
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:1966
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:2698
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5214
QCString stripScope(const QCString &name)
Definition util.cpp:3783
bool resolveLink(const QCString &scName, const QCString &lr, bool, const Definition **resContext, QCString &resAnchor, SrcLangExt lang, const QCString &prefix)
Definition util.cpp:2724

References DocNode::Anchor, SectionType::Anchor, anchor(), ASSERT, AUTO_TRACE, AUTO_TRACE_EXIT, Config_getBool, Definition::definitionType(), Doxygen::dirLinkedMap, DocCompoundNode::DocCompoundNode(), QCString::endsWith(), FALSE, SectionInfo::fileName(), LinkedMap< T, Hash, KeyEqual, Map >::find(), MemberDef::getClassDef(), Definition::getLanguage(), getLanguageFromFileName(), Definition::getOutputFileBase(), Definition::getReference(), Definition::getSourceFileBase(), PageDef::hasParentPage(), SectionManager::instance(), QCString::isEmpty(), Definition::isLinkable(), SectionInfo::label(), QCString::left(), QCString::length(), SectionType::level(), linkToText(), QCString::lower(), 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(), DocNode::Requirement, SectionType::Requirement, 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 ( char cmdChar,
const QCString & cmdName )

Definition at line 891 of file docnode.cpp.

892{
893 AUTO_TRACE();
894 auto ns = AutoNodeStack(parser(),thisVariant());
895 char cmdCharStr[2] = { cmdChar, 0 };
896
897 Token tok = parser()->tokenizer.lex();
898 while (!tok.is_any_of(TokenRetval::TK_NONE, TokenRetval::TK_EOF))
899 {
900 if (!parser()->defaultHandleToken(thisVariant(),tok,children()))
901 {
902 switch (tok.value())
903 {
904 case TokenRetval::TK_HTMLTAG:
905 break;
906 default:
907 parser()->errorHandleDefaultToken(thisVariant(),tok,children(),cmdCharStr+cmdName);
908 break;
909 }
910 }
911 tok=parser()->tokenizer.lex();
912 }
913
914 if (children().empty() && !m_text.isEmpty())
915 {
916 QCString text = m_text;
917 if (parser()->context.insideHtmlLink)
918 {
919 // we already in a link/title only output anchor
920 text = m_anchor;
921 warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),
922 "Potential recursion while resolving {:c}{} command!",cmdChar,cmdName);
923 }
925 parser()->pushContext();
927 parser()->popContext();
931 }
932
934}
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:75
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:859

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

798{ return m_refType==Anchor; }

References DocNode::Anchor, and m_refType.

Referenced by PrintDocVisitor::operator()().

◆ refToSection()

bool DocRef::refToSection ( ) const
inline

Definition at line 799 of file docnode.h.

799{ 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 800 of file docnode.h.

800{ 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 792 of file docnode.h.

792{ return m_relPath; }

References m_relPath.

Referenced by HtmlDocVisitor::operator()().

◆ sectionType()

SectionType DocRef::sectionType ( ) const
inline

Definition at line 796 of file docnode.h.

796{ return m_sectionType; }

References m_sectionType.

Referenced by LatexDocVisitor::operator()().

◆ targetTitle()

Member Data Documentation

◆ m_anchor

QCString DocRef::m_anchor
private

Definition at line 810 of file docnode.h.

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

◆ m_file

QCString DocRef::m_file
private

Definition at line 807 of file docnode.h.

Referenced by DocRef(), and file().

◆ m_isSubPage

bool DocRef::m_isSubPage = false
private

Definition at line 806 of file docnode.h.

Referenced by DocRef(), and isSubPage().

◆ m_ref

QCString DocRef::m_ref
private

Definition at line 809 of file docnode.h.

Referenced by DocRef(), and ref().

◆ m_refType

RefType DocRef::m_refType = Unknown
private

Definition at line 804 of file docnode.h.

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

◆ m_relPath

QCString DocRef::m_relPath
private

Definition at line 808 of file docnode.h.

Referenced by DocRef(), and relPath().

◆ m_sectionType

SectionType DocRef::m_sectionType = SectionType::Anchor
private

Definition at line 805 of file docnode.h.

Referenced by DocRef(), and sectionType().

◆ m_text

QCString DocRef::m_text
private

Definition at line 811 of file docnode.h.

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


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