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

2466{
2467 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2468 ASSERT(parser!=nullptr);
2469 if (parser==nullptr) return nullptr;
2470 if (!srcFile.empty())
2471 {
2472 parser->context.fileName = srcFile;
2473 parser->tokenizer.setFileName(srcFile);
2474 parser->tokenizer.setLineNr(srcLine);
2475 }
2476 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2477}
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 1964 of file docparser.cpp.

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

2044{
2045 size_t j=0;
2046 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2047 {
2048 CHECK_FOR_COMMAND("copybrief",brief=true); // @copybrief or \copybrief
2049 CHECK_FOR_COMMAND("copydetails",brief=false); // @copydetails or \copydetails
2050 }
2051 return j;
2052}
#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 2054 of file docparser.cpp.

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

References CHECK_FOR_COMMAND.

Referenced by DocParser::processCopyDoc().

◆ nextUTF8CharPosition()

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

Definition at line 2489 of file docparser.cpp.

2490{
2491 if (startPos>=len) return len;
2492 uint8_t c = static_cast<uint8_t>(utf8Str[startPos]);
2493 int bytes=getUTF8CharNumBytes(c);
2494 if (c=='&') // skip over character entities
2495 {
2496 bytes=1;
2497 int (*matcher)(int) = nullptr;
2498 c = static_cast<uint8_t>(utf8Str[startPos+bytes]);
2499 if (c=='#') // numerical entity?
2500 {
2501 bytes++;
2502 c = static_cast<uint8_t>(utf8Str[startPos+bytes]);
2503 if (c=='x') // hexadecimal entity?
2504 {
2505 bytes++;
2506 matcher = std::isxdigit;
2507 }
2508 else // decimal entity
2509 {
2510 matcher = std::isdigit;
2511 }
2512 }
2513 else if (std::isalnum(c)) // named entity?
2514 {
2515 bytes++;
2516 matcher = std::isalnum;
2517 }
2518 if (matcher)
2519 {
2520 while ((c = static_cast<uint8_t>(utf8Str[startPos+bytes]))!=0 && matcher(c))
2521 {
2522 bytes++;
2523 }
2524 }
2525 if (c!=';')
2526 {
2527 bytes=1; // not a valid entity, reset bytes counter
2528 }
2529 }
2530 return startPos+bytes;
2531}
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 2598 of file docparser.cpp.

2600{
2601 static std::mutex s_docCacheMutex;
2602 static std::unordered_map<std::string,DString> s_docCache;
2603
2604 std::lock_guard lock(s_docCacheMutex);
2605 auto it = s_docCache.find(doc.str());
2606 if (it != s_docCache.end())
2607 {
2608 //printf("Cache: [%s]->[%s]\n",qPrint(doc),qPrint(it->second));
2609 return it->second;
2610 }
2611 auto parser { createDocParser() };
2612 auto ast { validatingParseTitle(*parser.get(),fileName,lineNr,doc) };
2613 auto astImpl = dynamic_cast<const DocNodeAST*>(ast.get());
2614 DString result;
2615 if (astImpl)
2616 {
2617 TextStream t;
2618 OutputCodeList codeList;
2619 codeList.add<HtmlCodeGenerator>(&t);
2620 HtmlDocVisitor visitor(t,codeList,scope,fileName);
2621 std::visit(visitor,astImpl->root);
2622 result = t.str();
2623 }
2624 else // fallback, should not happen
2625 {
2626 result = filterTitle(doc);
2627 }
2628 //printf("Conversion: [%s]->[%s]\n",qPrint(doc),qPrint(result));
2629 s_docCache.insert(std::make_pair(doc.str(),result));
2630 return result;
2631}
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:4464

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

2536{
2537 if (doc.empty()) return "";
2538 static std::mutex s_docCacheMutex;
2539 static std::unordered_map<std::string,DString> s_docCache;
2540
2541 std::lock_guard lock(s_docCacheMutex);
2542 auto it = s_docCache.find(doc.str());
2543 if (it != s_docCache.end())
2544 {
2545 //printf("Cache: [%s]->[%s]\n",qPrint(doc),qPrint(it->second));
2546 return it->second;
2547 }
2548 //printf("parseCommentAsText(%s)\n",qPrint(doc));
2549 TextStream t;
2550 auto parser { createDocParser() };
2551 auto ast { validatingParseDoc(*parser.get(),
2552 fileName,
2553 lineNr,
2554 scope,
2555 md,
2556 doc,
2557 DocOptions()
2558 .setAutolinkSupport(false))
2559 };
2560 auto astImpl = dynamic_cast<const DocNodeAST*>(ast.get());
2561 if (astImpl)
2562 {
2563 TextDocVisitor visitor(t);
2564 std::visit(visitor,astImpl->root);
2565 }
2567 int i=0;
2568 int charCnt=0;
2569 int l=static_cast<int>(result.length());
2570 while ((i=nextUTF8CharPosition(result,l,i))<l)
2571 {
2572 charCnt++;
2573 if (charCnt>=80) break;
2574 }
2575 if (charCnt>=80) // try to truncate the string
2576 {
2577 while ((i=nextUTF8CharPosition(result,l,i))<l && charCnt<100)
2578 {
2579 charCnt++;
2580 if (result.at(i)==',' ||
2581 result.at(i)=='.' ||
2582 result.at(i)=='!' ||
2583 result.at(i)=='?' ||
2584 result.at(i)=='}') // good for UTF-16 characters and } otherwise also a good point to stop the string
2585 {
2586 i++; // we want to be "behind" last inspected character
2587 break;
2588 }
2589 }
2590 }
2591 if ( i < l) result=result.left(i)+"...";
2592 s_docCache.insert(std::make_pair(doc.str(),result));
2593 return result.data();
2594}
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 2079 of file docparser.cpp.

2080{
2081 while (i<len)
2082 {
2083 if ((data[i]=='@' || data[i]=='\\') && // start of command character
2084 (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
2085 {
2086 if (i+endMarker.length()+1<=len && dstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
2087 {
2088 return i+endMarker.length()+1;
2089 }
2090 }
2091 i++;
2092 }
2093 // oops no endmarker found...
2094 return i<len ? i+1 : len;
2095}
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 2211 of file docparser.cpp.

2218{
2219 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2220 ASSERT(parser!=nullptr);
2221 if (parser==nullptr) return nullptr;
2222 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
2223 // md?qPrint(md->name()):"<none>",
2224 // qPrint(input));
2225 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
2226 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
2227
2228 // set initial token
2229 parser->context.token = parser->tokenizer.resetToken();
2230
2231 if (ctx && ctx!=Doxygen::globalScope &&
2234 )
2235 )
2236 {
2238 }
2239 else if (ctx && ctx->definitionType()==Definition::TypePage)
2240 {
2241 const Definition *scope = (toPageDef(ctx))->getPageScope();
2242 if (scope && scope!=Doxygen::globalScope)
2243 {
2244 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2245 }
2246 }
2247 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2248 {
2249 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2250 if (scope && scope!=Doxygen::globalScope)
2251 {
2252 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2253 }
2254 }
2255 else
2256 {
2257 parser->context.context = "";
2258 }
2259 parser->context.scope = ctx;
2260 parser->context.lang = getLanguageFromFileName(fileName);
2261
2262 if (options.indexWords() && Doxygen::searchIndex.enabled())
2263 {
2264 if (md)
2265 {
2266 parser->context.searchUrl=md->getOutputFileBase();
2268 }
2269 else if (ctx)
2270 {
2271 parser->context.searchUrl=ctx->getOutputFileBase();
2272 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2273 }
2274 }
2275 else
2276 {
2277 parser->context.searchUrl="";
2278 }
2279
2280 parser->context.fileName = fileName;
2281 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2283 DString("");
2284 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2285 parser->context.memberDef = md;
2286 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2287 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2288 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2289 parser->context.inSeeBlock = false;
2290 parser->context.inCodeStyle = false;
2291 parser->context.xmlComment = false;
2292 parser->context.insideHtmlLink = false;
2293 parser->context.includeFileText = "";
2294 parser->context.includeFileOffset = 0;
2295 parser->context.includeFileLength = 0;
2296 parser->context.isExample = options.isExample();
2297 parser->context.exampleName = options.exampleName();
2298 parser->context.hasParamCommand = false;
2299 parser->context.hasReturnCommand = false;
2300 parser->context.retvalsFound.clear();
2301 parser->context.paramsFound.clear();
2302 parser->context.markdownSupport = options.markdownSupport();
2303 parser->context.autolinkSupport = options.autolinkSupport();
2304 if (md)
2305 {
2306 const ArgumentList &al=md->isDocsForDefinition() ? md->argumentList() : md->declArgumentList();
2307 parser->context.numParameters = static_cast<int>(al.size());
2308 }
2309 else
2310 {
2311 parser->context.numParameters = 0;
2312 }
2313 parser->context.paramPosition = 1;
2314
2315 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2316 parser->tokenizer.setFileName(fileName);
2317 parser->tokenizer.setLineNr(startLine);
2318 size_t ioLen = input.length();
2319 DString inpStr = parser->processCopyDoc(input.data(),ioLen);
2320 if (inpStr.empty() || inpStr.at(inpStr.length()-1)!='\n')
2321 {
2322 inpStr+='\n';
2323 }
2324 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2325 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2327
2328 // build abstract syntax tree
2329 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2330 std::get<DocRoot>(ast->root).parse();
2331
2333 {
2334 // pretty print the result
2335 std::visit(PrintDocVisitor{},ast->root);
2336 }
2337
2338 if (md && md->isFunction())
2339 {
2340 parser->checkUnOrMultipleDocumentedParams();
2341 }
2343
2344 // reset token
2345 parser->tokenizer.resetToken();
2346
2347 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2348 // md?qPrint(md->name()):"<none>");
2349
2350 return ast;
2351}
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:4639

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

2407{
2408 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2409 ASSERT(parser!=nullptr);
2410 if (parser==nullptr) return nullptr;
2411
2412 // set initial token
2413 parser->context.token = parser->tokenizer.resetToken();
2414
2415 //printf("------------ input ---------\n%s\n"
2416 // "------------ end input -----\n",input);
2417 //parser->context.token = new TokenInfo;
2418 parser->context.context = "";
2419 parser->context.fileName = "<parseText>";
2420 parser->context.relPath = "";
2421 parser->context.memberDef = nullptr;
2422 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2423 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2424 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2425 parser->context.inSeeBlock = false;
2426 parser->context.inCodeStyle = false;
2427 parser->context.xmlComment = false;
2428 parser->context.insideHtmlLink = false;
2429 parser->context.includeFileText = "";
2430 parser->context.includeFileOffset = 0;
2431 parser->context.includeFileLength = 0;
2432 parser->context.isExample = false;
2433 parser->context.exampleName = "";
2434 parser->context.hasParamCommand = false;
2435 parser->context.hasReturnCommand = false;
2436 parser->context.retvalsFound.clear();
2437 parser->context.paramsFound.clear();
2438 parser->context.searchUrl="";
2439 parser->context.lang = SrcLangExt::Unknown;
2440 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2441 parser->context.autolinkSupport = false;
2442
2443
2444 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2445
2446 if (!input.empty())
2447 {
2448 parser->tokenizer.setLineNr(1);
2449 parser->tokenizer.init(input.data(),parser->context.fileName,
2451
2452 // build abstract syntax tree
2453 std::get<DocText>(ast->root).parse();
2454
2456 {
2457 // pretty print the result
2458 std::visit(PrintDocVisitor{},ast->root);
2459 }
2460 }
2461
2462 return ast;
2463}
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 2353 of file docparser.cpp.

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