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, const DocOptions &options)
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 1998 of file docparser.cpp.

1998#define CHECK_FOR_COMMAND(str,action) \
1999 do if ((i+sizeof(str)<len) && literal_at(data+i+1,str)) \
2000 { 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 2423 of file docparser.cpp.

2424{
2425 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2426 assert(parser!=nullptr);
2427 if (parser==nullptr) return nullptr;
2428 if (!srcFile.isEmpty())
2429 {
2430 parser->context.fileName = srcFile;
2431 parser->tokenizer.setFileName(srcFile);
2432 parser->tokenizer.setLineNr(srcLine);
2433 }
2434 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2435}
DocTokenizer tokenizer
DocParserContext context
Node representing a reference to some item.
Definition docnode.h:787
void setLineNr(int lineno)
void setFileName(const QCString &fileName)
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString fileName
Definition docparser_p.h:71

References DocParser::context, DocParserContext::fileName, QCString::isEmpty(), DocTokenizer::setFileName(), 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 1925 of file docparser.cpp.

1926{
1927 size_t s=j;
1928 int round=0;
1929 bool insideDQuote=FALSE;
1930 bool insideSQuote=FALSE;
1931 bool found=FALSE;
1932 while (j<len && !found)
1933 {
1934 if (!insideSQuote && !insideDQuote)
1935 {
1936 switch (data[j])
1937 {
1938 case '(': round++; break;
1939 case ')': round--; break;
1940 case '"': insideDQuote=TRUE; break;
1941 case '\'': insideSQuote=TRUE; break;
1942 case '\\': // fall through, begin of command
1943 case '@': // fall through, begin of command
1944 case '\t': // fall through
1945 case '\n':
1946 found=(round==0);
1947 break;
1948 case ' ': // allow spaces in cast operator (see issue #11169)
1949 found=(round==0) && (j<8 || !literal_at(data+j-8,"operator"));
1950 break;
1951 }
1952 }
1953 else if (insideSQuote) // look for single quote end
1954 {
1955 if (data[j]=='\'' && (j==0 || data[j]!='\\'))
1956 {
1957 insideSQuote=FALSE;
1958 }
1959 }
1960 else if (insideDQuote) // look for double quote end
1961 {
1962 if (data[j]=='"' && (j==0 || data[j]!='\\'))
1963 {
1964 insideDQuote=FALSE;
1965 }
1966 }
1967 if (!found) j++;
1968 }
1969
1970 // include const and volatile
1971 if (literal_at(data+j," const"))
1972 {
1973 j+=6;
1974 }
1975 else if (literal_at(data+j," volatile"))
1976 {
1977 j+=9;
1978 }
1979
1980 // allow '&' or '&&' or ' &' or ' &&' at the end
1981 size_t k=j;
1982 while (k<len && data[k]==' ') k++;
1983 if (k<len-1 && data[k]=='&' && data[k+1]=='&') j=k+2;
1984 else if (k<len && data[k]=='&' ) j=k+1;
1985
1986 // do not include punctuation added by Definition::_setBriefDescription()
1987 size_t e=j;
1988 if (j>0 && data[j-1]=='.') { e--; }
1989 QCString id(data+s,e-s);
1990 //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]);
1991 return id;
1992}
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 2002 of file docparser.cpp.

2003{
2004 size_t j=0;
2005 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2006 {
2007 CHECK_FOR_COMMAND("copybrief",brief=TRUE); // @copybrief or \copybrief
2008 CHECK_FOR_COMMAND("copydetails",brief=FALSE); // @copydetails or \copydetails
2009 }
2010 return j;
2011}
#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 2013 of file docparser.cpp.

2014{
2015 size_t j=0;
2016 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2017 {
2018 CHECK_FOR_COMMAND("dot",endMarker="enddot");
2019 CHECK_FOR_COMMAND("icode",endMarker="endicode");
2020 CHECK_FOR_COMMAND("code",endMarker="endcode");
2021 CHECK_FOR_COMMAND("msc",endMarker="endmsc");
2022 CHECK_FOR_COMMAND("iverbatim",endMarker="endiverbatim");
2023 CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
2024 CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
2025 CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
2026 CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
2027 CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
2028 CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
2029 CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
2030 CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
2031 CHECK_FOR_COMMAND("startuml",endMarker="enduml");
2032 }
2033 //printf("isVerbatimSection(%s)=%d)\n",qPrint(QCString(&data[i]).left(10)),j);
2034 return j;
2035}

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 2037 of file docparser.cpp.

2038{
2039 while (i<len)
2040 {
2041 if ((data[i]=='@' || data[i]=='\\') && // start of command character
2042 (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
2043 {
2044 if (i+endMarker.length()+1<=len && qstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
2045 {
2046 return i+endMarker.length()+1;
2047 }
2048 }
2049 i++;
2050 }
2051 // oops no endmarker found...
2052 return i<len ? i+1 : len;
2053}
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
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:172
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,
const DocOptions & options )

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.
optionsOptional parameters.
Returns
An object representing the abstract syntax tree. Ownership of the pointer is handed over to the caller.

Definition at line 2169 of file docparser.cpp.

2176{
2177 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2178 assert(parser!=nullptr);
2179 if (parser==nullptr) return nullptr;
2180 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
2181 // md?qPrint(md->name()):"<none>",
2182 // qPrint(input));
2183 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
2184 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
2185
2186 // set initial token
2187 parser->context.token = parser->tokenizer.resetToken();
2188
2189 if (ctx && ctx!=Doxygen::globalScope &&
2192 )
2193 )
2194 {
2196 }
2197 else if (ctx && ctx->definitionType()==Definition::TypePage)
2198 {
2199 const Definition *scope = (toPageDef(ctx))->getPageScope();
2200 if (scope && scope!=Doxygen::globalScope)
2201 {
2202 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2203 }
2204 }
2205 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2206 {
2207 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2208 if (scope && scope!=Doxygen::globalScope)
2209 {
2210 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2211 }
2212 }
2213 else
2214 {
2215 parser->context.context = "";
2216 }
2217 parser->context.scope = ctx;
2218 parser->context.lang = getLanguageFromFileName(fileName);
2219
2220 if (options.indexWords() && Doxygen::searchIndex.enabled())
2221 {
2222 if (md)
2223 {
2224 parser->context.searchUrl=md->getOutputFileBase();
2225 Doxygen::searchIndex.setCurrentDoc(md,md->anchor(),false);
2226 }
2227 else if (ctx)
2228 {
2229 parser->context.searchUrl=ctx->getOutputFileBase();
2230 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2231 }
2232 }
2233 else
2234 {
2235 parser->context.searchUrl="";
2236 }
2237
2238 parser->context.fileName = fileName;
2239 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2241 QCString("");
2242 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2243 parser->context.memberDef = md;
2244 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2245 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2246 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2247 parser->context.inSeeBlock = FALSE;
2248 parser->context.inCodeStyle = FALSE;
2249 parser->context.xmlComment = FALSE;
2250 parser->context.insideHtmlLink = FALSE;
2251 parser->context.includeFileText = "";
2252 parser->context.includeFileOffset = 0;
2253 parser->context.includeFileLength = 0;
2254 parser->context.isExample = options.isExample();
2255 parser->context.exampleName = options.exampleName();
2256 parser->context.hasParamCommand = FALSE;
2257 parser->context.hasReturnCommand = FALSE;
2258 parser->context.retvalsFound.clear();
2259 parser->context.paramsFound.clear();
2260 parser->context.markdownSupport = options.markdownSupport();
2261 parser->context.autolinkSupport = options.autolinkSupport();
2262 if (md)
2263 {
2264 const ArgumentList &al=md->isDocsForDefinition() ? md->argumentList() : md->declArgumentList();
2265 parser->context.numParameters = static_cast<int>(al.size());
2266 }
2267 else
2268 {
2269 parser->context.numParameters = 0;
2270 }
2271 parser->context.paramPosition = 1;
2272
2273 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2274 parser->tokenizer.setFileName(fileName);
2275 parser->tokenizer.setLineNr(startLine);
2276 size_t ioLen = input.length();
2277 QCString inpStr = parser->processCopyDoc(input.data(),ioLen);
2278 if (inpStr.isEmpty() || inpStr.at(inpStr.length()-1)!='\n')
2279 {
2280 inpStr+='\n';
2281 }
2282 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2283 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2285
2286 // build abstract syntax tree
2287 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2288 std::get<DocRoot>(ast->root).parse();
2289
2291 {
2292 // pretty print the result
2293 std::visit(PrintDocVisitor{},ast->root);
2294 }
2295
2296 if (md && md->isFunction())
2297 {
2298 parser->checkUnOrMultipleDocumentedParams();
2299 }
2301
2302 // reset token
2303 parser->tokenizer.resetToken();
2304
2305 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2306 // md?qPrint(md->name()):"<none>");
2307
2308 return ast;
2309}
This class represents an function or template argument list.
Definition arguments.h:65
size_t size() const
Definition arguments.h:100
@ PrintTree
Definition debug.h:34
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:133
The common base class of all entity definitions found in the sources.
Definition definition.h:77
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)
Root node of documentation tree.
Definition docnode.h:1318
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 const ArgumentList & argumentList() const =0
virtual bool isFunction() const =0
virtual bool isDocsForDefinition() const =0
virtual void detectUndocumentedParams(bool hasParamCommand, bool hasReturnCommand) const =0
virtual const ArgumentList & declArgumentList() const =0
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:593
GroupDef * toGroupDef(Definition *d)
PageDef * toPageDef(Definition *d)
Definition pagedef.cpp:502
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:571
bool autolinkSupport() const
Definition docoptions.h:32
bool linkFromIndex() const
Definition docoptions.h:30
bool markdownSupport() const
Definition docoptions.h:31
QCString exampleName() const
Definition docoptions.h:28
bool indexWords() const
Definition docoptions.h:26
bool singleLine() const
Definition docoptions.h:29
bool isExample() const
Definition docoptions.h:27
StringMultiSet retvalsFound
Definition docparser_p.h:76
DocStyleChangeStack styleStack
Definition docparser_p.h:68
size_t includeFileLength
Definition docparser_p.h:90
DocNodeStack nodeStack
Definition docparser_p.h:67
StringMultiSet paramsFound
Definition docparser_p.h:77
QCString exampleName
Definition docparser_p.h:82
const Definition * scope
Definition docparser_p.h:61
QCString includeFileText
Definition docparser_p.h:88
TokenInfo * token
Definition docparser_p.h:95
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:69
SrcLangExt lang
Definition docparser_p.h:85
QCString searchUrl
Definition docparser_p.h:83
size_t includeFileOffset
Definition docparser_p.h:89
const MemberDef * memberDef
Definition docparser_p.h:80
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5231
QCString relativePathToRoot(const QCString &name)
Definition util.cpp:3600
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5915

References Definition::anchor(), MemberDef::argumentList(), QCString::at(), DocOptions::autolinkSupport(), DocParserContext::autolinkSupport, DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, QCString::data(), MemberDef::declArgumentList(), Definition::definitionType(), MemberDef::detectUndocumentedParams(), DocOptions::exampleName(), DocParserContext::exampleName, FALSE, DocParserContext::fileName, Definition::getLanguage(), getLanguageFromFileName(), getLanguageSpecificSeparator(), Definition::getOutputFileBase(), Doxygen::globalScope, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::inCodeStyle, DocOptions::indexWords(), DocTokenizer::init(), DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, MemberDef::isDocsForDefinition(), QCString::isEmpty(), DocOptions::isExample(), DocParserContext::isExample, Debug::isFlagSet(), MemberDef::isFunction(), DocParserContext::lang, QCString::length(), DocOptions::linkFromIndex(), DocOptions::markdownSupport(), DocParserContext::markdownSupport, DocParserContext::memberDef, Definition::name(), DocParserContext::nodeStack, DocParserContext::numParameters, DocParserContext::paramPosition, DocParserContext::paramsFound, Debug::PrintTree, DocParser::processCopyDoc(), Definition::qualifiedName(), relativePathToRoot(), DocParserContext::relPath, DocTokenizer::resetToken(), DocParserContext::retvalsFound, DocParserContext::scope, Doxygen::searchIndex, DocParserContext::searchUrl, DocTokenizer::setFileName(), DocTokenizer::setLineNr(), DocOptions::singleLine(), ArgumentList::size(), 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 2364 of file docparser.cpp.

2365{
2366 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2367 assert(parser!=nullptr);
2368 if (parser==nullptr) return nullptr;
2369
2370 // set initial token
2371 parser->context.token = parser->tokenizer.resetToken();
2372
2373 //printf("------------ input ---------\n%s\n"
2374 // "------------ end input -----\n",input);
2375 //parser->context.token = new TokenInfo;
2376 parser->context.context = "";
2377 parser->context.fileName = "<parseText>";
2378 parser->context.relPath = "";
2379 parser->context.memberDef = nullptr;
2380 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2381 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2382 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2383 parser->context.inSeeBlock = FALSE;
2384 parser->context.inCodeStyle = FALSE;
2385 parser->context.xmlComment = FALSE;
2386 parser->context.insideHtmlLink = FALSE;
2387 parser->context.includeFileText = "";
2388 parser->context.includeFileOffset = 0;
2389 parser->context.includeFileLength = 0;
2390 parser->context.isExample = FALSE;
2391 parser->context.exampleName = "";
2392 parser->context.hasParamCommand = FALSE;
2393 parser->context.hasReturnCommand = FALSE;
2394 parser->context.retvalsFound.clear();
2395 parser->context.paramsFound.clear();
2396 parser->context.searchUrl="";
2397 parser->context.lang = SrcLangExt::Unknown;
2398 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2399 parser->context.autolinkSupport = FALSE;
2400
2401
2402 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2403
2404 if (!input.isEmpty())
2405 {
2406 parser->tokenizer.setLineNr(1);
2407 parser->tokenizer.init(input.data(),parser->context.fileName,
2409
2410 // build abstract syntax tree
2411 std::get<DocText>(ast->root).parse();
2412
2414 {
2415 // pretty print the result
2416 std::visit(PrintDocVisitor{},ast->root);
2417 }
2418 }
2419
2420 return ast;
2421}
Root node of a text fragment.
Definition docnode.h:1309
#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, DocParserContext::inCodeStyle, 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 2311 of file docparser.cpp.

2312{
2313 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2314 assert(parser!=nullptr);
2315 if (parser==nullptr) return nullptr;
2316
2317 // set initial token
2318 parser->context.token = parser->tokenizer.resetToken();
2319
2320 //printf("------------ input ---------\n%s\n"
2321 // "------------ end input -----\n",input);
2322 parser->context.context = "";
2323 parser->context.fileName = fileName;
2324 parser->context.relPath = "";
2325 parser->context.memberDef = nullptr;
2326 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2327 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2328 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2329 parser->context.inSeeBlock = FALSE;
2330 parser->context.inCodeStyle = FALSE;
2331 parser->context.xmlComment = FALSE;
2332 parser->context.insideHtmlLink = FALSE;
2333 parser->context.includeFileText = "";
2334 parser->context.includeFileOffset = 0;
2335 parser->context.includeFileLength = 0;
2336 parser->context.isExample = FALSE;
2337 parser->context.exampleName = "";
2338 parser->context.hasParamCommand = FALSE;
2339 parser->context.hasReturnCommand = FALSE;
2340 parser->context.retvalsFound.clear();
2341 parser->context.paramsFound.clear();
2342 parser->context.searchUrl="";
2343 parser->context.lang = SrcLangExt::Unknown;
2344 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2345 parser->context.autolinkSupport = false;
2346
2347 auto ast = std::make_unique<DocNodeAST>(DocTitle(parser,nullptr));
2348
2349 if (!input.isEmpty())
2350 {
2351 // build abstract syntax tree from title string
2352 std::get<DocTitle>(ast->root).parseFromString(nullptr,input);
2353
2355 {
2356 // pretty print the result
2357 std::visit(PrintDocVisitor{},ast->root);
2358 }
2359 }
2360
2361 return ast;
2362}
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::inCodeStyle, 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().