Doxygen
Loading...
Searching...
No Matches
docparser.cpp File Reference
#include "docparser.h"
#include <cstdint>
#include <cstdio>
#include "classlist.h"
#include "config.h"
#include "debug.h"
#include "dir.h"
#include "docparser_p.h"
#include "doxygen.h"
#include "filedef.h"
#include "fileinfo.h"
#include "filename.h"
#include "groupdef.h"
#include "htmldocvisitor.h"
#include "indexlist.h"
#include "message.h"
#include "namespacedef.h"
#include "outputlist.h"
#include "pagedef.h"
#include "portable.h"
#include "printdocvisitor.h"
#include "stringutil.h"
#include "textdocvisitor.h"
#include "trace.h"
#include "util.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)
static int nextUTF8CharPosition (const DString &utf8Str, uint32_t len, uint32_t startPos)
DString parseCommentAsText (const Definition *scope, const MemberDef *md, const DString &doc, const DString &fileName, int lineNr)
DString parseCommentAsHtml (const Definition *scope, const MemberDef *member, const DString &doc, const DString &fileName, int lineNr)

Macro Definition Documentation

◆ AUTO_TRACE

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

Definition at line 51 of file docparser.cpp.

◆ AUTO_TRACE_ADD

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

Definition at line 52 of file docparser.cpp.

◆ AUTO_TRACE_EXIT

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

Definition at line 53 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) && !isId(data[i+sizeof(str)])) \
{ j=i+sizeof(str); action; } while(0)
bool isId(char c)
Returns true if c is a valid character for an identifier.
Definition dstring.h:895
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:101

Definition at line 2033 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 2459 of file docparser.cpp.

2460{
2461 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2462 ASSERT(parser!=nullptr);
2463 if (parser==nullptr) return nullptr;
2464 if (!srcFile.empty())
2465 {
2466 parser->context.fileName = srcFile;
2467 parser->tokenizer.setFileName(srcFile);
2468 parser->tokenizer.setLineNr(srcLine);
2469 }
2470 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2471}
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
DocTokenizer tokenizer
DocParserContext context
Node representing a reference to some item.
Definition docnode.h:787
void setLineNr(int lineno)
void setFileName(const DString &fileName)
#define ASSERT(x)
Definition message.h:142

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

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

◆ docFindSections()

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

◆ extractCopyDocId()

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

Definition at line 1958 of file docparser.cpp.

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

References literal_at().

Referenced by DocParser::processCopyDoc().

◆ isCopyBriefOrDetailsCmd()

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

Definition at line 2037 of file docparser.cpp.

2038{
2039 size_t j=0;
2040 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2041 {
2042 CHECK_FOR_COMMAND("copybrief",brief=true); // @copybrief or \copybrief
2043 CHECK_FOR_COMMAND("copydetails",brief=false); // @copydetails or \copydetails
2044 }
2045 return j;
2046}
#define CHECK_FOR_COMMAND(str, action)

References CHECK_FOR_COMMAND.

Referenced by DocParser::processCopyDoc().

◆ isVerbatimSection()

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

Definition at line 2048 of file docparser.cpp.

2049{
2050 size_t j=0;
2051 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2052 {
2053 CHECK_FOR_COMMAND("dot",endMarker="enddot");
2054 CHECK_FOR_COMMAND("icode",endMarker="endicode");
2055 CHECK_FOR_COMMAND("code",endMarker="endcode");
2056 CHECK_FOR_COMMAND("msc",endMarker="endmsc");
2057 CHECK_FOR_COMMAND("mermaid",endMarker="endmermaid");
2058 CHECK_FOR_COMMAND("iverbatim",endMarker="endiverbatim");
2059 CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
2060 CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
2061 CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
2062 CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
2063 CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
2064 CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
2065 CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
2066 CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
2067 CHECK_FOR_COMMAND("startuml",endMarker="enduml");
2068 }
2069 //printf("isVerbatimSection(%s)=%d)\n",qPrint(DString(&data[i]).left(10)),j);
2070 return j;
2071}

References CHECK_FOR_COMMAND.

Referenced by DocParser::processCopyDoc().

◆ nextUTF8CharPosition()

int nextUTF8CharPosition ( const DString & utf8Str,
uint32_t len,
uint32_t startPos )
static

Definition at line 2483 of file docparser.cpp.

2484{
2485 if (startPos>=len) return len;
2486 uint8_t c = static_cast<uint8_t>(utf8Str[startPos]);
2487 int bytes=getUTF8CharNumBytes(c);
2488 if (c=='&') // skip over character entities
2489 {
2490 bytes=1;
2491 int (*matcher)(int) = nullptr;
2492 c = static_cast<uint8_t>(utf8Str[startPos+bytes]);
2493 if (c=='#') // numerical entity?
2494 {
2495 bytes++;
2496 c = static_cast<uint8_t>(utf8Str[startPos+bytes]);
2497 if (c=='x') // hexadecimal entity?
2498 {
2499 bytes++;
2500 matcher = std::isxdigit;
2501 }
2502 else // decimal entity
2503 {
2504 matcher = std::isdigit;
2505 }
2506 }
2507 else if (std::isalnum(c)) // named entity?
2508 {
2509 bytes++;
2510 matcher = std::isalnum;
2511 }
2512 if (matcher)
2513 {
2514 while ((c = static_cast<uint8_t>(utf8Str[startPos+bytes]))!=0 && matcher(c))
2515 {
2516 bytes++;
2517 }
2518 }
2519 if (c!=';')
2520 {
2521 bytes=1; // not a valid entity, reset bytes counter
2522 }
2523 }
2524 return startPos+bytes;
2525}
uint8_t getUTF8CharNumBytes(char c)
Returns the number of bytes making up a single UTF8 character given the first byte in the sequence.
Definition utf8.cpp:27

References getUTF8CharNumBytes().

Referenced by parseCommentAsText().

◆ parseCommentAsHtml()

DString parseCommentAsHtml ( const Definition * scope,
const MemberDef * member,
const DString & doc,
const DString & fileName,
int lineNr )

Definition at line 2592 of file docparser.cpp.

2594{
2595 static std::mutex s_docCacheMutex;
2596 static std::unordered_map<std::string,DString> s_docCache;
2597
2598 std::lock_guard lock(s_docCacheMutex);
2599 auto it = s_docCache.find(doc.str());
2600 if (it != s_docCache.end())
2601 {
2602 //printf("Cache: [%s]->[%s]\n",qPrint(doc),qPrint(it->second));
2603 return it->second;
2604 }
2605 auto parser { createDocParser() };
2606 auto ast { validatingParseTitle(*parser.get(),fileName,lineNr,doc) };
2607 auto astImpl = dynamic_cast<const DocNodeAST*>(ast.get());
2608 DString result;
2609 if (astImpl)
2610 {
2611 TextStream t;
2612 OutputCodeList codeList;
2613 codeList.add<HtmlCodeGenerator>(&t);
2614 HtmlDocVisitor visitor(t,codeList,scope,fileName);
2615 std::visit(visitor,astImpl->root);
2616 result = t.str();
2617 }
2618 else // fallback, should not happen
2619 {
2620 result = filterTitle(doc);
2621 }
2622 //printf("Conversion: [%s]->[%s]\n",qPrint(doc),qPrint(result));
2623 s_docCache.insert(std::make_pair(doc.str(),result));
2624 return result;
2625}
const std::string & str() const
Definition dstring.h:645
DString & insert(size_t index, const DString &s)
Definition dstring.h:425
Class representing the abstract syntax tree of a documentation block.
Definition docnode.h:1471
Generator for HTML code fragments.
Definition htmlgen.h:23
Concrete visitor implementation for HTML output.
Class representing a list of different code generators.
Definition outputlist.h:162
void add(OutputCodeIntfPtr &&p)
Definition outputlist.h:192
Text streaming class that buffers data.
Definition textstream.h:36
std::string str() const
Return the contents of the buffer as a std::string object.
Definition textstream.h:232
IDocNodeASTPtr validatingParseTitle(IDocParser &parserIntf, const DString &fileName, int lineNr, const DString &input)
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:59
DString filterTitle(const DString &title)
Definition util.cpp:4460

References OutputCodeList::add(), createDocParser(), filterTitle(), DString::insert(), DString::str(), TextStream::str(), and validatingParseTitle().

Referenced by PageDefImpl::addSectionsToIndex(), SearchTerm::makeTitle(), DefinitionImpl::navigationPathAsString(), LayoutNavEntry::titleAsHtml(), and writeJavasScriptSearchDataPage().

◆ parseCommentAsText()

DString parseCommentAsText ( const Definition * scope,
const MemberDef * md,
const DString & doc,
const DString & fileName,
int lineNr )

Definition at line 2528 of file docparser.cpp.

2530{
2531 if (doc.empty()) return "";
2532 static std::mutex s_docCacheMutex;
2533 static std::unordered_map<std::string,DString> s_docCache;
2534
2535 std::lock_guard lock(s_docCacheMutex);
2536 auto it = s_docCache.find(doc.str());
2537 if (it != s_docCache.end())
2538 {
2539 //printf("Cache: [%s]->[%s]\n",qPrint(doc),qPrint(it->second));
2540 return it->second;
2541 }
2542 //printf("parseCommentAsText(%s)\n",qPrint(doc));
2543 TextStream t;
2544 auto parser { createDocParser() };
2545 auto ast { validatingParseDoc(*parser.get(),
2546 fileName,
2547 lineNr,
2548 scope,
2549 md,
2550 doc,
2551 DocOptions()
2552 .setAutolinkSupport(false))
2553 };
2554 auto astImpl = dynamic_cast<const DocNodeAST*>(ast.get());
2555 if (astImpl)
2556 {
2557 TextDocVisitor visitor(t);
2558 std::visit(visitor,astImpl->root);
2559 }
2561 int i=0;
2562 int charCnt=0;
2563 int l=static_cast<int>(result.length());
2564 while ((i=nextUTF8CharPosition(result,l,i))<l)
2565 {
2566 charCnt++;
2567 if (charCnt>=80) break;
2568 }
2569 if (charCnt>=80) // try to truncate the string
2570 {
2571 while ((i=nextUTF8CharPosition(result,l,i))<l && charCnt<100)
2572 {
2573 charCnt++;
2574 if (result.at(i)==',' ||
2575 result.at(i)=='.' ||
2576 result.at(i)=='!' ||
2577 result.at(i)=='?' ||
2578 result.at(i)=='}') // good for UTF-16 characters and } otherwise also a good point to stop the string
2579 {
2580 i++; // we want to be "behind" last inspected character
2581 break;
2582 }
2583 }
2584 }
2585 if ( i < l) result=result.left(i)+"...";
2586 s_docCache.insert(std::make_pair(doc.str(),result));
2587 return result.data();
2588}
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:686
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:337
DString left(size_t len) const
Definition dstring.h:306
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:157
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:151
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
DString convertCharEntitiesToUTF8(const DString &s) const
Concrete visitor implementation for TEXT output.
static int nextUTF8CharPosition(const DString &utf8Str, uint32_t len, uint32_t startPos)
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &input, const DocOptions &options)
Helper class to pass options when calling OutputList::generateDoc().
Definition docoptions.h:24

References DString::at(), HtmlEntityMapper::convertCharEntitiesToUTF8(), createDocParser(), DString::data(), DString::empty(), DString::insert(), HtmlEntityMapper::instance(), DString::left(), DString::length(), nextUTF8CharPosition(), DString::str(), TextStream::str(), DString::stripWhiteSpace(), and validatingParseDoc().

Referenced by RequirementManager::addRequirement(), PageDefImpl::addSectionsToIndex(), DefinitionImpl::computeTooltip(), GroupDefImpl::setGroupTitleLocal(), PageDefImpl::setTitle(), LayoutNavEntry::title(), and RequirementManager::writeRef().

◆ skipToEndMarker()

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

Definition at line 2073 of file docparser.cpp.

2074{
2075 while (i<len)
2076 {
2077 if ((data[i]=='@' || data[i]=='\\') && // start of command character
2078 (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
2079 {
2080 if (i+endMarker.length()+1<=len && dstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
2081 {
2082 return i+endMarker.length()+1;
2083 }
2084 }
2085 i++;
2086 }
2087 // oops no endmarker found...
2088 return i<len ? i+1 : len;
2089}
int dstrncmp(const char *str1, const char *str2, size_t len)
Definition dstring.h:56

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

Referenced by DocParser::processCopyDoc().

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

2212{
2213 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2214 ASSERT(parser!=nullptr);
2215 if (parser==nullptr) return nullptr;
2216 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
2217 // md?qPrint(md->name()):"<none>",
2218 // qPrint(input));
2219 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
2220 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
2221
2222 // set initial token
2223 parser->context.token = parser->tokenizer.resetToken();
2224
2225 if (ctx && ctx!=Doxygen::globalScope &&
2228 )
2229 )
2230 {
2232 }
2233 else if (ctx && ctx->definitionType()==Definition::TypePage)
2234 {
2235 const Definition *scope = (toPageDef(ctx))->getPageScope();
2236 if (scope && scope!=Doxygen::globalScope)
2237 {
2238 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2239 }
2240 }
2241 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2242 {
2243 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2244 if (scope && scope!=Doxygen::globalScope)
2245 {
2246 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2247 }
2248 }
2249 else
2250 {
2251 parser->context.context = "";
2252 }
2253 parser->context.scope = ctx;
2254 parser->context.lang = getLanguageFromFileName(fileName);
2255
2256 if (options.indexWords() && Doxygen::searchIndex.enabled())
2257 {
2258 if (md)
2259 {
2260 parser->context.searchUrl=md->getOutputFileBase();
2262 }
2263 else if (ctx)
2264 {
2265 parser->context.searchUrl=ctx->getOutputFileBase();
2266 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2267 }
2268 }
2269 else
2270 {
2271 parser->context.searchUrl="";
2272 }
2273
2274 parser->context.fileName = fileName;
2275 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2277 DString("");
2278 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2279 parser->context.memberDef = md;
2280 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2281 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2282 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2283 parser->context.inSeeBlock = false;
2284 parser->context.inCodeStyle = false;
2285 parser->context.xmlComment = false;
2286 parser->context.insideHtmlLink = false;
2287 parser->context.includeFileText = "";
2288 parser->context.includeFileOffset = 0;
2289 parser->context.includeFileLength = 0;
2290 parser->context.isExample = options.isExample();
2291 parser->context.exampleName = options.exampleName();
2292 parser->context.hasParamCommand = false;
2293 parser->context.hasReturnCommand = false;
2294 parser->context.retvalsFound.clear();
2295 parser->context.paramsFound.clear();
2296 parser->context.markdownSupport = options.markdownSupport();
2297 parser->context.autolinkSupport = options.autolinkSupport();
2298 if (md)
2299 {
2300 const ArgumentList &al=md->isDocsForDefinition() ? md->argumentList() : md->declArgumentList();
2301 parser->context.numParameters = static_cast<int>(al.size());
2302 }
2303 else
2304 {
2305 parser->context.numParameters = 0;
2306 }
2307 parser->context.paramPosition = 1;
2308
2309 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2310 parser->tokenizer.setFileName(fileName);
2311 parser->tokenizer.setLineNr(startLine);
2312 size_t ioLen = input.length();
2313 DString inpStr = parser->processCopyDoc(input.data(),ioLen);
2314 if (inpStr.empty() || inpStr.at(inpStr.length()-1)!='\n')
2315 {
2316 inpStr+='\n';
2317 }
2318 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2319 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2321
2322 // build abstract syntax tree
2323 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2324 std::get<DocRoot>(ast->root).parse();
2325
2327 {
2328 // pretty print the result
2329 std::visit(PrintDocVisitor{},ast->root);
2330 }
2331
2332 if (md && md->isFunction())
2333 {
2334 parser->checkUnOrMultipleDocumentedParams();
2335 }
2337
2338 // reset token
2339 parser->tokenizer.resetToken();
2340
2341 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2342 // md?qPrint(md->name()):"<none>");
2343
2344 return ast;
2345}
This class represents an function or template argument list.
Definition arguments.h:66
size_t size() const
Definition arguments.h:101
@ PrintTree
Definition debug.h:35
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: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:114
static SearchIndexIntf searchIndex
Definition doxygen.h:117
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:485
GroupDef * toGroupDef(Definition *d)
PageDef * toPageDef(Definition *d)
Definition pagedef.cpp:656
bool autolinkSupport() const
Definition docoptions.h:33
DString exampleName() const
Definition docoptions.h:29
bool linkFromIndex() const
Definition docoptions.h:31
bool markdownSupport() const
Definition docoptions.h:32
bool indexWords() const
Definition docoptions.h:27
bool singleLine() const
Definition docoptions.h:30
bool isExample() const
Definition docoptions.h:28
StringMultiSet retvalsFound
Definition docparser_p.h:75
DocStyleChangeStack styleStack
Definition docparser_p.h:67
size_t includeFileLength
Definition docparser_p.h:89
DString includeFileText
Definition docparser_p.h:87
DocNodeStack nodeStack
Definition docparser_p.h:66
StringMultiSet paramsFound
Definition docparser_p.h:76
const Definition * scope
Definition docparser_p.h:60
TokenInfo * token
Definition docparser_p.h:94
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:68
SrcLangExt lang
Definition docparser_p.h:84
size_t includeFileOffset
Definition docparser_p.h:88
const MemberDef * memberDef
Definition docparser_p.h:79
DString exampleName
Definition docparser_p.h:81
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
Definition util.cpp:4174
DString relativePathToRoot(const DString &name)
Definition util.cpp:2918
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Definition util.cpp:4635

References Definition::anchor(), MemberDef::argumentList(), ASSERT, DString::at(), DocOptions::autolinkSupport(), DocParserContext::autolinkSupport, DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, DString::data(), MemberDef::declArgumentList(), Definition::definitionType(), MemberDef::detectUndocumentedParams(), 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, 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 DString & input )

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

Definition at line 2400 of file docparser.cpp.

2401{
2402 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2403 ASSERT(parser!=nullptr);
2404 if (parser==nullptr) return nullptr;
2405
2406 // set initial token
2407 parser->context.token = parser->tokenizer.resetToken();
2408
2409 //printf("------------ input ---------\n%s\n"
2410 // "------------ end input -----\n",input);
2411 //parser->context.token = new TokenInfo;
2412 parser->context.context = "";
2413 parser->context.fileName = "<parseText>";
2414 parser->context.relPath = "";
2415 parser->context.memberDef = nullptr;
2416 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2417 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2418 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2419 parser->context.inSeeBlock = false;
2420 parser->context.inCodeStyle = false;
2421 parser->context.xmlComment = false;
2422 parser->context.insideHtmlLink = false;
2423 parser->context.includeFileText = "";
2424 parser->context.includeFileOffset = 0;
2425 parser->context.includeFileLength = 0;
2426 parser->context.isExample = false;
2427 parser->context.exampleName = "";
2428 parser->context.hasParamCommand = false;
2429 parser->context.hasReturnCommand = false;
2430 parser->context.retvalsFound.clear();
2431 parser->context.paramsFound.clear();
2432 parser->context.searchUrl="";
2433 parser->context.lang = SrcLangExt::Unknown;
2434 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2435 parser->context.autolinkSupport = false;
2436
2437
2438 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2439
2440 if (!input.empty())
2441 {
2442 parser->tokenizer.setLineNr(1);
2443 parser->tokenizer.init(input.data(),parser->context.fileName,
2445
2446 // build abstract syntax tree
2447 std::get<DocText>(ast->root).parse();
2448
2450 {
2451 // pretty print the result
2452 std::visit(PrintDocVisitor{},ast->root);
2453 }
2454 }
2455
2456 return ast;
2457}
Root node of a text fragment.
Definition docnode.h:1309
#define Config_getBool(name)
Definition config.h:33

References ASSERT, DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, DString::data(), 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, and DocParserContext::xmlComment.

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

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

2348{
2349 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2350 ASSERT(parser!=nullptr);
2351 if (parser==nullptr) return nullptr;
2352
2353 // set initial token
2354 parser->context.token = parser->tokenizer.resetToken();
2355
2356 //printf("------------ input ---------\n%s\n"
2357 // "------------ end input -----\n",input);
2358 parser->context.context = "";
2359 parser->context.fileName = fileName;
2360 parser->context.relPath = "";
2361 parser->context.memberDef = nullptr;
2362 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2363 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2364 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2365 parser->context.inSeeBlock = false;
2366 parser->context.inCodeStyle = false;
2367 parser->context.xmlComment = false;
2368 parser->context.insideHtmlLink = false;
2369 parser->context.includeFileText = "";
2370 parser->context.includeFileOffset = 0;
2371 parser->context.includeFileLength = 0;
2372 parser->context.isExample = false;
2373 parser->context.exampleName = "";
2374 parser->context.hasParamCommand = false;
2375 parser->context.hasReturnCommand = false;
2376 parser->context.retvalsFound.clear();
2377 parser->context.paramsFound.clear();
2378 parser->context.searchUrl="";
2379 parser->context.lang = SrcLangExt::Unknown;
2380 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2381 parser->context.autolinkSupport = false;
2382
2383 auto ast = std::make_unique<DocNodeAST>(DocTitle(parser,nullptr));
2384
2385 if (!input.empty())
2386 {
2387 // build abstract syntax tree from title string
2388 std::get<DocTitle>(ast->root).parseFromString(nullptr,input);
2389
2391 {
2392 // pretty print the result
2393 std::visit(PrintDocVisitor{},ast->root);
2394 }
2395 }
2396
2397 return ast;
2398}
Node representing a simple section title.
Definition docnode.h:608

References ASSERT, DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, 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, and DocParserContext::xmlComment.

Referenced by parseCommentAsHtml().