Doxygen
Loading...
Searching...
No Matches
docparser_p.h
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2022 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16#ifndef DOCPARSER_P_H
17#define DOCPARSER_P_H
18
19/** @file
20 * @brief Private header shared between docparser.cpp and docnode.cpp
21 */
22
23#include <cassert>
24#include <cstdint>
25#include <deque>
26#include <stack>
27#include <vector>
28
29#include "cmdmapper.h"
30#include "construct.h"
31#include "containers.h"
32#include "docnode.h"
33#include "docparser.h"
34
35class TokenInfo;
36
37using DefinitionStack = std::vector<const Definition *>;
38using DocNodeStack = std::stack<DocNodeVariant *>;
39
40template<typename T, typename Container = std::deque<T>>
41class IterableStack final : public std::stack<T, Container>
42{
43 using std::stack<T, Container>::c;
44
45public:
46
47 // expose just the iterators of the underlying container
48 auto begin() { return std::begin(c); }
49 auto end() { return std::end(c); }
50
51 auto begin() const { return std::begin(c); }
52 auto end() const { return std::end(c); }
53};
55
56/** Parser's context to store all global variables.
57 */
99
100class DocParser final : public IDocParser
101{
102 public:
104 {
105 public:
108 private:
110 };
111 void handleImg(DocNodeVariant *parent,DocNodeList &children,const HtmlAttribList &tagHtmlAttribs);
113 const DString &doc);
114 DString processCopyDoc(const char *data,size_t &len);
115 DString findAndCopyImage(const DString &fileName,DocImage::Type type, bool doWarn = true);
116 void checkArgumentName();
117 void checkRetvalName();
119 bool findDocsForMemberOrCompound(const DString &commandName,
120 DString *pDoc,
121 DString *pBrief,
122 const Definition **pDef);
124 DocNodeList &children,bool
125 handleWord=true);
127 DocNodeList &children,const DString &txt);
129 DocNodeList &children, DString &width,DString &height);
131 const DString &cmdName);
133 const DString &tagName,const HtmlAttribList *attribs);
135 const DString &tagName);
136 void handlePendingStyleCommands(DocNodeVariant *parent,DocNodeList &children, size_t numberOfElementsToClose = 0);
138 Token handleAHref(DocNodeVariant *parent,DocNodeList &children,const HtmlAttribList &tagHtmlAttribs);
140 void handleLinkedWord(DocNodeVariant *parent,DocNodeList &children,bool ignoreAutoLinkFlag=false,bool typeLinkOnly=false);
141 void handleParameterType(DocNodeVariant *parent,DocNodeList &children,const DString &paramTypes);
147 void handleRef(DocNodeVariant *parent, DocNodeList &children, char cmdChar, const DString &cmdName);
148 void handleIFile(char cmdChar,const DString &cmdName);
149 void handleILine(char cmdChar,const DString &cmdName);
150 void readTextFileByName(const DString &file,DString &text);
151 std::stack< DocParserContext > contextStack;
154 private:
155 void pushContext();
156 void popContext();
157
158};
159
160//---------------------------------------------------------------------------
161
163{
164 public:
166 : m_parser(parser), m_node(node) { m_parser->context.nodeStack.push(node); }
168 {
169#if defined(NDEBUG)
170 (void)m_node;
171 if (!m_parser->context.nodeStack.empty())
172 {
173 m_parser->context.nodeStack.pop(); // robust version that does not assert
174 }
175#else
176 assert(m_parser->context.nodeStack.top()==m_node);
177 m_parser->context.nodeStack.pop(); // error checking version
178#endif
179 }
181
182 private:
185};
186
187inline bool isPreformatted(const DocNodeVariant *n)
188{
189 return std::visit([](auto &&x)->decltype(auto) { return x.isPreformatted(); }, *n);
190}
191
192/*! Returns true iff node n is a child of a preformatted node */
193inline bool insidePRE(const DocNodeVariant *n)
194{
195 while (n)
196 {
197 if (isPreformatted(n)) return true;
198 n=parent(n);
199 }
200 return false;
201}
202
203/*! Returns true iff node n is a child of a html list item node */
204inline bool insideLI(const DocNodeVariant *n)
205{
206 while (n)
207 {
208 if (std::holds_alternative<DocHtmlListItem>(*n)) return true;
209 n=parent(n);
210 }
211 return false;
212}
213
214/*! Returns true iff node n is a child of a html list item node */
215inline bool insideBlockQuote(const DocNodeVariant *n)
216{
217 while (n)
218 {
219 if (std::holds_alternative<DocHtmlBlockQuote>(*n)) return true;
220 n=parent(n);
221 }
222 return false;
223}
224
225
226//---------------------------------------------------------------------------
227
228/*! Returns true iff node n is a child of a unordered html list node */
229inline bool insideUL(const DocNodeVariant *n)
230{
231 while (n)
232 {
233 if (std::holds_alternative<DocHtmlList>(*n) &&
234 std::get<DocHtmlList>(*n).type()==DocHtmlList::Unordered)
235 {
236 return true;
237 }
238 n=parent(n);
239 }
240 return false;
241}
242
243//---------------------------------------------------------------------------
244
245/*! Returns true iff node n is a child of a ordered html list node */
246inline bool insideOL(const DocNodeVariant *n)
247{
248 while (n)
249 {
250 if (std::holds_alternative<DocHtmlList>(*n) &&
251 std::get<DocHtmlList>(*n).type()==DocHtmlList::Ordered)
252 {
253 return true;
254 }
255 n=parent(n);
256 }
257 return false;
258}
259
260//---------------------------------------------------------------------------
261
262inline bool insideTable(const DocNodeVariant *n)
263{
264 while (n)
265 {
266 if (std::holds_alternative<DocHtmlTable>(*n)) return true;
267 n=parent(n);
268 }
269 return false;
270}
271
272//---------------------------------------------------------------------------
273
274inline bool insideDetails(const DocNodeVariant *n)
275{
276 while (n)
277 {
278 if (std::holds_alternative<DocHtmlDetails>(*n)) return true;
279 n=parent(n);
280 }
281 return false;
282}
283
284//---------------------------------------------------------------------------
285
286inline bool insideDL(const DocNodeVariant *n)
287{
288 while (n)
289 {
290 if (std::holds_alternative<DocHtmlDescList>(*n)) return true;
291 n=parent(n);
292 }
293 return false;
294}
295
296#endif
DocParser * m_parser
const DocNodeVariant * m_node
AutoNodeStack(DocParser *parser, DocNodeVariant *node)
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:88
The common base class of all entity definitions found in the sources.
Definition definition.h:77
AutoSaveContext(DocParser &parser)
void handleIFile(char cmdChar, const DString &cmdName)
std::stack< DocParserContext > contextStack
void handlePendingStyleCommands(DocNodeVariant *parent, DocNodeList &children, size_t numberOfElementsToClose=0)
DocTokenizer tokenizer
void handleInternalRef(DocNodeVariant *parent, DocNodeList &children)
void readTextFileByName(const DString &file, DString &text)
void checkRetvalName()
void errorHandleDefaultToken(DocNodeVariant *parent, Token tok, DocNodeList &children, const DString &txt)
void handleRef(DocNodeVariant *parent, DocNodeList &children, char cmdChar, const DString &cmdName)
Token handleAHref(DocNodeVariant *parent, DocNodeList &children, const HtmlAttribList &tagHtmlAttribs)
void handleStyleEnter(DocNodeVariant *parent, DocNodeList &children, DocStyleChange::Style s, const DString &tagName, const HtmlAttribList *attribs)
void handleParameterType(DocNodeVariant *parent, DocNodeList &children, const DString &paramTypes)
bool defaultHandleToken(DocNodeVariant *parent, Token &tok, DocNodeList &children, bool handleWord=true)
void handleInitialStyleCommands(DocNodeVariant *parent, DocNodeList &children)
bool findDocsForMemberOrCompound(const DString &commandName, DString *pDoc, DString *pBrief, const Definition **pDef)
DString processCopyDoc(const char *data, size_t &len)
Token handleStyleArgument(DocNodeVariant *parent, DocNodeList &children, const DString &cmdName)
void handleStyleLeave(DocNodeVariant *parent, DocNodeList &children, DocStyleChange::Style s, const DString &tagName)
void checkUnOrMultipleDocumentedParams()
void popContext()
Definition docparser.cpp:79
void defaultHandleTitleAndSize(const CommandType cmd, DocNodeVariant *parent, DocNodeList &children, DString &width, DString &height)
void handleImage(DocNodeVariant *parent, DocNodeList &children)
void handleLinkedWord(DocNodeVariant *parent, DocNodeList &children, bool ignoreAutoLinkFlag=false, bool typeLinkOnly=false)
void handleCite(DocNodeVariant *parent, DocNodeList &children)
void handlePrefix(DocNodeVariant *parent, DocNodeList &children)
void handleILine(char cmdChar, const DString &cmdName)
void checkArgumentName()
DocParserContext context
Token internalValidatingParseDoc(DocNodeVariant *parent, DocNodeList &children, const DString &doc)
void handleAnchor(DocNodeVariant *parent, DocNodeList &children)
void handleImg(DocNodeVariant *parent, DocNodeList &children, const HtmlAttribList &tagHtmlAttribs)
void handleUnclosedStyleCommands()
void pushContext()
Definition docparser.cpp:64
DString findAndCopyImage(const DString &fileName, DocImage::Type type, bool doWarn=true)
Class representing a list of HTML attributes.
Definition htmlattrib.h:31
opaque parser interface
Definition docparser.h:35
auto end() const
Definition docparser_p.h:52
auto begin() const
Definition docparser_p.h:51
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
Data associated with a token used by the comment block parser.
CommandType
Definition cmdmapper.h:30
#define NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
std::multiset< std::string > StringMultiSet
Definition containers.h:32
std::variant< DocWord, DocLinkedWord, DocURL, DocLineBreak, DocHorRuler, DocAnchor, DocCite, DocStyleChange, DocSymbol, DocEmoji, DocWhiteSpace, DocSeparator, DocVerbatim, DocInclude, DocIncOperator, DocFormula, DocIndexEntry, DocAutoList, DocAutoListItem, DocTitle, DocXRefItem, DocImage, DocDotFile, DocMscFile, DocDiaFile, DocVhdlFlow, DocLink, DocRef, DocInternalRef, DocHRef, DocHtmlHeader, DocHtmlDescTitle, DocHtmlDescList, DocSection, DocSecRefItem, DocSecRefList, DocInternal, DocParBlock, DocSimpleList, DocHtmlList, DocSimpleSect, DocSimpleSectSep, DocParamSect, DocPara, DocParamList, DocSimpleListItem, DocHtmlListItem, DocHtmlDescData, DocHtmlCell, DocHtmlCaption, DocHtmlRow, DocHtmlTable, DocHtmlBlockQuote, DocText, DocRoot, DocHtmlDetails, DocHtmlSummary, DocPlantUmlFile, DocMermaidFile > DocNodeVariant
Definition docnode.h:66
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
Definition docnode.h:1335
std::stack< DocNodeVariant * > DocNodeStack
Definition docparser_p.h:38
bool isPreformatted(const DocNodeVariant *n)
bool insideUL(const DocNodeVariant *n)
bool insideTable(const DocNodeVariant *n)
std::vector< const Definition * > DefinitionStack
Definition docparser_p.h:37
IterableStack< const DocNodeVariant * > DocStyleChangeStack
Definition docparser_p.h:54
bool insidePRE(const DocNodeVariant *n)
bool insideLI(const DocNodeVariant *n)
bool insideDL(const DocNodeVariant *n)
bool insideBlockQuote(const DocNodeVariant *n)
bool insideDetails(const DocNodeVariant *n)
bool insideOL(const DocNodeVariant *n)
Parser's context to store all global variables.
Definition docparser_p.h:59
StringMultiSet retvalsFound
Definition docparser_p.h:75
bool includeFileShowLineNo
Definition docparser_p.h:91
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
DefinitionStack copyStack
Definition docparser_p.h:69
const Definition * scope
Definition docparser_p.h:60
TokenInfo * token
Definition docparser_p.h:94
DocStyleChangeStack initialStyleStack
Definition docparser_p.h:68
DString includeFileName
Definition docparser_p.h:86
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
Definition types.h:207