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 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 QCString 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, QCString &endMarker)
static size_t skipToEndMarker (const char *data, size_t i, size_t len, const QCString &endMarker)
IDocNodeASTPtr validatingParseDoc (IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocNodeASTPtr validatingParseTitle (IDocParser &parserIntf, const QCString &fileName, int lineNr, const QCString &input)
IDocNodeASTPtr validatingParseText (IDocParser &parserIntf, const QCString &input)
IDocNodeASTPtr createRef (IDocParser &parserIntf, const QCString &target, const QCString &context, const QCString &srcFile, int srcLine)
void docFindSections (const QCString &input, const Definition *d, const QCString &fileName)

Macro Definition Documentation

◆ AUTO_TRACE

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

Definition at line 47 of file docparser.cpp.

◆ AUTO_TRACE_ADD

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

Definition at line 48 of file docparser.cpp.

◆ AUTO_TRACE_EXIT

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

Definition at line 49 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:98

Definition at line 1834 of file docparser.cpp.

1834#define CHECK_FOR_COMMAND(str,action) \
1835 do if ((i+sizeof(str)<len) && literal_at(data+i+1,str)) \
1836 { j=i+sizeof(str); action; } while(0)

Referenced by isCopyBriefOrDetailsCmd(), and isVerbatimSection().

Function Documentation

◆ createDocParser()

◆ createRef()

IDocNodeASTPtr createRef ( IDocParser & parserIntf,
const QCString & target,
const QCString & context,
const QCString & srcFile,
int srcLine )

Definition at line 2249 of file docparser.cpp.

2250{
2251 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2252 assert(parser!=nullptr);
2253 if (parser==nullptr) return nullptr;
2254 if (!srcFile.isEmpty())
2255 {
2256 parser->context.fileName = srcFile;
2257 parser->tokenizer.setFileName(srcFile);
2258 parser->tokenizer.setLineNr(srcLine);
2259 }
2260 return std::make_unique<DocNodeAST>(DocRef(parser,nullptr,target,context));
2261}
DocTokenizer tokenizer
DocParserContext context
Node representing a reference to some item.
Definition docnode.h:778
void setLineNr(int lineno)
void setFileName(const QCString &fileName)
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString fileName
Definition docparser_p.h:71

References DocParser::context, DocParserContext::fileName, QCString::isEmpty(), DocTokenizer::setFileName(), DocTokenizer::setLineNr(), and DocParser::tokenizer.

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

◆ docFindSections()

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

◆ extractCopyDocId()

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

Definition at line 1761 of file docparser.cpp.

1762{
1763 size_t s=j;
1764 int round=0;
1765 bool insideDQuote=FALSE;
1766 bool insideSQuote=FALSE;
1767 bool found=FALSE;
1768 while (j<len && !found)
1769 {
1770 if (!insideSQuote && !insideDQuote)
1771 {
1772 switch (data[j])
1773 {
1774 case '(': round++; break;
1775 case ')': round--; break;
1776 case '"': insideDQuote=TRUE; break;
1777 case '\'': insideSQuote=TRUE; break;
1778 case '\\': // fall through, begin of command
1779 case '@': // fall through, begin of command
1780 case '\t': // fall through
1781 case '\n':
1782 found=(round==0);
1783 break;
1784 case ' ': // allow spaces in cast operator (see issue #11169)
1785 found=(round==0) && (j<8 || !literal_at(data+j-8,"operator"));
1786 break;
1787 }
1788 }
1789 else if (insideSQuote) // look for single quote end
1790 {
1791 if (data[j]=='\'' && (j==0 || data[j]!='\\'))
1792 {
1793 insideSQuote=FALSE;
1794 }
1795 }
1796 else if (insideDQuote) // look for double quote end
1797 {
1798 if (data[j]=='"' && (j==0 || data[j]!='\\'))
1799 {
1800 insideDQuote=FALSE;
1801 }
1802 }
1803 if (!found) j++;
1804 }
1805
1806 // include const and volatile
1807 if (literal_at(data+j," const"))
1808 {
1809 j+=6;
1810 }
1811 else if (literal_at(data+j," volatile"))
1812 {
1813 j+=9;
1814 }
1815
1816 // allow '&' or '&&' or ' &' or ' &&' at the end
1817 size_t k=j;
1818 while (k<len && data[k]==' ') k++;
1819 if (k<len-1 && data[k]=='&' && data[k+1]=='&') j=k+2;
1820 else if (k<len && data[k]=='&' ) j=k+1;
1821
1822 // do not include punctuation added by Definition::_setBriefDescription()
1823 size_t e=j;
1824 if (j>0 && data[j-1]=='.') { e--; }
1825 QCString id(data+s,e-s);
1826 //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]);
1827 return id;
1828}
This is an alternative implementation of QCString.
Definition qcstring.h:101
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34

References FALSE, literal_at(), and TRUE.

Referenced by DocParser::processCopyDoc().

◆ isCopyBriefOrDetailsCmd()

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

Definition at line 1838 of file docparser.cpp.

1839{
1840 size_t j=0;
1841 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
1842 {
1843 CHECK_FOR_COMMAND("copybrief",brief=TRUE); // @copybrief or \copybrief
1844 CHECK_FOR_COMMAND("copydetails",brief=FALSE); // @copydetails or \copydetails
1845 }
1846 return j;
1847}
#define CHECK_FOR_COMMAND(str, action)

References CHECK_FOR_COMMAND, FALSE, and TRUE.

Referenced by DocParser::processCopyDoc().

◆ isVerbatimSection()

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

Definition at line 1849 of file docparser.cpp.

1850{
1851 size_t j=0;
1852 if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
1853 {
1854 CHECK_FOR_COMMAND("dot",endMarker="enddot");
1855 CHECK_FOR_COMMAND("icode",endMarker="endicode");
1856 CHECK_FOR_COMMAND("code",endMarker="endcode");
1857 CHECK_FOR_COMMAND("msc",endMarker="endmsc");
1858 CHECK_FOR_COMMAND("iverbatim",endMarker="endiverbatim");
1859 CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
1860 CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
1861 CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
1862 CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
1863 CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
1864 CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
1865 CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
1866 CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
1867 CHECK_FOR_COMMAND("startuml",endMarker="enduml");
1868 }
1869 //printf("isVerbatimSection(%s)=%d)\n",qPrint(QCString(&data[i]).left(10)),j);
1870 return j;
1871}

References CHECK_FOR_COMMAND.

Referenced by DocParser::processCopyDoc().

◆ skipToEndMarker()

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

Definition at line 1873 of file docparser.cpp.

1874{
1875 while (i<len)
1876 {
1877 if ((data[i]=='@' || data[i]=='\\') && // start of command character
1878 (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
1879 {
1880 if (i+endMarker.length()+1<=len && qstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
1881 {
1882 return i+endMarker.length()+1;
1883 }
1884 }
1885 i++;
1886 }
1887 // oops no endmarker found...
1888 return i<len ? i+1 : len;
1889}
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:172
int qstrncmp(const char *str1, const char *str2, size_t len)
Definition qcstring.h:75

References QCString::data(), QCString::length(), and qstrncmp().

Referenced by DocParser::processCopyDoc().

◆ validatingParseDoc()

IDocNodeASTPtr validatingParseDoc ( IDocParser & parserIntf,
const QCString & fileName,
int startLine,
const Definition * ctx,
const MemberDef * md,
const QCString & 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 2005 of file docparser.cpp.

2012{
2013 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2014 assert(parser!=nullptr);
2015 if (parser==nullptr) return nullptr;
2016 //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?qPrint(ctx->name()):"<none>",
2017 // md?qPrint(md->name()):"<none>",
2018 // qPrint(input));
2019 //printf("========== validating %s at line %d\n",qPrint(fileName),startLine);
2020 //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",qPrint(input));
2021
2022 // set initial token
2023 parser->context.token = parser->tokenizer.resetToken();
2024
2025 if (ctx && ctx!=Doxygen::globalScope &&
2028 )
2029 )
2030 {
2032 }
2033 else if (ctx && ctx->definitionType()==Definition::TypePage)
2034 {
2035 const Definition *scope = (toPageDef(ctx))->getPageScope();
2036 if (scope && scope!=Doxygen::globalScope)
2037 {
2038 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2039 }
2040 }
2041 else if (ctx && ctx->definitionType()==Definition::TypeGroup)
2042 {
2043 const Definition *scope = (toGroupDef(ctx))->getGroupScope();
2044 if (scope && scope!=Doxygen::globalScope)
2045 {
2046 parser->context.context = substitute(scope->name(),getLanguageSpecificSeparator(scope->getLanguage(),true),"::");
2047 }
2048 }
2049 else
2050 {
2051 parser->context.context = "";
2052 }
2053 parser->context.scope = ctx;
2054 parser->context.lang = getLanguageFromFileName(fileName);
2055
2056 if (options.indexWords() && Doxygen::searchIndex.enabled())
2057 {
2058 if (md)
2059 {
2060 parser->context.searchUrl=md->getOutputFileBase();
2061 Doxygen::searchIndex.setCurrentDoc(md,md->anchor(),false);
2062 }
2063 else if (ctx)
2064 {
2065 parser->context.searchUrl=ctx->getOutputFileBase();
2066 Doxygen::searchIndex.setCurrentDoc(ctx,ctx->anchor(),false);
2067 }
2068 }
2069 else
2070 {
2071 parser->context.searchUrl="";
2072 }
2073
2074 parser->context.fileName = fileName;
2075 parser->context.relPath = (!options.linkFromIndex() && ctx) ?
2077 QCString("");
2078 //printf("ctx->name=%s relPath=%s\n",qPrint(ctx->name()),qPrint(parser->context.relPath));
2079 parser->context.memberDef = md;
2080 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2081 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2082 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2083 parser->context.inSeeBlock = FALSE;
2084 parser->context.inCodeStyle = FALSE;
2085 parser->context.xmlComment = FALSE;
2086 parser->context.insideHtmlLink = FALSE;
2087 parser->context.includeFileText = "";
2088 parser->context.includeFileOffset = 0;
2089 parser->context.includeFileLength = 0;
2090 parser->context.isExample = options.isExample();
2091 parser->context.exampleName = options.exampleName();
2092 parser->context.hasParamCommand = FALSE;
2093 parser->context.hasReturnCommand = FALSE;
2094 parser->context.retvalsFound.clear();
2095 parser->context.paramsFound.clear();
2096 parser->context.markdownSupport = options.markdownSupport();
2097 parser->context.autolinkSupport = options.autolinkSupport();
2098
2099 //printf("Starting comment block at %s:%d\n",qPrint(parser->context.fileName),startLine);
2100 parser->tokenizer.setFileName(fileName);
2101 parser->tokenizer.setLineNr(startLine);
2102 size_t ioLen = input.length();
2103 QCString inpStr = parser->processCopyDoc(input.data(),ioLen);
2104 if (inpStr.isEmpty() || inpStr.at(inpStr.length()-1)!='\n')
2105 {
2106 inpStr+='\n';
2107 }
2108 //printf("processCopyDoc(in='%s' out='%s')\n",qPrint(input),qPrint(inpStr));
2109 parser->tokenizer.init(inpStr.data(),parser->context.fileName,
2111
2112 // build abstract syntax tree
2113 auto ast = std::make_unique<DocNodeAST>(DocRoot(parser,md!=nullptr,options.singleLine()));
2114 std::get<DocRoot>(ast->root).parse();
2115
2117 {
2118 // pretty print the result
2119 std::visit(PrintDocVisitor{},ast->root);
2120 }
2121
2122 if (md && md->isFunction())
2123 {
2124 parser->checkUnOrMultipleDocumentedParams();
2125 }
2127
2128 // reset token
2129 parser->tokenizer.resetToken();
2130
2131 //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?qPrint(ctx->name()):"<none>",
2132 // md?qPrint(md->name()):"<none>");
2133
2134 return ast;
2135}
@ PrintTree
Definition debug.h:34
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 QCString anchor() const =0
virtual QCString qualifiedName() const =0
virtual QCString getOutputFileBase() const =0
virtual const QCString & name() const =0
QCString processCopyDoc(const char *data, size_t &len)
Root node of documentation tree.
Definition docnode.h:1310
void init(const char *input, const QCString &fileName, bool markdownSupport, bool insideHtmlLink)
TokenInfo * resetToken()
static NamespaceDefMutable * globalScope
Definition doxygen.h:120
static SearchIndexIntf searchIndex
Definition doxygen.h:123
virtual bool isFunction() const =0
virtual void detectUndocumentedParams(bool hasParamCommand, bool hasReturnCommand) const =0
GroupDef * toGroupDef(Definition *d)
PageDef * toPageDef(Definition *d)
Definition pagedef.cpp:502
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:571
bool autolinkSupport() const
Definition docoptions.h:32
bool linkFromIndex() const
Definition docoptions.h:30
bool markdownSupport() const
Definition docoptions.h:31
QCString exampleName() const
Definition docoptions.h:28
bool indexWords() const
Definition docoptions.h:26
bool singleLine() const
Definition docoptions.h:29
bool isExample() const
Definition docoptions.h:27
StringMultiSet retvalsFound
Definition docparser_p.h:76
DocStyleChangeStack styleStack
Definition docparser_p.h:68
size_t includeFileLength
Definition docparser_p.h:88
DocNodeStack nodeStack
Definition docparser_p.h:67
StringMultiSet paramsFound
Definition docparser_p.h:77
QCString exampleName
Definition docparser_p.h:80
const Definition * scope
Definition docparser_p.h:61
QCString includeFileText
Definition docparser_p.h:86
TokenInfo * token
Definition docparser_p.h:93
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:69
SrcLangExt lang
Definition docparser_p.h:83
QCString searchUrl
Definition docparser_p.h:81
size_t includeFileOffset
Definition docparser_p.h:87
const MemberDef * memberDef
Definition docparser_p.h:78
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5191
QCString relativePathToRoot(const QCString &name)
Definition util.cpp:3560
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5897

References Definition::anchor(), QCString::at(), DocOptions::autolinkSupport(), DocParserContext::autolinkSupport, DocParser::checkUnOrMultipleDocumentedParams(), DocParser::context, DocParserContext::context, QCString::data(), Definition::definitionType(), MemberDef::detectUndocumentedParams(), DocOptions::exampleName(), DocParserContext::exampleName, FALSE, 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, QCString::isEmpty(), DocOptions::isExample(), DocParserContext::isExample, Debug::isFlagSet(), MemberDef::isFunction(), DocParserContext::lang, QCString::length(), DocOptions::linkFromIndex(), DocOptions::markdownSupport(), DocParserContext::markdownSupport, DocParserContext::memberDef, Definition::name(), DocParserContext::nodeStack, DocParserContext::paramsFound, Debug::PrintTree, DocParser::processCopyDoc(), Definition::qualifiedName(), relativePathToRoot(), DocParserContext::relPath, DocTokenizer::resetToken(), DocParserContext::retvalsFound, DocParserContext::scope, Doxygen::searchIndex, DocParserContext::searchUrl, DocTokenizer::setFileName(), DocTokenizer::setLineNr(), DocOptions::singleLine(), 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 QCString & input )

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

Definition at line 2190 of file docparser.cpp.

2191{
2192 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2193 assert(parser!=nullptr);
2194 if (parser==nullptr) return nullptr;
2195
2196 // set initial token
2197 parser->context.token = parser->tokenizer.resetToken();
2198
2199 //printf("------------ input ---------\n%s\n"
2200 // "------------ end input -----\n",input);
2201 //parser->context.token = new TokenInfo;
2202 parser->context.context = "";
2203 parser->context.fileName = "<parseText>";
2204 parser->context.relPath = "";
2205 parser->context.memberDef = nullptr;
2206 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2207 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2208 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2209 parser->context.inSeeBlock = FALSE;
2210 parser->context.inCodeStyle = FALSE;
2211 parser->context.xmlComment = FALSE;
2212 parser->context.insideHtmlLink = FALSE;
2213 parser->context.includeFileText = "";
2214 parser->context.includeFileOffset = 0;
2215 parser->context.includeFileLength = 0;
2216 parser->context.isExample = FALSE;
2217 parser->context.exampleName = "";
2218 parser->context.hasParamCommand = FALSE;
2219 parser->context.hasReturnCommand = FALSE;
2220 parser->context.retvalsFound.clear();
2221 parser->context.paramsFound.clear();
2222 parser->context.searchUrl="";
2223 parser->context.lang = SrcLangExt::Unknown;
2224 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2225 parser->context.autolinkSupport = FALSE;
2226
2227
2228 auto ast = std::make_unique<DocNodeAST>(DocText(parser));
2229
2230 if (!input.isEmpty())
2231 {
2232 parser->tokenizer.setLineNr(1);
2233 parser->tokenizer.init(input.data(),parser->context.fileName,
2235
2236 // build abstract syntax tree
2237 std::get<DocText>(ast->root).parse();
2238
2240 {
2241 // pretty print the result
2242 std::visit(PrintDocVisitor{},ast->root);
2243 }
2244 }
2245
2246 return ast;
2247}
Root node of a text fragment.
Definition docnode.h:1301
#define Config_getBool(name)
Definition config.h:33

References DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, QCString::data(), DocParserContext::exampleName, FALSE, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::inCodeStyle, DocTokenizer::init(), DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, QCString::isEmpty(), 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 QCString & fileName,
int lineNr,
const QCString & input )

Main entry point for parsing titles. These allow limited markup commands

Definition at line 2137 of file docparser.cpp.

2138{
2139 DocParser *parser = dynamic_cast<DocParser*>(&parserIntf);
2140 assert(parser!=nullptr);
2141 if (parser==nullptr) return nullptr;
2142
2143 // set initial token
2144 parser->context.token = parser->tokenizer.resetToken();
2145
2146 //printf("------------ input ---------\n%s\n"
2147 // "------------ end input -----\n",input);
2148 parser->context.context = "";
2149 parser->context.fileName = fileName;
2150 parser->context.relPath = "";
2151 parser->context.memberDef = nullptr;
2152 while (!parser->context.nodeStack.empty()) parser->context.nodeStack.pop();
2153 while (!parser->context.styleStack.empty()) parser->context.styleStack.pop();
2154 while (!parser->context.initialStyleStack.empty()) parser->context.initialStyleStack.pop();
2155 parser->context.inSeeBlock = FALSE;
2156 parser->context.inCodeStyle = FALSE;
2157 parser->context.xmlComment = FALSE;
2158 parser->context.insideHtmlLink = FALSE;
2159 parser->context.includeFileText = "";
2160 parser->context.includeFileOffset = 0;
2161 parser->context.includeFileLength = 0;
2162 parser->context.isExample = FALSE;
2163 parser->context.exampleName = "";
2164 parser->context.hasParamCommand = FALSE;
2165 parser->context.hasReturnCommand = FALSE;
2166 parser->context.retvalsFound.clear();
2167 parser->context.paramsFound.clear();
2168 parser->context.searchUrl="";
2169 parser->context.lang = SrcLangExt::Unknown;
2170 parser->context.markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
2171 parser->context.autolinkSupport = false;
2172
2173 auto ast = std::make_unique<DocNodeAST>(DocTitle(parser,nullptr));
2174
2175 if (!input.isEmpty())
2176 {
2177 // build abstract syntax tree from title string
2178 std::get<DocTitle>(ast->root).parseFromString(nullptr,input);
2179
2181 {
2182 // pretty print the result
2183 std::visit(PrintDocVisitor{},ast->root);
2184 }
2185 }
2186
2187 return ast;
2188}
Node representing a simple section title.
Definition docnode.h:608

References DocParserContext::autolinkSupport, Config_getBool, DocParser::context, DocParserContext::context, DocParserContext::exampleName, FALSE, DocParserContext::fileName, DocParserContext::hasParamCommand, DocParserContext::hasReturnCommand, DocParserContext::includeFileLength, DocParserContext::includeFileOffset, DocParserContext::includeFileText, DocParserContext::inCodeStyle, DocParserContext::initialStyleStack, DocParserContext::inSeeBlock, DocParserContext::insideHtmlLink, QCString::isEmpty(), 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().