Doxygen
Loading...
Searching...
No Matches
docparser.cpp File Reference
#include <stdio.h>
#include <stdlib.h>
#include <cassert>
#include <ctype.h>
#include "classlist.h"
#include "cmdmapper.h"
#include "config.h"
#include "debug.h"
#include "dir.h"
#include "docparser.h"
#include "docparser_p.h"
#include "doxygen.h"
#include "filedef.h"
#include "fileinfo.h"
#include "groupdef.h"
#include "namespacedef.h"
#include "message.h"
#include "pagedef.h"
#include "portable.h"
#include "printdocvisitor.h"
#include "util.h"
#include "indexlist.h"
#include "trace.h"
#include "stringutil.h"
Include dependency graph for docparser.cpp:

Go to the source code of this file.

Macros

#define AUTO_TRACE(...)
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
#define CHECK_FOR_COMMAND(str, action)

Functions

IDocParserPtr createDocParser ()
 factory function to create a parser
static QCString extractCopyDocId (const char *data, size_t &j, size_t len)
static size_t isCopyBriefOrDetailsCmd (const char *data, size_t i, size_t len, bool &brief)
static size_t isVerbatimSection (const char *data, size_t i, size_t len, QCString &endMarker)
static size_t skipToEndMarker (const char *data, size_t i, size_t len, const QCString &endMarker)
IDocNodeASTPtr validatingParseDoc (IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport, bool autolinkSupport)
IDocNodeASTPtr validatingParseTitle (IDocParser &parserIntf, const QCString &fileName, int lineNr, const QCString &input)
IDocNodeASTPtr validatingParseText (IDocParser &parserIntf, const QCString &input)
IDocNodeASTPtr createRef (IDocParser &parserIntf, const QCString &target, const QCString &context, const QCString &srcFile, int srcLine)
void docFindSections (const QCString &input, const Definition *d, const QCString &fileName)

Macro Definition Documentation

◆ AUTO_TRACE

#define AUTO_TRACE ( ...)
Value:
(void)0

Definition at line 47 of file docparser.cpp.

◆ AUTO_TRACE_ADD

#define AUTO_TRACE_ADD ( ...)
Value:
(void)0

Definition at line 48 of file docparser.cpp.

◆ AUTO_TRACE_EXIT

#define AUTO_TRACE_EXIT ( ...)
Value:
(void)0

Definition at line 49 of file docparser.cpp.

◆ CHECK_FOR_COMMAND

#define CHECK_FOR_COMMAND ( str,
action )
Value:
do if ((i+sizeof(str)<len) && literal_at(data+i+1,str)) \
{ j=i+sizeof(str); action; } while(0)
bool literal_at(const char *data, const char(&str)[N])
returns TRUE iff data points to a substring that matches string literal str
Definition stringutil.h:98

Definition at line 1751 of file docparser.cpp.

1751#define CHECK_FOR_COMMAND(str,action) \
1752 do if ((i+sizeof(str)<len) && literal_at(data+i+1,str)) \
1753 { j=i+sizeof(str); action; } while(0)

Referenced by isCopyBriefOrDetailsCmd(), and isVerbatimSection().

Function Documentation

◆ createDocParser()

◆ createRef()

IDocNodeASTPtr createRef ( IDocParser & parserIntf,
const QCString & target,
const QCString & context,
const QCString & srcFile,
int srcLine )

Definition at line 2163 of file docparser.cpp.

2164{
2165 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2166 assert(parser!=nullptr);
2167 if (parser==nullptr) return nullptr;
2168 if (!srcFile.isEmpty())
2169 {
2170 parser->context.fileName = srcFile;
2171 parser->tokenizer.setLineNr(srcLine);
2172 }
2173 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2174}
DocTokenizer tokenizer
DocParserContext context
Node representing a reference to some item.
Definition docnode.h:778
void setLineNr(int lineno)
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
QCString fileName
Definition docparser_p.h:70

References DocParser::context, DocParserContext::fileName, QCString::isEmpty(), DocTokenizer::setLineNr(), and DocParser::tokenizer.

Referenced by convertMapFile(), replaceRef(), and LayoutNavEntry::url().

◆ docFindSections()

void docFindSections ( const QCString & input,
const Definition * d,
const QCString & fileName )

◆ extractCopyDocId()

QCString extractCopyDocId ( const char * data,
size_t & j,
size_t len )
static

Definition at line 1678 of file docparser.cpp.

1679{
1680 size_t s=j;
1681 int round=0;
1682 bool insideDQuote=FALSE;
1683 bool insideSQuote=FALSE;
1684 bool found=FALSE;
1685 while (j<len && !found)
1686 {
1687 if (!insideSQuote && !insideDQuote)
1688 {
1689 switch (data[j])
1690 {
1691 case '(': round++; break;
1692 case ')': round--; break;
1693 case '"': insideDQuote=TRUE; break;
1694 case '\'': insideSQuote=TRUE; break;
1695 case '\\': // fall through, begin of command
1696 case '@': // fall through, begin of command
1697 case '\t': // fall through
1698 case '\n':
1699 found=(round==0);
1700 break;
1701 case ' ': // allow spaces in cast operator (see issue #11169)
1702 found=(round==0) && (j<8 || !literal_at(data+j-8,"operator"));
1703 break;
1704 }
1705 }
1706 else if (insideSQuote) // look for single quote end
1707 {
1708 if (data[j]=='\'' && (j==0 || data[j]!='\\'))
1709 {
1710 insideSQuote=FALSE;
1711 }
1712 }
1713 else if (insideDQuote) // look for double quote end
1714 {
1715 if (data[j]=='"' && (j==0 || data[j]!='\\'))
1716 {
1717 insideDQuote=FALSE;
1718 }
1719 }
1720 if (!found) j++;
1721 }
1722
1723 // include const and volatile
1724 if (literal_at(data+j," const"))
1725 {
1726 j+=6;
1727 }
1728 else if (literal_at(data+j," volatile"))
1729 {
1730 j+=9;
1731 }
1732
1733 // allow '&' or '&&' or ' &' or ' &&' at the end
1734 size_t k=j;
1735 while (k<len && data[k]==' ') k++;
1736 if (k<len-1 && data[k]=='&' && data[k+1]=='&') j=k+2;
1737 else if (k<len && data[k]=='&' ) j=k+1;
1738
1739 // do not include punctuation added by Definition::_setBriefDescription()
1740 size_t e=j;
1741 if (j>0 && data[j-1]=='.') { e--; }
1742 QCString id(data+s,e-s);
1743 //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]);
1744 return id;
1745}
This is an alternative implementation of QCString.
Definition qcstring.h:101
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34

References FALSE, literal_at(), and TRUE.

Referenced by DocParser::processCopyDoc().

◆ isCopyBriefOrDetailsCmd()

size_t isCopyBriefOrDetailsCmd ( const char * data,
size_t i,
size_t len,
bool & brief )
static

Definition at line 1755 of file docparser.cpp.

1756{
1757 size_t j=0;
1758 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
1759 {
1760 CHECK_FOR_COMMAND("copybrief",brief=TRUE); // @copybrief or \copybrief
1761 CHECK_FOR_COMMAND("copydetails",brief=FALSE); // @copydetails or \copydetails
1762 }
1763 return j;
1764}
#define CHECK_FOR_COMMAND(str, action)

References CHECK_FOR_COMMAND, FALSE, and TRUE.

Referenced by DocParser::processCopyDoc().

◆ isVerbatimSection()

size_t isVerbatimSection ( const char * data,
size_t i,
size_t len,
QCString & endMarker )
static

Definition at line 1766 of file docparser.cpp.

1767{
1768 size_t j=0;
1769 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
1770 {
1771 CHECK_FOR_COMMAND("dot",endMarker="enddot");
1772 CHECK_FOR_COMMAND("icode",endMarker="endicode");
1773 CHECK_FOR_COMMAND("code",endMarker="endcode");
1774 CHECK_FOR_COMMAND("msc",endMarker="endmsc");
1775 CHECK_FOR_COMMAND("iverbatim",endMarker="endiverbatim");
1776 CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
1777 CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
1778 CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
1779 CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
1780 CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
1781 CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
1782 CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
1783 CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
1784 CHECK_FOR_COMMAND("startuml",endMarker="enduml");
1785 }
1786 //printf("isVerbatimSection(%s)=%d)\n",qPrint(QCString(&data[i]).left(10)),j);
1787 return j;
1788}

References CHECK_FOR_COMMAND.

Referenced by DocParser::processCopyDoc().

◆ skipToEndMarker()

size_t skipToEndMarker ( const char * data,
size_t i,
size_t len,
const QCString & endMarker )
static

Definition at line 1790 of file docparser.cpp.

1791{
1792 while (i<len)
1793 {
1794 if ((data[i]=='@' || data[i]=='\\') && // start of command character
1795 (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
1796 {
1797 if (i+endMarker.length()+1<=len && qstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
1798 {
1799 return i+endMarker.length()+1;
1800 }
1801 }
1802 i++;
1803 }
1804 // oops no endmarker found...
1805 return i<len ? i+1 : len;
1806}
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:159
int qstrncmp(const char *str1, const char *str2, size_t len)
Definition qcstring.h:75

References QCString::data(), QCString::length(), and qstrncmp().

Referenced by DocParser::processCopyDoc().

◆ validatingParseDoc()

IDocNodeASTPtr validatingParseDoc ( IDocParser & parserIntf,
const QCString & fileName,
int startLine,
const Definition * ctx,
const MemberDef * md,
const QCString & input,
bool indexWords,
bool isExample,
const QCString & exampleName,
bool singleLine,
bool linkFromIndex,
bool markdownSupport = Config_getBool(MARKDOWN_SUPPORT),
bool autolinkSupport = Config_getBool(AUTOLINK_SUPPORT) )

Main entry point for the comment block parser.

Parameters
parserIntfThe parser object created via createDocParser()
fileNameFile in which the documentation block is found (or the name of the example file in case isExample is TRUE).
startLineLine at which the documentation block is found.
ctxClass or namespace to which this block belongs.
mdMember definition to which the documentation belongs. Can be 0.
inputString representation of the documentation block.
indexWordsIndicates whether or not words should be put in the search index.
isExampleTRUE if the documentation belongs to an example.
exampleNameBase name of the example file (0 if isExample is FALSE).
singleLineOutput should be presented on a single line, so without starting a new paragraph at the end.
linkFromIndexTRUE if the documentation is generated from an index page. In this case context is not used to determine the relative path when making a link.
markdownSupportTRUE if the input needs to take markdown markup into account.
autolinkSupportTRUE if the input need to perform auto linking of words
Returns
An object representing the abstract syntax tree. Ownership of the pointer is handed over to the caller.

Definition at line 1922 of file docparser.cpp.

1930{
1931 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
1932 assert(parser!=nullptr);
1933 if (parser==nullptr) return nullptr;
1934 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
1935 // md?qPrint(md->name()):"<none>",
1936 // qPrint(input));
1937 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
1938 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
1939
1940 // set initial token
1941 parser->context.token = parser->tokenizer.resetToken();
1942
1943 if (ctx && ctx!=Doxygen::globalScope &&
1946 )
1947 )
1948 {
1950 }
1951 else if (ctx && ctx->definitionType()==Definition::TypePage)
1952 {
1953 const Definition *scope = (toPageDef(ctx))->getPageScope();
1954 if (scope && scope!=Doxygen::globalScope)
1955 {
1956 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
1957 }
1958 }
1959 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
1960 {
1961 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
1962 if (scope && scope!=Doxygen::globalScope)
1963 {
1964 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
1965 }
1966 }
1967 else
1968 {
1969 parser->context.context = "";
1970 }
1971 parser->context.scope = ctx;
1972 parser->context.lang = getLanguageFromFileName(fileName);
1973
1974 if (indexWords && Doxygen::searchIndex.enabled())
1975 {
1976 if (md)
1977 {
1978 parser->context.searchUrl=md->getOutputFileBase();
1979 Doxygen::searchIndex.setCurrentDoc(md,md->anchor(),false);
1980 }
1981 else if (ctx)
1982 {
1983 parser->context.searchUrl=ctx->getOutputFileBase();
1984 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
1985 }
1986 }
1987 else
1988 {
1989 parser->context.searchUrl="";
1990 }
1991
1992 parser->context.fileName = fileName;
1993 parser->context.relPath = (!linkFromIndex && ctx) ?
1995 QCString("");
1996 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
1997 parser->context.memberDef = md;
1998 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
1999 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2000 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2001 parser->context.inSeeBlock = FALSE;
2002 parser->context.xmlComment = FALSE;
2003 parser->context.insideHtmlLink = FALSE;
2004 parser->context.includeFileText = "";
2005 parser->context.includeFileOffset = 0;
2006 parser->context.includeFileLength = 0;
2007 parser->context.isExample = isExample;
2008 parser->context.exampleName = exampleName;
2009 parser->context.hasParamCommand = FALSE;
2010 parser->context.hasReturnCommand = FALSE;
2011 parser->context.retvalsFound.clear();
2012 parser->context.paramsFound.clear();
2013 parser->context.markdownSupport = markdownSupport;
2014 parser->context.autolinkSupport = autolinkSupport;
2015
2016 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2017 parser->tokenizer.setLineNr(startLine);
2018 size_t ioLen = input.length();
2019 QCString inpStr = parser->processCopyDoc(input.data(),ioLen);
2020 if (inpStr.isEmpty() || inpStr.at(inpStr.length()-1)!='\n')
2021 {
2022 inpStr+='\n';
2023 }
2024 //printf("processCopyDoc(in='%s' out='%s')\n",input,qPrint(inpStr));
2025 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2027
2028 // build abstract syntax tree
2029 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,singleLine));
2030 std::get<DocRoot>(ast->root).parse();
2031
2033 {
2034 // pretty print the result
2035 std::visit(PrintDocVisitor{},ast->root);
2036 }
2037
2038 if (md && md->isFunction())
2039 {
2041 }
2043
2044 // reset token
2045 parser->tokenizer.resetToken();
2046
2047 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2048 // md?qPrint(md->name()):"<none>");
2049
2050 return ast;
2051}
@ PrintTree
Definition debug.h:34
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:132
The common base class of all entity definitions found in the sources.
Definition definition.h:76
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual QCString qualifiedName() const =0
virtual QCString getOutputFileBase() const =0
virtual const QCString & name() const =0
QCString processCopyDoc(const char *data, size_t &len)
void checkUnOrMultipleDocumentedParams()
Root node of documentation tree.
Definition docnode.h:1313
void init(const char *input, const QCString &fileName, bool markdownSupport, bool insideHtmlLink)
TokenInfo * resetToken()
static NamespaceDefMutable * globalScope
Definition doxygen.h:121
static SearchIndexIntf searchIndex
Definition doxygen.h:124
virtual bool isFunction() const =0
virtual void detectUndocumentedParams(bool hasParamCommand, bool hasReturnCommand) const =0
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:578
GroupDef * toGroupDef(Definition *d)
PageDef * toPageDef(Definition *d)
Definition pagedef.cpp:490
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:477
StringMultiSet retvalsFound
Definition docparser_p.h:75
DocStyleChangeStack styleStack
Definition docparser_p.h:67
size_t includeFileLength
Definition docparser_p.h:87
DocNodeStack nodeStack
Definition docparser_p.h:66
StringMultiSet paramsFound
Definition docparser_p.h:76
QCString exampleName
Definition docparser_p.h:79
const Definition * scope
Definition docparser_p.h:61
QCString includeFileText
Definition docparser_p.h:85
TokenInfo * token
Definition docparser_p.h:92
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:68
SrcLangExt lang
Definition docparser_p.h:82
QCString searchUrl
Definition docparser_p.h:80
size_t includeFileOffset
Definition docparser_p.h:86
const MemberDef * memberDef
Definition docparser_p.h:77
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5718
QCString relativePathToRoot(const QCString &name)
Definition util.cpp:4092
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:6410

References Definition::anchor(), QCString::at(), DocParserContext::autolinkSupport, DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, QCString::data(), Definition::definitionType(), MemberDef::detectUndocumentedParams(), DocParserContext::exampleName, FALSE, DocParserContext::fileName, Definition::getLanguage(), getLanguageFromFileName(), getLanguageSpecificSeparator(), Definition::getOutputFileBase(), Doxygen::globalScope, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocTokenizer::init(), DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, QCString::isEmpty(), DocParserContext::isExample, Debug::isFlagSet(), MemberDef::isFunction(), DocParserContext::lang, QCString::length(), DocParserContext::markdownSupport, DocParserContext::memberDef, Definition::name(), DocParserContext::nodeStack, DocParserContext::paramsFound, Debug::PrintTree, DocParser::processCopyDoc(), Definition::qualifiedName(), relativePathToRoot(), DocParserContext::relPath, DocTokenizer::resetToken(), DocParserContext::retvalsFound, DocParserContext::scope, Doxygen::searchIndex, DocParserContext::searchUrl, DocTokenizer::setLineNr(), DocParserContext::styleStack, substitute(), toGroupDef(), DocParserContext::token, DocParser::tokenizer, toPageDef(), Definition::TypeClass, Definition::TypeGroup, Definition::TypeNamespace, Definition::TypePage, and DocParserContext::xmlComment.

Referenced by addPerlModDocBlock(), generateBriefDoc(), OutputList::generateDoc(), generateHtmlOutput(), getSQLDocBlock(), parseCommentAsText(), ConceptDefImpl::writeBriefDescription(), DirDefImpl::writeBriefDescription(), FileDefImpl::writeBriefDescription(), GroupDefImpl::writeBriefDescription(), ModuleDefImpl::writeBriefDescription(), NamespaceDefImpl::writeBriefDescription(), MemberDefImpl::writeDeclaration(), ClassDefImpl::writeDeclarationLink(), ConceptDefImpl::writeDeclarationLink(), ModuleDefImpl::writeDeclarationLink(), MemberList::writePlainDeclarations(), and writeXMLDocBlock().

◆ validatingParseText()

IDocNodeASTPtr validatingParseText ( IDocParser & parser,
const QCString & input )

Main entry point for parsing simple text fragments. These fragments are limited to words, whitespace and symbols.

Definition at line 2105 of file docparser.cpp.

2106{
2107 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2108 assert(parser!=nullptr);
2109 if (parser==nullptr) return nullptr;
2110
2111 // set initial token
2112 parser->context.token = parser->tokenizer.resetToken();
2113
2114 //printf("------------ input ---------\n%s\n"
2115 // "------------ end input -----\n",input);
2116 //parser->context.token = new TokenInfo;
2117 parser->context.context = "";
2118 parser->context.fileName = "<parseText>";
2119 parser->context.relPath = "";
2120 parser->context.memberDef = nullptr;
2121 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2122 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2123 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2124 parser->context.inSeeBlock = FALSE;
2125 parser->context.xmlComment = FALSE;
2126 parser->context.insideHtmlLink = FALSE;
2127 parser->context.includeFileText = "";
2128 parser->context.includeFileOffset = 0;
2129 parser->context.includeFileLength = 0;
2130 parser->context.isExample = FALSE;
2131 parser->context.exampleName = "";
2132 parser->context.hasParamCommand = FALSE;
2133 parser->context.hasReturnCommand = FALSE;
2134 parser->context.retvalsFound.clear();
2135 parser->context.paramsFound.clear();
2136 parser->context.searchUrl="";
2137 parser->context.lang = SrcLangExt::Unknown;
2138 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2139 parser->context.autolinkSupport = FALSE;
2140
2141
2142 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2143
2144 if (!input.isEmpty())
2145 {
2146 parser->tokenizer.setLineNr(1);
2147 parser->tokenizer.init(input.data(),parser->context.fileName,
2149
2150 // build abstract syntax tree
2151 std::get<DocText>(ast->root).parse();
2152
2154 {
2155 // pretty print the result
2156 std::visit(PrintDocVisitor{},ast->root);
2157 }
2158 }
2159
2160 return ast;
2161}
Root node of a text fragment.
Definition docnode.h:1304
#define Config_getBool(name)
Definition config.h:33

References DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, QCString::data(), DocParserContext::exampleName, FALSE, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocTokenizer::init(), DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, QCString::isEmpty(), DocParserContext::isExample, Debug::isFlagSet(), DocParserContext::lang, DocParserContext::markdownSupport, DocParserContext::memberDef, DocParserContext::nodeStack, DocParserContext::paramsFound, Debug::PrintTree, DocParserContext::relPath, DocTokenizer::resetToken(), DocParserContext::retvalsFound, DocParserContext::searchUrl, DocTokenizer::setLineNr(), DocParserContext::styleStack, DocParserContext::token, DocParser::tokenizer, and DocParserContext::xmlComment.

Referenced by RTFGenerator::endIndexSection(), and OutputList::parseText().

◆ validatingParseTitle()

IDocNodeASTPtr validatingParseTitle ( IDocParser & parserIntf,
const QCString & fileName,
int lineNr,
const QCString & input )

Main entry point for parsing titles. These allow limited markup commands

Definition at line 2053 of file docparser.cpp.

2054{
2055 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2056 assert(parser!=nullptr);
2057 if (parser==nullptr) return nullptr;
2058
2059 // set initial token
2060 parser->context.token = parser->tokenizer.resetToken();
2061
2062 //printf("------------ input ---------\n%s\n"
2063 // "------------ end input -----\n",input);
2064 parser->context.context = "";
2065 parser->context.fileName = fileName;
2066 parser->context.relPath = "";
2067 parser->context.memberDef = nullptr;
2068 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2069 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2070 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2071 parser->context.inSeeBlock = FALSE;
2072 parser->context.xmlComment = FALSE;
2073 parser->context.insideHtmlLink = FALSE;
2074 parser->context.includeFileText = "";
2075 parser->context.includeFileOffset = 0;
2076 parser->context.includeFileLength = 0;
2077 parser->context.isExample = FALSE;
2078 parser->context.exampleName = "";
2079 parser->context.hasParamCommand = FALSE;
2080 parser->context.hasReturnCommand = FALSE;
2081 parser->context.retvalsFound.clear();
2082 parser->context.paramsFound.clear();
2083 parser->context.searchUrl="";
2084 parser->context.lang = SrcLangExt::Unknown;
2085 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2086 parser->context.autolinkSupport = false;
2087
2088 auto ast = std::make_unique<DocNodeAST>(DocTitle(parser,nullptr));
2089
2090 if (!input.isEmpty())
2091 {
2092 // build abstract syntax tree from title string
2093 std::get<DocTitle>(ast->root).parseFromString(nullptr,input);
2094
2096 {
2097 // pretty print the result
2098 std::visit(PrintDocVisitor{},ast->root);
2099 }
2100 }
2101
2102 return ast;
2103}
Node representing a simple section title.
Definition docnode.h:608

References DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, DocParserContext::exampleName, FALSE, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, QCString::isEmpty(), DocParserContext::isExample, Debug::isFlagSet(), DocParserContext::lang, DocParserContext::markdownSupport, DocParserContext::memberDef, DocParserContext::nodeStack, DocParserContext::paramsFound, Debug::PrintTree, DocParserContext::relPath, DocTokenizer::resetToken(), DocParserContext::retvalsFound, DocParserContext::searchUrl, DocParserContext::styleStack, DocParserContext::token, DocParser::tokenizer, and DocParserContext::xmlComment.

Referenced by parseCommentAsHtml().