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)) \
{ j=i+sizeof(str); action; } while(0)
bool literal_at(const char *data, const char(&str)[N])
returns true iff data points to a substring that matches string literal str
Definition stringutil.h:101

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

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

2031{
2032 size_t j=0;
2033 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2034 {
2035 CHECK_FOR_COMMAND("copybrief",brief=true); // @copybrief or \copybrief
2036 CHECK_FOR_COMMAND("copydetails",brief=false); // @copydetails or \copydetails
2037 }
2038 return j;
2039}
#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 2041 of file docparser.cpp.

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

References CHECK_FOR_COMMAND.

Referenced by DocParser::processCopyDoc().

◆ nextUTF8CharPosition()

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

Definition at line 2476 of file docparser.cpp.

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

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

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

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

◆ parseCommentAsText()

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

Definition at line 2521 of file docparser.cpp.

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

◆ skipToEndMarker()

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

Definition at line 2066 of file docparser.cpp.

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

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

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

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

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