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 DString 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, DString &endMarker)
static size_t skipToEndMarker (const char *data, size_t i, size_t len, const DString &endMarker)
IDocNodeASTPtr validatingParseDoc (IDocParser &parserIntf, const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &input, const DocOptions &options)
IDocNodeASTPtr validatingParseTitle (IDocParser &parserIntf, const DString &fileName, int lineNr, const DString &input)
IDocNodeASTPtr validatingParseText (IDocParser &parserIntf, const DString &input)
IDocNodeASTPtr createRef (IDocParser &parserIntf, const DString &target, const DString &context, const DString &srcFile, int srcLine)
void docFindSections (const DString &input, const Definition *d, const DString &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 2015 of file docparser.cpp.

Referenced by isCopyBriefOrDetailsCmd(), and isVerbatimSection().

Function Documentation

◆ createDocParser()

◆ createRef()

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

Definition at line 2441 of file docparser.cpp.

2442{
2443 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2444 assert(parser!=nullptr);
2445 if (parser==nullptr) return nullptr;
2446 if (!srcFile.empty())
2447 {
2448 parser->context.fileName = srcFile;
2449 parser->tokenizer.setFileName(srcFile);
2450 parser->tokenizer.setLineNr(srcLine);
2451 }
2452 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2453}
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:153
DocTokenizer tokenizer
DocParserContext context
DocRef(DocParser *parser, DocNodeVariant *parent, const DString &target, const DString &context)
Definition docnode.cpp:709
void setLineNr(int lineno)
void setFileName(const DString &fileName)

References DocParser::context, createRef(), DocRef::DocRef(), DString::empty(), DocParserContext::fileName, DocTokenizer::setFileName(), DocTokenizer::setLineNr(), and DocParser::tokenizer.

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

◆ docFindSections()

◆ extractCopyDocId()

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

Definition at line 1942 of file docparser.cpp.

1943{
1944 size_t s=j;
1945 int round=0;
1946 bool insideDQuote=false;
1947 bool insideSQuote=false;
1948 bool found=false;
1949 while (j<len && !found)
1950 {
1951 if (!insideSQuote && !insideDQuote)
1952 {
1953 switch (data[j])
1954 {
1955 case '(': round++; break;
1956 case ')': round--; break;
1957 case '"': insideDQuote=true; break;
1958 case '\'': insideSQuote=true; break;
1959 case '\\': // fall through, begin of command
1960 case '@': // fall through, begin of command
1961 case '\t': // fall through
1962 case '\n':
1963 found=(round==0);
1964 break;
1965 case ' ': // allow spaces in cast operator (see issue #11169)
1966 found=(round==0) && (j<8 || !literal_at(data+j-8,"operator"));
1967 break;
1968 }
1969 }
1970 else if (insideSQuote) // look for single quote end
1971 {
1972 if (data[j]=='\'' && (j==0 || data[j]!='\\'))
1973 {
1974 insideSQuote=false;
1975 }
1976 }
1977 else if (insideDQuote) // look for double quote end
1978 {
1979 if (data[j]=='"' && (j==0 || data[j]!='\\'))
1980 {
1981 insideDQuote=false;
1982 }
1983 }
1984 if (!found) j++;
1985 }
1986
1987 // include const and volatile
1988 if (literal_at(data+j," const"))
1989 {
1990 j+=6;
1991 }
1992 else if (literal_at(data+j," volatile"))
1993 {
1994 j+=9;
1995 }
1996
1997 // allow '&' or '&&' or ' &' or ' &&' at the end
1998 size_t k=j;
1999 while (k<len && data[k]==' ') k++;
2000 if (k<len-1 && data[k]=='&' && data[k+1]=='&') j=k+2;
2001 else if (k<len && data[k]=='&' ) j=k+1;
2002
2003 // do not include punctuation added by Definition::_setBriefDescription()
2004 size_t e=j;
2005 if (j>0 && data[j-1]=='.') { e--; }
2006 DString id(data+s,e-s);
2007 //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]);
2008 return id;
2009}
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:89

References extractCopyDocId(), and literal_at().

Referenced by extractCopyDocId(), and DocParser::processCopyDoc().

◆ isCopyBriefOrDetailsCmd()

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

Definition at line 2019 of file docparser.cpp.

2020{
2021 size_t j=0;
2022 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2023 {
2024 CHECK_FOR_COMMAND("copybrief",brief=true); // @copybrief or \copybrief
2025 CHECK_FOR_COMMAND("copydetails",brief=false); // @copydetails or \copydetails
2026 }
2027 return j;
2028}
#define CHECK_FOR_COMMAND(str, action)

References CHECK_FOR_COMMAND, and isCopyBriefOrDetailsCmd().

Referenced by isCopyBriefOrDetailsCmd(), and DocParser::processCopyDoc().

◆ isVerbatimSection()

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

Definition at line 2030 of file docparser.cpp.

2031{
2032 size_t j=0;
2033 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2034 {
2035 CHECK_FOR_COMMAND("dot",endMarker="enddot");
2036 CHECK_FOR_COMMAND("icode",endMarker="endicode");
2037 CHECK_FOR_COMMAND("code",endMarker="endcode");
2038 CHECK_FOR_COMMAND("msc",endMarker="endmsc");
2039 CHECK_FOR_COMMAND("mermaid",endMarker="endmermaid");
2040 CHECK_FOR_COMMAND("iverbatim",endMarker="endiverbatim");
2041 CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
2042 CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
2043 CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
2044 CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
2045 CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
2046 CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
2047 CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
2048 CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
2049 CHECK_FOR_COMMAND("startuml",endMarker="enduml");
2050 }
2051 //printf("isVerbatimSection(%s)=%d)\n",qPrint(DString(&data[i]).left(10)),j);
2052 return j;
2053}

References CHECK_FOR_COMMAND, and isVerbatimSection().

Referenced by isVerbatimSection(), and DocParser::processCopyDoc().

◆ skipToEndMarker()

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

Definition at line 2055 of file docparser.cpp.

2056{
2057 while (i<len)
2058 {
2059 if ((data[i]=='@' || data[i]=='\\') && // start of command character
2060 (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
2061 {
2062 if (i+endMarker.length()+1<=len && dstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
2063 {
2064 return i+endMarker.length()+1;
2065 }
2066 }
2067 i++;
2068 }
2069 // oops no endmarker found...
2070 return i<len ? i+1 : len;
2071}
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:162
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:156
int dstrncmp(const char *str1, const char *str2, size_t len)
Definition dstring.h:61

References DString::data(), dstrncmp(), DString::length(), and skipToEndMarker().

Referenced by DocParser::processCopyDoc(), and skipToEndMarker().

◆ validatingParseDoc()

IDocNodeASTPtr validatingParseDoc ( IDocParser & parserIntf,
const DString & fileName,
int startLine,
const Definition * ctx,
const MemberDef * md,
const DString & 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 2187 of file docparser.cpp.

2194{
2195 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2196 assert(parser!=nullptr);
2197 if (parser==nullptr) return nullptr;
2198 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
2199 // md?qPrint(md->name()):"<none>",
2200 // qPrint(input));
2201 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
2202 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
2203
2204 // set initial token
2205 parser->context.token = parser->tokenizer.resetToken();
2206
2207 if (ctx && ctx!=Doxygen::globalScope &&
2210 )
2211 )
2212 {
2214 }
2215 else if (ctx && ctx->definitionType()==Definition::TypePage)
2216 {
2217 const Definition *scope = (toPageDef(ctx))->getPageScope();
2218 if (scope && scope!=Doxygen::globalScope)
2219 {
2220 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2221 }
2222 }
2223 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2224 {
2225 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2226 if (scope && scope!=Doxygen::globalScope)
2227 {
2228 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2229 }
2230 }
2231 else
2232 {
2233 parser->context.context = "";
2234 }
2235 parser->context.scope = ctx;
2236 parser->context.lang = getLanguageFromFileName(fileName);
2237
2238 if (options.indexWords() && Doxygen::searchIndex.enabled())
2239 {
2240 if (md)
2241 {
2242 parser->context.searchUrl=md->getOutputFileBase();
2244 }
2245 else if (ctx)
2246 {
2247 parser->context.searchUrl=ctx->getOutputFileBase();
2248 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2249 }
2250 }
2251 else
2252 {
2253 parser->context.searchUrl="";
2254 }
2255
2256 parser->context.fileName = fileName;
2257 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2259 DString("");
2260 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2261 parser->context.memberDef = md;
2262 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2263 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2264 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2265 parser->context.inSeeBlock = false;
2266 parser->context.inCodeStyle = false;
2267 parser->context.xmlComment = false;
2268 parser->context.insideHtmlLink = false;
2269 parser->context.includeFileText = "";
2270 parser->context.includeFileOffset = 0;
2271 parser->context.includeFileLength = 0;
2272 parser->context.isExample = options.isExample();
2273 parser->context.exampleName = options.exampleName();
2274 parser->context.hasParamCommand = false;
2275 parser->context.hasReturnCommand = false;
2276 parser->context.retvalsFound.clear();
2277 parser->context.paramsFound.clear();
2278 parser->context.markdownSupport = options.markdownSupport();
2279 parser->context.autolinkSupport = options.autolinkSupport();
2280 if (md)
2281 {
2282 const ArgumentList &al=md->isDocsForDefinition() ? md->argumentList() : md->declArgumentList();
2283 parser->context.numParameters = static_cast<int>(al.size());
2284 }
2285 else
2286 {
2287 parser->context.numParameters = 0;
2288 }
2289 parser->context.paramPosition = 1;
2290
2291 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2292 parser->tokenizer.setFileName(fileName);
2293 parser->tokenizer.setLineNr(startLine);
2294 size_t ioLen = input.length();
2295 DString inpStr = parser->processCopyDoc(input.data(),ioLen);
2296 if (inpStr.empty() || inpStr.at(inpStr.length()-1)!='\n')
2297 {
2298 inpStr+='\n';
2299 }
2300 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2301 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2303
2304 // build abstract syntax tree
2305 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2306 std::get<DocRoot>(ast->root).parse();
2307
2309 {
2310 // pretty print the result
2311 std::visit(PrintDocVisitor{},ast->root);
2312 }
2313
2314 if (md && md->isFunction())
2315 {
2316 parser->checkUnOrMultipleDocumentedParams();
2317 }
2319
2320 // reset token
2321 parser->tokenizer.resetToken();
2322
2323 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2324 // md?qPrint(md->name()):"<none>");
2325
2326 return ast;
2327}
This class represents an function or template argument list.
Definition arguments.h:65
size_t size() const
Definition arguments.h:100
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:675
@ 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 const DString & name() const =0
virtual DString qualifiedName() const =0
virtual DString anchor() const =0
virtual DString getOutputFileBase() const =0
DString processCopyDoc(const char *data, size_t &len)
Root node of documentation tree.
Definition docnode.h:1318
void init(const char *input, const DString &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
void setCurrentDoc(const Definition *ctx, const DString &anchor, bool isSourceFile)
bool enabled() const
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
Definition dstring.cpp:476
GroupDef * toGroupDef(Definition *d)
PageDef * toPageDef(Definition *d)
Definition pagedef.cpp:519
bool autolinkSupport() const
Definition docoptions.h:32
DString exampleName() const
Definition docoptions.h:28
bool linkFromIndex() const
Definition docoptions.h:30
bool markdownSupport() const
Definition docoptions.h:31
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
DString includeFileText
Definition docparser_p.h:88
DocNodeStack nodeStack
Definition docparser_p.h:67
StringMultiSet paramsFound
Definition docparser_p.h:77
const Definition * scope
Definition docparser_p.h:61
TokenInfo * token
Definition docparser_p.h:95
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:69
SrcLangExt lang
Definition docparser_p.h:85
size_t includeFileOffset
Definition docparser_p.h:89
const MemberDef * memberDef
Definition docparser_p.h:80
DString exampleName
Definition docparser_p.h:82
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
Definition util.cpp:4975
DString relativePathToRoot(const DString &name)
Definition util.cpp:3343
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5658

References Definition::anchor(), MemberDef::argumentList(), DString::at(), DocOptions::autolinkSupport(), DocParserContext::autolinkSupport, DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, DString::data(), MemberDef::declArgumentList(), Definition::definitionType(), MemberDef::detectUndocumentedParams(), DocRoot::DocRoot(), DString::DString(), DString::empty(), SearchIndexIntf::enabled(), DocOptions::exampleName(), DocParserContext::exampleName, 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(), DocOptions::isExample(), DocParserContext::isExample, Debug::isFlagSet(), MemberDef::isFunction(), DocParserContext::lang, DString::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, SearchIndexIntf::setCurrentDoc(), 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, validatingParseDoc(), and DocParserContext::xmlComment.

Referenced by addPerlModDocBlock(), generateBriefDoc(), OutputList::generateDoc(), generateHtmlOutput(), getSQLDocBlock(), parseCommentAsText(), validatingParseDoc(), 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 DString & input )

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

Definition at line 2382 of file docparser.cpp.

2383{
2384 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2385 assert(parser!=nullptr);
2386 if (parser==nullptr) return nullptr;
2387
2388 // set initial token
2389 parser->context.token = parser->tokenizer.resetToken();
2390
2391 //printf("------------ input ---------\n%s\n"
2392 // "------------ end input -----\n",input);
2393 //parser->context.token = new TokenInfo;
2394 parser->context.context = "";
2395 parser->context.fileName = "<parseText>";
2396 parser->context.relPath = "";
2397 parser->context.memberDef = nullptr;
2398 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2399 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2400 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2401 parser->context.inSeeBlock = false;
2402 parser->context.inCodeStyle = false;
2403 parser->context.xmlComment = false;
2404 parser->context.insideHtmlLink = false;
2405 parser->context.includeFileText = "";
2406 parser->context.includeFileOffset = 0;
2407 parser->context.includeFileLength = 0;
2408 parser->context.isExample = false;
2409 parser->context.exampleName = "";
2410 parser->context.hasParamCommand = false;
2411 parser->context.hasReturnCommand = false;
2412 parser->context.retvalsFound.clear();
2413 parser->context.paramsFound.clear();
2414 parser->context.searchUrl="";
2415 parser->context.lang = SrcLangExt::Unknown;
2416 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2417 parser->context.autolinkSupport = false;
2418
2419
2420 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2421
2422 if (!input.empty())
2423 {
2424 parser->tokenizer.setLineNr(1);
2425 parser->tokenizer.init(input.data(),parser->context.fileName,
2427
2428 // build abstract syntax tree
2429 std::get<DocText>(ast->root).parse();
2430
2432 {
2433 // pretty print the result
2434 std::visit(PrintDocVisitor{},ast->root);
2435 }
2436 }
2437
2438 return ast;
2439}
DocText(DocParser *parser)
Definition docnode.h:1311
#define Config_getBool(name)
Definition config.h:33

References DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, DString::data(), DocText::DocText(), DString::empty(), DocParserContext::exampleName, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::inCodeStyle, DocTokenizer::init(), DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, 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, validatingParseText(), and DocParserContext::xmlComment.

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

◆ validatingParseTitle()

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

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

Definition at line 2329 of file docparser.cpp.

2330{
2331 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2332 assert(parser!=nullptr);
2333 if (parser==nullptr) return nullptr;
2334
2335 // set initial token
2336 parser->context.token = parser->tokenizer.resetToken();
2337
2338 //printf("------------ input ---------\n%s\n"
2339 // "------------ end input -----\n",input);
2340 parser->context.context = "";
2341 parser->context.fileName = fileName;
2342 parser->context.relPath = "";
2343 parser->context.memberDef = nullptr;
2344 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2345 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2346 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2347 parser->context.inSeeBlock = false;
2348 parser->context.inCodeStyle = false;
2349 parser->context.xmlComment = false;
2350 parser->context.insideHtmlLink = false;
2351 parser->context.includeFileText = "";
2352 parser->context.includeFileOffset = 0;
2353 parser->context.includeFileLength = 0;
2354 parser->context.isExample = false;
2355 parser->context.exampleName = "";
2356 parser->context.hasParamCommand = false;
2357 parser->context.hasReturnCommand = false;
2358 parser->context.retvalsFound.clear();
2359 parser->context.paramsFound.clear();
2360 parser->context.searchUrl="";
2361 parser->context.lang = SrcLangExt::Unknown;
2362 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2363 parser->context.autolinkSupport = false;
2364
2365 auto ast = std::make_unique<DocNodeAST>(DocTitle(parser,nullptr));
2366
2367 if (!input.empty())
2368 {
2369 // build abstract syntax tree from title string
2370 std::get<DocTitle>(ast->root).parseFromString(nullptr,input);
2371
2373 {
2374 // pretty print the result
2375 std::visit(PrintDocVisitor{},ast->root);
2376 }
2377 }
2378
2379 return ast;
2380}
DocTitle(DocParser *parser, DocNodeVariant *parent)
Definition docnode.h:610

References DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, DocTitle::DocTitle(), DString::empty(), DocParserContext::exampleName, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::inCodeStyle, DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, 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, validatingParseTitle(), and DocParserContext::xmlComment.

Referenced by parseCommentAsHtml(), and validatingParseTitle().