Doxygen
Loading...
Searching...
No Matches
docparser.cpp File Reference
#include <stdio.h>
#include <stdlib.h>
#include <cassert>
#include <ctype.h>
#include "classlist.h"
#include "cmdmapper.h"
#include "config.h"
#include "debug.h"
#include "dir.h"
#include "docparser.h"
#include "docparser_p.h"
#include "doxygen.h"
#include "filedef.h"
#include "fileinfo.h"
#include "groupdef.h"
#include "namespacedef.h"
#include "message.h"
#include "pagedef.h"
#include "portable.h"
#include "printdocvisitor.h"
#include "util.h"
#include "indexlist.h"
#include "trace.h"
#include "stringutil.h"
#include "filename.h"
#include "textdocvisitor.h"
#include "outputlist.h"
#include "htmldocvisitor.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 2019 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 2445 of file docparser.cpp.

2446{
2447 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2448 assert(parser!=nullptr);
2449 if (parser==nullptr) return nullptr;
2450 if (!srcFile.empty())
2451 {
2452 parser->context.fileName = srcFile;
2453 parser->tokenizer.setFileName(srcFile);
2454 parser->tokenizer.setLineNr(srcLine);
2455 }
2456 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2457}
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:152
DocTokenizer tokenizer
DocParserContext context
Node representing a reference to some item.
Definition docnode.h:787
void setLineNr(int lineno)
void setFileName(const DString &fileName)

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

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

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

2024{
2025 size_t j=0;
2026 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
2027 {
2028 CHECK_FOR_COMMAND("copybrief",brief=true); // @copybrief or \copybrief
2029 CHECK_FOR_COMMAND("copydetails",brief=false); // @copydetails or \copydetails
2030 }
2031 return j;
2032}
#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 2034 of file docparser.cpp.

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

References CHECK_FOR_COMMAND.

Referenced by DocParser::processCopyDoc().

◆ nextUTF8CharPosition()

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

Definition at line 2469 of file docparser.cpp.

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

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

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

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

2516{
2517 if (doc.empty()) return "";
2518 static std::mutex s_docCacheMutex;
2519 static std::unordered_map<std::string,DString> s_docCache;
2520
2521 std::lock_guard lock(s_docCacheMutex);
2522 auto it = s_docCache.find(doc.str());
2523 if (it != s_docCache.end())
2524 {
2525 //printf("Cache: [%s]->[%s]\n",qPrint(doc),qPrint(it->second));
2526 return it->second;
2527 }
2528 //printf("parseCommentAsText(%s)\n",qPrint(doc));
2529 TextStream t;
2530 auto parser { createDocParser() };
2531 auto ast { validatingParseDoc(*parser.get(),
2532 fileName,
2533 lineNr,
2534 scope,
2535 md,
2536 doc,
2537 DocOptions()
2538 .setAutolinkSupport(false))
2539 };
2540 auto astImpl = dynamic_cast<const DocNodeAST*>(ast.get());
2541 if (astImpl)
2542 {
2543 TextDocVisitor visitor(t);
2544 std::visit(visitor,astImpl->root);
2545 }
2547 int i=0;
2548 int charCnt=0;
2549 int l=static_cast<int>(result.length());
2550 while ((i=nextUTF8CharPosition(result,l,i))<l)
2551 {
2552 charCnt++;
2553 if (charCnt>=80) break;
2554 }
2555 if (charCnt>=80) // try to truncate the string
2556 {
2557 while ((i=nextUTF8CharPosition(result,l,i))<l && charCnt<100)
2558 {
2559 charCnt++;
2560 if (result.at(i)==',' ||
2561 result.at(i)=='.' ||
2562 result.at(i)=='!' ||
2563 result.at(i)=='?' ||
2564 result.at(i)=='}') // good for UTF-16 characters and } otherwise also a good point to stop the string
2565 {
2566 i++; // we want to be "behind" last inspected character
2567 break;
2568 }
2569 }
2570 }
2571 if ( i < l) result=result.left(i)+"...";
2572 s_docCache.insert(std::make_pair(doc.str(),result));
2573 return result.data();
2574}
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:690
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:341
DString left(size_t len) const
Definition dstring.h:310
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:161
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:155
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 2059 of file docparser.cpp.

2060{
2061 while (i<len)
2062 {
2063 if ((data[i]=='@' || data[i]=='\\') && // start of command character
2064 (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
2065 {
2066 if (i+endMarker.length()+1<=len && dstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
2067 {
2068 return i+endMarker.length()+1;
2069 }
2070 }
2071 i++;
2072 }
2073 // oops no endmarker found...
2074 return i<len ? i+1 : len;
2075}
int dstrncmp(const char *str1, const char *str2, size_t len)
Definition dstring.h:60

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

2198{
2199 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2200 assert(parser!=nullptr);
2201 if (parser==nullptr) return nullptr;
2202 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
2203 // md?qPrint(md->name()):"<none>",
2204 // qPrint(input));
2205 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
2206 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
2207
2208 // set initial token
2209 parser->context.token = parser->tokenizer.resetToken();
2210
2211 if (ctx && ctx!=Doxygen::globalScope &&
2214 )
2215 )
2216 {
2218 }
2219 else if (ctx && ctx->definitionType()==Definition::TypePage)
2220 {
2221 const Definition *scope = (toPageDef(ctx))->getPageScope();
2222 if (scope && scope!=Doxygen::globalScope)
2223 {
2224 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2225 }
2226 }
2227 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2228 {
2229 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2230 if (scope && scope!=Doxygen::globalScope)
2231 {
2232 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2233 }
2234 }
2235 else
2236 {
2237 parser->context.context = "";
2238 }
2239 parser->context.scope = ctx;
2240 parser->context.lang = getLanguageFromFileName(fileName);
2241
2242 if (options.indexWords() && Doxygen::searchIndex.enabled())
2243 {
2244 if (md)
2245 {
2246 parser->context.searchUrl=md->getOutputFileBase();
2248 }
2249 else if (ctx)
2250 {
2251 parser->context.searchUrl=ctx->getOutputFileBase();
2252 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2253 }
2254 }
2255 else
2256 {
2257 parser->context.searchUrl="";
2258 }
2259
2260 parser->context.fileName = fileName;
2261 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2263 DString("");
2264 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2265 parser->context.memberDef = md;
2266 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2267 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2268 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2269 parser->context.inSeeBlock = false;
2270 parser->context.inCodeStyle = false;
2271 parser->context.xmlComment = false;
2272 parser->context.insideHtmlLink = false;
2273 parser->context.includeFileText = "";
2274 parser->context.includeFileOffset = 0;
2275 parser->context.includeFileLength = 0;
2276 parser->context.isExample = options.isExample();
2277 parser->context.exampleName = options.exampleName();
2278 parser->context.hasParamCommand = false;
2279 parser->context.hasReturnCommand = false;
2280 parser->context.retvalsFound.clear();
2281 parser->context.paramsFound.clear();
2282 parser->context.markdownSupport = options.markdownSupport();
2283 parser->context.autolinkSupport = options.autolinkSupport();
2284 if (md)
2285 {
2286 const ArgumentList &al=md->isDocsForDefinition() ? md->argumentList() : md->declArgumentList();
2287 parser->context.numParameters = static_cast<int>(al.size());
2288 }
2289 else
2290 {
2291 parser->context.numParameters = 0;
2292 }
2293 parser->context.paramPosition = 1;
2294
2295 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2296 parser->tokenizer.setFileName(fileName);
2297 parser->tokenizer.setLineNr(startLine);
2298 size_t ioLen = input.length();
2299 DString inpStr = parser->processCopyDoc(input.data(),ioLen);
2300 if (inpStr.empty() || inpStr.at(inpStr.length()-1)!='\n')
2301 {
2302 inpStr+='\n';
2303 }
2304 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2305 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2307
2308 // build abstract syntax tree
2309 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2310 std::get<DocRoot>(ast->root).parse();
2311
2313 {
2314 // pretty print the result
2315 std::visit(PrintDocVisitor{},ast->root);
2316 }
2317
2318 if (md && md->isFunction())
2319 {
2320 parser->checkUnOrMultipleDocumentedParams();
2321 }
2323
2324 // reset token
2325 parser->tokenizer.resetToken();
2326
2327 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2328 // md?qPrint(md->name()):"<none>");
2329
2330 return ast;
2331}
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:133
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual DefType definitionType() const =0
virtual const DString & name() const =0
virtual DString qualifiedName() const =0
virtual DString anchor() const =0
virtual DString getOutputFileBase() const =0
DString processCopyDoc(const char *data, size_t &len)
Root node of documentation tree.
Definition docnode.h:1318
void init(const char *input, const DString &fileName, bool markdownSupport, bool insideHtmlLink)
TokenInfo * resetToken()
static NamespaceDefMutable * globalScope
Definition doxygen.h: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:481
GroupDef * toGroupDef(Definition *d)
PageDef * toPageDef(Definition *d)
Definition pagedef.cpp:653
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:4170
DString relativePathToRoot(const DString &name)
Definition util.cpp:2914
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Definition util.cpp:4631

References Definition::anchor(), MemberDef::argumentList(), DString::at(), DocOptions::autolinkSupport(), DocParserContext::autolinkSupport, DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, DString::data(), MemberDef::declArgumentList(), Definition::definitionType(), MemberDef::detectUndocumentedParams(), 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 2386 of file docparser.cpp.

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

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

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

References 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().