home
readme
diff
tree
note
docs
0commit e188783659b9bc3b9993a647e93ed110e7f41db6
1Author: Mason Wright <mason@lakefox.net>
2Date: Sun Jun 29 16:50:58 2025 -0600
3
4 Fixed partSelectorParts matching on spaces
5
6diff --git a/.gitignore b/.gitignore
7index 18d2eaf..d6a751d 100644
8--- a/.gitignore
9+++ b/.gitignore
10@@ -1,2 +1,3 @@
11 build/
12 main
13+docs/
14diff --git a/Makefile b/Makefile
15index 7d1531f..88a1807 100644
16--- a/Makefile
17+++ b/Makefile
18@@ -44,4 +44,4 @@ run:
19 clear && ./main
20
21 docs:
22- cd ../build && ./git.sh && ./tracker.sh
23+ doxygen config && cd ../build && ./git.sh && ./tracker.sh
24diff --git a/config b/config
25new file mode 100644
26index 0000000..34b3cfa
27--- /dev/null
28+++ b/config
29@@ -0,0 +1,2863 @@
30+# Doxyfile 1.9.8
31+
32+# This file describes the settings to be used by the documentation system
33+# doxygen (www.doxygen.org) for a project.
34+#
35+# All text after a double hash (##) is considered a comment and is placed in
36+# front of the TAG it is preceding.
37+#
38+# All text after a single hash (#) is considered a comment and will be ignored.
39+# The format is:
40+# TAG = value [value, ...]
41+# For lists, items can also be appended using:
42+# TAG += value [value, ...]
43+# Values that contain spaces should be placed between quotes (\" \").
44+#
45+# Note:
46+#
47+# Use doxygen to compare the used configuration file with the template
48+# configuration file:
49+# doxygen -x [configFile]
50+# Use doxygen to compare the used configuration file with the template
51+# configuration file without replacing the environment variables or CMake type
52+# replacement variables:
53+# doxygen -x_noenv [configFile]
54+
55+#---------------------------------------------------------------------------
56+# Project related configuration options
57+#---------------------------------------------------------------------------
58+
59+# This tag specifies the encoding used for all characters in the configuration
60+# file that follow. The default is UTF-8 which is also the encoding used for all
61+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
62+# iconv built into libc) for the transcoding. See
63+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
64+# The default value is: UTF-8.
65+
66+DOXYFILE_ENCODING = UTF-8
67+
68+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
69+# double-quotes, unless you are using Doxywizard) that should identify the
70+# project for which the documentation is generated. This name is used in the
71+# title of most generated pages and in a few other places.
72+# The default value is: My Project.
73+
74+PROJECT_NAME = "Grim"
75+
76+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
77+# could be handy for archiving the generated documentation or if some version
78+# control system is used.
79+
80+PROJECT_NUMBER =
81+
82+# Using the PROJECT_BRIEF tag one can provide an optional one line description
83+# for a project that appears at the top of each page and should give viewer a
84+# quick idea about the purpose of the project. Keep the description short.
85+
86+PROJECT_BRIEF = "A HTML/CSS rendering engine"
87+
88+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
89+# in the documentation. The maximum height of the logo should not exceed 55
90+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
91+# the logo to the output directory.
92+
93+PROJECT_LOGO =
94+
95+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
96+# into which the generated documentation will be written. If a relative path is
97+# entered, it will be relative to the location where doxygen was started. If
98+# left blank the current directory will be used.
99+
100+OUTPUT_DIRECTORY = "docs/"
101+
102+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
103+# sub-directories (in 2 levels) under the output directory of each output format
104+# and will distribute the generated files over these directories. Enabling this
105+# option can be useful when feeding doxygen a huge amount of source files, where
106+# putting all generated files in the same directory would otherwise causes
107+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
108+# control the number of sub-directories.
109+# The default value is: NO.
110+
111+CREATE_SUBDIRS = NO
112+
113+# Controls the number of sub-directories that will be created when
114+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
115+# level increment doubles the number of directories, resulting in 4096
116+# directories at level 8 which is the default and also the maximum value. The
117+# sub-directories are organized in 2 levels, the first level always has a fixed
118+# number of 16 directories.
119+# Minimum value: 0, maximum value: 8, default value: 8.
120+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
121+
122+CREATE_SUBDIRS_LEVEL = 8
123+
124+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
125+# characters to appear in the names of generated files. If set to NO, non-ASCII
126+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
127+# U+3044.
128+# The default value is: NO.
129+
130+ALLOW_UNICODE_NAMES = NO
131+
132+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
133+# documentation generated by doxygen is written. Doxygen will use this
134+# information to generate all constant output in the proper language.
135+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
136+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
137+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
138+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
139+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
140+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
141+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
142+# Swedish, Turkish, Ukrainian and Vietnamese.
143+# The default value is: English.
144+
145+OUTPUT_LANGUAGE = English
146+
147+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
148+# descriptions after the members that are listed in the file and class
149+# documentation (similar to Javadoc). Set to NO to disable this.
150+# The default value is: YES.
151+
152+BRIEF_MEMBER_DESC = YES
153+
154+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
155+# description of a member or function before the detailed description
156+#
157+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
158+# brief descriptions will be completely suppressed.
159+# The default value is: YES.
160+
161+REPEAT_BRIEF = YES
162+
163+# This tag implements a quasi-intelligent brief description abbreviator that is
164+# used to form the text in various listings. Each string in this list, if found
165+# as the leading text of the brief description, will be stripped from the text
166+# and the result, after processing the whole list, is used as the annotated
167+# text. Otherwise, the brief description is used as-is. If left blank, the
168+# following values are used ($name is automatically replaced with the name of
169+# the entity):The $name class, The $name widget, The $name file, is, provides,
170+# specifies, contains, represents, a, an and the.
171+
172+ABBREVIATE_BRIEF = "The $name class" \
173+ "The $name widget" \
174+ "The $name file" \
175+ is \
176+ provides \
177+ specifies \
178+ contains \
179+ represents \
180+ a \
181+ an \
182+ the
183+
184+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
185+# doxygen will generate a detailed section even if there is only a brief
186+# description.
187+# The default value is: NO.
188+
189+ALWAYS_DETAILED_SEC = NO
190+
191+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
192+# inherited members of a class in the documentation of that class as if those
193+# members were ordinary class members. Constructors, destructors and assignment
194+# operators of the base classes will not be shown.
195+# The default value is: NO.
196+
197+INLINE_INHERITED_MEMB = NO
198+
199+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
200+# before files name in the file list and in the header files. If set to NO the
201+# shortest path that makes the file name unique will be used
202+# The default value is: YES.
203+
204+FULL_PATH_NAMES = YES
205+
206+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
207+# Stripping is only done if one of the specified strings matches the left-hand
208+# part of the path. The tag can be used to show relative paths in the file list.
209+# If left blank the directory from which doxygen is run is used as the path to
210+# strip.
211+#
212+# Note that you can specify absolute paths here, but also relative paths, which
213+# will be relative from the directory where doxygen is started.
214+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
215+
216+STRIP_FROM_PATH =
217+
218+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
219+# path mentioned in the documentation of a class, which tells the reader which
220+# header file to include in order to use a class. If left blank only the name of
221+# the header file containing the class definition is used. Otherwise one should
222+# specify the list of include paths that are normally passed to the compiler
223+# using the -I flag.
224+
225+STRIP_FROM_INC_PATH =
226+
227+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
228+# less readable) file names. This can be useful is your file systems doesn't
229+# support long names like on DOS, Mac, or CD-ROM.
230+# The default value is: NO.
231+
232+SHORT_NAMES = NO
233+
234+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
235+# first line (until the first dot) of a Javadoc-style comment as the brief
236+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
237+# style comments (thus requiring an explicit @brief command for a brief
238+# description.)
239+# The default value is: NO.
240+
241+JAVADOC_AUTOBRIEF = NO
242+
243+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
244+# such as
245+# /***************
246+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
247+# Javadoc-style will behave just like regular comments and it will not be
248+# interpreted by doxygen.
249+# The default value is: NO.
250+
251+JAVADOC_BANNER = NO
252+
253+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
254+# line (until the first dot) of a Qt-style comment as the brief description. If
255+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
256+# requiring an explicit \brief command for a brief description.)
257+# The default value is: NO.
258+
259+QT_AUTOBRIEF = NO
260+
261+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
262+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
263+# a brief description. This used to be the default behavior. The new default is
264+# to treat a multi-line C++ comment block as a detailed description. Set this
265+# tag to YES if you prefer the old behavior instead.
266+#
267+# Note that setting this tag to YES also means that rational rose comments are
268+# not recognized any more.
269+# The default value is: NO.
270+
271+MULTILINE_CPP_IS_BRIEF = NO
272+
273+# By default Python docstrings are displayed as preformatted text and doxygen's
274+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
275+# doxygen's special commands can be used and the contents of the docstring
276+# documentation blocks is shown as doxygen documentation.
277+# The default value is: YES.
278+
279+PYTHON_DOCSTRING = YES
280+
281+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
282+# documentation from any documented member that it re-implements.
283+# The default value is: YES.
284+
285+INHERIT_DOCS = YES
286+
287+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
288+# page for each member. If set to NO, the documentation of a member will be part
289+# of the file/class/namespace that contains it.
290+# The default value is: NO.
291+
292+SEPARATE_MEMBER_PAGES = NO
293+
294+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
295+# uses this value to replace tabs by spaces in code fragments.
296+# Minimum value: 1, maximum value: 16, default value: 4.
297+
298+TAB_SIZE = 4
299+
300+# This tag can be used to specify a number of aliases that act as commands in
301+# the documentation. An alias has the form:
302+# name=value
303+# For example adding
304+# "sideeffect=@par Side Effects:^^"
305+# will allow you to put the command \sideeffect (or @sideeffect) in the
306+# documentation, which will result in a user-defined paragraph with heading
307+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
308+# to insert newlines (in the resulting output). You can put ^^ in the value part
309+# of an alias to insert a newline as if a physical newline was in the original
310+# file. When you need a literal { or } or , in the value part of an alias you
311+# have to escape them by means of a backslash (\), this can lead to conflicts
312+# with the commands \{ and \} for these it is advised to use the version @{ and
313+# @} or use a double escape (\\{ and \\})
314+
315+ALIASES =
316+
317+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
318+# only. Doxygen will then generate output that is more tailored for C. For
319+# instance, some of the names that are used will be different. The list of all
320+# members will be omitted, etc.
321+# The default value is: NO.
322+
323+OPTIMIZE_OUTPUT_FOR_C = NO
324+
325+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
326+# Python sources only. Doxygen will then generate output that is more tailored
327+# for that language. For instance, namespaces will be presented as packages,
328+# qualified scopes will look different, etc.
329+# The default value is: NO.
330+
331+OPTIMIZE_OUTPUT_JAVA = NO
332+
333+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
334+# sources. Doxygen will then generate output that is tailored for Fortran.
335+# The default value is: NO.
336+
337+OPTIMIZE_FOR_FORTRAN = NO
338+
339+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
340+# sources. Doxygen will then generate output that is tailored for VHDL.
341+# The default value is: NO.
342+
343+OPTIMIZE_OUTPUT_VHDL = NO
344+
345+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
346+# sources only. Doxygen will then generate output that is more tailored for that
347+# language. For instance, namespaces will be presented as modules, types will be
348+# separated into more groups, etc.
349+# The default value is: NO.
350+
351+OPTIMIZE_OUTPUT_SLICE = NO
352+
353+# Doxygen selects the parser to use depending on the extension of the files it
354+# parses. With this tag you can assign which parser to use for a given
355+# extension. Doxygen has a built-in mapping, but you can override or extend it
356+# using this tag. The format is ext=language, where ext is a file extension, and
357+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
358+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
359+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
360+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
361+# tries to guess whether the code is fixed or free formatted code, this is the
362+# default for Fortran type files). For instance to make doxygen treat .inc files
363+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
364+# use: inc=Fortran f=C.
365+#
366+# Note: For files without extension you can use no_extension as a placeholder.
367+#
368+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
369+# the files are not read by doxygen. When specifying no_extension you should add
370+# * to the FILE_PATTERNS.
371+#
372+# Note see also the list of default file extension mappings.
373+
374+EXTENSION_MAPPING =
375+
376+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
377+# according to the Markdown format, which allows for more readable
378+# documentation. See https://daringfireball.net/projects/markdown/ for details.
379+# The output of markdown processing is further processed by doxygen, so you can
380+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
381+# case of backward compatibilities issues.
382+# The default value is: YES.
383+
384+MARKDOWN_SUPPORT = YES
385+
386+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
387+# to that level are automatically included in the table of contents, even if
388+# they do not have an id attribute.
389+# Note: This feature currently applies only to Markdown headings.
390+# Minimum value: 0, maximum value: 99, default value: 5.
391+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
392+
393+TOC_INCLUDE_HEADINGS = 5
394+
395+# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to
396+# generate identifiers for the Markdown headings. Note: Every identifier is
397+# unique.
398+# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a
399+# sequence number starting at 0 and GITHUB use the lower case version of title
400+# with any whitespace replaced by '-' and punctuation characters removed.
401+# The default value is: DOXYGEN.
402+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
403+
404+MARKDOWN_ID_STYLE = DOXYGEN
405+
406+# When enabled doxygen tries to link words that correspond to documented
407+# classes, or namespaces to their corresponding documentation. Such a link can
408+# be prevented in individual cases by putting a % sign in front of the word or
409+# globally by setting AUTOLINK_SUPPORT to NO.
410+# The default value is: YES.
411+
412+AUTOLINK_SUPPORT = YES
413+
414+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
415+# to include (a tag file for) the STL sources as input, then you should set this
416+# tag to YES in order to let doxygen match functions declarations and
417+# definitions whose arguments contain STL classes (e.g. func(std::string);
418+# versus func(std::string) {}). This also make the inheritance and collaboration
419+# diagrams that involve STL classes more complete and accurate.
420+# The default value is: NO.
421+
422+BUILTIN_STL_SUPPORT = NO
423+
424+# If you use Microsoft's C++/CLI language, you should set this option to YES to
425+# enable parsing support.
426+# The default value is: NO.
427+
428+CPP_CLI_SUPPORT = NO
429+
430+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
431+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
432+# will parse them like normal C++ but will assume all classes use public instead
433+# of private inheritance when no explicit protection keyword is present.
434+# The default value is: NO.
435+
436+SIP_SUPPORT = NO
437+
438+# For Microsoft's IDL there are propget and propput attributes to indicate
439+# getter and setter methods for a property. Setting this option to YES will make
440+# doxygen to replace the get and set methods by a property in the documentation.
441+# This will only work if the methods are indeed getting or setting a simple
442+# type. If this is not the case, or you want to show the methods anyway, you
443+# should set this option to NO.
444+# The default value is: YES.
445+
446+IDL_PROPERTY_SUPPORT = YES
447+
448+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
449+# tag is set to YES then doxygen will reuse the documentation of the first
450+# member in the group (if any) for the other members of the group. By default
451+# all members of a group must be documented explicitly.
452+# The default value is: NO.
453+
454+DISTRIBUTE_GROUP_DOC = NO
455+
456+# If one adds a struct or class to a group and this option is enabled, then also
457+# any nested class or struct is added to the same group. By default this option
458+# is disabled and one has to add nested compounds explicitly via \ingroup.
459+# The default value is: NO.
460+
461+GROUP_NESTED_COMPOUNDS = NO
462+
463+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
464+# (for instance a group of public functions) to be put as a subgroup of that
465+# type (e.g. under the Public Functions section). Set it to NO to prevent
466+# subgrouping. Alternatively, this can be done per class using the
467+# \nosubgrouping command.
468+# The default value is: YES.
469+
470+SUBGROUPING = YES
471+
472+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
473+# are shown inside the group in which they are included (e.g. using \ingroup)
474+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
475+# and RTF).
476+#
477+# Note that this feature does not work in combination with
478+# SEPARATE_MEMBER_PAGES.
479+# The default value is: NO.
480+
481+INLINE_GROUPED_CLASSES = NO
482+
483+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
484+# with only public data fields or simple typedef fields will be shown inline in
485+# the documentation of the scope in which they are defined (i.e. file,
486+# namespace, or group documentation), provided this scope is documented. If set
487+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
488+# Man pages) or section (for LaTeX and RTF).
489+# The default value is: NO.
490+
491+INLINE_SIMPLE_STRUCTS = NO
492+
493+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
494+# enum is documented as struct, union, or enum with the name of the typedef. So
495+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
496+# with name TypeT. When disabled the typedef will appear as a member of a file,
497+# namespace, or class. And the struct will be named TypeS. This can typically be
498+# useful for C code in case the coding convention dictates that all compound
499+# types are typedef'ed and only the typedef is referenced, never the tag name.
500+# The default value is: NO.
501+
502+TYPEDEF_HIDES_STRUCT = NO
503+
504+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
505+# cache is used to resolve symbols given their name and scope. Since this can be
506+# an expensive process and often the same symbol appears multiple times in the
507+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
508+# doxygen will become slower. If the cache is too large, memory is wasted. The
509+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
510+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
511+# symbols. At the end of a run doxygen will report the cache usage and suggest
512+# the optimal cache size from a speed point of view.
513+# Minimum value: 0, maximum value: 9, default value: 0.
514+
515+LOOKUP_CACHE_SIZE = 0
516+
517+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
518+# during processing. When set to 0 doxygen will based this on the number of
519+# cores available in the system. You can set it explicitly to a value larger
520+# than 0 to get more control over the balance between CPU load and processing
521+# speed. At this moment only the input processing can be done using multiple
522+# threads. Since this is still an experimental feature the default is set to 1,
523+# which effectively disables parallel processing. Please report any issues you
524+# encounter. Generating dot graphs in parallel is controlled by the
525+# DOT_NUM_THREADS setting.
526+# Minimum value: 0, maximum value: 32, default value: 1.
527+
528+NUM_PROC_THREADS = 1
529+
530+# If the TIMESTAMP tag is set different from NO then each generated page will
531+# contain the date or date and time when the page was generated. Setting this to
532+# NO can help when comparing the output of multiple runs.
533+# Possible values are: YES, NO, DATETIME and DATE.
534+# The default value is: NO.
535+
536+TIMESTAMP = NO
537+
538+#---------------------------------------------------------------------------
539+# Build related configuration options
540+#---------------------------------------------------------------------------
541+
542+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
543+# documentation are documented, even if no documentation was available. Private
544+# class members and static file members will be hidden unless the
545+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
546+# Note: This will also disable the warnings about undocumented members that are
547+# normally produced when WARNINGS is set to YES.
548+# The default value is: NO.
549+
550+EXTRACT_ALL = NO
551+
552+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
553+# be included in the documentation.
554+# The default value is: NO.
555+
556+EXTRACT_PRIVATE = NO
557+
558+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
559+# methods of a class will be included in the documentation.
560+# The default value is: NO.
561+
562+EXTRACT_PRIV_VIRTUAL = NO
563+
564+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
565+# scope will be included in the documentation.
566+# The default value is: NO.
567+
568+EXTRACT_PACKAGE = NO
569+
570+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
571+# included in the documentation.
572+# The default value is: NO.
573+
574+EXTRACT_STATIC = NO
575+
576+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
577+# locally in source files will be included in the documentation. If set to NO,
578+# only classes defined in header files are included. Does not have any effect
579+# for Java sources.
580+# The default value is: YES.
581+
582+EXTRACT_LOCAL_CLASSES = YES
583+
584+# This flag is only useful for Objective-C code. If set to YES, local methods,
585+# which are defined in the implementation section but not in the interface are
586+# included in the documentation. If set to NO, only methods in the interface are
587+# included.
588+# The default value is: NO.
589+
590+EXTRACT_LOCAL_METHODS = NO
591+
592+# If this flag is set to YES, the members of anonymous namespaces will be
593+# extracted and appear in the documentation as a namespace called
594+# 'anonymous_namespace{file}', where file will be replaced with the base name of
595+# the file that contains the anonymous namespace. By default anonymous namespace
596+# are hidden.
597+# The default value is: NO.
598+
599+EXTRACT_ANON_NSPACES = NO
600+
601+# If this flag is set to YES, the name of an unnamed parameter in a declaration
602+# will be determined by the corresponding definition. By default unnamed
603+# parameters remain unnamed in the output.
604+# The default value is: YES.
605+
606+RESOLVE_UNNAMED_PARAMS = YES
607+
608+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
609+# undocumented members inside documented classes or files. If set to NO these
610+# members will be included in the various overviews, but no documentation
611+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
612+# The default value is: NO.
613+
614+HIDE_UNDOC_MEMBERS = NO
615+
616+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
617+# undocumented classes that are normally visible in the class hierarchy. If set
618+# to NO, these classes will be included in the various overviews. This option
619+# will also hide undocumented C++ concepts if enabled. This option has no effect
620+# if EXTRACT_ALL is enabled.
621+# The default value is: NO.
622+
623+HIDE_UNDOC_CLASSES = NO
624+
625+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
626+# declarations. If set to NO, these declarations will be included in the
627+# documentation.
628+# The default value is: NO.
629+
630+HIDE_FRIEND_COMPOUNDS = NO
631+
632+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
633+# documentation blocks found inside the body of a function. If set to NO, these
634+# blocks will be appended to the function's detailed documentation block.
635+# The default value is: NO.
636+
637+HIDE_IN_BODY_DOCS = NO
638+
639+# The INTERNAL_DOCS tag determines if documentation that is typed after a
640+# \internal command is included. If the tag is set to NO then the documentation
641+# will be excluded. Set it to YES to include the internal documentation.
642+# The default value is: NO.
643+
644+INTERNAL_DOCS = NO
645+
646+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
647+# able to match the capabilities of the underlying filesystem. In case the
648+# filesystem is case sensitive (i.e. it supports files in the same directory
649+# whose names only differ in casing), the option must be set to YES to properly
650+# deal with such files in case they appear in the input. For filesystems that
651+# are not case sensitive the option should be set to NO to properly deal with
652+# output files written for symbols that only differ in casing, such as for two
653+# classes, one named CLASS and the other named Class, and to also support
654+# references to files without having to specify the exact matching casing. On
655+# Windows (including Cygwin) and MacOS, users should typically set this option
656+# to NO, whereas on Linux or other Unix flavors it should typically be set to
657+# YES.
658+# Possible values are: SYSTEM, NO and YES.
659+# The default value is: SYSTEM.
660+
661+CASE_SENSE_NAMES = SYSTEM
662+
663+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
664+# their full class and namespace scopes in the documentation. If set to YES, the
665+# scope will be hidden.
666+# The default value is: NO.
667+
668+HIDE_SCOPE_NAMES = NO
669+
670+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
671+# append additional text to a page's title, such as Class Reference. If set to
672+# YES the compound reference will be hidden.
673+# The default value is: NO.
674+
675+HIDE_COMPOUND_REFERENCE= NO
676+
677+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
678+# will show which file needs to be included to use the class.
679+# The default value is: YES.
680+
681+SHOW_HEADERFILE = YES
682+
683+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
684+# the files that are included by a file in the documentation of that file.
685+# The default value is: YES.
686+
687+SHOW_INCLUDE_FILES = YES
688+
689+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
690+# grouped member an include statement to the documentation, telling the reader
691+# which file to include in order to use the member.
692+# The default value is: NO.
693+
694+SHOW_GROUPED_MEMB_INC = NO
695+
696+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
697+# files with double quotes in the documentation rather than with sharp brackets.
698+# The default value is: NO.
699+
700+FORCE_LOCAL_INCLUDES = NO
701+
702+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
703+# documentation for inline members.
704+# The default value is: YES.
705+
706+INLINE_INFO = YES
707+
708+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
709+# (detailed) documentation of file and class members alphabetically by member
710+# name. If set to NO, the members will appear in declaration order.
711+# The default value is: YES.
712+
713+SORT_MEMBER_DOCS = YES
714+
715+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
716+# descriptions of file, namespace and class members alphabetically by member
717+# name. If set to NO, the members will appear in declaration order. Note that
718+# this will also influence the order of the classes in the class list.
719+# The default value is: NO.
720+
721+SORT_BRIEF_DOCS = NO
722+
723+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
724+# (brief and detailed) documentation of class members so that constructors and
725+# destructors are listed first. If set to NO the constructors will appear in the
726+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
727+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
728+# member documentation.
729+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
730+# detailed member documentation.
731+# The default value is: NO.
732+
733+SORT_MEMBERS_CTORS_1ST = NO
734+
735+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
736+# of group names into alphabetical order. If set to NO the group names will
737+# appear in their defined order.
738+# The default value is: NO.
739+
740+SORT_GROUP_NAMES = NO
741+
742+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
743+# fully-qualified names, including namespaces. If set to NO, the class list will
744+# be sorted only by class name, not including the namespace part.
745+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
746+# Note: This option applies only to the class list, not to the alphabetical
747+# list.
748+# The default value is: NO.
749+
750+SORT_BY_SCOPE_NAME = NO
751+
752+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
753+# type resolution of all parameters of a function it will reject a match between
754+# the prototype and the implementation of a member function even if there is
755+# only one candidate or it is obvious which candidate to choose by doing a
756+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
757+# accept a match between prototype and implementation in such cases.
758+# The default value is: NO.
759+
760+STRICT_PROTO_MATCHING = NO
761+
762+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
763+# list. This list is created by putting \todo commands in the documentation.
764+# The default value is: YES.
765+
766+GENERATE_TODOLIST = YES
767+
768+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
769+# list. This list is created by putting \test commands in the documentation.
770+# The default value is: YES.
771+
772+GENERATE_TESTLIST = YES
773+
774+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
775+# list. This list is created by putting \bug commands in the documentation.
776+# The default value is: YES.
777+
778+GENERATE_BUGLIST = YES
779+
780+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
781+# the deprecated list. This list is created by putting \deprecated commands in
782+# the documentation.
783+# The default value is: YES.
784+
785+GENERATE_DEPRECATEDLIST= YES
786+
787+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
788+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
789+# ... \endcond blocks.
790+
791+ENABLED_SECTIONS =
792+
793+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
794+# initial value of a variable or macro / define can have for it to appear in the
795+# documentation. If the initializer consists of more lines than specified here
796+# it will be hidden. Use a value of 0 to hide initializers completely. The
797+# appearance of the value of individual variables and macros / defines can be
798+# controlled using \showinitializer or \hideinitializer command in the
799+# documentation regardless of this setting.
800+# Minimum value: 0, maximum value: 10000, default value: 30.
801+
802+MAX_INITIALIZER_LINES = 30
803+
804+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
805+# the bottom of the documentation of classes and structs. If set to YES, the
806+# list will mention the files that were used to generate the documentation.
807+# The default value is: YES.
808+
809+SHOW_USED_FILES = YES
810+
811+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
812+# will remove the Files entry from the Quick Index and from the Folder Tree View
813+# (if specified).
814+# The default value is: YES.
815+
816+SHOW_FILES = YES
817+
818+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
819+# page. This will remove the Namespaces entry from the Quick Index and from the
820+# Folder Tree View (if specified).
821+# The default value is: YES.
822+
823+SHOW_NAMESPACES = YES
824+
825+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
826+# doxygen should invoke to get the current version for each file (typically from
827+# the version control system). Doxygen will invoke the program by executing (via
828+# popen()) the command command input-file, where command is the value of the
829+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
830+# by doxygen. Whatever the program writes to standard output is used as the file
831+# version. For an example see the documentation.
832+
833+FILE_VERSION_FILTER =
834+
835+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
836+# by doxygen. The layout file controls the global structure of the generated
837+# output files in an output format independent way. To create the layout file
838+# that represents doxygen's defaults, run doxygen with the -l option. You can
839+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
840+# will be used as the name of the layout file. See also section "Changing the
841+# layout of pages" for information.
842+#
843+# Note that if you run doxygen from a directory containing a file called
844+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
845+# tag is left empty.
846+
847+LAYOUT_FILE =
848+
849+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
850+# the reference definitions. This must be a list of .bib files. The .bib
851+# extension is automatically appended if omitted. This requires the bibtex tool
852+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
853+# For LaTeX the style of the bibliography can be controlled using
854+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
855+# search path. See also \cite for info how to create references.
856+
857+CITE_BIB_FILES =
858+
859+#---------------------------------------------------------------------------
860+# Configuration options related to warning and progress messages
861+#---------------------------------------------------------------------------
862+
863+# The QUIET tag can be used to turn on/off the messages that are generated to
864+# standard output by doxygen. If QUIET is set to YES this implies that the
865+# messages are off.
866+# The default value is: NO.
867+
868+QUIET = NO
869+
870+# The WARNINGS tag can be used to turn on/off the warning messages that are
871+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
872+# this implies that the warnings are on.
873+#
874+# Tip: Turn warnings on while writing the documentation.
875+# The default value is: YES.
876+
877+WARNINGS = YES
878+
879+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
880+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
881+# will automatically be disabled.
882+# The default value is: YES.
883+
884+WARN_IF_UNDOCUMENTED = YES
885+
886+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
887+# potential errors in the documentation, such as documenting some parameters in
888+# a documented function twice, or documenting parameters that don't exist or
889+# using markup commands wrongly.
890+# The default value is: YES.
891+
892+WARN_IF_DOC_ERROR = YES
893+
894+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
895+# function parameter documentation. If set to NO, doxygen will accept that some
896+# parameters have no documentation without warning.
897+# The default value is: YES.
898+
899+WARN_IF_INCOMPLETE_DOC = YES
900+
901+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
902+# are documented, but have no documentation for their parameters or return
903+# value. If set to NO, doxygen will only warn about wrong parameter
904+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
905+# set to YES then this flag will automatically be disabled. See also
906+# WARN_IF_INCOMPLETE_DOC
907+# The default value is: NO.
908+
909+WARN_NO_PARAMDOC = NO
910+
911+# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about
912+# undocumented enumeration values. If set to NO, doxygen will accept
913+# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
914+# will automatically be disabled.
915+# The default value is: NO.
916+
917+WARN_IF_UNDOC_ENUM_VAL = NO
918+
919+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
920+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
921+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
922+# at the end of the doxygen process doxygen will return with a non-zero status.
923+# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves
924+# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not
925+# write the warning messages in between other messages but write them at the end
926+# of a run, in case a WARN_LOGFILE is defined the warning messages will be
927+# besides being in the defined file also be shown at the end of a run, unless
928+# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case
929+# the behavior will remain as with the setting FAIL_ON_WARNINGS.
930+# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT.
931+# The default value is: NO.
932+
933+WARN_AS_ERROR = NO
934+
935+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
936+# can produce. The string should contain the $file, $line, and $text tags, which
937+# will be replaced by the file and line number from which the warning originated
938+# and the warning text. Optionally the format may contain $version, which will
939+# be replaced by the version of the file (if it could be obtained via
940+# FILE_VERSION_FILTER)
941+# See also: WARN_LINE_FORMAT
942+# The default value is: $file:$line: $text.
943+
944+WARN_FORMAT = "$file:$line: $text"
945+
946+# In the $text part of the WARN_FORMAT command it is possible that a reference
947+# to a more specific place is given. To make it easier to jump to this place
948+# (outside of doxygen) the user can define a custom "cut" / "paste" string.
949+# Example:
950+# WARN_LINE_FORMAT = "'vi $file +$line'"
951+# See also: WARN_FORMAT
952+# The default value is: at line $line of file $file.
953+
954+WARN_LINE_FORMAT = "at line $line of file $file"
955+
956+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
957+# messages should be written. If left blank the output is written to standard
958+# error (stderr). In case the file specified cannot be opened for writing the
959+# warning and error messages are written to standard error. When as file - is
960+# specified the warning and error messages are written to standard output
961+# (stdout).
962+
963+WARN_LOGFILE =
964+
965+#---------------------------------------------------------------------------
966+# Configuration options related to the input files
967+#---------------------------------------------------------------------------
968+
969+# The INPUT tag is used to specify the files and/or directories that contain
970+# documented source files. You may enter file names like myfile.cpp or
971+# directories like /usr/src/myproject. Separate the files or directories with
972+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
973+# Note: If this tag is empty the current directory is searched.
974+
975+INPUT =
976+
977+# This tag can be used to specify the character encoding of the source files
978+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
979+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
980+# documentation (see:
981+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
982+# See also: INPUT_FILE_ENCODING
983+# The default value is: UTF-8.
984+
985+INPUT_ENCODING = UTF-8
986+
987+# This tag can be used to specify the character encoding of the source files
988+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
989+# character encoding on a per file pattern basis. Doxygen will compare the file
990+# name with each pattern and apply the encoding instead of the default
991+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
992+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
993+# "INPUT_ENCODING" for further information on supported encodings.
994+
995+INPUT_FILE_ENCODING =
996+
997+# If the value of the INPUT tag contains directories, you can use the
998+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
999+# *.h) to filter out the source-files in the directories.
1000+#
1001+# Note that for custom extensions or not directly supported extensions you also
1002+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
1003+# read by doxygen.
1004+#
1005+# Note the list of default checked file patterns might differ from the list of
1006+# default file extension mappings.
1007+#
1008+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm,
1009+# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl,
1010+# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php,
1011+# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be
1012+# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
1013+# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.
1014+
1015+FILE_PATTERNS = *.c \
1016+ *.cc \
1017+ *.cxx \
1018+ *.cxxm \
1019+ *.cpp \
1020+ *.cppm \
1021+ *.c++ \
1022+ *.c++m \
1023+ *.java \
1024+ *.ii \
1025+ *.ixx \
1026+ *.ipp \
1027+ *.i++ \
1028+ *.inl \
1029+ *.idl \
1030+ *.ddl \
1031+ *.odl \
1032+ *.h \
1033+ *.hh \
1034+ *.hxx \
1035+ *.hpp \
1036+ *.h++ \
1037+ *.ixx \
1038+ *.l \
1039+ *.cs \
1040+ *.d \
1041+ *.php \
1042+ *.php4 \
1043+ *.php5 \
1044+ *.phtml \
1045+ *.inc \
1046+ *.m \
1047+ *.markdown \
1048+ *.md \
1049+ *.mm \
1050+ *.dox \
1051+ *.py \
1052+ *.pyw \
1053+ *.f90 \
1054+ *.f95 \
1055+ *.f03 \
1056+ *.f08 \
1057+ *.f18 \
1058+ *.f \
1059+ *.for \
1060+ *.vhd \
1061+ *.vhdl \
1062+ *.ucf \
1063+ *.qsf \
1064+ *.ice
1065+
1066+# The RECURSIVE tag can be used to specify whether or not subdirectories should
1067+# be searched for input files as well.
1068+# The default value is: NO.
1069+
1070+RECURSIVE = NO
1071+
1072+# The EXCLUDE tag can be used to specify files and/or directories that should be
1073+# excluded from the INPUT source files. This way you can easily exclude a
1074+# subdirectory from a directory tree whose root is specified with the INPUT tag.
1075+#
1076+# Note that relative paths are relative to the directory from which doxygen is
1077+# run.
1078+
1079+EXCLUDE =
1080+
1081+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
1082+# directories that are symbolic links (a Unix file system feature) are excluded
1083+# from the input.
1084+# The default value is: NO.
1085+
1086+EXCLUDE_SYMLINKS = NO
1087+
1088+# If the value of the INPUT tag contains directories, you can use the
1089+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
1090+# certain files from those directories.
1091+#
1092+# Note that the wildcards are matched against the file with absolute path, so to
1093+# exclude all test directories for example use the pattern */test/*
1094+
1095+EXCLUDE_PATTERNS =
1096+
1097+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
1098+# (namespaces, classes, functions, etc.) that should be excluded from the
1099+# output. The symbol name can be a fully qualified name, a word, or if the
1100+# wildcard * is used, a substring. Examples: ANamespace, AClass,
1101+# ANamespace::AClass, ANamespace::*Test
1102+
1103+EXCLUDE_SYMBOLS =
1104+
1105+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
1106+# that contain example code fragments that are included (see the \include
1107+# command).
1108+
1109+EXAMPLE_PATH =
1110+
1111+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
1112+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
1113+# *.h) to filter out the source-files in the directories. If left blank all
1114+# files are included.
1115+
1116+EXAMPLE_PATTERNS = *
1117+
1118+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
1119+# searched for input files to be used with the \include or \dontinclude commands
1120+# irrespective of the value of the RECURSIVE tag.
1121+# The default value is: NO.
1122+
1123+EXAMPLE_RECURSIVE = NO
1124+
1125+# The IMAGE_PATH tag can be used to specify one or more files or directories
1126+# that contain images that are to be included in the documentation (see the
1127+# \image command).
1128+
1129+IMAGE_PATH =
1130+
1131+# The INPUT_FILTER tag can be used to specify a program that doxygen should
1132+# invoke to filter for each input file. Doxygen will invoke the filter program
1133+# by executing (via popen()) the command:
1134+#
1135+# <filter> <input-file>
1136+#
1137+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
1138+# name of an input file. Doxygen will then use the output that the filter
1139+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
1140+# will be ignored.
1141+#
1142+# Note that the filter must not add or remove lines; it is applied before the
1143+# code is scanned, but not when the output code is generated. If lines are added
1144+# or removed, the anchors will not be placed correctly.
1145+#
1146+# Note that doxygen will use the data processed and written to standard output
1147+# for further processing, therefore nothing else, like debug statements or used
1148+# commands (so in case of a Windows batch file always use @echo OFF), should be
1149+# written to standard output.
1150+#
1151+# Note that for custom extensions or not directly supported extensions you also
1152+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
1153+# properly processed by doxygen.
1154+
1155+INPUT_FILTER =
1156+
1157+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
1158+# basis. Doxygen will compare the file name with each pattern and apply the
1159+# filter if there is a match. The filters are a list of the form: pattern=filter
1160+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
1161+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
1162+# patterns match the file name, INPUT_FILTER is applied.
1163+#
1164+# Note that for custom extensions or not directly supported extensions you also
1165+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
1166+# properly processed by doxygen.
1167+
1168+FILTER_PATTERNS =
1169+
1170+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
1171+# INPUT_FILTER) will also be used to filter the input files that are used for
1172+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
1173+# The default value is: NO.
1174+
1175+FILTER_SOURCE_FILES = NO
1176+
1177+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
1178+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
1179+# it is also possible to disable source filtering for a specific pattern using
1180+# *.ext= (so without naming a filter).
1181+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
1182+
1183+FILTER_SOURCE_PATTERNS =
1184+
1185+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
1186+# is part of the input, its contents will be placed on the main page
1187+# (index.html). This can be useful if you have a project on for instance GitHub
1188+# and want to reuse the introduction page also for the doxygen output.
1189+
1190+USE_MDFILE_AS_MAINPAGE =
1191+
1192+# The Fortran standard specifies that for fixed formatted Fortran code all
1193+# characters from position 72 are to be considered as comment. A common
1194+# extension is to allow longer lines before the automatic comment starts. The
1195+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
1196+# be processed before the automatic comment starts.
1197+# Minimum value: 7, maximum value: 10000, default value: 72.
1198+
1199+FORTRAN_COMMENT_AFTER = 72
1200+
1201+#---------------------------------------------------------------------------
1202+# Configuration options related to source browsing
1203+#---------------------------------------------------------------------------
1204+
1205+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
1206+# generated. Documented entities will be cross-referenced with these sources.
1207+#
1208+# Note: To get rid of all source code in the generated output, make sure that
1209+# also VERBATIM_HEADERS is set to NO.
1210+# The default value is: NO.
1211+
1212+SOURCE_BROWSER = NO
1213+
1214+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
1215+# classes and enums directly into the documentation.
1216+# The default value is: NO.
1217+
1218+INLINE_SOURCES = NO
1219+
1220+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
1221+# special comment blocks from generated source code fragments. Normal C, C++ and
1222+# Fortran comments will always remain visible.
1223+# The default value is: YES.
1224+
1225+STRIP_CODE_COMMENTS = YES
1226+
1227+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
1228+# entity all documented functions referencing it will be listed.
1229+# The default value is: NO.
1230+
1231+REFERENCED_BY_RELATION = NO
1232+
1233+# If the REFERENCES_RELATION tag is set to YES then for each documented function
1234+# all documented entities called/used by that function will be listed.
1235+# The default value is: NO.
1236+
1237+REFERENCES_RELATION = NO
1238+
1239+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
1240+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
1241+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
1242+# link to the documentation.
1243+# The default value is: YES.
1244+
1245+REFERENCES_LINK_SOURCE = YES
1246+
1247+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
1248+# source code will show a tooltip with additional information such as prototype,
1249+# brief description and links to the definition and documentation. Since this
1250+# will make the HTML file larger and loading of large files a bit slower, you
1251+# can opt to disable this feature.
1252+# The default value is: YES.
1253+# This tag requires that the tag SOURCE_BROWSER is set to YES.
1254+
1255+SOURCE_TOOLTIPS = YES
1256+
1257+# If the USE_HTAGS tag is set to YES then the references to source code will
1258+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
1259+# source browser. The htags tool is part of GNU's global source tagging system
1260+# (see https://www.gnu.org/software/global/global.html). You will need version
1261+# 4.8.6 or higher.
1262+#
1263+# To use it do the following:
1264+# - Install the latest version of global
1265+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
1266+# - Make sure the INPUT points to the root of the source tree
1267+# - Run doxygen as normal
1268+#
1269+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
1270+# tools must be available from the command line (i.e. in the search path).
1271+#
1272+# The result: instead of the source browser generated by doxygen, the links to
1273+# source code will now point to the output of htags.
1274+# The default value is: NO.
1275+# This tag requires that the tag SOURCE_BROWSER is set to YES.
1276+
1277+USE_HTAGS = NO
1278+
1279+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
1280+# verbatim copy of the header file for each class for which an include is
1281+# specified. Set to NO to disable this.
1282+# See also: Section \class.
1283+# The default value is: YES.
1284+
1285+VERBATIM_HEADERS = YES
1286+
1287+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
1288+# clang parser (see:
1289+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
1290+# performance. This can be particularly helpful with template rich C++ code for
1291+# which doxygen's built-in parser lacks the necessary type information.
1292+# Note: The availability of this option depends on whether or not doxygen was
1293+# generated with the -Duse_libclang=ON option for CMake.
1294+# The default value is: NO.
1295+
1296+CLANG_ASSISTED_PARSING = NO
1297+
1298+# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
1299+# tag is set to YES then doxygen will add the directory of each input to the
1300+# include path.
1301+# The default value is: YES.
1302+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
1303+
1304+CLANG_ADD_INC_PATHS = YES
1305+
1306+# If clang assisted parsing is enabled you can provide the compiler with command
1307+# line options that you would normally use when invoking the compiler. Note that
1308+# the include paths will already be set by doxygen for the files and directories
1309+# specified with INPUT and INCLUDE_PATH.
1310+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
1311+
1312+CLANG_OPTIONS =
1313+
1314+# If clang assisted parsing is enabled you can provide the clang parser with the
1315+# path to the directory containing a file called compile_commands.json. This
1316+# file is the compilation database (see:
1317+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
1318+# options used when the source files were built. This is equivalent to
1319+# specifying the -p option to a clang tool, such as clang-check. These options
1320+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
1321+# will be added as well.
1322+# Note: The availability of this option depends on whether or not doxygen was
1323+# generated with the -Duse_libclang=ON option for CMake.
1324+
1325+CLANG_DATABASE_PATH =
1326+
1327+#---------------------------------------------------------------------------
1328+# Configuration options related to the alphabetical class index
1329+#---------------------------------------------------------------------------
1330+
1331+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
1332+# compounds will be generated. Enable this if the project contains a lot of
1333+# classes, structs, unions or interfaces.
1334+# The default value is: YES.
1335+
1336+ALPHABETICAL_INDEX = YES
1337+
1338+# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
1339+# that should be ignored while generating the index headers. The IGNORE_PREFIX
1340+# tag works for classes, function and member names. The entity will be placed in
1341+# the alphabetical list under the first letter of the entity name that remains
1342+# after removing the prefix.
1343+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
1344+
1345+IGNORE_PREFIX =
1346+
1347+#---------------------------------------------------------------------------
1348+# Configuration options related to the HTML output
1349+#---------------------------------------------------------------------------
1350+
1351+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
1352+# The default value is: YES.
1353+
1354+GENERATE_HTML = YES
1355+
1356+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
1357+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1358+# it.
1359+# The default directory is: html.
1360+# This tag requires that the tag GENERATE_HTML is set to YES.
1361+
1362+HTML_OUTPUT = html
1363+
1364+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
1365+# generated HTML page (for example: .htm, .php, .asp).
1366+# The default value is: .html.
1367+# This tag requires that the tag GENERATE_HTML is set to YES.
1368+
1369+HTML_FILE_EXTENSION = .html
1370+
1371+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
1372+# each generated HTML page. If the tag is left blank doxygen will generate a
1373+# standard header.
1374+#
1375+# To get valid HTML the header file that includes any scripts and style sheets
1376+# that doxygen needs, which is dependent on the configuration options used (e.g.
1377+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
1378+# default header using
1379+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
1380+# YourConfigFile
1381+# and then modify the file new_header.html. See also section "Doxygen usage"
1382+# for information on how to generate the default header that doxygen normally
1383+# uses.
1384+# Note: The header is subject to change so you typically have to regenerate the
1385+# default header when upgrading to a newer version of doxygen. For a description
1386+# of the possible markers and block names see the documentation.
1387+# This tag requires that the tag GENERATE_HTML is set to YES.
1388+
1389+HTML_HEADER =
1390+
1391+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
1392+# generated HTML page. If the tag is left blank doxygen will generate a standard
1393+# footer. See HTML_HEADER for more information on how to generate a default
1394+# footer and what special commands can be used inside the footer. See also
1395+# section "Doxygen usage" for information on how to generate the default footer
1396+# that doxygen normally uses.
1397+# This tag requires that the tag GENERATE_HTML is set to YES.
1398+
1399+HTML_FOOTER =
1400+
1401+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
1402+# sheet that is used by each HTML page. It can be used to fine-tune the look of
1403+# the HTML output. If left blank doxygen will generate a default style sheet.
1404+# See also section "Doxygen usage" for information on how to generate the style
1405+# sheet that doxygen normally uses.
1406+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
1407+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
1408+# obsolete.
1409+# This tag requires that the tag GENERATE_HTML is set to YES.
1410+
1411+HTML_STYLESHEET =
1412+
1413+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
1414+# cascading style sheets that are included after the standard style sheets
1415+# created by doxygen. Using this option one can overrule certain style aspects.
1416+# This is preferred over using HTML_STYLESHEET since it does not replace the
1417+# standard style sheet and is therefore more robust against future updates.
1418+# Doxygen will copy the style sheet files to the output directory.
1419+# Note: The order of the extra style sheet files is of importance (e.g. the last
1420+# style sheet in the list overrules the setting of the previous ones in the
1421+# list).
1422+# Note: Since the styling of scrollbars can currently not be overruled in
1423+# Webkit/Chromium, the styling will be left out of the default doxygen.css if
1424+# one or more extra stylesheets have been specified. So if scrollbar
1425+# customization is desired it has to be added explicitly. For an example see the
1426+# documentation.
1427+# This tag requires that the tag GENERATE_HTML is set to YES.
1428+
1429+HTML_EXTRA_STYLESHEET =
1430+
1431+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
1432+# other source files which should be copied to the HTML output directory. Note
1433+# that these files will be copied to the base HTML output directory. Use the
1434+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
1435+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
1436+# files will be copied as-is; there are no commands or markers available.
1437+# This tag requires that the tag GENERATE_HTML is set to YES.
1438+
1439+HTML_EXTRA_FILES =
1440+
1441+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
1442+# should be rendered with a dark or light theme.
1443+# Possible values are: LIGHT always generate light mode output, DARK always
1444+# generate dark mode output, AUTO_LIGHT automatically set the mode according to
1445+# the user preference, use light mode if no preference is set (the default),
1446+# AUTO_DARK automatically set the mode according to the user preference, use
1447+# dark mode if no preference is set and TOGGLE allow to user to switch between
1448+# light and dark mode via a button.
1449+# The default value is: AUTO_LIGHT.
1450+# This tag requires that the tag GENERATE_HTML is set to YES.
1451+
1452+HTML_COLORSTYLE = AUTO_LIGHT
1453+
1454+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
1455+# will adjust the colors in the style sheet and background images according to
1456+# this color. Hue is specified as an angle on a color-wheel, see
1457+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
1458+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
1459+# purple, and 360 is red again.
1460+# Minimum value: 0, maximum value: 359, default value: 220.
1461+# This tag requires that the tag GENERATE_HTML is set to YES.
1462+
1463+HTML_COLORSTYLE_HUE = 220
1464+
1465+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
1466+# in the HTML output. For a value of 0 the output will use gray-scales only. A
1467+# value of 255 will produce the most vivid colors.
1468+# Minimum value: 0, maximum value: 255, default value: 100.
1469+# This tag requires that the tag GENERATE_HTML is set to YES.
1470+
1471+HTML_COLORSTYLE_SAT = 100
1472+
1473+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
1474+# luminance component of the colors in the HTML output. Values below 100
1475+# gradually make the output lighter, whereas values above 100 make the output
1476+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
1477+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
1478+# change the gamma.
1479+# Minimum value: 40, maximum value: 240, default value: 80.
1480+# This tag requires that the tag GENERATE_HTML is set to YES.
1481+
1482+HTML_COLORSTYLE_GAMMA = 80
1483+
1484+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
1485+# documentation will contain a main index with vertical navigation menus that
1486+# are dynamically created via JavaScript. If disabled, the navigation index will
1487+# consists of multiple levels of tabs that are statically embedded in every HTML
1488+# page. Disable this option to support browsers that do not have JavaScript,
1489+# like the Qt help browser.
1490+# The default value is: YES.
1491+# This tag requires that the tag GENERATE_HTML is set to YES.
1492+
1493+HTML_DYNAMIC_MENUS = YES
1494+
1495+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
1496+# documentation will contain sections that can be hidden and shown after the
1497+# page has loaded.
1498+# The default value is: NO.
1499+# This tag requires that the tag GENERATE_HTML is set to YES.
1500+
1501+HTML_DYNAMIC_SECTIONS = NO
1502+
1503+# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be
1504+# dynamically folded and expanded in the generated HTML source code.
1505+# The default value is: YES.
1506+# This tag requires that the tag GENERATE_HTML is set to YES.
1507+
1508+HTML_CODE_FOLDING = YES
1509+
1510+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
1511+# shown in the various tree structured indices initially; the user can expand
1512+# and collapse entries dynamically later on. Doxygen will expand the tree to
1513+# such a level that at most the specified number of entries are visible (unless
1514+# a fully collapsed tree already exceeds this amount). So setting the number of
1515+# entries 1 will produce a full collapsed tree by default. 0 is a special value
1516+# representing an infinite number of entries and will result in a full expanded
1517+# tree by default.
1518+# Minimum value: 0, maximum value: 9999, default value: 100.
1519+# This tag requires that the tag GENERATE_HTML is set to YES.
1520+
1521+HTML_INDEX_NUM_ENTRIES = 100
1522+
1523+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
1524+# generated that can be used as input for Apple's Xcode 3 integrated development
1525+# environment (see:
1526+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
1527+# create a documentation set, doxygen will generate a Makefile in the HTML
1528+# output directory. Running make will produce the docset in that directory and
1529+# running make install will install the docset in
1530+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
1531+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
1532+# genXcode/_index.html for more information.
1533+# The default value is: NO.
1534+# This tag requires that the tag GENERATE_HTML is set to YES.
1535+
1536+GENERATE_DOCSET = NO
1537+
1538+# This tag determines the name of the docset feed. A documentation feed provides
1539+# an umbrella under which multiple documentation sets from a single provider
1540+# (such as a company or product suite) can be grouped.
1541+# The default value is: Doxygen generated docs.
1542+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1543+
1544+DOCSET_FEEDNAME = "Doxygen generated docs"
1545+
1546+# This tag determines the URL of the docset feed. A documentation feed provides
1547+# an umbrella under which multiple documentation sets from a single provider
1548+# (such as a company or product suite) can be grouped.
1549+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1550+
1551+DOCSET_FEEDURL =
1552+
1553+# This tag specifies a string that should uniquely identify the documentation
1554+# set bundle. This should be a reverse domain-name style string, e.g.
1555+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
1556+# The default value is: org.doxygen.Project.
1557+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1558+
1559+DOCSET_BUNDLE_ID = org.doxygen.Project
1560+
1561+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
1562+# the documentation publisher. This should be a reverse domain-name style
1563+# string, e.g. com.mycompany.MyDocSet.documentation.
1564+# The default value is: org.doxygen.Publisher.
1565+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1566+
1567+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
1568+
1569+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
1570+# The default value is: Publisher.
1571+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1572+
1573+DOCSET_PUBLISHER_NAME = Publisher
1574+
1575+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
1576+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
1577+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
1578+# on Windows. In the beginning of 2021 Microsoft took the original page, with
1579+# a.o. the download links, offline the HTML help workshop was already many years
1580+# in maintenance mode). You can download the HTML help workshop from the web
1581+# archives at Installation executable (see:
1582+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
1583+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
1584+#
1585+# The HTML Help Workshop contains a compiler that can convert all HTML output
1586+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
1587+# files are now used as the Windows 98 help format, and will replace the old
1588+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
1589+# HTML files also contain an index, a table of contents, and you can search for
1590+# words in the documentation. The HTML workshop also contains a viewer for
1591+# compressed HTML files.
1592+# The default value is: NO.
1593+# This tag requires that the tag GENERATE_HTML is set to YES.
1594+
1595+GENERATE_HTMLHELP = NO
1596+
1597+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
1598+# file. You can add a path in front of the file if the result should not be
1599+# written to the html output directory.
1600+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1601+
1602+CHM_FILE =
1603+
1604+# The HHC_LOCATION tag can be used to specify the location (absolute path
1605+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
1606+# doxygen will try to run the HTML help compiler on the generated index.hhp.
1607+# The file has to be specified with full path.
1608+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1609+
1610+HHC_LOCATION =
1611+
1612+# The GENERATE_CHI flag controls if a separate .chi index file is generated
1613+# (YES) or that it should be included in the main .chm file (NO).
1614+# The default value is: NO.
1615+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1616+
1617+GENERATE_CHI = NO
1618+
1619+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
1620+# and project file content.
1621+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1622+
1623+CHM_INDEX_ENCODING =
1624+
1625+# The BINARY_TOC flag controls whether a binary table of contents is generated
1626+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
1627+# enables the Previous and Next buttons.
1628+# The default value is: NO.
1629+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1630+
1631+BINARY_TOC = NO
1632+
1633+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
1634+# the table of contents of the HTML help documentation and to the tree view.
1635+# The default value is: NO.
1636+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1637+
1638+TOC_EXPAND = NO
1639+
1640+# The SITEMAP_URL tag is used to specify the full URL of the place where the
1641+# generated documentation will be placed on the server by the user during the
1642+# deployment of the documentation. The generated sitemap is called sitemap.xml
1643+# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL
1644+# is specified no sitemap is generated. For information about the sitemap
1645+# protocol see https://www.sitemaps.org
1646+# This tag requires that the tag GENERATE_HTML is set to YES.
1647+
1648+SITEMAP_URL =
1649+
1650+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
1651+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
1652+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
1653+# (.qch) of the generated HTML documentation.
1654+# The default value is: NO.
1655+# This tag requires that the tag GENERATE_HTML is set to YES.
1656+
1657+GENERATE_QHP = NO
1658+
1659+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
1660+# the file name of the resulting .qch file. The path specified is relative to
1661+# the HTML output folder.
1662+# This tag requires that the tag GENERATE_QHP is set to YES.
1663+
1664+QCH_FILE =
1665+
1666+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
1667+# Project output. For more information please see Qt Help Project / Namespace
1668+# (see:
1669+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
1670+# The default value is: org.doxygen.Project.
1671+# This tag requires that the tag GENERATE_QHP is set to YES.
1672+
1673+QHP_NAMESPACE = org.doxygen.Project
1674+
1675+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
1676+# Help Project output. For more information please see Qt Help Project / Virtual
1677+# Folders (see:
1678+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
1679+# The default value is: doc.
1680+# This tag requires that the tag GENERATE_QHP is set to YES.
1681+
1682+QHP_VIRTUAL_FOLDER = doc
1683+
1684+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
1685+# filter to add. For more information please see Qt Help Project / Custom
1686+# Filters (see:
1687+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
1688+# This tag requires that the tag GENERATE_QHP is set to YES.
1689+
1690+QHP_CUST_FILTER_NAME =
1691+
1692+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
1693+# custom filter to add. For more information please see Qt Help Project / Custom
1694+# Filters (see:
1695+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
1696+# This tag requires that the tag GENERATE_QHP is set to YES.
1697+
1698+QHP_CUST_FILTER_ATTRS =
1699+
1700+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
1701+# project's filter section matches. Qt Help Project / Filter Attributes (see:
1702+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
1703+# This tag requires that the tag GENERATE_QHP is set to YES.
1704+
1705+QHP_SECT_FILTER_ATTRS =
1706+
1707+# The QHG_LOCATION tag can be used to specify the location (absolute path
1708+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
1709+# run qhelpgenerator on the generated .qhp file.
1710+# This tag requires that the tag GENERATE_QHP is set to YES.
1711+
1712+QHG_LOCATION =
1713+
1714+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
1715+# generated, together with the HTML files, they form an Eclipse help plugin. To
1716+# install this plugin and make it available under the help contents menu in
1717+# Eclipse, the contents of the directory containing the HTML and XML files needs
1718+# to be copied into the plugins directory of eclipse. The name of the directory
1719+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
1720+# After copying Eclipse needs to be restarted before the help appears.
1721+# The default value is: NO.
1722+# This tag requires that the tag GENERATE_HTML is set to YES.
1723+
1724+GENERATE_ECLIPSEHELP = NO
1725+
1726+# A unique identifier for the Eclipse help plugin. When installing the plugin
1727+# the directory name containing the HTML and XML files should also have this
1728+# name. Each documentation set should have its own identifier.
1729+# The default value is: org.doxygen.Project.
1730+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
1731+
1732+ECLIPSE_DOC_ID = org.doxygen.Project
1733+
1734+# If you want full control over the layout of the generated HTML pages it might
1735+# be necessary to disable the index and replace it with your own. The
1736+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
1737+# of each HTML page. A value of NO enables the index and the value YES disables
1738+# it. Since the tabs in the index contain the same information as the navigation
1739+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
1740+# The default value is: NO.
1741+# This tag requires that the tag GENERATE_HTML is set to YES.
1742+
1743+DISABLE_INDEX = NO
1744+
1745+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
1746+# structure should be generated to display hierarchical information. If the tag
1747+# value is set to YES, a side panel will be generated containing a tree-like
1748+# index structure (just like the one that is generated for HTML Help). For this
1749+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
1750+# (i.e. any modern browser). Windows users are probably better off using the
1751+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
1752+# further fine tune the look of the index (see "Fine-tuning the output"). As an
1753+# example, the default style sheet generated by doxygen has an example that
1754+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
1755+# Since the tree basically has the same information as the tab index, you could
1756+# consider setting DISABLE_INDEX to YES when enabling this option.
1757+# The default value is: NO.
1758+# This tag requires that the tag GENERATE_HTML is set to YES.
1759+
1760+GENERATE_TREEVIEW = NO
1761+
1762+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
1763+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
1764+# area (value NO) or if it should extend to the full height of the window (value
1765+# YES). Setting this to YES gives a layout similar to
1766+# https://docs.readthedocs.io with more room for contents, but less room for the
1767+# project logo, title, and description. If either GENERATE_TREEVIEW or
1768+# DISABLE_INDEX is set to NO, this option has no effect.
1769+# The default value is: NO.
1770+# This tag requires that the tag GENERATE_HTML is set to YES.
1771+
1772+FULL_SIDEBAR = NO
1773+
1774+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
1775+# doxygen will group on one line in the generated HTML documentation.
1776+#
1777+# Note that a value of 0 will completely suppress the enum values from appearing
1778+# in the overview section.
1779+# Minimum value: 0, maximum value: 20, default value: 4.
1780+# This tag requires that the tag GENERATE_HTML is set to YES.
1781+
1782+ENUM_VALUES_PER_LINE = 4
1783+
1784+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
1785+# to set the initial width (in pixels) of the frame in which the tree is shown.
1786+# Minimum value: 0, maximum value: 1500, default value: 250.
1787+# This tag requires that the tag GENERATE_HTML is set to YES.
1788+
1789+TREEVIEW_WIDTH = 250
1790+
1791+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
1792+# external symbols imported via tag files in a separate window.
1793+# The default value is: NO.
1794+# This tag requires that the tag GENERATE_HTML is set to YES.
1795+
1796+EXT_LINKS_IN_WINDOW = NO
1797+
1798+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
1799+# addresses.
1800+# The default value is: YES.
1801+# This tag requires that the tag GENERATE_HTML is set to YES.
1802+
1803+OBFUSCATE_EMAILS = YES
1804+
1805+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
1806+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
1807+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
1808+# the HTML output. These images will generally look nicer at scaled resolutions.
1809+# Possible values are: png (the default) and svg (looks nicer but requires the
1810+# pdf2svg or inkscape tool).
1811+# The default value is: png.
1812+# This tag requires that the tag GENERATE_HTML is set to YES.
1813+
1814+HTML_FORMULA_FORMAT = png
1815+
1816+# Use this tag to change the font size of LaTeX formulas included as images in
1817+# the HTML documentation. When you change the font size after a successful
1818+# doxygen run you need to manually remove any form_*.png images from the HTML
1819+# output directory to force them to be regenerated.
1820+# Minimum value: 8, maximum value: 50, default value: 10.
1821+# This tag requires that the tag GENERATE_HTML is set to YES.
1822+
1823+FORMULA_FONTSIZE = 10
1824+
1825+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
1826+# to create new LaTeX commands to be used in formulas as building blocks. See
1827+# the section "Including formulas" for details.
1828+
1829+FORMULA_MACROFILE =
1830+
1831+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
1832+# https://www.mathjax.org) which uses client side JavaScript for the rendering
1833+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
1834+# installed or if you want to formulas look prettier in the HTML output. When
1835+# enabled you may also need to install MathJax separately and configure the path
1836+# to it using the MATHJAX_RELPATH option.
1837+# The default value is: NO.
1838+# This tag requires that the tag GENERATE_HTML is set to YES.
1839+
1840+USE_MATHJAX = NO
1841+
1842+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
1843+# Note that the different versions of MathJax have different requirements with
1844+# regards to the different settings, so it is possible that also other MathJax
1845+# settings have to be changed when switching between the different MathJax
1846+# versions.
1847+# Possible values are: MathJax_2 and MathJax_3.
1848+# The default value is: MathJax_2.
1849+# This tag requires that the tag USE_MATHJAX is set to YES.
1850+
1851+MATHJAX_VERSION = MathJax_2
1852+
1853+# When MathJax is enabled you can set the default output format to be used for
1854+# the MathJax output. For more details about the output format see MathJax
1855+# version 2 (see:
1856+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
1857+# (see:
1858+# http://docs.mathjax.org/en/latest/web/components/output.html).
1859+# Possible values are: HTML-CSS (which is slower, but has the best
1860+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
1861+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
1862+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
1863+# is the name for Mathjax version 3, for MathJax version 2 this will be
1864+# translated into HTML-CSS) and SVG.
1865+# The default value is: HTML-CSS.
1866+# This tag requires that the tag USE_MATHJAX is set to YES.
1867+
1868+MATHJAX_FORMAT = HTML-CSS
1869+
1870+# When MathJax is enabled you need to specify the location relative to the HTML
1871+# output directory using the MATHJAX_RELPATH option. The destination directory
1872+# should contain the MathJax.js script. For instance, if the mathjax directory
1873+# is located at the same level as the HTML output directory, then
1874+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
1875+# Content Delivery Network so you can quickly see the result without installing
1876+# MathJax. However, it is strongly recommended to install a local copy of
1877+# MathJax from https://www.mathjax.org before deployment. The default value is:
1878+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
1879+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
1880+# This tag requires that the tag USE_MATHJAX is set to YES.
1881+
1882+MATHJAX_RELPATH =
1883+
1884+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
1885+# extension names that should be enabled during MathJax rendering. For example
1886+# for MathJax version 2 (see
1887+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
1888+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
1889+# For example for MathJax version 3 (see
1890+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
1891+# MATHJAX_EXTENSIONS = ams
1892+# This tag requires that the tag USE_MATHJAX is set to YES.
1893+
1894+MATHJAX_EXTENSIONS =
1895+
1896+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
1897+# of code that will be used on startup of the MathJax code. See the MathJax site
1898+# (see:
1899+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
1900+# example see the documentation.
1901+# This tag requires that the tag USE_MATHJAX is set to YES.
1902+
1903+MATHJAX_CODEFILE =
1904+
1905+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
1906+# the HTML output. The underlying search engine uses javascript and DHTML and
1907+# should work on any modern browser. Note that when using HTML help
1908+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
1909+# there is already a search function so this one should typically be disabled.
1910+# For large projects the javascript based search engine can be slow, then
1911+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
1912+# search using the keyboard; to jump to the search box use <access key> + S
1913+# (what the <access key> is depends on the OS and browser, but it is typically
1914+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
1915+# key> to jump into the search results window, the results can be navigated
1916+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
1917+# the search. The filter options can be selected when the cursor is inside the
1918+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
1919+# to select a filter and <Enter> or <escape> to activate or cancel the filter
1920+# option.
1921+# The default value is: YES.
1922+# This tag requires that the tag GENERATE_HTML is set to YES.
1923+
1924+SEARCHENGINE = YES
1925+
1926+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
1927+# implemented using a web server instead of a web client using JavaScript. There
1928+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
1929+# setting. When disabled, doxygen will generate a PHP script for searching and
1930+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
1931+# and searching needs to be provided by external tools. See the section
1932+# "External Indexing and Searching" for details.
1933+# The default value is: NO.
1934+# This tag requires that the tag SEARCHENGINE is set to YES.
1935+
1936+SERVER_BASED_SEARCH = NO
1937+
1938+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
1939+# script for searching. Instead the search results are written to an XML file
1940+# which needs to be processed by an external indexer. Doxygen will invoke an
1941+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
1942+# search results.
1943+#
1944+# Doxygen ships with an example indexer (doxyindexer) and search engine
1945+# (doxysearch.cgi) which are based on the open source search engine library
1946+# Xapian (see:
1947+# https://xapian.org/).
1948+#
1949+# See the section "External Indexing and Searching" for details.
1950+# The default value is: NO.
1951+# This tag requires that the tag SEARCHENGINE is set to YES.
1952+
1953+EXTERNAL_SEARCH = NO
1954+
1955+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
1956+# which will return the search results when EXTERNAL_SEARCH is enabled.
1957+#
1958+# Doxygen ships with an example indexer (doxyindexer) and search engine
1959+# (doxysearch.cgi) which are based on the open source search engine library
1960+# Xapian (see:
1961+# https://xapian.org/). See the section "External Indexing and Searching" for
1962+# details.
1963+# This tag requires that the tag SEARCHENGINE is set to YES.
1964+
1965+SEARCHENGINE_URL =
1966+
1967+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
1968+# search data is written to a file for indexing by an external tool. With the
1969+# SEARCHDATA_FILE tag the name of this file can be specified.
1970+# The default file is: searchdata.xml.
1971+# This tag requires that the tag SEARCHENGINE is set to YES.
1972+
1973+SEARCHDATA_FILE = searchdata.xml
1974+
1975+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
1976+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
1977+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
1978+# projects and redirect the results back to the right project.
1979+# This tag requires that the tag SEARCHENGINE is set to YES.
1980+
1981+EXTERNAL_SEARCH_ID =
1982+
1983+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
1984+# projects other than the one defined by this configuration file, but that are
1985+# all added to the same external search index. Each project needs to have a
1986+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
1987+# to a relative location where the documentation can be found. The format is:
1988+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
1989+# This tag requires that the tag SEARCHENGINE is set to YES.
1990+
1991+EXTRA_SEARCH_MAPPINGS =
1992+
1993+#---------------------------------------------------------------------------
1994+# Configuration options related to the LaTeX output
1995+#---------------------------------------------------------------------------
1996+
1997+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
1998+# The default value is: YES.
1999+
2000+GENERATE_LATEX = YES
2001+
2002+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
2003+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2004+# it.
2005+# The default directory is: latex.
2006+# This tag requires that the tag GENERATE_LATEX is set to YES.
2007+
2008+LATEX_OUTPUT = latex
2009+
2010+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
2011+# invoked.
2012+#
2013+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
2014+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
2015+# chosen this is overwritten by pdflatex. For specific output languages the
2016+# default can have been set differently, this depends on the implementation of
2017+# the output language.
2018+# This tag requires that the tag GENERATE_LATEX is set to YES.
2019+
2020+LATEX_CMD_NAME =
2021+
2022+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
2023+# index for LaTeX.
2024+# Note: This tag is used in the Makefile / make.bat.
2025+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
2026+# (.tex).
2027+# The default file is: makeindex.
2028+# This tag requires that the tag GENERATE_LATEX is set to YES.
2029+
2030+MAKEINDEX_CMD_NAME = makeindex
2031+
2032+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
2033+# generate index for LaTeX. In case there is no backslash (\) as first character
2034+# it will be automatically added in the LaTeX code.
2035+# Note: This tag is used in the generated output file (.tex).
2036+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
2037+# The default value is: makeindex.
2038+# This tag requires that the tag GENERATE_LATEX is set to YES.
2039+
2040+LATEX_MAKEINDEX_CMD = makeindex
2041+
2042+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
2043+# documents. This may be useful for small projects and may help to save some
2044+# trees in general.
2045+# The default value is: NO.
2046+# This tag requires that the tag GENERATE_LATEX is set to YES.
2047+
2048+COMPACT_LATEX = NO
2049+
2050+# The PAPER_TYPE tag can be used to set the paper type that is used by the
2051+# printer.
2052+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
2053+# 14 inches) and executive (7.25 x 10.5 inches).
2054+# The default value is: a4.
2055+# This tag requires that the tag GENERATE_LATEX is set to YES.
2056+
2057+PAPER_TYPE = a4
2058+
2059+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
2060+# that should be included in the LaTeX output. The package can be specified just
2061+# by its name or with the correct syntax as to be used with the LaTeX
2062+# \usepackage command. To get the times font for instance you can specify :
2063+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
2064+# To use the option intlimits with the amsmath package you can specify:
2065+# EXTRA_PACKAGES=[intlimits]{amsmath}
2066+# If left blank no extra packages will be included.
2067+# This tag requires that the tag GENERATE_LATEX is set to YES.
2068+
2069+EXTRA_PACKAGES =
2070+
2071+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
2072+# the generated LaTeX document. The header should contain everything until the
2073+# first chapter. If it is left blank doxygen will generate a standard header. It
2074+# is highly recommended to start with a default header using
2075+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
2076+# and then modify the file new_header.tex. See also section "Doxygen usage" for
2077+# information on how to generate the default header that doxygen normally uses.
2078+#
2079+# Note: Only use a user-defined header if you know what you are doing!
2080+# Note: The header is subject to change so you typically have to regenerate the
2081+# default header when upgrading to a newer version of doxygen. The following
2082+# commands have a special meaning inside the header (and footer): For a
2083+# description of the possible markers and block names see the documentation.
2084+# This tag requires that the tag GENERATE_LATEX is set to YES.
2085+
2086+LATEX_HEADER =
2087+
2088+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
2089+# the generated LaTeX document. The footer should contain everything after the
2090+# last chapter. If it is left blank doxygen will generate a standard footer. See
2091+# LATEX_HEADER for more information on how to generate a default footer and what
2092+# special commands can be used inside the footer. See also section "Doxygen
2093+# usage" for information on how to generate the default footer that doxygen
2094+# normally uses. Note: Only use a user-defined footer if you know what you are
2095+# doing!
2096+# This tag requires that the tag GENERATE_LATEX is set to YES.
2097+
2098+LATEX_FOOTER =
2099+
2100+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
2101+# LaTeX style sheets that are included after the standard style sheets created
2102+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
2103+# will copy the style sheet files to the output directory.
2104+# Note: The order of the extra style sheet files is of importance (e.g. the last
2105+# style sheet in the list overrules the setting of the previous ones in the
2106+# list).
2107+# This tag requires that the tag GENERATE_LATEX is set to YES.
2108+
2109+LATEX_EXTRA_STYLESHEET =
2110+
2111+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
2112+# other source files which should be copied to the LATEX_OUTPUT output
2113+# directory. Note that the files will be copied as-is; there are no commands or
2114+# markers available.
2115+# This tag requires that the tag GENERATE_LATEX is set to YES.
2116+
2117+LATEX_EXTRA_FILES =
2118+
2119+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
2120+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
2121+# contain links (just like the HTML output) instead of page references. This
2122+# makes the output suitable for online browsing using a PDF viewer.
2123+# The default value is: YES.
2124+# This tag requires that the tag GENERATE_LATEX is set to YES.
2125+
2126+PDF_HYPERLINKS = YES
2127+
2128+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
2129+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
2130+# files. Set this option to YES, to get a higher quality PDF documentation.
2131+#
2132+# See also section LATEX_CMD_NAME for selecting the engine.
2133+# The default value is: YES.
2134+# This tag requires that the tag GENERATE_LATEX is set to YES.
2135+
2136+USE_PDFLATEX = YES
2137+
2138+# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error.
2139+# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch
2140+# mode nothing is printed on the terminal, errors are scrolled as if <return> is
2141+# hit at every error; missing files that TeX tries to input or request from
2142+# keyboard input (\read on a not open input stream) cause the job to abort,
2143+# NON_STOP In nonstop mode the diagnostic message will appear on the terminal,
2144+# but there is no possibility of user interaction just like in batch mode,
2145+# SCROLL In scroll mode, TeX will stop only for missing files to input or if
2146+# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at
2147+# each error, asking for user intervention.
2148+# The default value is: NO.
2149+# This tag requires that the tag GENERATE_LATEX is set to YES.
2150+
2151+LATEX_BATCHMODE = NO
2152+
2153+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
2154+# index chapters (such as File Index, Compound Index, etc.) in the output.
2155+# The default value is: NO.
2156+# This tag requires that the tag GENERATE_LATEX is set to YES.
2157+
2158+LATEX_HIDE_INDICES = NO
2159+
2160+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
2161+# bibliography, e.g. plainnat, or ieeetr. See
2162+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
2163+# The default value is: plain.
2164+# This tag requires that the tag GENERATE_LATEX is set to YES.
2165+
2166+LATEX_BIB_STYLE = plain
2167+
2168+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
2169+# path from which the emoji images will be read. If a relative path is entered,
2170+# it will be relative to the LATEX_OUTPUT directory. If left blank the
2171+# LATEX_OUTPUT directory will be used.
2172+# This tag requires that the tag GENERATE_LATEX is set to YES.
2173+
2174+LATEX_EMOJI_DIRECTORY =
2175+
2176+#---------------------------------------------------------------------------
2177+# Configuration options related to the RTF output
2178+#---------------------------------------------------------------------------
2179+
2180+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
2181+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
2182+# readers/editors.
2183+# The default value is: NO.
2184+
2185+GENERATE_RTF = NO
2186+
2187+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
2188+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2189+# it.
2190+# The default directory is: rtf.
2191+# This tag requires that the tag GENERATE_RTF is set to YES.
2192+
2193+RTF_OUTPUT = rtf
2194+
2195+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
2196+# documents. This may be useful for small projects and may help to save some
2197+# trees in general.
2198+# The default value is: NO.
2199+# This tag requires that the tag GENERATE_RTF is set to YES.
2200+
2201+COMPACT_RTF = NO
2202+
2203+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
2204+# contain hyperlink fields. The RTF file will contain links (just like the HTML
2205+# output) instead of page references. This makes the output suitable for online
2206+# browsing using Word or some other Word compatible readers that support those
2207+# fields.
2208+#
2209+# Note: WordPad (write) and others do not support links.
2210+# The default value is: NO.
2211+# This tag requires that the tag GENERATE_RTF is set to YES.
2212+
2213+RTF_HYPERLINKS = NO
2214+
2215+# Load stylesheet definitions from file. Syntax is similar to doxygen's
2216+# configuration file, i.e. a series of assignments. You only have to provide
2217+# replacements, missing definitions are set to their default value.
2218+#
2219+# See also section "Doxygen usage" for information on how to generate the
2220+# default style sheet that doxygen normally uses.
2221+# This tag requires that the tag GENERATE_RTF is set to YES.
2222+
2223+RTF_STYLESHEET_FILE =
2224+
2225+# Set optional variables used in the generation of an RTF document. Syntax is
2226+# similar to doxygen's configuration file. A template extensions file can be
2227+# generated using doxygen -e rtf extensionFile.
2228+# This tag requires that the tag GENERATE_RTF is set to YES.
2229+
2230+RTF_EXTENSIONS_FILE =
2231+
2232+#---------------------------------------------------------------------------
2233+# Configuration options related to the man page output
2234+#---------------------------------------------------------------------------
2235+
2236+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
2237+# classes and files.
2238+# The default value is: NO.
2239+
2240+GENERATE_MAN = NO
2241+
2242+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
2243+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2244+# it. A directory man3 will be created inside the directory specified by
2245+# MAN_OUTPUT.
2246+# The default directory is: man.
2247+# This tag requires that the tag GENERATE_MAN is set to YES.
2248+
2249+MAN_OUTPUT = man
2250+
2251+# The MAN_EXTENSION tag determines the extension that is added to the generated
2252+# man pages. In case the manual section does not start with a number, the number
2253+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
2254+# optional.
2255+# The default value is: .3.
2256+# This tag requires that the tag GENERATE_MAN is set to YES.
2257+
2258+MAN_EXTENSION = .3
2259+
2260+# The MAN_SUBDIR tag determines the name of the directory created within
2261+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
2262+# MAN_EXTENSION with the initial . removed.
2263+# This tag requires that the tag GENERATE_MAN is set to YES.
2264+
2265+MAN_SUBDIR =
2266+
2267+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
2268+# will generate one additional man file for each entity documented in the real
2269+# man page(s). These additional files only source the real man page, but without
2270+# them the man command would be unable to find the correct page.
2271+# The default value is: NO.
2272+# This tag requires that the tag GENERATE_MAN is set to YES.
2273+
2274+MAN_LINKS = NO
2275+
2276+#---------------------------------------------------------------------------
2277+# Configuration options related to the XML output
2278+#---------------------------------------------------------------------------
2279+
2280+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
2281+# captures the structure of the code including all documentation.
2282+# The default value is: NO.
2283+
2284+GENERATE_XML = NO
2285+
2286+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
2287+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2288+# it.
2289+# The default directory is: xml.
2290+# This tag requires that the tag GENERATE_XML is set to YES.
2291+
2292+XML_OUTPUT = xml
2293+
2294+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
2295+# listings (including syntax highlighting and cross-referencing information) to
2296+# the XML output. Note that enabling this will significantly increase the size
2297+# of the XML output.
2298+# The default value is: YES.
2299+# This tag requires that the tag GENERATE_XML is set to YES.
2300+
2301+XML_PROGRAMLISTING = YES
2302+
2303+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
2304+# namespace members in file scope as well, matching the HTML output.
2305+# The default value is: NO.
2306+# This tag requires that the tag GENERATE_XML is set to YES.
2307+
2308+XML_NS_MEMB_FILE_SCOPE = NO
2309+
2310+#---------------------------------------------------------------------------
2311+# Configuration options related to the DOCBOOK output
2312+#---------------------------------------------------------------------------
2313+
2314+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
2315+# that can be used to generate PDF.
2316+# The default value is: NO.
2317+
2318+GENERATE_DOCBOOK = NO
2319+
2320+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
2321+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
2322+# front of it.
2323+# The default directory is: docbook.
2324+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
2325+
2326+DOCBOOK_OUTPUT = docbook
2327+
2328+#---------------------------------------------------------------------------
2329+# Configuration options for the AutoGen Definitions output
2330+#---------------------------------------------------------------------------
2331+
2332+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
2333+# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures
2334+# the structure of the code including all documentation. Note that this feature
2335+# is still experimental and incomplete at the moment.
2336+# The default value is: NO.
2337+
2338+GENERATE_AUTOGEN_DEF = NO
2339+
2340+#---------------------------------------------------------------------------
2341+# Configuration options related to Sqlite3 output
2342+#---------------------------------------------------------------------------
2343+
2344+# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3
2345+# database with symbols found by doxygen stored in tables.
2346+# The default value is: NO.
2347+
2348+GENERATE_SQLITE3 = NO
2349+
2350+# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be
2351+# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put
2352+# in front of it.
2353+# The default directory is: sqlite3.
2354+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
2355+
2356+SQLITE3_OUTPUT = sqlite3
2357+
2358+# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db
2359+# database file will be recreated with each doxygen run. If set to NO, doxygen
2360+# will warn if an a database file is already found and not modify it.
2361+# The default value is: YES.
2362+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
2363+
2364+SQLITE3_RECREATE_DB = YES
2365+
2366+#---------------------------------------------------------------------------
2367+# Configuration options related to the Perl module output
2368+#---------------------------------------------------------------------------
2369+
2370+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
2371+# file that captures the structure of the code including all documentation.
2372+#
2373+# Note that this feature is still experimental and incomplete at the moment.
2374+# The default value is: NO.
2375+
2376+GENERATE_PERLMOD = NO
2377+
2378+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
2379+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
2380+# output from the Perl module output.
2381+# The default value is: NO.
2382+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2383+
2384+PERLMOD_LATEX = NO
2385+
2386+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
2387+# formatted so it can be parsed by a human reader. This is useful if you want to
2388+# understand what is going on. On the other hand, if this tag is set to NO, the
2389+# size of the Perl module output will be much smaller and Perl will parse it
2390+# just the same.
2391+# The default value is: YES.
2392+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2393+
2394+PERLMOD_PRETTY = YES
2395+
2396+# The names of the make variables in the generated doxyrules.make file are
2397+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
2398+# so different doxyrules.make files included by the same Makefile don't
2399+# overwrite each other's variables.
2400+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2401+
2402+PERLMOD_MAKEVAR_PREFIX =
2403+
2404+#---------------------------------------------------------------------------
2405+# Configuration options related to the preprocessor
2406+#---------------------------------------------------------------------------
2407+
2408+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
2409+# C-preprocessor directives found in the sources and include files.
2410+# The default value is: YES.
2411+
2412+ENABLE_PREPROCESSING = YES
2413+
2414+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
2415+# in the source code. If set to NO, only conditional compilation will be
2416+# performed. Macro expansion can be done in a controlled way by setting
2417+# EXPAND_ONLY_PREDEF to YES.
2418+# The default value is: NO.
2419+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2420+
2421+MACRO_EXPANSION = NO
2422+
2423+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
2424+# the macro expansion is limited to the macros specified with the PREDEFINED and
2425+# EXPAND_AS_DEFINED tags.
2426+# The default value is: NO.
2427+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2428+
2429+EXPAND_ONLY_PREDEF = NO
2430+
2431+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
2432+# INCLUDE_PATH will be searched if a #include is found.
2433+# The default value is: YES.
2434+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2435+
2436+SEARCH_INCLUDES = YES
2437+
2438+# The INCLUDE_PATH tag can be used to specify one or more directories that
2439+# contain include files that are not input files but should be processed by the
2440+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
2441+# RECURSIVE has no effect here.
2442+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
2443+
2444+INCLUDE_PATH =
2445+
2446+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
2447+# patterns (like *.h and *.hpp) to filter out the header-files in the
2448+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
2449+# used.
2450+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2451+
2452+INCLUDE_FILE_PATTERNS =
2453+
2454+# The PREDEFINED tag can be used to specify one or more macro names that are
2455+# defined before the preprocessor is started (similar to the -D option of e.g.
2456+# gcc). The argument of the tag is a list of macros of the form: name or
2457+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
2458+# is assumed. To prevent a macro definition from being undefined via #undef or
2459+# recursively expanded use the := operator instead of the = operator.
2460+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2461+
2462+PREDEFINED =
2463+
2464+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
2465+# tag can be used to specify a list of macro names that should be expanded. The
2466+# macro definition that is found in the sources will be used. Use the PREDEFINED
2467+# tag if you want to use a different macro definition that overrules the
2468+# definition found in the source code.
2469+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2470+
2471+EXPAND_AS_DEFINED =
2472+
2473+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
2474+# remove all references to function-like macros that are alone on a line, have
2475+# an all uppercase name, and do not end with a semicolon. Such function macros
2476+# are typically used for boiler-plate code, and will confuse the parser if not
2477+# removed.
2478+# The default value is: YES.
2479+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2480+
2481+SKIP_FUNCTION_MACROS = YES
2482+
2483+#---------------------------------------------------------------------------
2484+# Configuration options related to external references
2485+#---------------------------------------------------------------------------
2486+
2487+# The TAGFILES tag can be used to specify one or more tag files. For each tag
2488+# file the location of the external documentation should be added. The format of
2489+# a tag file without this location is as follows:
2490+# TAGFILES = file1 file2 ...
2491+# Adding location for the tag files is done as follows:
2492+# TAGFILES = file1=loc1 "file2 = loc2" ...
2493+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
2494+# section "Linking to external documentation" for more information about the use
2495+# of tag files.
2496+# Note: Each tag file must have a unique name (where the name does NOT include
2497+# the path). If a tag file is not located in the directory in which doxygen is
2498+# run, you must also specify the path to the tagfile here.
2499+
2500+TAGFILES =
2501+
2502+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
2503+# tag file that is based on the input files it reads. See section "Linking to
2504+# external documentation" for more information about the usage of tag files.
2505+
2506+GENERATE_TAGFILE =
2507+
2508+# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces
2509+# will be listed in the class and namespace index. If set to NO, only the
2510+# inherited external classes will be listed.
2511+# The default value is: NO.
2512+
2513+ALLEXTERNALS = NO
2514+
2515+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
2516+# in the topic index. If set to NO, only the current project's groups will be
2517+# listed.
2518+# The default value is: YES.
2519+
2520+EXTERNAL_GROUPS = YES
2521+
2522+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
2523+# the related pages index. If set to NO, only the current project's pages will
2524+# be listed.
2525+# The default value is: YES.
2526+
2527+EXTERNAL_PAGES = YES
2528+
2529+#---------------------------------------------------------------------------
2530+# Configuration options related to diagram generator tools
2531+#---------------------------------------------------------------------------
2532+
2533+# If set to YES the inheritance and collaboration graphs will hide inheritance
2534+# and usage relations if the target is undocumented or is not a class.
2535+# The default value is: YES.
2536+
2537+HIDE_UNDOC_RELATIONS = YES
2538+
2539+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
2540+# available from the path. This tool is part of Graphviz (see:
2541+# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
2542+# Bell Labs. The other options in this section have no effect if this option is
2543+# set to NO
2544+# The default value is: YES.
2545+
2546+HAVE_DOT = YES
2547+
2548+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
2549+# to run in parallel. When set to 0 doxygen will base this on the number of
2550+# processors available in the system. You can set it explicitly to a value
2551+# larger than 0 to get control over the balance between CPU load and processing
2552+# speed.
2553+# Minimum value: 0, maximum value: 32, default value: 0.
2554+# This tag requires that the tag HAVE_DOT is set to YES.
2555+
2556+DOT_NUM_THREADS = 0
2557+
2558+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
2559+# subgraphs. When you want a differently looking font in the dot files that
2560+# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
2561+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
2562+# Edge and Graph Attributes specification</a> You need to make sure dot is able
2563+# to find the font, which can be done by putting it in a standard location or by
2564+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
2565+# directory containing the font. Default graphviz fontsize is 14.
2566+# The default value is: fontname=Helvetica,fontsize=10.
2567+# This tag requires that the tag HAVE_DOT is set to YES.
2568+
2569+DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
2570+
2571+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
2572+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
2573+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
2574+# arrows shapes.</a>
2575+# The default value is: labelfontname=Helvetica,labelfontsize=10.
2576+# This tag requires that the tag HAVE_DOT is set to YES.
2577+
2578+DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
2579+
2580+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
2581+# around nodes set 'shape=plain' or 'shape=plaintext' <a
2582+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
2583+# The default value is: shape=box,height=0.2,width=0.4.
2584+# This tag requires that the tag HAVE_DOT is set to YES.
2585+
2586+DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
2587+
2588+# You can set the path where dot can find font specified with fontname in
2589+# DOT_COMMON_ATTR and others dot attributes.
2590+# This tag requires that the tag HAVE_DOT is set to YES.
2591+
2592+DOT_FONTPATH =
2593+
2594+# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will
2595+# generate a graph for each documented class showing the direct and indirect
2596+# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and
2597+# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case
2598+# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the
2599+# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used.
2600+# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance
2601+# relations will be shown as texts / links.
2602+# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN.
2603+# The default value is: YES.
2604+
2605+CLASS_GRAPH = YES
2606+
2607+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
2608+# graph for each documented class showing the direct and indirect implementation
2609+# dependencies (inheritance, containment, and class references variables) of the
2610+# class with other documented classes. Explicit enabling a collaboration graph,
2611+# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the
2612+# command \collaborationgraph. Disabling a collaboration graph can be
2613+# accomplished by means of the command \hidecollaborationgraph.
2614+# The default value is: YES.
2615+# This tag requires that the tag HAVE_DOT is set to YES.
2616+
2617+COLLABORATION_GRAPH = YES
2618+
2619+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
2620+# groups, showing the direct groups dependencies. Explicit enabling a group
2621+# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means
2622+# of the command \groupgraph. Disabling a directory graph can be accomplished by
2623+# means of the command \hidegroupgraph. See also the chapter Grouping in the
2624+# manual.
2625+# The default value is: YES.
2626+# This tag requires that the tag HAVE_DOT is set to YES.
2627+
2628+GROUP_GRAPHS = YES
2629+
2630+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
2631+# collaboration diagrams in a style similar to the OMG's Unified Modeling
2632+# Language.
2633+# The default value is: NO.
2634+# This tag requires that the tag HAVE_DOT is set to YES.
2635+
2636+UML_LOOK = NO
2637+
2638+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
2639+# class node. If there are many fields or methods and many nodes the graph may
2640+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
2641+# number of items for each type to make the size more manageable. Set this to 0
2642+# for no limit. Note that the threshold may be exceeded by 50% before the limit
2643+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
2644+# but if the number exceeds 15, the total amount of fields shown is limited to
2645+# 10.
2646+# Minimum value: 0, maximum value: 100, default value: 10.
2647+# This tag requires that the tag UML_LOOK is set to YES.
2648+
2649+UML_LIMIT_NUM_FIELDS = 10
2650+
2651+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
2652+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
2653+# tag is set to YES, doxygen will add type and arguments for attributes and
2654+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
2655+# will not generate fields with class member information in the UML graphs. The
2656+# class diagrams will look similar to the default class diagrams but using UML
2657+# notation for the relationships.
2658+# Possible values are: NO, YES and NONE.
2659+# The default value is: NO.
2660+# This tag requires that the tag UML_LOOK is set to YES.
2661+
2662+DOT_UML_DETAILS = NO
2663+
2664+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
2665+# to display on a single line. If the actual line length exceeds this threshold
2666+# significantly it will wrapped across multiple lines. Some heuristics are apply
2667+# to avoid ugly line breaks.
2668+# Minimum value: 0, maximum value: 1000, default value: 17.
2669+# This tag requires that the tag HAVE_DOT is set to YES.
2670+
2671+DOT_WRAP_THRESHOLD = 17
2672+
2673+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
2674+# collaboration graphs will show the relations between templates and their
2675+# instances.
2676+# The default value is: NO.
2677+# This tag requires that the tag HAVE_DOT is set to YES.
2678+
2679+TEMPLATE_RELATIONS = NO
2680+
2681+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
2682+# YES then doxygen will generate a graph for each documented file showing the
2683+# direct and indirect include dependencies of the file with other documented
2684+# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO,
2685+# can be accomplished by means of the command \includegraph. Disabling an
2686+# include graph can be accomplished by means of the command \hideincludegraph.
2687+# The default value is: YES.
2688+# This tag requires that the tag HAVE_DOT is set to YES.
2689+
2690+INCLUDE_GRAPH = YES
2691+
2692+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
2693+# set to YES then doxygen will generate a graph for each documented file showing
2694+# the direct and indirect include dependencies of the file with other documented
2695+# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set
2696+# to NO, can be accomplished by means of the command \includedbygraph. Disabling
2697+# an included by graph can be accomplished by means of the command
2698+# \hideincludedbygraph.
2699+# The default value is: YES.
2700+# This tag requires that the tag HAVE_DOT is set to YES.
2701+
2702+INCLUDED_BY_GRAPH = YES
2703+
2704+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
2705+# dependency graph for every global function or class method.
2706+#
2707+# Note that enabling this option will significantly increase the time of a run.
2708+# So in most cases it will be better to enable call graphs for selected
2709+# functions only using the \callgraph command. Disabling a call graph can be
2710+# accomplished by means of the command \hidecallgraph.
2711+# The default value is: NO.
2712+# This tag requires that the tag HAVE_DOT is set to YES.
2713+
2714+CALL_GRAPH = NO
2715+
2716+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
2717+# dependency graph for every global function or class method.
2718+#
2719+# Note that enabling this option will significantly increase the time of a run.
2720+# So in most cases it will be better to enable caller graphs for selected
2721+# functions only using the \callergraph command. Disabling a caller graph can be
2722+# accomplished by means of the command \hidecallergraph.
2723+# The default value is: NO.
2724+# This tag requires that the tag HAVE_DOT is set to YES.
2725+
2726+CALLER_GRAPH = NO
2727+
2728+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
2729+# hierarchy of all classes instead of a textual one.
2730+# The default value is: YES.
2731+# This tag requires that the tag HAVE_DOT is set to YES.
2732+
2733+GRAPHICAL_HIERARCHY = YES
2734+
2735+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
2736+# dependencies a directory has on other directories in a graphical way. The
2737+# dependency relations are determined by the #include relations between the
2738+# files in the directories. Explicit enabling a directory graph, when
2739+# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command
2740+# \directorygraph. Disabling a directory graph can be accomplished by means of
2741+# the command \hidedirectorygraph.
2742+# The default value is: YES.
2743+# This tag requires that the tag HAVE_DOT is set to YES.
2744+
2745+DIRECTORY_GRAPH = YES
2746+
2747+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
2748+# of child directories generated in directory dependency graphs by dot.
2749+# Minimum value: 1, maximum value: 25, default value: 1.
2750+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
2751+
2752+DIR_GRAPH_MAX_DEPTH = 1
2753+
2754+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
2755+# generated by dot. For an explanation of the image formats see the section
2756+# output formats in the documentation of the dot tool (Graphviz (see:
2757+# https://www.graphviz.org/)).
2758+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
2759+# to make the SVG files visible in IE 9+ (other browsers do not have this
2760+# requirement).
2761+# Possible values are: png, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd,
2762+# gif, gif:cairo, gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd,
2763+# png:cairo, png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
2764+# png:gdiplus:gdiplus.
2765+# The default value is: png.
2766+# This tag requires that the tag HAVE_DOT is set to YES.
2767+
2768+DOT_IMAGE_FORMAT = png
2769+
2770+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
2771+# enable generation of interactive SVG images that allow zooming and panning.
2772+#
2773+# Note that this requires a modern browser other than Internet Explorer. Tested
2774+# and working are Firefox, Chrome, Safari, and Opera.
2775+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
2776+# the SVG files visible. Older versions of IE do not have SVG support.
2777+# The default value is: NO.
2778+# This tag requires that the tag HAVE_DOT is set to YES.
2779+
2780+INTERACTIVE_SVG = NO
2781+
2782+# The DOT_PATH tag can be used to specify the path where the dot tool can be
2783+# found. If left blank, it is assumed the dot tool can be found in the path.
2784+# This tag requires that the tag HAVE_DOT is set to YES.
2785+
2786+DOT_PATH =
2787+
2788+# The DOTFILE_DIRS tag can be used to specify one or more directories that
2789+# contain dot files that are included in the documentation (see the \dotfile
2790+# command).
2791+# This tag requires that the tag HAVE_DOT is set to YES.
2792+
2793+DOTFILE_DIRS =
2794+
2795+# You can include diagrams made with dia in doxygen documentation. Doxygen will
2796+# then run dia to produce the diagram and insert it in the documentation. The
2797+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
2798+# If left empty dia is assumed to be found in the default search path.
2799+
2800+DIA_PATH =
2801+
2802+# The DIAFILE_DIRS tag can be used to specify one or more directories that
2803+# contain dia files that are included in the documentation (see the \diafile
2804+# command).
2805+
2806+DIAFILE_DIRS =
2807+
2808+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
2809+# path where java can find the plantuml.jar file or to the filename of jar file
2810+# to be used. If left blank, it is assumed PlantUML is not used or called during
2811+# a preprocessing step. Doxygen will generate a warning when it encounters a
2812+# \startuml command in this case and will not generate output for the diagram.
2813+
2814+PLANTUML_JAR_PATH =
2815+
2816+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
2817+# configuration file for plantuml.
2818+
2819+PLANTUML_CFG_FILE =
2820+
2821+# When using plantuml, the specified paths are searched for files specified by
2822+# the !include statement in a plantuml block.
2823+
2824+PLANTUML_INCLUDE_PATH =
2825+
2826+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
2827+# that will be shown in the graph. If the number of nodes in a graph becomes
2828+# larger than this value, doxygen will truncate the graph, which is visualized
2829+# by representing a node as a red box. Note that doxygen if the number of direct
2830+# children of the root node in a graph is already larger than
2831+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
2832+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
2833+# Minimum value: 0, maximum value: 10000, default value: 50.
2834+# This tag requires that the tag HAVE_DOT is set to YES.
2835+
2836+DOT_GRAPH_MAX_NODES = 50
2837+
2838+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
2839+# generated by dot. A depth value of 3 means that only nodes reachable from the
2840+# root by following a path via at most 3 edges will be shown. Nodes that lay
2841+# further from the root node will be omitted. Note that setting this option to 1
2842+# or 2 may greatly reduce the computation time needed for large code bases. Also
2843+# note that the size of a graph can be further restricted by
2844+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
2845+# Minimum value: 0, maximum value: 1000, default value: 0.
2846+# This tag requires that the tag HAVE_DOT is set to YES.
2847+
2848+MAX_DOT_GRAPH_DEPTH = 0
2849+
2850+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
2851+# files in one run (i.e. multiple -o and -T options on the command line). This
2852+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
2853+# this, this feature is disabled by default.
2854+# The default value is: NO.
2855+# This tag requires that the tag HAVE_DOT is set to YES.
2856+
2857+DOT_MULTI_TARGETS = NO
2858+
2859+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
2860+# explaining the meaning of the various boxes and arrows in the dot generated
2861+# graphs.
2862+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
2863+# graphical representation for inheritance and collaboration diagrams is used.
2864+# The default value is: YES.
2865+# This tag requires that the tag HAVE_DOT is set to YES.
2866+
2867+GENERATE_LEGEND = YES
2868+
2869+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
2870+# files that are used to generate the various graphs.
2871+#
2872+# Note: This setting is not only used for dot files but also for msc temporary
2873+# files.
2874+# The default value is: YES.
2875+
2876+DOT_CLEANUP = YES
2877+
2878+# You can define message sequence charts within doxygen comments using the \msc
2879+# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will
2880+# use a built-in version of mscgen tool to produce the charts. Alternatively,
2881+# the MSCGEN_TOOL tag can also specify the name an external tool. For instance,
2882+# specifying prog as the value, doxygen will call the tool as prog -T
2883+# <outfile_format> -o <outputfile> <inputfile>. The external tool should support
2884+# output file formats "png", "eps", "svg", and "ismap".
2885+
2886+MSCGEN_TOOL =
2887+
2888+# The MSCFILE_DIRS tag can be used to specify one or more directories that
2889+# contain msc files that are included in the documentation (see the \mscfile
2890+# command).
2891+
2892+MSCFILE_DIRS =
2893diff --git a/include/grim.h b/include/grim.h
2894index d0fe315..638c4d2 100644
2895--- a/include/grim.h
2896+++ b/include/grim.h
2897@@ -90,6 +90,12 @@ public:
2898 std::string print(int indent = 0);
2899 };
2900
2901+/*!
2902+ * Parse the parts of a CSS selector
2903+ *
2904+ * @param selector A CSS selector
2905+ * @return
2906+*/
2907 std::vector<std::vector<std::string>> parseSelectorParts(std::string);
2908
2909 #endif // NODE_H
2910diff --git a/src/grim.cc b/src/grim.cc
2911index 25bad64..2cdc017 100755
2912--- a/src/grim.cc
2913+++ b/src/grim.cc
2914@@ -249,29 +249,33 @@ std::vector<std::vector<std::string>> parseSelectorParts(std::string selector) {
2915 }
2916
2917 if (s == ' ' && nesting == 0) {
2918- if (e > 0 && selector[e-1] != ':' && selector[e-1] != ',' && selector[e-1] != '#' && selector[e-1] != '.') {
2919- continue;
2920- } else
2921- if (e < sl-1 && selector[e+1] != ':' && selector[e+1] != ',' && selector[e+1] != '#' && selector[e+1] != '.') {
2922- continue;
2923+ if (e > 0 && e < sl-1) {
2924+ bool prevMatch = selector[e-1] == '>' || selector[e-1] == '+' || selector[e-1] == '~';
2925+ bool nextMatch = selector[e+1] == '>' || selector[e+1] == '+' || selector[e+1] == '~';
2926+
2927+ if (prevMatch && !nextMatch) {
2928+ s = '\0';
2929+ } else if (!prevMatch && nextMatch) {
2930+ s = '\0';
2931+ }
2932 }
2933 }
2934
2935 if (nesting == 0 && !current.empty()) {
2936 // !ISSUE: Missing space
2937- if (s == ':' || s == '[' || s == ',' || s == '#' || s == '.' || s == ' ') {
2938+ if (s == ':' || s == '[' || s == ',' || s == '#' || s == '.') {
2939 buffer.push_back(trimSpace(current));
2940 current = s;
2941 } else
2942- if (s == '>' || s == '+' || s == '~') {
2943+ if (s == '>' || s == '+' || s == '~' || s == ' ') {
2944 buffer.push_back(trimSpace(current));
2945 buffer.push_back("");
2946 buffer.back() += s;
2947 current = "";
2948- } else {
2949+ } else if (s != '\0') {
2950 current += s;
2951 }
2952- } else {
2953+ } else if (s != '\0') {
2954 current += s;
2955 }
2956
2957@@ -281,7 +285,7 @@ std::vector<std::vector<std::string>> parseSelectorParts(std::string selector) {
2958 buffer.push_back(trimSpace(current));
2959 }
2960 parts.push_back(buffer);
2961- buffer = {};
2962+ buffer.clear();
2963 current = "";
2964 }
2965 if (s == '(' || s == '[' || s == '{') {
2966@@ -387,28 +391,8 @@ class StyleHandler {
2967 // we need to pull the selectors from each candidate then run testSelector on it
2968 }
2969 };
2970-
2971-
2972-
2973-void popSelector(std::string selector, std::string& trimmed, std::string& popped, char& symbol) {
2974- for (size_t i = selector.length()-1; i >= 0; i--) {
2975- if (
2976- selector[i] == ' ' ||
2977- selector[i] == '>' ||
2978- selector[i] == '~' ||
2979- selector[i] == '+'
2980- ) {
2981- symbol = selector[i];
2982- trimmed = selector.substr(0,i);
2983- break;
2984- } else {
2985- popped = selector[i]+popped;
2986- }
2987- }
2988-}
2989-
2990 /*
2991-bool testSelector(Node* node, std::string selector) {
2992+bool testSelector(Node* node, std::vector<std::vector<std::string>> selector) {
2993 // By the time we get here, we know the right most selector some what matches
2994 // so now if it is a compound selector we should see if the parent('s) some what match
2995 if (selector == "*") {
2996@@ -416,15 +400,32 @@ bool testSelector(Node* node, std::string selector) {
2997 }
2998
2999
3000- std::string trimmed, popped;
3001- char symbol;
3002- popSelector(selector, trimmed, popped, symbol);
3003+ if (selector.size() > 1) {
3004+ // If a selector is made up of several different selectors
3005+ // ie h1, h2, h3
3006+ // run each selector and return on a match
3007+ for (auto s : selector) {
3008+ bool match = testSelector({s});
3009+ if (match) {
3010+ return true;
3011+ }
3012+ }
3013+ return false;
3014+ }
3015+
3016
3017+ std::vector<std::string> parts;
3018
3019- // Check if popped matches this element
3020+ for (size_t i = selector[0].size()-1; i >= 0; i--) {
3021+ std::string part = selector[0][i];
3022+ if (part != '>' || part != ' ' || part != '+' || part != '~') {
3023+ parts.insert(0, part);
3024+ } else {
3025+ break;
3026+ }
3027+ }
3028+
3029
3030- std::vector<std::vector<std::string>> pParts = parseSelectorParts(popped);
3031-
3032 bool matched = true;
3033
3034 std::vector<std::string> nodeClasses = node->classList.values();
3035@@ -535,6 +536,4 @@ bool testSelector(Node* node, std::string selector) {
3036 }
3037
3038 return matched;
3039-}
3040-
3041-*/
3042+}*/
3043diff --git a/src/grim.cc.bak b/src/grim.cc.bak
3044deleted file mode 100755
3045index 36ec981..0000000
3046--- a/src/grim.cc.bak
3047+++ /dev/null
3048@@ -1,602 +0,0 @@
3049-#include "grim.h"
3050-#include <iostream>
3051-#include <sstream>
3052-#include <algorithm>
3053-#include <stdexcept>
3054-#include <cctype>
3055-
3056-std::string ClassList::value() const {
3057- if (classes.empty()) {
3058- return "";
3059- }
3060- std::string collection = classes[0];
3061- for (size_t i = 1; i < classes.size(); ++i) {
3062- collection += " " + classes[i];
3063- }
3064- return collection;
3065-}
3066-
3067-std::vector<std::string> ClassList::values() {
3068- return classes;
3069-}
3070-
3071-void ClassList::add(std::string value) {
3072- classes.push_back(value);
3073-}
3074-
3075-void ClassList::remove(std::string value) {
3076- auto it_prev = std::find(classes.begin(), classes.end(), value);
3077- if (it_prev != classes.end()) {
3078- *it_prev = classes.back();
3079- classes.pop_back();
3080- }
3081-}
3082-
3083-// Constructor
3084-Node::Node() : parent(nullptr) {}
3085-
3086-std::string Node::getTagName() const { return TagName; }
3087-void Node::setTagName(const std::string& name) { TagName = name; }
3088-
3089-const std::unordered_map<std::string, std::string>& Node::getAttributes() const {
3090- return Attributes;
3091-}
3092-
3093-// Implement the getter/setter methods declared using the macro
3094-#define IMPLEMENT_ATTRIBUTE_ACCESSORS(_Type, _FuncNameSuffix, _AttrKeyString) \
3095- _Type Node::get##_FuncNameSuffix() const { \
3096- return getAttribute<_Type>(_AttrKeyString); \
3097- } \
3098- void Node::set##_FuncNameSuffix(_Type value) { \
3099- setAttribute(_AttrKeyString, value); \
3100- }
3101-
3102-IMPLEMENT_ATTRIBUTE_ACCESSORS(std::string, Id, "id")
3103-IMPLEMENT_ATTRIBUTE_ACCESSORS(std::string, InnerText, "innerText")
3104-IMPLEMENT_ATTRIBUTE_ACCESSORS(bool, ContentEditable, "contenteditable")
3105-IMPLEMENT_ATTRIBUTE_ACCESSORS(std::string, Href, "href")
3106-IMPLEMENT_ATTRIBUTE_ACCESSORS(std::string, Src, "src")
3107-IMPLEMENT_ATTRIBUTE_ACCESSORS(std::string, Title, "title")
3108-IMPLEMENT_ATTRIBUTE_ACCESSORS(std::string, Value, "value")
3109-IMPLEMENT_ATTRIBUTE_ACCESSORS(int, TabIndex, "tabindex")
3110-IMPLEMENT_ATTRIBUTE_ACCESSORS(bool, Disabled, "disabled")
3111-IMPLEMENT_ATTRIBUTE_ACCESSORS(bool, Required, "required")
3112-IMPLEMENT_ATTRIBUTE_ACCESSORS(bool, Checked, "checked")
3113-
3114-Node* Node::createElement(std::string name) {
3115- std::unique_ptr<Node> newNode = std::make_unique<Node>();
3116- newNode->setTagName(name);
3117- newNode->parent = this;
3118- children.push_back(std::move(newNode));
3119- return children.back().get();
3120-}
3121-
3122-template<typename T>
3123-void Node::setAttribute(const std::string& name, const T& value) {
3124- if constexpr (std::is_same_v<T, bool>) {
3125- if (value) {
3126- Attributes[name] = "";
3127- } else {
3128- Attributes.erase(name);
3129- }
3130- } else if constexpr (std::is_arithmetic_v<T>) {
3131- Attributes[name] = std::to_string(value);
3132- } else {
3133- static_assert(std::is_convertible_v<T, std::string>,
3134- "setAttribute: Type cannot be converted to std::string automatically.");
3135- Attributes[name] = static_cast<std::string>(value);
3136- }
3137-}
3138-
3139-void Node::setAttribute(const std::string& name, const std::string& value) {
3140- Attributes[name] = value;
3141-}
3142-
3143-template<typename T>
3144-T Node::getAttribute(const std::string& name) const {
3145- auto it = Attributes.find(name);
3146- if (it != Attributes.end()) {
3147- const std::string& s = it->second;
3148-
3149- if constexpr (std::is_same_v<T, int>) {
3150- try {
3151- return std::stoi(s);
3152- } catch (const std::invalid_argument& e) {
3153- return 0;
3154- } catch (const std::out_of_range& e) {
3155- return 0;
3156- }
3157- } else if constexpr (std::is_same_v<T, bool>) {
3158- std::string lower_s = s;
3159- std::transform(lower_s.begin(), lower_s.end(), lower_s.begin(),
3160- [](unsigned char c){ return std::tolower(c); });
3161- return (!lower_s.empty() && lower_s != "false");
3162- } else if constexpr (std::is_same_v<T, double>) {
3163- try {
3164- return std::stod(s);
3165- } catch (const std::invalid_argument& e) {
3166- return 0.0;
3167- } catch (const std::out_of_range& e) {
3168- return 0.0;
3169- }
3170- } else {
3171- static_assert(std::is_convertible_v<std::string, T>,
3172- "getAttribute: Type conversion from std::string not implemented for this type.");
3173- return static_cast<T>(s);
3174- }
3175- }
3176- return T();
3177-}
3178-
3179-std::string Node::getAttribute(const std::string& name) const {
3180- auto it = Attributes.find(name);
3181- if (it != Attributes.end()) {
3182- return it->second;
3183- }
3184- return "";
3185-}
3186-
3187-std::vector<std::string> Node::getAttributeKeys() {
3188- std::vector<std::string> keys;
3189-
3190- for(auto p : Attributes) {
3191- keys.push_back(p.first);
3192- }
3193- return keys;
3194-}
3195-
3196-std::string Node::print(int indent) {
3197- std::string out = "";
3198- for (int i = 0; i < indent; ++i) {
3199- out += " ";
3200- }
3201-
3202- out += "<" + getTagName();
3203- for (const auto& attr_pair : getAttributes()) {
3204- if (attr_pair.first == "innerText" || attr_pair.first == "tagName") {
3205- continue;
3206- }
3207- out += " " + attr_pair.first;
3208- if (!attr_pair.second.empty()) {
3209- out += "=\"" + attr_pair.second + "\"";
3210- }
3211- }
3212- out += ">";
3213-
3214- if (!getAttribute("innerText").empty()) {
3215- out += "\n" + getAttribute("innerText");
3216- }
3217-
3218- out += "\n";
3219-
3220- for (const auto& child : children) {
3221- out += child->print(indent + 1)+"\n";
3222- }
3223-
3224- for (int i = 0; i < indent; ++i) {
3225- out += " ";
3226- }
3227- out += "</" + getTagName() + ">\n";
3228-
3229- return out;
3230-}
3231-
3232-struct Style {
3233- std::unordered_map<std::string, std::string> properties;
3234- std::string selector;
3235- // Index of when it was added (for cascading)
3236- size_t index;
3237-};
3238-
3239-// splitSelector takes a CSS selector and splits it by a key
3240-// it ingores any key that is inside (), [], or {}
3241-// Used in testSelector to take a compound selector and match each one to the
3242-// passed node until a match is found.
3243-std::vector<std::string> splitSelector(std::string selector, char key) {
3244- size_t nesting = 0;
3245-
3246- std::vector<std::string> selectors;
3247- std::string current = "";
3248-
3249- for (auto s : selector) {
3250- if (s == '(') {
3251- nesting++;
3252- } else if (s == ')') {
3253- nesting--;
3254- } else if (s == '[') {
3255- nesting++;
3256- } else if (s == ']') {
3257- nesting--;
3258- } else if (s == '{') {
3259- nesting++;
3260- } else if (s == '}') {
3261- nesting--;
3262- } else if (s == key && nesting == 0) {
3263- selectors.push_back(current);
3264- current = "";
3265- continue;
3266- }
3267- current += s;
3268- }
3269-
3270- selectors.push_back(current);
3271-
3272- // Trim the space
3273- for (size_t i = 0; i < selectors.size(); i++) {
3274- size_t start = 0;
3275- size_t end = selectors[i].length()-1;
3276- for (size_t s = 0; s < selectors[i].length(); s++) {
3277- if (!std::isspace(selectors[i][s])) {
3278- start = s;
3279- break;
3280- }
3281- }
3282- for (size_t e = selectors[i].length()-1; e > start; e--) {
3283- if (!std::isspace(selectors[i][e])) {
3284- end = e;
3285- break;
3286- }
3287- }
3288- selectors[i] = selectors[i].substr(start,end - start +1);
3289- }
3290-
3291- return selectors;
3292-}
3293-
3294-// This function is used to create a "short list" of full selectors
3295-// that may apply to the element we are targeting.
3296-// When we add a selector to the StyleHandler we use this function to
3297-// create the basemap keys for the style we are adding.
3298-// Additionally we will use this in the testSelector function to test each part of an
3299-// of a selector to an element
3300-// Example: given body > h1:required
3301-// We use parseSelectorParts to get: [h1, :required]
3302-// We test the first element given and it is a required h1
3303-// Next in the testSelector function we see the selector has a >
3304-// so we pass the parent and the second part of the selector:
3305-// body
3306-// Then the process repeats
3307-std::vector<std::string> parseSelectorParts(std::string selector) {
3308- // we want to find the right most (right of a " " > ~ + ) selector
3309- // need to account for selectors with parenthesis like: h1:(+ input:required)
3310- // need to convert all single quotes to double quotes
3311- // need to account for commas, will return
3312- // need to claps all spaces to a single space
3313- // need to trim spaces
3314-
3315- std::vector<std::string> parts;
3316- size_t nesting = 0;
3317-
3318- std::string current = "";
3319-
3320- for (auto s : selector) {
3321- if (s == '(') {
3322- nesting++;
3323- } else if (s == ')') {
3324- nesting--;
3325- } else if (s == '[') {
3326- nesting++;
3327- } else if (s == ']') {
3328- nesting--;
3329- } else if (s == '{') {
3330- nesting++;
3331- } else if (s == '}') {
3332- nesting--;
3333- } else if (s == ',' && nesting == 0) {
3334- // Same logic as splitSelector but we want to inline it here because we
3335- // are already returning a vector so why make two?
3336- //
3337- // Here is the selector part parsing logic, we go backwards until we hit a combined
3338- std::string part;
3339- bool prevWasSpace = false;
3340- for (size_t i = current.length()-1; i >= 0; i--) {
3341- char c = current[i];
3342- if (c == '(') {
3343- nesting++;
3344- continue;
3345- } else if (c == ')') {
3346- nesting--;
3347- continue;
3348- }
3349-
3350- // We will still claps and convert while nested
3351- if (c == ' ') {
3352- // Claps spaces (will not trim)
3353- if (!prevWasSpace) {
3354- part = c + part;
3355- prevWasSpace = true;
3356- }
3357- continue;
3358- } else {
3359- prevWasSpace = false;
3360-
3361- if (c == '\'') {
3362- // convert single quotes to double quotes
3363- part = '\"' + part;
3364- }
3365- continue;
3366- }
3367- if (nesting == 0) {
3368-
3369- }
3370- }
3371- current = "";
3372- continue;
3373- }
3374- current += s;
3375- }
3376-
3377- return deduplicated;
3378-}
3379-
3380-class StyleHandler {
3381- private:
3382- // basemap: Maps baseparts to a index of the styles vector pointing to a Style object
3383- // because processing a CSS selector isn't trivial we want to make a short list of
3384- // the styles that can possibly be a match so we aren't spending a lot of compute
3385- // on a selector that applies to the wrong element. Todo this we take the right most part
3386- // of a selector (that is the part that targets the current element) and we do a few checks
3387- // like is the tagname the same, does it have that class, and do the id's match. If so that
3388- // is a candidate and we run the full selector on it. That includes checking parents,children,
3389- // or what ever else the selector needs to match.
3390- std::unordered_map<std::string, std::vector<size_t>> basemap;
3391- std::vector<Style> styles;
3392-
3393-
3394- std::vector<std::string> parseNodeParts(Node* node) {
3395- std::vector<std::string> parts;
3396-
3397- parts.push_back(node->getTagName());
3398- parts.push_back("#"+node->getId());
3399-
3400- // classes and attributes
3401- auto keys = node->getAttributeKeys();
3402-
3403- for (auto k : keys) {
3404- if (k != "tagName" || k != "id" || k != "innerText" || k != "class") {
3405- std::string v;
3406- std::string av = node->getAttribute(k);
3407- if (av != "") {
3408- v = "=\""+av+"\"";
3409-
3410- }
3411- parts.push_back('['+k+v+']');
3412- }
3413- }
3414-
3415- auto classes = node->classList.values();
3416-
3417- for (auto c : classes) {
3418- parts.push_back("."+c);
3419- }
3420-
3421- return parts;
3422- }
3423-
3424- std::string cleanSelector(std::string selector) {
3425- std::string cleaned;
3426- for (size_t i = 0; i < selector.length(); i++) {
3427- if (selector[i] == ' ' && i > 0 && i < selector.length()-1) {
3428- char prev = selector[i-1];
3429- char next = selector[i+1];
3430-
3431- if (prev != '>' && prev != '+' && prev != '~' && next != '>' && next != '+' && next != '~' && !std::isspace(prev) && !std::isspace(next)) {
3432- cleaned += selector[i];
3433- }
3434- } else if (selector[i] == ' ' && (i == 0 || i == selector.length()-1)) {
3435- continue;
3436- } else {
3437- cleaned += selector[i];
3438- }
3439- }
3440- return cleaned;
3441- }
3442- public:
3443- void add(Style style) {
3444- std::string selector = cleanSelector(style.selector);
3445- style.selector = selector;
3446- size_t index = styles.size();
3447-
3448- style.index = index;
3449- styles.push_back(std::move(style));
3450-
3451- std::vector<std::string> parts = parseSelectorParts(selector);
3452-
3453- for (auto p : parts) {
3454- if (basemap.find(p) != basemap.end()) {
3455- basemap[p].push_back(index);
3456- } else {
3457- std::vector<size_t> bm = {index};
3458- basemap[p] = bm;
3459- }
3460- }
3461- }
3462-
3463- std::unordered_map<std::string, std::string> getStyles(Node* node) {
3464- std::vector<std::string> parts = parseNodeParts(node);
3465-
3466- std::vector<size_t> canidates;
3467-
3468- for (auto p : parts) {
3469- if (auto sty = basemap.find(p); sty != basemap.end()) {
3470- for (auto s : sty->second) {
3471- bool found = false;
3472- // This makes sure we aren't adding the same styles to the candidates list
3473- for (auto c : canidates) {
3474- if (c == s) {
3475- found = true;
3476- break;
3477- }
3478- }
3479- if (!found) {
3480- canidates.push_back(s);
3481- }
3482- }
3483- }
3484- }
3485-
3486- // Now we have the list of candidates next we will refined our selection
3487- // we need to pull the selectors from each candidate then run testSelector on it
3488- }
3489-};
3490-
3491-
3492-
3493-void popSelector(std::string selector, std::string& trimmed, std::string& popped, char& symbol) {
3494- for (size_t i = selector.length()-1; i >= 0; i--) {
3495- if (
3496- selector[i] == ' ' ||
3497- selector[i] == '>' ||
3498- selector[i] == '~' ||
3499- selector[i] == '+'
3500- ) {
3501- symbol = selector[i];
3502- trimmed = selector.substr(0,i);
3503- break;
3504- } else {
3505- popped = selector[i]+popped;
3506- }
3507- }
3508-}
3509-
3510-
3511-bool testSelector(Node* node, std::string selector) {
3512- // By the time we get here, we know the right most selector some what matches
3513- // so now if it is a compound selector we should see if the parent('s) some what match
3514- if (selector == "*") {
3515- return true;
3516- }
3517-
3518- std::vector<std::string> selectors = splitSelector(selector, ',');
3519-
3520- if (selectors.size() > 1) {
3521- for (auto s : selectors) {
3522- bool match = testSelector(node, s);
3523-
3524- if (match) {
3525- return true;
3526- }
3527- }
3528- }
3529-
3530- std::string trimmed, popped;
3531- char symbol;
3532- popSelector(selector, trimmed, popped, symbol);
3533-
3534-
3535- // Check if popped matches this element
3536-
3537- std::vector<std::string> pParts = parseSelectorParts(popped);
3538-
3539- bool matched = true;
3540-
3541- std::vector<std::string> nodeClasses = node->classList.values();
3542- std::unordered_map<std::string, std::string> attributes = node->getAttributes();
3543-
3544-
3545- std::vector<std::string> attrs;
3546-
3547- for (auto a : attributes) {
3548- if (a.second != "") {
3549- attrs.push_back("["+a.first+"=\""+a.second+"\"]");
3550- } else {
3551-
3552- attrs.push_back("["+a.first+"]");
3553- }
3554- }
3555-
3556- for (size_t i = 0; i < pParts.size(); i++) {
3557- std::string p = pParts[i];
3558- if (i == 0 && p[0] != '#' && p[0] != '.' && p[0] != '[') {
3559- matched = node->getTagName() == p;
3560- } else if (p[0] == '#') {
3561- matched = node->getId() == p;
3562- } else if (p[0] == '.') {
3563- // Remove the period
3564- std::string clipped = p.substr(1);
3565- bool found = false;
3566- for (auto c : nodeClasses) {
3567- if (clipped == c) {
3568- found = true;
3569- break;
3570- }
3571- }
3572- matched = found;
3573- } else if (p[0] == '[') {
3574- bool found = false;
3575- for (auto a : attrs) {
3576- if (p == a) {
3577- found = true;
3578- break;
3579- }
3580- }
3581- matched = found;
3582- }
3583-
3584- if (!matched) {
3585- // Return out of the function
3586- return false;
3587- }
3588- }
3589-
3590- // The rest of the logic assumes the other selectors do not match until proven otherwise
3591- matched = false;
3592-
3593- if (symbol == '\0' || node->parent != nullptr) {
3594- return false;
3595- }
3596-
3597- if (symbol == '>') {
3598- // We are just testing the parent node here
3599- matched = testSelector(node->parent, trimmed);
3600- } else if (symbol == '+') {
3601- const auto& children = node->parent->children;
3602- if (children.size() > 1) {
3603- for (size_t i = 0; i < children.size(); i++) {
3604- Node* child_ptr = children[i].get();
3605-
3606- if (child_ptr == node) {
3607- if (i == 0) {
3608- return false;
3609- } else {
3610- // In this selector we just need to get the direct sibling and test it
3611- matched = testSelector(children[i-1].get(), trimmed);
3612- }
3613- break;
3614- }
3615- }
3616- }
3617- } else if (symbol == '~') {
3618- const auto& children = node->parent->children;
3619- if (children.size() > 1) {
3620- for (size_t i = 0; i < children.size(); i++) {
3621- Node* child_ptr = children[i].get();
3622-
3623- if (child_ptr == node) {
3624- break;
3625- } else {
3626- // We have to test every selector before the current element,
3627- // if any match then it matches
3628- matched = testSelector(children[i].get(), trimmed);
3629- if (matched) {
3630- break;
3631- }
3632- }
3633- }
3634- }
3635- } else if (symbol == ' ') {
3636- // For the descendant combinator we have to check every parent until we match or nullptr out
3637- Node* current = node->parent;
3638- while (current != nullptr) {
3639- if (testSelector(current, trimmed)) {
3640- matched = true;
3641- break;
3642- }
3643- current = current->parent;
3644- }
3645- }
3646-
3647- return matched;
3648-}
3649-
3650-
3651diff --git a/tests/css_selector.cc b/tests/css_selector.cc
3652index 44a9589..daf6bae 100644
3653--- a/tests/css_selector.cc
3654+++ b/tests/css_selector.cc
3655@@ -74,4 +74,10 @@ TEST_CASE( "CSS Selection", "[css]" ) {
3656 return parseSelectorParts("input:required, div#id + h1.c1.c2, input[type='password'].class");
3657 };
3658 }
3659+ SECTION("parseSelectorParts can parse a selector with a decendent combinator") {
3660+ checkSelectorParts("div h1", {{"div", " ", "h1"}});
3661+ BENCHMARK("div h1") {
3662+ return parseSelectorParts("div h1");
3663+ };
3664+ }
3665 }