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

2455{
2456 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2457 ASSERT(parser!=nullptr);
2458 if (parser==nullptr) return nullptr;
2459 if (!srcFile.empty())
2460 {
2461 parser->context.fileName = srcFile;
2462 parser->tokenizer.setFileName(srcFile);
2463 parser->tokenizer.setLineNr(srcLine);
2464 }
2465 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2466}
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 1953 of file docparser.cpp.

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

2033{
2034 size_t j=0;
2035 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2036 {
2037 CHECK_FOR_COMMAND("copybrief",brief=true); // @copybrief or \copybrief
2038 CHECK_FOR_COMMAND("copydetails",brief=false); // @copydetails or \copydetails
2039 }
2040 return j;
2041}
#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 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("dot",endMarker="enddot");
2049 CHECK_FOR_COMMAND("icode",endMarker="endicode");
2050 CHECK_FOR_COMMAND("code",endMarker="endcode");
2051 CHECK_FOR_COMMAND("msc",endMarker="endmsc");
2052 CHECK_FOR_COMMAND("mermaid",endMarker="endmermaid");
2053 CHECK_FOR_COMMAND("iverbatim",endMarker="endiverbatim");
2054 CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
2055 CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
2056 CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
2057 CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
2058 CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
2059 CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
2060 CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
2061 CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
2062 CHECK_FOR_COMMAND("startuml",endMarker="enduml");
2063 }
2064 //printf("isVerbatimSection(%s)=%d)\n",qPrint(DString(&data[i]).left(10)),j);
2065 return j;
2066}

References CHECK_FOR_COMMAND.

Referenced by DocParser::processCopyDoc().

◆ nextUTF8CharPosition()

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

Definition at line 2478 of file docparser.cpp.

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

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

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

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

2069{
2070 while (i<len)
2071 {
2072 if ((data[i]=='@' || data[i]=='\\') && // start of command character
2073 (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
2074 {
2075 if (i+endMarker.length()+1<=len && dstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
2076 {
2077 return i+endMarker.length()+1;
2078 }
2079 }
2080 i++;
2081 }
2082 // oops no endmarker found...
2083 return i<len ? i+1 : len;
2084}
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 2200 of file docparser.cpp.

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

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

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

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