summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTizenOpenSource <tizenopensrc@samsung.com>2022-12-27 15:39:10 +0900
committerTizenOpenSource <tizenopensrc@samsung.com>2022-12-27 15:39:10 +0900
commitcfd886868fa8595b045007a2ad673c18c5f222b3 (patch)
tree5d1b3cd3c098c0e5238e4a6a9be351a67f2d6bc1
parent9cf4982ab5fc6d964e1a024ff91a72d1fee5dc00 (diff)
downloaddoxygen-cfd886868fa8595b045007a2ad673c18c5f222b3.tar.gz
doxygen-cfd886868fa8595b045007a2ad673c18c5f222b3.tar.bz2
doxygen-cfd886868fa8595b045007a2ad673c18c5f222b3.zip
Imported Upstream version 1.9.5upstream/1.9.5
-rw-r--r--.codedocs3
-rw-r--r--.editorconfig8
-rw-r--r--.github/FUNDING.yml13
-rw-r--r--.github/ISSUE_TEMPLATE/report-a-bug-or-issue.md30
-rw-r--r--.github/dependabot.yml6
-rw-r--r--.github/workflows/build_cmake.yml404
-rw-r--r--.github/workflows/coverity.yml80
-rw-r--r--.gitignore22
-rw-r--r--CMakeLists.txt13
-rw-r--r--Doxyfile49
-rw-r--r--README.md2
-rw-r--r--VERSION2
-rw-r--r--addon/doxmlparser/doxmlparser/compound.py2029
-rw-r--r--addon/doxmlparser/examples/metrics/metrics.py52
-rwxr-xr-xaddon/doxmlparser/generateDS_post.py2
-rw-r--r--addon/doxyapp/doxyapp.cpp19
-rwxr-xr-xaddon/doxypysql/search.py48
-rw-r--r--addon/doxysearch/doxyindexer.cpp4
-rw-r--r--addon/doxywizard/CMakeLists.txt56
-rw-r--r--addon/doxywizard/config_doxyw.l6
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/doxywizard.cpp0
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/doxywizard.h0
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/images/add.pngbin1680 -> 1680 bytes
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/images/del.pngbin1592 -> 1592 bytes
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/images/file.pngbin1740 -> 1740 bytes
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/images/folder.pngbin1668 -> 1668 bytes
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/images/refresh.pngbin1823 -> 1823 bytes
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/images/tunecolor.pngbin79154 -> 79154 bytes
-rw-r--r--[-rwxr-xr-x]addon/doxywizard/wizard.cpp0
-rw-r--r--[-rwxr-xr-x]cmake/FindJavacc.cmake0
-rw-r--r--[-rwxr-xr-x]cmake/Sanitizers/asan-wrapper0
-rw-r--r--doc/._archoverview.epsbin233 -> 0 bytes
-rw-r--r--doc/._infoflow.pngbin233 -> 0 bytes
-rw-r--r--doc/Doxyfile3
-rw-r--r--doc/arch.doc2
-rw-r--r--doc/changelog.doc159
-rw-r--r--doc/commands.doc113
-rw-r--r--doc/doxygen.12
-rw-r--r--doc/doxygen_manual.css1
-rw-r--r--doc/doxygen_usage.doc2
-rw-r--r--doc/emojisup.doc2
-rw-r--r--doc/htmlcmds.doc743
-rw-r--r--doc/index.doc4
-rw-r--r--doc/language.tpl2
-rw-r--r--doc/output.doc2
-rw-r--r--doc/preprocessing.doc6
-rw-r--r--doc/tables.doc1
-rw-r--r--doc/translator.py18
-rw-r--r--doc/xmlcmds.doc84
-rw-r--r--examples/CMakeLists.txt81
-rw-r--r--examples/afterdoc.cfg12
-rw-r--r--examples/author.cfg12
-rw-r--r--examples/autolink.cfg12
-rw-r--r--examples/baseexample.cfg9
-rw-r--r--examples/class.cfg12
-rw-r--r--examples/define.cfg12
-rw-r--r--examples/diagrams.cfg12
-rw-r--r--examples/docstring.cfg11
-rw-r--r--examples/enum.cfg12
-rw-r--r--examples/example.cfg12
-rw-r--r--examples/file.cfg12
-rw-r--r--examples/func.cfg12
-rw-r--r--examples/group.cfg12
-rw-r--r--examples/include.cfg12
-rw-r--r--examples/javadoc-banner.cfg12
-rw-r--r--examples/jdstyle.cfg12
-rw-r--r--examples/manual.cfg12
-rw-r--r--examples/memgrp.cfg12
-rw-r--r--examples/mux.cfg11
-rw-r--r--examples/overload.cfg12
-rw-r--r--examples/page.cfg12
-rw-r--r--examples/par.cfg12
-rw-r--r--examples/pyexample.cfg11
-rw-r--r--examples/qtstyle.cfg12
-rw-r--r--examples/relates.cfg12
-rw-r--r--examples/restypedef.cfg12
-rw-r--r--examples/strip_example.py6
-rw-r--r--examples/structcmd.cfg12
-rw-r--r--examples/tag.cfg12
-rw-r--r--examples/templ.cfg12
-rw-r--r--jquery/Makefile2
-rw-r--r--jquery/README2
-rw-r--r--jquery/jquery.ui-1.12.1.min.js7
-rw-r--r--jquery/jquery.ui-1.13.2.min.js6
-rw-r--r--jquery/sass/_sm-dox.scss50
-rw-r--r--jquery/sm-core-css.css2
-rw-r--r--libmscgen/mscgen_lexer.l9
-rw-r--r--src/CMakeLists.txt65
-rw-r--r--src/cache.h1
-rw-r--r--src/cite.cpp21
-rw-r--r--src/clangparser.cpp10
-rw-r--r--src/classdef.cpp82
-rw-r--r--src/classdef.h6
-rw-r--r--src/cmdmapper.cpp6
-rw-r--r--src/cmdmapper.h6
-rw-r--r--src/code.l43
-rw-r--r--src/commentcnv.l10
-rw-r--r--src/commentscan.l130
-rw-r--r--src/config.h13
-rw-r--r--src/config.xml120
-rwxr-xr-xsrc/configgen.py6
-rw-r--r--src/configimpl.h49
-rw-r--r--src/configimpl.l252
-rw-r--r--src/context.cpp4
-rw-r--r--src/datetime.cpp231
-rw-r--r--src/datetime.h73
-rw-r--r--src/debug.cpp1
-rw-r--r--src/debug.h1
-rw-r--r--src/declinfo.l34
-rw-r--r--src/defargs.l4
-rw-r--r--src/define.h1
-rw-r--r--src/definition.cpp19
-rw-r--r--src/diagram.cpp6
-rw-r--r--src/dir.cpp3
-rw-r--r--src/dispatcher.h101
-rw-r--r--src/docbookgen.cpp6
-rw-r--r--src/docbookvisitor.cpp35
-rw-r--r--src/docbookvisitor.h1
-rw-r--r--src/docnode.cpp397
-rw-r--r--src/docnode.h35
-rw-r--r--src/docparser.cpp265
-rw-r--r--src/docparser.h1
-rw-r--r--src/docparser_p.h9
-rw-r--r--src/docsets.cpp16
-rw-r--r--src/docsets.h9
-rw-r--r--src/doctokenizer.h10
-rw-r--r--src/doctokenizer.l135
-rw-r--r--src/dot.cpp2
-rw-r--r--src/dotattributes.h74
-rw-r--r--src/dotdirdeps.cpp45
-rw-r--r--src/dotfilepatcher.cpp8
-rw-r--r--src/dotgraph.cpp20
-rw-r--r--src/dotgraph.h1
-rw-r--r--src/dotgroupcollaboration.cpp21
-rw-r--r--src/dotlegendgraph.cpp38
-rw-r--r--src/dotnode.cpp143
-rw-r--r--src/dotnode.h8
-rw-r--r--src/dotrunner.cpp10
-rw-r--r--src/doxygen.cpp320
-rw-r--r--src/doxygen.h21
-rw-r--r--src/doxygen.md76
-rw-r--r--src/eclipsehelp.cpp125
-rw-r--r--src/eclipsehelp.h25
-rw-r--r--src/filedef.cpp14
-rw-r--r--src/filedef.h1
-rw-r--r--src/fileinfo.cpp2
-rw-r--r--src/filename.h4
-rw-r--r--src/formula.cpp751
-rw-r--r--src/formula.h76
-rw-r--r--src/fortrancode.l42
-rw-r--r--src/fortranscanner.h2
-rw-r--r--[-rwxr-xr-x]src/fortranscanner.l193
-rw-r--r--src/ftvhelp.cpp157
-rw-r--r--src/ftvhelp.h18
-rw-r--r--src/groupdef.cpp4
-rw-r--r--src/growbuf.h5
-rw-r--r--src/htmldocvisitor.cpp147
-rw-r--r--src/htmldocvisitor.h3
-rw-r--r--src/htmlentity.cpp2
-rw-r--r--src/htmlgen.cpp381
-rw-r--r--src/htmlgen.h1
-rw-r--r--src/htmlhelp.cpp37
-rw-r--r--src/htmlhelp.h6
-rw-r--r--src/image.cpp58
-rw-r--r--src/image.h2
-rw-r--r--src/index.cpp15
-rw-r--r--src/index.h99
-rw-r--r--src/indexlist.h134
-rw-r--r--src/latexdocvisitor.cpp15
-rw-r--r--src/latexdocvisitor.h1
-rw-r--r--src/latexgen.cpp9
-rw-r--r--src/layout.cpp4
-rw-r--r--src/mandocvisitor.cpp26
-rw-r--r--src/mandocvisitor.h1
-rw-r--r--src/mangen.cpp2
-rw-r--r--src/markdown.cpp12
-rw-r--r--src/memberdef.cpp23
-rw-r--r--src/memberdef.h2
-rw-r--r--src/membergroup.cpp4
-rw-r--r--src/membergroup.h2
-rw-r--r--src/memberlist.cpp8
-rw-r--r--src/memberlist.h2
-rw-r--r--src/msc.cpp2
-rw-r--r--src/outputlist.h1
-rw-r--r--src/perlmodgen.cpp18
-rw-r--r--src/plantuml.cpp1
-rw-r--r--src/plantuml.h16
-rw-r--r--src/post_lex.py94
-rw-r--r--src/pre.l43
-rw-r--r--src/pre_lex.py64
-rw-r--r--src/printdocvisitor.h25
-rw-r--r--src/pycode.l22
-rw-r--r--src/pyscanner.l14
-rw-r--r--src/qhp.cpp10
-rw-r--r--src/qhp.h8
-rw-r--r--src/regex.h2
-rwxr-xr-xsrc/res2cc_cmd.py172
-rw-r--r--src/rtfdocvisitor.cpp37
-rw-r--r--src/rtfdocvisitor.h1
-rw-r--r--src/rtfgen.cpp11
-rw-r--r--src/scan_states.py4
-rw-r--r--src/scanner.l116
-rw-r--r--src/searchindex.cpp115
-rw-r--r--src/searchindex.h110
-rw-r--r--src/searchindex_js.cpp73
-rw-r--r--src/symbolmap.h38
-rw-r--r--src/symbolresolver.cpp598
-rw-r--r--src/symbolresolver.h11
-rw-r--r--src/tagreader.cpp2
-rw-r--r--[-rwxr-xr-x]src/template.cpp4
-rw-r--r--src/textdocvisitor.h1
-rw-r--r--src/translator.h3
-rw-r--r--src/translator_adapter.h3
-rw-r--r--src/translator_am.h3605
-rw-r--r--src/translator_ar.h17
-rw-r--r--src/translator_bg.h17
-rw-r--r--src/translator_br.h31
-rw-r--r--src/translator_ca.h21
-rw-r--r--src/translator_cn.h19
-rw-r--r--src/translator_cz.h355
-rw-r--r--src/translator_de.h21
-rw-r--r--src/translator_dk.h21
-rw-r--r--src/translator_en.h19
-rw-r--r--src/translator_eo.h21
-rw-r--r--src/translator_es.h25
-rw-r--r--src/translator_fa.h19
-rw-r--r--src/translator_fi.h21
-rw-r--r--src/translator_fr.h25
-rw-r--r--src/translator_gr.h19
-rw-r--r--src/translator_hi.h21
-rw-r--r--src/translator_hr.h21
-rw-r--r--src/translator_hu.h21
-rw-r--r--src/translator_id.h17
-rw-r--r--src/translator_it.h21
-rw-r--r--src/translator_jp.h19
-rw-r--r--src/translator_kr.h19
-rw-r--r--src/translator_lt.h21
-rw-r--r--src/translator_lv.h21
-rw-r--r--src/translator_mk.h19
-rw-r--r--src/translator_nl.h23
-rw-r--r--[-rwxr-xr-x]src/translator_no.h21
-rw-r--r--src/translator_pl.h21
-rw-r--r--src/translator_pt.h31
-rw-r--r--src/translator_ro.h21
-rw-r--r--src/translator_ru.h19
-rw-r--r--src/translator_sc.h19
-rw-r--r--src/translator_si.h21
-rw-r--r--src/translator_sk.h21
-rw-r--r--src/translator_sr.h21
-rw-r--r--src/translator_sv.h21
-rw-r--r--src/translator_tr.h19
-rw-r--r--src/translator_tw.h19
-rw-r--r--src/translator_ua.h19
-rw-r--r--src/translator_vi.h19
-rw-r--r--src/translator_za.h21
-rw-r--r--src/types.h1
-rw-r--r--src/util.cpp410
-rw-r--r--src/util.h21
-rw-r--r--src/vhdldocgen.cpp13
-rw-r--r--src/vhdljjparser.cpp1
-rw-r--r--[-rwxr-xr-x]src/vhdljjparser.h0
-rw-r--r--src/xmldocvisitor.cpp19
-rw-r--r--src/xmldocvisitor.h1
-rw-r--r--src/xmlgen.cpp9
-rw-r--r--templates/html/bc_sd.luma67
-rwxr-xr-xtemplates/html/bib2xhtml.pl1
-rw-r--r--templates/html/darkmode_settings.css158
-rw-r--r--templates/html/darkmode_toggle.js266
-rw-r--r--templates/html/docd.luma50
-rw-r--r--templates/html/doxygen.css630
-rw-r--r--templates/html/dynsections.js2
-rw-r--r--templates/html/extsearch.js15
-rw-r--r--templates/html/fixed_tabs.css33
-rw-r--r--templates/html/header.html3
-rw-r--r--templates/html/htmlbase.tpl6
-rw-r--r--templates/html/htmllayout.tpl3
-rw-r--r--templates/html/htmlmemdef.tpl2
-rw-r--r--templates/html/jquery.js7
-rw-r--r--templates/html/lightmode_settings.css158
-rw-r--r--templates/html/mag.pngbin449 -> 0 bytes
-rw-r--r--templates/html/mag_d.svg37
-rw-r--r--templates/html/mag_sel.pngbin465 -> 0 bytes
-rw-r--r--templates/html/mag_seld.svg74
-rw-r--r--templates/html/menu.js33
-rw-r--r--templates/html/nav_fd.lum11
-rw-r--r--templates/html/nav_h.lum2
-rw-r--r--templates/html/nav_hd.lum7
-rw-r--r--templates/html/navtree.css19
-rw-r--r--templates/html/resize.js81
-rw-r--r--templates/html/search.css76
-rw-r--r--templates/html/search.js116
-rw-r--r--templates/html/search_common.css150
-rw-r--r--templates/html/search_fixedtabs.css104
-rw-r--r--templates/html/search_l.pngbin567 -> 0 bytes
-rw-r--r--templates/html/search_m.pngbin158 -> 0 bytes
-rw-r--r--templates/html/search_nomenu.css92
-rw-r--r--templates/html/search_nomenu_toggle.css17
-rw-r--r--templates/html/search_r.pngbin553 -> 0 bytes
-rw-r--r--templates/html/search_sidebar.css92
-rw-r--r--templates/html/splitbard.lum1028
-rw-r--r--templates/html/tab_ad.lum8
-rw-r--r--templates/html/tab_bd.lum8
-rw-r--r--templates/html/tab_hd.lum8
-rw-r--r--templates/html/tab_sd.lum8
-rw-r--r--templates/html/tabs.css2
-rw-r--r--[-rwxr-xr-x]templates/latex/footer.tex0
-rw-r--r--templates/latex/header.tex3
-rw-r--r--[-rwxr-xr-x]templates/latex/longtable_doxygen.sty0
-rw-r--r--[-rwxr-xr-x]templates/latex/tabu_doxygen.sty0
-rw-r--r--templates/xml/compound.xsd10
-rw-r--r--[-rwxr-xr-x]templates/xml/doxyfile.xsd0
-rw-r--r--testing/028_formula.c8
-rw-r--r--[-rwxr-xr-x]testing/076_emojis.cpp0
-rw-r--r--testing/087/structmymodule_1_1t1.xml33
-rw-r--r--testing/087/structmymodule_1_1t2.xml33
-rw-r--r--testing/087/structmymodule_1_1t3.xml33
-rw-r--r--testing/087/structmymodule_1_1t4.xml33
-rw-r--r--testing/087_public_type.F9035
-rw-r--r--testing/088/namespacem1.xml55
-rw-r--r--testing/088/namespacem2.xml69
-rw-r--r--testing/088_module_var.f9033
-rw-r--r--testing/089/namespacem1.xml55
-rw-r--r--testing/089/namespacem2.xml55
-rw-r--r--testing/089_module_proc.f9045
-rw-r--r--testing/095/namespacem1.xml14
-rw-r--r--testing/095/namespacem2.xml12
-rw-r--r--testing/095/namespacem3.xml12
-rw-r--r--testing/095/structm1_1_1t1.xml45
-rw-r--r--testing/095/structm1_1_1t2.xml52
-rw-r--r--testing/095/structm1_1_1t3.xml50
-rw-r--r--testing/095/structm2_1_1t3.xml50
-rw-r--r--testing/095/structm3_1_1t4.xml38
-rw-r--r--testing/095_inheritance.f0344
-rw-r--r--testing/096/namespacem1.xml14
-rw-r--r--testing/096/namespacem2.xml12
-rw-r--r--testing/096/namespacem3.xml12
-rw-r--r--testing/096/structm1_1_1t1.xml45
-rw-r--r--testing/096/structm1_1_1t2.xml52
-rw-r--r--testing/096/structm1_1_1t3.xml50
-rw-r--r--testing/096/structm2_1_1t3.xml50
-rw-r--r--testing/096/structm3_1_1t4.xml38
-rw-r--r--testing/096_namespace_inheritance.cpp42
-rw-r--r--[-rwxr-xr-x]testing/dtd/xhtml-lat1.ent0
-rw-r--r--[-rwxr-xr-x]testing/dtd/xhtml-special.ent0
-rw-r--r--[-rwxr-xr-x]testing/dtd/xhtml-symbol.ent0
-rw-r--r--[-rwxr-xr-x]testing/dtd/xhtml1-strict.dtd0
-rw-r--r--[-rwxr-xr-x]testing/dtd/xhtml1-transitional.dtd19
-rw-r--r--testing/obsolete11
-rwxr-xr-xtesting/runtests.py1324
-rwxr-xr-xtesting/testsqlite3.py2
-rw-r--r--vhdlparser/vhdl_adj.py2
-rw-r--r--[-rwxr-xr-x]vhdlparser/vhdlparser.jj0
-rw-r--r--[-rwxr-xr-x]vhdlparser/vhdlstring.h0
353 files changed, 14749 insertions, 7919 deletions
diff --git a/.codedocs b/.codedocs
new file mode 100644
index 0000000..699b915
--- /dev/null
+++ b/.codedocs
@@ -0,0 +1,3 @@
+EXCLUDE = addon cmake doc examples jquery templates testing winbuild src/logos.cpp src/lodepng.cpp
+FILE_PATTERNS = *.h *.cpp *.md
+USE_MDFILE_AS_MAINPAGE = src/doxygen.md
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..856e646
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,8 @@
+# See https://editorconfig.org/ for more information.
+
+[*]
+indent_style = space
+indent_size = 2
+
+[*.py]
+indent_size = 4
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..56aba5b
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,13 @@
+# These are supported funding model platforms
+
+github: doxygen
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/.github/ISSUE_TEMPLATE/report-a-bug-or-issue.md b/.github/ISSUE_TEMPLATE/report-a-bug-or-issue.md
new file mode 100644
index 0000000..d328fe7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/report-a-bug-or-issue.md
@@ -0,0 +1,30 @@
+---
+name: Report a bug or issue
+about: Create a report to help us improve doxygen
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+Describe what you see that (you think) is wrong.
+
+**Expected behavior**
+Describe what you would have expected or think is correct.
+
+**Screenshots**
+If useful, add screenshots to help explain your problem.
+
+**To Reproduce**
+Attach a self contained example that allows us to reproduce the problem.
+Such an example typically exist of some source code (can be dummy code) and a doxygen configuration file used (you can strip it using `doxygen -s -u`). After you verified the example demonstrates the problem, put it in a zip (or tarball) and attach it to the bug report. Try to avoid linking to external sources, since they might disappear in the future.
+
+**Version**
+Mention the version of doxygen used (output of `doxygen --version`) and the platform on which you run doxygen (e.g. Windows 10, 64 bit). If you run doxygen under Linux please also mention the name and version of the distribution used (output of `lsb_release -a`) and mention if you compiled doxygen yourself or that you use a binary that comes with the distribution or from the doxygen website.
+
+**Stack trace**
+If you encounter a crash and can build doxygen from sources yourself with debug info (`-DCMAKE_BUILD_TYPE=Debug`), a stack trace can be very helpful (especially if it is not possible to capture the problem in a small example that can be shared).
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..5ace460
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml
new file mode 100644
index 0000000..82c27be
--- /dev/null
+++ b/.github/workflows/build_cmake.yml
@@ -0,0 +1,404 @@
+name: CMake Build for Doxygen
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ name: ${{ matrix.config.name }}
+ runs-on: ${{ matrix.config.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ config:
+ - {
+ name: "Ubuntu Latest GCC Release",
+ os: ubuntu-20.04,
+ build_type: "Release", cc: "gcc", cxx: "g++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Dbuild_search=YES -Dbuild_app=YES -Dbuild_parse=YES -Dbuild_xmlparser=YES -Duse_sqlite3=ON"
+ }
+ - {
+ name: "Ubuntu Latest GCC Debug",
+ os: ubuntu-20.04,
+ build_type: "Debug", cc: "gcc", cxx: "g++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Dbuild_search=YES -Dbuild_app=YES -Dbuild_parse=YES -Dbuild_xmlparser=YES -Duse_sqlite3=ON"
+ }
+ - {
+ name: "Ubuntu Latest Clang Release",
+ os: ubuntu-20.04,
+ build_type: "Release", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Duse_libclang=YES -Dstatic_libclang=YES -Duse_libc++=NO -Duse_sqlite3=ON"
+ }
+ - {
+ name: "Ubuntu Latest Clang Debug",
+ os: ubuntu-20.04,
+ build_type: "Debug", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Duse_libclang=YES -Dstatic_libclang=YES -Duse_libc++=NO -Duse_sqlite3=ON"
+ }
+ - {
+ name: "macOS Latest Release",
+ os: macos-latest,
+ build_type: "Release", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles"
+ }
+ - {
+ name: "macOS Latest Debug",
+ os: macos-latest,
+ build_type: "Debug", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles"
+ }
+ - {
+ name: "Windows Latest MSVC Debug",
+ os: windows-latest,
+ build_type: "Debug", cc: "cl", cxx: "cl",
+ build_gen: "NMake Makefiles"
+ }
+ - {
+ name: "Windows Latest MSVC Release",
+ os: windows-latest,
+ build_type: "Release", cc: "cl", cxx: "cl",
+ build_gen: "NMake Makefiles"
+ }
+ steps:
+ - name: Checkout doxygen
+ uses: actions/checkout@v3
+
+ - name: Download MikTex (Windows)
+ run: |
+ $wc = New-Object System.Net.WebClient;
+ $maxAttempts=5;
+ $attemptCount=0;
+ Do {
+ $attemptCount++;
+ Try {
+ $wc.DownloadFile("https://ctan.math.illinois.edu/systems/win32/miktex/setup/windows-x64/miktexsetup-4.2-x64.zip","miktexsetup-4.2-x64.zip")
+ } Catch [Exception] {
+ Write-Host $_.Exception | format-list -force
+ }
+ } while (((Test-Path "miktexsetup-4.2-x64.zip") -eq $false) -and ($attemptCount -le $maxAttempts))
+ shell: pwsh
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install libiconv (Windows)
+ uses: suisei-cn/actions-download-file@v1
+ with:
+ url: "https://github.com/pffang/libiconv-for-Windows/releases/download/v1.16/libiconv-for-Windows_1.16.7z"
+ target: .
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install LaTeX (Linux)
+ run: |
+ sudo apt update
+ sudo apt-get install texlive texlive-latex-recommended texlive-extra-utils texlive-latex-extra texlive-font-utils
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install LaTeX (MacOS)
+ run: |
+ brew update
+ brew install --cask mactex;
+ echo "/Library/TeX/texbin/" >> $GITHUB_PATH
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install libclang (Ubuntu 20.04)
+ run: |
+ sudo apt update
+ sudo apt remove llvm-8 clang-8 libclang-common-8-dev clang-format-8 libllvm8
+ sudo apt remove llvm-9 llvm-9-dev llvm-9-tools llvm-9-runtime clang-9 libclang-common-9-dev clang-format-9 libllvm9
+ #sudo apt remove llvm-10 llvm-10-dev llvm-10-tools llvm-10-runtime clang-10 clang-format-10 libclang-common-10-dev libclang-cpp10 libclang1-10 libllvm10
+ sudo apt remove llvm-11 llvm-11-dev llvm-11-tools llvm-11-runtime clang-11 clang-format-11 libclang-common-11-dev libclang-cpp11 libclang1-11 libllvm11
+ sudo apt remove llvm-12 llvm-12-dev llvm-12-tools llvm-12-runtime clang-12 clang-format-12 libclang-common-12-dev libclang-cpp12 libclang1-12 libllvm12
+ sudo apt-get autoremove
+ sudo apt-get clean
+ sudo apt install libclang-common-10-dev libclang-10-dev
+ apt list --installed | egrep '(clang|llvm)'
+ ls -d /usr/lib/llvm-*/include/
+ sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-10 100
+ sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-10 100
+ ls -al /usr/bin/clang++
+ ls -al /etc/alternatives/clang++
+ which clang++
+ clang++ -v
+ if: matrix.config.os == 'ubuntu-20.04'
+
+ - name: Install libxapian (Ubuntu 20.04)
+ run: |
+ sudo apt update
+ sudo apt install libxapian-dev
+ if: matrix.config.os == 'ubuntu-20.04'
+
+ - name: Extract MikTex zip (Windows)
+ shell: bash
+ run: |
+ unzip miktexsetup-4.2-x64.zip
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Download MikTex packages (Windows)
+ shell: bash
+ run: |
+ ./miktexsetup_standalone --verbose \
+ --local-package-repository=C:/miktex-repository \
+ --remote-package-repository="https://ctan.math.illinois.edu/systems/win32/miktex/tm/packages/" \
+ --package-set=essential \
+ download
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install MikTex packages (Windows)
+ shell: bash
+ run: |
+ ./miktexsetup_standalone --local-package-repository=C:/miktex-repository \
+ --package-set=essential \
+ --shared \
+ install
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Setting MikTex paths (Windows)
+ shell: bash
+ run: |
+ echo "C:/Program Files/MiKTeX/miktex/bin/x64/" >> $GITHUB_PATH
+ export PATH="/c/Program Files/MiKTeX/miktex/bin/x64/:$PATH"
+
+ echo "Configuring MiKTeX to install missing packages on the fly"
+ initexmf --admin --verbose --set-config-value='[MPM]AutoInstall=1'
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Ghostscript (Linux)
+ run: |
+ sudo apt update
+ sudo apt-get install ghostscript
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install Ghostscript (Windows)
+ run:
+ choco install ghostscript
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Setting Ghostscript paths (Windows)
+ shell: bash
+ run: |
+ export GSpath=`find /c/Prog*/gs -name gswin\*c.exe | sed -e "s/gswin.*c.exe//"`
+ export PATH="$GSpath:$PATH"
+ export GSpath=`echo "$GSpath" | sed -e "s%/c%C:%"`
+ echo "$GSpath" >> $GITHUB_PATH
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install xmllint (Linux)
+ run: |
+ sudo apt-get update
+ sudo apt-get install libxml2-utils
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install xmllint (MacOS)
+ run: brew install libxml2
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install bison (MacOS)
+ run: |
+ brew install bison;
+ echo "/usr/local/opt/bison/bin" >> $GITHUB_PATH
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install bison/flex (Windows)
+ run: |
+ Choco-Install -PackageName winflexbison
+ #choco install winflexbison
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Graphviz (Linux)
+ run: |
+ sudo apt update
+ sudo apt-get install graphviz
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install Graphviz (MacOS)
+ run: brew install graphviz
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install Graphviz (Windows)
+ run:
+ choco install graphviz.portable
+ if: matrix.config.os == 'windows-latest'
+
+# - name: Install Perl (Windows)
+# run:
+# choco install activeperl
+# if: matrix.config.os == 'windows-latest'
+
+ - name: Setup VS Environment (Windows)
+ uses: seanmiddleditch/gha-setup-vsdevenv@master
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Refresh Env (Windows)
+ run:
+ refreshenv
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v2
+
+ - name: Check tool versions (Linux / MacOS)
+ shell: bash
+ run: |
+ echo "=== perl ===";
+ perl --version;
+ echo "=== python ===";
+ python --version;
+ echo "=== cmake ===";
+ cmake --version;
+ echo "=== latex ===";
+ latex --version;
+ echo "=== bibtex ===";
+ bibtex --version
+ echo "=== dvips ===";
+ dvips --version
+ echo "=== bison ===";
+ bison --version;
+ echo "=== flex ===";
+ flex --version;
+ echo "=== dot ===";
+ dot -V;
+ echo "=== ghostscript ===";
+ gs --version;
+ if: matrix.config.os != 'windows-latest'
+
+ - name: Check tool versions (Windows)
+ shell: bash
+ run: |
+ echo "=== perl ===";
+ perl --version;
+ echo "=== python ===";
+ python --version;
+ echo "=== cmake ===";
+ cmake --version;
+ echo "=== latex ===";
+ latex --version;
+ echo "=== bibtex ===";
+ bibtex --version
+ echo "=== dvips ===";
+ dvips --version
+ echo "=== bison ===";
+ win_bison --version;
+ echo "=== flex ===";
+ win_flex --version;
+ echo "=== dot ===";
+ dot -V;
+ echo "=== ghostscript ===";
+ gswin64c --version;
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Configure
+ shell: cmake -P {0}
+ run: |
+ set(ENV{CC} ${{ matrix.config.cc }})
+ set(ENV{CXX} ${{ matrix.config.cxx }})
+
+ execute_process(
+ COMMAND cmake
+ -S .
+ -B build
+ -D CMAKE_BUILD_TYPE=${{ matrix.config.build_type }}
+ -G "${{ matrix.config.build_gen }}"
+ -Dbuild_doc=YES
+ -Dbuild_wizard=YES
+ ${{ matrix.config.cmake_extra_opts }}
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ - name: Build
+ shell: cmake -P {0}
+ run: |
+ include(ProcessorCount)
+ ProcessorCount(N)
+ execute_process(
+ COMMAND cmake --build build --parallel ${N}
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE output
+ ERROR_VARIABLE output
+ ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE
+ )
+ if (NOT result EQUAL 0)
+ string(REGEX MATCH "FAILED:.*$" error_message "${output}")
+ string(REPLACE "\n" "%0A" error_message "${error_message}")
+ message("::error::${error_message}")
+ message(FATAL_ERROR "Build failed")
+ endif()
+
+ - name: Archive build artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: "${{ matrix.config.name }} build artifacts"
+ path: build/bin/
+
+ - name: Run tests (Linux / MacOS)
+ shell: cmake -P {0}
+ run: |
+ set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON")
+
+ execute_process(
+ COMMAND cmake --build build --target tests TEST_FLAGS="--xml --xmlxsd --xhtml --qhp --docbook --rtf"
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Running tests failed!")
+ endif()
+ if: matrix.config.os != 'windows-latest'
+
+ - name: Run tests (Windows)
+ shell: cmake -P {0}
+ run: |
+ set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON")
+
+ execute_process(
+ COMMAND cmake --build build --target tests TEST_FLAGS="--xml --xmlxsd"
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Running tests failed!")
+ endif()
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Generate documentation
+ shell: cmake -P {0}
+ run: |
+ execute_process(
+ COMMAND cmake --build build --target docs
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Building documentation failed")
+ endif()
+ if: matrix.config.os != 'windows-latest'
+
+ - name: Archive html documentation artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: "Html documentation artifacts"
+ path: build/html/
+ if: matrix.config.name == 'Ubuntu Latest GCC Release'
+
+
+ - name: Archive Latex documentation artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: "Latex documentation artifacts"
+ path: build/latex/doxygen_manual.pdf
+ if: matrix.config.name == 'Ubuntu Latest GCC Release'
+
+ - name: Generate Internal documentation
+ shell: bash
+ run: |
+ build/bin/doxygen Doxyfile
+ if: matrix.config.name == 'Ubuntu Latest GCC Release'
+
+ - name: Publish Internal documentation to Github pages
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: doxygen_docs/html
+ if: ${{ github.event_name == 'push' && matrix.config.name == 'Ubuntu Latest GCC Release' }}
+
diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml
new file mode 100644
index 0000000..66d980e
--- /dev/null
+++ b/.github/workflows/coverity.yml
@@ -0,0 +1,80 @@
+name: Coverity for doxygen
+
+# Just for tests
+#on: [push, pull_request]
+
+# The right schedule
+on:
+ schedule:
+ - cron: '30 2 * * *' # Run once per day, to avoid Coverity's submission limits
+
+
+permissions:
+ contents: read
+
+jobs:
+ check_date:
+ runs-on: ubuntu-20.04
+ name: Check latest commit
+ outputs:
+ should_run: ${{ steps.should_run.outputs.should_run }}
+ steps:
+ - uses: actions/checkout@v3
+ - name: print latest_commit
+ run: echo ${{ github.sha }}
+
+ - id: should_run
+ continue-on-error: true
+ name: check latest commit is less than a day
+ if: ${{ github.event_name == 'schedule' }}
+ run: test -z $(git rev-list --after="24 hours" ${{ github.sha }}) && echo "::set-output name=should_run::false"
+
+ scan:
+ needs: check_date
+ if: ${{ needs.check_date.outputs.should_run != 'false' }}
+ runs-on: ubuntu-20.04
+
+ env:
+ CC: gcc
+ DEBIAN_FRONTEND: noninteractive
+
+ steps:
+ - name: Checkout doxygen
+ uses: actions/checkout@v3
+
+ - name: Download Coverity
+ run: |
+ wget -q https://scan.coverity.com/download/cxx/linux64 --post-data "token=$TOKEN&project=doxygen%2Fdoxygen" -O coverity_tool.tgz
+ mkdir cov-scan
+ tar ax -f coverity_tool.tgz --strip-components=1 -C cov-scan
+ env:
+ TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
+
+ - name: Setup environment
+ run: |
+ echo "$(pwd)/cov-scan/bin" >> $GITHUB_PATH
+ echo "NPROC=$(getconf _NPROCESSORS_ONLN)" >> $GITHUB_ENV
+
+ - name: Configure doxygen
+ run: |
+ mkdir build
+ cmake -S . -B build -D CMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
+
+ - name: Run coverity build/scan
+ run: |
+ cd build && cov-build --dir cov-int make -j${NPROC}
+
+ - name: Submit results
+ run: |
+ cd build
+ tar zcf cov-scan.tgz cov-int
+ curl --form token=$TOKEN \
+ --form email=$EMAIL \
+ --form file=@cov-scan.tgz \
+ --form version="$(git rev-parse HEAD)" \
+ --form description="Automatic GHA scan" \
+ 'https://scan.coverity.com/builds?project=doxygen%2Fdoxygen'
+ env:
+ TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
+ EMAIL: ${{ secrets.COVERITY_SCAN_EMAIL }}
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..987aa13
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,22 @@
+*~
+.*sw?
+\#*
+.DS_Store
+
+*.rej
+*.orig
+
+*.pro
+/packages/rpm/doxygen.spec
+*.idb
+*.pdb
+
+/doxygen_docs
+/doxygen.tag
+/build*
+/qtools_docs
+/warnings.log
+
+tags
+
+.idea
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d976596..12fba50 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -36,11 +36,24 @@ set_property(CACHE force_qt PROPERTY STRINGS OFF Qt6 Qt5)
SET(enlarge_lex_buffers "262144" CACHE INTERNAL "Sets the lex input and read buffers to the specified size")
+if(enable_coverage)
+ if ("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
+ message(FATAL_ERROR "Doxygen cannot be generated in-place, the build directory (${PROJECT_BINARY_DIR}) has to differ from the doxygen main directory (${PROJECT_SOURCE_DIR})\nPlease don't forget to remove the already file created file 'CMakeCache.txt' and the directory 'CMakeFiles'!")
+ endif()
+endif()
+
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Sanitizers")
set(TOP "${PROJECT_SOURCE_DIR}")
include(version)
+message(STATUS "Using Cmake version ${CMAKE_VERSION}")
+if (${CMAKE_VERSION} VERSION_LESS "3.21.0")
+ set(depfile_supported "0" CACHE INTERNAL "DEPFILE is not supported")
+else()
+ set(depfile_supported "1" CACHE INTERNAL "DEPFILE is supported")
+endif()
+
set(sqlite3 "0" CACHE INTERNAL "used in settings.h")
set(clang "0" CACHE INTERNAL "used in settings.h")
if (use_sqlite3)
diff --git a/Doxyfile b/Doxyfile
index b1ce174..ef33b6d 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,3 +1,4 @@
+# Doxyfile 1.9.5
#---------------------------------------------------------------------------
# Project related configuration options
@@ -25,6 +26,7 @@ JAVADOC_AUTOBRIEF = YES
JAVADOC_BANNER = NO
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
+PYTHON_DOCSTRING = YES
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
@@ -36,7 +38,7 @@ OPTIMIZE_OUTPUT_VHDL = NO
OPTIMIZE_OUTPUT_SLICE = NO
EXTENSION_MAPPING =
MARKDOWN_SUPPORT = YES
-TOC_INCLUDE_HEADINGS =
+TOC_INCLUDE_HEADINGS = 5
AUTOLINK_SUPPORT = YES
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
@@ -49,6 +51,7 @@ INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0
+NUM_PROC_THREADS = 1
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
@@ -60,6 +63,7 @@ EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
+RESOLVE_UNNAMED_PARAMS = YES
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
@@ -68,6 +72,7 @@ INTERNAL_DOCS = NO
CASE_SENSE_NAMES = NO
HIDE_SCOPE_NAMES = NO
HIDE_COMPOUND_REFERENCE= NO
+SHOW_HEADERFILE = YES
SHOW_INCLUDE_FILES = YES
SHOW_GROUPED_MEMB_INC = NO
FORCE_LOCAL_INCLUDES = NO
@@ -97,10 +102,12 @@ QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
+WARN_IF_INCOMPLETE_DOC = YES
WARN_NO_PARAMDOC = NO
-WARN_AS_ERROR = NO
-WARN_FORMAT = "$file:$line: $text "
-WARN_LOGFILE = warnings.log
+WARN_AS_ERROR = FAIL_ON_WARNINGS
+WARN_FORMAT = "$file:$line: $text"
+WARN_LINE_FORMAT = "at line $line of file $file"
+WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
@@ -127,6 +134,7 @@ FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
+FORTRAN_COMMENT_AFTER = 72
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
@@ -155,15 +163,17 @@ HTML_FOOTER =
HTML_STYLESHEET =
HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES =
+HTML_COLORSTYLE = TOGGLE
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
-HTML_TIMESTAMP = YES
+HTML_TIMESTAMP = NO
HTML_DYNAMIC_MENUS = YES
HTML_DYNAMIC_SECTIONS = YES
HTML_INDEX_NUM_ENTRIES = 100
GENERATE_DOCSET = YES
DOCSET_FEEDNAME = "Doxygen docs"
+DOCSET_FEEDURL =
DOCSET_BUNDLE_ID = org.doxygen.Doxygen
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
DOCSET_PUBLISHER_NAME = Publisher
@@ -186,18 +196,22 @@ GENERATE_ECLIPSEHELP = NO
ECLIPSE_DOC_ID = org.doxygen.Project
DISABLE_INDEX = NO
GENERATE_TREEVIEW = YES
+FULL_SIDEBAR = NO
ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO
+OBFUSCATE_EMAILS = YES
+HTML_FORMULA_FORMAT = png
FORMULA_FONTSIZE = 10
-FORMULA_TRANSPARENT = YES
+FORMULA_MACROFILE =
USE_MATHJAX = NO
+MATHJAX_VERSION = MathJax_2
MATHJAX_FORMAT = HTML-CSS
MATHJAX_RELPATH =
MATHJAX_EXTENSIONS =
MATHJAX_CODEFILE =
SEARCHENGINE = YES
-SERVER_BASED_SEARCH = YES
+SERVER_BASED_SEARCH = NO
EXTERNAL_SEARCH = NO
SEARCHENGINE_URL =
SEARCHDATA_FILE = searchdata.xml
@@ -259,6 +273,12 @@ DOCBOOK_OUTPUT = docbook
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
+# Configuration options related to Sqlite3 output
+#---------------------------------------------------------------------------
+GENERATE_SQLITE3 = NO
+SQLITE3_OUTPUT = sqlite3
+SQLITE3_RECREATE_DB = YES
+#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
@@ -277,7 +297,7 @@ INCLUDE_PATH = libmd5 \
libmscgen
INCLUDE_FILE_PATTERNS =
PREDEFINED =
-EXPAND_AS_DEFINED =
+EXPAND_AS_DEFINED = DOC_NODES DN_SEP DN
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
@@ -294,14 +314,17 @@ DIA_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = YES
DOT_NUM_THREADS = 0
-DOT_FONTNAME = Helvetica
-DOT_FONTSIZE = 10
+DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
+DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
+DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
UML_LIMIT_NUM_FIELDS = 10
+DOT_UML_DETAILS = NO
+DOT_WRAP_THRESHOLD = 17
TEMPLATE_RELATIONS = YES
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
@@ -309,6 +332,7 @@ CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
+DIR_GRAPH_MAX_DEPTH = 1
DOT_IMAGE_FORMAT = svg
INTERACTIVE_SVG = YES
DOT_PATH =
@@ -318,11 +342,8 @@ DIAFILE_DIRS =
PLANTUML_JAR_PATH =
PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH =
-DOT_GRAPH_MAX_NODES = 100
+DOT_GRAPH_MAX_NODES = 300
MAX_DOT_GRAPH_DEPTH = 0
-DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = NO
-DOT_WRAP_THRESHOLD = 17
-DOT_UML_DETAILS = NO
diff --git a/README.md b/README.md
index d59dc4b..5bb9177 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ Developers
* Coverity Scan Build Status: <a href="https://scan.coverity.com/projects/2860"> <img alt="Coverity Scan Build Status" src="https://scan.coverity.com/projects/2860/badge.svg"/> </a>
-* Doxygen's Doxygen Documentation: <a href="https://codedocs.xyz/doxygen/doxygen/"><img src="https://codedocs.xyz/doxygen/doxygen.svg"/></a>
+* Doxygen's <a href="http://doxygen.github.io/doxygen/">internal source code documentation</a>
* Install: Please read the installation section of the manual (https://www.doxygen.nl/manual/install.html)
diff --git a/VERSION b/VERSION
index d615fd0..158c747 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.9.4
+1.9.5
diff --git a/addon/doxmlparser/doxmlparser/compound.py b/addon/doxmlparser/doxmlparser/compound.py
index fe2de44..79541ac 100644
--- a/addon/doxmlparser/doxmlparser/compound.py
+++ b/addon/doxmlparser/doxmlparser/compound.py
@@ -1059,6 +1059,8 @@ class DoxLanguage(str, Enum):
XML='XML'
SQL='SQL'
MARKDOWN='Markdown'
+ SLICE='Slice'
+ LEX='Lex'
class DoxMemberKind(str, Enum):
@@ -1694,7 +1696,7 @@ class compounddefType(GeneratedsSuper):
self.gds_collector_.add_message('Value "%(value)s"%(lineno)s is not of the correct base simple type (str)' % {"value": value, "lineno": lineno, })
return False
value = value
- enumerations = ['Unknown', 'IDL', 'Java', 'C#', 'D', 'PHP', 'Objective-C', 'C++', 'JavaScript', 'Python', 'Fortran', 'VHDL', 'XML', 'SQL', 'Markdown']
+ enumerations = ['Unknown', 'IDL', 'Java', 'C#', 'D', 'PHP', 'Objective-C', 'C++', 'JavaScript', 'Python', 'Fortran', 'VHDL', 'XML', 'SQL', 'Markdown', 'Slice', 'Lex']
if value not in enumerations:
lineno = self.gds_get_node_lineno_()
self.gds_collector_.add_message('Value "%(value)s"%(lineno)s does not match xsd enumeration restriction on DoxLanguage' % {"value" : encode_str_2_3(value), "lineno": lineno} )
@@ -5195,9 +5197,9 @@ class descriptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -5205,9 +5207,9 @@ class descriptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
elif nodeName_ == 'sect1':
obj_ = docSect1Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -5215,9 +5217,9 @@ class descriptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'sect1', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect1'):
- self.add_sect1(obj_.value)
+ self.add_sect1(obj_.value)
elif hasattr(self, 'set_sect1'):
- self.set_sect1(obj_.value)
+ self.set_sect1(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -5416,9 +5418,9 @@ class enumvalueType(GeneratedsSuper):
MixedContainer.TypeNone, 'initializer', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_initializer'):
- self.add_initializer(obj_.value)
+ self.add_initializer(obj_.value)
elif hasattr(self, 'set_initializer'):
- self.set_initializer(obj_.value)
+ self.set_initializer(obj_.value)
elif nodeName_ == 'briefdescription':
obj_ = descriptionType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -5426,9 +5428,9 @@ class enumvalueType(GeneratedsSuper):
MixedContainer.TypeNone, 'briefdescription', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_briefdescription'):
- self.add_briefdescription(obj_.value)
+ self.add_briefdescription(obj_.value)
elif hasattr(self, 'set_briefdescription'):
- self.set_briefdescription(obj_.value)
+ self.set_briefdescription(obj_.value)
elif nodeName_ == 'detaileddescription':
obj_ = descriptionType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -5436,9 +5438,9 @@ class enumvalueType(GeneratedsSuper):
MixedContainer.TypeNone, 'detaileddescription', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_detaileddescription'):
- self.add_detaileddescription(obj_.value)
+ self.add_detaileddescription(obj_.value)
elif hasattr(self, 'set_detaileddescription'):
- self.set_detaileddescription(obj_.value)
+ self.set_detaileddescription(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -6181,9 +6183,9 @@ class linkedTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -7292,9 +7294,9 @@ class highlightType(GeneratedsSuper):
MixedContainer.TypeNone, 'sp', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sp'):
- self.add_sp(obj_.value)
+ self.add_sp(obj_.value)
elif hasattr(self, 'set_sp'):
- self.set_sp(obj_.value)
+ self.set_sp(obj_.value)
elif nodeName_ == 'ref':
obj_ = refTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -7302,9 +7304,9 @@ class highlightType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -7947,9 +7949,9 @@ class docSect1Type(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalS1Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -7957,9 +7959,9 @@ class docSect1Type(GeneratedsSuper):
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
elif nodeName_ == 'sect2':
obj_ = docSect2Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -7967,9 +7969,9 @@ class docSect1Type(GeneratedsSuper):
MixedContainer.TypeNone, 'sect2', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect2'):
- self.add_sect2(obj_.value)
+ self.add_sect2(obj_.value)
elif hasattr(self, 'set_sect2'):
- self.set_sect2(obj_.value)
+ self.set_sect2(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -8168,9 +8170,9 @@ class docSect2Type(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect3':
obj_ = docSect3Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -8178,9 +8180,9 @@ class docSect2Type(GeneratedsSuper):
MixedContainer.TypeNone, 'sect3', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect3'):
- self.add_sect3(obj_.value)
+ self.add_sect3(obj_.value)
elif hasattr(self, 'set_sect3'):
- self.set_sect3(obj_.value)
+ self.set_sect3(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalS2Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -8188,9 +8190,9 @@ class docSect2Type(GeneratedsSuper):
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -8389,9 +8391,9 @@ class docSect3Type(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect4':
obj_ = docSect4Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -8399,9 +8401,9 @@ class docSect3Type(GeneratedsSuper):
MixedContainer.TypeNone, 'sect4', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect4'):
- self.add_sect4(obj_.value)
+ self.add_sect4(obj_.value)
elif hasattr(self, 'set_sect4'):
- self.set_sect4(obj_.value)
+ self.set_sect4(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalS3Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -8409,9 +8411,9 @@ class docSect3Type(GeneratedsSuper):
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -8591,9 +8593,9 @@ class docSect4Type(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalS4Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -8601,9 +8603,9 @@ class docSect4Type(GeneratedsSuper):
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -8753,9 +8755,9 @@ class docInternalType(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect1':
obj_ = docSect1Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -8763,9 +8765,9 @@ class docInternalType(GeneratedsSuper):
MixedContainer.TypeNone, 'sect1', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect1'):
- self.add_sect1(obj_.value)
+ self.add_sect1(obj_.value)
elif hasattr(self, 'set_sect1'):
- self.set_sect1(obj_.value)
+ self.set_sect1(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -8915,9 +8917,9 @@ class docInternalS1Type(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect2':
obj_ = docSect2Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -8925,9 +8927,9 @@ class docInternalS1Type(GeneratedsSuper):
MixedContainer.TypeNone, 'sect2', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect2'):
- self.add_sect2(obj_.value)
+ self.add_sect2(obj_.value)
elif hasattr(self, 'set_sect2'):
- self.set_sect2(obj_.value)
+ self.set_sect2(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -9077,9 +9079,9 @@ class docInternalS2Type(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect3':
obj_ = docSect3Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -9087,9 +9089,9 @@ class docInternalS2Type(GeneratedsSuper):
MixedContainer.TypeNone, 'sect3', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect3'):
- self.add_sect3(obj_.value)
+ self.add_sect3(obj_.value)
elif hasattr(self, 'set_sect3'):
- self.set_sect3(obj_.value)
+ self.set_sect3(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -9239,9 +9241,9 @@ class docInternalS3Type(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect3':
obj_ = docSect4Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -9249,9 +9251,9 @@ class docInternalS3Type(GeneratedsSuper):
MixedContainer.TypeNone, 'sect3', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect3'):
- self.add_sect3(obj_.value)
+ self.add_sect3(obj_.value)
elif hasattr(self, 'set_sect3'):
- self.set_sect3(obj_.value)
+ self.set_sect3(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -9382,9 +9384,9 @@ class docInternalS4Type(GeneratedsSuper):
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -9396,7 +9398,7 @@ class docTitleType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -9472,11 +9474,6 @@ class docTitleType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -9722,16 +9719,6 @@ class docTitleType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -9910,7 +9897,6 @@ class docTitleType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -10008,9 +9994,6 @@ class docTitleType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -10090,9 +10073,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10100,9 +10083,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10110,9 +10093,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10120,9 +10103,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10130,9 +10113,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10140,9 +10123,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10150,9 +10133,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10160,9 +10143,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10170,9 +10153,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10180,9 +10163,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10190,9 +10173,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10200,9 +10183,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10210,9 +10193,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10220,19 +10203,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10240,9 +10213,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10250,9 +10223,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -10300,9 +10273,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10310,9 +10283,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10320,9 +10293,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10330,9 +10303,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10340,9 +10313,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10350,9 +10323,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10360,9 +10333,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10370,9 +10343,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -10380,9 +10353,9 @@ class docTitleType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -10394,7 +10367,7 @@ class docParaType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, hruler=None, preformatted=None, programlisting=None, verbatim=None, javadocliteral=None, javadoccode=None, indexentry=None, orderedlist=None, itemizedlist=None, simplesect=None, title=None, variablelist=None, table=None, heading=None, dotfile=None, mscfile=None, diafile=None, toclist=None, language=None, parameterlist=None, xrefsect=None, copydoc=None, blockquote=None, parblock=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, hruler=None, preformatted=None, programlisting=None, verbatim=None, javadocliteral=None, javadoccode=None, indexentry=None, orderedlist=None, itemizedlist=None, simplesect=None, title=None, variablelist=None, table=None, heading=None, dotfile=None, mscfile=None, diafile=None, toclist=None, language=None, parameterlist=None, xrefsect=None, copydoc=None, details=None, blockquote=None, parblock=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -10470,11 +10443,6 @@ class docParaType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -10665,6 +10633,11 @@ class docParaType(GeneratedsSuper):
else:
self.copydoc = copydoc
self.copydoc_nsprefix_ = None
+ if details is None:
+ self.details = []
+ else:
+ self.details = details
+ self.details_nsprefix_ = None
if blockquote is None:
self.blockquote = []
else:
@@ -10840,16 +10813,6 @@ class docParaType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -11230,6 +11193,16 @@ class docParaType(GeneratedsSuper):
self.copydoc.insert(index, value)
def replace_copydoc_at(self, index, value):
self.copydoc[index] = value
+ def get_details(self):
+ return self.details
+ def set_details(self, details):
+ self.details = details
+ def add_details(self, value):
+ self.details.append(value)
+ def insert_details_at(self, index, value):
+ self.details.insert(index, value)
+ def replace_details_at(self, index, value):
+ self.details[index] = value
def get_blockquote(self):
return self.blockquote
def set_blockquote(self, blockquote):
@@ -11268,7 +11241,6 @@ class docParaType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -11307,6 +11279,7 @@ class docParaType(GeneratedsSuper):
self.parameterlist or
self.xrefsect or
self.copydoc or
+ self.details or
self.blockquote or
self.parblock or
(1 if type(self.valueOf_) in [int,float] else self.valueOf_) or
@@ -11390,9 +11363,6 @@ class docParaType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -11515,6 +11485,9 @@ class docParaType(GeneratedsSuper):
for copydoc_ in self.copydoc:
namespaceprefix_ = self.copydoc_nsprefix_ + ':' if (UseCapturedNS_ and self.copydoc_nsprefix_) else ''
copydoc_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='copydoc', pretty_print=pretty_print)
+ for details_ in self.details:
+ namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
+ details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for blockquote_ in self.blockquote:
namespaceprefix_ = self.blockquote_nsprefix_ + ':' if (UseCapturedNS_ and self.blockquote_nsprefix_) else ''
blockquote_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='blockquote', pretty_print=pretty_print)
@@ -11547,9 +11520,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11557,9 +11530,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11567,9 +11540,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11577,9 +11550,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11587,9 +11560,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11597,9 +11570,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11607,9 +11580,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11617,9 +11590,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11627,9 +11600,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11637,9 +11610,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11647,9 +11620,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11657,9 +11630,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11667,9 +11640,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11677,19 +11650,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11697,9 +11660,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11707,9 +11670,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -11757,9 +11720,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11767,9 +11730,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11777,9 +11740,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11787,9 +11750,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11797,9 +11760,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11807,9 +11770,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11817,9 +11780,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11827,9 +11790,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11837,9 +11800,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
elif nodeName_ == 'hruler':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11847,9 +11810,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'hruler', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_hruler'):
- self.add_hruler(obj_.value)
+ self.add_hruler(obj_.value)
elif hasattr(self, 'set_hruler'):
- self.set_hruler(obj_.value)
+ self.set_hruler(obj_.value)
elif nodeName_ == 'preformatted':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11857,9 +11820,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'preformatted', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_preformatted'):
- self.add_preformatted(obj_.value)
+ self.add_preformatted(obj_.value)
elif hasattr(self, 'set_preformatted'):
- self.set_preformatted(obj_.value)
+ self.set_preformatted(obj_.value)
elif nodeName_ == 'programlisting':
obj_ = listingType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11867,9 +11830,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'programlisting', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_programlisting'):
- self.add_programlisting(obj_.value)
+ self.add_programlisting(obj_.value)
elif hasattr(self, 'set_programlisting'):
- self.set_programlisting(obj_.value)
+ self.set_programlisting(obj_.value)
elif nodeName_ == 'verbatim' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'verbatim')
@@ -11901,9 +11864,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'indexentry', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_indexentry'):
- self.add_indexentry(obj_.value)
+ self.add_indexentry(obj_.value)
elif hasattr(self, 'set_indexentry'):
- self.set_indexentry(obj_.value)
+ self.set_indexentry(obj_.value)
elif nodeName_ == 'orderedlist':
obj_ = docListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11911,9 +11874,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'orderedlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_orderedlist'):
- self.add_orderedlist(obj_.value)
+ self.add_orderedlist(obj_.value)
elif hasattr(self, 'set_orderedlist'):
- self.set_orderedlist(obj_.value)
+ self.set_orderedlist(obj_.value)
elif nodeName_ == 'itemizedlist':
obj_ = docListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11921,9 +11884,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'itemizedlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_itemizedlist'):
- self.add_itemizedlist(obj_.value)
+ self.add_itemizedlist(obj_.value)
elif hasattr(self, 'set_itemizedlist'):
- self.set_itemizedlist(obj_.value)
+ self.set_itemizedlist(obj_.value)
elif nodeName_ == 'simplesect':
obj_ = docSimpleSectType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11931,9 +11894,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'simplesect', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_simplesect'):
- self.add_simplesect(obj_.value)
+ self.add_simplesect(obj_.value)
elif hasattr(self, 'set_simplesect'):
- self.set_simplesect(obj_.value)
+ self.set_simplesect(obj_.value)
elif nodeName_ == 'title':
obj_ = docTitleType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11941,9 +11904,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'title', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_title'):
- self.add_title(obj_.value)
+ self.add_title(obj_.value)
elif hasattr(self, 'set_title'):
- self.set_title(obj_.value)
+ self.set_title(obj_.value)
elif nodeName_ == 'variablelist':
obj_ = docVariableListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11951,9 +11914,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'variablelist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_variablelist'):
- self.add_variablelist(obj_.value)
+ self.add_variablelist(obj_.value)
elif hasattr(self, 'set_variablelist'):
- self.set_variablelist(obj_.value)
+ self.set_variablelist(obj_.value)
elif nodeName_ == 'table':
obj_ = docTableType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11961,9 +11924,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'table', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_table'):
- self.add_table(obj_.value)
+ self.add_table(obj_.value)
elif hasattr(self, 'set_table'):
- self.set_table(obj_.value)
+ self.set_table(obj_.value)
elif nodeName_ == 'heading':
obj_ = docHeadingType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11971,9 +11934,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'heading', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_heading'):
- self.add_heading(obj_.value)
+ self.add_heading(obj_.value)
elif hasattr(self, 'set_heading'):
- self.set_heading(obj_.value)
+ self.set_heading(obj_.value)
elif nodeName_ == 'dotfile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11981,9 +11944,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'dotfile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dotfile'):
- self.add_dotfile(obj_.value)
+ self.add_dotfile(obj_.value)
elif hasattr(self, 'set_dotfile'):
- self.set_dotfile(obj_.value)
+ self.set_dotfile(obj_.value)
elif nodeName_ == 'mscfile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -11991,9 +11954,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'mscfile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_mscfile'):
- self.add_mscfile(obj_.value)
+ self.add_mscfile(obj_.value)
elif hasattr(self, 'set_mscfile'):
- self.set_mscfile(obj_.value)
+ self.set_mscfile(obj_.value)
elif nodeName_ == 'diafile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -12001,9 +11964,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'diafile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_diafile'):
- self.add_diafile(obj_.value)
+ self.add_diafile(obj_.value)
elif hasattr(self, 'set_diafile'):
- self.set_diafile(obj_.value)
+ self.set_diafile(obj_.value)
elif nodeName_ == 'toclist':
obj_ = docTocListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -12011,9 +11974,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'toclist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_toclist'):
- self.add_toclist(obj_.value)
+ self.add_toclist(obj_.value)
elif hasattr(self, 'set_toclist'):
- self.set_toclist(obj_.value)
+ self.set_toclist(obj_.value)
elif nodeName_ == 'language':
obj_ = docLanguageType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -12021,9 +11984,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'language', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_language'):
- self.add_language(obj_.value)
+ self.add_language(obj_.value)
elif hasattr(self, 'set_language'):
- self.set_language(obj_.value)
+ self.set_language(obj_.value)
elif nodeName_ == 'parameterlist':
obj_ = docParamListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -12031,9 +11994,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'parameterlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_parameterlist'):
- self.add_parameterlist(obj_.value)
+ self.add_parameterlist(obj_.value)
elif hasattr(self, 'set_parameterlist'):
- self.set_parameterlist(obj_.value)
+ self.set_parameterlist(obj_.value)
elif nodeName_ == 'xrefsect':
obj_ = docXRefSectType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -12041,9 +12004,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'xrefsect', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_xrefsect'):
- self.add_xrefsect(obj_.value)
+ self.add_xrefsect(obj_.value)
elif hasattr(self, 'set_xrefsect'):
- self.set_xrefsect(obj_.value)
+ self.set_xrefsect(obj_.value)
elif nodeName_ == 'copydoc':
obj_ = docCopyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -12051,9 +12014,19 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'copydoc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_copydoc'):
- self.add_copydoc(obj_.value)
+ self.add_copydoc(obj_.value)
elif hasattr(self, 'set_copydoc'):
- self.set_copydoc(obj_.value)
+ self.set_copydoc(obj_.value)
+ elif nodeName_ == 'details':
+ obj_ = docDetailsType.factory(parent_object_=self)
+ obj_.build(child_, gds_collector_=gds_collector_)
+ obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+ MixedContainer.TypeNone, 'details', obj_)
+ self.content_.append(obj_)
+ if hasattr(self, 'add_details'):
+ self.add_details(obj_.value)
+ elif hasattr(self, 'set_details'):
+ self.set_details(obj_.value)
elif nodeName_ == 'blockquote':
obj_ = docBlockQuoteType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -12061,9 +12034,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'blockquote', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_blockquote'):
- self.add_blockquote(obj_.value)
+ self.add_blockquote(obj_.value)
elif hasattr(self, 'set_blockquote'):
- self.set_blockquote(obj_.value)
+ self.set_blockquote(obj_.value)
elif nodeName_ == 'parblock':
obj_ = docParBlockType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -12071,9 +12044,9 @@ class docParaType(GeneratedsSuper):
MixedContainer.TypeNone, 'parblock', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_parblock'):
- self.add_parblock(obj_.value)
+ self.add_parblock(obj_.value)
elif hasattr(self, 'set_parblock'):
- self.set_parblock(obj_.value)
+ self.set_parblock(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -12085,7 +12058,7 @@ class docMarkupType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, hruler=None, preformatted=None, programlisting=None, verbatim=None, javadocliteral=None, javadoccode=None, indexentry=None, orderedlist=None, itemizedlist=None, simplesect=None, title=None, variablelist=None, table=None, heading=None, dotfile=None, mscfile=None, diafile=None, toclist=None, language=None, parameterlist=None, xrefsect=None, copydoc=None, blockquote=None, parblock=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, hruler=None, preformatted=None, programlisting=None, verbatim=None, javadocliteral=None, javadoccode=None, indexentry=None, orderedlist=None, itemizedlist=None, simplesect=None, title=None, variablelist=None, table=None, heading=None, dotfile=None, mscfile=None, diafile=None, toclist=None, language=None, parameterlist=None, xrefsect=None, copydoc=None, details=None, blockquote=None, parblock=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -12161,11 +12134,6 @@ class docMarkupType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -12356,6 +12324,11 @@ class docMarkupType(GeneratedsSuper):
else:
self.copydoc = copydoc
self.copydoc_nsprefix_ = None
+ if details is None:
+ self.details = []
+ else:
+ self.details = details
+ self.details_nsprefix_ = None
if blockquote is None:
self.blockquote = []
else:
@@ -12531,16 +12504,6 @@ class docMarkupType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -12921,6 +12884,16 @@ class docMarkupType(GeneratedsSuper):
self.copydoc.insert(index, value)
def replace_copydoc_at(self, index, value):
self.copydoc[index] = value
+ def get_details(self):
+ return self.details
+ def set_details(self, details):
+ self.details = details
+ def add_details(self, value):
+ self.details.append(value)
+ def insert_details_at(self, index, value):
+ self.details.insert(index, value)
+ def replace_details_at(self, index, value):
+ self.details[index] = value
def get_blockquote(self):
return self.blockquote
def set_blockquote(self, blockquote):
@@ -12959,7 +12932,6 @@ class docMarkupType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -12998,6 +12970,7 @@ class docMarkupType(GeneratedsSuper):
self.parameterlist or
self.xrefsect or
self.copydoc or
+ self.details or
self.blockquote or
self.parblock or
(1 if type(self.valueOf_) in [int,float] else self.valueOf_) or
@@ -13081,9 +13054,6 @@ class docMarkupType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -13206,6 +13176,9 @@ class docMarkupType(GeneratedsSuper):
for copydoc_ in self.copydoc:
namespaceprefix_ = self.copydoc_nsprefix_ + ':' if (UseCapturedNS_ and self.copydoc_nsprefix_) else ''
copydoc_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='copydoc', pretty_print=pretty_print)
+ for details_ in self.details:
+ namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
+ details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for blockquote_ in self.blockquote:
namespaceprefix_ = self.blockquote_nsprefix_ + ':' if (UseCapturedNS_ and self.blockquote_nsprefix_) else ''
blockquote_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='blockquote', pretty_print=pretty_print)
@@ -13238,9 +13211,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13248,9 +13221,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13258,9 +13231,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13268,9 +13241,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13278,9 +13251,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13288,9 +13261,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13298,9 +13271,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13308,9 +13281,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13318,9 +13291,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13328,9 +13301,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13338,9 +13311,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13348,9 +13321,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13358,9 +13331,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13368,19 +13341,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13388,9 +13351,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13398,9 +13361,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -13448,9 +13411,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13458,9 +13421,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13468,9 +13431,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13478,9 +13441,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13488,9 +13451,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13498,9 +13461,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13508,9 +13471,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13518,9 +13481,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13528,9 +13491,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
elif nodeName_ == 'hruler':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13538,9 +13501,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'hruler', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_hruler'):
- self.add_hruler(obj_.value)
+ self.add_hruler(obj_.value)
elif hasattr(self, 'set_hruler'):
- self.set_hruler(obj_.value)
+ self.set_hruler(obj_.value)
elif nodeName_ == 'preformatted':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13548,9 +13511,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'preformatted', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_preformatted'):
- self.add_preformatted(obj_.value)
+ self.add_preformatted(obj_.value)
elif hasattr(self, 'set_preformatted'):
- self.set_preformatted(obj_.value)
+ self.set_preformatted(obj_.value)
elif nodeName_ == 'programlisting':
obj_ = listingType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13558,9 +13521,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'programlisting', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_programlisting'):
- self.add_programlisting(obj_.value)
+ self.add_programlisting(obj_.value)
elif hasattr(self, 'set_programlisting'):
- self.set_programlisting(obj_.value)
+ self.set_programlisting(obj_.value)
elif nodeName_ == 'verbatim' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'verbatim')
@@ -13592,9 +13555,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'indexentry', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_indexentry'):
- self.add_indexentry(obj_.value)
+ self.add_indexentry(obj_.value)
elif hasattr(self, 'set_indexentry'):
- self.set_indexentry(obj_.value)
+ self.set_indexentry(obj_.value)
elif nodeName_ == 'orderedlist':
obj_ = docListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13602,9 +13565,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'orderedlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_orderedlist'):
- self.add_orderedlist(obj_.value)
+ self.add_orderedlist(obj_.value)
elif hasattr(self, 'set_orderedlist'):
- self.set_orderedlist(obj_.value)
+ self.set_orderedlist(obj_.value)
elif nodeName_ == 'itemizedlist':
obj_ = docListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13612,9 +13575,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'itemizedlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_itemizedlist'):
- self.add_itemizedlist(obj_.value)
+ self.add_itemizedlist(obj_.value)
elif hasattr(self, 'set_itemizedlist'):
- self.set_itemizedlist(obj_.value)
+ self.set_itemizedlist(obj_.value)
elif nodeName_ == 'simplesect':
obj_ = docSimpleSectType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13622,9 +13585,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'simplesect', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_simplesect'):
- self.add_simplesect(obj_.value)
+ self.add_simplesect(obj_.value)
elif hasattr(self, 'set_simplesect'):
- self.set_simplesect(obj_.value)
+ self.set_simplesect(obj_.value)
elif nodeName_ == 'title':
obj_ = docTitleType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13632,9 +13595,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'title', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_title'):
- self.add_title(obj_.value)
+ self.add_title(obj_.value)
elif hasattr(self, 'set_title'):
- self.set_title(obj_.value)
+ self.set_title(obj_.value)
elif nodeName_ == 'variablelist':
obj_ = docVariableListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13642,9 +13605,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'variablelist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_variablelist'):
- self.add_variablelist(obj_.value)
+ self.add_variablelist(obj_.value)
elif hasattr(self, 'set_variablelist'):
- self.set_variablelist(obj_.value)
+ self.set_variablelist(obj_.value)
elif nodeName_ == 'table':
obj_ = docTableType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13652,9 +13615,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'table', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_table'):
- self.add_table(obj_.value)
+ self.add_table(obj_.value)
elif hasattr(self, 'set_table'):
- self.set_table(obj_.value)
+ self.set_table(obj_.value)
elif nodeName_ == 'heading':
obj_ = docHeadingType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13662,9 +13625,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'heading', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_heading'):
- self.add_heading(obj_.value)
+ self.add_heading(obj_.value)
elif hasattr(self, 'set_heading'):
- self.set_heading(obj_.value)
+ self.set_heading(obj_.value)
elif nodeName_ == 'dotfile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13672,9 +13635,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'dotfile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dotfile'):
- self.add_dotfile(obj_.value)
+ self.add_dotfile(obj_.value)
elif hasattr(self, 'set_dotfile'):
- self.set_dotfile(obj_.value)
+ self.set_dotfile(obj_.value)
elif nodeName_ == 'mscfile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13682,9 +13645,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'mscfile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_mscfile'):
- self.add_mscfile(obj_.value)
+ self.add_mscfile(obj_.value)
elif hasattr(self, 'set_mscfile'):
- self.set_mscfile(obj_.value)
+ self.set_mscfile(obj_.value)
elif nodeName_ == 'diafile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13692,9 +13655,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'diafile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_diafile'):
- self.add_diafile(obj_.value)
+ self.add_diafile(obj_.value)
elif hasattr(self, 'set_diafile'):
- self.set_diafile(obj_.value)
+ self.set_diafile(obj_.value)
elif nodeName_ == 'toclist':
obj_ = docTocListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13702,9 +13665,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'toclist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_toclist'):
- self.add_toclist(obj_.value)
+ self.add_toclist(obj_.value)
elif hasattr(self, 'set_toclist'):
- self.set_toclist(obj_.value)
+ self.set_toclist(obj_.value)
elif nodeName_ == 'language':
obj_ = docLanguageType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13712,9 +13675,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'language', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_language'):
- self.add_language(obj_.value)
+ self.add_language(obj_.value)
elif hasattr(self, 'set_language'):
- self.set_language(obj_.value)
+ self.set_language(obj_.value)
elif nodeName_ == 'parameterlist':
obj_ = docParamListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13722,9 +13685,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'parameterlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_parameterlist'):
- self.add_parameterlist(obj_.value)
+ self.add_parameterlist(obj_.value)
elif hasattr(self, 'set_parameterlist'):
- self.set_parameterlist(obj_.value)
+ self.set_parameterlist(obj_.value)
elif nodeName_ == 'xrefsect':
obj_ = docXRefSectType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13732,9 +13695,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'xrefsect', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_xrefsect'):
- self.add_xrefsect(obj_.value)
+ self.add_xrefsect(obj_.value)
elif hasattr(self, 'set_xrefsect'):
- self.set_xrefsect(obj_.value)
+ self.set_xrefsect(obj_.value)
elif nodeName_ == 'copydoc':
obj_ = docCopyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13742,9 +13705,19 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'copydoc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_copydoc'):
- self.add_copydoc(obj_.value)
+ self.add_copydoc(obj_.value)
elif hasattr(self, 'set_copydoc'):
- self.set_copydoc(obj_.value)
+ self.set_copydoc(obj_.value)
+ elif nodeName_ == 'details':
+ obj_ = docDetailsType.factory(parent_object_=self)
+ obj_.build(child_, gds_collector_=gds_collector_)
+ obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+ MixedContainer.TypeNone, 'details', obj_)
+ self.content_.append(obj_)
+ if hasattr(self, 'add_details'):
+ self.add_details(obj_.value)
+ elif hasattr(self, 'set_details'):
+ self.set_details(obj_.value)
elif nodeName_ == 'blockquote':
obj_ = docBlockQuoteType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13752,9 +13725,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'blockquote', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_blockquote'):
- self.add_blockquote(obj_.value)
+ self.add_blockquote(obj_.value)
elif hasattr(self, 'set_blockquote'):
- self.set_blockquote(obj_.value)
+ self.set_blockquote(obj_.value)
elif nodeName_ == 'parblock':
obj_ = docParBlockType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -13762,9 +13735,9 @@ class docMarkupType(GeneratedsSuper):
MixedContainer.TypeNone, 'parblock', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_parblock'):
- self.add_parblock(obj_.value)
+ self.add_parblock(obj_.value)
elif hasattr(self, 'set_parblock'):
- self.set_parblock(obj_.value)
+ self.set_parblock(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -13776,7 +13749,7 @@ class docURLLink(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, url=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, url=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -13854,11 +13827,6 @@ class docURLLink(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -14104,16 +14072,6 @@ class docURLLink(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -14296,7 +14254,6 @@ class docURLLink(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -14396,9 +14353,6 @@ class docURLLink(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -14481,9 +14435,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14491,9 +14445,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14501,9 +14455,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14511,9 +14465,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14521,9 +14475,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14531,9 +14485,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14541,9 +14495,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14551,9 +14505,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14561,9 +14515,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14571,9 +14525,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14581,9 +14535,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14591,9 +14545,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14601,9 +14555,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14611,19 +14565,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14631,9 +14575,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14641,9 +14585,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -14691,9 +14635,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14701,9 +14645,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14711,9 +14655,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14721,9 +14665,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14731,9 +14675,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14741,9 +14685,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14751,9 +14695,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14761,9 +14705,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -14771,9 +14715,9 @@ class docURLLink(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -15725,7 +15669,7 @@ class docRefTextType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, refid=None, kindref=None, external=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, refid=None, kindref=None, external=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -15807,11 +15751,6 @@ class docRefTextType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -16057,16 +15996,6 @@ class docRefTextType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -16270,7 +16199,6 @@ class docRefTextType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -16376,9 +16304,6 @@ class docRefTextType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -16470,9 +16395,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16480,9 +16405,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16490,9 +16415,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16500,9 +16425,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16510,9 +16435,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16520,9 +16445,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16530,9 +16455,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16540,9 +16465,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16550,9 +16475,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16560,9 +16485,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16570,9 +16495,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16580,9 +16505,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16590,9 +16515,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16600,19 +16525,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16620,9 +16535,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16630,9 +16545,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -16680,9 +16595,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16690,9 +16605,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16700,9 +16615,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16710,9 +16625,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16720,9 +16635,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16730,9 +16645,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16740,9 +16655,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16750,9 +16665,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -16760,9 +16675,9 @@ class docRefTextType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -17301,7 +17216,7 @@ class docCaptionType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, id=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, id=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -17379,11 +17294,6 @@ class docCaptionType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -17629,16 +17539,6 @@ class docCaptionType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -17821,7 +17721,6 @@ class docCaptionType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -17921,9 +17820,6 @@ class docCaptionType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -18006,9 +17902,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18016,9 +17912,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18026,9 +17922,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18036,9 +17932,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18046,9 +17942,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18056,9 +17952,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18066,9 +17962,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18076,9 +17972,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18086,9 +17982,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18096,9 +17992,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18106,9 +18002,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18116,9 +18012,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18126,9 +18022,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18136,19 +18032,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18156,9 +18042,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18166,9 +18052,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -18216,9 +18102,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18226,9 +18112,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18236,9 +18122,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18246,9 +18132,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18256,9 +18142,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18266,9 +18152,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18276,9 +18162,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18286,9 +18172,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -18296,9 +18182,9 @@ class docCaptionType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -18310,7 +18196,7 @@ class docHeadingType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, level=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, level=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -18388,11 +18274,6 @@ class docHeadingType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -18638,16 +18519,6 @@ class docHeadingType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -18830,7 +18701,6 @@ class docHeadingType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -18930,9 +18800,6 @@ class docHeadingType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -19015,9 +18882,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19025,9 +18892,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19035,9 +18902,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19045,9 +18912,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19055,9 +18922,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19065,9 +18932,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19075,9 +18942,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19085,9 +18952,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19095,9 +18962,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19105,9 +18972,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19115,9 +18982,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19125,9 +18992,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19135,9 +19002,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19145,19 +19012,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19165,9 +19022,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19175,9 +19032,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -19225,9 +19082,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19235,9 +19092,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19245,9 +19102,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19255,9 +19112,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19265,9 +19122,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19275,9 +19132,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19285,9 +19142,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19295,9 +19152,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -19305,9 +19162,9 @@ class docHeadingType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -19319,7 +19176,7 @@ class docImageType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, type_=None, name=None, width=None, height=None, alt=None, inline=None, caption=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, type_=None, name=None, width=None, height=None, alt=None, inline=None, caption=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -19409,11 +19266,6 @@ class docImageType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -19659,16 +19511,6 @@ class docImageType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -19901,7 +19743,6 @@ class docImageType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -20019,9 +19860,6 @@ class docImageType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -20130,9 +19968,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20140,9 +19978,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20150,9 +19988,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20160,9 +19998,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20170,9 +20008,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20180,9 +20018,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20190,9 +20028,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20200,9 +20038,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20210,9 +20048,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20220,9 +20058,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20230,9 +20068,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20240,9 +20078,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20250,9 +20088,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20260,19 +20098,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20280,9 +20108,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20290,9 +20118,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -20340,9 +20168,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20350,9 +20178,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20360,9 +20188,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20370,9 +20198,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20380,9 +20208,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20390,9 +20218,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20400,9 +20228,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20410,9 +20238,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -20420,9 +20248,9 @@ class docImageType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -20434,7 +20262,7 @@ class docDotMscType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, name=None, width=None, height=None, caption=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, name=None, width=None, height=None, caption=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -20518,11 +20346,6 @@ class docDotMscType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -20768,16 +20591,6 @@ class docDotMscType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -20972,7 +20785,6 @@ class docDotMscType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -21081,9 +20893,6 @@ class docDotMscType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -21178,9 +20987,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21188,9 +20997,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21198,9 +21007,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21208,9 +21017,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21218,9 +21027,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21228,9 +21037,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21238,9 +21047,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21248,9 +21057,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21258,9 +21067,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21268,9 +21077,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21278,9 +21087,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21288,9 +21097,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21298,9 +21107,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21308,19 +21117,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21328,9 +21127,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21338,9 +21137,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -21388,9 +21187,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21398,9 +21197,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21408,9 +21207,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21418,9 +21217,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21428,9 +21227,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21438,9 +21237,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21448,9 +21247,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21458,9 +21257,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -21468,9 +21267,9 @@ class docDotMscType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -21484,7 +21283,7 @@ class docImageFileType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, name=None, width=None, height=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, name=None, width=None, height=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -21566,11 +21365,6 @@ class docImageFileType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -21816,16 +21610,6 @@ class docImageFileType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -22016,7 +21800,6 @@ class docImageFileType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -22122,9 +21905,6 @@ class docImageFileType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -22215,9 +21995,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22225,9 +22005,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22235,9 +22015,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22245,9 +22025,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22255,9 +22035,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22265,9 +22045,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22275,9 +22055,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22285,9 +22065,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22295,9 +22075,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22305,9 +22085,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22315,9 +22095,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22325,9 +22105,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22335,9 +22115,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22345,19 +22125,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22365,9 +22135,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22375,9 +22145,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -22425,9 +22195,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22435,9 +22205,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22445,9 +22215,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22455,9 +22225,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22465,9 +22235,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22475,9 +22245,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22485,9 +22255,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22495,9 +22265,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -22505,9 +22275,9 @@ class docImageFileType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -22519,7 +22289,7 @@ class docPlantumlType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, name=None, width=None, height=None, caption=None, engine=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, name=None, width=None, height=None, caption=None, engine=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -22605,11 +22375,6 @@ class docPlantumlType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -22855,16 +22620,6 @@ class docPlantumlType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -23076,7 +22831,6 @@ class docPlantumlType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -23188,9 +22942,6 @@ class docPlantumlType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -23290,9 +23041,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23300,9 +23051,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23310,9 +23061,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23320,9 +23071,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23330,9 +23081,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23340,9 +23091,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23350,9 +23101,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23360,9 +23111,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23370,9 +23121,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23380,9 +23131,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23390,9 +23141,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23400,9 +23151,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23410,9 +23161,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23420,19 +23171,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23440,9 +23181,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23450,9 +23191,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -23500,9 +23241,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23510,9 +23251,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23520,9 +23261,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23530,9 +23271,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23540,9 +23281,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23550,9 +23291,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23560,9 +23301,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23570,9 +23311,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -23580,9 +23321,9 @@ class docPlantumlType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -23594,7 +23335,7 @@ class docTocItemType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, id=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, id=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
@@ -23672,11 +23413,6 @@ class docTocItemType(GeneratedsSuper):
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
@@ -23922,16 +23658,6 @@ class docTocItemType(GeneratedsSuper):
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
@@ -24114,7 +23840,6 @@ class docTocItemType(GeneratedsSuper):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
@@ -24214,9 +23939,6 @@ class docTocItemType(GeneratedsSuper):
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
@@ -24299,9 +24021,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24309,9 +24031,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24319,9 +24041,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24329,9 +24051,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24339,9 +24061,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24349,9 +24071,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24359,9 +24081,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24369,9 +24091,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24379,9 +24101,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24389,9 +24111,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24399,9 +24121,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24409,9 +24131,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24419,9 +24141,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24429,19 +24151,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24449,9 +24161,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24459,9 +24171,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
@@ -24509,9 +24221,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24519,9 +24231,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24529,9 +24241,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24539,9 +24251,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24549,9 +24261,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24559,9 +24271,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24569,9 +24281,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24579,9 +24291,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
@@ -24589,9 +24301,9 @@ class docTocItemType(GeneratedsSuper):
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -25298,9 +25010,9 @@ class docParamType(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -25447,9 +25159,9 @@ class docParamName(GeneratedsSuper):
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
@@ -25739,6 +25451,108 @@ class docCopyType(GeneratedsSuper):
# end class docCopyType
+class docDetailsType(GeneratedsSuper):
+ __hash__ = GeneratedsSuper.__hash__
+ subclass = None
+ superclass = None
+ def __init__(self, para=None, gds_collector_=None, **kwargs_):
+ self.gds_collector_ = gds_collector_
+ self.gds_elementtree_node_ = None
+ self.original_tagname_ = None
+ self.parent_object_ = kwargs_.get('parent_object_')
+ self.ns_prefix_ = None
+ if para is None:
+ self.para = []
+ else:
+ self.para = para
+ self.para_nsprefix_ = None
+ def factory(*args_, **kwargs_):
+ if CurrentSubclassModule_ is not None:
+ subclass = getSubclassFromModule_(
+ CurrentSubclassModule_, docDetailsType)
+ if subclass is not None:
+ return subclass(*args_, **kwargs_)
+ if docDetailsType.subclass:
+ return docDetailsType.subclass(*args_, **kwargs_)
+ else:
+ return docDetailsType(*args_, **kwargs_)
+ factory = staticmethod(factory)
+ def get_ns_prefix_(self):
+ return self.ns_prefix_
+ def set_ns_prefix_(self, ns_prefix):
+ self.ns_prefix_ = ns_prefix
+ def get_para(self):
+ return self.para
+ def set_para(self, para):
+ self.para = para
+ def add_para(self, value):
+ self.para.append(value)
+ def insert_para_at(self, index, value):
+ self.para.insert(index, value)
+ def replace_para_at(self, index, value):
+ self.para[index] = value
+ def hasContent_(self):
+ if (
+ self.para
+ ):
+ return True
+ else:
+ return False
+ def export(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='docDetailsType', pretty_print=True):
+ imported_ns_def_ = GenerateDSNamespaceDefs_.get('docDetailsType')
+ if imported_ns_def_ is not None:
+ namespacedef_ = imported_ns_def_
+ if pretty_print:
+ eol_ = '\n'
+ else:
+ eol_ = ''
+ if self.original_tagname_ is not None and name_ == 'docDetailsType':
+ name_ = self.original_tagname_
+ if UseCapturedNS_ and self.ns_prefix_:
+ namespaceprefix_ = self.ns_prefix_ + ':'
+ showIndent(outfile, level, pretty_print)
+ outfile.write('<%s%s%s' % (namespaceprefix_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+ already_processed = set()
+ self.exportAttributes(outfile, level, already_processed, namespaceprefix_, name_='docDetailsType')
+ if self.hasContent_():
+ outfile.write('>%s' % (eol_, ))
+ self.exportChildren(outfile, level + 1, namespaceprefix_, namespacedef_, name_='docDetailsType', pretty_print=pretty_print)
+ showIndent(outfile, level, pretty_print)
+ outfile.write('</%s%s>%s' % (namespaceprefix_, name_, eol_))
+ else:
+ outfile.write('/>%s' % (eol_, ))
+ def exportAttributes(self, outfile, level, already_processed, namespaceprefix_='', name_='docDetailsType'):
+ pass
+ def exportChildren(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='docDetailsType', fromsubclass_=False, pretty_print=True):
+ if pretty_print:
+ eol_ = '\n'
+ else:
+ eol_ = ''
+ for para_ in self.para:
+ namespaceprefix_ = self.para_nsprefix_ + ':' if (UseCapturedNS_ and self.para_nsprefix_) else ''
+ para_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='para', pretty_print=pretty_print)
+ def build(self, node, gds_collector_=None):
+ self.gds_collector_ = gds_collector_
+ if SaveElementTreeNode:
+ self.gds_elementtree_node_ = node
+ already_processed = set()
+ self.ns_prefix_ = node.prefix
+ self.buildAttributes(node, node.attrib, already_processed)
+ for child in node:
+ nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+ self.buildChildren(child, node, nodeName_, gds_collector_=gds_collector_)
+ return self
+ def buildAttributes(self, node, attrs, already_processed):
+ pass
+ def buildChildren(self, child_, node, nodeName_, fromsubclass_=False, gds_collector_=None):
+ if nodeName_ == 'para':
+ obj_ = docParaType.factory(parent_object_=self)
+ obj_.build(child_, gds_collector_=gds_collector_)
+ self.para.append(obj_)
+ obj_.original_tagname_ = 'para'
+# end class docDetailsType
+
+
class docBlockQuoteType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
@@ -26571,6 +26385,7 @@ __all__ = [
"docBlockQuoteType",
"docCaptionType",
"docCopyType",
+ "docDetailsType",
"docDotMscType",
"docEmojiType",
"docEmptyType",
diff --git a/addon/doxmlparser/examples/metrics/metrics.py b/addon/doxmlparser/examples/metrics/metrics.py
index a83e16f..da12683 100644
--- a/addon/doxmlparser/examples/metrics/metrics.py
+++ b/addon/doxmlparser/examples/metrics/metrics.py
@@ -174,32 +174,32 @@ def parse_sections(compounddef,metrics):
def parse_compound(inDirName,baseName,metrics):
rootObj = doxmlparser.compound.parse(inDirName+"/"+baseName+".xml",True)
for compounddef in rootObj.get_compounddef():
- kind = compounddef.get_kind()
- if kind==DoxCompoundKind.CLASS:
- metrics.numClasses+=1
- if is_documented(compounddef):
- metrics.numDocClasses+=1
- elif kind==DoxCompoundKind.STRUCT:
- metrics.numStructs+=1
- elif kind==DoxCompoundKind.UNION:
- metrics.numUnions+=1
- elif kind==DoxCompoundKind.INTERFACE:
- metrics.numInterfaces+=1
- elif kind==DoxCompoundKind.EXCEPTION:
- metrics.numExceptions+=1
- elif kind==DoxCompoundKind.NAMESPACE:
- metrics.numNamespaces+=1
- elif kind==DoxCompoundKind.FILE:
- metrics.numFiles+=1
- if is_documented(compounddef):
- metrics.numDocFiles+=1
- elif kind==DoxCompoundKind.GROUP:
- metrics.numGroups+=1
- elif kind==DoxCompoundKind.PAGE:
- metrics.numPages+=1
- else:
- continue
- parse_sections(compounddef,metrics)
+ kind = compounddef.get_kind()
+ if kind==DoxCompoundKind.CLASS:
+ metrics.numClasses+=1
+ if is_documented(compounddef):
+ metrics.numDocClasses+=1
+ elif kind==DoxCompoundKind.STRUCT:
+ metrics.numStructs+=1
+ elif kind==DoxCompoundKind.UNION:
+ metrics.numUnions+=1
+ elif kind==DoxCompoundKind.INTERFACE:
+ metrics.numInterfaces+=1
+ elif kind==DoxCompoundKind.EXCEPTION:
+ metrics.numExceptions+=1
+ elif kind==DoxCompoundKind.NAMESPACE:
+ metrics.numNamespaces+=1
+ elif kind==DoxCompoundKind.FILE:
+ metrics.numFiles+=1
+ if is_documented(compounddef):
+ metrics.numDocFiles+=1
+ elif kind==DoxCompoundKind.GROUP:
+ metrics.numGroups+=1
+ elif kind==DoxCompoundKind.PAGE:
+ metrics.numPages+=1
+ else:
+ continue
+ parse_sections(compounddef,metrics)
def parse_index(inDirName):
metrics = Metrics()
diff --git a/addon/doxmlparser/generateDS_post.py b/addon/doxmlparser/generateDS_post.py
index 5c31a59..70a1a83 100755
--- a/addon/doxmlparser/generateDS_post.py
+++ b/addon/doxmlparser/generateDS_post.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
#
# Copyright (C) 1997-2022 by Dimitri van Heesch.
#
diff --git a/addon/doxyapp/doxyapp.cpp b/addon/doxyapp/doxyapp.cpp
index a410ff5..0352843 100644
--- a/addon/doxyapp/doxyapp.cpp
+++ b/addon/doxyapp/doxyapp.cpp
@@ -148,11 +148,14 @@ static void listSymbols()
{
for (const auto &kv : *Doxygen::symbolMap)
{
- listSymbol(kv.second);
+ for (const auto &def : kv.second)
+ {
+ listSymbol(def);
+ }
}
}
-static void lookupSymbol(Definition *d)
+static void lookupSymbol(const Definition *d)
{
if (d!=Doxygen::globalScope && // skip the global namespace symbol
d->name().at(0)!='@' // skip anonymous stuff
@@ -169,20 +172,20 @@ static void lookupSymbol(Definition *d)
{
case Definition::TypeClass:
{
- ClassDef *cd = dynamic_cast<ClassDef*>(d);
+ const ClassDef *cd = dynamic_cast<const ClassDef*>(d);
printf("Kind: %s\n",cd->compoundTypeString().data());
}
break;
case Definition::TypeFile:
{
- FileDef *fd = dynamic_cast<FileDef*>(d);
+ const FileDef *fd = dynamic_cast<const FileDef*>(d);
printf("Kind: File: #includes %zu other files\n",
fd->includeFileList().size());
}
break;
case Definition::TypeNamespace:
{
- NamespaceDef *nd = dynamic_cast<NamespaceDef*>(d);
+ const NamespaceDef *nd = dynamic_cast<const NamespaceDef*>(d);
printf("Kind: Namespace: contains %zu classes and %zu namespaces\n",
nd->getClasses().size(),
nd->getNamespaces().size());
@@ -190,7 +193,7 @@ static void lookupSymbol(Definition *d)
break;
case Definition::TypeMember:
{
- MemberDef *md = dynamic_cast<MemberDef*>(d);
+ const MemberDef *md = dynamic_cast<const MemberDef*>(d);
printf("Kind: %s\n",md->memberTypeName().data());
}
break;
@@ -207,9 +210,9 @@ static void lookupSymbols(const QCString &sym)
{
auto range = Doxygen::symbolMap->find(sym);
bool found=false;
- for (auto it=range.first; it!=range.second; ++it)
+ for (const Definition *def : range)
{
- lookupSymbol(it->second);
+ lookupSymbol(def);
found=true;
}
if (!found)
diff --git a/addon/doxypysql/search.py b/addon/doxypysql/search.py
index 5f820de..70feec2 100755
--- a/addon/doxypysql/search.py
+++ b/addon/doxypysql/search.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# python script to search through doxygen_sqlite3.db
#
@@ -17,28 +17,28 @@ import json
import re
class MemberType:
- Define="macro definition"
- Function="function"
- Variable="variable"
- Typedef="typedef"
- Enumeration="enumeration"
- EnumValue="enumvalue"
- Signal="signal"
- Slot="slot"
- Friend="friend"
- DCOP="dcop"
- Property="property"
- Event="event"
- File="file"
+ Define="macro definition"
+ Function="function"
+ Variable="variable"
+ Typedef="typedef"
+ Enumeration="enumeration"
+ EnumValue="enumvalue"
+ Signal="signal"
+ Slot="slot"
+ Friend="friend"
+ DCOP="dcop"
+ Property="property"
+ Event="event"
+ File="file"
class RequestType:
- References="9901"
- Struct="9902"
- Includers="9903"
- Includees="9904"
- Members="9905"
- BaseClasses="9906"
- SubClasses="9907"
+ References="9901"
+ Struct="9902"
+ Includers="9903"
+ Includees="9904"
+ Members="9905"
+ BaseClasses="9906"
+ SubClasses="9907"
g_use_regexp=False
###############################################################################
@@ -311,7 +311,7 @@ def serveCgi():
print(json.dumps({"result":j,"error":None}))
###############################################################################
def usage():
- sys.stderr.write("""Usage: search.py [Options]
+ sys.stderr.write("""Usage: search.py [Options]
Options:
-h, --help
-d <D> Use database <D> for queries.
@@ -381,9 +381,9 @@ def serveCli(argv):
cn=openDb(dbname)
f=Finder(cn,o)
if ref != None:
- j=processHref(cn,ref)
+ j=processHref(cn,ref)
else:
- j=process(f,kind)
+ j=process(f,kind)
print(json.dumps(j,indent=4))
diff --git a/addon/doxysearch/doxyindexer.cpp b/addon/doxysearch/doxyindexer.cpp
index 8d295cb..041bac0 100644
--- a/addon/doxysearch/doxyindexer.cpp
+++ b/addon/doxysearch/doxyindexer.cpp
@@ -174,7 +174,7 @@ class XMLContentHandler
TextField = 7
};
- /** Handler for a start tag. Called for <doc> and <field> tags */
+ /** Handler for a start tag. Called for `<doc>` and `<field>` tags */
void startElement(const std::string &name, const XMLHandlers::Attributes &attrib)
{
m_data="";
@@ -192,7 +192,7 @@ class XMLContentHandler
}
}
- /** Handler for an end tag. Called for </doc> and </field> tags */
+ /** Handler for an end tag. Called for `</doc>` and `</field>` tags */
void endElement(const std::string &name)
{
if (name=="doc") // </doc>
diff --git a/addon/doxywizard/CMakeLists.txt b/addon/doxywizard/CMakeLists.txt
index bb0e0eb..cfc3a9b 100644
--- a/addon/doxywizard/CMakeLists.txt
+++ b/addon/doxywizard/CMakeLists.txt
@@ -80,15 +80,65 @@ add_custom_command(
set_source_files_properties(${GENERATED_SRC_WIZARD}/configdoc.cpp PROPERTIES GENERATED 1)
set(LEX_FILES config_doxyw)
+
+if (NOT depfile_supported)
+ # In case the DEPFILE possibility is not supported the complete list of lex include files for the dependency has to be used
+ set(LEX_INC_FILES)
+endif()
+
foreach(lex_file ${LEX_FILES})
+ if (depfile_supported)
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d ${PROJECT_SOURCE_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l
+ DEPFILE ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ )
+ else()
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d ${PROJECT_SOURCE_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${LEX_INC_FILES}
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ )
+ endif()
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.l PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.corr PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.d PROPERTIES GENERATED 1)
+
+ if (depfile_supported)
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d ${PROJECT_SOURCE_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l
+ DEPFILE ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ )
+ else()
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d ${PROJECT_SOURCE_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${LEX_INC_FILES}
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ )
+ endif()
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.l PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.corr PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.d PROPERTIES GENERATED 1)
+
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/scan_states.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l > ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
- DEPENDS ${PROJECT_SOURCE_DIR}/src/scan_states.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/scan_states.py ${GENERATED_SRC_WIZARD}/${lex_file}.l > ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/scan_states.py ${GENERATED_SRC_WIZARD}/${lex_file}.l
OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
)
set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.l.h PROPERTIES GENERATED 1)
- FLEX_TARGET(${lex_file} ${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.cpp COMPILE_FLAGS "${LEX_FLAGS}")
+ FLEX_TARGET(${lex_file}
+ ${GENERATED_SRC_WIZARD}/${lex_file}.l
+ ${GENERATED_SRC_WIZARD}/${lex_file}_intermediate.cpp
+ COMPILE_FLAGS "${LEX_FLAGS}")
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/post_lex.py ${GENERATED_SRC_WIZARD}/${lex_file}_intermediate.cpp ${GENERATED_SRC_WIZARD}/${lex_file}.cpp ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/post_lex.py ${GENERATED_SRC_WIZARD}/${lex_file}_intermediate.cpp ${GENERATED_SRC_WIZARD}/${lex_file}.corr
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.cpp
+ )
endforeach()
qt_wrap_cpp(doxywizard_MOC
diff --git a/addon/doxywizard/config_doxyw.l b/addon/doxywizard/config_doxyw.l
index 95f33e7..2ca8e63 100644
--- a/addon/doxywizard/config_doxyw.l
+++ b/addon/doxywizard/config_doxyw.l
@@ -42,6 +42,7 @@
#define MAX_INCLUDE_DEPTH 10
+#define USE_STATE2STRING 0
/* -----------------------------------------------------------------
*
@@ -374,6 +375,9 @@ static void readIncludeFile(const QString &incName)
}
}
+#if USE_STATE2STRING
+static const char *stateToString(int state);
+#endif
%}
@@ -832,4 +836,6 @@ void writeStringValue(QTextStream &t,TextCodecAdapter *codec,const QString &s)
}
}
}
+#if USE_STATE2STRING
#include "config_doxyw.l.h"
+#endif
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
index 1011e2b..1011e2b 100755..100644
--- a/addon/doxywizard/doxywizard.cpp
+++ b/addon/doxywizard/doxywizard.cpp
diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h
index ccbd9b0..ccbd9b0 100755..100644
--- a/addon/doxywizard/doxywizard.h
+++ b/addon/doxywizard/doxywizard.h
diff --git a/addon/doxywizard/images/add.png b/addon/doxywizard/images/add.png
index 3af7eb7..3af7eb7 100755..100644
--- a/addon/doxywizard/images/add.png
+++ b/addon/doxywizard/images/add.png
Binary files differ
diff --git a/addon/doxywizard/images/del.png b/addon/doxywizard/images/del.png
index c2e3bc8..c2e3bc8 100755..100644
--- a/addon/doxywizard/images/del.png
+++ b/addon/doxywizard/images/del.png
Binary files differ
diff --git a/addon/doxywizard/images/file.png b/addon/doxywizard/images/file.png
index 14f2c95..14f2c95 100755..100644
--- a/addon/doxywizard/images/file.png
+++ b/addon/doxywizard/images/file.png
Binary files differ
diff --git a/addon/doxywizard/images/folder.png b/addon/doxywizard/images/folder.png
index c91c582..c91c582 100755..100644
--- a/addon/doxywizard/images/folder.png
+++ b/addon/doxywizard/images/folder.png
Binary files differ
diff --git a/addon/doxywizard/images/refresh.png b/addon/doxywizard/images/refresh.png
index 413735b..413735b 100755..100644
--- a/addon/doxywizard/images/refresh.png
+++ b/addon/doxywizard/images/refresh.png
Binary files differ
diff --git a/addon/doxywizard/images/tunecolor.png b/addon/doxywizard/images/tunecolor.png
index 9e595e4..9e595e4 100755..100644
--- a/addon/doxywizard/images/tunecolor.png
+++ b/addon/doxywizard/images/tunecolor.png
Binary files differ
diff --git a/addon/doxywizard/wizard.cpp b/addon/doxywizard/wizard.cpp
index 84a70f6..84a70f6 100755..100644
--- a/addon/doxywizard/wizard.cpp
+++ b/addon/doxywizard/wizard.cpp
diff --git a/cmake/FindJavacc.cmake b/cmake/FindJavacc.cmake
index 97a7827..97a7827 100755..100644
--- a/cmake/FindJavacc.cmake
+++ b/cmake/FindJavacc.cmake
diff --git a/cmake/Sanitizers/asan-wrapper b/cmake/Sanitizers/asan-wrapper
index 5d54103..5d54103 100755..100644
--- a/cmake/Sanitizers/asan-wrapper
+++ b/cmake/Sanitizers/asan-wrapper
diff --git a/doc/._archoverview.eps b/doc/._archoverview.eps
deleted file mode 100644
index 60cfed6..0000000
--- a/doc/._archoverview.eps
+++ /dev/null
Binary files differ
diff --git a/doc/._infoflow.png b/doc/._infoflow.png
deleted file mode 100644
index 6c7f3e8..0000000
--- a/doc/._infoflow.png
+++ /dev/null
Binary files differ
diff --git a/doc/Doxyfile b/doc/Doxyfile
index f69cda8..9a3254b 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -31,6 +31,7 @@ GENERATE_XML = NO
HTML_COLORSTYLE_SAT = 0
ENABLED_SECTIONS = logo_on
ENABLE_PREPROCESSING = NO
+HTML_COLORSTYLE = LIGHT
CASE_SENSE_NAMES = NO
IMAGE_PATH = . images
INPUT = index.doc install.doc starting.doc docblocks.doc markdown.doc \
@@ -49,7 +50,7 @@ SEARCHENGINE = NO
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
STRIP_CODE_COMMENTS = NO
-HTML_STYLESHEET = doxygen_manual.css
+HTML_EXTRA_STYLESHEET = doxygen_manual.css
HTML_EXTRA_FILES = doxygen_logo.svg
HTML_EXTRA_FILES += translator_report.txt
ALIASES = LaTeX="\f({\LaTeX}\f)"
diff --git a/doc/arch.doc b/doc/arch.doc
index 2e9584d..005af26 100644
--- a/doc/arch.doc
+++ b/doc/arch.doc
@@ -263,7 +263,7 @@ are different from the standard doxygen configuration file settings one can run
doxygen command: with the `-x` option and the name of the configuration file (default
is `Doxyfile`). The output will be a list of the not default settings (in `Doxyfile`
format). Alternatively also `-x_noenv` is possible which is identical to the `-x`
-option but without replacing the environment variables.
+option but without replacing the environment variables and the CMake type replacement variables.
\htmlonly
Return to the <a href="index.html">index</a>.
diff --git a/doc/changelog.doc b/doc/changelog.doc
index c8303fe..44810f1 100644
--- a/doc/changelog.doc
+++ b/doc/changelog.doc
@@ -1,6 +1,163 @@
/** \page changelog Changelog
\tableofcontents{html,latex}
\section log_1_9 1.9 Series
+\subsection log_1_9_5 Release 1.9.5
+\htmlonly
+<b>(release date 26-08-2022)</b>
+</p>
+<h3>Bug fixes</h3>
+<ul>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/3165">#3165</a>: EXPAND_ONLY_PREDEF neglected within function macro expansions (Origin: bugzilla #559489) [<a href="https://github.com/doxygen/doxygen/commit/50184bd02e8c8c4558827913907690ef0db72fd1">view</a>]</li>
+ <li>Macros listed with EXPAND_AS_DEFINED were not recursively expanded [<a href="https://github.com/doxygen/doxygen/commit/387f508b2e41179a9f70b2914132c2bf12d07b43">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/8215">#8215</a>: missing lang attribute and meta description for SEO [<a href="https://github.com/doxygen/doxygen/commit/15825737c8f2cc6ceee34ed986594b0ddbc47ce1">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9016">#9016</a>: Support collapsible sections in markdown [<a href="https://github.com/doxygen/doxygen/commit/a4e67401cb031ddb21b694e6a1ae62e98ec67d33">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9047">#9047</a>: Support @param-taint in PHP (permit dashes in command aliases?) [<a href="https://github.com/doxygen/doxygen/commit/6222ce6fc0feaf54d5bf88bca3451bb5727eedfe">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/a3c2018660befc13d99ab5ccbb453ba957fdd497">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9096">#9096</a>: Call Graph corrupt and/or incomplete (2) [<a href="https://github.com/doxygen/doxygen/commit/e08488a312af7e0ef7fbd6d011a0d3c0086631cc">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9236">#9236</a>: doxygen x_noenv should always diff system-dependent settings [<a href="https://github.com/doxygen/doxygen/commit/f41a679b3e68f13eff9f4eceaf04aacc51555fc5">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9309">#9309</a>: Colon on a line by itself [<a href="https://github.com/doxygen/doxygen/commit/0cf06873e8435a1e1a799ddf7178ca5fad7240eb">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9312">#9312</a>: Build: cache.h:53:14: error: &#39;exchange&#39; is not a member of &#39;std&#39; [<a href="https://github.com/doxygen/doxygen/commit/5198966c8d5fec89116d025c74934ac03ea511fa">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9317">#9317</a>: File-scoped Namespaces in C# [<a href="https://github.com/doxygen/doxygen/commit/e51aa96d25e96dff00d2eb23648eb24d777ce7a6">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9319">#9319</a>: Doc build fails with cairo 1.17.6 [<a href="https://github.com/doxygen/doxygen/commit/9df76e22464a0b6302b7c1cda980a35b39185bc4">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/c22ae5ed4ca8d7e5568be7d5a930ee388117703e">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9344">#9344</a>: Long bibliography entry looks bad [<a href="https://github.com/doxygen/doxygen/commit/ac090b56af5358b0f1ffc5a38dba4e61acb938d1">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9352">#9352</a>: Qt Q_GADGET macro is not supported [<a href="https://github.com/doxygen/doxygen/commit/d70eb9351c0b8881696cd9dbd9e174565e8c7115">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9362">#9362</a>: Doxyfile environment/quote mishandling in list values [<a href="https://github.com/doxygen/doxygen/commit/76c643993df0f046741b6f77808ec0e2b25f585a">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9367">#9367</a>: Current git master does not honor PROJECT_NUMBER in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/b293309a4cacf4e6385a9a992165f6c30a0575ce">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9378">#9378</a>: Dollar Sign Escape Sequence Ignored in Markdown Backtick Syntax (Inline Code) [<a href="https://github.com/doxygen/doxygen/commit/5db58085ae8d335c3c97be35973a7ee325c56c3b">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9394">#9394</a>: Request: Show C++ default member values when INLINE_SIMPLE_STRUCTS=YES [<a href="https://github.com/doxygen/doxygen/commit/f40a739457ef05b4935971db67c77925a6f90dcc">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9399">#9399</a>: XML / perlmod fortran output, the type of a parameter of a function is set to the name of the parameter [<a href="https://github.com/doxygen/doxygen/commit/9ad2a32a22200d550c90eef9cf68a37b5e8e0f76">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9409">#9409</a>: Error-message and Line-Number is NOT related to document [<a href="https://github.com/doxygen/doxygen/commit/ceb573f8254cdbd4715ebc0440f5bd2c580ac105">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9417">#9417</a>: Java: Issue with static initializer if no space after static [<a href="https://github.com/doxygen/doxygen/commit/eaaf3bb120b571f28f376d35f6d8543303a2e98a">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9427">#9427</a>: Enhance documentation for filter commands [<a href="https://github.com/doxygen/doxygen/commit/48f76a973a2d7ac2f40605d37b7fa7df91eb83a9">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9430">#9430</a>: HTML layout: a full sidebar overlaps with breadcrumbs [<a href="https://github.com/doxygen/doxygen/commit/85568d9ae102ab12233686f81e8eea32a2332ffc">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9440">#9440</a>: Fix search label regression [<a href="https://github.com/doxygen/doxygen/commit/0653918549e09f139897422787d6fd957f47d0e4">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9476">#9476</a>: fatal: Cannot open &#39;doxygen/graph_legend.dox&#39;: No such file or directory [<a href="https://github.com/doxygen/doxygen/commit/1b106e6d3495bf53ef971b8c9fdf0cd03c67d41c">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9500">#9500</a>: No output when run doxygen in high level directory [<a href="https://github.com/doxygen/doxygen/commit/532fabed57d7b508439ee4114f999132d745ce09">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9515">#9515</a>: Function return value problem [<a href="https://github.com/doxygen/doxygen/commit/6e300b2d094bb9f376dc0473b5b32a31ced4f139">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9520">#9520</a>: Rest of file silently ignored after a certain string literal [PHP] [<a href="https://github.com/doxygen/doxygen/commit/68e8d2a220c51d0909c38e8c5027f644f7233db0">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/789a763ef1a8f8ad8ddbdb4725913ca08b1ff37a">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9386">#9386</a>: Problems with the directory dependency graph [<a href="https://github.com/doxygen/doxygen/commit/3278a3268ec66bbd843462ce3ec1520f8d9aac8d">view</a>]</li>
+<li>bug 531817 Python: Backslash prevent showing the proper preview [<a href="https://github.com/doxygen/doxygen/commit/5be58a08bba75ae0c9c1fdc229efbe5e77bcaa6e">view</a>]</li>
+<li>bug 539818 C Preprocessor enum printing trick not handled properly by Doxygen [<a href="https://github.com/doxygen/doxygen/commit/29001f8659735d5e073bdf6f0f1ef988e8957d74">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/70df5ab5a701e203d1a9b1cb63a864dc0582f10c">view</a>]</li>
+<li>bug 642168 C# &quot;here-docs&quot; not correctly parsed [<a href="https://github.com/doxygen/doxygen/commit/d0bac16ec30f704dbc4712d25f0256f02d3f69d3">view</a>]</li>
+<li>bug 786576 regression with ALIASES or image latex interpretation [<a href="https://github.com/doxygen/doxygen/commit/b3bd30ff95b9630cdbc5b592e82b95c314531eeb">view</a>]</li>
+<li>bug_572042 ingroup does not allow multiple groupnames [<a href="https://github.com/doxygen/doxygen/commit/7dc299f2d867250bd924d39545c7a3d10b9d3756">view</a>]</li>
+<li>bug_751023 Predefined macros are handled incorrectly in source browser [<a href="https://github.com/doxygen/doxygen/commit/c1c791ae46e61ad168e4a1ad7951da0d4f0d2bd2">view</a>]</li>
+<li>Fixed javascript issue in menu.js causing invalid XHTML output [<a href="https://github.com/doxygen/doxygen/commit/50ca2d074678ed34f2fa043f6fbd4cfd97815a0d">view</a>]</li>
+<li>Fixed parsing issues with the XHTML output due to the use of &amp;nbsp; [<a href="https://github.com/doxygen/doxygen/commit/d9a25b04bfacc6e68c45f32f183b09e55099854e">view</a>]</li>
+<li>FileInfo::isSymLink() did not work correctly [<a href="https://github.com/doxygen/doxygen/commit/6045c84aa1f6c21e99954268c720f3be7bae7995">view</a>]</li>
+<li>Files Quick Link results in a non existing page [<a href="https://github.com/doxygen/doxygen/commit/fb6a3bd96fde4c65e792e6ad606ce6142eda928e">view</a>]</li>
+<li>Added guard to prevent stack overflow in hasNonReferenceSuperClass() [<a href="https://github.com/doxygen/doxygen/commit/ffd5a0947f809304008c1b327dd2306997430355">view</a>]</li>
+<li>Give markdown verbatim and fenced code blocks their own command. [<a href="https://github.com/doxygen/doxygen/commit/037da647c6a1b4d138c892f2a5f111887b198928">view</a>]</li>
+<li>No click possible on chapters in doxygen&#39;s CHM documentation [<a href="https://github.com/doxygen/doxygen/commit/f759783502a61097f685369888d06f14022f6c4c">view</a>]</li>
+</ul>
+<h3>Features</h3>
+<ul>
+<li>Add support for Dark theme (set via HTML_COLORSTYLE with setting DARK, LIGHT, AUTO_DARK, AUTO_LIGHT and TOGGLE). <br/>
+Original issue <a href="https://github.com/doxygen/doxygen/issues/8404">#8404</a>:
+Dark theme [<a href="https://github.com/doxygen/doxygen/commit/8b7822cb67fd55a4349a6ec7525ca18c1d9f6790">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/c28602c794592a4e57db03dbc34d7d031d3e6085">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/ec318afc588324136bde8b627cb0ff69d8a25e65">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/e1772b8ac91011cdc774ad5ed3962633bc8aa20c">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/41d6c6e265e6cd27df0e31064418fea030461c1a">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/95390f85058027057433095cdcff23bd97f917b0">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/ec04a338840da52d51eaf3360e2338feac157891">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/d8c07cfd399b95725638e559a86f90e28170bd5c">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/35a246e8974c5a6275d2f09a865145a5b9d88ade">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/aa4a606685c08c43ffea4f8d3350cef093870ad9">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/50871a4cd625586b6e73fad25afd23610da09e3e">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/260f2fadf8b780d824cba2e490d119e759ada101">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/a02d23c8b9c7328a4d0afb5c0aa8a6967b352521">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/18b11ea424e412cc7a03795a9e5f3df6f7406c3e">view</a>]</li>
+<li>New options DOt_COMMON_ATTR, DOT_EDGE_ATTR, and DOT_NODE_ATTR to configure dot graph,
+nodes and arrows attributes [<a href="https://github.com/doxygen/doxygen/commit/4bfd829767e85f0d4589ee3638b90c27b3395853">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/5d929c3c10ee45917ec8c7e44ce9b0b294b7aec7">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/abdd83c2de5cdf71018fba11957e1a92a5366214">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/4ad25a884f0c79e043bfb7cbfd858ba0b00fc9ea">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/a4565784cdc01e860438edfdcc6dc1ef7ffe9ec9">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/a313ed7c3f3ef7638c8bf2a7744e86b8ae91ae3f">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/b711b21a041b14d7b2fddea610d904671f260924">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/6881a3c1db326c73c673a5ee5874f54a40400565">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/780e6fc8d6f7e7339a48fba731cb6f12afe1ab91">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/50a50fdb86a2b4c6f021beb219b21209f504d48b">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/5f8bf5819d4ce95e9a21e8ad88fc82cfe10c23dc">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/241b3015356f7fa59285403008dd771bd26cafa2">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/d6a4618b39615db4af2146d2d08f69cf6d724702">view</a>]</li>
+<li>New option INPUT_FILE_ENCODING to specify input encoding based on a file pattern [<a href="https://github.com/doxygen/doxygen/commit/256f352fad995f70d58a777c4ce32f8104382b20">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/d0d1482ddc6a78e9b6aafb02c63b736291881ac8">view</a>]</li>
+<li>New option FORTRAN_COMMENT_AFTER to configure the fixed format comment start position (default 72).
+<li>Added new commands \fileinfo and \lineinfo to show the current file and line. <br/>
+See issue <a href="https://github.com/doxygen/doxygen/issues/7046">#7046</a>: Add filename and line number support to tags, ala __FILE__ and __LINE__ macros [<a href="https://github.com/doxygen/doxygen/commit/7279874742ad21ca74506da1e898dfe9a27da248">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/6db7cd7d6da22e5219c96097e280539cf793a3a8">view</a>]</li>
+<li>Add support for \showdate command [<a href="https://github.com/doxygen/doxygen/commit/7958f3b22fd4a3c6fea26450214a8aa294d9a21d">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/bb9d30dc964af2709096ad20f95e707fe4c72bb3">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/c03d69c7fa1f66aaa734d0b4624b0b8dec2723c1">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/3a2247fe708ad1312d2f30cbd6a0c45ec823ed64">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/9af1017ab5a52f3f1f96248736a838df74e57007">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/afb0a4465e1f6f1c8288773b0c416f568236ec8b">view</a>]</li>
+<li>Allow empty HTML &lt;div/&gt; and &lt;span/&gt; tags [<a href="https://github.com/doxygen/doxygen/commit/1c7bbfb6879851c8e1a3a0d7f792b1ae0a4732eb">view</a>]</li>
+<li>Handling of `@...@` setting with `doxygen -x_noenv` [<a href="https://github.com/doxygen/doxygen/commit/a26134fd3e1a12c090e87b005654631bfcb2b5ea">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/5961e8c06d738d9ebddfdeac79c0b14fff64d237">view</a>]</li>
+<li>Recognizing and name of implicit Fortran [programs [<a href="https://github.com/doxygen/doxygen/commit/943d8b7381fc79c4f78f8730fa1f2967521213a2">view</a>]</li>
+<li>Support HTML stylesheets on the Internet [<a href="https://github.com/doxygen/doxygen/commit/6b89e8f7b2793329c820d636a91126af52c757e0">view</a>]</li>
+Issue <a href="https://github.com/doxygen/doxygen/issues/9415">#9415</a>: fixed format source with wide lines [<a href="https://github.com/doxygen/doxygen/commit/155afc19f081b65d413f8fb175e9e7ec2ac3d8cc">view</a>]</li>
+<li>End of &quot;here document&quot; can be indented [<a href="https://github.com/doxygen/doxygen/commit/801e3fbfc44373e9f2e9cc68133c937ff81f9463">view</a>]</li>
+<li>Portuguese and Czech translators updated to 1.9.4. [<a href="https://github.com/doxygen/doxygen/commit/b45a92584ea4626f778842fa853230d679c6f266">view</a>] and [<a href="https://github.com/doxygen/doxygen/pull/9540">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9444">#9444</a>: Upgrade jQuery UI to latest 1.13 release to get rid of security issues [<a href="https://github.com/doxygen/doxygen/commit/ac02185173cb7f6109b8945a8d7aa0ca6927d6fb">view</a>]</li>
+</ul>
+<h3>Improved user feedback</h3>
+<ul>
+<li>Commented function list marcro gives warning [<a href="https://github.com/doxygen/doxygen/commit/039d190f27da746670fd27685237eed927f78abf">view</a>]</li>
+<li>Correction of line counting [<a href="https://github.com/doxygen/doxygen/commit/2606d4e2e5c086d5fc5560099d2a417bf7ccf58c">view</a>]</li>
+<li>Documenting parameter of function without parameters [<a href="https://github.com/doxygen/doxygen/commit/14a1de12affc2798278b7755a70d285c3194ee7f">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/f8daa6234b05c097450b9886bdc7ece758daae8e">view</a>]</li>
+<li>Warning about non closed (nested) comment [<a href="https://github.com/doxygen/doxygen/commit/64b858397458af468f9918ca5cc6d7287ef7cd8a">view</a>]</li>
+<li>Friendly message on incorrect input [<a href="https://github.com/doxygen/doxygen/commit/be9aa9ced3c7fa8628971da762f0aa7436a02abc">view</a>]</li>
+<li>Make directory traversal more robust for errors (e.g. broken symlinks) [<a href="https://github.com/doxygen/doxygen/commit/d72fa53f41d6bea2a190a98fcc830fe79667abc7">view</a>]</li>
+</ul>
+<h3>Deprecated functionality</h3>
+<ul>
+<li>With the new dark mode color style the FORMULA_TRANSPARENT and DOT_TRANSPARENT have become obsolete. Pictures always have a transparent background now.</li>
+<li>The specific options DOT_FONTNAME and DOT_FONTSIZE have been replaced be more generic options DOT_COMMON_ATTR, DOT_EDGE_ATTR, and DOT_NODE_ATTR that can be used to
+customize the way dot images are rendered. When upgrading the Doxyfile (using <tt>doxygen -u</tt>) the existing values of DOT_FONTNAME and DOT_FONTSIZE will be migrated.</li>
+</ul>
+<h3>Refactoring and cleanup</h3>
+<ul>
+<li>Dependency between examples. [<a href="https://github.com/doxygen/doxygen/commit/c4e30d6e6fd747ff2c32a79a2012cf9481f4e780">view</a>]</li>
+<li>Enabling include files for lex files [<a href="https://github.com/doxygen/doxygen/commit/a619d333a84905c5ad20c03a744f8c977fccb770">view</a>]</li>
+<li>Enabling dependencies for include files in lex files [<a href="https://github.com/doxygen/doxygen/commit/2c6fad4d202c512db26a5a7ccbfb63b2822a280b">view</a>]</li>
+<li>Fix handling of PUBLIC/PRIVATE for procedures in Fortran [<a href="https://github.com/doxygen/doxygen/commit/4340e8ae1d0910f5521742478f759f9e7575ba33">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/827294d41ba868f8a5144f8e33d4d6de386359f5">view</a>]</li> <li>Fix regressions introduced by changing the way references are resolved [<a href="https://github.com/doxygen/doxygen/commit/35711f2d14acc81cff83f81f04c566ad8c8c6fe8">view</a>]</li>
+<li>Fixes: also allow ; and space as attribute separator [<a href="https://github.com/doxygen/doxygen/commit/6f020734520f2945f8f2821deb78ee0beb7c0c62">view</a>]</li>
+<li>Implementation of lineBreak and nonBreakingSpace in docbook [<a href="https://github.com/doxygen/doxygen/commit/e2090bb18964077542b3637496347a3f9d4f53c8">view</a>]</li>
+<li>Improve test for fortran public/private handling [<a href="https://github.com/doxygen/doxygen/commit/230d403896d06e906a9e711bd86851b0df33d682">view</a>]</li>
+<li>Improvement of HTML documentation section [<a href="https://github.com/doxygen/doxygen/commit/a935b577686e6a4a635837fecb7e79b6d77dabef">view</a>]</li>
+<li>Incorrect determination of sub-sections for index. [<a href="https://github.com/doxygen/doxygen/commit/593cc01f11da17f231750a88c7f997f8383df283">view</a>]</li>
+<li>Incorrect name lex state name used [<a href="https://github.com/doxygen/doxygen/commit/8115051ac38e58763dab8f0474d21946e9b0f872">view</a>]</li>
+<li>Making example configurations consistent [<a href="https://github.com/doxygen/doxygen/commit/bc1af180883518ad86f32e15f7dbe342a3549a97">view</a>]</li>
+<li>Missing possibility for Element &#39;compounddef&#39;, attribute &#39;language&#39; [<a href="https://github.com/doxygen/doxygen/commit/79c5ec77867e404d6f5438548c98d4079de6c351">view</a>]</li>
+<li>More translation tweaks [<a href="https://github.com/doxygen/doxygen/commit/8dad30669344c200e757fdbf7284b87ecfed3654">view</a>]</li>
+<li>Performance tweaks to speed up processing [<a href="https://github.com/doxygen/doxygen/commit/db8c2d6289d8c56a401d07714a6109ddc0bdc819">view</a>]</li>
+<li>Prohibit in-place doxygen builds [<a href="https://github.com/doxygen/doxygen/commit/97d59a983709475dad375b9758d6c48cecda7afe">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/9d0600b51717dd8741635ed13dcd5f2a9080601f">view</a>]</li>
+<li>Refactoring and fixes [<a href="https://github.com/doxygen/doxygen/commit/a44f6a7e5caf1fbf5fe271c99046a51b315d5f56">view</a>]</li>
+<li>Refactoring: Automatically replace incorrect formula.repository [<a href="https://github.com/doxygen/doxygen/commit/6cb065fa4b525f9e507ff80633050b770a6fb34a">view</a>]</li>
+<li>Refactoring: optimize FileDef::isDocumentationFile() method [<a href="https://github.com/doxygen/doxygen/commit/20cacf8a84b52535ab68c3e298f3e8f5088a2bb9">view</a>]</li>
+<li>Refactoring: optimize guessSection routine [<a href="https://github.com/doxygen/doxygen/commit/40869ceda8277459bd0042086a5494e2e68d2188">view</a>]</li>
+<li>Refactoring: reimplement getDefs using symbol resolver [<a href="https://github.com/doxygen/doxygen/commit/b290399fab92df45376103d7c094f053f24495fa">view</a>]</li>
+<li>Refactoring: replace left(n)/right(n) by startsWith/endsWith [<a href="https://github.com/doxygen/doxygen/commit/5979b8fa3e20ceda77e0019a35f9e07c18071597">view</a>]</li>
+<li>Refactoring: use std::variant for Indices [<a href="https://github.com/doxygen/doxygen/commit/f6aacfe1798efa80bbd9663b74ab05d2c7cb8382">view</a>]</li>
+<li>Refactoring: use std::variant to switch between search indices [<a href="https://github.com/doxygen/doxygen/commit/fdd8e8e750e1b8e58b4d9cc758293f532278dcca">view</a>]</li>
+<li>Remember position of collapse/expand across pages [<a href="https://github.com/doxygen/doxygen/commit/6bc86feae5466f98f8b9ea873c85f26e5c827bd2">view</a>]</li>
+<li>Remove dead-code statement as found by coverity [<a href="https://github.com/doxygen/doxygen/commit/426d3a5c743936e5584723a3762d80f8fca65fac">view</a>]</li>
+<li>Remove unused Validate debug option [<a href="https://github.com/doxygen/doxygen/commit/5cc149cbf65e433f04de23ad26be9bb4bf460ab2">view</a>]</li>
+<li>Replacing the list of HTML / XML commands by tables [<a href="https://github.com/doxygen/doxygen/commit/9bd76a4e95cff7064cabfb4ce8f5e00fe0453a1e">view</a>]</li>
+<li>Restructure build rule to improve readability and remove duplication [<a href="https://github.com/doxygen/doxygen/commit/09a6b3e8ddca2328d08ae4715f42df1d07d55700">view</a>]</li>
+<li>Small spelling correction in doxygen usage [<a href="https://github.com/doxygen/doxygen/commit/601e680b8f6dd2be7fea07ab107c9e4572eb8ddc">view</a>]</li>
+<li>Test Fortran inheritance over modules [<a href="https://github.com/doxygen/doxygen/commit/58ad198d5f6124f6fbc1aac2c0aeba7e8c80cbe5">view</a>]</li>
+<li>Use lower().str() to map Fortran identifier [<a href="https://github.com/doxygen/doxygen/commit/3205fbb4c34f61aa4165f875702de8e976cfd68f">view</a>]</li>
+<li>Workaround for DEPFILE [<a href="https://github.com/doxygen/doxygen/commit/3b30f16032a4b4512c2b60fb4b1cf68c36d06854">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/cb4c6f9b96e66c43401b9ff2e1d35faa73a10f17">view</a>]</li>
+<li>Workaround for XHTML not supporting &lt;picture&gt; [<a href="https://github.com/doxygen/doxygen/commit/24af0b0aaa7d834a015c40ba4c4c35fff511c21e">view</a>]</li>
+<li>fix shabang [<a href="https://github.com/doxygen/doxygen/commit/6afedffc85eeeb350d66d9cf2c1ee0e7ccd90fad">view</a>]</li>
+<li>python: do not use tabs for indentation [<a href="https://github.com/doxygen/doxygen/commit/87ce4ab655a1b3d344dabdefcfb3e626fd828d46">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/3b6a7091a85ef63fff96936b964ab3f4a8477ff6">view</a>]</li>
+<li>unset executable flag [<a href="https://github.com/doxygen/doxygen/commit/68725d49fede1a02a8f3c73608cc920960224d2b">view</a>]</li>
+</ul>
+<p>
+\endhtmlonly
+
\subsection log_1_9_4 Release 1.9.4
\htmlonly
<b>(release date 05-05-2022)</b>
@@ -2890,7 +3047,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li>Alignment in LaTeX parameter table [<a href="https://github.com/doxygen/doxygen/commit/a0880ff1c41a1c57bc92c1ccf99cf750064e2995">view</a>]</li>
<li>Avoid using Resource::data as string, as it is not null terminated. [<a href="https://github.com/doxygen/doxygen/commit/15a87a623791bf407b3076960cdd1133c8973357">view</a>]</li>
<li>Better handling of implicit statement in source code browser [<a href="https://github.com/doxygen/doxygen/commit/404468ac5484d54e47129ce2a00b3ad6e1c2c72a">view</a>]</li>
-<li>Bug&Acirc;&nbsp;149792 - Mainpage title has wrong style in RTF [<a href="https://github.com/doxygen/doxygen/commit/077aeb768767e62407abb4759d44671619bc62fd">view</a>]</li>
+<li>Bug 149792 - Mainpage title has wrong style in RTF [<a href="https://github.com/doxygen/doxygen/commit/077aeb768767e62407abb4759d44671619bc62fd">view</a>]</li>
<li>Bump version so that the GIT repo represents the version for the &quot;next&quot; release [<a href="https://github.com/doxygen/doxygen/commit/42c376cdb41db392bd025611ccfcaddb49d05e92">view</a>]</li>
<li>Cmake tries to remove directory refman.tex instead of file refman.tex [<a href="https://github.com/doxygen/doxygen/commit/63094c8bb34a2e02e8490860660303d849e4a984">view</a>]</li>
<li>Copy user EXTRA_FILES at the end to overrule files generated by default by doxygen [<a href="https://github.com/doxygen/doxygen/commit/82f08138ad08fa5b8906c162283c4df0e9819d83">view</a>]</li>
diff --git a/doc/commands.doc b/doc/commands.doc
index e56d0f2..1732f1d 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -112,6 +112,7 @@ documentation:
\refitem cmdfcurlyopen \\f{
\refitem cmdfcurlyclose \\f}
\refitem cmdfile \\file
+\refitem cmdfileinfo \\fileinfo
\refitem cmdfn \\fn
\refitem cmdheaderfile \\headerfile
\refitem cmdhidecallergraph \\hidecallergraph
@@ -137,6 +138,7 @@ documentation:
\refitem cmdlatexonly \\latexonly
\refitem cmdli \\li
\refitem cmdline \\line
+\refitem cmdlineinfo \\lineinfo
\refitem cmdlink \\link
\refitem cmdmainpage \\mainpage
\refitem cmdmaninclude \\maninclude
@@ -189,6 +191,7 @@ documentation:
\refitem cmdsection \\section
\refitem cmdsee \\see
\refitem cmdshort \\short
+\refitem cmdshowdate \\showdate
\refitem cmdshowinitializer \\showinitializer
\refitem cmdshowrefby \\showrefby
\refitem cmdshowrefs \\showrefs
@@ -638,6 +641,28 @@ Structural indicators
has been set to \c YES in the configuration file.
<hr>
+\section cmdfileinfo \\fileinfo['{'option'}']
+
+ \addindex \\fileinfo
+ Shows (part) of the file name in which this command is placed.
+ The `option` can be `file`, `extension`, `filename`, `directory` or, `full`,
+ with `file` the name of the file without extension, `extension` the extension of the file, `filename` the
+ filename i.e. `file` plus `extension`, `directory` the directory of the given file and `full` the full path
+ and filename of the given file.
+
+ \note the command \\fileinfo cannot be used as argument to the \ref cmdfile "\\file" command
+
+ \see section \ref cmdlineinfo "\\lineinfo"
+
+<hr>
+\section cmdlineinfo \\lineinfo
+
+ \addindex \\lineinfo
+ Shows the line number inside the file at which this command is placed.
+
+ \see section \ref cmdfileinfo "\\fileinfo"
+
+<hr>
\section cmdfn \\fn (function declaration)
\addindex \\fn
@@ -761,12 +786,16 @@ Structural indicators
\ref cmdmemberof "\\memberof"
<hr>
-\section cmdingroup \\ingroup (<groupname> [<groupname> <groupname>])
+\section cmdingroup \\ingroup (<groupname> [<groupname>]*)
\addindex \\ingroup
- If the \c \\ingroup command is placed in a comment block of a
- class, file or namespace, then it will be added to the group or
- groups identified by \<groupname\>.
+ If the \c \\ingroup command is placed in a comment block of a compound entity
+ (like class, file or namespace), then it will be added to the group(s)
+ identified by the `<groupname>`(s).
+ In case of members (like variable, functions, typedefs and enums) the member will
+ be added only to one group (to avoid ambiguous linking targets in case
+ a member is not documented in the context of its class, namespace
+ or file, but only visible as part of a group).
\sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup",
\ref cmdaddtogroup "\\addtogroup", and \ref cmdweakgroup "\\weakgroup"
@@ -1421,6 +1450,80 @@ contains \c TEST, or \c DEV
for an example.
<hr>
+\section cmdshowdate \\showdate "<format>" [ <date_time> ]
+
+ \addindex \\showdate
+ Shows the date and time based on the given \<format\> and \<date_time\>. Where the \<format\> is a string in which the following tokens have a special meaning:
+ | Code | Description |
+ | :--- | :---------- |
+ | \%y | Year without century as a zero-padded decimal number.
+ | \%Y | Year with century as a decimal number.
+ | \%m | Month as a zero-padded decimal number.
+ | \%-m | The month as a decimal number.
+ | \%b | Month as locale’s abbreviated name.
+ | \%B | Month as locale’s full name.
+ | \%d | Day of the month as a zero-padded decimal number.
+ | \%-d | Day of the month as a decimal number.
+ | \%u | The weekday as a decimal number (1-7), where Monday is 1.
+ | \%w | The weekday as a decimal number (0-6), where Sunday is 0.
+ | \%a | Weekday as locale’s abbreviated name.
+ | \%A | Weekday as locale’s full name.
+ | &nbsp; | &nbsp;
+ | \%H | Hour (24-hour clock) as a zero-padded decimal number.
+ | \%-H | Hour (24-hour clock) as a decimal number.
+ | \%I | Hour (12-hour clock) as a zero-padded decimal number.
+ | \%-I | Hour (12-hour clock) as a decimal number.
+ | \%M | Minute as a zero-padded decimal number.
+ | \%-M | Minute as a decimal number.
+ | \%S | Second as a zero-padded decimal number.
+ | \%-S | Second as a decimal number.
+ | \%p | Locale’s equivalent of either AM or PM.
+ | &nbsp; | &nbsp;
+ | \%\% | A \% character.
+
+ Note that the \<format\> has to be between double quotes.
+
+ In case the \<date_time\> is specified it has to have the following representation:
+ - optional `date` where `date` is:
+ - 4 digits for the year
+ - a minus sign
+ - one or 2 digits for the month
+ - a minus sign
+ - one or 2 digits for the day
+ - optional `time` where `time` is:
+ - whitespace
+ - one or 2 digits for the hours
+ - a colon sign
+ - one or 2 digits for the minutes
+ - when the format contains \%S or \%-S
+ - a colon sign
+ - 2 digits for the seconds
+ .
+ in case the \<date_time\> is not specified the current date and time are used.
+
+ Here is an example:
+ \code
+ - \showdate "%A %d-%m-%Y" 2015-3-14
+ - \showdate "%a %d-%m-%y" 2015-3-14
+ - \showdate "%-m.%d%y" 2015-3-14
+ - \showdate "%A %d-%m-%Y %H:%M:%S" 2015-3-14 03:04:15
+ - \showdate "%A %d-%m-%Y %H:%M" 2015-3-14 03:04
+ \endcode
+ In case `OUTPUT_LANGUAGE=english` this results in:
+ - Saturday 14-03-2015
+ - Sat 14-03-15
+ - 3.1415
+ - Saturday 14-03-15 03:04:15
+ - Saturday 14-03-15 03:04
+ .
+ In case `OUTPUT_LANGUAGE=dutch` this results in:
+ - zaterdag 14-03-15
+ - za 14-03-2015
+ - 3.1415
+ - zaterdag 14-03-15 03:04:15
+ - zaterdag 14-03-15 03:04
+ .
+<hr>
\section cmddeprecated \\deprecated { description }
\addindex \\deprecated
@@ -3454,7 +3557,7 @@ class Receiver
\b Note:
environment variables (like \$(HOME) ) are resolved inside a
- \LaTeX-only block.
+ \LaTeX\-only block.
\sa sections \ref cmdrtfonly "\\rtfonly",
\ref cmdxmlonly "\\xmlonly",
diff --git a/doc/doxygen.1 b/doc/doxygen.1
index 744fdcc..bb80a40 100644
--- a/doc/doxygen.1
+++ b/doc/doxygen.1
@@ -53,7 +53,7 @@ doxygen \fB\-x\fR [configFile]
.TP
Use doxygen to compare the used configuration file with the template configuration file
.RS 0
- without replacing the environment variables
+ without replacing the environment variables or CMake type replacement variables
.RE
.IP
doxygen \fB\-x_noenv\fR [configFile]
diff --git a/doc/doxygen_manual.css b/doc/doxygen_manual.css
index 48ad373..14cacf6 100644
--- a/doc/doxygen_manual.css
+++ b/doc/doxygen_manual.css
@@ -288,6 +288,7 @@ body {
}
div.contents {
+ margin-top: 0px;
margin-bottom: 10px;
padding: 12px;
margin-left: auto;
diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc
index 5b560ae..d36b15e 100644
--- a/doc/doxygen_usage.doc
+++ b/doc/doxygen_usage.doc
@@ -92,7 +92,7 @@ doxygen -w rtf rtfstyle.cfg
</ul>
\warning When using a custom header you are responsible
for the proper inclusion of any scripts and style sheets that doxygen
- needs, which is dependent on the configuration options and may changes
+ needs, which is dependent on the configuration options and may change
when upgrading to a new doxygen release.
\note
diff --git a/doc/emojisup.doc b/doc/emojisup.doc
index 7d6d377..d88f8f1 100644
--- a/doc/emojisup.doc
+++ b/doc/emojisup.doc
@@ -21,7 +21,7 @@ The [Unicode consortium](http://www.unicode.org/) has defined a set of
sequences. Doxygen supports the subset of emoji characters as used by GitHub (based on the list
https://api.github.com/emojis).
An emoji is created using the \ref cmdemoji "\\emoji" command.
-For example `\emoji smile` (or `\emoji :smile:`) both produce \emoji smile.
+For example `\emoji smile` or `\emoji :smile:` both produce \emoji smile.
\section emojirep Representation
diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc
index 14d5fa4..0032976 100644
--- a/doc/htmlcmds.doc
+++ b/doc/htmlcmds.doc
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,378 +16,115 @@
*/
/*! \page htmlcmds HTML Commands
+\section htmltagcmds HTML tag commands
+
Here is a list of all HTML commands that may be used inside the
documentation. Note that although these HTML tags are translated to the
-proper commands for output formats other than HTML, all attributes
-of a HTML tag are passed on to the HTML output only
+proper commands for output formats other than HTML, all attributes
+of a HTML tag are passed on to the HTML output only
(the \c HREF and \c NAME attributes for the \c A tag are the only exception).
-<ul>
-<li><tt>\anchor htmltag_A_HREF \addindex "\<A HREF=\"...\"\>"\<A HREF="..."\></tt> Starts a hyperlink
- (if supported by the output format).
-<li><tt>\anchor htmltag_A_ID \addindex "\<A ID=\"...\"\>"\<A ID="..."\></tt> Starts a named anchor
- (if supported by the output format).
-<li><tt>\anchor htmltag_A_NAME \addindex "\<A NAME=\"...\"\>"\<A NAME="..."\></tt> Starts a named anchor
- (if supported by the output format).
-<li><tt>\anchor htmltag_endA \addindex "\</A\>"\</A\></tt> Ends a link or anchor
-<li><tt>\anchor htmltag_B \addindex "\<B\>"\<B\></tt> Starts a piece of text displayed in a bold font.
-<li><tt>\anchor htmltag_endB \addindex "\</B\>"\</B\></tt> Ends a \ref htmltag_B "\<B\>" section.
-<li><tt>\anchor htmltag_BLOCKQUOTE \addindex "\<BLOCKQUOTE\>"\<BLOCKQUOTE\></tt> Starts a quotation block.
-<li><tt>\anchor htmltag_endBLOCKQUOTE \addindex "\</BLOCKQUOTE\>"\</BLOCKQUOTE\></tt> Ends the quotation block.
-<li><tt>\anchor htmltag_BR \addindex "\<BR\>"\<BR\></tt> Forces a line break.
-<li><tt>\anchor htmltag_CENTER \addindex "\<CENTER\>"\<CENTER\></tt> starts a section of centered text.
-<li><tt>\anchor htmltag_endCENTER \addindex "\</CENTER\>"\</CENTER\></tt> ends a section of centered text.
-<li><tt>\anchor htmltag_CAPTION \addindex "\<CAPTION\>"\<CAPTION\></tt> Starts a caption. Use within a table only.
-<li><tt>\anchor htmltag_endCAPTION \addindex "\</CAPTION\>"\</CAPTION\></tt> Ends a caption. Use within a table only.
-<li><tt>\anchor htmltag_CITE \addindex "\<CITE\>"\<CITE\></tt> Starts a section of text displayed in a font specific for citations.
-<li><tt>\anchor htmltag_endCITE \addindex "\</CITE\>"\</CITE\></tt> Ends a \ref htmltag_CITE "\<CITE\>" section.
-<li><tt>\anchor htmltag_CODE \addindex "\<CODE\>"\<CODE\></tt> Starts a piece of text displayed in a typewriter font.
- Note that only for C# code, this command is equivalent to
- \ref cmdcode "\\code" (see \ref xmltag_code "\<code\>").
-<li><tt>\anchor htmltag_endCODE \addindex "\</CODE\>"\</CODE\></tt> Ends a \ref htmltag_CODE "\<CODE\>" section.
+<table class="markdownTable">
+<tr class="markdownTableHead"><th class="markdownTableHeadLeft">HTML Command</th><th class="markdownTableHeadLeft">Description</th></tr>
+<tr><td valign="top"><tt>\anchor htmltag_A_HREF \addindex "\<A HREF=\"...\"\>"\<A HREF="..."\></tt></td><td valign="top">Starts a hyperlink
+ (if supported by the output format).</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_A_ID \addindex "\<A ID=\"...\"\>"\<A ID="..."\></tt></td><td valign="top">Starts a named anchor
+ (if supported by the output format).</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_A_NAME \addindex "\<A NAME=\"...\"\>"\<A NAME="..."\></tt></td><td valign="top">Starts a named anchor
+ (if supported by the output format).</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endA \addindex "\</A\>"\</A\></tt></td><td valign="top">Ends a link or anchor</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_B \addindex "\<B\>"\<B\></tt></td><td valign="top">Starts a piece of text displayed in a bold font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endB \addindex "\</B\>"\</B\></tt></td><td valign="top">Ends a \ref htmltag_B "\<B\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_BLOCKQUOTE \addindex "\<BLOCKQUOTE\>"\<BLOCKQUOTE\></tt></td><td valign="top">Starts a quotation block.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endBLOCKQUOTE \addindex "\</BLOCKQUOTE\>"\</BLOCKQUOTE\></tt></td><td valign="top">Ends the quotation block.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_BR \addindex "\<BR\>"\<BR\></tt></td><td valign="top">Forces a line break.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_CENTER \addindex "\<CENTER\>"\<CENTER\></tt></td><td valign="top">starts a section of centered text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endCENTER \addindex "\</CENTER\>"\</CENTER\></tt></td><td valign="top">ends a section of centered text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_CAPTION \addindex "\<CAPTION\>"\<CAPTION\></tt></td><td valign="top">Starts a caption. Use within a table only.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endCAPTION \addindex "\</CAPTION\>"\</CAPTION\></tt></td><td valign="top">Ends a caption. Use within a table only.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_CITE \addindex "\<CITE\>"\<CITE\></tt></td><td valign="top">Starts a section of text displayed in a font specific for citations.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endCITE \addindex "\</CITE\>"\</CITE\></tt></td><td valign="top">Ends a \ref htmltag_CITE "\<CITE\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_CODE \addindex "\<CODE\>"\<CODE\></tt></td><td valign="top">Starts a piece of text displayed in a typewriter font.</td></tr>
Note that only for C# code, this command is equivalent to
- \ref cmdendcode "\\endcode" (see \ref xmltag_code "\<code\>").
-<li><tt>\anchor htmltag_DD \addindex "\<DD\>"\<DD\></tt> Starts an item description.
-<li><tt>\anchor htmltag_endDD \addindex "\</DD\>"\</DD\></tt> Ends an item description.
-<li><tt>\anchor htmltag_DEL \addindex "\<DEL\>"\<DEL\></tt> Starts a section of deleted text, typically shown strike through text.
-<li><tt>\anchor htmltag_endDEL \addindex "\</DEL\>"\</DEL\></tt> Ends a section of deleted text.
-<li><tt>\anchor htmltag_DETAILS \addindex "\<DETAILS\>"\<DETAILS\></tt> Starts a section of detailed text that the user can open and close (in HTML output))
-<li><tt>\anchor htmltag_endDETAILS \addindex "\</DETAILS\>"\</DETAILS\></tt> Ends a section of detailed text.
-<li><tt>\anchor htmltag_DFN \addindex "\<DFN\>"\<DFN\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\anchor htmltag_endDFN \addindex "\</DFN\>"\</DFN\></tt> Ends a \ref htmltag_DFN "\<DFN\>" section.
-<li><tt>\anchor htmltag_DIV \addindex "\<DIV\>"\<DIV></tt> Starts a section with a specific style (HTML only)
-<li><tt>\anchor htmltag_endDIV \addindex "\</DIV\>"\</DIV></tt> Ends a section with a specific style (HTML only)
-<li><tt>\anchor htmltag_DL \addindex "\<DL\>"\<DL\></tt> Starts a description list.
-<li><tt>\anchor htmltag_endDL \addindex "\</DL\>"\</DL\></tt> Ends a description list.
-<li><tt>\anchor htmltag_DT \addindex "\<DT\>"\<DT\></tt> Starts an item title.
-<li><tt>\anchor htmltag_endDT \addindex "\</DT\>"\</DT\></tt> Ends an item title.
-<li><tt>\anchor htmltag_EM \addindex "\<EM\>"\<EM\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\anchor htmltag_endEM \addindex "\</EM\>"\</EM\></tt> Ends a \ref htmltag_EM "\<EM\>" section.
-<li><tt>\anchor htmltag_HR \addindex "\<HR\>"\<HR\></tt> Writes a horizontal ruler.
-<li><tt>\anchor htmltag_H1 \addindex "\<H1\>"\<H1\></tt> Starts an unnumbered section.
-<li><tt>\anchor htmltag_endH1 \addindex "\</H1\>"\</H1\></tt> Ends an unnumbered section.
-<li><tt>\anchor htmltag_H2 \addindex "\<H2\>"\<H2\></tt> Starts an unnumbered subsection.
-<li><tt>\anchor htmltag_endH2 \addindex "\</H2\>"\</H2\></tt> Ends an unnumbered subsection.
-<li><tt>\anchor htmltag_H3 \addindex "\<H3\>"\<H3\></tt> Starts an unnumbered subsubsection.
-<li><tt>\anchor htmltag_endH3 \addindex "\</H3\>"\</H3\></tt> Ends an unnumbered subsubsection.
-<li><tt>\anchor htmltag_H4 \addindex "\<H4\>"\<H4\></tt> Starts an unnumbered subsubsection.
-<li><tt>\anchor htmltag_endH4 \addindex "\</H4\>"\</H4\></tt> Ends an unnumbered subsubsection.
-<li><tt>\anchor htmltag_H5 \addindex "\<H5\>"\<H5\></tt> Starts an unnumbered subsubsection.
-<li><tt>\anchor htmltag_endH5 \addindex "\</H5\>"\</H5\></tt> Ends an unnumbered subsubsection.
-<li><tt>\anchor htmltag_H6 \addindex "\<H6\>"\<H6\></tt> Starts an unnumbered subsubsection.
-<li><tt>\anchor htmltag_endH6 \addindex "\</H6\>"\</H6\></tt> Ends an unnumbered subsubsection.
-<li><tt>\anchor htmltag_I \addindex "\<I\>"\<I\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\anchor htmltag_endI \addindex "\</I\>"\</I\></tt> Ends a \ref htmltag_I "\<I\>" section.
-<li><tt>\anchor htmltag_IMG \addindex "\<IMG SRC=\"...\"\>"\<IMG SRC="..." ...\></tt> This command is written with its attributes to the HTML output only. The SRC attribute is mandatory.
-<li><tt>\anchor htmltag_INS \addindex "\<INS\>"\<INS\></tt> Starts a section of inserted text, typically shown as underlined text.
-<li><tt>\anchor htmltag_endINS \addindex "\</INS\>"\</INS\></tt> Ends a section of inserted text.
-<li><tt>\anchor htmltag_LI \addindex "\<LI\>"\<LI\></tt> Starts a new list item.
-<li><tt>\anchor htmltag_endLI \addindex "\</LI\>"\</LI\></tt> Ends a list item.
-<li><tt>\anchor htmltag_OL \addindex "\<OL\>"\<OL\></tt> Starts a numbered item list.
-<li><tt>\anchor htmltag_endOL \addindex "\</OL\>"\</OL\></tt> Ends a numbered item list.
-<li><tt>\anchor htmltag_P \addindex "\<P\>"\<P\></tt> Starts a new paragraph.
-<li><tt>\anchor htmltag_endP \addindex "\</P\>"\</P\></tt> Ends a paragraph.
-<li><tt>\anchor htmltag_PRE \addindex "\<PRE\>"\<PRE\></tt> Starts a preformatted fragment.
-<li><tt>\anchor htmltag_endPRE \addindex "\</PRE\>"\</PRE\></tt> Ends a preformatted fragment.
-<li><tt>\anchor htmltag_SMALL \addindex "\<SMALL\>"\<SMALL\></tt> Starts a section of text displayed in a smaller font.
-<li><tt>\anchor htmltag_endSMALL \addindex "\</SMALL\>"\</SMALL\></tt> Ends a \ref htmltag_SMALL "\<SMALL\>" section.
-<li><tt>\anchor htmltag_SPAN \addindex "\<SPAN\>"\<SPAN></tt> Starts an inline text fragment with a specific style (HTML only)
-<li><tt>\anchor htmltag_endSPAN \addindex "\</SPAN\>"\</SPAN></tt> Ends an inline text fragment with a specific style (HTML only)
-<li><tt>\anchor htmltag_S \addindex "\<S\>"\<S\></tt> Starts a section of strike through text.
-<li><tt>\anchor htmltag_endS \addindex "\</S\>"\</S\></tt> Ends a section of strike through text.
-<li><tt>\anchor htmltag_STRIKE \addindex "\<STRIKE\>"\<STRIKE\></tt> Starts a section of strike through text.
-<li><tt>\anchor htmltag_endSTRIKE \addindex "\</STRIKE\>"\</STRIKE\></tt> Ends a section of strike through text.
-<li><tt>\anchor htmltag_STRONG \addindex "\<STRONG\>"\<STRONG\></tt> Starts a section of bold text.
-<li><tt>\anchor htmltag_endSTRONG \addindex "\</STRONG\>"\</STRONG\></tt> Ends a section of bold text.
-<li><tt>\anchor htmltag_SUB \addindex "\<SUB\>"\<SUB\></tt> Starts a piece of text displayed in subscript.
-<li><tt>\anchor htmltag_endSUB \addindex "\</SUB\>"\</SUB\></tt> Ends a \ref htmltag_SUB "\<SUB\>" section.
-<li><tt>\anchor htmltag_SUP \addindex "\<SUP\>"\<SUP\></tt> Starts a piece of text displayed in superscript.
-<li><tt>\anchor htmltag_endSUP \addindex "\</SUP\>"\</SUP\></tt> Ends a \ref htmltag_SUP "\<SUP\>" section.
-<li><tt>\anchor htmltag_TABLE \addindex "\<TABLE\>"\<TABLE\></tt> starts a table.
-<li><tt>\anchor htmltag_endTABLE \addindex "\</TABLE\>"\</TABLE\></tt> ends a table.
-<li><tt>\anchor htmltag_TD \addindex "\<TD\>"\<TD\></tt> Starts a new table data element.
-<li><tt>\anchor htmltag_endTD \addindex "\</TD\>"\</TD\></tt> Ends a table data element.
-<li><tt>\anchor htmltag_TH \addindex "\<TH\>"\<TH\></tt> Starts a new table header.
-<li><tt>\anchor htmltag_endTH \addindex "\</TH\>"\</TH\></tt> Ends a table header.
-<li><tt>\anchor htmltag_TR \addindex "\<TR\>"\<TR\></tt> Starts a new table row.
-<li><tt>\anchor htmltag_endTR \addindex "\</TR\>"\</TR\></tt> Ends a table row.
-<li><tt>\anchor htmltag_TT \addindex "\<TT\>"\<TT\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\anchor htmltag_endTT \addindex "\</TT\>"\</TT\></tt> Ends a \ref htmltag_TT "\<TT\>" section.
-<li><tt>\anchor htmltag_KBD \addindex "\<KBD\>"\<KBD\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\anchor htmltag_endKBD \addindex "\</KBD\>"\</KBD\></tt> Ends a \ref htmltag_KBD "\<KBD\>" section.
-<li><tt>\anchor htmltag_U \addindex "\<U\>"\<U\></tt> Starts a section of underlined text.
-<li><tt>\anchor htmltag_endU \addindex "\</U\>"\</U\></tt> Ends a section of underlined text.
-<li><tt>\anchor htmltag_UL \addindex "\<UL\>"\<UL\></tt> Starts an unnumbered item list.
-<li><tt>\anchor htmltag_endUL \addindex "\</UL\>"\</UL\></tt> Ends an unnumbered item list.
-<li><tt>\anchor htmltag_VAR \addindex "\<VAR\>"\<VAR\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\anchor htmltag_endVAR \addindex "\</VAR\>"\</VAR\></tt> Ends a \ref htmltag_VAR "\<VAR\>" section.
-</ul>
-
-The special HTML4 character entities.<br>
-The list of entities with their descriptions has been taken from <a href="http://www.w3.org/TR/html4/sgml/entities.html">Character entity references in HTML 4</a>.
-( Portions &copy; International Organization for Standardization 1986
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.)
-<ul>
-<li><tt>\&nbsp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` no-break space = non-breaking space: &nbsp;
-<li><tt>\&iexcl;</tt>`&nbsp;&nbsp;&nbsp;` inverted exclamation mark: &iexcl;
-<li><tt>\&cent;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` cent sign: &cent;
-<li><tt>\&pound;</tt>`&nbsp;&nbsp;&nbsp;` pound sign: &pound;
-<li><tt>\&curren;</tt>`&nbsp;&nbsp;` currency sign: &curren;
-<li><tt>\&yen;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` yen sign = yuan sign: &yen;
-<li><tt>\&brvbar;</tt>`&nbsp;&nbsp;` broken bar = broken vertical bar: &brvbar;
-<li><tt>\&sect;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` section sign: &sect;
-<li><tt>\&uml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` diaeresis = spacing diaeresis: &uml;
-<li><tt>\&copy;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` copyright sign: &copy;
-<li><tt>\&ordf;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` feminine ordinal indicator: &ordf;
-<li><tt>\&laquo;</tt>`&nbsp;&nbsp;&nbsp;` left-pointing double angle quotation mark = left pointing guillemet: &laquo;
-<li><tt>\&not;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` not sign: &not;
-<li><tt>\&shy;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` soft hyphen = discretionary hyphen: &shy;
-<li><tt>\&reg;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` registered sign = registered trade mark sign: &reg;
-<li><tt>\&macr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` macron = spacing macron = overline = APL overbar: &macr;
-<li><tt>\&deg;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` degree sign: &deg;
-<li><tt>\&plusmn;</tt>`&nbsp;&nbsp;` plus-minus sign = plus-or-minus sign: &plusmn;
-<li><tt>\&sup2;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` superscript two = superscript digit two = squared: &sup2;
-<li><tt>\&sup3;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` superscript three = superscript digit three = cubed: &sup3;
-<li><tt>\&acute;</tt>`&nbsp;&nbsp;&nbsp;` acute accent = spacing acute: &acute;
-<li><tt>\&micro;</tt>`&nbsp;&nbsp;&nbsp;` micro sign: &micro;
-<li><tt>\&para;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` pilcrow sign = paragraph sign: &para;
-<li><tt>\&middot;</tt>`&nbsp;&nbsp;` middle dot = Georgian comma = Greek middle dot: &middot;
-<li><tt>\&cedil;</tt>`&nbsp;&nbsp;&nbsp;` cedilla = spacing cedilla: &cedil;
-<li><tt>\&sup1;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` superscript one = superscript digit one: &sup1;
-<li><tt>\&ordm;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` masculine ordinal indicator: &ordm;
-<li><tt>\&raquo;</tt>`&nbsp;&nbsp;&nbsp;` right-pointing double angle quotation mark = right pointing guillemet: &raquo;
-<li><tt>\&frac14;</tt>`&nbsp;&nbsp;` vulgar fraction one quarter = fraction one quarter: &frac14;
-<li><tt>\&frac12;</tt>`&nbsp;&nbsp;` vulgar fraction one half = fraction one half: &frac12;
-<li><tt>\&frac34;</tt>`&nbsp;&nbsp;` vulgar fraction three quarters = fraction three quarters: &frac34;
-<li><tt>\&iquest;</tt>`&nbsp;&nbsp;` inverted question mark = turned question mark: &iquest;
-<li><tt>\&Agrave;</tt>`&nbsp;&nbsp;` latin capital letter A with grave = latin capital letter A grave: &Agrave;
-<li><tt>\&Aacute;</tt>`&nbsp;&nbsp;` latin capital letter A with acute: &Aacute;
-<li><tt>\&Acirc;</tt>`&nbsp;&nbsp;&nbsp;` latin capital letter A with circumflex: &Acirc;
-<li><tt>\&Atilde;</tt>`&nbsp;&nbsp;` latin capital letter A with tilde: &Atilde;
-<li><tt>\&Auml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin capital letter A with diaeresis: &Auml;
-<li><tt>\&Aring;</tt>`&nbsp;&nbsp;&nbsp;` latin capital letter A with ring above = latin capital letter A ring: &Aring;
-<li><tt>\&AElig;</tt>`&nbsp;&nbsp;&nbsp;` latin capital letter AE = latin capital ligature AE: &AElig;
-<li><tt>\&Ccedil;</tt>`&nbsp;&nbsp;` latin capital letter C with cedilla: &Ccedil;
-<li><tt>\&Egrave;</tt>`&nbsp;&nbsp;` latin capital letter E with grave: &Egrave;
-<li><tt>\&Eacute;</tt>`&nbsp;&nbsp;` latin capital letter E with acute: &Eacute;
-<li><tt>\&Ecirc;</tt>`&nbsp;&nbsp;&nbsp;` latin capital letter E with circumflex: &Ecirc;
-<li><tt>\&Euml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin capital letter E with diaeresis: &Euml;
-<li><tt>\&Igrave;</tt>`&nbsp;&nbsp;` latin capital letter I with grave: &Igrave;
-<li><tt>\&Iacute;</tt>`&nbsp;&nbsp;` latin capital letter I with acute: &Iacute;
-<li><tt>\&Icirc;</tt>`&nbsp;&nbsp;&nbsp;` latin capital letter I with circumflex: &Icirc;
-<li><tt>\&Iuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin capital letter I with diaeresis: &Iuml;
-<li><tt>\&ETH;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` latin capital letter ETH: &ETH;
-<li><tt>\&Ntilde;</tt>`&nbsp;&nbsp;` latin capital letter N with tilde: &Ntilde;
-<li><tt>\&Ograve;</tt>`&nbsp;&nbsp;` latin capital letter O with grave: &Ograve;
-<li><tt>\&Oacute;</tt>`&nbsp;&nbsp;` latin capital letter O with acute: &Oacute;
-<li><tt>\&Ocirc;</tt>`&nbsp;&nbsp;&nbsp;` latin capital letter O with circumflex: &Ocirc;
-<li><tt>\&Otilde;</tt>`&nbsp;&nbsp;` latin capital letter O with tilde: &Otilde;
-<li><tt>\&Ouml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin capital letter O with diaeresis: &Ouml;
-<li><tt>\&times;</tt>`&nbsp;&nbsp;&nbsp;` multiplication sign: &times;
-<li><tt>\&Oslash;</tt>`&nbsp;&nbsp;` latin capital letter O with stroke = latin capital letter O slash: &Oslash;
-<li><tt>\&Ugrave;</tt>`&nbsp;&nbsp;` latin capital letter U with grave: &Ugrave;
-<li><tt>\&Uacute;</tt>`&nbsp;&nbsp;` latin capital letter U with acute: &Uacute;
-<li><tt>\&Ucirc;</tt>`&nbsp;&nbsp;&nbsp;` latin capital letter U with circumflex: &Ucirc;
-<li><tt>\&Uuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin capital letter U with diaeresis: &Uuml;
-<li><tt>\&Yacute;</tt>`&nbsp;&nbsp;` latin capital letter Y with acute: &Yacute;
-<li><tt>\&THORN;</tt>`&nbsp;&nbsp;&nbsp;` latin capital letter THORN: &THORN;
-<li><tt>\&szlig;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter sharp s = ess-zed: &szlig;
-<li><tt>\&agrave;</tt>`&nbsp;&nbsp;` latin small letter a with grave = latin small letter a grave: &agrave;
-<li><tt>\&aacute;</tt>`&nbsp;&nbsp;` latin small letter a with acute: &aacute;
-<li><tt>\&acirc;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter a with circumflex: &acirc;
-<li><tt>\&atilde;</tt>`&nbsp;&nbsp;` latin small letter a with tilde: &atilde;
-<li><tt>\&auml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin small letter a with diaeresis: &auml;
-<li><tt>\&aring;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter a with ring above = latin small letter a ring: &aring;
-<li><tt>\&aelig;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter ae = latin small ligature ae: &aelig;
-<li><tt>\&ccedil;</tt>`&nbsp;&nbsp;` latin small letter c with cedilla: &ccedil;
-<li><tt>\&egrave;</tt>`&nbsp;&nbsp;` latin small letter e with grave: &egrave;
-<li><tt>\&eacute;</tt>`&nbsp;&nbsp;` latin small letter e with acute: &eacute;
-<li><tt>\&ecirc;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter e with circumflex: &ecirc;
-<li><tt>\&euml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin small letter e with diaeresis: &euml;
-<li><tt>\&igrave;</tt>`&nbsp;&nbsp;` latin small letter i with grave: &igrave;
-<li><tt>\&iacute;</tt>`&nbsp;&nbsp;` latin small letter i with acute: &iacute;
-<li><tt>\&icirc;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter i with circumflex: &icirc;
-<li><tt>\&iuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin small letter i with diaeresis: &iuml;
-<li><tt>\&eth;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` latin small letter eth: &eth;
-<li><tt>\&ntilde;</tt>`&nbsp;&nbsp;` latin small letter n with tilde: &ntilde;
-<li><tt>\&ograve;</tt>`&nbsp;&nbsp;` latin small letter o with grave: &ograve;
-<li><tt>\&oacute;</tt>`&nbsp;&nbsp;` latin small letter o with acute: &oacute;
-<li><tt>\&ocirc;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter o with circumflex: &ocirc;
-<li><tt>\&otilde;</tt>`&nbsp;&nbsp;` latin small letter o with tilde: &otilde;
-<li><tt>\&ouml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin small letter o with diaeresis: &ouml;
-<li><tt>\&divide;</tt>`&nbsp;&nbsp;` division sign: &divide;
-<li><tt>\&oslash;</tt>`&nbsp;&nbsp;` latin small letter o with stroke, = latin small letter o slash: &oslash;
-<li><tt>\&ugrave;</tt>`&nbsp;&nbsp;` latin small letter u with grave: &ugrave;
-<li><tt>\&uacute;</tt>`&nbsp;&nbsp;` latin small letter u with acute: &uacute;
-<li><tt>\&ucirc;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter u with circumflex: &ucirc;
-<li><tt>\&uuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin small letter u with diaeresis: &uuml;
-<li><tt>\&yacute;</tt>`&nbsp;&nbsp;` latin small letter y with acute: &yacute;
-<li><tt>\&thorn;</tt>`&nbsp;&nbsp;&nbsp;` latin small letter thorn: &thorn;
-<li><tt>\&yuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin small letter y with diaeresis: &yuml;
-<li><tt>\&fnof;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin small f with hook = function = florin: &fnof;
-<li><tt>\&Alpha;</tt>`&nbsp;&nbsp;&nbsp;` greek capital letter alpha: &Alpha;
-<li><tt>\&Beta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter beta: &Beta;
-<li><tt>\&Gamma;</tt>`&nbsp;&nbsp;&nbsp;` greek capital letter gamma: &Gamma;
-<li><tt>\&Delta;</tt>`&nbsp;&nbsp;&nbsp;` greek capital letter delta: &Delta;
-<li><tt>\&Epsilon;</tt>`&nbsp;` greek capital letter epsilon: &Epsilon;
-<li><tt>\&Zeta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter zeta: &Zeta;
-<li><tt>\&Eta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter eta: &Eta;
-<li><tt>\&Theta;</tt>`&nbsp;&nbsp;&nbsp;` greek capital letter theta: &Theta;
-<li><tt>\&Iota;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter iota: &Iota;
-<li><tt>\&Kappa;</tt>`&nbsp;&nbsp;&nbsp;` greek capital letter kappa: &Kappa;
-<li><tt>\&Lambda;</tt>`&nbsp;&nbsp;` greek capital letter lambda: &Lambda;
-<li><tt>\&Mu;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter mu: &Mu;
-<li><tt>\&Nu;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter nu: &Nu;
-<li><tt>\&Xi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter xi: &Xi;
-<li><tt>\&Omicron;</tt>`&nbsp;` greek capital letter omicron: &Omicron;
-<li><tt>\&Pi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter pi: &Pi;
-<li><tt>\&Rho;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter rho: &Rho;
-<li><tt>\&Sigma;</tt>`&nbsp;&nbsp;&nbsp;` greek capital letter sigma: &Sigma;
-<li><tt>\&Tau;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter tau: &Tau;
-<li><tt>\&Upsilon;</tt>`&nbsp;` greek capital letter upsilon: &Upsilon;
-<li><tt>\&Phi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter phi: &Phi;
-<li><tt>\&Chi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter chi: &Chi;
-<li><tt>\&Psi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek capital letter psi: &Psi;
-<li><tt>\&Omega;</tt>`&nbsp;&nbsp;&nbsp;` greek capital letter omega: &Omega;
-<li><tt>\&alpha;</tt>`&nbsp;&nbsp;&nbsp;` greek small letter alpha: &alpha;
-<li><tt>\&beta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter beta: &beta;
-<li><tt>\&gamma;</tt>`&nbsp;&nbsp;&nbsp;` greek small letter gamma: &gamma;
-<li><tt>\&delta;</tt>`&nbsp;&nbsp;&nbsp;` greek small letter delta: &delta;
-<li><tt>\&epsilon;</tt>`&nbsp;` greek small letter epsilon: &epsilon;
-<li><tt>\&zeta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter zeta: &zeta;
-<li><tt>\&eta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter eta: &eta;
-<li><tt>\&theta;</tt>`&nbsp;&nbsp;&nbsp;` greek small letter theta: &theta;
-<li><tt>\&iota;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter iota: &iota;
-<li><tt>\&kappa;</tt>`&nbsp;&nbsp;&nbsp;` greek small letter kappa: &kappa;
-<li><tt>\&lambda;</tt>`&nbsp;&nbsp;` greek small letter lambda: &lambda;
-<li><tt>\&mu;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter mu: &mu;
-<li><tt>\&nu;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter nu: &nu;
-<li><tt>\&xi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter xi: &xi;
-<li><tt>\&omicron;</tt>`&nbsp;` greek small letter omicron: &omicron;
-<li><tt>\&pi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter pi: &pi;
-<li><tt>\&rho;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter rho: &rho;
-<li><tt>\&sigmaf;</tt>`&nbsp;&nbsp;` greek small letter final sigma: &sigmaf;
-<li><tt>\&sigma;</tt>`&nbsp;&nbsp;&nbsp;` greek small letter sigma: &sigma;
-<li><tt>\&tau;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter tau: &tau;
-<li><tt>\&upsilon;</tt>`&nbsp;` greek small letter upsilon: &upsilon;
-<li><tt>\&phi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter phi: &phi;
-<li><tt>\&chi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter chi: &chi;
-<li><tt>\&psi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek small letter psi: &psi;
-<li><tt>\&omega;</tt>`&nbsp;&nbsp;&nbsp;` greek small letter omega: &omega;
-<li><tt>\&thetasym;</tt> greek small letter theta symbol: &thetasym;
-<li><tt>\&upsih;</tt>`&nbsp;&nbsp;&nbsp;` greek upsilon with hook symbol: &upsih;
-<li><tt>\&piv;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greek pi symbol: &piv;
-<li><tt>\&bull;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` bullet = black small circle: &bull;
-<li><tt>\&hellip;</tt>`&nbsp;&nbsp;` horizontal ellipsis = three dot leader: &hellip;
-<li><tt>\&prime;</tt>`&nbsp;&nbsp;&nbsp;` prime = minutes = feet: &prime;
-<li><tt>\&Prime;</tt>`&nbsp;&nbsp;&nbsp;` double prime = seconds = inches: &Prime;
-<li><tt>\&oline;</tt>`&nbsp;&nbsp;&nbsp;` overline = spacing overscore: &oline;
-<li><tt>\&frasl;</tt>`&nbsp;&nbsp;&nbsp;` fraction slash: &frasl;
-<li><tt>\&weierp;</tt>`&nbsp;&nbsp;` script capital P = power set = Weierstrass p: &weierp;
-<li><tt>\&image;</tt>`&nbsp;&nbsp;&nbsp;` blackletter capital I = imaginary part: &image;
-<li><tt>\&real;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` blackletter capital R = real part symbol: &real;
-<li><tt>\&trade;</tt>`&nbsp;&nbsp;&nbsp;` trade mark sign: &trade;
-<li><tt>\&alefsym;</tt>`&nbsp;` alef symbol = first transfinite cardinal: &alefsym;
-<li><tt>\&larr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` leftwards arrow: &larr;
-<li><tt>\&uarr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` upwards arrow: &uarr;
-<li><tt>\&rarr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` rightwards arrow: &rarr;
-<li><tt>\&darr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` downwards arrow: &darr;
-<li><tt>\&harr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` left right arrow: &harr;
-<li><tt>\&crarr;</tt>`&nbsp;&nbsp;&nbsp;` downwards arrow with corner leftwards = carriage return: &crarr;
-<li><tt>\&lArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` leftwards double arrow: &lArr;
-<li><tt>\&uArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` upwards double arrow: &uArr;
-<li><tt>\&rArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` rightwards double arrow: &rArr;
-<li><tt>\&dArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` downwards double arrow: &dArr;
-<li><tt>\&hArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` left right double arrow: &hArr;
-<li><tt>\&forall;</tt>`&nbsp;&nbsp;` for all: &forall;
-<li><tt>\&part;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` partial differential: &part;
-<li><tt>\&exist;</tt>`&nbsp;&nbsp;&nbsp;` there exists: &exist;
-<li><tt>\&empty;</tt>`&nbsp;&nbsp;&nbsp;` empty set = null set = diameter: &empty;
-<li><tt>\&nabla;</tt>`&nbsp;&nbsp;&nbsp;` nabla = backward difference: &nabla;
-<li><tt>\&isin;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` element of: &isin;
-<li><tt>\&notin;</tt>`&nbsp;&nbsp;&nbsp;` not an element of: &notin;
-<li><tt>\&ni;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` contains as member: &ni;
-<li><tt>\&prod;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` n-ary product = product sign: &prod;
-<li><tt>\&sum;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` n-ary summation: &sum;
-<li><tt>\&minus;</tt>`&nbsp;&nbsp;&nbsp;` minus sign: &minus;
-<li><tt>\&lowast;</tt>`&nbsp;&nbsp;` asterisk operator: &lowast;
-<li><tt>\&radic;</tt>`&nbsp;&nbsp;&nbsp;` square root = radical sign: &radic;
-<li><tt>\&prop;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` proportional to: &prop;
-<li><tt>\&infin;</tt>`&nbsp;&nbsp;&nbsp;` infinity: &infin;
-<li><tt>\&ang;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` angle: &ang;
-<li><tt>\&and;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` logical and = wedge: &and;
-<li><tt>\&or;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` logical or = vee: &or;
-<li><tt>\&cap;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` intersection = cap: &cap;
-<li><tt>\&cup;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` union = cup: &cup;
-<li><tt>\&int;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` integral: &int;
-<li><tt>\&there4;</tt>`&nbsp;&nbsp;` therefore: &there4;
-<li><tt>\&sim;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` tilde operator = varies with = similar to: &sim;
-<li><tt>\&cong;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` approximately equal to: &cong;
-<li><tt>\&asymp;</tt>`&nbsp;&nbsp;&nbsp;` almost equal to = asymptotic to: &asymp;
-<li><tt>\&ne;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` not equal to: &ne;
-<li><tt>\&equiv;</tt>`&nbsp;&nbsp;&nbsp;` identical to: &equiv;
-<li><tt>\&le;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` less-than or equal to: &le;
-<li><tt>\&ge;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greater-than or equal to: &ge;
-<li><tt>\&sub;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` subset of: &sub;
-<li><tt>\&sup;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` superset of: &sup;
-<li><tt>\&nsub;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` not a subset of: &nsub;
-<li><tt>\&sube;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` subset of or equal to: &sube;
-<li><tt>\&supe;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` superset of or equal to: &supe;
-<li><tt>\&oplus;</tt>`&nbsp;&nbsp;&nbsp;` circled plus = direct sum: &oplus;
-<li><tt>\&otimes;</tt>`&nbsp;&nbsp;` circled times = vector product: &otimes;
-<li><tt>\&perp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` up tack = orthogonal to = perpendicular: &perp;
-<li><tt>\&sdot;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` dot operator: &sdot;
-<li><tt>\&lceil;</tt>`&nbsp;&nbsp;&nbsp;` left ceiling = apl upstile: &lceil;
-<li><tt>\&rceil;</tt>`&nbsp;&nbsp;&nbsp;` right ceiling: &rceil;
-<li><tt>\&lfloor;</tt>`&nbsp;&nbsp;` left floor = apl downstile: &lfloor;
-<li><tt>\&rfloor;</tt>`&nbsp;&nbsp;` right floor: &rfloor;
-<li><tt>\&lang;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` left-pointing angle bracket = bra: &lang;
-<li><tt>\&rang;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` right-pointing angle bracket = ket: &rang;
-<li><tt>\&loz;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` lozenge: &loz;
-<li><tt>\&spades;</tt>`&nbsp;&nbsp;` black spade suit: &spades;
-<li><tt>\&clubs;</tt>`&nbsp;&nbsp;&nbsp;` black club suit = shamrock: &clubs;
-<li><tt>\&hearts;</tt>`&nbsp;&nbsp;` black heart suit = valentine: &hearts;
-<li><tt>\&diams;</tt>`&nbsp;&nbsp;&nbsp;` black diamond suit: &diams;
-<li><tt>\&quot;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` quotation mark = APL quote: &quot;
-<li><tt>\&amp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` ampersand: &amp;
-<li><tt>\&lt;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` less-than sign: &lt;
-<li><tt>\&gt;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` greater-than sign: &gt;
-<li><tt>\&OElig;</tt>`&nbsp;&nbsp;&nbsp;` latin capital ligature OE: &OElig;
-<li><tt>\&oelig;</tt>`&nbsp;&nbsp;&nbsp;` latin small ligature oe: &oelig;
-<li><tt>\&Scaron;</tt>`&nbsp;&nbsp;` latin capital letter S with caron: &Scaron;
-<li><tt>\&scaron;</tt>`&nbsp;&nbsp;` latin small letter s with caron: &scaron;
-<li><tt>\&Yuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` latin capital letter Y with diaeresis: &Yuml;
-<li><tt>\&circ;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` modifier letter circumflex accent: &circ;
-<li><tt>\&tilde;</tt>`&nbsp;&nbsp;&nbsp;` small tilde: &tilde;
-<li><tt>\&ensp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` en space: &ensp;
-<li><tt>\&emsp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` em space: &emsp;
-<li><tt>\&thinsp;</tt>`&nbsp;&nbsp;` thin space: &thinsp;
-<li><tt>\&zwnj;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` zero width non-joiner: &zwnj;
-<li><tt>\&zwj;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` zero width joiner: &zwj;
-<li><tt>\&lrm;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` left-to-right mark: &lrm;
-<li><tt>\&rlm;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` right-to-left mark: &rlm;
-<li><tt>\&ndash;</tt>`&nbsp;&nbsp;&nbsp;` en dash: &ndash;
-<li><tt>\&mdash;</tt>`&nbsp;&nbsp;&nbsp;` em dash: &mdash;
-<li><tt>\&lsquo;</tt>`&nbsp;&nbsp;&nbsp;` left single quotation mark: &lsquo;
-<li><tt>\&rsquo;</tt>`&nbsp;&nbsp;&nbsp;` right single quotation mark: &rsquo;
-<li><tt>\&sbquo;</tt>`&nbsp;&nbsp;&nbsp;` single low-9 quotation mark: &sbquo;
-<li><tt>\&ldquo;</tt>`&nbsp;&nbsp;&nbsp;` left double quotation mark: &ldquo;
-<li><tt>\&rdquo;</tt>`&nbsp;&nbsp;&nbsp;` right double quotation mark: &rdquo;
-<li><tt>\&bdquo;</tt>`&nbsp;&nbsp;&nbsp;` double low-9 quotation mark: &bdquo;
-<li><tt>\&dagger;</tt>`&nbsp;&nbsp;` dagger: &dagger;
-<li><tt>\&Dagger;</tt>`&nbsp;&nbsp;` double dagger: &Dagger;
-<li><tt>\&permil;</tt>`&nbsp;&nbsp;` per mille sign: &permil;
-<li><tt>\&lsaquo;</tt>`&nbsp;&nbsp;` single left-pointing angle quotation mark: &lsaquo;
-<li><tt>\&rsaquo;</tt>`&nbsp;&nbsp;` single right-pointing angle quotation mark: &rsaquo;
-<li><tt>\&euro;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;` euro sign: &euro;
-</ul>
-Doxygen extensions:
-<ul>
-<li><tt>\&tm;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` trade mark sign: &tm;
-<li><tt>\&apos;</tt>`&nbsp;&nbsp;&nbsp;` apostrophe: &apos;
-</ul>
+ \ref cmdcode "\\code" (see \ref xmltag_code "\<code\>").</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endCODE \addindex "\</CODE\>"\</CODE\></tt></td><td valign="top">Ends a \ref htmltag_CODE "\<CODE\>" section.
+ Note that only for C# code, this command is equivalent to
+ \ref cmdendcode "\\endcode" (see \ref xmltag_code "\<code\>").</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DD \addindex "\<DD\>"\<DD\></tt></td><td valign="top">Starts an item description.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDD \addindex "\</DD\>"\</DD\></tt></td><td valign="top">Ends an item description.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DEL \addindex "\<DEL\>"\<DEL\></tt></td><td valign="top">Starts a section of deleted text, typically shown strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDEL \addindex "\</DEL\>"\</DEL\></tt></td><td valign="top">Ends a section of deleted text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DETAILS \addindex "\<DETAILS\>"\<DETAILS\></tt></td><td valign="top">Starts a section of detailed text that the user can open and close (in HTML output))</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDETAILS \addindex "\</DETAILS\>"\</DETAILS\></tt></td><td valign="top">Ends a section of detailed text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DFN \addindex "\<DFN\>"\<DFN\></tt></td><td valign="top">Starts a piece of text displayed in a typewriter font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDFN \addindex "\</DFN\>"\</DFN\></tt></td><td valign="top">Ends a \ref htmltag_DFN "\<DFN\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DIV \addindex "\<DIV\>"\<DIV></tt></td><td valign="top">Starts a section with a specific style (HTML only)</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDIV \addindex "\</DIV\>"\</DIV></tt></td><td valign="top">Ends a section with a specific style (HTML only)</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DL \addindex "\<DL\>"\<DL\></tt></td><td valign="top">Starts a description list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDL \addindex "\</DL\>"\</DL\></tt></td><td valign="top">Ends a description list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DT \addindex "\<DT\>"\<DT\></tt></td><td valign="top">Starts an item title.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDT \addindex "\</DT\>"\</DT\></tt></td><td valign="top">Ends an item title.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_EM \addindex "\<EM\>"\<EM\></tt></td><td valign="top">Starts a piece of text displayed in an italic font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endEM \addindex "\</EM\>"\</EM\></tt></td><td valign="top">Ends a \ref htmltag_EM "\<EM\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_HR \addindex "\<HR\>"\<HR\></tt></td><td valign="top">Writes a horizontal ruler.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H1 \addindex "\<H1\>"\<H1\></tt></td><td valign="top">Starts an unnumbered section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH1 \addindex "\</H1\>"\</H1\></tt></td><td valign="top">Ends an unnumbered section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H2 \addindex "\<H2\>"\<H2\></tt></td><td valign="top">Starts an unnumbered subsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH2 \addindex "\</H2\>"\</H2\></tt></td><td valign="top">Ends an unnumbered subsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H3 \addindex "\<H3\>"\<H3\></tt></td><td valign="top">Starts an unnumbered subsubsection.</td></tr></td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH3 \addindex "\</H3\>"\</H3\></tt></td><td valign="top">Ends an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H4 \addindex "\<H4\>"\<H4\></tt></td><td valign="top">Starts an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH4 \addindex "\</H4\>"\</H4\></tt></td><td valign="top">Ends an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H5 \addindex "\<H5\>"\<H5\></tt></td><td valign="top">Starts an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH5 \addindex "\</H5\>"\</H5\></tt></td><td valign="top">Ends an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H6 \addindex "\<H6\>"\<H6\></tt></td><td valign="top">Starts an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH6 \addindex "\</H6\>"\</H6\></tt></td><td valign="top">Ends an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_I \addindex "\<I\>"\<I\></tt></td><td valign="top">Starts a piece of text displayed in an italic font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endI \addindex "\</I\>"\</I\></tt></td><td valign="top">Ends a \ref htmltag_I "\<I\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_IMG \addindex "\<IMG SRC=\"...\"\>"\<IMG SRC="..." ...\></tt></td><td valign="top">This command is written with its attributes to the HTML output only. The SRC attribute is mandatory.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_INS \addindex "\<INS\>"\<INS\></tt></td><td valign="top">Starts a section of inserted text, typically shown as underlined text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endINS \addindex "\</INS\>"\</INS\></tt></td><td valign="top">Ends a section of inserted text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_LI \addindex "\<LI\>"\<LI\></tt></td><td valign="top">Starts a new list item.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endLI \addindex "\</LI\>"\</LI\></tt></td><td valign="top">Ends a list item.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_OL \addindex "\<OL\>"\<OL\></tt></td><td valign="top">Starts a numbered item list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endOL \addindex "\</OL\>"\</OL\></tt></td><td valign="top">Ends a numbered item list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_P \addindex "\<P\>"\<P\></tt></td><td valign="top">Starts a new paragraph.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endP \addindex "\</P\>"\</P\></tt></td><td valign="top">Ends a paragraph.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_PRE \addindex "\<PRE\>"\<PRE\></tt></td><td valign="top">Starts a preformatted fragment.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endPRE \addindex "\</PRE\>"\</PRE\></tt></td><td valign="top">Ends a preformatted fragment.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_SMALL \addindex "\<SMALL\>"\<SMALL\></tt></td><td valign="top">Starts a section of text displayed in a smaller font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSMALL \addindex "\</SMALL\>"\</SMALL\></tt></td><td valign="top">Ends a \ref htmltag_SMALL "\<SMALL\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_SPAN \addindex "\<SPAN\>"\<SPAN></tt></td><td valign="top">Starts an inline text fragment with a specific style (HTML only)</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSPAN \addindex "\</SPAN\>"\</SPAN></tt></td><td valign="top">Ends an inline text fragment with a specific style (HTML only)</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_S \addindex "\<S\>"\<S\></tt></td><td valign="top">Starts a section of strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endS \addindex "\</S\>"\</S\></tt></td><td valign="top">Ends a section of strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_STRIKE \addindex "\<STRIKE\>"\<STRIKE\></tt></td><td valign="top">Starts a section of strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSTRIKE \addindex "\</STRIKE\>"\</STRIKE\></tt></td><td valign="top">Ends a section of strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_STRONG \addindex "\<STRONG\>"\<STRONG\></tt></td><td valign="top">Starts a section of bold text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSTRONG \addindex "\</STRONG\>"\</STRONG\></tt></td><td valign="top">Ends a section of bold text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_SUB \addindex "\<SUB\>"\<SUB\></tt></td><td valign="top">Starts a piece of text displayed in subscript.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSUB \addindex "\</SUB\>"\</SUB\></tt></td><td valign="top">Ends a \ref htmltag_SUB "\<SUB\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_SUP \addindex "\<SUP\>"\<SUP\></tt></td><td valign="top">Starts a piece of text displayed in superscript.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSUP \addindex "\</SUP\>"\</SUP\></tt></td><td valign="top">Ends a \ref htmltag_SUP "\<SUP\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TABLE \addindex "\<TABLE\>"\<TABLE\></tt></td><td valign="top">starts a table.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTABLE \addindex "\</TABLE\>"\</TABLE\></tt></td><td valign="top">ends a table.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TD \addindex "\<TD\>"\<TD\></tt></td><td valign="top">Starts a new table data element.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTD \addindex "\</TD\>"\</TD\></tt></td><td valign="top">Ends a table data element.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TH \addindex "\<TH\>"\<TH\></tt></td><td valign="top">Starts a new table header.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTH \addindex "\</TH\>"\</TH\></tt></td><td valign="top">Ends a table header.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TR \addindex "\<TR\>"\<TR\></tt></td><td valign="top">Starts a new table row.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTR \addindex "\</TR\>"\</TR\></tt></td><td valign="top">Ends a table row.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TT \addindex "\<TT\>"\<TT\></tt></td><td valign="top">Starts a piece of text displayed in a typewriter font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTT \addindex "\</TT\>"\</TT\></tt></td><td valign="top">Ends a \ref htmltag_TT "\<TT\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_KBD \addindex "\<KBD\>"\<KBD\></tt></td><td valign="top">Starts a piece of text displayed in a typewriter font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endKBD \addindex "\</KBD\>"\</KBD\></tt></td><td valign="top">Ends a \ref htmltag_KBD "\<KBD\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_U \addindex "\<U\>"\<U\></tt></td><td valign="top">Starts a section of underlined text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endU \addindex "\</U\>"\</U\></tt></td><td valign="top">Ends a section of underlined text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_UL \addindex "\<UL\>"\<UL\></tt></td><td valign="top">Starts an unnumbered item list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endUL \addindex "\</UL\>"\</UL\></tt></td><td valign="top">Ends an unnumbered item list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_VAR \addindex "\<VAR\>"\<VAR\></tt></td><td valign="top">Starts a piece of text displayed in an italic font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endVAR \addindex "\</VAR\>"\</VAR\></tt></td><td valign="top">Ends a \ref htmltag_VAR "\<VAR\>" section.</td></tr>
+</table>
Finally, to put invisible comments inside comment blocks, HTML style
comments can be used:
@@ -397,6 +134,272 @@ comments can be used:
The part `<!-- ... -->` will not be shown in the main documentation.
+
+\section htmlentities HTML4 character entities
+
+The list of special HTML4 character entities with their descriptions has been taken from: <a href="http://www.w3.org/TR/html4/sgml/entities.html">Character entity references in HTML 4</a>.
+( Portions &copy; International Organization for Standardization 1986
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.)
+| Entity | &nbsp; | Description |
+| :----- | :----- | :---------- |
+| <tt>\&nbsp;</tt> | &nbsp; | no-break space = non-breaking space |
+| <tt>\&iexcl;</tt> | &iexcl; | inverted exclamation mark |
+| <tt>\&cent;</tt> | &cent; | cent sign |
+| <tt>\&pound;</tt> | &pound; | pound sign |
+| <tt>\&curren;</tt> | &curren; | currency sign |
+| <tt>\&yen;</tt> | &yen; | yen sign = yuan sign |
+| <tt>\&brvbar;</tt> | &brvbar; | broken bar = broken vertical bar |
+| <tt>\&sect;</tt> | &sect; | section sign |
+| <tt>\&uml;</tt> | &uml; | diaeresis = spacing diaeresis |
+| <tt>\&copy;</tt> | &copy; | copyright sign |
+| <tt>\&ordf;</tt> | &ordf; | feminine ordinal indicator |
+| <tt>\&laquo;</tt> | &laquo; | left-pointing double angle quotation mark = left pointing guillemet |
+| <tt>\&not;</tt> | &not; | not sign |
+| <tt>\&shy;</tt> | &shy; | soft hyphen = discretionary hyphen |
+| <tt>\&reg;</tt> | &reg; | registered sign = registered trade mark sign |
+| <tt>\&macr;</tt> | &macr; | macron = spacing macron = overline = APL overbar |
+| <tt>\&deg;</tt> | &deg; | degree sign |
+| <tt>\&plusmn;</tt> | &plusmn; | plus-minus sign = plus-or-minus sign |
+| <tt>\&sup2;</tt> | &sup2; | superscript two = superscript digit two = squared |
+| <tt>\&sup3;</tt> | &sup3; | superscript three = superscript digit three = cubed |
+| <tt>\&acute;</tt> | &acute; | acute accent = spacing acute |
+| <tt>\&micro;</tt> | &micro; | micro sign |
+| <tt>\&para;</tt> | &para; | pilcrow sign = paragraph sign |
+| <tt>\&middot;</tt> | &middot; | middle dot = Georgian comma = Greek middle dot |
+| <tt>\&cedil;</tt> | &cedil; | cedilla = spacing cedilla |
+| <tt>\&sup1;</tt> | &sup1; | superscript one = superscript digit one |
+| <tt>\&ordm;</tt> | &ordm; | masculine ordinal indicator |
+| <tt>\&raquo;</tt> | &raquo; | right-pointing double angle quotation mark = right pointing guillemet |
+| <tt>\&frac14;</tt> | &frac14; | vulgar fraction one quarter = fraction one quarter |
+| <tt>\&frac12;</tt> | &frac12; | vulgar fraction one half = fraction one half |
+| <tt>\&frac34;</tt> | &frac34; | vulgar fraction three quarters = fraction three quarters |
+| <tt>\&iquest;</tt> | &iquest; | inverted question mark = turned question mark |
+| <tt>\&Agrave;</tt> | &Agrave; | latin capital letter A with grave = latin capital letter A grave |
+| <tt>\&Aacute;</tt> | &Aacute; | latin capital letter A with acute |
+| <tt>\&Acirc;</tt> | &Acirc; | latin capital letter A with circumflex |
+| <tt>\&Atilde;</tt> | &Atilde; | latin capital letter A with tilde |
+| <tt>\&Auml;</tt> | &Auml; | latin capital letter A with diaeresis |
+| <tt>\&Aring;</tt> | &Aring; | latin capital letter A with ring above = latin capital letter A ring |
+| <tt>\&AElig;</tt> | &AElig; | latin capital letter AE = latin capital ligature AE |
+| <tt>\&Ccedil;</tt> | &Ccedil; | latin capital letter C with cedilla |
+| <tt>\&Egrave;</tt> | &Egrave; | latin capital letter E with grave |
+| <tt>\&Eacute;</tt> | &Eacute; | latin capital letter E with acute |
+| <tt>\&Ecirc;</tt> | &Ecirc; | latin capital letter E with circumflex |
+| <tt>\&Euml;</tt> | &Euml; | latin capital letter E with diaeresis |
+| <tt>\&Igrave;</tt> | &Igrave; | latin capital letter I with grave |
+| <tt>\&Iacute;</tt> | &Iacute; | latin capital letter I with acute |
+| <tt>\&Icirc;</tt> | &Icirc; | latin capital letter I with circumflex |
+| <tt>\&Iuml;</tt> | &Iuml; | latin capital letter I with diaeresis |
+| <tt>\&ETH;</tt> | &ETH; | latin capital letter ETH |
+| <tt>\&Ntilde;</tt> | &Ntilde; | latin capital letter N with tilde |
+| <tt>\&Ograve;</tt> | &Ograve; | latin capital letter O with grave |
+| <tt>\&Oacute;</tt> | &Oacute; | latin capital letter O with acute |
+| <tt>\&Ocirc;</tt> | &Ocirc; | latin capital letter O with circumflex |
+| <tt>\&Otilde;</tt> | &Otilde; | latin capital letter O with tilde |
+| <tt>\&Ouml;</tt> | &Ouml; | latin capital letter O with diaeresis |
+| <tt>\&times;</tt> | &times; | multiplication sign |
+| <tt>\&Oslash;</tt> | &Oslash; | latin capital letter O with stroke = latin capital letter O slash |
+| <tt>\&Ugrave;</tt> | &Ugrave; | latin capital letter U with grave |
+| <tt>\&Uacute;</tt> | &Uacute; | latin capital letter U with acute |
+| <tt>\&Ucirc;</tt> | &Ucirc; | latin capital letter U with circumflex |
+| <tt>\&Uuml;</tt> | &Uuml; | latin capital letter U with diaeresis |
+| <tt>\&Yacute;</tt> | &Yacute; | latin capital letter Y with acute |
+| <tt>\&THORN;</tt> | &THORN; | latin capital letter THORN |
+| <tt>\&szlig;</tt> | &szlig; | latin small letter sharp s = ess-zed |
+| <tt>\&agrave;</tt> | &agrave; | latin small letter a with grave = latin small letter a grave |
+| <tt>\&aacute;</tt> | &aacute; | latin small letter a with acute |
+| <tt>\&acirc;</tt> | &acirc; | latin small letter a with circumflex |
+| <tt>\&atilde;</tt> | &atilde; | latin small letter a with tilde |
+| <tt>\&auml;</tt> | &auml; | latin small letter a with diaeresis |
+| <tt>\&aring;</tt> | &aring; | latin small letter a with ring above = latin small letter a ring |
+| <tt>\&aelig;</tt> | &aelig; | latin small letter ae = latin small ligature ae |
+| <tt>\&ccedil;</tt> | &ccedil; | latin small letter c with cedilla |
+| <tt>\&egrave;</tt> | &egrave; | latin small letter e with grave |
+| <tt>\&eacute;</tt> | &eacute; | latin small letter e with acute |
+| <tt>\&ecirc;</tt> | &ecirc; | latin small letter e with circumflex |
+| <tt>\&euml;</tt> | &euml; | latin small letter e with diaeresis |
+| <tt>\&igrave;</tt> | &igrave; | latin small letter i with grave |
+| <tt>\&iacute;</tt> | &iacute; | latin small letter i with acute |
+| <tt>\&icirc;</tt> | &icirc; | latin small letter i with circumflex |
+| <tt>\&iuml;</tt> | &iuml; | latin small letter i with diaeresis |
+| <tt>\&eth;</tt> | &eth; | latin small letter eth |
+| <tt>\&ntilde;</tt> | &ntilde; | latin small letter n with tilde |
+| <tt>\&ograve;</tt> | &ograve; | latin small letter o with grave |
+| <tt>\&oacute;</tt> | &oacute; | latin small letter o with acute |
+| <tt>\&ocirc;</tt> | &ocirc; | latin small letter o with circumflex |
+| <tt>\&otilde;</tt> | &otilde; | latin small letter o with tilde |
+| <tt>\&ouml;</tt> | &ouml; | latin small letter o with diaeresis |
+| <tt>\&divide;</tt> | &divide; | division sign |
+| <tt>\&oslash;</tt> | &oslash; | latin small letter o with stroke, = latin small letter o slash |
+| <tt>\&ugrave;</tt> | &ugrave; | latin small letter u with grave |
+| <tt>\&uacute;</tt> | &uacute; | latin small letter u with acute |
+| <tt>\&ucirc;</tt> | &ucirc; | latin small letter u with circumflex |
+| <tt>\&uuml;</tt> | &uuml; | latin small letter u with diaeresis |
+| <tt>\&yacute;</tt> | &yacute; | latin small letter y with acute |
+| <tt>\&thorn;</tt> | &thorn; | latin small letter thorn |
+| <tt>\&yuml;</tt> | &yuml; | latin small letter y with diaeresis |
+| <tt>\&fnof;</tt> | &fnof; | latin small f with hook = function = florin |
+| <tt>\&Alpha;</tt> | &Alpha; | greek capital letter alpha |
+| <tt>\&Beta;</tt> | &Beta; | greek capital letter beta |
+| <tt>\&Gamma;</tt> | &Gamma; | greek capital letter gamma |
+| <tt>\&Delta;</tt> | &Delta; | greek capital letter delta |
+| <tt>\&Epsilon;</tt> | &Epsilon; | greek capital letter epsilon |
+| <tt>\&Zeta;</tt> | &Zeta; | greek capital letter zeta |
+| <tt>\&Eta;</tt> | &Eta; | greek capital letter eta |
+| <tt>\&Theta;</tt> | &Theta; | greek capital letter theta |
+| <tt>\&Iota;</tt> | &Iota; | greek capital letter iota |
+| <tt>\&Kappa;</tt> | &Kappa; | greek capital letter kappa |
+| <tt>\&Lambda;</tt> | &Lambda; | greek capital letter lambda |
+| <tt>\&Mu;</tt> | &Mu; | greek capital letter mu |
+| <tt>\&Nu;</tt> | &Nu; | greek capital letter nu |
+| <tt>\&Xi;</tt> | &Xi; | greek capital letter xi |
+| <tt>\&Omicron;</tt> | &Omicron; | greek capital letter omicron |
+| <tt>\&Pi;</tt> | &Pi; | greek capital letter pi |
+| <tt>\&Rho;</tt> | &Rho; | greek capital letter rho |
+| <tt>\&Sigma;</tt> | &Sigma; | greek capital letter sigma |
+| <tt>\&Tau;</tt> | &Tau; | greek capital letter tau |
+| <tt>\&Upsilon;</tt> | &Upsilon; | greek capital letter upsilon |
+| <tt>\&Phi;</tt> | &Phi; | greek capital letter phi |
+| <tt>\&Chi;</tt> | &Chi; | greek capital letter chi |
+| <tt>\&Psi;</tt> | &Psi; | greek capital letter psi |
+| <tt>\&Omega;</tt> | &Omega; | greek capital letter omega |
+| <tt>\&alpha;</tt> | &alpha; | greek small letter alpha |
+| <tt>\&beta;</tt> | &beta; | greek small letter beta |
+| <tt>\&gamma;</tt> | &gamma; | greek small letter gamma |
+| <tt>\&delta;</tt> | &delta; | greek small letter delta |
+| <tt>\&epsilon;</tt> | &epsilon; | greek small letter epsilon |
+| <tt>\&zeta;</tt> | &zeta; | greek small letter zeta |
+| <tt>\&eta;</tt> | &eta; | greek small letter eta |
+| <tt>\&theta;</tt> | &theta; | greek small letter theta |
+| <tt>\&iota;</tt> | &iota; | greek small letter iota |
+| <tt>\&kappa;</tt> | &kappa; | greek small letter kappa |
+| <tt>\&lambda;</tt> | &lambda; | greek small letter lambda |
+| <tt>\&mu;</tt> | &mu; | greek small letter mu |
+| <tt>\&nu;</tt> | &nu; | greek small letter nu |
+| <tt>\&xi;</tt> | &xi; | greek small letter xi |
+| <tt>\&omicron;</tt> | &omicron; | greek small letter omicron |
+| <tt>\&pi;</tt> | &pi; | greek small letter pi |
+| <tt>\&rho;</tt> | &rho; | greek small letter rho |
+| <tt>\&sigmaf;</tt> | &sigmaf; | greek small letter final sigma |
+| <tt>\&sigma;</tt> | &sigma; | greek small letter sigma |
+| <tt>\&tau;</tt> | &tau; | greek small letter tau |
+| <tt>\&upsilon;</tt> | &upsilon; | greek small letter upsilon |
+| <tt>\&phi;</tt> | &phi; | greek small letter phi |
+| <tt>\&chi;</tt> | &chi; | greek small letter chi |
+| <tt>\&psi;</tt> | &psi; | greek small letter psi |
+| <tt>\&omega;</tt> | &omega; | greek small letter omega |
+| <tt>\&thetasym;</tt> | &thetasym; | greek small letter theta symbol |
+| <tt>\&upsih;</tt> | &upsih; | greek upsilon with hook symbol |
+| <tt>\&piv;</tt> | &piv; | greek pi symbol |
+| <tt>\&bull;</tt> | &bull; | bullet = black small circle |
+| <tt>\&hellip;</tt> | &hellip; | horizontal ellipsis = three dot leader |
+| <tt>\&prime;</tt> | &prime; | prime = minutes = feet |
+| <tt>\&Prime;</tt> | &Prime; | double prime = seconds = inches |
+| <tt>\&oline;</tt> | &oline; | overline = spacing overscore |
+| <tt>\&frasl;</tt> | &frasl; | fraction slash |
+| <tt>\&weierp;</tt> | &weierp; | script capital P = power set = Weierstrass p |
+| <tt>\&image;</tt> | &image; | blackletter capital I = imaginary part |
+| <tt>\&real;</tt> | &real; | blackletter capital R = real part symbol |
+| <tt>\&trade;</tt> | &trade; | trade mark sign |
+| <tt>\&alefsym;</tt> | &alefsym; | alef symbol = first transfinite cardinal |
+| <tt>\&larr;</tt> | &larr; | leftwards arrow |
+| <tt>\&uarr;</tt> | &uarr; | upwards arrow |
+| <tt>\&rarr;</tt> | &rarr; | rightwards arrow |
+| <tt>\&darr;</tt> | &darr; | downwards arrow |
+| <tt>\&harr;</tt> | &harr; | left right arrow |
+| <tt>\&crarr;</tt> | &crarr; | downwards arrow with corner leftwards = carriage return |
+| <tt>\&lArr;</tt> | &lArr; | leftwards double arrow |
+| <tt>\&uArr;</tt> | &uArr; | upwards double arrow |
+| <tt>\&rArr;</tt> | &rArr; | rightwards double arrow |
+| <tt>\&dArr;</tt> | &dArr; | downwards double arrow |
+| <tt>\&hArr;</tt> | &hArr; | left right double arrow |
+| <tt>\&forall;</tt> | &forall; | for all |
+| <tt>\&part;</tt> | &part; | partial differential |
+| <tt>\&exist;</tt> | &exist; | there exists |
+| <tt>\&empty;</tt> | &empty; | empty set = null set = diameter |
+| <tt>\&nabla;</tt> | &nabla; | nabla = backward difference |
+| <tt>\&isin;</tt> | &isin; | element of |
+| <tt>\&notin;</tt> | &notin; | not an element of |
+| <tt>\&ni;</tt> | &ni; | contains as member |
+| <tt>\&prod;</tt> | &prod; | n-ary product = product sign |
+| <tt>\&sum;</tt> | &sum; | n-ary summation |
+| <tt>\&minus;</tt> | &minus; | minus sign |
+| <tt>\&lowast;</tt> | &lowast; | asterisk operator |
+| <tt>\&radic;</tt> | &radic; | square root = radical sign |
+| <tt>\&prop;</tt> | &prop; | proportional to |
+| <tt>\&infin;</tt> | &infin; | infinity |
+| <tt>\&ang;</tt> | &ang; | angle |
+| <tt>\&and;</tt> | &and; | logical and = wedge |
+| <tt>\&or;</tt> | &or; | logical or = vee |
+| <tt>\&cap;</tt> | &cap; | intersection = cap |
+| <tt>\&cup;</tt> | &cup; | union = cup |
+| <tt>\&int;</tt> | &int; | integral |
+| <tt>\&there4;</tt> | &there4; | therefore |
+| <tt>\&sim;</tt> | &sim; | tilde operator = varies with = similar to |
+| <tt>\&cong;</tt> | &cong; | approximately equal to |
+| <tt>\&asymp;</tt> | &asymp; | almost equal to = asymptotic to |
+| <tt>\&ne;</tt> | &ne; | not equal to |
+| <tt>\&equiv;</tt> | &equiv; | identical to |
+| <tt>\&le;</tt> | &le; | less-than or equal to |
+| <tt>\&ge;</tt> | &ge; | greater-than or equal to |
+| <tt>\&sub;</tt> | &sub; | subset of |
+| <tt>\&sup;</tt> | &sup; | superset of |
+| <tt>\&nsub;</tt> | &nsub; | not a subset of |
+| <tt>\&sube;</tt> | &sube; | subset of or equal to |
+| <tt>\&supe;</tt> | &supe; | superset of or equal to |
+| <tt>\&oplus;</tt> | &oplus; | circled plus = direct sum |
+| <tt>\&otimes;</tt> | &otimes; | circled times = vector product |
+| <tt>\&perp;</tt> | &perp; | up tack = orthogonal to = perpendicular |
+| <tt>\&sdot;</tt> | &sdot; | dot operator |
+| <tt>\&lceil;</tt> | &lceil; | left ceiling = apl upstile |
+| <tt>\&rceil;</tt> | &rceil; | right ceiling |
+| <tt>\&lfloor;</tt> | &lfloor; | left floor = apl downstile |
+| <tt>\&rfloor;</tt> | &rfloor; | right floor |
+| <tt>\&lang;</tt> | &lang; | left-pointing angle bracket = bra |
+| <tt>\&rang;</tt> | &rang; | right-pointing angle bracket = ket |
+| <tt>\&loz;</tt> | &loz; | lozenge |
+| <tt>\&spades;</tt> | &spades; | black spade suit |
+| <tt>\&clubs;</tt> | &clubs; | black club suit = shamrock |
+| <tt>\&hearts;</tt> | &hearts; | black heart suit = valentine |
+| <tt>\&diams;</tt> | &diams; | black diamond suit |
+| <tt>\&quot;</tt> | &quot; | quotation mark = APL quote |
+| <tt>\&amp;</tt> | &amp; | ampersand |
+| <tt>\&lt;</tt> | &lt; | less-than sign |
+| <tt>\&gt;</tt> | &gt; | greater-than sign |
+| <tt>\&OElig;</tt> | &OElig; | latin capital ligature OE |
+| <tt>\&oelig;</tt> | &oelig; | latin small ligature oe |
+| <tt>\&Scaron;</tt> | &Scaron; | latin capital letter S with caron |
+| <tt>\&scaron;</tt> | &scaron; | latin small letter s with caron |
+| <tt>\&Yuml;</tt> | &Yuml; | latin capital letter Y with diaeresis |
+| <tt>\&circ;</tt> | &circ; | modifier letter circumflex accent |
+| <tt>\&tilde;</tt> | &tilde; | small tilde |
+| <tt>\&ensp;</tt> | &ensp; | en space |
+| <tt>\&emsp;</tt> | &emsp; | em space |
+| <tt>\&thinsp;</tt> | &thinsp; | thin space |
+| <tt>\&zwnj;</tt> | &zwnj; | zero width non-joiner |
+| <tt>\&zwj;</tt> | &zwj; | zero width joiner |
+| <tt>\&lrm;</tt> | &lrm; | left-to-right mark |
+| <tt>\&rlm;</tt> | &rlm; | right-to-left mark |
+| <tt>\&ndash;</tt> | &ndash; | en dash |
+| <tt>\&mdash;</tt> | &mdash; | em dash |
+| <tt>\&lsquo;</tt> | &lsquo; | left single quotation mark |
+| <tt>\&rsquo;</tt> | &rsquo; | right single quotation mark |
+| <tt>\&sbquo;</tt> | &sbquo; | single low-9 quotation mark |
+| <tt>\&ldquo;</tt> | &ldquo; | left double quotation mark |
+| <tt>\&rdquo;</tt> | &rdquo; | right double quotation mark |
+| <tt>\&bdquo;</tt> | &bdquo; | double low-9 quotation mark |
+| <tt>\&dagger;</tt> | &dagger; | dagger |
+| <tt>\&Dagger;</tt> | &Dagger; | double dagger |
+| <tt>\&permil;</tt> | &permil; | per mille sign |
+| <tt>\&lsaquo;</tt> | &lsaquo; | single left-pointing angle quotation mark |
+| <tt>\&rsaquo;</tt> | &rsaquo; | single right-pointing angle quotation mark |
+| <tt>\&euro;</tt> | &euro; | euro sign |
+| **Doxygen extensions:** |||
+| <tt>\&tm;</tt> | &tm; | trade mark sign |
+| <tt>\&apos;</tt> | &apos; | apostrophe|
+
\htmlonly
<br/>
Go to the <a href="xmlcmds.html">next</a> section or return to the
diff --git a/doc/index.doc b/doc/index.doc
index 024a578..b5ac9e6 100644
--- a/doc/index.doc
+++ b/doc/index.doc
@@ -30,7 +30,7 @@ Version: $(VERSION)
Doxygen is the de facto standard tool for generating documentation from
annotated C++ sources, but it also supports other popular programming
languages such as C, Objective-C, C#, PHP, Java, Python, IDL
-(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, and to some extent D.
+(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, and to some extent D.
Doxygen also supports the hardware description language VHDL.
Doxygen can help you in three ways:
@@ -122,7 +122,7 @@ The third part provides information for developers:
\addindex license
\addindex GPL
-Copyright &copy; 1997-2019 by
+Copyright &copy; 1997-\showdate "%Y" by
<a href="mailto:doxygen@gmail.com">Dimitri van Heesch</a>.<p>
Permission to use, copy, modify, and distribute this software and its
diff --git a/doc/language.tpl b/doc/language.tpl
index a76e853..f239bc8 100644
--- a/doc/language.tpl
+++ b/doc/language.tpl
@@ -67,7 +67,7 @@ Just follow the following steps:
\endverbatim
<p>Now, in <code>setTranslator()</code> add
\verbatim
- case OUTPUT_LANGUAGE_t::YourLanguage: theTranslator = new TranslatorYourLanguage; break;
+case OUTPUT_LANGUAGE_t::YourLanguage: theTranslator = new TranslatorYourLanguage; break;
\endverbatim
<li>Edit <code>doxygen/src/translator_xx.h</code>:
<ul>
diff --git a/doc/output.doc b/doc/output.doc
index 77f4092..81635e2 100644
--- a/doc/output.doc
+++ b/doc/output.doc
@@ -54,7 +54,7 @@ The following output formats are \e indirectly supported by doxygen:
<dd>Generated from the \LaTeX output by
running <code>make ps</code> in the output directory.
For the best results \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS" should be set to \c NO.
-<dt><b>PDF</b>\htmlonly &nbsp;&nbsp;&nbsp;\endhtmlonly
+<dt><b>PDF</b>
<dd>Generated from the \LaTeX output by
running <code>make pdf</code> in the output directory.
To improve the PDF output, you typically would want to enable the use
diff --git a/doc/preprocessing.doc b/doc/preprocessing.doc
index 4c2fce4..39704fa 100644
--- a/doc/preprocessing.doc
+++ b/doc/preprocessing.doc
@@ -252,7 +252,11 @@ PREDEFINED = "DECLARE_INTERFACE(name)=class name" \
As you can see doxygen's preprocessor is quite powerful, but if you want
even more flexibility you can always write an input filter and specify it
-after the \ref cfg_input_filter "INPUT_FILTER" tag.
+after the \ref cfg_input_filter "INPUT_FILTER" tag or
+the \ref cfg_filter_patterns "FILTER_PATTERNS" tag
+(or the \ref cfg_filter_source_patterns "FILTER_SOURCE_PATTERNS" tag).<br>
+If you are unsure what the effect of the filter will be
+you can run doxygen as follows: `doxygen -d filteroutput`.
If you are unsure what the effect of doxygen's preprocessing will be
you can run doxygen as follows:
diff --git a/doc/tables.doc b/doc/tables.doc
index 6c78696..766a2a7 100644
--- a/doc/tables.doc
+++ b/doc/tables.doc
@@ -62,6 +62,7 @@ a nested table as one of the cells, and a item list in another cell.
Note that the end tags (like `</td>`) are left out in the example above.
This is allowed, and in the HTML output doxygen will add the end tags again.
+\latexonly \newpage \endlatexonly
The output will look as follows:
<table>
diff --git a/doc/translator.py b/doc/translator.py
index 4c549d9..2bb35dd 100644
--- a/doc/translator.py
+++ b/doc/translator.py
@@ -882,7 +882,7 @@ class Transl:
prototype=="virtual QCString latexFont()" or
prototype=="virtual QCString latexFontenc()" or
prototype=="virtual bool needsPunctuation()")):
- self.prototypeDic[uniPrototype] = prototype
+ self.prototypeDic[uniPrototype] = prototype
status = 2 # body consumed
methodId = None # outside of any method
elif tokenId == 'lcurly':
@@ -1128,13 +1128,13 @@ class Transl:
# be set.
if not self.note and self.status == '' and \
(self.translateMeFlag or self.txtMAX_DOT_GRAPH_HEIGHT_flag):
- self.note = ''
- if self.translateMeFlag:
- self.note += 'The "%s" found in a comment.' % self.translateMeText
- if self.note != '':
- self.note += '\n\t\t'
- if self.txtMAX_DOT_GRAPH_HEIGHT_flag:
- self.note += 'The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()'
+ self.note = ''
+ if self.translateMeFlag:
+ self.note += 'The "%s" found in a comment.' % self.translateMeText
+ if self.note != '':
+ self.note += '\n\t\t'
+ if self.txtMAX_DOT_GRAPH_HEIGHT_flag:
+ self.note += 'The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()'
# If everything seems OK, but there are obsolete methods, set
# the note to clean-up source. This note will be used only when
@@ -1892,7 +1892,7 @@ class TrManager:
if classId in self.__translDic:
lang = self.__translDic[classId].langReadable
mm = 'see the %s language' % lang
- ee = '&nbsp;'
+ ee = '&#160;'
if not mm and obj.classId in self.__maintainersDic:
# Build a string of names separated by the HTML break element.
diff --git a/doc/xmlcmds.doc b/doc/xmlcmds.doc
index de9bfeb..85ae055 100644
--- a/doc/xmlcmds.doc
+++ b/doc/xmlcmds.doc
@@ -24,61 +24,61 @@ not very precise and a number of the examples given are of poor quality.
Here is the list of tags supported by doxygen:
-<ul>
-<li><tt>\anchor xmltag_c \addindex "\<c\>" \<c\></tt> Identifies inline text that should be rendered as a
- piece of code. Similar to using <tt>\<tt\></tt>text<tt>\</tt\></tt>.
-<li><tt>\anchor xmltag_code \addindex "\<code\>" <code\></tt> Set one or more lines of source code or program output.
+<table class="markdownTable" valign="top">
+<tr class="markdownTableHead"><th class="markdownTableHeadLeft">XML Command</th><th class="markdownTableHeadLeft">Description</th></tr>
+<tr><td valign="top"><tt>\anchor xmltag_c \addindex "\<c\>" \<c\></tt></td><td valign="top">Identifies inline text that should be rendered as a
+ piece of code. Similar to using <tt>\<tt\></tt>text<tt>\</tt\></tt>.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_code \addindex "\<code\>" <code\></tt></td><td valign="top">Set one or more lines of source code or program output.
Note that this command behaves like \ref cmdcode "\\code" ... \ref cmdendcode "\\endcode"
for C# code, but it behaves like the HTML equivalent
- \ref htmltag_CODE "\<CODE\>"...\ref htmltag_endCODE "\</CODE\>" for other languages.
-<li><tt>\anchor xmltag_description \addindex "\<description\>" \<description\></tt> Part of a \ref xmltag_list "\<list\>" command, describes an item.
-<li><tt>\anchor xmltag_example \addindex "\<example\>" \<example\></tt> Marks a block of text as an example, ignored by doxygen.
-<li><tt>\anchor xmltag_exception \addindex "\<exception\>" \<exception cref="member"\></tt> Identifies the exception a
- method can throw.
-<li><tt>\anchor xmltag_include \addindex "\<include\>" \<include\></tt> Can be used to import a piece of XML from an external
- file. Ignored by doxygen at the moment.
-<li><tt>\anchor xmltag_inheritdoc \addindex "\<inheritdoc\>" \<inheritdoc\></tt> Can be used to insert the documentation of a
+ \ref htmltag_CODE "\<CODE\>"...\ref htmltag_endCODE "\</CODE\>" for other languages.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_description \addindex "\<description\>" \<description\></tt></td><td valign="top">Part of a \ref xmltag_list "\<list\>" command, describes an item.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_example \addindex "\<example\>" \<example\></tt></td><td valign="top">Marks a block of text as an example, ignored by doxygen.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_exception \addindex "\<exception\>" \<exception cref="member"\></tt></td><td valign="top">Identifies the exception a
+ method can throw.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_include \addindex "\<include\>" \<include\></tt></td><td valign="top">Can be used to import a piece of XML from an external
+ file. Ignored by doxygen at the moment.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_inheritdoc \addindex "\<inheritdoc\>" \<inheritdoc\></tt></td><td valign="top">Can be used to insert the documentation of a
member of a base class into the documentation of a
- member of a derived class that reimplements it.
-<li><tt>\anchor xmltag_item \addindex "\<item\>" \<item\></tt> List item. Can only be used inside a \ref xmltag_list "\<list\>" context.
-
-<li><tt>\anchor xmltag_list \addindex "\<list\>" \<list type="type"\></tt> Starts a list, supported types are <tt>bullet</tt>
+ member of a derived class that reimplements it.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_item \addindex "\<item\>" \<item\></tt></td><td valign="top">List item. Can only be used inside a \ref xmltag_list "\<list\>" context.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_list \addindex "\<list\>" \<list type="type"\></tt></td><td valign="top">Starts a list, supported types are <tt>bullet</tt>
or <tt>number</tt> and <tt>table</tt>.
A list consists of a number of <tt>\<item\></tt> tags.
A list of type table, is a two column table which can have
- a header.
-<li><tt>\anchor xmltag_listheader \addindex "\<listheader\>" \<listheader\></tt> Starts the header of a list of type "table".
-<li><tt>\anchor xmltag_para \addindex "\<para\>" \<para\></tt> Identifies a paragraph of text.
-<li><tt>\anchor xmltag_param \addindex "\<param\>" \<param name="paramName"\></tt> Marks a piece of text as the documentation
+ a header.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_listheader \addindex "\<listheader\>" \<listheader\></tt></td><td valign="top">Starts the header of a list of type "table".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_para \addindex "\<para\>" \<para\></tt></td><td valign="top">Identifies a paragraph of text.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_param \addindex "\<param\>" \<param name="paramName"\></tt></td><td valign="top">Marks a piece of text as the documentation
for parameter "paramName". Similar to
- using \ref cmdparam "\\param".
-<li><tt>\anchor xmltag_paramref \addindex "\<paramref\>" \<paramref name="paramName"\></tt> Refers to a parameter with name
- "paramName". Similar to using \ref cmda "\\a".
-<li><tt>\anchor xmltag_permission \addindex "\<permission\>" \<permission\></tt> Identifies the security accessibility of a member.
- Ignored by doxygen.
-<li><tt>\anchor xmltag_remarks \addindex "\<remarks\>" \<remarks\></tt> Identifies the detailed description.
-<li><tt>\anchor xmltag_returns \addindex "\<returns\>" \<returns\></tt> Marks a piece of text as the return value of a
- function or method. Similar to using \ref cmdreturn "\\return".
-<li><tt>\anchor xmltag_see \addindex "\<see\>" \<see cref="member"\></tt> Refers to a member. Similar to \ref cmdref "\\ref".
-<li><tt>\anchor xmltag_seealso \addindex "\<seealso\>" \<seealso cref="member"\></tt> Starts a "See also" section referring
- to "member". Similar to using \ref cmdsa "\\sa" member.
-<li><tt>\anchor xmltag_summary \addindex "\<summary\>" \<summary\></tt>
+ using \ref cmdparam "\\param".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_paramref \addindex "\<paramref\>" \<paramref name="paramName"\></tt></td><td valign="top">Refers to a parameter with name
+ "paramName". Similar to using \ref cmda "\\a".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_permission \addindex "\<permission\>" \<permission\></tt></td><td valign="top">Identifies the security accessibility of a member.
+ Ignored by doxygen.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_remarks \addindex "\<remarks\>" \<remarks\></tt></td><td valign="top">Identifies the detailed description. </td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_returns \addindex "\<returns\>" \<returns\></tt></td><td valign="top">Marks a piece of text as the return value of a
+ function or method. Similar to using \ref cmdreturn "\\return".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_see \addindex "\<see\>" \<see cref="member"\></tt></td><td valign="top">Refers to a member. Similar to \ref cmdref "\\ref".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_seealso \addindex "\<seealso\>" \<seealso cref="member"\></tt></td><td valign="top">Starts a "See also" section referring
+ to "member". Similar to using \ref cmdsa "\\sa" member.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_summary \addindex "\<summary\>" \<summary\></tt></td><td valign="top">
In case this tag is used outside a \ref htmltag_DETAILS "\<DETAILS\>" tag this tag
identifies the brief description.
Similar to using \ref cmdbrief "\\brief".
In case this tag is used inside a \ref htmltag_DETAILS "\<DETAILS\>" tag this tag
- identifies the heading of the \ref htmltag_DETAILS "\<DETAILS\>" tag.
-<li><tt>\anchor xmltag_term \addindex "\<term\>" \<term\></tt> Part of a \ref xmltag_list "\<list\>" command.
-<li><tt>\anchor xmltag_typeparam \addindex "\<typeparam\>" \<typeparam name="paramName"\></tt> Marks a piece of text as the documentation
+ identifies the heading of the \ref htmltag_DETAILS "\<DETAILS\>" tag.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_term \addindex "\<term\>" \<term\></tt></td><td valign="top">Part of a \ref xmltag_list "\<list\>" command.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_typeparam \addindex "\<typeparam\>" \<typeparam name="paramName"\></tt></td><td valign="top">Marks a piece of text as the documentation
for type parameter "paramName". Similar to
- using \ref cmdparam "\\param".
-<li>\anchor xmltag_typeparamref \addindex "\<typeparamref\>"<tt>\<typeparamref name="paramName"\></tt> Refers to a parameter with name
- "paramName". Similar to using \ref cmda "\\a".
-<li><tt>\anchor xmltag_value \addindex "\<value\>" \<value\></tt> Identifies a property. Ignored by doxygen.
-<li><tt>\anchor xmltag_CDATA \addindex "\<![CDATA[...]]\>" \<![CDATA[...]]\></tt> The text inside this tag (on the ...) is handled as normal
+ using \ref cmdparam "\\param".</td></tr>
+<tr><td valign="top">\anchor xmltag_typeparamref \addindex "\<typeparamref\>"<tt>\<typeparamref name="paramName"\></tt></td><td valign="top">Refers to a parameter with name
+ "paramName". Similar to using \ref cmda "\\a".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_value \addindex "\<value\>" \<value\></tt></td><td valign="top">Identifies a property. Ignored by doxygen.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_CDATA \addindex "\<![CDATA[...]]\>" \<![CDATA[...]]\></tt></td><td valign="top">The text inside this tag (on the ...) is handled as normal
doxygen comment except for the XML special characters `<`, `>` and
- `&` that are used as if they were escaped.
-</ul>
+ `&` that are used as if they were escaped.</td></tr>
+</table>
Here is an example of a typical piece of code using some of the above commands:
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 194b427..21d086c 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -7,6 +7,13 @@ if (DOT)
set(DIAGRAM_EXAMPLE ${PROJECT_BINARY_DIR}/html/examples/diagrams/html/index.html)
endif()
+add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/examples/baseexample.cfg" "${PROJECT_BINARY_DIR}/examples/"
+ DEPENDS "${PROJECT_SOURCE_DIR}/examples/baseexample.cfg"
+ OUTPUT "${PROJECT_BINARY_DIR}/examples/baseexample.cfg"
+)
+set_source_files_properties("${PROJECT_BINARY_DIR}/examples/baseexample.cfg" PROPERTIES GENERATED 1)
+
foreach (f ${EXAMPLE_FILES})
add_custom_command(
COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/examples/${f}" "${PROJECT_BINARY_DIR}/examples/"
@@ -17,45 +24,59 @@ foreach (f ${EXAMPLE_FILES})
list(APPEND OUT_EXAMPLE_FILES "${PROJECT_BINARY_DIR}/examples/${f}")
endforeach()
+# name file extension dependency (optional)
+set(EXAMPLE_class class h)
+set(EXAMPLE_define define h)
+set(EXAMPLE_enum enum h)
+set(EXAMPLE_file file h)
+set(EXAMPLE_func func h)
+set(EXAMPLE_javadoc javadoc-banner h)
+set(EXAMPLE_structcmd structcmd h)
+set(EXAMPLE_afterdoc afterdoc h)
+set(EXAMPLE_relates relates cpp)
+set(EXAMPLE_author author cpp)
+set(EXAMPLE_par par cpp)
+set(EXAMPLE_overload overload cpp)
+set(EXAMPLE_example example cpp)
+set(EXAMPLE_include include cpp)
+set(EXAMPLE_qtstyle qtstyle cpp)
+set(EXAMPLE_jdstyle jdstyle cpp)
+set(EXAMPLE_autolink autolink cpp)
+set(EXAMPLE_restypedef restypedef cpp)
+set(EXAMPLE_tag tag cpp example)
+set(EXAMPLE_group group cpp)
+set(EXAMPLE_memgrp memgrp cpp)
+set(EXAMPLE_templ templ cpp)
+set(EXAMPLE_page page doc)
+set(EXAMPLE_docstring docstring py)
+set(EXAMPLE_pyexample pyexample py)
+set(EXAMPLE_manual manual c)
+set(EXAMPLE_mux mux vhdl)
+
set(BASIC_EXAMPLES
- class:h
- define:h
- enum:h
- file:h
- func:h
- javadoc-banner:h
- structcmd:h
- afterdoc:h
- relates:cpp
- author:cpp
- par:cpp
- overload:cpp
- example:cpp
- include:cpp
- qtstyle:cpp
- jdstyle:cpp
- autolink:cpp
- restypedef:cpp
- tag:cpp
- group:cpp
- memgrp:cpp
- templ:cpp
- page:doc
- docstring:py
- pyexample:py
- manual:c
- mux:vhdl
+ EXAMPLE_class EXAMPLE_define EXAMPLE_enum EXAMPLE_file EXAMPLE_func
+ EXAMPLE_javadoc EXAMPLE_structcmd EXAMPLE_afterdoc EXAMPLE_relates EXAMPLE_author
+ EXAMPLE_par EXAMPLE_overload EXAMPLE_example EXAMPLE_include EXAMPLE_qtstyle
+ EXAMPLE_jdstyle EXAMPLE_autolink EXAMPLE_restypedef EXAMPLE_tag EXAMPLE_group
+ EXAMPLE_memgrp EXAMPLE_templ EXAMPLE_page EXAMPLE_docstring EXAMPLE_pyexample
+ EXAMPLE_manual EXAMPLE_mux
)
foreach (f_inp ${BASIC_EXAMPLES})
- string(REGEX REPLACE ".*:" "" f_ext ${f_inp})
- string(REGEX REPLACE ":.*" "" f ${f_inp})
+ list(LENGTH ${f_inp} f_len)
+ list(GET ${f_inp} 0 f)
+ list(GET ${f_inp} 1 f_ext)
+ set(f_dep "")
+ if (${f_len} GREATER 2)
+ list(GET ${f_inp} 2 f_dep)
+ set(f_dep "${PROJECT_BINARY_DIR}/html/examples/${f_dep}/html/index.html")
+ endif()
add_custom_command(
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/html/examples/${f}
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/latex/examples/${f}
COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen ${f}.cfg
COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman.tex > ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman_doc.tex
- DEPENDS doxygen ${f}.${f_ext} ${f}.cfg ${TOP}/examples/strip_example.py
+ DEPENDS doxygen ${f}.${f_ext} ${f}.cfg ${TOP}/examples/strip_example.py ${f_dep}
OUTPUT ${PROJECT_BINARY_DIR}/html/examples/${f}/html/index.html ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman_doc.tex
)
set(EXAMPLES_RES ${EXAMPLES_RES} "" ${PROJECT_BINARY_DIR}/html/examples/${f}/html/index.html)
diff --git a/examples/afterdoc.cfg b/examples/afterdoc.cfg
index 71c2a88..51fa3e0 100644
--- a/examples/afterdoc.cfg
+++ b/examples/afterdoc.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "AfterDocs"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/afterdoc/html
LATEX_OUTPUT = latex/examples/afterdoc/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = afterdoc.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/author.cfg b/examples/author.cfg
index 1107e2c..0772ba4 100644
--- a/examples/author.cfg
+++ b/examples/author.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Author Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/author/html
LATEX_OUTPUT = latex/examples/author/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = author.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/autolink.cfg b/examples/autolink.cfg
index 25607eb..fa98594 100644
--- a/examples/autolink.cfg
+++ b/examples/autolink.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Automatic link generation"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/autolink/html
LATEX_OUTPUT = latex/examples/autolink/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = autolink.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/baseexample.cfg b/examples/baseexample.cfg
new file mode 100644
index 0000000..51b7cc7
--- /dev/null
+++ b/examples/baseexample.cfg
@@ -0,0 +1,9 @@
+OUTPUT_DIRECTORY = ..
+CASE_SENSE_NAMES = NO
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
+LATEX_HIDE_INDICES = YES
+COMPACT_LATEX = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
+HTML_COLORSTYLE = LIGHT
diff --git a/examples/class.cfg b/examples/class.cfg
index c8c8bdc..b82607e 100644
--- a/examples/class.cfg
+++ b/examples/class.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Class Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/class/html
LATEX_OUTPUT = latex/examples/class/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = class.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/define.cfg b/examples/define.cfg
index 63662c5..4d19551 100644
--- a/examples/define.cfg
+++ b/examples/define.cfg
@@ -1,17 +1,7 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Define Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/define/html
LATEX_OUTPUT = latex/examples/define/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = define.h
STRIP_CODE_COMMENTS = NO
ENABLE_PREPROCESSING = YES
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/diagrams.cfg b/examples/diagrams.cfg
index 04d972c..5a5444d 100644
--- a/examples/diagrams.cfg
+++ b/examples/diagrams.cfg
@@ -1,20 +1,10 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Diagrams"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/diagrams/html
LATEX_OUTPUT = latex/examples/diagrams/latex
HAVE_DOT = YES
EXTRACT_ALL = YES
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
ENABLE_PREPROCESSING = YES
INPUT = .
STRIP_CODE_COMMENTS = NO
FILE_PATTERNS = diagrams_*.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/docstring.cfg b/examples/docstring.cfg
index 2e18b0a..f7f73c0 100644
--- a/examples/docstring.cfg
+++ b/examples/docstring.cfg
@@ -1,16 +1,7 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Python"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/docstring/html
LATEX_OUTPUT = latex/examples/docstring/latex
EXTRACT_ALL = YES
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
OPTIMIZE_OUTPUT_JAVA = YES
INPUT = docstring.py
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/enum.cfg b/examples/enum.cfg
index 8439b6f..fc45d5f 100644
--- a/examples/enum.cfg
+++ b/examples/enum.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Enum Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/enum/html
LATEX_OUTPUT = latex/examples/enum/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = enum.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/example.cfg b/examples/example.cfg
index 1f8809d..ff535d0 100644
--- a/examples/example.cfg
+++ b/examples/example.cfg
@@ -1,17 +1,7 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Example Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/example/html
LATEX_OUTPUT = latex/examples/example/latex
GENERATE_TAGFILE = example.tag
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = example.cpp
EXAMPLE_PATH = example_test.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/file.cfg b/examples/file.cfg
index 1137fec..d74fa4d 100644
--- a/examples/file.cfg
+++ b/examples/file.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "File Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/file/html
LATEX_OUTPUT = latex/examples/file/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = file.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/func.cfg b/examples/func.cfg
index a46a02d..1673298 100644
--- a/examples/func.cfg
+++ b/examples/func.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Fn Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/func/html
LATEX_OUTPUT = latex/examples/func/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = func.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/group.cfg b/examples/group.cfg
index 3d357fc..834550b 100644
--- a/examples/group.cfg
+++ b/examples/group.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Grouping"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/group/html
LATEX_OUTPUT = latex/examples/group/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = group.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/include.cfg b/examples/include.cfg
index 0a88b8b..bbd148d 100644
--- a/examples/include.cfg
+++ b/examples/include.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Include Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/include/html
LATEX_OUTPUT = latex/examples/include/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = include.cpp
EXAMPLE_PATH = include_test.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/javadoc-banner.cfg b/examples/javadoc-banner.cfg
index 06afc88..4327e17 100644
--- a/examples/javadoc-banner.cfg
+++ b/examples/javadoc-banner.cfg
@@ -1,18 +1,8 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Javadoc Banner"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/javadoc-banner/html
LATEX_OUTPUT = latex/examples/javadoc-banner/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = javadoc-banner.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
JAVADOC_BANNER = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
EXTRACT_ALL = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/jdstyle.cfg b/examples/jdstyle.cfg
index 7594b78..7d86d3e 100644
--- a/examples/jdstyle.cfg
+++ b/examples/jdstyle.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Javadoc Style"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/jdstyle/html
LATEX_OUTPUT = latex/examples/jdstyle/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = jdstyle.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/manual.cfg b/examples/manual.cfg
index aac6d2c..c3db5f9 100644
--- a/examples/manual.cfg
+++ b/examples/manual.cfg
@@ -1,21 +1,11 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Manual inheritance and membership"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/manual/html
LATEX_OUTPUT = latex/examples/manual/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = manual.c
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
TYPEDEF_HIDES_STRUCT = YES
INLINE_SOURCES = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/memgrp.cfg b/examples/memgrp.cfg
index ac68e69..398b617 100644
--- a/examples/memgrp.cfg
+++ b/examples/memgrp.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Member Grouping"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/memgrp/html
LATEX_OUTPUT = latex/examples/memgrp/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = memgrp.cpp
-QUIET = YES
DISTRIBUTE_GROUP_DOC = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/mux.cfg b/examples/mux.cfg
index bfc3472..e508c67 100644
--- a/examples/mux.cfg
+++ b/examples/mux.cfg
@@ -1,21 +1,12 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = Mux
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/mux/html
LATEX_OUTPUT = latex/examples/mux/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = mux.vhdl
OPTIMIZE_OUTPUT_VHDL = YES
-QUIET = YES
INHERIT_DOCS = YES
EXTRACT_PRIVATE = YES
HIDE_SCOPE_NAMES = YES
INHERIT_DOCS = NO
-SEARCHENGINE = NO
ENABLE_PREPROCESSING = NO
EXTRACT_PACKAGE = YES
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/overload.cfg b/examples/overload.cfg
index 2950b71..9d502c8 100644
--- a/examples/overload.cfg
+++ b/examples/overload.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Overloaded Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/overload/html
LATEX_OUTPUT = latex/examples/overload/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
SORT_MEMBER_DOCS = NO
INPUT = overload.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/page.cfg b/examples/page.cfg
index f5a1540..2a08bbc 100644
--- a/examples/page.cfg
+++ b/examples/page.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Page Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/page/html
LATEX_OUTPUT = latex/examples/page/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = page.doc
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/par.cfg b/examples/par.cfg
index 977cd07..cb67a09 100644
--- a/examples/par.cfg
+++ b/examples/par.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Par Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/par/html
LATEX_OUTPUT = latex/examples/par/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = par.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/pyexample.cfg b/examples/pyexample.cfg
index edbaeac..efce026 100644
--- a/examples/pyexample.cfg
+++ b/examples/pyexample.cfg
@@ -1,15 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Python"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/pyexample/html
LATEX_OUTPUT = latex/examples/pyexample/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
OPTIMIZE_OUTPUT_JAVA = YES
INPUT = pyexample.py
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/qtstyle.cfg b/examples/qtstyle.cfg
index 6c9f67a..7a6ff3a 100644
--- a/examples/qtstyle.cfg
+++ b/examples/qtstyle.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Qt Style"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/qtstyle/html
LATEX_OUTPUT = latex/examples/qtstyle/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = qtstyle.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/relates.cfg b/examples/relates.cfg
index 9c05def..7a7b784 100644
--- a/examples/relates.cfg
+++ b/examples/relates.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Relates Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/relates/html
LATEX_OUTPUT = latex/examples/relates/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = relates.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/restypedef.cfg b/examples/restypedef.cfg
index 76c07e4..564317a 100644
--- a/examples/restypedef.cfg
+++ b/examples/restypedef.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Resolving Typedefs"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/restypedef/html
LATEX_OUTPUT = latex/examples/restypedef/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = restypedef.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/strip_example.py b/examples/strip_example.py
index d88b893..bcdd14b 100644
--- a/examples/strip_example.py
+++ b/examples/strip_example.py
@@ -2,8 +2,8 @@ import sys
do_print = False
for line in sys.stdin:
if line.startswith("%--- Begin generated contents ---"):
- do_print = True
+ do_print = True
elif line.startswith("%--- End generated contents ---"):
- do_print = False
+ do_print = False
elif do_print:
- sys.stdout.write(line)
+ sys.stdout.write(line)
diff --git a/examples/structcmd.cfg b/examples/structcmd.cfg
index 7521516..bd08aba 100644
--- a/examples/structcmd.cfg
+++ b/examples/structcmd.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Structural commands"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/structcmd/html
LATEX_OUTPUT = latex/examples/structcmd/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = structcmd.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/tag.cfg b/examples/tag.cfg
index db0f621..761f19e 100644
--- a/examples/tag.cfg
+++ b/examples/tag.cfg
@@ -1,16 +1,6 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Tag Files"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/tag/html
LATEX_OUTPUT = latex/examples/tag/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = tag.cpp
TAGFILES = example.tag=../../example/html
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/templ.cfg b/examples/templ.cfg
index 3dbf4a5..073fec9 100644
--- a/examples/templ.cfg
+++ b/examples/templ.cfg
@@ -1,15 +1,5 @@
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Template Test"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/templ/html
LATEX_OUTPUT = latex/examples/templ/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = templ.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/jquery/Makefile b/jquery/Makefile
index 58cc224..c2f4950 100644
--- a/jquery/Makefile
+++ b/jquery/Makefile
@@ -1,5 +1,5 @@
JQUERY_VERSION = 3.6.0
-JQUERY_UI_VERSION = 1.12.1
+JQUERY_UI_VERSION = 1.13.2
SCROLL_VERSION = 2.1.2
POWERTIP_VERSION = 1.3.1
TOUCHPUNCH_VERSION = 0.2.3
diff --git a/jquery/README b/jquery/README
index 8f8dd12..cb42c16 100644
--- a/jquery/README
+++ b/jquery/README
@@ -1,7 +1,7 @@
Doxygen's jquery.js script is composed of minified versions of the following
packages:
- jquery 3.6.0: https://jquery.com/download/
-- jquery.ui 1.12.1: https://github.com/jquery/jquery-ui
+- jquery.ui 1.13.2: https://github.com/jquery/jquery-ui
modules required:
- jquery.ui.core all
- jquery.ui.interactions resizable
diff --git a/jquery/jquery.ui-1.12.1.min.js b/jquery/jquery.ui-1.12.1.min.js
deleted file mode 100644
index 057a921..0000000
--- a/jquery/jquery.ui-1.12.1.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2019-01-27
-* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}t.ui=t.ui||{},t.ui.version="1.12.1";var i=0,s=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,n,o=s.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,m,g,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),x={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,m=_.offset,g=t.extend({},m),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?g.left+=p:"center"===n.at[0]&&(g.left+=p/2),"bottom"===n.at[1]?g.top+=f:"center"===n.at[1]&&(g.top+=f/2),u=e(x.at,p,f),g.left+=u[0],g.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),k=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},g),T=e(x.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:k,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=m.left-D.left,i=e+p-l,s=m.top-D.top,r=s+f-c,u={target:{element:v,left:m.left,top:m.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element
-},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable}); \ No newline at end of file
diff --git a/jquery/jquery.ui-1.13.2.min.js b/jquery/jquery.ui-1.13.2.min.js
new file mode 100644
index 0000000..a0725f3
--- /dev/null
+++ b/jquery/jquery.ui-1.13.2.min.js
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.13.2 - 2022-08-01
+* http://jqueryui.com
+* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(y){"use strict";y.ui=y.ui||{};y.ui.version="1.13.2";var n,i=0,h=Array.prototype.hasOwnProperty,a=Array.prototype.slice;y.cleanData=(n=y.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=y._data(i,"events"))&&e.remove&&y(i).triggerHandler("remove");n(t)}),y.widget=function(t,i,e){var s,n,o,h={},a=t.split(".")[0],r=a+"-"+(t=t.split(".")[1]);return e||(e=i,i=y.Widget),Array.isArray(e)&&(e=y.extend.apply(null,[{}].concat(e))),y.expr.pseudos[r.toLowerCase()]=function(t){return!!y.data(t,r)},y[a]=y[a]||{},s=y[a][t],n=y[a][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},y.extend(n,s,{version:e.version,_proto:y.extend({},e),_childConstructors:[]}),(o=new i).options=y.widget.extend({},o.options),y.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}h[e]="function"==typeof s?function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}:s}),n.prototype=y.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},h,{constructor:n,namespace:a,widgetName:t,widgetFullName:r}),s?(y.each(s._childConstructors,function(t,e){var i=e.prototype;y.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),y.widget.bridge(t,n),n},y.widget.extend=function(t){for(var e,i,s=a.call(arguments,1),n=0,o=s.length;n<o;n++)for(e in s[n])i=s[n][e],h.call(s[n],e)&&void 0!==i&&(y.isPlainObject(i)?t[e]=y.isPlainObject(t[e])?y.widget.extend({},t[e],i):y.widget.extend({},i):t[e]=i);return t},y.widget.bridge=function(o,e){var h=e.prototype.widgetFullName||o;y.fn[o]=function(i){var t="string"==typeof i,s=a.call(arguments,1),n=this;return t?this.length||"instance"!==i?this.each(function(){var t,e=y.data(this,h);return"instance"===i?(n=e,!1):e?"function"!=typeof e[i]||"_"===i.charAt(0)?y.error("no such method '"+i+"' for "+o+" widget instance"):(t=e[i].apply(e,s))!==e&&void 0!==t?(n=t&&t.jquery?n.pushStack(t.get()):t,!1):void 0:y.error("cannot call methods on "+o+" prior to initialization; attempted to call method '"+i+"'")}):n=void 0:(s.length&&(i=y.widget.extend.apply(null,[i].concat(s))),this.each(function(){var t=y.data(this,h);t?(t.option(i||{}),t._init&&t._init()):y.data(this,h,new e(i,this))})),n}},y.Widget=function(){},y.Widget._childConstructors=[],y.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n<i.length-1;n++)s[i[n]]=s[i[n]]||{},s=s[i[n]];if(t=i.pop(),1===arguments.length)return void 0===s[t]?null:s[t];s[t]=e}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=e}return this._setOptions(o),this},_setOptions:function(t){for(var e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(t){var e,i,s;for(e in t)s=this.classesElementLookup[e],t[e]!==this.options.classes[e]&&s&&s.length&&(i=y(s.get()),this._removeClass(s,e),i.addClass(this._classes({element:i,keys:e,classes:t,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(n){var o=[],h=this;function t(t,e){for(var i,s=0;s<t.length;s++)i=h.classesElementLookup[t[s]]||y(),i=n.add?(function(){var i=[];n.element.each(function(t,e){y.map(h.classesElementLookup,function(t){return t}).some(function(t){return t.is(e)})||i.push(e)}),h._on(y(i),{remove:"_untrackClassesElement"})}(),y(y.uniqueSort(i.get().concat(n.element.get())))):y(i.not(n.element).get()),h.classesElementLookup[t[s]]=i,o.push(t[s]),e&&n.classes[t[s]]&&o.push(n.classes[t[s]])}return(n=y.extend({element:this.element,classes:this.options.classes||{}},n)).keys&&t(n.keys.match(/\S+/g)||[],!0),n.extra&&t(n.extra.match(/\S+/g)||[]),o.join(" ")},_untrackClassesElement:function(i){var s=this;y.each(s.classesElementLookup,function(t,e){-1!==y.inArray(i.target,e)&&(s.classesElementLookup[t]=y(e.not(i.target).get()))}),this._off(y(i.target))},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){var n="string"==typeof t||null===t,i={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s="boolean"==typeof s?s:i};return i.element.toggleClass(this._classes(i),s),this},_on:function(n,o,t){var h,a=this;"boolean"!=typeof n&&(t=o,o=n,n=!1),t?(o=h=y(o),this.bindings=this.bindings.add(o)):(t=o,o=this.element,h=this.widget()),y.each(t,function(t,e){function i(){if(n||!0!==a.options.disabled&&!y(this).hasClass("ui-state-disabled"))return("string"==typeof e?a[e]:e).apply(a,arguments)}"string"!=typeof e&&(i.guid=e.guid=e.guid||i.guid||y.guid++);var s=t.match(/^([\w:-]*)\s*(.*)$/),t=s[1]+a.eventNamespace,s=s[2];s?h.on(t,s,i):o.on(t,i)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.off(e),this.bindings=y(this.bindings.not(t).get()),this.focusable=y(this.focusable.not(t).get()),this.hoverable=y(this.hoverable.not(t).get())},_delay:function(t,e){var i=this;return setTimeout(function(){return("string"==typeof t?i[t]:t).apply(i,arguments)},e||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){this._addClass(y(t.currentTarget),null,"ui-state-hover")},mouseleave:function(t){this._removeClass(y(t.currentTarget),null,"ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){this._addClass(y(t.currentTarget),null,"ui-state-focus")},focusout:function(t){this._removeClass(y(t.currentTarget),null,"ui-state-focus")}})},_trigger:function(t,e,i){var s,n,o=this.options[t];if(i=i||{},(e=y.Event(e)).type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),e.target=this.element[0],n=e.originalEvent)for(s in n)s in e||(e[s]=n[s]);return this.element.trigger(e,i),!("function"==typeof o&&!1===o.apply(this.element[0],[e].concat(i))||e.isDefaultPrevented())}},y.each({show:"fadeIn",hide:"fadeOut"},function(o,h){y.Widget.prototype["_"+o]=function(e,t,i){var s,n=(t="string"==typeof t?{effect:t}:t)?!0!==t&&"number"!=typeof t&&t.effect||h:o;"number"==typeof(t=t||{})?t={duration:t}:!0===t&&(t={}),s=!y.isEmptyObject(t),t.complete=i,t.delay&&e.delay(t.delay),s&&y.effects&&y.effects.effect[n]?e[o](t):n!==o&&e[n]?e[n](t.duration,t.easing,i):e.queue(function(t){y(this)[o](),i&&i.call(e[0]),t()})}});var s,x,D,o,r,l,u,p,W;y.widget;function E(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function H(t,e){return parseInt(y.css(t,e),10)||0}function S(t){return null!=t&&t===t.window}x=Math.max,D=Math.abs,o=/left|center|right/,r=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,u=/^\w+/,p=/%$/,W=y.fn.position,y.position={scrollbarWidth:function(){if(void 0!==s)return s;var t,e=y("<div style='display:block;position:absolute;width:200px;height:200px;overflow:hidden;'><div style='height:300px;width:auto;'></div></div>"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.width<t.element[0].scrollWidth;return{width:"scroll"===i||"auto"===i&&t.height<t.element[0].scrollHeight?y.position.scrollbarWidth():0,height:e?y.position.scrollbarWidth():0}},getWithinInfo:function(t){var e=y(t||window),i=S(e[0]),s=!!e[0]&&9===e[0].nodeType;return{element:e,isWindow:i,isDocument:s,offset:!i&&!s?y(t).offset():{left:0,top:0},scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop(),width:e.outerWidth(),height:e.outerHeight()}}},y.fn.position=function(p){if(!p||!p.of)return W.apply(this,arguments);var d,c,f,g,m,t,_="string"==typeof(p=y.extend({},p)).of?y(document).find(p.of):y(p.of),w=y.position.getWithinInfo(p.within),v=y.position.getScrollInfo(w),b=(p.collision||"flip").split(" "),z={},e=9===(t=(e=_)[0]).nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:S(t)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:t.preventDefault?{width:0,height:0,offset:{top:t.pageY,left:t.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()};return _[0].preventDefault&&(p.at="left top"),c=e.width,f=e.height,m=y.extend({},g=e.offset),y.each(["my","at"],function(){var t,e,i=(p[this]||"").split(" ");(i=1===i.length?o.test(i[0])?i.concat(["center"]):r.test(i[0])?["center"].concat(i):["center","center"]:i)[0]=o.test(i[0])?i[0]:"center",i[1]=r.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),z[this]=[t?t[0]:0,e?e[0]:0],p[this]=[u.exec(i[0])[0],u.exec(i[1])[0]]}),1===b.length&&(b[1]=b[0]),"right"===p.at[0]?m.left+=c:"center"===p.at[0]&&(m.left+=c/2),"bottom"===p.at[1]?m.top+=f:"center"===p.at[1]&&(m.top+=f/2),d=E(z.at,c,f),m.left+=d[0],m.top+=d[1],this.each(function(){var i,t,h=y(this),a=h.outerWidth(),r=h.outerHeight(),e=H(this,"marginLeft"),s=H(this,"marginTop"),n=a+e+H(this,"marginRight")+v.width,o=r+s+H(this,"marginBottom")+v.height,l=y.extend({},m),u=E(z.my,h.outerWidth(),h.outerHeight());"right"===p.my[0]?l.left-=a:"center"===p.my[0]&&(l.left-=a/2),"bottom"===p.my[1]?l.top-=r:"center"===p.my[1]&&(l.top-=r/2),l.left+=u[0],l.top+=u[1],i={marginLeft:e,marginTop:s},y.each(["left","top"],function(t,e){y.ui.position[b[t]]&&y.ui.position[b[t]][e](l,{targetWidth:c,targetHeight:f,elemWidth:a,elemHeight:r,collisionPosition:i,collisionWidth:n,collisionHeight:o,offset:[d[0]+u[0],d[1]+u[1]],my:p.my,at:p.at,within:w,elem:h})}),p.using&&(t=function(t){var e=g.left-l.left,i=e+c-a,s=g.top-l.top,n=s+f-r,o={target:{element:_,left:g.left,top:g.top,width:c,height:f},element:{element:h,left:l.left,top:l.top,width:a,height:r},horizontal:i<0?"left":0<e?"right":"center",vertical:n<0?"top":0<s?"bottom":"middle"};c<a&&D(e+i)<c&&(o.horizontal="center"),f<r&&D(s+n)<f&&(o.vertical="middle"),x(D(e),D(i))>x(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0<h&&a<=0?(i=t.left+h+e.collisionWidth-n-s,t.left+=h-i):t.left=!(0<a&&h<=0)&&a<h?s+n-e.collisionWidth:s:0<h?t.left+=h:0<a?t.left-=a:t.left=x(t.left-o,t.left)},top:function(t,e){var i=e.within,s=i.isWindow?i.scrollTop:i.offset.top,n=e.within.height,o=t.top-e.collisionPosition.marginTop,h=s-o,a=o+e.collisionHeight-n-s;e.collisionHeight>n?0<h&&a<=0?(i=t.top+h+e.collisionHeight-n-s,t.top+=h-i):t.top=!(0<a&&h<=0)&&a<h?s+n-e.collisionHeight:s:0<h?t.top+=h:0<a?t.top-=a:t.top=x(t.top-o,t.top)}},flip:{left:function(t,e){var i=e.within,s=i.offset.left+i.scrollLeft,n=i.width,o=i.isWindow?i.scrollLeft:i.offset.left,h=t.left-e.collisionPosition.marginLeft,a=h-o,r=h+e.collisionWidth-n-o,l="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,i="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,h=-2*e.offset[0];a<0?((s=t.left+l+i+h+e.collisionWidth-n-s)<0||s<D(a))&&(t.left+=l+i+h):0<r&&(0<(o=t.left-e.collisionPosition.marginLeft+l+i+h-o)||D(o)<r)&&(t.left+=l+i+h)},top:function(t,e){var i=e.within,s=i.offset.top+i.scrollTop,n=i.height,o=i.isWindow?i.scrollTop:i.offset.top,h=t.top-e.collisionPosition.marginTop,a=h-o,r=h+e.collisionHeight-n-o,l="top"===e.my[1]?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,i="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,h=-2*e.offset[1];a<0?((s=t.top+l+i+h+e.collisionHeight-n-s)<0||s<D(a))&&(t.top+=l+i+h):0<r&&(0<(o=t.top-e.collisionPosition.marginTop+l+i+h-o)||D(o)<r)&&(t.top+=l+i+h)}},flipfit:{left:function(){y.ui.position.flip.left.apply(this,arguments),y.ui.position.fit.left.apply(this,arguments)},top:function(){y.ui.position.flip.top.apply(this,arguments),y.ui.position.fit.top.apply(this,arguments)}}};var t;y.ui.position,y.extend(y.expr.pseudos,{data:y.expr.createPseudo?y.expr.createPseudo(function(e){return function(t){return!!y.data(t,e)}}):function(t,e,i){return!!y.data(t,i[3])}}),y.fn.extend({disableSelection:(t="onselectstart"in document.createElement("div")?"selectstart":"mousedown",function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}),enableSelection:function(){return this.off(".ui-disableSelection")}});y.ui.focusable=function(t,e){var i,s,n,o,h=t.nodeName.toLowerCase();return"area"===h?(s=(i=t.parentNode).name,!(!t.href||!s||"map"!==i.nodeName.toLowerCase())&&(0<(s=y("img[usemap='#"+s+"']")).length&&s.is(":visible"))):(/^(input|select|textarea|button|object)$/.test(h)?(n=!t.disabled)&&(o=y(t).closest("fieldset")[0])&&(n=!o.disabled):n="a"===h&&t.href||e,n&&y(t).is(":visible")&&function(t){var e=t.css("visibility");for(;"inherit"===e;)t=t.parent(),e=t.css("visibility");return"visible"===e}(y(t)))},y.extend(y.expr.pseudos,{focusable:function(t){return y.ui.focusable(t,null!=y.attr(t,"tabindex"))}});var e,d;y.ui.focusable,y.fn._form=function(){return"string"==typeof this[0].form?this.closest("form"):y(this[0].form)},y.ui.formResetMixin={_formResetHandler:function(){var e=y(this);setTimeout(function(){var t=e.data("ui-form-reset-instances");y.each(t,function(){this.refresh()})})},_bindFormResetHandler:function(){var t;this.form=this.element._form(),this.form.length&&((t=this.form.data("ui-form-reset-instances")||[]).length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t))},_unbindFormResetHandler:function(){var t;this.form.length&&((t=this.form.data("ui-form-reset-instances")).splice(y.inArray(this,t),1),t.length?this.form.data("ui-form-reset-instances",t):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset"))}};y.expr.pseudos||(y.expr.pseudos=y.expr[":"]),y.uniqueSort||(y.uniqueSort=y.unique),y.escapeSelector||(e=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,d=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},y.escapeSelector=function(t){return(t+"").replace(e,d)}),y.fn.even&&y.fn.odd||y.fn.extend({even:function(){return this.filter(function(t){return t%2==0})},odd:function(){return this.filter(function(t){return t%2==1})}});y.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},y.fn.labels=function(){var t,e,i;return this.length?this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),(t=this.attr("id"))&&(i=(i=this.eq(0).parents().last()).add((i.length?i:this).siblings()),t="label[for='"+y.escapeSelector(t)+"']",e=e.add(i.find(t).addBack(t))),this.pushStack(e)):this.pushStack([])},y.fn.scrollParent=function(t){var e=this.css("position"),i="absolute"===e,s=t?/(auto|scroll|hidden)/:/(auto|scroll)/,t=this.parents().filter(function(){var t=y(this);return(!i||"static"!==t.css("position"))&&s.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&t.length?t:y(this[0].ownerDocument||document)},y.extend(y.expr.pseudos,{tabbable:function(t){var e=y.attr(t,"tabindex"),i=null!=e;return(!i||0<=e)&&y.ui.focusable(t,i)}}),y.fn.extend({uniqueId:(c=0,function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++c)})}),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&y(this).removeAttr("id")})}}),y.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c,f=!1;y(document).on("mouseup",function(){f=!1});y.widget("ui.mouse",{version:"1.13.2",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(t){if(!0===y.data(t.target,e.widgetName+".preventClickEvent"))return y.removeData(t.target,e.widgetName+".preventClickEvent"),t.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!f){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var e=this,i=1===t.which,s=!("string"!=typeof this.options.cancel||!t.target.nodeName)&&y(t.target).closest(this.options.cancel).length;return i&&!s&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(t),!this._mouseStarted)?(t.preventDefault(),!0):(!0===y.data(t.target,this.widgetName+".preventClickEvent")&&y.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return e._mouseMove(t)},this._mouseUpDelegate=function(t){return e._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),f=!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(y.ui.ie&&(!document.documentMode||document.documentMode<9)&&!t.button)return this._mouseUp(t);if(!t.which)if(t.originalEvent.altKey||t.originalEvent.ctrlKey||t.originalEvent.metaKey||t.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,t),this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&y.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,f=!1,t.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n<o.length;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}};y.widget("ui.resizable",y.ui.mouse,{version:"1.13.2",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(t,e){if("hidden"===y(t).css("overflow"))return!1;var i=e&&"left"===e?"scrollLeft":"scrollTop",e=!1;if(0<t[i])return!0;try{t[i]=1,e=0<t[i],t[i]=0}catch(t){}return e},_create:function(){var t,e=this.options,i=this;this._addClass("ui-resizable"),y.extend(this,{_aspectRatio:!!e.aspectRatio,aspectRatio:e.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:e.helper||e.ghost||e.animate?e.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(y("<div class='ui-wrapper'></div>").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e<i.length;e++)s="ui-resizable-"+(t=String.prototype.trim.call(i[e])),n=y("<div>"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),s<n.maxWidth&&(n.maxWidth=s),t<n.maxHeight&&(n.maxHeight=t)),this._vBoundaries=n},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e<this._proportionallyResizeElements.length;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,e=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||y("<div></div>").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidth<d,g=i.maxHeight&&i.maxHeight<c,m=i.minWidth&&i.minWidth>d,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0<c-l?(e.size.height=c,e.position.top=o.top-p):(c=l-t.height,e.size.height=c,e.position.top=o.top+n.height-c),0<d-r?(e.size.width=d,e.position.left=o.left-u):(d=r-t.width,e.size.width=d,e.position.left=o.left+n.width-d))}});y.ui.resizable}); \ No newline at end of file
diff --git a/jquery/sass/_sm-dox.scss b/jquery/sass/_sm-dox.scss
index e1db779..467afec 100644
--- a/jquery/sass/_sm-dox.scss
+++ b/jquery/sass/_sm-dox.scss
@@ -33,7 +33,7 @@ $sm-dox__desktop-vp: 768px !default; // swi
// :: 1.3. Typography
// ----------------------------------------------------------
-$sm-dox__font-family: "Lucida Grande", "Geneva", "Helvetica", Arial, sans-serif !default;
+$sm-dox__font-family: var(--font-family-nav) !default;
$sm-dox__font-size-base: 13px !default;
$sm-dox__font-size-small: 12px !default;
$sm-dox__line-height: 15px !default;
@@ -53,21 +53,21 @@ $sm-dox__border-radius: 5px !default;
// Menu box
//$sm-dox__collapsible-bg: $sm-dox__gray !default;
-$sm-dox__collapsible-bg: url('tab_b.png') !default;
+$sm-dox__collapsible-bg: var(--nav-gradient-image) !default;
$sm-dox__collapsible-border-radius: $sm-dox__border-radius !default;
// Items
-$sm-dox__collapsible-item-color: $sm-dox__gray-darker !default;
+$sm-dox__collapsible-item-color: var(--nav-menu-foreground-color) !default; //$sm-dox__gray-darker !default;
$sm-dox__collapsible-item-current-color: $sm-dox__red !default;
$sm-dox__collapsible-item-disabled-color: darken($sm-dox__gray, 20%) !default;
-$sm-dox__collapsible-item-padding-vertical: 0px !default;
-$sm-dox__collapsible-item-padding-horizontal: 12px !default;
+$sm-dox__collapsible-item-padding-vertical: 0px !default;
+$sm-dox__collapsible-item-padding-horizontal: 12px !default;
// Items separators
$sm-dox__collapsible-separators-color: rgba(0, 0, 0, 0.05) !default;
// Toggle button (sub menu indicators)
-$sm-dox__collapsible-toggle-bg: rgba(255, 255, 255, 0.5) !default;
+$sm-dox__collapsible-toggle-bg: var(--nav-menu-toggle-color) !default; //rgba(255, 255, 255, 0.5) !default;
// ----------------------------------------------------------
@@ -75,7 +75,7 @@ $sm-dox__collapsible-toggle-bg: rgba(255, 255, 255, 0.5) !
// ----------------------------------------------------------
// Menu box
-$sm-dox__collapsible-sub-bg: rgba(darken($sm-dox__gray, 30%), 0.1) !default;
+$sm-dox__collapsible-sub-bg: var(--nav-menu-background-color) !default; // rgba(darken($sm-dox__gray, 30%), 0.1) !default;
// Items text indentation for deeper levels
$sm-dox__collapsible-sub-item-indentation: 8px !default;
@@ -87,14 +87,14 @@ $sm-dox__collapsible-sub-item-indentation: 8px !default;
// Menu box
//$sm-dox__desktop-bg: $sm-dox__gray !default;
-$sm-dox__desktop-bg: url('tab_b.png') !default;
+$sm-dox__desktop-bg: var(--nav-gradient-image) !default;
//$sm-dox__desktop-border-radius: 100px !default;
$sm-dox__desktop-padding-horizontal: 10px !default;
// Items
-$sm-dox__desktop-item-color: $sm-dox__gray_darker !default;
-$sm-dox__desktop-item-hover-color: $sm-dox__red !default;
-$sm-dox__desktop-item-current-color: $sm-dox__red !default;
+$sm-dox__desktop-item-color: var(--nav-text-normal-color) !default; //$sm-dox__gray_darker !default;
+$sm-dox__desktop-item-hover-color: var(--nav-text-hover-color) !default; //$sm-dox__red !default;
+$sm-dox__desktop-item-current-color: var(--nav-text-disabled-color) !default; //$sm-dox__red !default;
$sm-dox__desktop-item-disabled-color: darken($sm-dox__gray, 20%) !default;
$sm-dox__desktop-item-padding-vertical: 0px !default;
$sm-dox__desktop-item-padding-horizontal: 12px !default;
@@ -113,15 +113,15 @@ $sm-dox__desktop-vertical-item-hover-bg: $sm-dox__white !default;
$sm-dox__desktop-vertical-item-padding-vertical: 10px !default;
$sm-dox__desktop-vertical-item-padding-horizontal: 20px !default;
-$sm-dox__main-text-color: #283A5D !default;
-$sm-dox__main-highlight-color: white !default;
+$sm-dox__main-text-color: var(--nav-text-normal-color) !default; // #283A5D !default;
+$sm-dox__main-highlight-color: var(--nav-text-hover-color) !default; // white !default;
// ----------------------------------------------------------
// :: 1.8. Desktop sub menus
// ----------------------------------------------------------
// Menu box
-$sm-dox__desktop-sub-bg: $sm-dox__white !default;
+$sm-dox__desktop-sub-bg: var(--nav-menu-background-color) !default; //$sm-dox__white !default;
$sm-dox__desktop-sub-border-color: $sm-dox__gray-dark !default;
$sm-dox__desktop-sub-border-radius: $sm-dox__border-radius !default;
$sm-dox__desktop-sub-box-shadow: 0 5px 9px $sm-dox__box-shadow !default;
@@ -129,7 +129,7 @@ $sm-dox__desktop-sub-padding-vertical: 5px !default;
$sm-dox__desktop-sub-padding-horizontal: 0 !default;
// Items
-$sm-dox__desktop-sub-item-color: $sm-dox__gray_darker !default;
+$sm-dox__desktop-sub-item-color: var(--nav-menu-foreground-color) !default; //$sm-dox__gray_darker !default;
$sm-dox__desktop-sub-item-hover-color: $sm-dox__red !default;
$sm-dox__desktop-sub-item-hover-bg: $sm-dox__gray !default;
$sm-dox__desktop-sub-item-current-color: $sm-dox__red !default;
@@ -181,16 +181,16 @@ $sm-dox__toggle-spacing: floor($sm-dox__main-row-height * 0.1);
font-weight: bold;
line-height: 36px; //$sm-dox__line-height;
text-decoration: none;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-shadow: var(--nav-text-normal-shadow);
color: $sm-dox__main-text-color;
outline: none;
}
&:hover {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
color: $sm-dox__main-highlight-color;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-shadow: var(--nav-text-hover-shadow);
}
&.current {
@@ -260,14 +260,14 @@ $sm-dox__toggle-spacing: floor($sm-dox__main-row-height * 0.1);
//line-height: $sm-dox__line-height;
line-height: $sm-dox__main-row-height;
text-shadow: none;
- background-color: white;
+ background-color: var(--nav-menu-background-color);
background-image: none;
}
&:hover {
// color: $sm-dox__collapsible-item-current-color;
// background-color: $sm-dox__gray;
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
color: $sm-dox__main-highlight-color;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
@@ -332,16 +332,16 @@ $sm-dox__toggle-spacing: floor($sm-dox__main-row-height * 0.1);
&.highlighted {
padding: $sm-dox__desktop-item-padding-vertical $sm-dox__desktop-item-padding-horizontal;
/*color: $sm-dox__desktop-item-color;*/
- background-image:url('tab_s.png');
+ background-image:var(--nav-separator-image);
background-repeat:no-repeat;
background-position:right;
@include border-radius(0 !important);
}
&:hover {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
color: $sm-dox__main-highlight-color;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-shadow: var(--nav-text-hover-shadow);
span.sub-arrow {
border-color: $sm-dox__main-highlight-color transparent transparent transparent;
}
@@ -411,10 +411,10 @@ $sm-dox__toggle-spacing: floor($sm-dox__main-row-height * 0.1);
}
&:hover {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
color: $sm-dox__main-highlight-color;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-shadow: var(--nav-text-hover-shadow);
span.sub-arrow {
border-color: transparent transparent transparent $sm-dox__main-highlight-color;
}
diff --git a/jquery/sm-core-css.css b/jquery/sm-core-css.css
index 42f8c15..8a13876 100644
--- a/jquery/sm-core-css.css
+++ b/jquery/sm-core-css.css
@@ -28,7 +28,7 @@
left: 2px;
height: 2px;
width: 24px;
- background: #666;
+ background: var(--nav-menu-button-color);
-webkit-transition: all 0.25s;
transition: all 0.25s;
}
diff --git a/libmscgen/mscgen_lexer.l b/libmscgen/mscgen_lexer.l
index ea812f9..1573548 100644
--- a/libmscgen/mscgen_lexer.l
+++ b/libmscgen/mscgen_lexer.l
@@ -33,6 +33,9 @@
#include "mscgen_safe.h"
#include "mscgen_lexer.h"
#include "mscgen_language.h" /* Token definitions from Yacc/Bison */
+
+#define USE_STATE2STRING 0
+
/* Counter for error reporting */
static unsigned long lex_linenum = 1;
static char *lex_line = NULL;
@@ -42,6 +45,10 @@ static Boolean lex_utf8 = FALSE;
static void newline(const char *text, unsigned int n);
static char *trimQstring(char *s);
static const char *stateToString(int state);
+
+#if USE_STATE2STRING
+static const char *stateToString(int state);
+#endif
%}
/* Not used, so prevent compiler warning */
@@ -241,5 +248,7 @@ void lex_resetparser()
lex_utf8 = FALSE;
}
+#if USE_STATE2STRING
#include "mscgen_lexer.l.h"
+#endif
/* END OF FILE */
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9f7e653..e9df895 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -112,27 +112,59 @@ set(LEX_FILES scanner
lexscanner
configimpl)
+if (NOT depfile_supported)
+ # In case the DEPFILE possibility is not supported the complete list of lex include files for the dependency has to be used
+ set(LEX_INC_FILES)
+endif()
+
# unfortunately ${LEX_FILES_H} and ${LEX_FILES_CPP} don't work in older versions of CMake (like 3.6.2) for add_library
foreach(lex_file ${LEX_FILES})
set(LEX_FILES_H ${LEX_FILES_H} " " ${GENERATED_SRC}/${lex_file}.l.h CACHE INTERNAL "Stores generated files")
set(LEX_FILES_CPP ${LEX_FILES_CPP} " " ${GENERATED_SRC}/${lex_file}.cpp CACHE INTERNAL "Stores generated files")
+
+ if (depfile_supported)
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.d ${CMAKE_CURRENT_LIST_DIR}
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
+ DEPFILE ${GENERATED_SRC}/${lex_file}.d
+ OUTPUT ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.d
+ )
+ else()
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.d ${CMAKE_CURRENT_LIST_DIR}
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${LEX_INC_FILES}
+ OUTPUT ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.d
+ )
+ endif()
+ set_source_files_properties(${GENERATED_SRC}/${lex_file}.l PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC}/${lex_file}.corr PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC}/${lex_file}.d PROPERTIES GENERATED 1)
+
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l > ${GENERATED_SRC}/${lex_file}.l.h
- DEPENDS ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${GENERATED_SRC}/${lex_file}.l > ${GENERATED_SRC}/${lex_file}.l.h
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${GENERATED_SRC}/${lex_file}.l
OUTPUT ${GENERATED_SRC}/${lex_file}.l.h
)
set_source_files_properties(${GENERATED_SRC}/${lex_file}.l.h PROPERTIES GENERATED 1)
- # for code coverage we need the flex sources in the build src directory
- add_custom_command(
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/${lex_file}.l ${PROJECT_BINARY_DIR}/src/${lex_file}.l
- DEPENDS ${PROJECT_SOURCE_DIR}/src/${lex_file}.l
- OUTPUT ${PROJECT_BINARY_DIR}/src/${lex_file}.l
- )
+
+ if(enable_coverage)
+ # for code coverage we need the flex sources in the build src directory
+ add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy ${GENERATED_SRC}/${lex_file}.l ${PROJECT_BINARY_DIR}/src/${lex_file}.l
+ DEPENDS ${GENERATED_SRC}/${lex_file}.l
+ OUTPUT ${PROJECT_BINARY_DIR}/src/${lex_file}.l
+ )
+ endif()
FLEX_TARGET(${lex_file}
- ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
- ${GENERATED_SRC}/${lex_file}.cpp
+ ${GENERATED_SRC}/${lex_file}.l
+ ${GENERATED_SRC}/${lex_file}_intermediate.cpp
COMPILE_FLAGS "${LEX_FLAGS}")
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/post_lex.py ${GENERATED_SRC}/${lex_file}_intermediate.cpp ${GENERATED_SRC}/${lex_file}.cpp ${GENERATED_SRC}/${lex_file}.corr ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.l
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/post_lex.py ${GENERATED_SRC}/${lex_file}_intermediate.cpp ${GENERATED_SRC}/${lex_file}.corr
+ OUTPUT ${GENERATED_SRC}/${lex_file}.cpp
+ )
endforeach()
@@ -141,11 +173,13 @@ BISON_TARGET(constexp
${GENERATED_SRC}/ce_parse.cpp
COMPILE_FLAGS "${YACC_FLAGS}")
-add_custom_command(
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/constexp.y ${PROJECT_BINARY_DIR}/src
- DEPENDS ${PROJECT_SOURCE_DIR}/src/constexp.y
- OUTPUT ${PROJECT_BINARY_DIR}/src/constexp.y
-)
+if(enable_coverage)
+ add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/constexp.y ${PROJECT_BINARY_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/constexp.y
+ OUTPUT ${PROJECT_BINARY_DIR}/src/constexp.y
+ )
+endif()
add_library(doxycfg STATIC
${GENERATED_SRC}/configvalues.h
@@ -218,6 +252,7 @@ add_library(doxymain STATIC
condparser.cpp
context.cpp
cppvalue.cpp
+ datetime.cpp
defgen.cpp
definition.cpp
dia.cpp
diff --git a/src/cache.h b/src/cache.h
index 0ff3092..e218eb2 100644
--- a/src/cache.h
+++ b/src/cache.h
@@ -19,6 +19,7 @@
#include <list>
#include <unordered_map>
#include <mutex>
+#include <utility>
#include <ctype.h>
/*! Fixed size cache for value type V using keys of type K.
diff --git a/src/cite.cpp b/src/cite.cpp
index 611a4da..a20de12 100644
--- a/src/cite.cpp
+++ b/src/cite.cpp
@@ -32,6 +32,13 @@
const char *bibTmpFile = "bibTmpFile_";
const char *bibTmpDir = "bibTmpDir/";
+static QCString getBibFile(const QCString &inFile)
+{
+ QCString name = inFile;
+ if (!name.isEmpty() && !name.endsWith(".bib")) name+=".bib";
+ return name;
+}
+
class CiteInfoImpl : public CiteInfo
{
public:
@@ -202,8 +209,7 @@ void CitationManager::generatePage()
const StringVector &citeDataList = Config_getList(CITE_BIB_FILES);
for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata.c_str();
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QCString bibFile = getBibFile(QCString(bibdata));
insertCrossReferencesForBibFile(bibFile);
}
@@ -252,8 +258,7 @@ void CitationManager::generatePage()
int i = 0;
for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata.c_str();
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QCString bibFile = getBibFile(QCString(bibdata));
FileInfo fi(bibFile.str());
if (fi.exists())
{
@@ -341,9 +346,7 @@ void CitationManager::generatePage()
i = 0;
for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata.c_str();
- // Note: file can now have multiple dots
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QCString bibFile = getBibFile(QCString(bibdata));
FileInfo fi(bibFile.str());
if (fi.exists())
{
@@ -387,9 +390,7 @@ QCString CitationManager::latexBibFiles()
int i = 0;
for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata.c_str();
- // Note: file can now have multiple dots
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QCString bibFile = getBibFile(QCString(bibdata));
FileInfo fi(bibFile.str());
if (fi.exists())
{
diff --git a/src/clangparser.cpp b/src/clangparser.cpp
index a771d4f..d4c5de6 100644
--- a/src/clangparser.cpp
+++ b/src/clangparser.cpp
@@ -239,18 +239,18 @@ void ClangTUParser::parse()
SrcLangExt lang = getLanguageFromFileName(fileName);
if (lang==SrcLangExt_ObjC || p->detectedLang!=DetectedLang::Cpp)
{
- QCString fn = fileName;
+ QCString fn = fileName.lower();
if (p->detectedLang!=DetectedLang::Cpp &&
- (fn.right(4).lower()==".cpp" || fn.right(4).lower()==".cxx" ||
- fn.right(3).lower()==".cc" || fn.right(2).lower()==".c"))
+ (fn.endsWith(".cpp") || fn.endsWith(".cxx") ||
+ fn.endsWith(".cc") || fn.endsWith(".c")))
{ // fall back to C/C++ once we see an extension that indicates this
p->detectedLang = DetectedLang::Cpp;
}
- else if (fn.right(3).lower()==".mm") // switch to Objective C++
+ else if (fn.endsWith(".mm")) // switch to Objective C++
{
p->detectedLang = DetectedLang::ObjCpp;
}
- else if (fn.right(2).lower()==".m") // switch to Objective C
+ else if (fn.endsWith(".m")) // switch to Objective C
{
p->detectedLang = DetectedLang::ObjC;
}
diff --git a/src/classdef.cpp b/src/classdef.cpp
index c9d4906..ab95f3b 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -18,6 +18,7 @@
#include <cstdio>
#include <algorithm>
+#include "types.h"
#include "classdef.h"
#include "classlist.h"
#include "entry.h"
@@ -134,15 +135,10 @@ static QCString makeDisplayName(const ClassDef *cd,bool includeScope)
{
n=substitute(n,"::",sep);
}
- if (cd->compoundType()==ClassDef::Protocol && n.right(2)=="-p")
+ if (cd->compoundType()==ClassDef::Protocol && n.endsWith("-p"))
{
n="<"+n.left(n.length()-2)+">";
}
- //else if (n.right(2)=="-g")
- //{
- // n = n.left(n.length()-2);
- //}
- //printf("ClassDefImpl::displayName()=%s\n",qPrint(n));
return n;
}
@@ -191,7 +187,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
virtual const ArgumentList &templateArguments() const;
virtual FileDef *getFileDef() const;
virtual const MemberDef *getMemberByName(const QCString &) const;
- virtual bool isBaseClass(const ClassDef *bcd,bool followInstances,int level=0) const;
+ virtual int isBaseClass(const ClassDef *bcd,bool followInstances) const;
virtual bool isSubClass(ClassDef *bcd,int level=0) const;
virtual bool isAccessibleMember(const MemberDef *md) const;
virtual const TemplateInstanceList &getTemplateInstances() const;
@@ -439,8 +435,8 @@ class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
{ return getCdAlias()->getFileDef(); }
virtual const MemberDef *getMemberByName(const QCString &s) const
{ return getCdAlias()->getMemberByName(s); }
- virtual bool isBaseClass(const ClassDef *bcd,bool followInstances,int level=0) const
- { return getCdAlias()->isBaseClass(bcd,followInstances,level); }
+ virtual int isBaseClass(const ClassDef *bcd,bool followInstances) const
+ { return getCdAlias()->isBaseClass(bcd,followInstances); }
virtual bool isSubClass(ClassDef *bcd,int level=0) const
{ return getCdAlias()->isSubClass(bcd,level); }
virtual bool isAccessibleMember(const MemberDef *md) const
@@ -1278,7 +1274,7 @@ static void searchTemplateSpecs(/*in*/ const Definition *d,
const ClassDef *cd=toClassDef(d);
if (!name.isEmpty()) name+="::";
QCString clName = d->localName();
- if (/*clName.right(2)=="-g" ||*/ clName.right(2)=="-p")
+ if (clName.endsWith("-p"))
{
clName = clName.left(clName.length()-2);
}
@@ -3204,28 +3200,30 @@ void ClassDefImpl::setTemplateArguments(const ArgumentList &al)
m_impl->tempArgs = al;
}
-/*! Returns \c TRUE iff this class or a class inheriting from this class
- * is \e not defined in an external tag file.
- */
-bool ClassDefImpl::hasNonReferenceSuperClass() const
+static bool hasNonReferenceSuperClassRec(const ClassDef *cd,int level)
{
- bool found=!isReference() && isLinkableInProject() && !isHidden();
+ bool found=!cd->isReference() && cd->isLinkableInProject() && !cd->isHidden();
if (found)
{
return TRUE; // we're done if this class is not a reference
}
- for (const auto &ibcd : m_impl->inheritedBy)
+ for (const auto &ibcd : cd->subClasses())
{
- ClassDef *bcd=ibcd.classDef;
+ const ClassDef *bcd=ibcd.classDef;
+ if (level>256)
+ {
+ err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(cd->name()),qPrint(bcd->name()));
+ return FALSE;
+ }
// recurse into the super class branch
- found = found || bcd->hasNonReferenceSuperClass();
+ found = found || hasNonReferenceSuperClassRec(bcd,level+1);
if (!found)
{
// look for template instances that might have non-reference super classes
for (const auto &cil : bcd->getTemplateInstances())
{
// recurse into the template instance branch
- found = cil.classDef->hasNonReferenceSuperClass();
+ found = hasNonReferenceSuperClassRec(cil.classDef,level+1);
if (found) break;
}
}
@@ -3237,6 +3235,14 @@ bool ClassDefImpl::hasNonReferenceSuperClass() const
return found;
}
+/*! Returns \c TRUE iff this class or a class inheriting from this class
+ * is \e not defined in an external tag file.
+ */
+bool ClassDefImpl::hasNonReferenceSuperClass() const
+{
+ return hasNonReferenceSuperClassRec(this,0);
+}
+
QCString ClassDefImpl::requiresClause() const
{
return m_impl->requiresClause;
@@ -3359,26 +3365,40 @@ bool ClassDefImpl::hasDocumentation() const
//----------------------------------------------------------------------
// recursive function:
-// returns TRUE iff class definition 'bcd' represents an (in)direct base
-// class of class definition 'cd'.
+// returns the distance to the base class definition 'bcd' represents an (in)direct base
+// class of class definition 'cd' or 0 if it does not.
-bool ClassDefImpl::isBaseClass(const ClassDef *bcd, bool followInstances,int level) const
+int ClassDefImpl::isBaseClass(const ClassDef *bcd, bool followInstances) const
{
- bool found=FALSE;
+ int distance=0;
//printf("isBaseClass(cd=%s) looking for %s\n",qPrint(name()),qPrint(bcd->name()));
- if (level>256)
- {
- err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name()));
- return FALSE;
- }
for (const auto &bclass : baseClasses())
{
const ClassDef *ccd = bclass.classDef;
if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
- found = (ccd==bcd) || ccd->isBaseClass(bcd,followInstances,level+1);
- if (found) break;
+ if (ccd==bcd)
+ {
+ distance=1;
+ break; // no shorter path possible
+ }
+ else
+ {
+ int d = ccd->isBaseClass(bcd,followInstances);
+ if (d>256)
+ {
+ err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name()));
+ return 0;
+ }
+ else if (d>0) // path found
+ {
+ if (distance==0 || d+1<distance) // update if no path found yet or shorter path found
+ {
+ distance=d+1;
+ }
+ }
+ }
}
- return found;
+ return distance;
}
//----------------------------------------------------------------------
diff --git a/src/classdef.h b/src/classdef.h
index bd1a160..f991791 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -216,16 +216,14 @@ class ClassDef : public Definition
*/
virtual FileDef *getFileDef() const = 0;
- /** Returns the Java package this class is in or 0 if not applicable.
- */
-
+ /** Returns the member with the given name */
virtual const MemberDef *getMemberByName(const QCString &) const = 0;
/** Returns TRUE iff \a bcd is a direct or indirect base class of this
* class. This function will recursively traverse all branches of the
* inheritance tree.
*/
- virtual bool isBaseClass(const ClassDef *bcd,bool followInstances,int level=0) const = 0;
+ virtual int isBaseClass(const ClassDef *bcd,bool followInstances) const = 0;
/** Returns TRUE iff \a bcd is a direct or indirect sub class of this
* class.
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
index a5caede..0f83334 100644
--- a/src/cmdmapper.cpp
+++ b/src/cmdmapper.cpp
@@ -34,21 +34,25 @@ CommandMap cmdMap[] =
{ "b", CMD_BOLD },
{ "c", CMD_CODE },
{ "cite", CMD_CITE },
+ { "icode", CMD_ISTARTCODE },
{ "code", CMD_STARTCODE },
{ "copydoc", CMD_COPYDOC },
{ "copybrief", CMD_COPYBRIEF },
{ "copydetails", CMD_COPYDETAILS },
{ "copyright", CMD_COPYRIGHT },
{ "date", CMD_DATE },
+ { "showdate", CMD_SHOWDATE },
{ "dontinclude", CMD_DONTINCLUDE },
{ "dotfile", CMD_DOTFILE },
{ "e", CMD_EMPHASIS },
{ "em", CMD_EMPHASIS },
+ { "endicode", CMD_ENDICODE },
{ "endcode", CMD_ENDCODE },
{ "endhtmlonly", CMD_ENDHTMLONLY },
{ "endlatexonly", CMD_ENDLATEXONLY },
{ "endlink", CMD_ENDLINK },
{ "endsecreflist", CMD_ENDSECREFLIST },
+ { "endiverbatim", CMD_ENDIVERBATIM },
{ "endverbatim", CMD_ENDVERBATIM },
{ "endxmlonly", CMD_ENDXMLONLY },
{ "exception", CMD_EXCEPTION },
@@ -99,6 +103,7 @@ CommandMap cmdMap[] =
{ "xrefitem", CMD_XREFITEM },
{ "throw", CMD_EXCEPTION },
{ "until", CMD_UNTIL },
+ { "iverbatim", CMD_IVERBATIM },
{ "verbatim", CMD_VERBATIM },
{ "verbinclude", CMD_VERBINCLUDE },
{ "version", CMD_VERSION },
@@ -151,6 +156,7 @@ CommandMap cmdMap[] =
{ "maninclude", CMD_MANINCLUDE },
{ "xmlinclude", CMD_XMLINCLUDE },
{ "iline", CMD_ILINE },
+ { "ifile", CMD_IFILE },
{ "iliteral", CMD_ILITERAL },
{ "endiliteral", CMD_ENDILITERAL },
{ 0, 0 },
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
index 619470a..b99dae9 100644
--- a/src/cmdmapper.h
+++ b/src/cmdmapper.h
@@ -145,6 +145,12 @@ enum CommandType
CMD_ILINE = 116,
CMD_ILITERAL = 117,
CMD_ENDILITERAL = 118,
+ CMD_IFILE = 119,
+ CMD_SHOWDATE = 120,
+ CMD_ISTARTCODE = 121,
+ CMD_ENDICODE = 122,
+ CMD_IVERBATIM = 123,
+ CMD_ENDIVERBATIM = 124
};
enum HtmlTagType
diff --git a/src/code.l b/src/code.l
index 7f93d75..548a1ad 100644
--- a/src/code.l
+++ b/src/code.l
@@ -110,6 +110,7 @@ struct codeYY_state
int yyLineNr = 0; //!< current line number
yy_size_t yyColNr = 0; //!< current column number
bool insideCodeLine = FALSE;
+ bool skipCodify = FALSE; //!< for CSharp files scoped namespace {
bool exampleBlock = FALSE;
QCString exampleName;
@@ -278,7 +279,7 @@ Bopt {B}*
BN [ \t\n\r]
ID [$a-z_A-Z\x80-\xFF][$a-z_A-Z0-9\x80-\xFF]*
SEP ("::"|"\\")
-SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
+SCOPENAME ("::"{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
@@ -625,8 +626,8 @@ ENDQopt ("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"seale
if (yyextra->sourceFileDef)
{
const FileDef *fd=yyextra->sourceFileDef;
- yyextra->insideObjC = fd->name().lower().right(2)==".m" ||
- fd->name().lower().right(3)==".mm";
+ yyextra->insideObjC = fd->name().lower().endsWith(".m") ||
+ fd->name().lower().endsWith(".mm");
DBG_CTX((stderr,"insideObjC=%d\n",yyextra->insideObjC));
}
else
@@ -660,9 +661,18 @@ ENDQopt ("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"seale
BEGIN(Body);
}
<ClassName,ClassVar>";" {
- yyextra->code->codify(yytext);
- yyextra->searchingForBody=FALSE;
- BEGIN( Body );
+ if (yyextra->lang==SrcLangExt_CSharp)
+ {
+ yyextra->code->codify(yytext);
+ yyextra->skipCodify = true;
+ unput('{');
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ yyextra->searchingForBody=FALSE;
+ BEGIN( Body );
+ }
}
<ClassName,ClassVar>[*&^%]+ {
yyextra->type=yyextra->curClassName;
@@ -776,7 +786,8 @@ ENDQopt ("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"seale
<Bases>^{Bopt}/"@"{ID} | // Objective-C interface
<Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* {
yyextra->theVarContext.pushScope();
- yyextra->code->codify(yytext);
+ if (!yyextra->skipCodify) yyextra->code->codify(yytext);
+ yyextra->skipCodify = false;
if (YY_START==ClassVar && yyextra->curClassName.isEmpty())
{
yyextra->curClassName = yyextra->name;
@@ -1205,7 +1216,7 @@ ENDQopt ("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"seale
yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1);
BEGIN( RawString );
}
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\" {
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit,ClassVar>\" {
startFontClass(yyscanner,"stringliteral");
yyextra->code->codify(yytext);
yyextra->lastStringContext=YY_START;
@@ -2208,14 +2219,8 @@ static void addVariable(yyscan_t yyscanner,QCString type,QCString name)
DBG_CTX((stderr,"VariableContext::addVariable(%s,%s)\n",qPrint(type),qPrint(name)));
QCString ltype = type.simplifyWhiteSpace();
QCString lname = name.simplifyWhiteSpace();
- if (ltype.left(7)=="struct ")
- {
- ltype = ltype.right(ltype.length()-7);
- }
- else if (ltype.left(6)=="union ")
- {
- ltype = ltype.right(ltype.length()-6);
- }
+ ltype.stripPrefix("struct ");
+ ltype.stripPrefix("union ");
if (ltype.isEmpty() || lname.isEmpty()) return;
ltype = substitute(ltype,".","::");
DBG_CTX((stderr,"** addVariable trying: type='%s' name='%s' currentDefinition=%s\n",
@@ -2824,12 +2829,6 @@ static bool getLinkInScope(yyscan_t yyscanner,
return TRUE;
}
}
- else // found member, but it is not linkable, so make sure content inside is not assigned
- // to the previous member, see bug762760
- {
- DBG_CTX((stderr,"unlinkable member %s\n",qPrint(md->name())));
- yyextra->currentMemberDef = 0;
- }
}
return FALSE;
}
diff --git a/src/commentcnv.l b/src/commentcnv.l
index ae4c7d3..e0d3474 100644
--- a/src/commentcnv.l
+++ b/src/commentcnv.l
@@ -439,7 +439,7 @@ SLASHopt [/]*
copyToOutput(yyscanner,yytext,(int)yyleng);
yyextra->lastCommentContext = YY_START;
yyextra->javaBlock=0;
- yyextra->blockName=QCString(yytext).stripWhiteSpace().left(3);
+ yyextra->blockName=QCString(yytext).stripWhiteSpace().left(3); // take the ``` or ~~~ part
BEGIN(VerbatimCode);
}
<CComment,ReadLine>[\\@]("dot"|"code"|"msc"|"startuml")/[^a-z_A-Z0-9] { /* start of a verbatim block */
@@ -663,6 +663,10 @@ SLASHopt [/]*
BEGIN(Scan);
}
}
+<CComment,CNComment>"/""/"+/"*/" { /* we are already in C-comment so not a start of a nested comment but
+ * just the end of the comment (the end part is handled later). */
+ copyToOutput(yyscanner,yytext,(int)yyleng);
+ }
<CComment,CNComment>"/"+"*" { /* nested C comment */
if (yyextra->lang==SrcLangExt_Python ||
yyextra->lang==SrcLangExt_Markdown)
@@ -897,10 +901,10 @@ SLASHopt [/]*
handleCondSectionId(yyscanner," "); // fake section id causing the section to be hidden unconditionally
if (*yytext=='\n') { yyextra->lineNr++; copyToOutput(yyscanner,"\n",1);}
}
-<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias without arguments
+<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9-]* { // expand alias without arguments
replaceAliases(yyscanner,QCString(yytext));
}
-<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]*"{" { // expand alias with arguments
+<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9-]*"{" { // expand alias with arguments
yyextra->lastBlockContext=YY_START;
yyextra->blockCount=1;
yyextra->aliasString=yytext;
diff --git a/src/commentscan.l b/src/commentscan.l
index 67756a4..fd2ae11 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -35,6 +35,8 @@ typedef yyguts_t *yyscan_t;
#include <stack>
#include <string>
#include <mutex>
+#include <functional>
+#include <unordered_map>
#include <stdio.h>
#include <stdlib.h>
@@ -42,6 +44,7 @@ typedef yyguts_t *yyscan_t;
#include <ctype.h>
#include "qcstring.h"
+#include "fileinfo.h"
#include "cite.h"
#include "commentscan.h"
#include "condparser.h"
@@ -142,6 +145,8 @@ static bool handleParBlock(yyscan_t yyscanner,const QCString &, const StringVect
static bool handleEndParBlock(yyscan_t yyscanner,const QCString &, const StringVector &);
static bool handleParam(yyscan_t yyscanner,const QCString &, const StringVector &);
static bool handleRetval(yyscan_t yyscanner,const QCString &, const StringVector &);
+static bool handleFileInfo(yyscan_t yyscanner,const QCString &, const StringVector &);
+static bool handleLineInfo(yyscan_t yyscanner,const QCString &, const StringVector &);
#if USE_STATE2STRING
static const char *stateToString(int state);
@@ -183,11 +188,13 @@ static const std::map< std::string, DocCmdMap > docCmdMap =
{ "cite", { &handleCite, CommandSpacing::Inline }},
{ "class", { &handleClass, CommandSpacing::Invisible }},
{ "code", { &handleFormatBlock, CommandSpacing::Block }},
+ { "icode", { &handleFormatBlock, CommandSpacing::Block }},
{ "concept", { &handleConcept, CommandSpacing::Invisible }},
{ "copybrief", { &handleCopyBrief, CommandSpacing::Invisible }},
{ "copydetails", { &handleCopyDetails, CommandSpacing::Block }},
{ "copydoc", { &handleCopyDoc, CommandSpacing::Block }},
{ "copyright", { 0, CommandSpacing::Block }},
+ { "showdate", { 0, CommandSpacing::Inline }},
{ "date", { 0, CommandSpacing::Block }},
{ "def", { &handleDef, CommandSpacing::Invisible }},
{ "defgroup", { &handleDefGroup, CommandSpacing::Invisible }},
@@ -301,6 +308,7 @@ static const std::map< std::string, DocCmdMap > docCmdMap =
{ "until", { 0, CommandSpacing::Block }},
{ "var", { &handleFn, CommandSpacing::Invisible }},
{ "verbatim", { &handleFormatBlock, CommandSpacing::Block }},
+ { "iverbatim", { &handleFormatBlock, CommandSpacing::Block }},
{ "verbinclude", { 0, CommandSpacing::Inline }},
{ "version", { 0, CommandSpacing::Block }},
{ "warning", { 0, CommandSpacing::Block }},
@@ -309,6 +317,8 @@ static const std::map< std::string, DocCmdMap > docCmdMap =
{ "xmlonly", { &handleFormatBlock, CommandSpacing::Invisible }},
{ "xrefitem", { &handleXRefItem, CommandSpacing::XRef }},
{ "iliteral", { &handleFormatBlock, CommandSpacing::Inline }},
+ { "fileinfo", { &handleFileInfo, CommandSpacing::Inline }},
+ { "lineinfo", { &handleLineInfo, CommandSpacing::Inline }},
};
#define YY_NO_INPUT 1
@@ -454,6 +464,7 @@ static void handleGuard(yyscan_t yyscanner,const QCString &expr);
static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
static void addCite(yyscan_t yyscanner);
static void addIline(yyscan_t yyscanner,int lineNr);
+static void addIlineBreak(yyscan_t yyscanner,int lineNr);
#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
@@ -948,7 +959,7 @@ STopt [^\n@\\]*
addOutput(yyscanner,yytext[0]);
addOutput(yyscanner,yytext[2]);
}
-<Comment>".," { // . with comma such as "e.g.,"
+<Comment>"."[,:;] { // . with some puntuations such as "e.g.," or "e.g.:"
addOutput(yyscanner,yytext);
}
<Comment>"...\\"[ \t] { // ellipsis with escaped space.
@@ -1070,6 +1081,7 @@ STopt [^\n@\\]*
yyextra->formulaNewLines++;
yyextra->formulaText+=*yytext;
yyextra->lineNr++;
+ addIline(yyscanner,yyextra->lineNr);
}
<ReadFormulaLong,ReadFormulaShort,ReadFormulaRound>. { // any other character
yyextra->formulaText+=*yytext;
@@ -1245,7 +1257,7 @@ STopt [^\n@\\]*
//lastDefGroup.groupname = yytext;
//lastDefGroup.pri = yyextra->current->groupingPri();
// the .html stuff is for Qt compatibility
- if (yyextra->current->name.right(5)==".html")
+ if (yyextra->current->name.endsWith(".html"))
{
yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-5);
}
@@ -1592,7 +1604,7 @@ STopt [^\n@\\]*
/* ----- handle arguments of the preformatted block commands ------- */
-<FormatBlock>{CMD}("endverbatim"|"endiliteral"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc")/{NW} { // possible ends
+<FormatBlock>{CMD}("endverbatim"|"endiverbatim"|"endiliteral"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endicode"|"endmsc")/{NW} { // possible ends
addOutput(yyscanner,yytext);
if (&yytext[4]==yyextra->blockName) // found end of the block
{
@@ -1614,12 +1626,20 @@ STopt [^\n@\\]*
addOutput(yyscanner,'\n');
}
<FormatBlock>{CCS} { // start of a C-comment
- if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim" || yyextra->blockName=="iliteral")) yyextra->commentCount++;
+ if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim" ||
+ yyextra->blockName=="icode" || yyextra->blockName=="iverbatim"||
+ yyextra->blockName=="iliteral"
+ )
+ ) yyextra->commentCount++;
addOutput(yyscanner,yytext);
}
<FormatBlock>{CCE} { // end of a C-comment
addOutput(yyscanner,yytext);
- if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim" || yyextra->blockName=="iliteral"))
+ if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim" ||
+ yyextra->blockName=="icode" || yyextra->blockName=="iverbatim"||
+ yyextra->blockName=="iliteral"
+ )
+ )
{
yyextra->commentCount--;
if (yyextra->commentCount<0)
@@ -1680,7 +1700,7 @@ STopt [^\n@\\]*
if (*yytext=='\n') yyextra->lineNr++;
//next line is commented out due to bug620924
//addOutput(yyscanner,'\n');
- addIline(yyscanner,yyextra->lineNr);
+ addIlineBreak(yyscanner,yyextra->lineNr);
BEGIN( Comment );
}
<GuardParam>{LC} { // line continuation
@@ -1693,7 +1713,7 @@ STopt [^\n@\\]*
<GuardParamEnd>{B}*{DOCNL} {
lineCount(yyscanner);
yyextra->spaceBeforeIf.resize(0);
- addIline(yyscanner,yyextra->lineNr);
+ addIlineBreak(yyscanner,yyextra->lineNr);
BEGIN(Comment);
}
<GuardParamEnd>{B}* {
@@ -1702,12 +1722,12 @@ STopt [^\n@\\]*
addOutput(yyscanner,yyextra->spaceBeforeIf);
}
yyextra->spaceBeforeIf.resize(0);
- addIline(yyscanner,yyextra->lineNr);
+ addIlineBreak(yyscanner,yyextra->lineNr);
BEGIN(Comment);
}
<GuardParamEnd>. {
unput(*yytext);
- addIline(yyscanner,yyextra->lineNr);
+ addIlineBreak(yyscanner,yyextra->lineNr);
BEGIN(Comment);
}
@@ -1859,8 +1879,11 @@ STopt [^\n@\\]*
/* ----- handle argument of noop command ------- */
<Noop>{DOCNL} { // end of argument
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
+ if (*yytext=='\n')
+ {
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
BEGIN( Comment );
}
<Noop>. { // ignore other stuff
@@ -2628,6 +2651,76 @@ static bool handleAddIndex(yyscan_t yyscanner,const QCString &, const StringVect
return FALSE;
}
+static bool handleFileInfo(yyscan_t yyscanner,const QCString &, const StringVector &optList)
+{
+ using OutputWriter = std::function<void(yyscan_t,FileInfo &)>;
+ static std::unordered_map<std::string,OutputWriter> options =
+ { // name, writer
+ { "name", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.baseName()); } },
+ { "extension", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.extension(true)); } },
+ { "filename", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.fileName()); } },
+ { "directory", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.dirPath()); } },
+ { "full", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.absFilePath()); } },
+ };
+
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (!yyextra->spaceBeforeCmd.isEmpty())
+ {
+ addOutput(yyscanner,yyextra->spaceBeforeCmd);
+ yyextra->spaceBeforeCmd.resize(0);
+ }
+ bool first = true;
+ FileInfo fi(yyextra->fileName.str());
+ for (const auto &opt_ : optList)
+ {
+ QCString optStripped = QCString(opt_).stripWhiteSpace();
+ std::string opt = optStripped.lower().str();
+ auto it = options.find(opt);
+ if (it != options.end())
+ {
+ if (!first)
+ {
+ warn(yyextra->fileName,yyextra->lineNr,"Multiple options specified with \\fileinfo, discarding '%s'", qPrint(optStripped));
+ }
+ else
+ {
+ it->second(yyscanner,fi);
+ }
+ first = false;
+ }
+ else
+ {
+ warn(yyextra->fileName,yyextra->lineNr,"Unknown option specified with \\fileinfo: '%s'", qPrint(optStripped));
+ }
+ }
+ if (first) // no options specified
+ {
+ if (Config_getBool(FULL_PATH_NAMES))
+ {
+ addOutput(yyscanner,stripFromPath(yyextra->fileName));
+ }
+ else
+ {
+ addOutput(yyscanner,yyextra->fileName);
+ }
+ }
+ addOutput(yyscanner," ");
+ return FALSE;
+}
+
+static bool handleLineInfo(yyscan_t yyscanner,const QCString &, const StringVector &)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (!yyextra->spaceBeforeCmd.isEmpty())
+ {
+ addOutput(yyscanner,yyextra->spaceBeforeCmd);
+ yyextra->spaceBeforeCmd.resize(0);
+ }
+ addOutput(yyscanner,QCString().setNum(yyextra->lineNr));
+ addOutput(yyscanner," ");
+ return FALSE;
+}
+
static bool handleIf(yyscan_t yyscanner,const QCString &, const StringVector &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
@@ -3464,6 +3557,13 @@ static inline void addOutput(yyscan_t yyscanner,char c)
static void addIline(yyscan_t yyscanner,int lineNr)
{
+ char cmd[20];
+ sprintf(cmd,"\\iline %d ",lineNr);
+ addOutput(yyscanner, cmd);
+}
+
+static void addIlineBreak(yyscan_t yyscanner,int lineNr)
+{
char cmd[30];
sprintf(cmd,"\\iline %d \\ilinebr ",lineNr);
addOutput(yyscanner, cmd);
@@ -3477,8 +3577,16 @@ static void endBrief(yyscan_t yyscanner,bool addToOutput)
// found some brief description and not just whitespace
yyextra->briefEndsAtDot=FALSE;
setOutput(yyscanner,OutputDoc);
+ addIline(yyscanner,yyextra->lineNr);
if (addToOutput) addOutput(yyscanner,yytext);
}
+ else
+ {
+ int saveLineNr = yyextra->lineNr;
+ lineCount(yyscanner);
+ yyextra->current->briefLine = yyextra->lineNr;
+ yyextra->lineNr = saveLineNr;
+ }
}
static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
diff --git a/src/config.h b/src/config.h
index 00b3b71..f754f9b 100644
--- a/src/config.h
+++ b/src/config.h
@@ -45,12 +45,13 @@
//#endif
//! @}
-enum class DoxyfileSettings { Full, Compressed, CompressedNoEnv };
class TextStream;
/** \brief Public function to deal with the configuration file. */
namespace Config
{
+ enum class CompareMode { Full, Compressed, CompressedNoEnv };
+
/*! Initialize configuration variables to their default value */
void init();
@@ -63,7 +64,7 @@ namespace Config
/*! Writes a the differences between the current configuration and the
* template configuration to stream \a t.
*/
- void compareDoxyfile(TextStream &t, DoxyfileSettings diffList);
+ void compareDoxyfile(TextStream &t, CompareMode compareMode);
/*! Writes a the used settings of the current configuration as XML format
* to stream \a t.
@@ -74,15 +75,15 @@ namespace Config
* \returns TRUE if successful, FALSE if the file could not be
* opened or read.
*/
- bool parse(const QCString &fileName,bool update=FALSE);
+ bool parse(const QCString &fileName,bool update=FALSE, CompareMode compareMode = CompareMode::Full);
/*! Post processed the parsed data. Replaces raw string values by the actual values.
* and replaces environment variables.
* \param clearHeaderAndFooter set to TRUE when writing header and footer templates.
- * \param compare signals if we in Doxyfile compare (`-x` or `-x_noenv`) mode are or not.
- * Influences setting of the default value and replacement of environment variables.
+ * \param compareMode signals if we in Doxyfile compare (`-x` or `-x_noenv`) mode are or not.
+ * Influences setting of the default value and replacement of environment variables and CMake type replacement variables.
*/
- void postProcess(bool clearHeaderAndFooter, DoxyfileSettings compare = DoxyfileSettings::Full);
+ void postProcess(bool clearHeaderAndFooter, CompareMode compareMode = CompareMode::Full);
/*! Check the validity of the parsed options and correct or warn the user where needed.
* \param quiet setting for the QUIET option (can have been overruled by means of a command line option)
diff --git a/src/config.xml b/src/config.xml
index a10c1ac..296a62e 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -95,7 +95,7 @@ Use doxygen to compare the used configuration file with the template configurati
doxygen -x [configFile]
\endverbatim
Use doxygen to compare the used configuration file with the template configuration file
-without replacing the environment variables:
+without replacing the environment variables or CMake type replacement variables:
\verbatim
doxygen -x_noenv [configFile]
\endverbatim
@@ -995,7 +995,7 @@ Go to the <a href="commands.html">next</a> section or return to the
]]>
</docs>
</option>
- <option type='bool' id='CASE_SENSE_NAMES' defval='0' altdefval='Portable::fileSystemIsCaseSensitive()'>
+ <option type='enum' id='CASE_SENSE_NAMES' defval='SYSTEM'>
<docs>
<![CDATA[
With the correct setting of option \c CASE_SENSE_NAMES doxygen will better be able to match the
@@ -1014,6 +1014,9 @@ Go to the <a href="commands.html">next</a> section or return to the
whereas on Linux or other Unix flavors it should typically be set to \c YES.
]]>
</docs>
+ <value name="SYSTEM" />
+ <value name="NO"/>
+ <value name="YES" />
</option>
<option type='bool' id='HIDE_SCOPE_NAMES' defval='0'>
<docs>
@@ -1455,6 +1458,22 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
Doxygen uses `libiconv` (or the `iconv` built into `libc`) for the transcoding.
See <a href="https://www.gnu.org/software/libiconv/">the libiconv documentation</a> for
the list of possible encodings.
+
+ \sa \ref cfg_input_file_encoding "INPUT_FILE_ENCODING"
+]]>
+ </docs>
+ </option>
+ <option type='list' id='INPUT_FILE_ENCODING' format='string'>
+ <docs>
+<![CDATA[
+ This tag can be used to specify the character encoding of the source files that doxygen
+ parses
+ The \c INPUT_FILE_ENCODING tag can be used to specify character encoding on a per file pattern
+ basis. Doxygen will compare the file name with each pattern and apply the
+ encoding instead of the default \ref cfg_input_encoding "INPUT_ENCODING") if there is a match.
+ The character encodings are a list of the form: pattern=encoding (like `*.php=ISO-8859-1`).
+
+ See cfg_input_encoding "INPUT_ENCODING" for further information on supported encodings.
]]>
</docs>
</option>
@@ -1628,6 +1647,9 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<br>Note that the filter must not add or remove lines; it is applied before the
code is scanned, but not when the output code is generated. If lines are added
or removed, the anchors will not be placed correctly.
+ <br>Note that doxygen will use the data processed and written to standard output for further processing,
+ therefore nothing else, like debug statements or used commands (so in case of a Windows batch file
+ always use `@echo OFF`), should be written to standard output.
<br>Note that for custom extensions or not directly supported extensions you also
need to set \ref cfg_extension_mapping "EXTENSION_MAPPING" for the extension
otherwise the files are not properly processed by doxygen.<br>
@@ -1682,6 +1704,17 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
]]>
</docs>
</option>
+ <option type='int' id='FORTRAN_COMMENT_AFTER' defval='72' minval='7' maxval='10000'>
+ <docs>
+<![CDATA[
+ The Fortran standard specifies that for fixed formatted Fortran code all characters
+ from position 72 are to be considered as comment. A common extension is to allow
+ longer lines before the automatic comment starts.
+ The setting \c FORTRAN_COMMENT_AFTER will also make it possible that longer lines can be
+ processed before the automatic comment starts.
+]]>
+ </docs>
+ </option>
</group>
<group name='Source_Browser' docs='Configuration options related to source browsing'>
<option type='bool' id='SOURCE_BROWSER' defval='0'>
@@ -2107,6 +2140,21 @@ hr.footer {
]]>
</docs>
</option>
+ <option type='enum' id='HTML_COLORSTYLE' defval='AUTO_LIGHT' depends='GENERATE_HTML'>
+ <docs>
+<![CDATA[
+ The \c HTML_COLORSTYLE tag can be used to specify if the generated HTML output should be rendered with
+ a dark or light theme. Default setting \c AUTO_LIGHT enables light output unless the user preference is dark output.
+ Other options are \c DARK to always use dark mode, \c LIGHT to always use light mode, \c AUTO_DARK to default to dark
+ mode unless the user prefers light mode, and \c TOGGLE to let the user toggle between dark and light mode via a button.
+]]>
+ </docs>
+ <value name="LIGHT" desc="Always generate light output."/>
+ <value name="DARK" desc="Always generate dark output."/>
+ <value name="AUTO_LIGHT" desc="Automatically set the mode according to the user preference, use light mode if no preference is set (the default)."/>
+ <value name="AUTO_DARK" desc="Automatically set the mode according to the user preference, use dark mode if no preference is set."/>
+ <value name="TOGGLE" desc="Allow to user to switch between light and dark mode via a button."/>
+ </option>
<option type='int' id='HTML_COLORSTYLE_HUE' minval='0' maxval='359' defval='220' depends='GENERATE_HTML'>
<docs>
<![CDATA[
@@ -2539,17 +2587,6 @@ obfuscate email addresses.
]]>
</docs>
</option>
- <option type='bool' id='FORMULA_TRANSPARENT' defval='1' depends='GENERATE_HTML'>
- <docs>
-<![CDATA[
- Use the \c FORMULA_TRANSPARENT tag to determine whether or not the images
- generated for formulas are transparent PNGs. Transparent PNGs are
- not supported properly for IE 6.0, but are supported on all modern browsers.
- <br>Note that when changing this option you need to delete any `form_*.png` files
- in the HTML output directory before the changes have effect.
-]]>
- </docs>
- </option>
<option type='string' id='FORMULA_MACROFILE' format='file' defval=''>
<docs>
<![CDATA[
@@ -2937,6 +2974,7 @@ doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
<dt><code>$papertype</code><dd>will be replaced by the paper type as set in
\ref cfg_paper_type "PAPER_TYPE" and the word "paper" is directly appended to it to have
a correct \f$\mbox{\LaTeX}\f$ paper type.
+ <dt><code>$langISO</code><dd>will be replaced by the ISO language name.
<dt><code>$languagesupport</code><dd>will be replaced by an output language dependent setting
of packages required for translating terms of the specified language.
<dt><code>$latexfontenc</code><dd>will be replaced by an output language dependent setting
@@ -3604,32 +3642,49 @@ to be found in the default search path.
]]>
</docs>
</option>
- <option type='string' id='DOT_FONTNAME' format='string' defval='Helvetica' depends='HAVE_DOT'>
+ <option type='string' id='DOT_COMMON_ATTR' format='string' depends='HAVE_DOT'
+ defval='fontname=Helvetica,fontsize=10'>
<docs>
<![CDATA[
+ \c DOT_COMMON_ATTR is common attributes for nodes, edges and labels of subgraphs.
When you want a differently looking font in the dot files that doxygen generates
- you can specify the font name
- using \c DOT_FONTNAME. You need to make sure dot is able to find the font,
- which can be done by putting it in a standard location or by setting the
- \c DOTFONTPATH environment variable or by setting \ref cfg_dot_fontpath "DOT_FONTPATH" to the
+ you can specify fontname, fontcolor and fontsize attributes.
+ For details please see
+ <a href=https://graphviz.org/doc/info/attrs.html>Node, Edge and Graph Attributes specification</a>
+ You need to make sure dot is able to find the font,
+ which can be done by putting it in a standard location
+ or by setting the \c DOTFONTPATH environment variable or by
+ setting \ref cfg_dot_fontpath "DOT_FONTPATH" to the
directory containing the font.
+ Default graphviz fontsize is 14.
+]]>
+ </docs>
+ </option>
+ <option type='string' id='DOT_EDGE_ATTR' format='string' depends='HAVE_DOT'
+ defval='labelfontname=Helvetica,labelfontsize=10'>
+ <docs>
+<![CDATA[
+ \c DOT_EDGE_ATTR is concatenated with \ref cfg_dot_common_attr "DOT_COMMON_ATTR".
+ For elegant style you can add 'arrowhead=open, arrowtail=open, arrowsize=0.5'.
+ <a href=https://graphviz.org/doc/info/arrows.html>Complete documentation about arrows shapes.</a>
]]>
</docs>
</option>
- <option type='int' id='DOT_FONTSIZE' minval='4' maxval='24' defval='10' depends='HAVE_DOT'>
+ <option type='string' id='DOT_NODE_ATTR' format='string' depends='HAVE_DOT'
+ defval='shape=box,height=0.2,width=0.4'>
<docs>
<![CDATA[
- The \c DOT_FONTSIZE tag can be used to set the size (in points) of the font of dot graphs.
+ \c DOT_NODE_ATTR is concatenated with \ref cfg_dot_common_attr "DOT_COMMON_ATTR".
+ For view without boxes around nodes set 'shape=plain' or 'shape=plaintext'
+ <a href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
]]>
</docs>
</option>
<option type='string' id='DOT_FONTPATH' format='dir' defval='' depends='HAVE_DOT'>
<docs>
<![CDATA[
- By default doxygen will tell \c dot to use the default font as specified with \ref cfg_dot_fontname "DOT_FONTNAME".
- If you specify a
- different font using \ref cfg_dot_fontname "DOT_FONTNAME" you can set the path where \c dot
- can find it using this tag.
+ You can set the path where \c dot can find font specified with
+ fontname in \ref cfg_dot_common_attr "DOT_COMMON_ATTR" and others dot attributes.
]]>
</docs>
</option>
@@ -3925,19 +3980,6 @@ UML notation for the relationships.
]]>
</docs>
</option>
- <option type='bool' id='DOT_TRANSPARENT' defval='0' depends='HAVE_DOT'>
- <docs>
-<![CDATA[
- Set the \c DOT_TRANSPARENT tag to \c YES to generate images with a transparent
- background. This is disabled by default, because dot on Windows does not
- seem to support this out of the box.
- <br>
- Warning: Depending on the platform used,
- enabling this option may lead to badly anti-aliased labels on the edges of
- a graph (i.e. they become hard to read).
-]]>
- </docs>
- </option>
<option type='bool' id='DOT_MULTI_TARGETS' defval='0' depends='HAVE_DOT'>
<docs>
<![CDATA[
@@ -3998,5 +4040,9 @@ This setting is not only used for dot files but also for msc temporary files.
<option type='obsolete' orgtype='bool' id='RTF_SOURCE_CODE'/>
<option type='obsolete' orgtype='bool' id='LATEX_SOURCE_CODE'/>
<option type='obsolete' orgtype='bool' id='CLASS_DIAGRAMS'/>
+ <option type='obsolete' orgtype='int' id='DOT_FONTSIZE'/>
+ <option type='obsolete' orgtype='string' id='DOT_FONTNAME'/>
+ <option type='obsolete' orgtype='bool' id='FORMULA_TRANSPARENT'/>
+ <option type='obsolete' orgtype='bool' id='DOT_TRANSPARENT'/>
</group>
</doxygenconfig>
diff --git a/src/configgen.py b/src/configgen.py
index 6a79811..910b6af 100755
--- a/src/configgen.py
+++ b/src/configgen.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# python script to generate configoptions.cpp and config.doc from config.xml
#
# Copyright (C) 1997-2015 by Dimitri van Heesch.
@@ -173,9 +173,9 @@ def prepCDocs(node):
"default value", defval)
elif (type == 'bool'):
if (node.hasAttribute('altdefval')):
- doc += "<br/>%s: %s." % ("The default value is", "system dependent")
+ doc += "<br/>%s: %s." % ("The default value is", "system dependent")
else:
- doc += "<br/>%s: %s." % ("The default value is", "YES" if (defval == "1") else "NO")
+ doc += "<br/>%s: %s." % ("The default value is", "YES" if (defval == "1") else "NO")
elif (type == 'list'):
if format == 'string':
values = collectValues(node)
diff --git a/src/configimpl.h b/src/configimpl.h
index 9e737a7..e9fd2ad 100644
--- a/src/configimpl.h
+++ b/src/configimpl.h
@@ -27,6 +27,7 @@
#include "containers.h"
#include "qcstring.h"
+#include "config.h"
class TextStream;
@@ -77,9 +78,9 @@ class ConfigOption
protected:
virtual void writeTemplate(TextStream &t,bool sl,bool upd) = 0;
- virtual void compareDoxyfile(TextStream &t) = 0;
+ virtual void compareDoxyfile(TextStream &t,Config::CompareMode compareMode) = 0;
virtual void writeXMLDoxyfile(TextStream &t) = 0;
- virtual void convertStrToVal() {}
+ virtual void convertStrToVal(Config::CompareMode compareMode) {}
virtual void emptyValueToDefault() {}
virtual void substEnvVars() = 0;
virtual void init() {}
@@ -87,7 +88,7 @@ class ConfigOption
void writeBoolValue(TextStream &t,bool v,bool initSpace = true);
void writeIntValue(TextStream &t,int i,bool initSpace = true);
- void writeStringValue(TextStream &t,const QCString &s,bool initSpace = true);
+ void writeStringValue(TextStream &t,const QCString &s,bool initSpace = true,bool wasQuoted = false);
void writeStringList(TextStream &t,const StringVector &l);
QCString m_spaces;
@@ -111,7 +112,7 @@ class ConfigInfo : public ConfigOption
m_doc = doc;
}
void writeTemplate(TextStream &t, bool sl,bool);
- void compareDoxyfile(TextStream &) {}
+ void compareDoxyfile(TextStream &,Config::CompareMode) {}
void writeXMLDoxyfile(TextStream &) {}
void substEnvVars() {}
};
@@ -136,7 +137,7 @@ class ConfigList : public ConfigOption
StringVector getDefault() { return m_defaultValue; }
void emptyValueToDefault() { if (m_value.empty() && !m_defaultValue.empty()) m_value=m_defaultValue; };
void writeTemplate(TextStream &t,bool sl,bool);
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void substEnvVars();
void init() { m_value = m_defaultValue; }
@@ -165,8 +166,8 @@ class ConfigEnum : public ConfigOption
QCString *valueRef() { return &m_value; }
void substEnvVars();
void writeTemplate(TextStream &t,bool sl,bool);
- void convertStrToVal();
- void compareDoxyfile(TextStream &t);
+ void convertStrToVal(Config::CompareMode compareMode);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void init() { m_value = m_defValue; }
bool isDefault() { return m_value == m_defValue; }
@@ -198,7 +199,7 @@ class ConfigString : public ConfigOption
void setDefaultValue(const char *v) { m_defValue = v; }
QCString *valueRef() { return &m_value; }
void writeTemplate(TextStream &t,bool sl,bool);
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void substEnvVars();
void init() { m_value = m_defValue; }
@@ -230,10 +231,10 @@ class ConfigInt : public ConfigOption
int *valueRef() { return &m_value; }
int minVal() const { return m_minVal; }
int maxVal() const { return m_maxVal; }
- void convertStrToVal();
+ void convertStrToVal(Config::CompareMode compareMode);
void substEnvVars();
void writeTemplate(TextStream &t,bool sl,bool upd);
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void init() { m_value = m_defValue; }
bool isDefault() { return m_value == m_defValue; }
@@ -260,11 +261,11 @@ class ConfigBool : public ConfigOption
}
QCString *valueStringRef() { return &m_valueString; }
bool *valueRef() { return &m_value; }
- void convertStrToVal();
+ void convertStrToVal(Config::CompareMode compareMode);
void substEnvVars();
void setValueString(const QCString &v) { m_valueString = v; }
void writeTemplate(TextStream &t,bool sl,bool upd);
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void init() { m_value = m_defValue; }
bool isDefault() { return m_value == m_defValue; }
@@ -282,7 +283,7 @@ class ConfigObsolete : public ConfigOption
ConfigObsolete(const char *name,OptionType orgType) : ConfigOption(O_Obsolete), m_orgType(orgType)
{ m_name = name; }
void writeTemplate(TextStream &,bool,bool);
- void compareDoxyfile(TextStream &) {}
+ void compareDoxyfile(TextStream &,Config::CompareMode) {}
void writeXMLDoxyfile(TextStream &) {}
void substEnvVars() {}
OptionType orgType() const { return m_orgType; }
@@ -305,7 +306,7 @@ class ConfigDisabled : public ConfigOption
ConfigDisabled(const char *name) : ConfigOption(O_Disabled)
{ m_name = name; }
void writeTemplate(TextStream &,bool,bool);
- void compareDoxyfile(TextStream &) {}
+ void compareDoxyfile(TextStream &,Config::CompareMode) {}
void writeXMLDoxyfile(TextStream &) {}
void substEnvVars() {}
};
@@ -505,7 +506,7 @@ class ConfigImpl
/*! Writes a the differences between the current configuration and the
* template configuration to stream \a t.
*/
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
/*! Writes a the used settings of the current configuration as XML format
* to stream \a t.
@@ -521,7 +522,7 @@ class ConfigImpl
/*! Converts the string values read from the configuration file
* to real values for non-string type options (like int, and bools)
*/
- void convertStrToVal();
+ void convertStrToVal(Config::CompareMode compareMode);
/*! Sets default value in case value is empty
*/
@@ -564,6 +565,12 @@ class ConfigImpl
{
m_userComment += u;
}
+ /*! Append replacement string
+ */
+ void appendStoreRepl(const QCString &u)
+ {
+ m_storeRepl += u;
+ }
/*! Take the user start comment and reset it internally
* \returns user start comment
*/
@@ -582,6 +589,15 @@ class ConfigImpl
m_userComment.resize(0);
return substitute(result,"\r","");
}
+ /*! Take the replacement string
+ * \returns the replacement string
+ */
+ QCString takeStoreRepl()
+ {
+ QCString result=m_storeRepl;
+ m_storeRepl.resize(0);
+ return substitute(result,"\r","");
+ }
protected:
@@ -602,6 +618,7 @@ class ConfigImpl
static ConfigImpl *m_instance;
QCString m_startComment;
QCString m_userComment;
+ QCString m_storeRepl;
bool m_initialized;
QCString m_header;
};
diff --git a/src/configimpl.l b/src/configimpl.l
index 9975cd0..3ff0e6a 100644
--- a/src/configimpl.l
+++ b/src/configimpl.l
@@ -30,7 +30,9 @@
#include <algorithm>
#include <fstream>
#include <iostream>
+#include <iomanip>
+#include "config.h"
#include "regex.h"
#include "configimpl.h"
#include "version.h"
@@ -41,6 +43,7 @@
#include "fileinfo.h"
#include "dir.h"
#include "textstream.h"
+#include "dotattributes.h"
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
@@ -84,6 +87,8 @@ static QCString configStringRecode(
const QCString &fromEncoding,
const QCString &toEncoding);
+static bool containsEnvVar(QCString &str);
+
#define MAX_INCLUDE_DEPTH 10
#define YY_NEVER_INTERACTIVE 1
@@ -140,10 +145,10 @@ void ConfigOption::writeIntValue(TextStream &t,int i,bool initSpace)
t << i;
}
-void ConfigOption::writeStringValue(TextStream &t,const QCString &s,bool initSpace)
+void ConfigOption::writeStringValue(TextStream &t,const QCString &s,bool initSpace, bool wasQuoted)
{
char c;
- bool needsEscaping=FALSE;
+ bool needsEscaping=wasQuoted;
// convert the string back to it original g_encoding
QCString se = configStringRecode(s,"UTF-8",m_encoding);
if (se.isEmpty()) return;
@@ -181,7 +186,12 @@ void ConfigOption::writeStringList(TextStream &t,const StringVector &l)
QCString s=p.c_str();
if (!first)
t << " ";
- writeStringValue(t,s);
+ bool wasQuoted = ((s.at(0)=='"') && (s.at(s.length()-1)=='"'));
+ if (wasQuoted)
+ {
+ s = s.mid(1,s.length()-2);
+ }
+ writeStringValue(t,s,true,wasQuoted);
first=FALSE;
}
}
@@ -191,10 +201,14 @@ void ConfigOption::writeStringList(TextStream &t,const StringVector &l)
ConfigImpl *ConfigImpl::m_instance = 0;
-void ConfigInt::convertStrToVal()
+void ConfigInt::convertStrToVal(Config::CompareMode compareMode)
{
if (!m_valueString.isEmpty())
{
+ if (compareMode == Config::CompareMode::CompressedNoEnv)
+ {
+ if (containsEnvVar(m_valueString)) return;
+ }
bool ok;
int val = m_valueString.toInt(&ok);
if (!ok || val<m_minVal || val>m_maxVal)
@@ -229,10 +243,14 @@ static bool convertStringToBool(const QCString &str,bool &isValid)
return false;
}
-void ConfigBool::convertStrToVal()
+void ConfigBool::convertStrToVal(Config::CompareMode compareMode)
{
if (!m_valueString.stripWhiteSpace().isEmpty())
{
+ if (compareMode == Config::CompareMode::CompressedNoEnv)
+ {
+ if (containsEnvVar(m_valueString)) return;
+ }
bool isValid=false;
bool b = convertStringToBool(m_valueString,isValid);
if (isValid)
@@ -247,13 +265,17 @@ void ConfigBool::convertStrToVal()
}
}
-void ConfigEnum::convertStrToVal()
+void ConfigEnum::convertStrToVal(Config::CompareMode compareMode)
{
if (m_value.isEmpty())
{
m_value = m_defValue;
return;
}
+ if (compareMode == Config::CompareMode::CompressedNoEnv)
+ {
+ if (containsEnvVar(m_value)) return;
+ }
QCString val = m_value.stripWhiteSpace().lower();
for (const auto &s : m_valueRange)
{
@@ -401,7 +423,7 @@ bool ConfigList::isDefault()
return true;
}
-void ConfigList::compareDoxyfile(TextStream &t)
+void ConfigList::compareDoxyfile(TextStream &t, Config::CompareMode)
{
if (!isDefault()) writeTemplate(t,TRUE,TRUE);
}
@@ -442,7 +464,7 @@ void ConfigEnum::writeTemplate(TextStream &t,bool sl,bool)
t << "\n";
}
-void ConfigEnum::compareDoxyfile(TextStream &t)
+void ConfigEnum::compareDoxyfile(TextStream &t, Config::CompareMode)
{
if (!isDefault()) writeTemplate(t,TRUE,TRUE);
}
@@ -476,7 +498,7 @@ void ConfigString::writeTemplate(TextStream &t,bool sl,bool)
t << "\n";
}
-void ConfigString::compareDoxyfile(TextStream &t)
+void ConfigString::compareDoxyfile(TextStream &t, Config::CompareMode)
{
if (!isDefault()) writeTemplate(t,TRUE,TRUE);
}
@@ -519,9 +541,9 @@ void ConfigInt::writeTemplate(TextStream &t,bool sl,bool upd)
t << "\n";
}
-void ConfigInt::compareDoxyfile(TextStream &t)
+void ConfigInt::compareDoxyfile(TextStream &t,Config::CompareMode compareMode)
{
- if (!isDefault()) writeTemplate(t,TRUE,TRUE);
+ if (!isDefault() || ((compareMode == Config::CompareMode::CompressedNoEnv) && containsEnvVar(m_valueString))) writeTemplate(t,TRUE,TRUE);
}
void ConfigInt::writeXMLDoxyfile(TextStream &t)
@@ -561,9 +583,9 @@ void ConfigBool::writeTemplate(TextStream &t,bool sl,bool upd)
t << "\n";
}
-void ConfigBool::compareDoxyfile(TextStream &t)
+void ConfigBool::compareDoxyfile(TextStream &t,Config::CompareMode compareMode)
{
- if (!isDefault()) writeTemplate(t,TRUE,TRUE);
+ if (!isDefault() || ((compareMode == Config::CompareMode::CompressedNoEnv) && containsEnvVar(m_valueString))) writeTemplate(t,TRUE,TRUE);
}
void ConfigBool::writeXMLDoxyfile(TextStream &t)
@@ -608,7 +630,10 @@ static std::vector< std::unique_ptr<ConfigFileState> > g_includeStack;
static bool g_configUpdate = FALSE;
static QCString g_encoding;
static ConfigImpl *g_config;
+static Config::CompareMode g_compareMode = Config::CompareMode::Full;
+static QCString g_localStoreRepl;
+#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
/* -----------------------------------------------------------------
*/
#undef YY_INPUT
@@ -653,7 +678,8 @@ static QCString configStringRecode(
void *cd = portable_iconv_open(outputEncoding.data(),inputEncoding.data());
if (cd==reinterpret_cast<void *>(-1))
{
- config_term("Error: unsupported character conversion: '%s'->'%s'\n",
+ config_term("Error: unsupported character conversion: '%s'->'%s'\n"
+ "Check the 'DOXYFILE_ENCODING' setting in the config file!\n",
qPrint(inputEncoding),qPrint(outputEncoding));
}
size_t iLeft=inputSize;
@@ -710,6 +736,14 @@ static QCString stripComment(const QCString &s)
return s;
}
+static void processStoreRepl(QCString &storeReplStr)
+{
+ // strip leading and trailing whitespace
+ QCString s = stripComment(storeReplStr.stripWhiteSpace());
+ // recode the string
+ storeReplStr=configStringRecode(s,g_encoding,"UTF-8");
+}
+
static void processString()
{
// strip leading and trailing whitespace
@@ -778,21 +812,24 @@ static void processList()
int l = s.length();
QCString elemStr;
+ bool wasQuote=false;
// helper to push elemStr to the list and clear it
- auto addElem = [&elemStr]()
+ auto addElem = [&elemStr,&wasQuote]()
{
if (!elemStr.isEmpty())
{
QCString e = configStringRecode(elemStr,g_encoding,"UTF-8");
//printf("Processed list element '%s'\n",qPrint(e));
+ if (wasQuote) e = "\""+e+"\"";
+ wasQuote = false;
g_list->push_back(e.str());
elemStr="";
}
};
bool needsSeparator=false;
- int insideQuote=false;
+ bool insideQuote=false;
bool warned=false;
for (int i=0;i<l;i++)
{
@@ -818,6 +855,7 @@ static void processList()
if (!insideQuote)
{
insideQuote=true;
+ wasQuote=true;
}
else // this quote ends an element
{
@@ -944,13 +982,16 @@ static void readIncludeFile(const QCString &incName)
%}
%option noyywrap
-%option nounput
+
+REGEX_a [a-z_A-Z\x80-\xFF]
+REGEX_w [a-z_A-Z0-9\x80-\xFF]
%x Start
%x SkipInvalid
%x GetString
%x GetStrList
%x Include
+%x StoreRepl
%%
@@ -1118,6 +1159,31 @@ static void readIncludeFile(const QCString &incName)
<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_list=&g_includePathList; g_list->clear(); g_listStr=""; }
/* include a g_config file */
<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
+<Start>"$("{REGEX_a}({REGEX_w}|[.-])*")" | // e.g. $(HOME)
+<Start>"$("{REGEX_a}({REGEX_w}|[.-])*"("{REGEX_a}({REGEX_w}|[.-])*"))" { // e.g. $(PROGRAMFILES(X86))
+ g_localStoreRepl = yytext;
+ if (g_compareMode == Config::CompareMode::CompressedNoEnv) // the x_noenv
+ {
+ BEGIN(StoreRepl);
+ }
+ else
+ {
+ substEnvVarsInString(g_localStoreRepl);
+ unput_string(g_localStoreRepl.data(),g_localStoreRepl.length());
+ }
+ }
+<Start>"@"{REGEX_a}{REGEX_w}*"@" {
+ if (g_compareMode == Config::CompareMode::CompressedNoEnv) // the x_noenv
+ {
+ g_localStoreRepl = yytext;
+ BEGIN(StoreRepl);
+ }
+ else
+ {
+ config_warn("ignoring unknown '%s' at line %d, file %s\n",
+ yytext,g_yyLineNr,qPrint(g_yyFileName));
+ }
+ }
<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
readIncludeFile(configStringRecode(yytext,g_encoding,"UTF-8"));
BEGIN(Start);
@@ -1146,6 +1212,25 @@ static void readIncludeFile(const QCString &incName)
<Start>[a-z_A-Z0-9]+ { config_warn("ignoring unknown tag '%s' at line %d, file %s\n",yytext,g_yyLineNr,qPrint(g_yyFileName)); }
/*-------------- GetString ---------------*/
+<StoreRepl>\n {
+ g_localStoreRepl += yytext;
+ processStoreRepl(g_localStoreRepl);
+ g_config->appendStoreRepl(g_localStoreRepl + "\n");
+ g_localStoreRepl.resize(0);
+ g_yyLineNr++; // end of string
+ BEGIN(Start);
+ }
+<StoreRepl>\\[ \r\t]*\n { g_yyLineNr++; // line continuation
+ g_localStoreRepl += yytext;
+ }
+<StoreRepl>"\\" { // escape character
+ g_localStoreRepl += yytext;
+ }
+<StoreRepl>[^\n\\]+ { // string part without escape characters
+ g_localStoreRepl += yytext;
+ }
+ /*-------------- GetString ---------------*/
+
<GetString>\n { processString();
g_yyLineNr++; // end of string
BEGIN(Start);
@@ -1224,14 +1309,19 @@ void ConfigImpl::writeTemplate(TextStream &t,bool sl,bool upd)
}
}
-void ConfigImpl::compareDoxyfile(TextStream &t)
+void ConfigImpl::compareDoxyfile(TextStream &t,Config::CompareMode compareMode)
{
t << "# Difference with default Doxyfile " << getFullVersion();
t << "\n";
for (const auto &option : m_options)
{
option->m_userComment = "";
- option->compareDoxyfile(t);
+ option->compareDoxyfile(t,compareMode);
+ }
+ if (!m_storeRepl.isEmpty())
+ {
+ t << "\n";
+ t << takeStoreRepl() << "\n";
}
}
@@ -1246,11 +1336,11 @@ void ConfigImpl::writeXMLDoxyfile(TextStream &t)
t << "</doxyfile>\n";
}
-void ConfigImpl::convertStrToVal()
+void ConfigImpl::convertStrToVal(Config::CompareMode compareMode)
{
for (const auto &option : m_options)
{
- option->convertStrToVal();
+ option->convertStrToVal(compareMode);
}
}
void ConfigImpl::emptyValueToDefault()
@@ -1261,6 +1351,17 @@ void ConfigImpl::emptyValueToDefault()
}
}
+static const reg::Ex reEnvVar(R"(\$\((\a[\w.-]*)\))"); // e.g. $(HOME)
+static const reg::Ex reEnvVarExt(R"(\$\((\a[\w.-]*\(\a[\w.-]*\))\))"); // e.g. $(PROGRAMFILES(X86))
+static const reg::Ex reEnvVarCMake(R"(@\a\w*@)"); // CMake type replacement
+
+static bool containsEnvVar(QCString &str)
+{
+ reg::Match m;
+ std::string s = str.str();
+ return reg::search(s,m,reEnvVar) || reg::search(s,m,reEnvVarExt) || reg::search(s,m,reEnvVarCMake);
+}
+
static void substEnvVarsInString(QCString &str)
{
if (str.isEmpty()) return;
@@ -1286,10 +1387,7 @@ static void substEnvVarsInString(QCString &str)
return result;
};
- // match e.g. re1=$(HOME) but also re2=$(PROGRAMFILES(X86))
- static const reg::Ex re1(R"(\$\((\a[\w.-]*)\))");
- static const reg::Ex re2(R"(\$\((\a[\w.-]*\(\a[\w.-]*\))\))");
- str = QCString(replace(replace(str.str(),re1),re2)).stripWhiteSpace();
+ str = QCString(replace(replace(str.str(),reEnvVar),reEnvVarExt)).stripWhiteSpace();
}
static void substEnvVarsInStrList(StringVector &sl)
@@ -1298,7 +1396,15 @@ static void substEnvVarsInStrList(StringVector &sl)
for (const auto &s : sl)
{
QCString result = s.c_str();
- bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1) || (result.find('"')!=-1);
+ bool wasQuoted = ((result.at(0)=='"') && (result.at(result.length()-1)=='"'));
+ if (wasQuoted)
+ {
+ result = result.mid(1,result.length()-2);
+ }
+ else
+ {
+ wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1) || (result.find('"')!=-1);
+ }
// here we strip the quote again
substEnvVarsInString(result);
@@ -1518,7 +1624,6 @@ static bool checkFileName(const QCString &s,const char *optionName)
return true;
}
-#include "config.h"
void Config::init()
{
@@ -1583,6 +1688,33 @@ static void adjustStringSetting(const char *depOption, const char *optionName,co
}
}
+static void adjustColorStyleSetting(const char *depOption)
+{
+ auto updateColorStyle = [&depOption](HTML_COLORSTYLE_t curStyle,HTML_COLORSTYLE_t newStyle)
+ {
+ err("When enabling '%s' the 'HTML_COLORSTYLE' option should be either 'LIGHT' or 'DARK' but has value '%s'. I'll adjust it for you to '%s'.\n",
+ depOption,
+ qPrint(HTML_COLORSTYLE_enum2str(curStyle)),
+ qPrint(HTML_COLORSTYLE_enum2str(newStyle)));
+ Config_updateEnum(HTML_COLORSTYLE,newStyle);
+ };
+ auto colorStyle = Config_getEnum(HTML_COLORSTYLE);
+ switch (colorStyle)
+ {
+ case HTML_COLORSTYLE_t::LIGHT:
+ case HTML_COLORSTYLE_t::DARK:
+ // no adjustment needed
+ break;
+ case HTML_COLORSTYLE_t::AUTO_LIGHT:
+ case HTML_COLORSTYLE_t::TOGGLE:
+ updateColorStyle(colorStyle,HTML_COLORSTYLE_t::LIGHT);
+ break;
+ case HTML_COLORSTYLE_t::AUTO_DARK:
+ updateColorStyle(colorStyle,HTML_COLORSTYLE_t::DARK);
+ break;
+ }
+}
+
void Config::checkAndCorrect(bool quiet, const bool check)
{
@@ -1776,8 +1908,8 @@ void Config::checkAndCorrect(bool quiet, const bool check)
for (const auto &alias : aliasList)
{
// match aliases of the form re1='name=' and re2='name{2} ='
- static const reg::Ex re1(R"(^\a\w*\s*=)");
- static const reg::Ex re2(R"(^\a\w*{\d+}\s*=)");
+ static const reg::Ex re1(R"(^\a[\w-]*\s*=)");
+ static const reg::Ex re2(R"(^\a[\w-]*{\d+}\s*=)");
if (!reg::search(alias,re1) && !reg::search(alias,re2))
{
err("Illegal ALIASES format '%s'. Use \"name=value\" or \"name{n}=value\", where n is the number of arguments\n",
@@ -1798,6 +1930,10 @@ void Config::checkAndCorrect(bool quiet, const bool check)
checkList(Config_getList(FILTER_SOURCE_PATTERNS),"FILTER_SOURCE_PATTERNS",FALSE,FALSE);
//------------------------
+ // check INPUT_FILE_ENCODING
+ checkList(Config_getList(INPUT_FILE_ENCODING),"INPUT_FILE_ENCODING",TRUE,TRUE);
+
+ //------------------------
// check TAGFILES
checkList(Config_getList(TAGFILES),"TAGFILES",FALSE,TRUE);
@@ -1826,6 +1962,7 @@ void Config::checkAndCorrect(bool quiet, const bool check)
adjustBoolSetting( depOption, "HTML_DYNAMIC_MENUS", false );
adjustBoolSetting( depOption, "HTML_DYNAMIC_SECTIONS",false );
adjustStringSetting(depOption, "HTML_FILE_EXTENSION", ".html");
+ adjustColorStyleSetting(depOption);
}
// check for settings that are inconsistent with having INLINE_GROUPED_CLASSES enabled
@@ -1836,16 +1973,6 @@ void Config::checkAndCorrect(bool quiet, const bool check)
}
//------------------------
- // correct DOT_FONTNAME if needed
- QCString dotFontName=Config_getString(DOT_FONTNAME);
- if (dotFontName=="FreeSans" || dotFontName=="FreeSans.ttf")
- {
- warn_uncond("doxygen no longer ships with the FreeSans font.\n"
- " You may want to clear or change DOT_FONTNAME.\n"
- " Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
- }
-
- //------------------------
// clip number of threads
int dotNumThreads = Config_getInt(DOT_NUM_THREADS);
if (dotNumThreads>32)
@@ -2035,6 +2162,12 @@ void Config::checkAndCorrect(bool quiet, const bool check)
}
+static void updateAttribute(DotAttributes& attr, QCString name, ConfigObsolete* value)
+{
+ if (value==0 || value->valueStringRef()->isEmpty()) return;
+ attr.updateValue(name,*value->valueStringRef());
+}
+
void Config::updateObsolete()
{
//------------------------
@@ -2063,6 +2196,29 @@ void Config::updateObsolete()
}
}
}
+
+ auto fontname = dynamic_cast<ConfigObsolete*>(ConfigImpl::instance()->get("DOT_FONTNAME"));
+ auto fontsize = dynamic_cast<ConfigObsolete*>(ConfigImpl::instance()->get("DOT_FONTSIZE"));
+
+ // correct DOT_FONTNAME if needed
+ if (fontname &&
+ (*fontname->valueStringRef() == "FreeSans"
+ || *fontname->valueStringRef() == "FreeSans.ttf"))
+ warn_uncond("doxygen no longer ships with the FreeSans font.\n"
+ " You may want to clear or change DOT_FONTNAME.\n"
+ " Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
+
+ QCString& commonAttrStr = *dynamic_cast<ConfigString*>(ConfigImpl::instance()->get("DOT_COMMON_ATTR"))->valueRef();
+ DotAttributes commonAttr(commonAttrStr);
+ updateAttribute(commonAttr, "fontname", fontname);
+ updateAttribute(commonAttr, "fontsize", fontsize);
+ commonAttrStr = commonAttr.str();
+
+ QCString& edgeAttrStr = *dynamic_cast<ConfigString*>(ConfigImpl::instance()->get("DOT_EDGE_ATTR"))->valueRef();
+ DotAttributes edgeAttr(edgeAttrStr);
+ updateAttribute(edgeAttr, "labelfontname", fontname);
+ updateAttribute(edgeAttr, "labelfontsize", fontsize);
+ edgeAttrStr = edgeAttr.str();
}
void Config::writeTemplate(TextStream &t,bool shortList,bool update)
@@ -2070,10 +2226,10 @@ void Config::writeTemplate(TextStream &t,bool shortList,bool update)
ConfigImpl::instance()->writeTemplate(t,shortList,update);
}
-void Config::compareDoxyfile(TextStream &t,DoxyfileSettings diffList)
+void Config::compareDoxyfile(TextStream &t,Config::CompareMode compareMode)
{
- postProcess(FALSE, diffList);
- ConfigImpl::instance()->compareDoxyfile(t);
+ postProcess(FALSE, compareMode);
+ ConfigImpl::instance()->compareDoxyfile(t, compareMode);
}
void Config::writeXMLDoxyfile(TextStream &t)
@@ -2081,8 +2237,9 @@ void Config::writeXMLDoxyfile(TextStream &t)
ConfigImpl::instance()->writeXMLDoxyfile(t);
}
-bool Config::parse(const QCString &fileName,bool update)
+bool Config::parse(const QCString &fileName,bool update, Config::CompareMode compareMode)
{
+ g_compareMode = compareMode;
bool parseRes = ConfigImpl::instance()->parse(fileName,update);
if (!parseRes) return parseRes;
@@ -2094,11 +2251,12 @@ bool Config::parse(const QCString &fileName,bool update)
return parseRes;
}
-void Config::postProcess(bool clearHeaderAndFooter, DoxyfileSettings diffList)
+void Config::postProcess(bool clearHeaderAndFooter, Config::CompareMode compareMode)
{
- if (diffList != DoxyfileSettings::CompressedNoEnv) ConfigImpl::instance()->substituteEnvironmentVars();
- if (diffList == DoxyfileSettings::Full)ConfigImpl::instance()->emptyValueToDefault();
- ConfigImpl::instance()->convertStrToVal();
+ auto configInst = ConfigImpl::instance();
+ if (compareMode != CompareMode::CompressedNoEnv) configInst->substituteEnvironmentVars();
+ if (compareMode == CompareMode::Full) configInst->emptyValueToDefault();
+ configInst->convertStrToVal(compareMode);
// avoid bootstrapping issues when the g_config file already
// refers to the files that we are supposed to parse.
diff --git a/src/context.cpp b/src/context.cpp
index 34c351e..346e28d 100644
--- a/src/context.cpp
+++ b/src/context.cpp
@@ -1034,7 +1034,7 @@ const PropertyMap<TranslateContext::Private> TranslateContext::Private::s_inst {
{ "classIndex", &Private::classIndex },
//%% string concepts
{ "concepts", &Private::concepts },
- //%% string conceptDefintion
+ //%% string conceptDefinition
{ "conceptDefinition", &Private::conceptDefinition },
//%% string namespaceIndex
{ "namespaceIndex", &Private::namespaceIndex },
@@ -7022,7 +7022,7 @@ class NavPathElemContext::Private
}
else if (type==Definition::TypeClass)
{
- if (text.right(2)=="-p")
+ if (text.endsWith("-p"))
{
text = text.left(text.length()-2);
}
diff --git a/src/datetime.cpp b/src/datetime.cpp
new file mode 100644
index 0000000..b5ec3b3
--- /dev/null
+++ b/src/datetime.cpp
@@ -0,0 +1,231 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <cstdlib>
+#include <chrono>
+#include <memory>
+#include <array>
+#include <functional>
+
+#include "regex.h"
+#include "datetime.h"
+#include "config.h"
+#include "portable.h"
+#include "language.h"
+#include "message.h"
+#include "growbuf.h"
+
+std::tm getCurrentDateTime()
+{
+ QCString sourceDateEpoch = Portable::getenv("SOURCE_DATE_EPOCH");
+ if (!sourceDateEpoch.isEmpty()) // see https://reproducible-builds.org/specs/source-date-epoch/
+ {
+ bool ok;
+ uint64 epoch = sourceDateEpoch.toUInt64(&ok);
+ if (!ok)
+ {
+ static bool warnedOnce=FALSE;
+ if (!warnedOnce)
+ {
+ warn_uncond("Environment variable SOURCE_DATE_EPOCH does not contain a valid number; value is '%s'\n",
+ qPrint(sourceDateEpoch));
+ warnedOnce=TRUE;
+ }
+ }
+ else // use given epoch value as current 'built' time
+ {
+ auto epoch_start = std::chrono::time_point<std::chrono::system_clock>{};
+ auto epoch_seconds = std::chrono::seconds(epoch);
+ auto build_time = epoch_start + epoch_seconds;
+ std::time_t time = std::chrono::system_clock::to_time_t(build_time);
+ return *gmtime(&time);
+ }
+ }
+
+ // return current local time
+ auto now = std::chrono::system_clock::now();
+ std::time_t time = std::chrono::system_clock::to_time_t(now);
+ return *localtime(&time);
+}
+
+QCString dateToString(bool includeTime)
+{
+ auto current = getCurrentDateTime();
+ return theTranslator->trDateTime(current.tm_year + 1900,
+ current.tm_mon + 1,
+ current.tm_mday,
+ (current.tm_wday+6)%7+1, // map: Sun=0..Sat=6 to Mon=1..Sun=7
+ current.tm_hour,
+ current.tm_min,
+ current.tm_sec,
+ includeTime);
+}
+
+QCString yearToString()
+{
+ auto current = getCurrentDateTime();
+ return QCString().setNum(current.tm_year+1900);
+}
+
+struct SpecFormat
+{
+ const reg::Ex re;
+ int count;
+ int offset;
+ int format;
+};
+
+using TMFieldAssigner = std::function< void(std::tm &,int value) >;
+
+struct DateTimeField
+{
+ TMFieldAssigner assigner;
+ int minVal;
+ int maxVal;
+ const char *name;
+};
+
+static std::array<SpecFormat,5> g_specFormats
+{{
+ // regular expression, num values, offset, format bits
+ { std::string(R"((\d+)-(\d+)-(\d+)\s*(\d+):(\d+):(\d+))"), 6, 0, SF_Date|SF_Time|SF_Seconds }, // format 13-04-2015 12:34:56
+ { std::string(R"((\d+)-(\d+)-(\d+)\s*(\d+):(\d+))"), 5, 0, SF_Date|SF_Time }, // format 13-04-2015 12:34
+ { std::string(R"((\d+)-(\d+)-(\d+))"), 3, 0, SF_Date }, // format 13-04-2015
+ { std::string(R"((\d+):(\d+):(\d+))"), 3, 3, SF_Time|SF_Seconds }, // format 12:34:56
+ { std::string(R"((\d+):(\d+))"), 2, 3, SF_Time } // format 12:34
+}};
+
+static std::array<DateTimeField,6> g_assignValues
+{{
+ // assigner, minVal, maxVal, name
+ { [](std::tm &tm,int value) { tm.tm_year = value-1900; }, 1900, 9999, "year" },
+ { [](std::tm &tm,int value) { tm.tm_mon = value-1; }, 1, 12, "month" },
+ { [](std::tm &tm,int value) { tm.tm_mday = value; }, 1, 31, "day" },
+ { [](std::tm &tm,int value) { tm.tm_hour = value; }, 0, 23, "hour" },
+ { [](std::tm &tm,int value) { tm.tm_min = value; }, 0, 59, "minute" },
+ { [](std::tm &tm,int value) { tm.tm_sec = value; }, 0, 59, "second" }
+}};
+
+static void determine_weekday( std::tm& tm )
+{
+ auto cpy = tm;
+ // there are some problems when the hr:min:sec are on 00:00:00 in determining the weekday
+ cpy.tm_hour = 12;
+ const auto as_time_t = std::mktime( &cpy ) ;
+ if (as_time_t != -1)
+ {
+ cpy = *std::localtime( &as_time_t ) ;
+ tm.tm_wday = cpy.tm_wday;
+ }
+}
+
+QCString dateTimeFromString(const QCString &spec,std::tm &dt,int &format)
+{
+ // for an empty spec field return the current date and time
+ dt = getCurrentDateTime();
+ if (spec.isEmpty())
+ {
+ format = SF_Date | SF_Time | SF_Seconds;
+ return QCString();
+ }
+
+ // find a matching pattern
+ std::string s = spec.str();
+ for (const auto &fmt : g_specFormats)
+ {
+ reg::Match m;
+ if (reg::match(s,m,fmt.re)) // match found
+ {
+ for (int i=0; i<fmt.count; i++)
+ {
+ int value = std::atoi(m[i+1].str().c_str());
+ const DateTimeField &dtf = g_assignValues[i+fmt.offset];
+ if (value<dtf.minVal || value>dtf.maxVal) // check if the value is in the expected range
+ {
+ return QCString().sprintf("value for %s is %d which is outside of the value range [%d..%d]",
+ dtf.name, value, dtf.minVal, dtf.maxVal);
+ }
+ dtf.assigner(dt,value);
+ }
+ format = fmt.format;
+ if (format&SF_Date) // if we have a date also determine the weekday
+ {
+ determine_weekday(dt);
+ }
+ return QCString();
+ }
+ }
+
+ // no matching pattern found
+ return "invalid or non representable date/time argument";
+}
+
+QCString formatDateTime(const QCString &format,const std::tm &dt,int &formatUsed)
+{
+ formatUsed = 0;
+ auto getYear = [](const std::tm &dat) { return dat.tm_year+1900; };
+ auto getMonth = [](const std::tm &dat) { return dat.tm_mon+1; };
+ auto getDay = [](const std::tm &dat) { return dat.tm_mday; };
+ auto getDayOfWeek = [](const std::tm &dat) { return (dat.tm_wday+6)%7+1; };
+ GrowBuf growBuf;
+ char c;
+ const char *p = format.data();
+ const char *fmt_zero = "%02d";
+ const char *fmt_nonzero = "%d";
+ const char *fmt_selected = 0;
+ if (p==0) return QCString();
+ while ((c=*p++))
+ {
+ char nc = *p;
+ switch (c)
+ {
+ case '%':
+ fmt_selected = nc=='-' ? fmt_nonzero : fmt_zero; // %-H produces 1 and %H produces 01
+ if (nc=='-') nc=*++p; // skip over -
+ switch (nc)
+ {
+ case '%': growBuf.addChar('%'); break;
+ case 'y': growBuf.addInt(fmt_selected,getYear(dt)%100); formatUsed|=SF_Date; break;
+ case 'Y': growBuf.addInt("%d",getYear(dt)); formatUsed|=SF_Date; break;
+ case 'm': growBuf.addInt(fmt_selected,getMonth(dt)); formatUsed|=SF_Date; break;
+ case 'b': growBuf.addStr(theTranslator->trMonth(getMonth(dt),false,false)); formatUsed|=SF_Date; break;
+ case 'B': growBuf.addStr(theTranslator->trMonth(getMonth(dt),false,true)); formatUsed|=SF_Date; break;
+ case 'd': growBuf.addInt(fmt_selected,getDay(dt)); formatUsed|=SF_Date; break;
+ case 'u': growBuf.addInt("%d",getDayOfWeek(dt)); /* Monday = 1 ... Sunday = 7 */ formatUsed|=SF_Date; break;
+ case 'w': growBuf.addInt("%d",getDayOfWeek(dt)%7); /* Sunday = 0 ... Saturday = 6 */ formatUsed|=SF_Date; break;
+ case 'a': growBuf.addStr(theTranslator->trDayOfWeek(getDayOfWeek(dt),false,false)); formatUsed|=SF_Date; break;
+ case 'A': growBuf.addStr(theTranslator->trDayOfWeek(getDayOfWeek(dt),false,true)); formatUsed|=SF_Date; break;
+ case 'H': growBuf.addInt(fmt_selected,dt.tm_hour); formatUsed|=SF_Time; break;
+ case 'I': growBuf.addInt(fmt_selected,dt.tm_hour%12); formatUsed|=SF_Time; break;
+ case 'p': growBuf.addStr(theTranslator->trDayPeriod(dt.tm_hour>=12?1:0)); formatUsed|=SF_Time; break;
+ case 'M': growBuf.addInt(fmt_selected,dt.tm_min); formatUsed|=SF_Time; break;
+ case 'S': growBuf.addInt(fmt_selected,dt.tm_sec); formatUsed|=SF_Seconds; break;
+ default:
+ growBuf.addChar(c);
+ if (*(p-1)=='-') growBuf.addChar('-');
+ growBuf.addChar(nc);
+ break;
+ }
+ p++;
+ break;
+ default:
+ growBuf.addChar(c);
+ break;
+ }
+ }
+ growBuf.addChar(0);
+ return growBuf.get();
+}
+
diff --git a/src/datetime.h b/src/datetime.h
new file mode 100644
index 0000000..746c1dc
--- /dev/null
+++ b/src/datetime.h
@@ -0,0 +1,73 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DATETIME_H
+#define DATETIME_H
+
+#include <ctime>
+#include "qcstring.h"
+
+/** @brief Date and time related functions. */
+
+constexpr int SF_Date = 1<<0; //!< a date is presenting in the format string
+constexpr int SF_Time = 1<<1; //!< a time is presenting in the format string
+constexpr int SF_Seconds = 1<<2; //!< the seconds are presenting in the format string
+constexpr int SF_NumBits = 3; //!< number of bits in SF vector
+
+/** Helper function that returns the name related one of the SF bits. Used for generating warnings.
+ * @param[in] bitNumber bit value in range [0..SF_NumBits) for which to return the string value.
+ */
+constexpr const char *SF_bit2str(int bitNumber)
+{
+ constexpr const char *partNames[] = { "date", "time", "seconds" };
+ return bitNumber>=0 && bitNumber<SF_NumBits ? partNames[bitNumber] : "";
+}
+
+/** Returns the filled in std::tm for a given string representing a date and/or time.
+ *
+ * @param[in] spec The string representation of the date and/or time
+ * Possible formats:
+ * - the empty string: the current date and time is returned
+ * - `YYYY-MM-DD HH:MM:SS`: the date and time are fully specified
+ * - `YYYY-MM-DD HH:MM`: the date and time without seconds
+ * - `YYYY-MM-DD`: the date without time
+ * - `HH:MM:SS`: the time with seconds but without date
+ * - `HH:MM`: the time without seconds and without date
+ *
+ * @param[out] dt The corresponding datetime value.
+ * @param[out] format The parts that have been found in spec; a bitwise or
+ * of `SF_Date`, `SF_Time` and `SF_Seconds`.
+ * @returns An empty string if the spec has a supported format,
+ * or an error message if the format is invalid.
+ */
+QCString dateTimeFromString(const QCString &spec,std::tm &dt,int &format);
+
+
+/** Return a string representation for a given std::tm value that is formatted according to the
+ * pattern given by a format.
+ * @param[in] format the string used for format the date and time, e.g. `%Y-%m-%d`
+ * @param[in] dt the date and time value to fill in
+ * @param[out] formatUsed A bitwise OR of `SF_Date`, `SF_Time` and `SF_Seconds` representing the
+ * the types of markers found in the format string.
+ */
+QCString formatDateTime(const QCString &format,const std::tm &dt,int &formatUsed);
+
+/** Returns the filled in std::tm for the current date and time */
+std::tm getCurrentDateTime();
+
+/** Returns the current year as a string */
+QCString yearToString();
+
+#endif
diff --git a/src/debug.cpp b/src/debug.cpp
index 841bc46..fdf3138 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -36,7 +36,6 @@ static std::map< std::string, Debug::DebugMask > s_labels =
{ "classes", Debug::Classes },
{ "commentcnv", Debug::CommentCnv },
{ "commentscan", Debug::CommentScan },
- { "validate", Debug::Validate },
{ "printtree", Debug::PrintTree },
{ "time", Debug::Time },
{ "extcmd", Debug::ExtCmd },
diff --git a/src/debug.h b/src/debug.h
index e2f321e..ef5620b 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -30,7 +30,6 @@ class Debug
Classes = 0x00000010,
CommentCnv = 0x00000020,
CommentScan = 0x00000040,
- Validate = 0x00000080,
PrintTree = 0x00000100,
Time = 0x00000200,
ExtCmd = 0x00000400,
diff --git a/src/declinfo.l b/src/declinfo.l
index 2e578b0..4a25ce6 100644
--- a/src/declinfo.l
+++ b/src/declinfo.l
@@ -127,6 +127,16 @@ ID ([$a-z_A-Z\x80-\xFF][$a-z_A-Z0-9\x80-\xFF]*)|(@[0-9]+)
addTypeName(yyscanner);
yyextra->name += removeRedundantWhiteSpace(QCString(yytext));
}
+<Start>"anonymous_namespace{"[^}]+"}" { // anonymous namespace
+ if (!yyextra->scope.isEmpty())
+ {
+ yyextra->scope+=QCString("::")+yytext;
+ }
+ else
+ {
+ yyextra->scope = yytext;
+ }
+ }
<Start>([~!]{B}*)?{ID}/({B}*"["{B}*"]")* { // the []'s are for Java,
// the / was add to deal with multi-
// dimensional C++ arrays like A[][15]
@@ -136,7 +146,7 @@ ID ([$a-z_A-Z\x80-\xFF][$a-z_A-Z0-9\x80-\xFF]*)|(@[0-9]+)
yyextra->name += removeRedundantWhiteSpace(QCString(yytext));
}
<Start>{B}*"::"{B}* { // found a yyextra->scope specifier
- if (!yyextra->scope.isEmpty())
+ if (!yyextra->scope.isEmpty() && !yyextra->scope.endsWith("::"))
{
yyextra->scope+="::"+yyextra->name; // add yyextra->name to yyextra->scope
}
@@ -347,28 +357,6 @@ void parseFuncDecl(const QCString &decl,const SrcLangExt lang,QCString &cl,QCStr
yyextra->name=yyextra->name.left(nb);
}
-#if 0
- {
- int l=yyextra->scope.length();
- int i=0;
- int skipCount=0;
- cl.resize(0);
- ctl.resize(0);
- for (i=0;i<l;i++)
- {
- char c=yyextra->scope.at(i);
- if (c=='<')
- skipCount++;
- else if (c=='>')
- skipCount--;
- else if (skipCount==0)
- cl+=c;
- }
- }
- cl=stripTemplateSpecifiersFromScope(removeRedundantWhiteSpace(yyextra->scope),FALSE);
- ctl.resize(0);
-#endif
-
cl=yyextra->scope;
n=removeRedundantWhiteSpace(yyextra->name);
int il,ir;
diff --git a/src/defargs.l b/src/defargs.l
index 121b21b..e96664a 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -437,8 +437,8 @@ CPPC "/\/"
// and need to correct it to avoid seeing a nameless parameter
// "struct A" as a parameter with type "struct" and name "A".
int sv=0;
- if (a.type.left(6)=="const ") sv=6;
- else if (a.type.left(9)=="volatile ") sv=9;
+ if (a.type.startsWith("const ")) sv=6;
+ else if (a.type.startsWith("volatile ")) sv=9;
if (a.type.mid(sv)=="struct" ||
a.type.mid(sv)=="union" ||
diff --git a/src/define.h b/src/define.h
index 6cbb636..0a0dc8f 100644
--- a/src/define.h
+++ b/src/define.h
@@ -42,6 +42,7 @@ class Define
bool varArgs = FALSE;
bool isPredefined = FALSE;
bool nonRecursive = FALSE;
+ bool expandAsDefined = FALSE;
};
/** List of all macro definitions */
diff --git a/src/definition.cpp b/src/definition.cpp
index cd256bf..e8136a7 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -3,12 +3,12 @@
#include <iterator>
#include <unordered_map>
#include <string>
-
#include <ctype.h>
-#include "md5.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
+
+#include "md5.h"
#include "regex.h"
#include "config.h"
#include "definitionimpl.h"
@@ -34,6 +34,8 @@
#include "bufstr.h"
#include "reflist.h"
#include "utf8.h"
+#include "indexlist.h"
+#include "fileinfo.h"
//-----------------------------------------------------------------------------------------
@@ -208,6 +210,7 @@ static void addToMap(const QCString &name,Definition *d)
if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
if (!symbolName.isEmpty())
{
+ //printf("adding symbol %s\n",qPrint(symbolName));
Doxygen::symbolMap->add(symbolName,d);
d->_setSymbolName(symbolName);
@@ -370,10 +373,10 @@ void DefinitionImpl::addSectionsToIndex()
}
QCString title = si->title();
if (title.isEmpty()) title = si->label();
- // determine if there is a next level inside this item
+ // determine if there is a next level inside this item, but be aware of the anchor and table section references.
auto it_next = std::next(it);
bool isDir = (it_next!=m_impl->sectionRefs.end()) ?
- (static_cast<int>((*it_next)->type()) > nextLevel) : FALSE;
+ (isSection((*it_next)->type()) && static_cast<int>((*it_next)->type()) > nextLevel) : FALSE;
Doxygen::indexList->addContentsItem(isDir,title,
getReference(),
m_impl->def->getOutputFileBase(),
@@ -849,7 +852,7 @@ bool readCodeFragment(const QCString &fileName,
Debug::print(Debug::FilterOutput,0,"-------------\n%s\n-------------\n",qPrint(result));
}
}
- result = transcodeCharacterStringToUTF8(result);
+ result = transcodeCharacterStringToUTF8(getEncoding(FileInfo(fileName.str())),result);
if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n";
//printf("readCodeFragment(%d-%d)=%s\n",startLine,endLine,qPrint(result));
return found;
@@ -1365,7 +1368,7 @@ QCString DefinitionImpl::navigationPathAsString() const
else if (m_impl->def->definitionType()==Definition::TypeClass)
{
QCString name = locName;
- if (name.right(2)=="-p" /*|| name.right(2)=="-g"*/)
+ if (name.endsWith("-p"))
{
name = name.left(name.length()-2);
}
@@ -1565,12 +1568,12 @@ QCString DefinitionImpl::documentation() const
int DefinitionImpl::docLine() const
{
- return m_impl->details ? m_impl->details->line : 1;
+ return m_impl->details ? m_impl->details->line : m_impl->brief ? m_impl->brief->line : 1;
}
QCString DefinitionImpl::docFile() const
{
- return m_impl->details ? m_impl->details->file : QCString("<"+m_impl->name+">");
+ return m_impl->details ? m_impl->details->file : m_impl->brief ? m_impl->brief->file : QCString("<"+m_impl->name+">");
}
//----------------------------------------------------------------------------
diff --git a/src/diagram.cpp b/src/diagram.cpp
index 6cfbb17..c6d18b5 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -26,7 +26,7 @@
#include "util.h"
#include "doxygen.h"
#include "portable.h"
-#include "index.h"
+#include "indexlist.h"
#include "classlist.h"
#include "textstream.h"
@@ -216,7 +216,7 @@ static void writeBitmapBox(DiagramItem *di,Image *image,
uint x,uint y,uint w,uint h,bool firstRow,
bool hasDocs,bool children=FALSE)
{
- uchar colFill = hasDocs ? (firstRow ? 0 : 2) : 7;
+ uchar colFill = hasDocs ? (firstRow ? 8 : 2) : 7;
uchar colBorder = (firstRow || !hasDocs) ? 1 : 3;
uint l = Image::stringLength(di->label());
uint mask=virtToMask(di->virtualness());
@@ -287,7 +287,7 @@ QCString DiagramItem::label() const
// we use classDef->name() here and not displayName() in order
// to get the name used in the inheritance relation.
QCString n = m_classDef->name();
- if (/*n.right(2)=="-g" ||*/ n.right(2)=="-p")
+ if (n.endsWith("-p"))
{
n = n.left(n.length()-2);
}
diff --git a/src/dir.cpp b/src/dir.cpp
index 36c7051..4fc06ea 100644
--- a/src/dir.cpp
+++ b/src/dir.cpp
@@ -60,8 +60,9 @@ std::string DirEntry::path() const
struct DirIterator::Private
{
Private() : it() {}
- Private(const std::string &path) : it(path) {}
+ Private(const std::string &path) : it(path,ec) {}
fs::directory_iterator it;
+ std::error_code ec;
mutable DirEntry current;
};
diff --git a/src/dispatcher.h b/src/dispatcher.h
new file mode 100644
index 0000000..fc03598
--- /dev/null
+++ b/src/dispatcher.h
@@ -0,0 +1,101 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DISPATCHER_H
+#define DISPATCHER_H
+
+#include <cstddef>
+#include <utility>
+#include <functional>
+#include <variant>
+#include <type_traits>
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// idea based on https://mpark.github.io/programming/2019/01/22/variant-visitation-v2/
+
+namespace detail
+{
+
+//! Represents an unreachable piece of code
+#ifdef __GNUC__ // GCC 4.8+, Clang, Intel and other compilers compatible with GCC (-std=c++0x or above)
+[[noreturn]] inline __attribute__((always_inline)) void unreachable() { __builtin_unreachable(); }
+#elif defined(_MSC_VER) // MSVC
+[[noreturn]] __forceinline void unreachable() { __assume(false); }
+#else // ???
+#warning "no implementation of unreachable for this compiler!"
+inline void unreachable() {}
+#endif
+
+//! generic template declaration for the Dispatcher without implementation
+template<bool valid>
+struct Dispatcher;
+
+//! specialization for the invalid case, signaling the compiler that the path is unreachable
+template<>
+struct Dispatcher<false>
+{
+ //! case corresponding with the non-existing I'th type of variant V
+ template<template<class> class W, std::size_t I, class V, class... As>
+ static constexpr void case_(V &&, As &&...) { unreachable(); }
+};
+
+//! specialization for the valid case, where `case_` invokes a specific method.
+template<>
+struct Dispatcher<true>
+{
+ //! Invokes the method of a class `X` whose method pointer type is defined by `W<X>::method`
+ //! where `X` matches the I'th type of variant `V` on the object held by `v`.
+ template<template<class> class W, std::size_t I, class V, class... As>
+ static constexpr void case_(V &&v, As &&... args) {
+ using Alt = std::variant_alternative_t<I,std::decay_t<V>>;
+ std::invoke( W<Alt>::method, std::get<I>( std::forward<V>(v) ), std::forward<As>(args)... );
+ }
+};
+
+} // namespace detail
+
+//! Invokes the method of a class `X` whose member pointer type is defined by `W<X>::method`
+//! where `X` matches the type of the object held by `v` that is stored in a variant `V`.
+//! \tparam W a template class where `W<X>::method` points to a method of class `X` one of the types of `V`.
+//! \tparam V the type of the variant
+//! \tparam As the parameter types used to invoke the method
+//! \param v a object of the variant type for which to invoke the method
+//! \param args the parameters to pass to the method
+//! \note This implementation assumes a maximum of 10 types in the variant (easy to extend though by adding more cases).
+template<template<class> class W,class V, class...As>
+static constexpr void dispatch_call(V &&v,As &&... args)
+{
+ // size holds the number of type of variant `V`
+ constexpr std::size_t size = std::variant_size_v<std::decay_t<V>>;
+ // which on a worst case maximum number of types in `V`.
+ // fills in an unreachable branch for indices equal or higher than size.
+ switch (v.index())
+ {
+#define DISPATCH_AT(n) case n: detail::Dispatcher< ((n)<size) >::template case_<W,n>(v,std::forward<As>(args)...); break;
+ DISPATCH_AT(0)
+ DISPATCH_AT(1)
+ DISPATCH_AT(2)
+ DISPATCH_AT(3)
+ DISPATCH_AT(4)
+ DISPATCH_AT(5)
+ DISPATCH_AT(6)
+ DISPATCH_AT(7)
+ DISPATCH_AT(8)
+ DISPATCH_AT(9)
+#undef DISPATCH_AT
+ }
+}
+
+#endif // DISPATCHER_H
diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp
index ac502a2..00a0e86 100644
--- a/src/docbookgen.cpp
+++ b/src/docbookgen.cpp
@@ -335,7 +335,7 @@ DB_GEN_C
}
pageName = fileName;
relPath = relativePathToRoot(fileName);
- if (fileName.right(4)!=".xml") fileName+=".xml";
+ if (!fileName.endsWith(".xml")) fileName+=".xml";
startPlainFile(fileName);
m_codeGen.setRelativePath(relPath);
m_codeGen.setSourceFileName(stripPath(fileName));
@@ -761,12 +761,12 @@ DB_GEN_C
void DocbookGenerator::writeNonBreakableSpace(int n)
{
DB_GEN_C
- for (int i=0;i<n;i++) m_t << " ";
+ for (int i=0;i<n;i++) m_t << "&#160;";
}
void DocbookGenerator::lineBreak(const QCString &)
{
DB_GEN_C
- m_t << "\n";
+ m_t << "<?linebreak?>";
}
void DocbookGenerator::startTypewriter()
{
diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp
index 58bf25e..27d5bef 100644
--- a/src/docbookvisitor.cpp
+++ b/src/docbookvisitor.cpp
@@ -245,7 +245,7 @@ void DocbookDocVisitor::operator()(const DocLineBreak &)
{
DB_VIS_C
if (m_hide) return;
- m_t << "\n<literallayout>&#160;&#xa;</literallayout>\n";
+ m_t << "<?linebreak?>";
// gives nicer results but gives problems as it is not allowed in <pare> and also problems with dblatex
// m_t << "\n" << "<sbr/>\n";
}
@@ -306,20 +306,8 @@ DB_VIS_C
case DocStyleChange::Ins: break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- if (s.enable())
- {
- m_t << "\n";
- m_t << "<para>";
- }
- else
- {
- m_t << "</para>";
- m_t << "\n";
- }
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
- if (s.enable()) m_t << "<emphasis role=\"bold\">"; else m_t << "</emphasis>";
+ if (s.enable()) m_t << "<para><emphasis role=\"bold\">"; else m_t << "</emphasis></para>";
break;
}
}
@@ -1116,17 +1104,17 @@ DB_VIS_C
}
else if (opt.name=="class")
{
- if (opt.value.left(13)=="markdownTable") // handle markdown generated attributes
+ if (opt.value.startsWith("markdownTable")) // handle markdown generated attributes
{
- if (opt.value.right(5)=="Right")
+ if (opt.value.endsWith("Right"))
{
m_t << " align='right'";
}
- else if (opt.value.right(4)=="Left")
+ else if (opt.value.endsWith("Left"))
{
m_t << " align='left'";
}
- else if (opt.value.right(6)=="Center")
+ else if (opt.value.endsWith("Center"))
{
m_t << " align='center'";
}
@@ -1184,6 +1172,17 @@ DB_VIS_C
m_t << "</link>";
}
+void DocbookDocVisitor::operator()(const DocHtmlDetails &d)
+{
+DB_VIS_C
+ if (m_hide) return;
+ m_t << "\n";
+ m_t << "<para>";
+ visitChildren(d);
+ m_t << "</para>";
+ m_t << "\n";
+}
+
void DocbookDocVisitor::operator()(const DocHtmlHeader &h)
{
DB_VIS_C
diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h
index 1a05f00..15533ff 100644
--- a/src/docbookvisitor.h
+++ b/src/docbookvisitor.h
@@ -86,6 +86,7 @@ class DocbookDocVisitor : public DocVisitor
void operator()(const DocHtmlCaption &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
diff --git a/src/docnode.cpp b/src/docnode.cpp
index 0b9462c..538ac7a 100644
--- a/src/docnode.cpp
+++ b/src/docnode.cpp
@@ -31,6 +31,8 @@
#include "vhdldocgen.h"
#include "doctokenizer.h"
#include "plantuml.h"
+#include "language.h"
+#include "datetime.h"
// debug off
#define DBG(x) do {} while(0)
@@ -96,7 +98,7 @@ static void unescapeCRef(QCString &s)
static QCString stripKnownExtensions(const QCString &text)
{
QCString result=text;
- if (result.right(4)==".tex")
+ if (result.endsWith(".tex"))
{
result=result.left(result.length()-4);
}
@@ -135,7 +137,6 @@ const char *DocStyleChange::styleString() const
case DocStyleChange::Del: return "del";
case DocStyleChange::Underline: return "u";
case DocStyleChange::Ins: return "ins";
- case DocStyleChange::Details: return "details";
case DocStyleChange::Summary: return "summary";
}
return "<invalid>";
@@ -499,12 +500,12 @@ bool DocXRefItem::parse(DocNodeVariant *thisVariant)
DocFormula::DocFormula(DocParser *parser,DocNodeVariant *parent,int id) : DocNode(parser,parent),
m_relPath(parser->context.relPath)
{
- QCString text = FormulaManager::instance().findFormula(id);
- if (!text.isEmpty())
+ const Formula *formula = FormulaManager::instance().findFormula(id);
+ if (formula && !formula->text().isEmpty())
{
m_id = id;
m_name.sprintf("form_%d",m_id);
- m_text = text;
+ m_text = formula->text();
}
else // wrong \_form#<n> command
{
@@ -1021,7 +1022,7 @@ bool DocDotFile::parse(DocNodeVariant *thisVariant)
bool ambig;
FileDef *fd = findFileDef(Doxygen::dotFileNameLinkedMap,p->name,ambig);
- if (fd==0 && p->name.right(4)!=".dot") // try with .dot extension as well
+ if (fd==0 && !p->name.endsWith(".dot")) // try with .dot extension as well
{
fd = findFileDef(Doxygen::dotFileNameLinkedMap,p->name+".dot",ambig);
}
@@ -1059,7 +1060,7 @@ bool DocMscFile::parse(DocNodeVariant *thisVariant)
bool ambig;
FileDef *fd = findFileDef(Doxygen::mscFileNameLinkedMap,p->name,ambig);
- if (fd==0 && p->name.right(4)!=".msc") // try with .msc extension as well
+ if (fd==0 && !p->name.endsWith(".msc")) // try with .msc extension as well
{
fd = findFileDef(Doxygen::mscFileNameLinkedMap,p->name+".msc",ambig);
}
@@ -1099,7 +1100,7 @@ bool DocDiaFile::parse(DocNodeVariant *thisVariant)
bool ambig;
FileDef *fd = findFileDef(Doxygen::diaFileNameLinkedMap,p->name,ambig);
- if (fd==0 && p->name.right(4)!=".dia") // try with .dia extension as well
+ if (fd==0 && !p->name.endsWith(".dia")) // try with .dia extension as well
{
fd = findFileDef(Doxygen::diaFileNameLinkedMap,p->name+".dia",ambig);
}
@@ -1285,6 +1286,29 @@ endheader:
}
//---------------------------------------------------------------------------
+int DocHtmlDetails::parse(DocNodeVariant *thisVariant)
+{
+ DBG(("DocHtmlHtmlDetails::parse() start\n"));
+ int retval=0;
+ auto ns = AutoNodeStack(parser(),thisVariant);
+
+ // parse one or more paragraphs
+ bool isFirst=TRUE;
+ DocPara *par=0;
+ do
+ {
+ auto vDocPara = children().append<DocPara>(parser(),thisVariant);
+ par = children().get_last<DocPara>();
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ retval=par->parse(vDocPara);
+ }
+ while (retval==TK_NEWPARA);
+ if (par) par->markLast();
+
+ DBG(("DocHtmlHtmlDetails::parse() end retval=%s\n",DocTokenizer::retvalToString(retval)));
+ return (retval==RetVal_EndHtmlDetails) ? RetVal_OK : retval;
+}
+
int DocHRef::parse(DocNodeVariant *thisVariant)
{
int retval=RetVal_OK;
@@ -3177,9 +3201,70 @@ int DocPara::handleXRefItem(DocNodeVariant *thisVariant)
return retval;
}
-void DocPara::handleIline(DocNodeVariant *)
+void DocPara::handleShowDate(DocNodeVariant *thisVariant)
{
- parser()->tokenizer.setStateIline();
+ DBG(("handleShowDate()\n"));
+ QCString fmt;
+ QCString date;
+ int tok=parser()->tokenizer.lex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '\\%s' command",
+ qPrint("showdate"));
+ return;
+ }
+ parser()->tokenizer.setStateQuotedString();
+ tok = parser()->tokenizer.lex();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <format> argument for command '\\showdate'");
+ parser()->tokenizer.setStatePara();
+ return;
+ }
+ fmt = parser()->context.token->name;
+
+ parser()->tokenizer.setStateShowDate();
+ tok = parser()->tokenizer.lex();
+
+ QCString specDate = parser()->context.token->name.stripWhiteSpace();
+ if (!specDate.isEmpty() && tok!=TK_WORD)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '\\showdate'");
+ parser()->tokenizer.setStatePara();
+ return;
+ }
+
+ std::tm dat{};
+ int specFormat=0;
+ QCString err = dateTimeFromString(specDate,dat,specFormat);
+ if (!err.isEmpty())
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '\\showdate': %s",qPrint(err));
+ parser()->tokenizer.setStatePara();
+ return;
+ }
+
+ int usedFormat=0;
+ QCString dateTimeStr = formatDateTime(fmt,dat,usedFormat);
+
+ // warn the user if the format contains markers that are not explicitly filled in
+ for (int i=0;i<SF_NumBits;i++)
+ {
+ int bitMask = 1<<i;
+ if ((usedFormat&bitMask) && !(specFormat&bitMask)) // a part was used in the format string but its value was not specified.
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"'\\showdate' <format> parameter '%s' has %s related markers which are not specified in the <date_time> parameter '%s'. Filling in the current value for %s instead.",
+ qPrint(fmt),SF_bit2str(i),qPrint(specDate),SF_bit2str(i));
+ }
+ }
+
+ children().append<DocWord>(parser(),thisVariant,dateTimeStr);
+ parser()->tokenizer.setStatePara();
+}
+void DocPara::handleILine(DocNodeVariant *)
+{
+ DBG(("handleILine()\n"));
+ parser()->tokenizer.setStateILine();
int tok = parser()->tokenizer.lex();
if (tok!=TK_WORD)
{
@@ -3189,6 +3274,29 @@ void DocPara::handleIline(DocNodeVariant *)
parser()->tokenizer.setStatePara();
}
+void DocPara::handleIFile(DocNodeVariant *)
+{
+ DBG(("handleIFile()\n"));
+ int tok=parser()->tokenizer.lex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\ifile command");
+ return;
+ }
+ parser()->tokenizer.setStateFile();
+ tok=parser()->tokenizer.lex();
+ parser()->tokenizer.setStatePara();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token %s as the argument of \\ifile",
+ DocTokenizer::tokToString(tok));
+ return;
+ }
+ parser()->context.fileName = parser()->context.token->name;
+ parser()->tokenizer.setStatePara();
+}
+
+
void DocPara::handleIncludeOperator(DocNodeVariant *thisVariant,const QCString &cmdName,DocIncOperator::Type t)
{
QCString saveCmdName = cmdName;
@@ -3759,6 +3867,12 @@ int DocPara::handleCommand(DocNodeVariant *thisVariant,const QCString &cmdName,
retval = RetVal_Paragraph;
}
break;
+ case CMD_ISTARTCODE:
+ {
+ parser()->tokenizer.setStateICode();
+ retval = handleStartCode(thisVariant);
+ }
+ break;
case CMD_STARTCODE:
{
parser()->tokenizer.setStateCode();
@@ -3866,9 +3980,17 @@ int DocPara::handleCommand(DocNodeVariant *thisVariant,const QCString &cmdName,
parser()->tokenizer.setStatePara();
}
break;
+ case CMD_IVERBATIM:
case CMD_VERBATIM:
{
- parser()->tokenizer.setStateVerbatim();
+ if (cmdId == CMD_VERBATIM)
+ {
+ parser()->tokenizer.setStateVerbatim();
+ }
+ else
+ {
+ parser()->tokenizer.setStateIVerbatim();
+ }
retval = parser()->tokenizer.lex();
children().append<DocVerbatim>(parser(),thisVariant,parser()->context.context,parser()->context.token->verb,DocVerbatim::Verbatim,parser()->context.isExample,parser()->context.exampleName);
if (retval==0) warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"verbatim section ended without end marker");
@@ -4027,6 +4149,7 @@ int DocPara::handleCommand(DocNodeVariant *thisVariant,const QCString &cmdName,
case CMD_ENDPARBLOCK:
retval=RetVal_EndParBlock;
break;
+ case CMD_ENDICODE:
case CMD_ENDCODE:
case CMD_ENDHTMLONLY:
case CMD_ENDMANONLY:
@@ -4036,6 +4159,7 @@ int DocPara::handleCommand(DocNodeVariant *thisVariant,const QCString &cmdName,
case CMD_ENDDBONLY:
case CMD_ENDLINK:
case CMD_ENDVERBATIM:
+ case CMD_ENDIVERBATIM:
case CMD_ENDILITERAL:
case CMD_ENDDOT:
case CMD_ENDMSC:
@@ -4216,8 +4340,14 @@ int DocPara::handleCommand(DocNodeVariant *thisVariant,const QCString &cmdName,
case CMD_INHERITDOC:
handleInheritDoc(thisVariant);
break;
+ case CMD_SHOWDATE:
+ handleShowDate(thisVariant);
+ break;
case CMD_ILINE:
- handleIline(thisVariant);
+ handleILine(thisVariant);
+ break;
+ case CMD_IFILE:
+ handleIFile(thisVariant);
break;
default:
// we should not get here!
@@ -4256,7 +4386,8 @@ int DocPara::handleHtmlStartTag(DocNodeVariant *thisVariant,const QCString &tagN
int retval=RetVal_OK;
int tagId = Mappers::htmlTagMapper->map(tagName);
if (parser()->context.token->emptyTag && !(tagId&XML_CmdMask) &&
- tagId!=HTML_UNKNOWN && tagId!=HTML_IMG && tagId!=HTML_BR && tagId!=HTML_HR && tagId!=HTML_P)
+ tagId!=HTML_UNKNOWN && tagId!=HTML_IMG && tagId!=HTML_BR && tagId!=HTML_HR && tagId!=HTML_P
+ && tagId!=HTML_DIV && tagId!=HTML_SPAN)
{
warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"HTML tag ('<%s/>') may not use the 'empty tag' XHTML syntax.",
qPrint(tagName));
@@ -4308,9 +4439,6 @@ int DocPara::handleHtmlStartTag(DocNodeVariant *thisVariant,const QCString &tagN
case HTML_INS:
if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Ins,tagName,&parser()->context.token->attribs);
break;
- case HTML_DETAILS:
- if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Details,tagName,&parser()->context.token->attribs);
- break;
case HTML_CODE:
if (parser()->context.token->emptyTag) break;
if (/*getLanguageFromFileName(parser()->context.fileName)==SrcLangExt_CSharp ||*/ parser()->context.xmlComment)
@@ -4329,10 +4457,12 @@ int DocPara::handleHtmlStartTag(DocNodeVariant *thisVariant,const QCString &tagN
if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Italic,tagName,&parser()->context.token->attribs);
break;
case HTML_DIV:
- if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Div,tagName,&parser()->context.token->attribs);
+ parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Div,tagName,&parser()->context.token->attribs);
+ if (parser()->context.token->emptyTag) parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Div,tagName);
break;
case HTML_SPAN:
- if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Span,tagName,&parser()->context.token->attribs);
+ parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Span,tagName,&parser()->context.token->attribs);
+ if (parser()->context.token->emptyTag) parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Span,tagName);
break;
case HTML_SUB:
if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Subscript,tagName,&parser()->context.token->attribs);
@@ -4426,6 +4556,14 @@ int DocPara::handleHtmlStartTag(DocNodeVariant *thisVariant,const QCString &tagN
parser()->handleImg(thisVariant,children(),tagHtmlAttribs);
}
break;
+ case HTML_DETAILS:
+ if (!parser()->context.token->emptyTag)
+ {
+ auto vDocHtmlDetails = children().append<DocHtmlDetails>(parser(),thisVariant,
+ tagHtmlAttribs);
+ retval=children().get_last<DocHtmlDetails>()->parse(vDocHtmlDetails);
+ }
+ break;
case HTML_BLOCKQUOTE:
if (!parser()->context.token->emptyTag)
{
@@ -4435,11 +4573,14 @@ int DocPara::handleHtmlStartTag(DocNodeVariant *thisVariant,const QCString &tagN
break;
case XML_SUMMARY:
- if (insideDetails(parser()->context.styleStack))
+ if (insideDetails(thisVariant))
{
- if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Summary,tagName,&parser()->context.token->attribs);
- break;
+ if (!parser()->context.token->emptyTag)
+ {
+ parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Summary,tagName,&parser()->context.token->attribs);
+ }
}
+ break;
case XML_REMARKS:
case XML_EXAMPLE:
parser()->context.xmlComment=TRUE;
@@ -4708,6 +4849,9 @@ int DocPara::handleHtmlEndTag(DocNodeVariant *thisVariant,const QCString &tagNam
// ignore </li> tags
}
break;
+ case HTML_DETAILS:
+ retval=RetVal_EndHtmlDetails;
+ break;
case HTML_BLOCKQUOTE:
retval=RetVal_EndBlockQuote;
break;
@@ -4729,9 +4873,6 @@ int DocPara::handleHtmlEndTag(DocNodeVariant *thisVariant,const QCString &tagNam
case HTML_INS:
parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Ins,tagName);
break;
- case HTML_DETAILS:
- parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Details,tagName);
- break;
case HTML_CODE:
parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Code,tagName);
break;
@@ -4827,11 +4968,11 @@ int DocPara::handleHtmlEndTag(DocNodeVariant *thisVariant,const QCString &tagNam
//children().push_back(std::make_unique<DocStyleChange>(this,parser()->context.nodeStack.size(),DocStyleChange::Bold,FALSE));
break;
case XML_SUMMARY:
- if (insideDetails(parser()->context.styleStack))
+ if (insideDetails(thisVariant))
{
parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Summary,tagName);
- break;
}
+ break;
case XML_REMARKS:
case XML_PARA:
case XML_VALUE:
@@ -4911,7 +5052,7 @@ reparsetoken:
// and whitespace after certain constructs
!holds_one_of_alternatives<DocHtmlDescList, DocHtmlTable, DocHtmlList, DocSimpleSect,
DocAutoList, DocSimpleList, DocHtmlHeader, DocHtmlBlockQuote,
- DocParamSect, DocXRefItem>(children().back())
+ DocParamSect, DocHtmlDetails, DocXRefItem>(children().back())
)
)
{
@@ -4965,7 +5106,7 @@ reparsetoken:
// so a new simple section will be started at this level.
// This is the same as unputting the last read token and continuing.
parser()->context.token->name = parser()->context.token->simpleSectName;
- if (parser()->context.token->name.left(4)=="rcs:") // RCS section
+ if (parser()->context.token->name.startsWith("rcs:")) // RCS section
{
parser()->context.token->name = parser()->context.token->name.mid(4);
parser()->context.token->text = parser()->context.token->simpleSectText;
@@ -5063,7 +5204,7 @@ reparsetoken:
// so a new simple section will be started at this level.
// This is the same as unputting the last read token and continuing.
parser()->context.token->name = parser()->context.token->simpleSectName;
- if (parser()->context.token->name.left(4)=="rcs:") // RCS section
+ if (parser()->context.token->name.startsWith("rcs:")) // RCS section
{
parser()->context.token->name = parser()->context.token->name.mid(4);
parser()->context.token->text = parser()->context.token->simpleSectText;
@@ -5564,201 +5705,3 @@ void DocRoot::parse(DocNodeVariant *thisVariant)
DBG(("DocRoot::parse() end\n"));
}
-static QCString extractCopyDocId(const char *data, uint &j, uint len)
-{
- uint s=j;
- int round=0;
- bool insideDQuote=FALSE;
- bool insideSQuote=FALSE;
- bool found=FALSE;
- while (j<len && !found)
- {
- if (!insideSQuote && !insideDQuote)
- {
- switch (data[j])
- {
- case '(': round++; break;
- case ')': round--; break;
- case '"': insideDQuote=TRUE; break;
- case '\'': insideSQuote=TRUE; break;
- case ' ': // fall through
- case '\t': // fall through
- case '\n':
- found=(round==0);
- break;
- }
- }
- else if (insideSQuote) // look for single quote end
- {
- if (data[j]=='\'' && (j==0 || data[j]!='\\'))
- {
- insideSQuote=FALSE;
- }
- }
- else if (insideDQuote) // look for double quote end
- {
- if (data[j]=='"' && (j==0 || data[j]!='\\'))
- {
- insideDQuote=FALSE;
- }
- }
- if (!found) j++;
- }
- if (qstrncmp(data+j," const",6)==0)
- {
- j+=6;
- }
- else if (qstrncmp(data+j," volatile",9)==0)
- {
- j+=9;
- }
- uint e=j;
- if (j>0 && data[j-1]=='.') { e--; } // do not include punctuation added by Definition::_setBriefDescription()
- QCString id(data+s,e-s);
- //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]);
- return id;
-}
-
-// macro to check if the input starts with a specific command.
-// note that data[i] should point to the start of the command (\ or @ character)
-// and the sizeof(str) returns the size of str including the '\0' terminator;
-// a fact we abuse to skip over the start of the command character.
-#define CHECK_FOR_COMMAND(str,action) \
- do if ((i+sizeof(str)<len) && qstrncmp(data+i+1,str,sizeof(str)-1)==0) \
- { j=i+sizeof(str); action; } while(0)
-
-static uint isCopyBriefOrDetailsCmd(const char *data, uint i,uint len,bool &brief)
-{
- uint j=0;
- if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
- {
- CHECK_FOR_COMMAND("copybrief",brief=TRUE); // @copybrief or \copybrief
- CHECK_FOR_COMMAND("copydetails",brief=FALSE); // @copydetails or \copydetails
- }
- return j;
-}
-
-static uint isVerbatimSection(const char *data,uint i,uint len,QCString &endMarker)
-{
- uint j=0;
- if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
- {
- CHECK_FOR_COMMAND("dot",endMarker="enddot");
- CHECK_FOR_COMMAND("code",endMarker="endcode");
- CHECK_FOR_COMMAND("msc",endMarker="endmsc");
- CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
- CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
- CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
- CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
- CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
- CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
- CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
- CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
- CHECK_FOR_COMMAND("startuml",endMarker="enduml");
- }
- //printf("isVerbatimSection(%s)=%d)\n",qPrint(QCString(&data[i]).left(10)),j);
- return j;
-}
-
-static uint skipToEndMarker(const char *data,uint i,uint len,const QCString &endMarker)
-{
- while (i<len)
- {
- if ((data[i]=='@' || data[i]=='\\') && // start of command character
- (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
- {
- if (i+endMarker.length()+1<=len && qstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
- {
- return i+endMarker.length()+1;
- }
- }
- i++;
- }
- // oops no endmarker found...
- return i<len ? i+1 : len;
-}
-
-QCString DocParser::processCopyDoc(const char *data,uint &len)
-{
- //printf("processCopyDoc start '%s'\n",data);
- GrowBuf buf;
- uint i=0;
- while (i<len)
- {
- char c = data[i];
- if (c=='@' || c=='\\') // look for a command
- {
- bool isBrief=TRUE;
- uint j=isCopyBriefOrDetailsCmd(data,i,len,isBrief);
- if (j>0)
- {
- // skip whitespace
- while (j<len && (data[j]==' ' || data[j]=='\t')) j++;
- // extract the argument
- QCString id = extractCopyDocId(data,j,len);
- const Definition *def = 0;
- QCString doc,brief;
- //printf("resolving docs='%s'\n",qPrint(id));
- if (findDocsForMemberOrCompound(id,&doc,&brief,&def))
- {
- //printf("found it def=%p brief='%s' doc='%s' isBrief=%d\n",def,qPrint(brief),qPrint(doc),isBrief);
- auto it = std::find(context.copyStack.begin(),context.copyStack.end(),def);
- if (it==context.copyStack.end()) // definition not parsed earlier
- {
- context.copyStack.push_back(def);
- if (isBrief)
- {
- uint l=static_cast<uint>(brief.length());
- buf.addStr(processCopyDoc(brief.data(),l));
- }
- else
- {
- uint l=static_cast<uint>(doc.length());
- buf.addStr(processCopyDoc(doc.data(),l));
- }
- context.copyStack.pop_back();
- }
- else
- {
- warn_doc_error(context.fileName,tokenizer.getLineNr(),
- "Found recursive @copy%s or @copydoc relation for argument '%s'.\n",
- isBrief?"brief":"details",qPrint(id));
- }
- }
- else
- {
- warn_doc_error(context.fileName,tokenizer.getLineNr(),
- "@copy%s or @copydoc target '%s' not found", isBrief?"brief":"details",
- qPrint(id));
- }
- // skip over command
- i=j;
- }
- else
- {
- QCString endMarker;
- uint k = isVerbatimSection(data,i,len,endMarker);
- if (k>0)
- {
- uint orgPos = i;
- i=skipToEndMarker(data,k,len,endMarker);
- buf.addStr(data+orgPos,i-orgPos);
- }
- else
- {
- buf.addChar(c);
- i++;
- }
- }
- }
- else // not a command, just copy
- {
- buf.addChar(c);
- i++;
- }
- }
- len = static_cast<uint>(buf.getPos());
- buf.addChar(0);
- return buf.get();
-}
-
diff --git a/src/docnode.h b/src/docnode.h
index 1db32dc..b280ed8 100644
--- a/src/docnode.h
+++ b/src/docnode.h
@@ -45,7 +45,8 @@ class DocParser;
/* 35 */ DN(DocSecRefList) DN_SEP DN(DocInternal) DN_SEP DN(DocParBlock) DN_SEP DN(DocSimpleList) DN_SEP DN(DocHtmlList) DN_SEP \
/* 40 */ DN(DocSimpleSect) DN_SEP DN(DocSimpleSectSep) DN_SEP DN(DocParamSect) DN_SEP DN(DocPara) DN_SEP DN(DocParamList) DN_SEP \
/* 45 */ DN(DocSimpleListItem) DN_SEP DN(DocHtmlListItem) DN_SEP DN(DocHtmlDescData) DN_SEP DN(DocHtmlCell) DN_SEP DN(DocHtmlCaption) DN_SEP \
-/* 50 */ DN(DocHtmlRow) DN_SEP DN(DocHtmlTable) DN_SEP DN(DocHtmlBlockQuote) DN_SEP DN(DocText) DN_SEP DN(DocRoot) \
+/* 50 */ DN(DocHtmlRow) DN_SEP DN(DocHtmlTable) DN_SEP DN(DocHtmlBlockQuote) DN_SEP DN(DocText) DN_SEP DN(DocRoot) DN_SEP \
+/* 55 */ DN(DocHtmlDetails) \
// forward declarations
#define DN(x) class x;
@@ -55,13 +56,13 @@ DOC_NODES
#undef DN_SEP
// define a variant type
-using DocNodeVariant = std::variant<
#define DN(x) x
#define DN_SEP ,
+using DocNodeVariant = std::variant<
DOC_NODES
+>;
#undef DN
#undef DN_SEP
->;
// getter functions to return the name of a doc node type
#define DN(x) constexpr const char *docNodeName(const x &n) { return #x; }
@@ -271,7 +272,6 @@ class DocStyleChange : public DocNode
Del = (1<<12),
Ins = (1<<13),
S = (1<<14),
- Details = (1<<15),
Summary = (1<<16),
Cite = (1<<17)
};
@@ -793,6 +793,19 @@ class DocHRef : public DocCompoundNode
QCString m_file;
};
+/** Node Html details */
+class DocHtmlDetails : public DocCompoundNode
+{
+ public:
+ DocHtmlDetails(DocParser *parser,DocNodeVariant *parent,const HtmlAttribList &attribs) :
+ DocCompoundNode(parser,parent), m_attribs(attribs) {}
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ int parse(DocNodeVariant*);
+
+ private:
+ HtmlAttribList m_attribs;
+};
+
/** Node Html heading */
class DocHtmlHeader : public DocCompoundNode
{
@@ -1029,7 +1042,9 @@ class DocPara : public DocCompoundNode
void handleSection(DocNodeVariant *thisVariant,const QCString &cmdName);
void handleInheritDoc(DocNodeVariant *thisVariant);
void handleVhdlFlow(DocNodeVariant *thisVariant);
- void handleIline(DocNodeVariant *thisVariant);
+ void handleILine(DocNodeVariant *thisVariant);
+ void handleIFile(DocNodeVariant *thisVariant);
+ void handleShowDate(DocNodeVariant *thisVariant);
int handleStartCode(DocNodeVariant *thisVariant);
int handleHtmlHeader(DocNodeVariant *thisVariant,const HtmlAttribList &tagHtmlAttribs,int level);
@@ -1310,17 +1325,17 @@ inline T *DocNodeList::get_last()
return std::get_if<T>(&back());
}
-/// ---------------- Debug helpers -------------------------------
+// ---------------- Debug helpers -------------------------------
-inline const char *docNodeName(const DocNodeVariant &v)
-{
#define DN(x) #x
#define DN_SEP ,
+inline const char *docNodeName(const DocNodeVariant &v)
+{
static const char *table[] = { DOC_NODES };
-#undef DN
-#undef DN_SEP
return table[v.index()];
}
+#undef DN
+#undef DN_SEP
inline void dumpDocNodeSizes()
{
diff --git a/src/docparser.cpp b/src/docparser.cpp
index fdb9179..88c97f0 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -36,6 +36,7 @@
#include "portable.h"
#include "printdocvisitor.h"
#include "util.h"
+#include "indexlist.h"
// debug off
#define DBG(x) do {} while(0)
@@ -179,7 +180,7 @@ QCString DocParser::findAndCopyImage(const QCString &fileName, DocImage::Type ty
}
if (type==DocImage::Latex && Config_getBool(USE_PDFLATEX) &&
- fd->name().right(4)==".eps"
+ fd->name().endsWith(".eps")
)
{ // we have an .eps image in pdflatex mode => convert it to a pdf.
QCString outputDir = Config_getString(LATEX_OUTPUT);
@@ -200,7 +201,7 @@ QCString DocParser::findAndCopyImage(const QCString &fileName, DocImage::Type ty
else
{
result=fileName;
- if (result.left(5)!="http:" && result.left(6)!="https:" && doWarn)
+ if (!result.startsWith("http:") && !result.startsWith("https:") && doWarn)
{
warn_doc_error(context.fileName,tokenizer.getLineNr(),
"image file %s is not found in IMAGE_PATH: "
@@ -245,7 +246,7 @@ void DocParser::checkArgumentName()
if (lang==SrcLangExt_Fortran) argName=argName.lower();
argName=argName.stripWhiteSpace();
//printf("argName='%s' aName=%s\n",qPrint(argName),qPrint(aName));
- if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
+ if (argName.endsWith("...")) argName=argName.left(argName.length()-3);
if (aName==argName)
{
context.paramsFound.insert(aName.str());
@@ -322,7 +323,7 @@ void DocParser::checkUnOrMultipleDocumentedParams()
if (lang==SrcLangExt_Fortran) argName = argName.lower();
argName=argName.stripWhiteSpace();
QCString aName = argName;
- if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
+ if (argName.endsWith("...")) argName=argName.left(argName.length()-3);
if (lang==SrcLangExt_Python && (argName=="self" || argName=="cls"))
{
// allow undocumented self / cls parameter for Python
@@ -370,6 +371,17 @@ void DocParser::checkUnOrMultipleDocumentedParams()
qPrint(substitute(errMsg,"%","%%")));
}
}
+ else
+ {
+ if (!context.paramsFound.size() && Config_getBool(WARN_IF_DOC_ERROR))
+ {
+ warn_doc_error(context.memberDef->docFile(),
+ context.memberDef->docLine(),
+ "%s",
+ qPrint(context.memberDef->qualifiedName() +
+ " has @param documentation sections but no arguments"));
+ }
+ }
}
}
@@ -853,7 +865,7 @@ void DocParser::handleLinkedWord(DocNodeVariant *parent,DocNodeList &children,bo
}
else // normal non-linkable word
{
- if (context.token->name.left(1)=="#" || context.token->name.left(2)=="::")
+ if (context.token->name.startsWith("#") || context.token->name.startsWith("::"))
{
warn_doc_error(context.fileName,tokenizer.getLineNr(),"explicit link request to '%s' could not be resolved",qPrint(name));
children.append<DocWord>(this,parent,context.token->name);
@@ -962,6 +974,11 @@ void DocParser::defaultHandleTitleAndSize(const int cmd, DocNodeVariant *parent,
// special case: no title, but we do have a size indicator
break;
}
+ else if (tok==TK_HTMLTAG)
+ {
+ tokenizer.unputString(context.token->name);
+ break;
+ }
if (!defaultHandleToken(parent,tok,children))
{
errorHandleDefaultToken(parent,tok,children,Mappers::cmdMapper->find(cmd));
@@ -974,7 +991,7 @@ void DocParser::defaultHandleTitleAndSize(const int cmd, DocNodeVariant *parent,
}
while (tok==TK_WHITESPACE || tok==TK_WORD) // there are values following the title
{
- if(tok == TK_WORD)
+ if (tok==TK_WORD)
{
if (context.token->name=="width=" || context.token->name=="height=")
{
@@ -992,6 +1009,7 @@ void DocParser::defaultHandleTitleAndSize(const int cmd, DocNodeVariant *parent,
}
else
{
+ tokenizer.unputString(context.token->name);
warn_doc_error(context.fileName,tokenizer.getLineNr(),"Unknown option '%s' after \\%s command, expected 'width' or 'height'",
qPrint(context.token->name), qPrint(Mappers::cmdMapper->find(cmd)));
break;
@@ -999,6 +1017,17 @@ void DocParser::defaultHandleTitleAndSize(const int cmd, DocNodeVariant *parent,
}
tok=tokenizer.lex();
+ // if we found something we did not expect, push it back to the stream
+ // so it can still be processed
+ if (tok==TK_COMMAND_AT || tok==TK_COMMAND_BS)
+ {
+ tokenizer.unputString(context.token->name);
+ tokenizer.unputString(tok==TK_COMMAND_AT ? "@" : "\\");
+ }
+ else if (tok==TK_SYMBOL || tok==TK_HTMLTAG)
+ {
+ tokenizer.unputString(context.token->name);
+ }
}
tokenizer.setStatePara();
@@ -1394,16 +1423,6 @@ reparsetoken:
handleStyleLeave(parent,children,DocStyleChange::Ins,tokenName);
}
break;
- case HTML_DETAILS:
- if (!context.token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Details,tokenName,&context.token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Details,tokenName);
- }
- break;
case HTML_CODE:
case XML_C:
if (!context.token->endTag)
@@ -1658,6 +1677,220 @@ void DocParser::readTextFileByName(const QCString &file,QCString &text)
//---------------------------------------------------------------------------
+static QCString extractCopyDocId(const char *data, uint &j, uint len)
+{
+ uint s=j;
+ int round=0;
+ bool insideDQuote=FALSE;
+ bool insideSQuote=FALSE;
+ bool found=FALSE;
+ while (j<len && !found)
+ {
+ if (!insideSQuote && !insideDQuote)
+ {
+ switch (data[j])
+ {
+ case '(': round++; break;
+ case ')': round--; break;
+ case '"': insideDQuote=TRUE; break;
+ case '\'': insideSQuote=TRUE; break;
+ case ' ': // fall through
+ case '\t': // fall through
+ case '\n':
+ found=(round==0);
+ break;
+ }
+ }
+ else if (insideSQuote) // look for single quote end
+ {
+ if (data[j]=='\'' && (j==0 || data[j]!='\\'))
+ {
+ insideSQuote=FALSE;
+ }
+ }
+ else if (insideDQuote) // look for double quote end
+ {
+ if (data[j]=='"' && (j==0 || data[j]!='\\'))
+ {
+ insideDQuote=FALSE;
+ }
+ }
+ if (!found) j++;
+ }
+ if (qstrncmp(data+j," const",6)==0)
+ {
+ j+=6;
+ }
+ else if (qstrncmp(data+j," volatile",9)==0)
+ {
+ j+=9;
+ }
+ uint e=j;
+ if (j>0 && data[j-1]=='.') { e--; } // do not include punctuation added by Definition::_setBriefDescription()
+ QCString id(data+s,e-s);
+ //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]);
+ return id;
+}
+
+// macro to check if the input starts with a specific command.
+// note that data[i] should point to the start of the command (\ or @ character)
+// and the sizeof(str) returns the size of str including the '\0' terminator;
+// a fact we abuse to skip over the start of the command character.
+#define CHECK_FOR_COMMAND(str,action) \
+ do if ((i+sizeof(str)<len) && qstrncmp(data+i+1,str,sizeof(str)-1)==0) \
+ { j=i+sizeof(str); action; } while(0)
+
+static uint isCopyBriefOrDetailsCmd(const char *data, uint i,uint len,bool &brief)
+{
+ uint j=0;
+ if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
+ {
+ CHECK_FOR_COMMAND("copybrief",brief=TRUE); // @copybrief or \copybrief
+ CHECK_FOR_COMMAND("copydetails",brief=FALSE); // @copydetails or \copydetails
+ }
+ return j;
+}
+
+static uint isVerbatimSection(const char *data,uint i,uint len,QCString &endMarker)
+{
+ uint j=0;
+ if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
+ {
+ CHECK_FOR_COMMAND("dot",endMarker="enddot");
+ CHECK_FOR_COMMAND("icode",endMarker="endicode");
+ CHECK_FOR_COMMAND("code",endMarker="endcode");
+ CHECK_FOR_COMMAND("msc",endMarker="endmsc");
+ CHECK_FOR_COMMAND("iverbatim",endMarker="endiverbatim");
+ CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
+ CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
+ CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
+ CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
+ CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
+ CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
+ CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
+ CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
+ CHECK_FOR_COMMAND("startuml",endMarker="enduml");
+ }
+ //printf("isVerbatimSection(%s)=%d)\n",qPrint(QCString(&data[i]).left(10)),j);
+ return j;
+}
+
+static uint skipToEndMarker(const char *data,uint i,uint len,const QCString &endMarker)
+{
+ while (i<len)
+ {
+ if ((data[i]=='@' || data[i]=='\\') && // start of command character
+ (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
+ {
+ if (i+endMarker.length()+1<=len && qstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
+ {
+ return i+endMarker.length()+1;
+ }
+ }
+ i++;
+ }
+ // oops no endmarker found...
+ return i<len ? i+1 : len;
+}
+
+
+QCString DocParser::processCopyDoc(const char *data,uint &len)
+{
+ //printf("processCopyDoc start '%s'\n",data);
+ GrowBuf buf;
+ uint i=0;
+ int lineNr = tokenizer.getLineNr();
+ while (i<len)
+ {
+ char c = data[i];
+ if (c=='@' || c=='\\') // look for a command
+ {
+ bool isBrief=TRUE;
+ uint j=isCopyBriefOrDetailsCmd(data,i,len,isBrief);
+ if (j>0)
+ {
+ // skip whitespace
+ while (j<len && (data[j]==' ' || data[j]=='\t')) j++;
+ // extract the argument
+ QCString id = extractCopyDocId(data,j,len);
+ const Definition *def = 0;
+ QCString doc,brief;
+ //printf("resolving docs='%s'\n",qPrint(id));
+ if (findDocsForMemberOrCompound(id,&doc,&brief,&def))
+ {
+ //printf("found it def=%p brief='%s' doc='%s' isBrief=%d\n",def,qPrint(brief),qPrint(doc),isBrief);
+ auto it = std::find(context.copyStack.begin(),context.copyStack.end(),def);
+ if (it==context.copyStack.end()) // definition not parsed earlier
+ {
+ QCString orgFileName = context.fileName;
+ context.copyStack.push_back(def);
+ if (isBrief)
+ {
+ buf.addStr("\\ifile \""+QCString(def->briefFile())+"\" ");
+ buf.addStr("\\iline "+QCString().setNum(def->briefLine())+" ");
+ uint l=static_cast<uint>(brief.length());
+ buf.addStr(processCopyDoc(brief.data(),l));
+ }
+ else
+ {
+ buf.addStr("\\ifile \""+QCString(def->docFile())+"\" ");
+ buf.addStr("\\iline "+QCString().setNum(def->docLine())+" ");
+ uint l=static_cast<uint>(doc.length());
+ buf.addStr(processCopyDoc(doc.data(),l));
+ }
+ context.copyStack.pop_back();
+ buf.addStr("\\ifile \""+context.fileName+"\" ");
+ buf.addStr("\\iline "+QCString().setNum(lineNr)+" ");
+ }
+ else
+ {
+ warn_doc_error(context.fileName,tokenizer.getLineNr(),
+ "Found recursive @copy%s or @copydoc relation for argument '%s'.\n",
+ isBrief?"brief":"details",qPrint(id));
+ }
+ }
+ else
+ {
+ warn_doc_error(context.fileName,tokenizer.getLineNr(),
+ "@copy%s or @copydoc target '%s' not found", isBrief?"brief":"details",
+ qPrint(id));
+ }
+ // skip over command
+ i=j;
+ }
+ else
+ {
+ QCString endMarker;
+ uint k = isVerbatimSection(data,i,len,endMarker);
+ if (k>0)
+ {
+ uint orgPos = i;
+ i=skipToEndMarker(data,k,len,endMarker);
+ buf.addStr(data+orgPos,i-orgPos);
+ // TODO: adjust lineNr
+ }
+ else
+ {
+ buf.addChar(c);
+ i++;
+ }
+ }
+ }
+ else // not a command, just copy
+ {
+ buf.addChar(c);
+ i++;
+ lineNr += (c=='\n') ? 1 : 0;
+ }
+ }
+ len = static_cast<uint>(buf.getPos());
+ buf.addChar(0);
+ return buf.get();
+}
+
+
+//---------------------------------------------------------------------------
+
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf,
const QCString &fileName,int startLine,
const Definition *ctx,const MemberDef *md,
diff --git a/src/docparser.h b/src/docparser.h
index 64db969..45923ba 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -98,5 +98,4 @@ void docFindSections(const QCString &input,
const Definition *d,
const QCString &fileName);
-
#endif
diff --git a/src/docparser_p.h b/src/docparser_p.h
index 3eca1ae..9e985f5 100644
--- a/src/docparser_p.h
+++ b/src/docparser_p.h
@@ -236,13 +236,14 @@ inline bool insideTable(const DocNodeVariant *n)
//---------------------------------------------------------------------------
-inline bool insideDetails(DocStyleChangeStack styleStack)
+inline bool insideDetails(const DocNodeVariant *n)
{
- for (auto i : styleStack)
+ while (n)
{
- if (std::get<DocStyleChange>(*i).style() == DocStyleChange::Details) return true;
+ if (std::holds_alternative<DocHtmlDetails>(*n)) return TRUE;
+ n=parent(n);
}
- return false;
+ return FALSE;
}
diff --git a/src/docsets.cpp b/src/docsets.cpp
index bc8f7a9..f2bddc5 100644
--- a/src/docsets.cpp
+++ b/src/docsets.cpp
@@ -41,13 +41,9 @@ struct DocSets::Private
};
-DocSets::DocSets() : p(std::make_unique<Private>())
-{
-}
-
-DocSets::~DocSets()
-{
-}
+DocSets::DocSets() : p(std::make_unique<Private>()) {}
+DocSets::~DocSets() = default;
+DocSets::DocSets(DocSets &&) = default;
void DocSets::initialize()
{
@@ -311,7 +307,7 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
{
if (md && (md->isObjCMethod() || md->isObjCProperty()))
lang="occ"; // Objective C/C++
- else if (fd && fd->name().right(2).lower()==".c")
+ else if (fd && fd->name().lower().endsWith(".c"))
lang="c"; // Plain C
else if (cd==0 && nd==0)
lang="c"; // Plain C symbol outside any class or namespace
@@ -450,7 +446,7 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
else if (cd->compoundType()==ClassDef::Protocol)
{
type="intf";
- if (scope.right(2)=="-p") scope=scope.left(scope.length()-2);
+ if (scope.endsWith("-p")) scope=scope.left(scope.length()-2);
}
else if (cd->compoundType()==ClassDef::Interface)
{
@@ -494,7 +490,7 @@ void DocSets::writeToken(TextStream &t,
t << " <Token>\n";
t << " <TokenIdentifier>\n";
QCString name = d->name();
- if (name.right(2)=="-p") name=name.left(name.length()-2);
+ if (name.endsWith("-p")) name=name.left(name.length()-2);
t << " <Name>" << convertToXML(name) << "</Name>\n";
if (!lang.isEmpty())
{
diff --git a/src/docsets.h b/src/docsets.h
index 03146f1..0397a33 100644
--- a/src/docsets.h
+++ b/src/docsets.h
@@ -18,23 +18,26 @@
#include <memory>
-#include "index.h"
+#include "qcstring.h"
class TextStream;
class Definition;
+class MemberDef;
/** A class that generates docset files.
*
* These files can be used to create context help
* for use within Apple's Xcode 3.0 development environment
*/
-class DocSets : public IndexIntf
+class DocSets
{
public:
DocSets();
- ~DocSets();
+ virtual ~DocSets();
+ DocSets(DocSets &&);
+
void initialize();
void finalize();
void incContentsDepth();
diff --git a/src/doctokenizer.h b/src/doctokenizer.h
index 1c31920..8b61ec6 100644
--- a/src/doctokenizer.h
+++ b/src/doctokenizer.h
@@ -63,7 +63,8 @@ enum Tokens
RetVal_EndBlockQuote = 0x10014,
RetVal_CopyDoc = 0x10015,
RetVal_EndInternal = 0x10016,
- RetVal_EndParBlock = 0x10017
+ RetVal_EndParBlock = 0x10017,
+ RetVal_EndHtmlDetails = 0x10018
};
#define TK_COMMAND_CHAR(token) ((token)==TK_COMMAND_AT ? "@" : "\\")
@@ -141,10 +142,12 @@ class DocTokenizer
void pushContext();
bool popContext();
int lex();
+ void unputString(const QCString &tag);
void setStatePara();
void setStateTitle();
void setStateTitleAttrValue();
void setStateCode();
+ void setStateICode();
void setStateXmlCode();
void setStateHtmlOnly();
void setStateManOnly();
@@ -153,6 +156,7 @@ class DocTokenizer
void setStateDbOnly();
void setStateRtfOnly();
void setStateVerbatim();
+ void setStateIVerbatim();
void setStateILiteral();
void setStateILiteralOpt();
void setStateDot();
@@ -179,7 +183,9 @@ class DocTokenizer
void setStateOptions();
void setStateBlock();
void setStateEmoji();
- void setStateIline();
+ void setStateILine();
+ void setStateQuotedString();
+ void setStateShowDate();
private:
struct Private;
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 976f1dc..6f9f025 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -342,6 +342,8 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
RCSID "$"("Author"|"Date"|"Header"|"Id"|"Locker"|"Log"|"Name"|"RCSfile"|"Revision"|"Source"|"State")":"[^:\n$][^\n$]*"$"
LINENR {BLANK}*[1-9][0-9]*
+SHOWDATE ([0-9]{4}"-"[0-9]{1,2}"-"[0-9]{1,2})?({WS}*[0-9]{1,2}":"[0-9]{1,2}(":"[0-9]{1,2})?)?
+
%option noyywrap
%x St_Para
@@ -352,7 +354,9 @@ LINENR {BLANK}*[1-9][0-9]*
%x St_TitleA
%x St_TitleV
%x St_Code
+%x St_iCode
%x St_CodeOpt
+%x St_iCodeOpt
%x St_XmlCode
%x St_HtmlOnly
%x St_HtmlOnlyOption
@@ -362,6 +366,7 @@ LINENR {BLANK}*[1-9][0-9]*
%x St_XmlOnly
%x St_DbOnly
%x St_Verbatim
+%x St_iVerbatim
%x St_ILiteral
%x St_ILiteralOpt
%x St_Dot
@@ -387,7 +392,8 @@ LINENR {BLANK}*[1-9][0-9]*
%x St_Options
%x St_Block
%x St_Emoji
-%x St_Iline
+%x St_ILine
+%x St_ShowDate
%x St_Sections
%s St_SecLabel1
@@ -395,6 +401,9 @@ LINENR {BLANK}*[1-9][0-9]*
%s St_SecTitle
%x St_SecSkip
+%x St_QuotedString
+%x St_QuotedContent
+
%%
<St_Para>\r /* skip carriage return */
<St_Para>^{LISTITEM} { /* list item */
@@ -765,23 +774,39 @@ LINENR {BLANK}*[1-9][0-9]*
yyextra->token->name = yyextra->token->name.mid(i+1,yyextra->token->name.length()-i-2);
BEGIN(St_Code);
}
+<St_iCodeOpt>{BLANK}*"{"(".")?{LABELID}"}" {
+ yyextra->token->name = yytext;
+ int i=yyextra->token->name.find('{'); /* } to keep vi happy */
+ yyextra->token->name = yyextra->token->name.mid(i+1,yyextra->token->name.length()-i-2);
+ BEGIN(St_iCode);
+ }
<St_CodeOpt>"\\ilinebr" |
<St_CodeOpt>\n |
<St_CodeOpt>. {
unput_string(yytext,yyleng);
BEGIN(St_Code);
}
+<St_iCodeOpt>"\\ilinebr" |
+<St_iCodeOpt>\n |
+<St_iCodeOpt>. {
+ unput_string(yytext,yyleng);
+ BEGIN(St_iCode);
+ }
<St_Code>{WS}*{CMD}"endcode" {
lineCount(yytext,yyleng);
return RetVal_OK;
}
+<St_iCode>{WS}*{CMD}"endicode" {
+ lineCount(yytext,yyleng);
+ return RetVal_OK;
+ }
<St_XmlCode>{WS}*"</code>" {
lineCount(yytext,yyleng);
return RetVal_OK;
}
-<St_Code,St_XmlCode>[^\\@\n<]+ |
-<St_Code,St_XmlCode>\n |
-<St_Code,St_XmlCode>. {
+<St_Code,St_iCode,St_XmlCode>[^\\@\n<]+ |
+<St_Code,St_iCode,St_XmlCode>\n |
+<St_Code,St_iCode,St_XmlCode>. {
lineCount(yytext,yyleng);
yyextra->token->verb+=yytext;
}
@@ -860,9 +885,13 @@ LINENR {BLANK}*[1-9][0-9]*
yyextra->token->verb=yyextra->token->verb.mid(1,yyextra->token->verb.length()-2);
return RetVal_OK;
}
-<St_Verbatim,St_ILiteral>[^\\@\n]+ |
-<St_Verbatim,St_ILiteral>\n |
-<St_Verbatim,St_ILiteral>. { /* Verbatim / javadac literal/code text */
+<St_iVerbatim>{CMD}"endiverbatim" {
+ yyextra->token->verb=stripEmptyLines(yyextra->token->verb);
+ return RetVal_OK;
+ }
+<St_Verbatim,St_iVerbatim,St_ILiteral>[^\\@\n]+ |
+<St_Verbatim,St_iVerbatim,St_ILiteral>\n |
+<St_Verbatim,St_iVerbatim,St_ILiteral>. { /* Verbatim text */
lineCount(yytext,yyleng);
yyextra->token->verb+=yytext;
}
@@ -955,7 +984,8 @@ LINENR {BLANK}*[1-9][0-9]*
return TK_SYMBOL;
}
<St_TitleN>{HTMLTAG} {
- lineCount(yytext,yyleng);
+ yyextra->token->name = yytext;
+ return TK_HTMLTAG;
}
<St_TitleN>\n { /* new line => end of title */
unput(*yytext);
@@ -1237,8 +1267,39 @@ LINENR {BLANK}*[1-9][0-9]*
unput(*yytext);
return 0;
}
-<St_Iline>{LINENR}/[\n\.] |
-<St_Iline>{LINENR}{BLANK} {
+<St_QuotedString>"\"" {
+ yyextra->token->name="";
+ BEGIN(St_QuotedContent);
+ }
+<St_QuotedString>(\n|"\\ilinebr") {
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_QuotedString>. {
+ unput(*yytext);
+ return 0;
+ }
+<St_QuotedContent>"\"" {
+ return TK_WORD;
+ }
+<St_QuotedContent>. {
+ yyextra->token->name+=yytext;
+ }
+<St_ShowDate>{WS}+{SHOWDATE} {
+ lineCount(yytext,yyleng);
+ yyextra->token->name=yytext;
+ return TK_WORD;
+ }
+<St_ShowDate>(\n|"\\ilinebr") {
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_ShowDate>. {
+ unput(*yytext);
+ return 0;
+ }
+<St_ILine>{LINENR}/[\n\.] |
+<St_ILine>{LINENR}{BLANK} {
bool ok = false;
int nr = QCString(yytext).toInt(&ok);
if (!ok)
@@ -1251,7 +1312,7 @@ LINENR {BLANK}*[1-9][0-9]*
}
return TK_WORD;
}
-<St_Iline>. {
+<St_ILine>. {
return 0;
}
<St_File>{FILEMASK} {
@@ -1343,6 +1404,10 @@ LINENR {BLANK}*[1-9][0-9]*
yyextra->endMarker="endverbatim";
BEGIN(St_SecSkip);
}
+<St_Sections>{CMD}"iverbatim"/[^a-z_A-Z0-9] {
+ yyextra->endMarker="endiverbatim";
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"iliteral"/[^a-z_A-Z0-9] {
yyextra->endMarker="endiliteral";
BEGIN(St_SecSkip);
@@ -1387,6 +1452,10 @@ LINENR {BLANK}*[1-9][0-9]*
yyextra->endMarker="endcode";
BEGIN(St_SecSkip);
}
+<St_Sections>{CMD}"icode"/[^a-z_A-Z0-9] {
+ yyextra->endMarker="endicode";
+ BEGIN(St_SecSkip);
+ }
<St_Sections>"<!--" {
yyextra->endMarker="-->";
BEGIN(St_SecSkip);
@@ -1425,7 +1494,7 @@ LINENR {BLANK}*[1-9][0-9]*
lineCount(yytext,yyleng);
yyextra->secTitle = yytext;
yyextra->secTitle = yyextra->secTitle.stripWhiteSpace();
- if (yyextra->secTitle.right(8)=="\\ilinebr")
+ if (yyextra->secTitle.endsWith("\\ilinebr"))
{
yyextra->secTitle.left(yyextra->secTitle.length()-8);
}
@@ -1662,6 +1731,13 @@ int DocTokenizer::lex()
return doctokenizerYYlex(p->yyscanner);
}
+void DocTokenizer::unputString(const QCString &tag)
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ unput_string(tag.data(),tag.length());
+}
+
void DocTokenizer::findSections(const QCString &input,const Definition *d,
const QCString &fileName)
{
@@ -1739,6 +1815,15 @@ void DocTokenizer::setStateCode()
BEGIN(St_CodeOpt);
}
+void DocTokenizer::setStateICode()
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->token->verb="";
+ yyextra->token->name="";
+ BEGIN(St_iCodeOpt);
+}
+
void DocTokenizer::setStateXmlCode()
{
yyscan_t yyscanner = p->yyscanner;
@@ -1821,6 +1906,14 @@ void DocTokenizer::setStateVerbatim()
BEGIN(St_Verbatim);
}
+void DocTokenizer::setStateIVerbatim()
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->token->verb="";
+ BEGIN(St_iVerbatim);
+}
+
void DocTokenizer::setStateDot()
{
yyscan_t yyscanner = p->yyscanner;
@@ -1971,11 +2064,25 @@ void DocTokenizer::setStateEmoji()
BEGIN(St_Emoji);
}
-void DocTokenizer::setStateIline()
+void DocTokenizer::setStateILine()
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ BEGIN(St_ILine);
+}
+
+void DocTokenizer::setStateQuotedString()
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ BEGIN(St_QuotedString);
+}
+
+void DocTokenizer::setStateShowDate()
{
yyscan_t yyscanner = p->yyscanner;
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- BEGIN(St_Iline);
+ BEGIN(St_ShowDate);
}
void DocTokenizer::cleanup()
diff --git a/src/dot.cpp b/src/dot.cpp
index 1d44dd9..5f4c7df 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -28,7 +28,7 @@
#include "message.h"
#include "doxygen.h"
#include "language.h"
-#include "index.h"
+#include "indexlist.h"
#include "dir.h"
#define MAP_CMD "cmapx"
diff --git a/src/dotattributes.h b/src/dotattributes.h
new file mode 100644
index 0000000..2522db3
--- /dev/null
+++ b/src/dotattributes.h
@@ -0,0 +1,74 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DOTATTRIBUTES_H
+#define DOTATTRIBUTES_H
+
+#include <map>
+#include <string>
+
+#include "regex.h"
+#include "qcstring.h"
+
+//! Class representing an attribute list of a dot graph object.
+class DotAttributes
+{
+ public:
+ //! Creates an instance of a DotAttribute list given its initial string representation
+ DotAttributes(const QCString &input) : m_input(input) {}
+
+ //! Return the string representation of the attribute list
+ QCString str() const { return m_input; }
+
+ //! update a given attribute with a new value.
+ //! If the attribute is not found a new attribute will be appended.
+ void updateValue(const QCString &key,const QCString &value)
+ {
+ // look for key\s*=
+ const reg::Ex re = key.str()+R"(\s*=)";
+ reg::Match match;
+ std::string s = m_input.str();
+ if (reg::search(s,match,re)) // replace existing attribute
+ {
+ size_t len = s.length();
+ size_t startPos = match.position()+match.length(); // position after =
+ size_t pos = startPos;
+ while (pos<len && qisspace(s[pos])) pos++;
+ if (pos<len && s[pos]=='"') // quoted value, search for end quote, ignoring escaped quotes
+ {
+ char pc=s[pos];
+ pos++; // skip over start quote
+ while (pos<len && (s[pos]!='"' || (s[pos]=='"' && pc=='\\'))) pc=s[pos++];
+ if (pos<len) pos++; // skip over end quote
+ }
+ else // unquoted value, search for attribute separator (space,comma, or semicolon)
+ {
+ while (pos<len && s[pos]!=',' && s[pos]!=';' && !qisspace(s[pos])) pos++;
+ }
+ // pos is now the position after the value, so replace the part between [start..pos) with the new value
+ m_input=m_input.left(startPos)+value.quoted()+m_input.mid(pos);
+ }
+ else // append new attribute
+ {
+ if (!m_input.isEmpty()) m_input+=",";
+ m_input+=key+"="+value.quoted();
+ }
+ }
+
+ private:
+ QCString m_input;
+};
+
+#endif // DOTATTRIBUTES_H
diff --git a/src/dotdirdeps.cpp b/src/dotdirdeps.cpp
index 4bc48fa..315416f 100644
--- a/src/dotdirdeps.cpp
+++ b/src/dotdirdeps.cpp
@@ -18,6 +18,7 @@
#include "doxygen.h"
#include "config.h"
#include "image.h"
+#include "dotnode.h"
#include <algorithm>
#include <iterator>
@@ -117,26 +118,30 @@ static const char* getDirectoryBorderColor(const DotDirProperty &property)
/** Returns a DOT node style according to the directory properties. */
static std::string getDirectoryBorderStyle(const DotDirProperty &property)
{
- std::string style;
- if (!property.isPeripheral)
- {
- style += "filled,";
- }
+ std::string style = "filled";
if (property.isOriginal)
{
- style += "bold,";
+ style += ",bold";
}
if (property.isIncomplete)
{
- style += "dashed,";
+ style += ",dashed";
}
else if (property.isTruncated && property.isOrphaned)
{
- style += "dashed,";
+ style += ",dashed";
}
return style;
}
+static TextStream &common_attributes(TextStream &t, const DirDef *const dir, const DotDirProperty &prop)
+{
+ return t <<
+ "style=\"" << getDirectoryBorderStyle(prop) << "\", "
+ "URL=\"" << addHtmlExtensionIfMissing(dir->getOutputFileBase()) << "\","
+ "tooltip=\"" << escapeTooltip(dir->briefDescriptionAsTooltip()) << "\"";
+}
+
/**
* Puts DOT code for drawing directory to stream and adds it to the list.
* @param[in,out] t stream to which the DOT code is written to
@@ -149,13 +154,11 @@ static void drawDirectory(TextStream &t, const DirDef *const directory, const Do
DirDefMap &directoriesInGraph,int startLevel)
{
t << " " << directory->getOutputFileBase() << " ["
- "shape=box, "
- "label=\"" << directory->shortName() << "\", "
- "style=\"" << getDirectoryBorderStyle(property) << "\", "
+ "label=\"" << DotNode::convertLabel(directory->shortName()) << "\", "
"fillcolor=\"" << getDirectoryBackgroundColor(directory->level()-startLevel) << "\", "
- "color=\"" << getDirectoryBorderColor(property) << "\", "
- "URL=\"" << addHtmlExtensionIfMissing(directory->getOutputFileBase()) << "\""
- "];\n";
+ "color=\"" << getDirectoryBorderColor(property) << "\", ";
+ common_attributes(t, directory, property)
+ << "];\n";
directoriesInGraph.insert(std::make_pair(directory->getOutputFileBase().str(), directory));
}
@@ -178,21 +181,19 @@ static void drawClusterOpening(TextStream &outputStream, const DirDef *const dir
" graph [ "
"bgcolor=\"" << getDirectoryBackgroundColor(directory->level()-startLevel) << "\", "
"pencolor=\"" << getDirectoryBorderColor(directoryProperty) << "\", "
- "style=\"" << getDirectoryBorderStyle(directoryProperty) << "\", "
"label=\"";
if (isAncestor)
{
- outputStream << directory->shortName();
+ outputStream << DotNode::convertLabel(directory->shortName());
}
outputStream << "\", "
- "fontname=\"" << Config_getString(DOT_FONTNAME) << "\", "
- "fontsize=\"" << Config_getInt(DOT_FONTSIZE) << "\", "
- "URL=\"" << addHtmlExtensionIfMissing(directory->getOutputFileBase()) << "\""
- "]\n";
+ << Config_getString(DOT_COMMON_ATTR) << " ";
+ common_attributes(outputStream, directory, directoryProperty)
+ << "]\n";
if (!isAncestor)
{
outputStream << " " << directory->getOutputFileBase() << " [shape=plaintext, "
- "label=\"" << directory->shortName() << "\""
+ "label=\"" << DotNode::convertLabel(directory->shortName()) << "\""
"];\n";
directoriesInGraph.insert(std::make_pair(directory->getOutputFileBase().str(), directory));
}
@@ -388,7 +389,7 @@ void writeDotDirDepGraph(TextStream &t,const DirDef *dd,bool linkRelations)
{
t << " headhref=\"" << addHtmlExtensionIfMissing(relationName) << "\"";
}
- t << "];\n";
+ t << " color=\"steelblue1\" fontcolor=\"steelblue1\"];\n";
}
}
}
diff --git a/src/dotfilepatcher.cpp b/src/dotfilepatcher.cpp
index dc94299..5f14fe1 100644
--- a/src/dotfilepatcher.cpp
+++ b/src/dotfilepatcher.cpp
@@ -146,7 +146,7 @@ static QCString replaceRef(const QCString &buf,const QCString &relPath,
QCString result;
if (urlOnly) // for user defined dot graphs
{
- if (link.left(5)=="\\ref " || link.left(5)=="@ref ") // \ref url
+ if (link.startsWith("\\ref ") || link.startsWith("@ref ")) // \ref url
{
result=href+"=\"";
// fake ref node to resolve the url
@@ -230,7 +230,7 @@ bool DotFilePatcher::convertMapFile(TextStream &t,const QCString &mapName,
while (getline(f,line)) // foreach line
{
QCString buf = line+'\n';
- if (buf.left(5)=="<area")
+ if (buf.startsWith("<area"))
{
QCString replBuf = replaceRef(buf,relPath,urlOnly,context);
// strip id="..." from replBuf since the id's are not needed and not unique.
@@ -255,7 +255,7 @@ DotFilePatcher::DotFilePatcher(const QCString &patchFile)
bool DotFilePatcher::isSVGFile() const
{
- return m_patchFile.right(4)==".svg";
+ return m_patchFile.endsWith(".svg");
}
int DotFilePatcher::addMap(const QCString &mapFile,const QCString &relPath,
@@ -296,7 +296,7 @@ bool DotFilePatcher::run() const
{
//printf("DotFilePatcher::run(): %s\n",qPrint(m_patchFile));
bool interactiveSVG_local = Config_getBool(INTERACTIVE_SVG);
- bool isSVGFile = m_patchFile.right(4)==".svg";
+ bool isSVGFile = m_patchFile.endsWith(".svg");
int graphId = -1;
QCString relPath;
if (isSVGFile)
diff --git a/src/dotgraph.cpp b/src/dotgraph.cpp
index 65ff967..9653055 100644
--- a/src/dotgraph.cpp
+++ b/src/dotgraph.cpp
@@ -15,10 +15,11 @@
#include <sstream>
#include <mutex>
+#include <regex>
#include "config.h"
#include "doxygen.h"
-#include "index.h"
+#include "indexlist.h"
#include "md5.h"
#include "message.h"
#include "util.h"
@@ -274,8 +275,6 @@ void DotGraph::generateCode(TextStream &t)
void DotGraph::writeGraphHeader(TextStream &t,const QCString &title)
{
- int fontSize = Config_getInt(DOT_FONTSIZE);
- QCString fontName = Config_getString(DOT_FONTNAME);
t << "digraph ";
if (title.isEmpty())
{
@@ -292,16 +291,11 @@ void DotGraph::writeGraphHeader(TextStream &t,const QCString &title)
t << " // INTERACTIVE_SVG=YES\n";
}
t << " // LATEX_PDF_SIZE\n"; // write placeholder for LaTeX PDF bounding box size replacement
- if (Config_getBool(DOT_TRANSPARENT))
- {
- t << " bgcolor=\"transparent\";\n";
- }
- t << " edge [fontname=\"" << fontName << "\","
- "fontsize=\"" << fontSize << "\","
- "labelfontname=\"" << fontName << "\","
- "labelfontsize=\"" << fontSize << "\"];\n";
- t << " node [fontname=\"" << fontName << "\","
- "fontsize=\"" << fontSize << "\",shape=record];\n";
+ t << " bgcolor=\"transparent\";\n";
+ QCString c = Config_getString(DOT_COMMON_ATTR);
+ if (!c.isEmpty()) c += ",";
+ t << " edge [" << c << Config_getString(DOT_EDGE_ATTR) << "];\n";
+ t << " node [" << c << Config_getString(DOT_NODE_ATTR) << "];\n";
}
void DotGraph::writeGraphFooter(TextStream &t)
diff --git a/src/dotgraph.h b/src/dotgraph.h
index 87d4165..417ebe3 100644
--- a/src/dotgraph.h
+++ b/src/dotgraph.h
@@ -17,6 +17,7 @@
#define DOTGRAPH_H
#include <iostream>
+#include <map>
#include "qcstring.h"
#include "dir.h"
diff --git a/src/dotgroupcollaboration.cpp b/src/dotgroupcollaboration.cpp
index b72b525..383926e 100644
--- a/src/dotgroupcollaboration.cpp
+++ b/src/dotgroupcollaboration.cpp
@@ -316,25 +316,6 @@ bool DotGroupCollaboration::isTrivial() const
void DotGroupCollaboration::writeGraphHeader(TextStream &t,const QCString &title) const
{
- int fontSize = Config_getInt(DOT_FONTSIZE);
- QCString fontName = Config_getString(DOT_FONTNAME);
- t << "digraph ";
- if (title.isEmpty())
- {
- t << "\"Dot Graph\"";
- }
- else
- {
- t << "\"" << convertToXML(title) << "\"";
- }
- t << "\n";
- t << "{\n";
- if (Config_getBool(DOT_TRANSPARENT))
- {
- t << " bgcolor=\"transparent\";\n";
- }
- t << " edge [fontname=\"" << fontName << "\",fontsize=\"" << fontSize << "\","
- "labelfontname=\"" << fontName << "\",labelfontsize=\"" << fontSize << "\"];\n";
- t << " node [fontname=\"" << fontName << "\",fontsize=\"" << fontSize << "\",shape=box];\n";
+ DotGraph::writeGraphHeader(t, title);
t << " rankdir=LR;\n";
}
diff --git a/src/dotlegendgraph.cpp b/src/dotlegendgraph.cpp
index f512fa2..538efbe 100644
--- a/src/dotlegendgraph.cpp
+++ b/src/dotlegendgraph.cpp
@@ -22,6 +22,7 @@
#include "dot.h"
#include "language.h"
#include "dotfilepatcher.h"
+#include "dotnode.h"
void DotLegendGraph::writeGraph(const QCString &path)
{
@@ -43,27 +44,26 @@ QCString DotLegendGraph::getBaseName() const
void DotLegendGraph::computeTheGraph()
{
- int fontSize = Config_getInt(DOT_FONTSIZE);
- QCString fontName = Config_getString(DOT_FONTNAME);
TextStream md5stream;
writeGraphHeader(md5stream,theTranslator->trLegendTitle());
- md5stream << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",fillcolor=\"grey75\",style=\"filled\" fontcolor=\"black\"];\n";
- md5stream << " Node10 -> Node9 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node11 -> Node10 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node11 [shape=\"box\",label=\"Truncated\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"red\"];\n";
- md5stream << " Node13 -> Node9 [dir=\"back\",color=\"darkgreen\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node13 [shape=\"box\",label=\"ProtectedBase\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node14 -> Node9 [dir=\"back\",color=\"firebrick4\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node14 [shape=\"box\",label=\"PrivateBase\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node15 -> Node9 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node15 [shape=\"box\",label=\"Undocumented\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"grey75\"];\n";
- md5stream << " Node16 -> Node9 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node16 [shape=\"box\",label=\"Templ< int >\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node17 -> Node16 [dir=\"back\",color=\"orange\",fontsize=\"" << fontSize << "\",style=\"dashed\",label=\"< int >\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node17 [shape=\"box\",label=\"Templ< T >\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node18 -> Node9 [dir=\"back\",color=\"darkorchid3\",fontsize=\"" << fontSize << "\",style=\"dashed\",label=\"m_usedClass\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node18 [shape=\"box\",label=\"Used\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
+
+ DotNode{9, "Inherited", "", "", TRUE}.writeBox(md5stream, CallGraph, GOF_BITMAP, false);
+ md5stream << " Node10 -> Node9 [dir=\"back\",color=\"steelblue1\",style=\"solid\"];\n";
+ DotNode{10, "PublicBase", "", "url"}.markHasDocumentation().writeBox(md5stream, CallGraph, GOF_BITMAP, false);
+ md5stream << " Node11 -> Node10 [dir=\"back\",color=\"steelblue1\",style=\"solid\"];\n";
+ DotNode{11, "Truncated", "", "url"}.markAsTruncated().markHasDocumentation().writeBox(md5stream, CallGraph, GOF_BITMAP, true);
+ md5stream << " Node13 -> Node9 [dir=\"back\",color=\"darkgreen\",style=\"solid\"];\n";
+ md5stream << " Node13 [label=\"ProtectedBase\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
+ md5stream << " Node14 -> Node9 [dir=\"back\",color=\"firebrick4\",style=\"solid\"];\n";
+ md5stream << " Node14 [label=\"PrivateBase\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
+ md5stream << " Node15 -> Node9 [dir=\"back\",color=\"steelblue1\",style=\"solid\"];\n";
+ DotNode{15, "Undocumented", "", ""}.writeBox(md5stream, CallGraph, GOF_BITMAP, false);
+ md5stream << " Node16 -> Node9 [dir=\"back\",color=\"steelblue1\",style=\"solid\"];\n";
+ md5stream << " Node16 [label=\"Templ\\< int \\>\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
+ md5stream << " Node17 -> Node16 [dir=\"back\",color=\"orange\",style=\"dashed\",label=\"< int >\",];\n";
+ md5stream << " Node17 [label=\"Templ\\< T \\>\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
+ md5stream << " Node18 -> Node9 [dir=\"back\",color=\"darkorchid3\",style=\"dashed\",label=\"m_usedClass\",];\n";
+ md5stream << " Node18 [label=\"Used\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
writeGraphFooter(md5stream);
m_theGraph = md5stream.str();
}
diff --git a/src/dotnode.cpp b/src/dotnode.cpp
index beb0dc9..6dad107 100644
--- a/src/dotnode.cpp
+++ b/src/dotnode.cpp
@@ -34,7 +34,7 @@ struct EdgeProperties
/*! mapping from protection levels to color names */
static const char *normalEdgeColorMap[] =
{
- "midnightblue", // Public
+ "steelblue1", // Public
"darkgreen", // Protected
"firebrick4", // Private
"darkorchid3", // "use" relation
@@ -61,7 +61,7 @@ static const char *normalEdgeStyleMap[] =
static const char *umlEdgeColorMap[] =
{
- "midnightblue", // Public
+ "steelblue1", // Public
"darkgreen", // Protected
"firebrick4", // Private
"grey25", // "use" relation
@@ -96,7 +96,7 @@ static EdgeProperties umlEdgeProps =
umlEdgeColorMap, umlArrowStyleMap, umlEdgeStyleMap
};
-static QCString escapeTooltip(const QCString &tooltip)
+QCString escapeTooltip(const QCString &tooltip)
{
if (tooltip.isEmpty()) return tooltip;
QCString result;
@@ -354,34 +354,9 @@ void DotNode::deleteNodes(DotNode *node)
}
}
-void DotNode::writeBox(TextStream &t,
- GraphType gt,
- GraphOutputFormat /*format*/,
- bool hasNonReachableChildren) const
+void DotNode::writeLabel(TextStream &t, GraphType gt) const
{
- const char *labCol;
- if (m_classDef)
- {
- if (m_classDef->hasDocumentation() && hasNonReachableChildren)
- labCol = "red";
- else if (m_classDef->hasDocumentation() && !hasNonReachableChildren)
- labCol = "black";
- else if (!m_classDef->hasDocumentation() && hasNonReachableChildren)
- labCol = "orangered";
- else // (!m_classDef->hasDocumentation() && !hasNonReachableChildren)
- {
- labCol = "grey75";
- if (m_classDef->templateMaster() && m_classDef->templateMaster()->hasDocumentation())
- labCol = "black";
- }
- }
- else
- {
- labCol = m_url.isEmpty() ? "grey75" : // non link
- (hasNonReachableChildren ? "red" : "black");
- }
- t << " Node" << m_number << " [label=\"";
-
+ t << "label=";
if (m_classDef && Config_getBool(UML_LOOK) && (gt==Inheritance || gt==Collaboration))
{
// add names shown as relations to a set, so we don't show
@@ -407,7 +382,7 @@ void DotNode::writeBox(TextStream &t,
}
//printf("DotNode::writeBox for %s\n",qPrint(m_classDef->name()));
- t << "{" << convertLabel(m_label) << "\\n";
+ t << "\"{" << convertLabel(m_label) << "\\n";
auto dotUmlDetails = Config_getEnum(DOT_UML_DETAILS);
if (dotUmlDetails!=DOT_UML_DETAILS_t::NONE)
{
@@ -450,47 +425,93 @@ void DotNode::writeBox(TextStream &t,
}
}
}
- t << "}";
+ t << "}\"";
+ }
+ else if (Config_getString(DOT_NODE_ATTR).contains("shape=plain"))
+ {
+ if (m_isRoot)
+ t << "<<b>" << convertToXML(m_label) << "</b>>";
+ else if (m_truncated == Truncated)
+ t << "<<i>" << convertToXML(m_label) << "</i>>";
+ else
+ t << '"' << convertLabel(m_label) << '"';
}
else // standard look
{
- t << convertLabel(m_label);
+ t << '"' << convertLabel(m_label) << '"';
}
- t << "\",height=0.2,width=0.4";
- if (m_isRoot)
+}
+
+void DotNode::writeUrl(TextStream &t) const
+{
+ if (m_url.isEmpty())
+ return;
+ int tagPos = m_url.findRev('$');
+ t << ",URL=\"";
+ QCString noTagURL = m_url;
+ if (tagPos!=-1)
+ {
+ t << m_url.left(tagPos);
+ noTagURL = m_url.mid(tagPos);
+ }
+ int anchorPos = noTagURL.findRev('#');
+ if (anchorPos==-1)
{
- t << ",color=\"black\", fillcolor=\"grey75\", style=\"filled\", fontcolor=\"black\"";
+ t << addHtmlExtensionIfMissing(noTagURL) << "\"";
}
else
{
- t << ",color=\"" << labCol << "\"";
- if (!Config_getBool(DOT_TRANSPARENT))
+ t << addHtmlExtensionIfMissing(noTagURL.left(anchorPos))
+ << noTagURL.right(noTagURL.length() - anchorPos) << "\"";
+ }
+}
+
+void DotNode::writeBox(TextStream &t,
+ GraphType gt,
+ GraphOutputFormat /*format*/,
+ bool hasNonReachableChildren) const
+{
+ const char *labCol;
+ const char *fillCol = "white";
+ if (m_classDef)
+ {
+ if (m_classDef->hasDocumentation() && hasNonReachableChildren)
{
- t << ", fillcolor=\"white\"";
- t << ", style=\"filled\"";
+ labCol = "red";
+ fillCol = "#FFF0F0";
}
- if (!m_url.isEmpty())
+ else if (m_classDef->hasDocumentation() && !hasNonReachableChildren)
+ labCol = "gray40";
+ else if (!m_classDef->hasDocumentation() && hasNonReachableChildren)
+ labCol = "orangered";
+ else // (!m_classDef->hasDocumentation() && !hasNonReachableChildren)
{
- int tagPos = m_url.findRev('$');
- t << ",URL=\"";
- QCString noTagURL = m_url;
- if (tagPos!=-1)
- {
- t << m_url.left(tagPos);
- noTagURL = m_url.mid(tagPos);
- }
- int anchorPos = noTagURL.findRev('#');
- if (anchorPos==-1)
- {
- t << addHtmlExtensionIfMissing(noTagURL) << "\"";
- }
- else
- {
- t << addHtmlExtensionIfMissing(noTagURL.left(anchorPos))
- << noTagURL.right(noTagURL.length()-anchorPos) << "\"";
- }
+ labCol = "grey75";
+ if (m_classDef->templateMaster() && m_classDef->templateMaster()->hasDocumentation())
+ labCol = "gray40";
}
}
+ else
+ {
+ labCol = m_url.isEmpty() ? "grey60" : // non link
+ (hasNonReachableChildren ? "red" : "grey40");
+ fillCol = m_url.isEmpty() ? "#E0E0E0" :
+ (hasNonReachableChildren ? "#FFF0F0" : "white");
+ }
+ t << " Node" << m_number << " [";
+ writeLabel(t,gt);
+ t << ",height=0.2,width=0.4";
+ if (m_isRoot)
+ {
+ t << ",color=\"gray40\", fillcolor=\"grey60\", style=\"filled\", fontcolor=\"black\"";
+ }
+ else
+ {
+ t << ",color=\"" << labCol << "\"";
+ t << ", fillcolor=\"" << fillCol << "\"";
+ t << ", style=\"filled\"";
+ writeUrl(t);
+ }
if (!m_tooltip.isEmpty())
{
t << ",tooltip=\"" << escapeTooltip(m_tooltip) << "\"";
@@ -527,8 +548,7 @@ void DotNode::writeArrow(TextStream &t,
bool umlUseArrow = aStyle=="odiamond";
if (pointBack && !umlUseArrow) t << "dir=\"back\",";
- t << "color=\"" << eProps->edgeColorMap[ei->color()]
- << "\",fontsize=\"" << Config_getInt(DOT_FONTSIZE) << "\",";
+ t << "color=\"" << eProps->edgeColorMap[ei->color()] << "\",";
t << "style=\"" << eProps->edgeStyleMap[ei->style()] << "\"";
if (!ei->label().isEmpty())
{
@@ -547,7 +567,6 @@ void DotNode::writeArrow(TextStream &t,
t << ",arrowhead=\"" << eProps->arrowStyleMap[ei->color()] << "\"";
}
- if (format==GOF_BITMAP) t << ",fontname=\"" << Config_getString(DOT_FONTNAME) << "\"";
t << "];\n";
}
diff --git a/src/dotnode.h b/src/dotnode.h
index c630951..ba6499b 100644
--- a/src/dotnode.h
+++ b/src/dotnode.h
@@ -81,6 +81,8 @@ class DotNode
void writeXML(TextStream &t,bool isClassGraph) const;
void writeDocbook(TextStream &t,bool isClassGraph) const;
void writeDEF(TextStream &t) const;
+ void writeLabel(TextStream &t, GraphType gt) const;
+ void writeUrl(TextStream &t) const;
void writeBox(TextStream &t,GraphType gt,GraphOutputFormat f,
bool hasNonReachableChildren) const;
void writeArrow(TextStream &t,GraphType gt,GraphOutputFormat f,const DotNode *cn,
@@ -99,13 +101,13 @@ class DotNode
void clearWriteFlag();
void renumberNodes(int &number);
void markRenumbered() { m_renumbered = true; }
- void markHasDocumentation() { m_hasDoc = true; }
+ DotNode& markHasDocumentation() { m_hasDoc = true; return *this;}
void setSubgraphId(int id) { m_subgraphId = id; }
void colorConnectedNodes(int curColor);
void setDistance(int distance);
void markAsVisible(bool b=TRUE) { m_visible=b; }
- void markAsTruncated(bool b=TRUE) { m_truncated=b ? Truncated : Untruncated; }
+ DotNode& markAsTruncated(bool b=TRUE) { m_truncated=b ? Truncated : Untruncated; return *this;}
const DotNodeRefVector &children() const { return m_children; }
const DotNodeRefVector &parents() const { return m_parents; }
const EdgeInfoVector &edgeInfo() const { return m_edgeInfo; }
@@ -138,4 +140,6 @@ class DotNodeDeque : public std::deque<DotNode*>
{
};
+QCString escapeTooltip(const QCString &tooltip);
+
#endif
diff --git a/src/dotrunner.cpp b/src/dotrunner.cpp
index 04eb452..922c09f 100644
--- a/src/dotrunner.cpp
+++ b/src/dotrunner.cpp
@@ -14,6 +14,7 @@
*/
#include <cassert>
+#include <cmath>
#include "dotrunner.h"
#include "util.h"
@@ -123,12 +124,15 @@ bool DotRunner::readBoundingBox(const QCString &fileName,int *width,int *height,
if (p) // found PageBoundingBox or /MediaBox string
{
int x,y;
+ double w,h;
fclose(f);
- if (sscanf(p+bblen,"%d %d %d %d",&x,&y,width,height)!=4)
+ if (sscanf(p+bblen,"%d %d %lf %lf",&x,&y,&w,&h)!=4)
{
//printf("readBoundingBox sscanf fail\n");
return FALSE;
}
+ *width = static_cast<int>(std::ceil(w));
+ *height = static_cast<int>(std::ceil(h));
return TRUE;
}
}
@@ -210,7 +214,7 @@ bool DotRunner::run()
// As there should be only one pdf file be generated, we don't need code for regenerating multiple pdf files in one call
for (auto& s : m_jobs)
{
- if (s.format.left(3)=="pdf")
+ if (s.format.startsWith("pdf"))
{
int width=0,height=0;
if (!readBoundingBox(s.output,&width,&height,FALSE)) goto error;
@@ -222,7 +226,7 @@ bool DotRunner::run()
}
}
- if (s.format.left(3)=="png")
+ if (s.format.startsWith("png"))
{
checkPngResult(s.output);
}
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index ab76f09..0c0bb31 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -31,6 +31,7 @@
#include "scanner.h"
#include "entry.h"
#include "index.h"
+#include "indexlist.h"
#include "message.h"
#include "config.h"
#include "util.h"
@@ -153,7 +154,8 @@ bool Doxygen::parseSourcesNeeded = FALSE;
SearchIndexIntf *Doxygen::searchIndex=0;
SymbolMap<Definition>*Doxygen::symbolMap;
ClangUsrMap *Doxygen::clangUsrMap = 0;
-Cache<std::string,LookupInfo> *Doxygen::lookupCache;
+Cache<std::string,LookupInfo> *Doxygen::typeLookupCache;
+Cache<std::string,LookupInfo> *Doxygen::symbolLookupCache;
DirLinkedMap *Doxygen::dirLinkedMap;
DirRelationLinkedMap Doxygen::dirRelations;
ParserManager *Doxygen::parserManager = 0;
@@ -168,6 +170,7 @@ DefinesPerFileList Doxygen::macroDefinitions;
bool Doxygen::clangAssistedParsing = FALSE;
QCString Doxygen::verifiedDotPath;
volatile bool Doxygen::terminating = false;
+InputFileEncodingList Doxygen::inputFileEncodingList;
// locally accessible globals
static std::multimap< std::string, const Entry* > g_classEntries;
@@ -715,6 +718,7 @@ QCString stripTemplateSpecifiers(const QCString &s)
* full qualified name \a name. Creates an artificial scope if the scope is
* not found and set the parent/child scope relation if the scope is found.
*/
+[[maybe_unused]]
static Definition *buildScopeFromQualifiedName(const QCString &name_,SrcLangExt lang,const TagInfo *tagInfo)
{
QCString name = stripTemplateSpecifiers(name_);
@@ -1488,7 +1492,7 @@ void distributeClassGroupRelations()
static ClassDefMutable *createTagLessInstance(const ClassDef *rootCd,const ClassDef *templ,const QCString &fieldName)
{
QCString fullName = removeAnonymousScopes(templ->name());
- if (fullName.right(2)=="::") fullName=fullName.left(fullName.length()-2);
+ if (fullName.endsWith("::")) fullName=fullName.left(fullName.length()-2);
fullName+="."+fieldName;
//printf("** adding class %s based on %s\n",qPrint(fullName),qPrint(templ->name()));
@@ -1860,7 +1864,7 @@ static void findUsingDirectives(const Entry *root)
//printf("Found using directive %s at line %d of %s\n",
// qPrint(root->name),root->startLine,qPrint(root->fileName));
QCString name=substitute(root->name,".","::");
- if (name.right(2)=="::")
+ if (name.endsWith("::"))
{
name=name.left(name.length()-2);
}
@@ -2406,10 +2410,8 @@ static MemberDef *addVariableToFile(
{
QCString ttype = type;
ttype.stripPrefix("typedef ");
- if (ttype.left(7)=="struct " || ttype.left(6)=="union ")
+ if (ttype.stripPrefix("struct ") || ttype.stripPrefix("union "))
{
- ttype.stripPrefix("struct ");
- ttype.stripPrefix("union ");
static const reg::Ex re(R"(\a\w*)");
reg::Match match;
std::string typ = ttype.str();
@@ -2682,7 +2684,7 @@ static bool isVarWithConstructor(const Entry *root)
result=FALSE;
goto done;
}
- else if ((fd != nullptr) && (fd->name().right(2)==".c" || fd->name().right(2)==".h"))
+ else if ((fd != nullptr) && (fd->name().endsWith(".c") || fd->name().endsWith(".h")))
{ // inside a .c file
result=FALSE;
goto done;
@@ -2702,7 +2704,6 @@ static bool isVarWithConstructor(const Entry *root)
findAndRemoveWord(type,"static");
findAndRemoveWord(type,"volatile");
typePtrType = type.find('*')!=-1 || type.find('&')!=-1;
- //if (type.left(6)=="const ") type=type.right(type.length()-6);
if (!typePtrType)
{
typeIsClass = resolver.resolveClass(ctx,type)!=0;
@@ -2856,16 +2857,27 @@ static void addVariable(const Entry *root,int isFuncPtr=-1)
name=removeRedundantWhiteSpace(name);
// find the scope of this variable
- Entry *p = root->parent();
- while ((p->section & Entry::SCOPE_MASK))
+ int index = computeQualifiedIndex(name);
+ if (index!=-1 && root->parent()->section==Entry::GROUPDOC_SEC && root->parent()->tagInfo())
+ // grouped members are stored with full scope
{
- QCString scopeName = p->name;
- if (!scopeName.isEmpty())
+ buildScopeFromQualifiedName(name.left(index+2),root->lang,root->tagInfo());
+ scope=name.left(index);
+ name=name.mid(index+2);
+ }
+ else
+ {
+ Entry *p = root->parent();
+ while ((p->section & Entry::SCOPE_MASK))
{
- scope.prepend(scopeName);
- break;
+ QCString scopeName = p->name;
+ if (!scopeName.isEmpty())
+ {
+ scope.prepend(scopeName);
+ break;
+ }
+ p=p->parent();
}
- p=p->parent();
}
MemberType mtype;
@@ -2909,9 +2921,9 @@ static void addVariable(const Entry *root,int isFuncPtr=-1)
if (type=="@")
mtype=MemberType_EnumValue;
- else if (type.left(8)=="typedef ")
+ else if (type.startsWith("typedef "))
mtype=MemberType_Typedef;
- else if (type.left(7)=="friend ")
+ else if (type.startsWith("friend "))
mtype=MemberType_Friend;
else if (root->mtype==Property)
mtype=MemberType_Property;
@@ -3244,7 +3256,7 @@ static void addMethodToClass(const Entry *root,ClassDefMutable *cd,
QCString args = rargs;
QCString name=removeRedundantWhiteSpace(rname);
- if (name.left(2)=="::") name=name.right(name.length()-2);
+ name.stripPrefix("::");
MemberType mtype;
if (isFriend) mtype=MemberType_Friend;
@@ -3257,7 +3269,7 @@ static void addMethodToClass(const Entry *root,ClassDefMutable *cd,
int i = -1;
int j = -1;
if ((fd==0 || fd->getLanguage()==SrcLangExt_Cpp) &&
- name.left(9)!="operator " && // not operator
+ !name.startsWith("operator ") && // not operator
(i=name.find('<'))!=-1 && // containing <
(j=name.find('>'))!=-1 && // or >
(j!=i+2 || name.at(i+1)!='=') // but not the C++20 spaceship operator <=>
@@ -3338,7 +3350,7 @@ static void addMethodToClass(const Entry *root,ClassDefMutable *cd,
def=qualScope+scopeSeparator+name; //+optArgs;
}
}
- if (def.left(7)=="friend ") def=def.right(def.length()-7);
+ def.stripPrefix("friend ");
md->setDefinition(def);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
@@ -3421,6 +3433,10 @@ static void addGlobalFunction(const Entry *root,const QCString &rname,const QCSt
nd = getResolvedNamespaceMutable(nscope);
}
}
+ else if (root->parent()->section==Entry::GROUPDOC_SEC && !scope.isEmpty())
+ {
+ nd = getResolvedNamespaceMutable(sc);
+ }
if (!scope.isEmpty())
{
@@ -3448,7 +3464,7 @@ static void addGlobalFunction(const Entry *root,const QCString &rname,const QCSt
" '%s' '%s'::'%s' '%s' proto=%d\n"
" def='%s'\n",
qPrint(root->type),
- qPrint(root->parent()->name),
+ qPrint(scope),
qPrint(rname),
qPrint(root->args),
root->proto,
@@ -3459,10 +3475,6 @@ static void addGlobalFunction(const Entry *root,const QCString &rname,const QCSt
md->enableCallerGraph(root->callerGraph);
md->enableReferencedByRelation(root->referencedByRelation);
md->enableReferencesRelation(root->referencesRelation);
- //if (root->mGrpId!=-1)
- //{
- // md->setMemberGroup(memberGroupDict[root->mGrpId]);
- //}
md->setRefItems(root->sli);
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
@@ -3521,7 +3533,19 @@ static void buildFunctionList(const Entry *root)
QCString rname = removeRedundantWhiteSpace(root->name);
//printf("rname=%s\n",qPrint(rname));
- QCString scope=root->parent()->name; //stripAnonymousNamespaceScope(root->parent->name);
+ QCString scope;
+ int index = computeQualifiedIndex(rname);
+ if (index!=-1 && root->parent()->section==Entry::GROUPDOC_SEC && root->parent()->tagInfo())
+ // grouped members are stored with full scope
+ {
+ buildScopeFromQualifiedName(rname.left(index+2),root->lang,root->tagInfo());
+ scope=rname.left(index);
+ rname=rname.mid(index+2);
+ }
+ else
+ {
+ scope=root->parent()->name; //stripAnonymousNamespaceScope(root->parent->name);
+ }
if (!rname.isEmpty() && scope.find('@')==-1)
{
ClassDefMutable *cd=0;
@@ -3580,7 +3604,7 @@ static void buildFunctionList(const Entry *root)
) &&
!isMember &&
(root->relates.isEmpty() || root->relatesType == Duplicate) &&
- root->type.left(7)!="extern " && root->type.left(8)!="typedef "
+ !root->type.startsWith("extern ") && !root->type.startsWith("typedef ")
)
// no member => unrelated function
{
@@ -4210,7 +4234,7 @@ static void findUsedClassesForClass(const Entry *root,
ClassDefMutable *usedCdm = toClassDefMutable(usedCd);
if (usedCd==0 && !Config_getBool(HIDE_UNDOC_RELATIONS))
{
- if (type.right(2)=="(*" || type.right(2)=="(^") // type is a function pointer
+ if (type.endsWith("(*") || type.endsWith("(^")) // type is a function pointer
{
type+=md->argsString();
}
@@ -4498,7 +4522,7 @@ static bool findClassRelation(
QCString biName=bi->name;
bool explicitGlobalScope=FALSE;
//printf("findClassRelation: biName='%s'\n",qPrint(biName));
- if (biName.left(2)=="::") // explicit global scope
+ if (biName.startsWith("::")) // explicit global scope
{
biName=biName.right(biName.length()-2);
explicitGlobalScope=TRUE;
@@ -4755,7 +4779,7 @@ static bool findClassRelation(
}
if (baseClass)
{
- if (biName.right(2)=="-p")
+ if (biName.endsWith("-p"))
{
biName="<"+biName.left(biName.length()-2)+">";
}
@@ -4772,7 +4796,7 @@ static bool findClassRelation(
baseClass->setOuterScope(scope);
}
- if (baseClassName.right(2)=="-p")
+ if (baseClassName.endsWith("-p"))
{
baseClass->setCompoundType(ClassDef::Protocol);
}
@@ -4937,7 +4961,7 @@ static void computeClassRelations()
}
size_t numMembers = cd ? cd->memberNameInfoLinkedMap().size() : 0;
if ((cd==0 || (!cd->hasDocumentation() && !cd->isReference())) && numMembers>0 &&
- bName.right(2)!="::")
+ !bName.endsWith("::"))
{
if (!root->name.isEmpty() && root->name.find('@')==-1 && // normal name
(guessSection(root->fileName)==Entry::HEADER_SEC ||
@@ -5581,8 +5605,8 @@ static QCString substituteTemplatesInString(
QCString tdaName = tda->name;
QCString tdaType = tda->type;
int vc=0;
- if (tdaType.left(6)=="class ") vc=6;
- else if (tdaType.left(9)=="typename ") vc=9;
+ if (tdaType.startsWith("class ")) vc=6;
+ else if (tdaType.startsWith("typename ")) vc=9;
if (vc>0) // convert type=="class T" to type=="class" name=="T"
{
tdaName = tdaType.mid(vc);
@@ -6277,13 +6301,13 @@ static void findMember(const Entry *root,
).stripWhiteSpace();
//printf("funcDecl='%s'\n",qPrint(funcDecl));
- if (isFriend && funcDecl.left(6)=="class ")
+ if (isFriend && funcDecl.startsWith("class "))
{
//printf("friend class\n");
funcDecl=funcDecl.right(funcDecl.length()-6);
funcName = funcDecl;
}
- else if (isFriend && funcDecl.left(7)=="struct ")
+ else if (isFriend && funcDecl.startsWith("struct "))
{
funcDecl=funcDecl.right(funcDecl.length()-7);
funcName = funcDecl;
@@ -6527,7 +6551,7 @@ static void findMember(const Entry *root,
}
}
- if (funcName.left(9)=="operator ") // strip class scope from cast operator
+ if (funcName.startsWith("operator ")) // strip class scope from cast operator
{
funcName = substitute(funcName,className+"::","");
}
@@ -6861,7 +6885,7 @@ static void filterMemberDocumentation(const Entry *root,const QCString &relates)
//printf("Results type=%s,name=%s,args=%s\n",qPrint(type),qPrint(root->name),qPrint(args));
isFunc=FALSE;
}
- else if ((type.left(8)=="typedef " && args.find('(')!=-1))
+ else if ((type.startsWith("typedef ") && args.find('(')!=-1))
// detect function types marked as functions
{
isFunc=FALSE;
@@ -7067,7 +7091,10 @@ static void findEnums(const Entry *root)
{
scope=root->name.left(i); // extract scope
name=root->name.right(root->name.length()-i-2); // extract name
- if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
+ if ((cd=getClassMutable(scope))==0)
+ {
+ nd=toNamespaceDefMutable(buildScopeFromQualifiedName(root->name.left(i+2),root->lang,root->tagInfo()));
+ }
}
else // no scope, check the scope in which the docs where found
{
@@ -7234,7 +7261,10 @@ static void addEnumValuesToEnums(const Entry *root)
{
scope=root->name.left(i); // extract scope
name=root->name.right(root->name.length()-i-2); // extract name
- if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
+ if ((cd=getClassMutable(scope))==0)
+ {
+ nd=toNamespaceDefMutable(buildScopeFromQualifiedName(root->name.left(i+2),root->lang,root->tagInfo()));
+ }
}
else // no scope, check the scope in which the docs where found
{
@@ -7300,14 +7330,12 @@ static void addEnumValuesToEnums(const Entry *root)
// use raw pointer in this loop, since we modify mn and can then invalidate mdp.
if (md && md->isEnumerate() && !root->children().empty())
{
- //printf(" enum with %d children\n",root->children()->count());
+ //printf(" enum with %zu children\n",root->children().size());
for (const auto &e : root->children())
{
- SrcLangExt sle;
- if (
- (sle=root->lang)==SrcLangExt_CSharp ||
- sle==SrcLangExt_Java ||
- sle==SrcLangExt_XML ||
+ SrcLangExt sle = root->lang;
+ bool isJavaLike = sle==SrcLangExt_CSharp || sle==SrcLangExt_Java || sle==SrcLangExt_XML;
+ if ( isJavaLike ||
(root->spec&Entry::Strong)
)
{
@@ -7315,15 +7343,13 @@ static void addEnumValuesToEnums(const Entry *root)
// values are only visible inside the enum scope, so we must create
// them here and only add them to the enum
//printf("md->qualifiedName()=%s e->name=%s tagInfo=%p name=%s\n",
- // qPrint(md->qualifiedName()),qPrint(e->name),e->tagInfo,qPrint(e->name));
- QCString qualifiedName = substitute(root->name,"::",".");
- if (!scope.isEmpty() && root->tagInfo())
+ // qPrint(md->qualifiedName()),qPrint(e->name),(void*)e->tagInfo(),qPrint(e->name));
+ QCString qualifiedName = root->name;
+ if (isJavaLike)
{
- qualifiedName=substitute(scope,"::",".")+"."+qualifiedName;
+ qualifiedName=substitute(qualifiedName,".","::");
}
- if (substitute(md->qualifiedName(),"::",".")== // TODO: add function to get canonical representation
- qualifiedName // enum value scope matches that of the enum
- )
+ if (md->qualifiedName()==qualifiedName) // enum value scope matches that of the enum
{
QCString fileName = e->fileName;
if (fileName.isEmpty() && e->tagInfo())
@@ -8387,13 +8413,16 @@ static void computeTooltipTexts()
// queue the work
for (const auto &kv : *Doxygen::symbolMap)
{
- DefinitionMutable *dm = toDefinitionMutable(kv.second);
- if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
+ for (const auto &def : kv.second)
{
- auto processTooltip = [dm]() {
- dm->computeTooltip();
- };
- results.emplace_back(threadPool.queue(processTooltip));
+ DefinitionMutable *dm = toDefinitionMutable(def);
+ if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
+ {
+ auto processTooltip = [dm]() {
+ dm->computeTooltip();
+ };
+ results.emplace_back(threadPool.queue(processTooltip));
+ }
}
}
// wait for the results
@@ -8406,10 +8435,13 @@ static void computeTooltipTexts()
{
for (const auto &kv : *Doxygen::symbolMap)
{
- DefinitionMutable *dm = toDefinitionMutable(kv.second);
- if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
+ for (const auto &def : kv.second)
{
- dm->computeTooltip();
+ DefinitionMutable *dm = toDefinitionMutable(def);
+ if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
+ {
+ dm->computeTooltip();
+ }
}
}
}
@@ -8800,17 +8832,17 @@ static void flushCachedTemplateRelations()
// to this class. Optimization: only remove those classes that
// have inheritance instances as direct or indirect sub classes.
StringVector elementsToRemove;
- for (const auto &ci : *Doxygen::lookupCache)
+ for (const auto &ci : *Doxygen::typeLookupCache)
{
const LookupInfo &li = ci.second;
- if (li.classDef)
+ if (li.definition)
{
elementsToRemove.push_back(ci.first);
}
}
for (const auto &k : elementsToRemove)
{
- Doxygen::lookupCache->remove(k);
+ Doxygen::typeLookupCache->remove(k);
}
// remove all cached typedef resolutions whose target is a
@@ -8860,17 +8892,17 @@ static void flushUnresolvedRelations()
// class C : public B::I {};
StringVector elementsToRemove;
- for (const auto &ci : *Doxygen::lookupCache)
+ for (const auto &ci : *Doxygen::typeLookupCache)
{
const LookupInfo &li = ci.second;
- if (li.classDef==0 && li.typeDef==0)
+ if (li.definition==0 && li.typeDef==0)
{
elementsToRemove.push_back(ci.first);
}
}
for (const auto &k : elementsToRemove)
{
- Doxygen::lookupCache->remove(k);
+ Doxygen::typeLookupCache->remove(k);
}
// for each global function name
@@ -9738,7 +9770,7 @@ static void generateConfigFile(const QCString &configFile,bool shortList,
}
}
-static void compareDoxyfile(DoxyfileSettings diffList)
+static void compareDoxyfile(Config::CompareMode diffList)
{
std::ofstream f;
bool fileOpened=openOutputFile("-",f);
@@ -9825,28 +9857,31 @@ static void copyStyleSheet()
QCString htmlStyleSheet = Config_getString(HTML_STYLESHEET);
if (!htmlStyleSheet.isEmpty())
{
- FileInfo fi(htmlStyleSheet.str());
- if (!fi.exists())
+ if (!htmlStyleSheet.startsWith("http:") && !htmlStyleSheet.startsWith("https:"))
{
- err("Style sheet '%s' specified by HTML_STYLESHEET does not exist!\n",qPrint(htmlStyleSheet));
- htmlStyleSheet = Config_updateString(HTML_STYLESHEET,""); // revert to the default
- }
- else
- {
- QCString destFileName = Config_getString(HTML_OUTPUT)+"/"+fi.fileName();
- copyFile(htmlStyleSheet,destFileName);
+ FileInfo fi(htmlStyleSheet.str());
+ if (!fi.exists())
+ {
+ err("Style sheet '%s' specified by HTML_STYLESHEET does not exist!\n",qPrint(htmlStyleSheet));
+ htmlStyleSheet = Config_updateString(HTML_STYLESHEET,""); // revert to the default
+ }
+ else
+ {
+ QCString destFileName = Config_getString(HTML_OUTPUT)+"/"+fi.fileName();
+ copyFile(htmlStyleSheet,destFileName);
+ }
}
}
const StringVector &htmlExtraStyleSheet = Config_getList(HTML_EXTRA_STYLESHEET);
for (const auto &sheet : htmlExtraStyleSheet)
{
- std::string fileName = sheet;
- if (!fileName.empty())
+ QCString fileName(sheet);
+ if (!fileName.isEmpty() && !fileName.startsWith("http:") && !fileName.startsWith("https:"))
{
- FileInfo fi(fileName);
+ FileInfo fi(fileName.str());
if (!fi.exists())
{
- err("Style sheet '%s' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName.c_str());
+ err("Style sheet '%s' specified by HTML_EXTRA_STYLESHEET does not exist!\n",qPrint(fileName));
}
else if (fi.fileName()=="doxygen.css" || fi.fileName()=="tabs.css" || fi.fileName()=="navtree.css")
{
@@ -10308,7 +10343,7 @@ static std::string resolveSymlink(const std::string &path)
{
#if defined(_WIN32)
// UNC path, skip server and share name
- if (sepPos==0 && (result.left(2)=="//" || result.left(2)=="\\\\"))
+ if (sepPos==0 && (result.startsWith("//") || result.startsWith("\\\\")))
sepPos = result.find('/',2);
if (sepPos!=-1)
sepPos = result.find('/',sepPos+1);
@@ -10670,7 +10705,10 @@ static void dumpSymbolMap()
TextStream t(&f);
for (const auto &kv : *Doxygen::symbolMap)
{
- dumpSymbol(t,kv.second);
+ for (const auto &def : kv.second)
+ {
+ dumpSymbol(t,def);
+ }
}
}
}
@@ -10745,7 +10783,7 @@ static void usage(const QCString &name,const QCString &versionString)
msg("7) Use doxygen to compare the used configuration file with the template configuration file\n");
msg(" %s -x [configFile]\n\n",qPrint(name));
msg(" Use doxygen to compare the used configuration file with the template configuration file\n");
- msg(" without replacing the environment variables\n");
+ msg(" without replacing the environment variables or CMake type replacement variables\n");
msg(" %s -x_noenv [configFile]\n\n",qPrint(name));
msg("8) Use doxygen to show a list of built-in emojis.\n");
msg(" %s -f emoji outputFileName\n\n",qPrint(name));
@@ -10932,7 +10970,7 @@ void readConfiguration(int argc, char **argv)
QCString listName;
bool genConfig=FALSE;
bool shortList=FALSE;
- DoxyfileSettings diffList=DoxyfileSettings::Full;
+ Config::CompareMode diffList=Config::CompareMode::Full;
bool updateConfig=FALSE;
int retVal;
bool quiet = false;
@@ -10977,8 +11015,8 @@ void readConfiguration(int argc, char **argv)
}
break;
case 'x':
- if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=DoxyfileSettings::CompressedNoEnv;
- else if (!strcmp(argv[optInd]+1,"x")) diffList=DoxyfileSettings::Compressed;
+ if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
+ else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
else
{
err("option should be \"-x\" or \"-x_noenv\", found: \"%s\".\n",argv[optInd]);
@@ -11072,8 +11110,14 @@ void readConfiguration(int argc, char **argv)
TextStream t(&f);
RTFGenerator::writeStyleSheetFile(t);
}
+ else
+ {
+ err("error opening RTF style sheet file %s!\n",argv[optInd+1]);
+ cleanUpDoxygen();
+ exit(1);
+ }
cleanUpDoxygen();
- exit(1);
+ exit(0);
}
else if (qstricmp(formatName.data(),"html")==0)
{
@@ -11296,14 +11340,14 @@ void readConfiguration(int argc, char **argv)
exit(0);
}
- if (!Config::parse(configName,updateConfig))
+ if (!Config::parse(configName,updateConfig,diffList))
{
err("could not open or read configuration file %s!\n",qPrint(configName));
cleanUpDoxygen();
exit(1);
}
- if (diffList!=DoxyfileSettings::Full)
+ if (diffList!=Config::CompareMode::Full)
{
Config::updateObsolete();
compareDoxyfile(diffList);
@@ -11395,6 +11439,54 @@ void adjustConfiguration()
}
}
}
+ // create input file exncodings
+
+ // check INPUT_ENCODING
+ void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
+ if (cd==reinterpret_cast<void *>(-1))
+ {
+ term("unsupported character conversion: '%s'->'%s': %s\n"
+ "Check the 'INPUT_ENCODING' setting in the config file!\n",
+ qPrint(Config_getString(INPUT_ENCODING)),qPrint("UTF-8"),strerror(errno));
+ }
+ else
+ {
+ portable_iconv_close(cd);
+ }
+
+ // check and split INPUT_FILE_ENCODING
+ const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
+ for (const auto &mapping : fileEncod)
+ {
+ QCString mapStr = mapping.c_str();
+ int i=mapStr.find('=');
+ if (i==-1)
+ {
+ continue;
+ }
+ else
+ {
+ QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
+ QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
+ if (pattern.isEmpty() || encoding.isEmpty())
+ {
+ continue;
+ }
+ cd = portable_iconv_open("UTF-8",encoding.data());
+ if (cd==reinterpret_cast<void *>(-1))
+ {
+ term("unsupported character conversion: '%s'->'%s': %s\n"
+ "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
+ qPrint(encoding),qPrint("UTF-8"),strerror(errno));
+ }
+ else
+ {
+ portable_iconv_close(cd);
+ }
+
+ Doxygen::inputFileEncodingList.push_back(InputFileEncoding(pattern, encoding));
+ }
+ }
// add predefined macro name to a dictionary
const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
@@ -11723,6 +11815,10 @@ void searchInputFiles()
});
}
}
+ if (Doxygen::inputNameLinkedMap->empty())
+ {
+ warn_uncond("No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE");
+ }
g_s.end();
}
@@ -11782,7 +11878,8 @@ void parseInput()
if (cacheSize<0) cacheSize=0;
if (cacheSize>9) cacheSize=9;
uint lookupSize = 65536 << cacheSize;
- Doxygen::lookupCache = new Cache<std::string,LookupInfo>(lookupSize);
+ Doxygen::typeLookupCache = new Cache<std::string,LookupInfo>(lookupSize);
+ Doxygen::symbolLookupCache = new Cache<std::string,LookupInfo>(lookupSize);
#ifdef HAS_SIGNALS
signal(SIGINT, stopDoxygen);
@@ -11933,24 +12030,19 @@ void parseInput()
if (Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX))
{
- FormulaManager::instance().readFormulas(Config_getString(HTML_OUTPUT));
+ FormulaManager::instance().initFromRepository(Config_getString(HTML_OUTPUT));
}
if (Config_getBool(GENERATE_RTF))
{
- // in case GENERRATE_HTML is set we just have to compare, both repositories should be identical
- FormulaManager::instance().readFormulas(Config_getString(RTF_OUTPUT),
- Config_getBool(GENERATE_HTML) &&
- !Config_getBool(USE_MATHJAX));
+ FormulaManager::instance().initFromRepository(Config_getString(RTF_OUTPUT));
}
if (Config_getBool(GENERATE_DOCBOOK))
{
- // in case GENERRATE_HTML is set we just have to compare, both repositories should be identical
- FormulaManager::instance().readFormulas(Config_getString(DOCBOOK_OUTPUT),
- (Config_getBool(GENERATE_HTML) &&
- !Config_getBool(USE_MATHJAX)) ||
- Config_getBool(GENERATE_RTF));
+ FormulaManager::instance().initFromRepository(Config_getString(DOCBOOK_OUTPUT));
}
+ FormulaManager::instance().checkRepositories();
+
/**************************************************************************
* Handle Tag Files *
**************************************************************************/
@@ -12029,7 +12121,7 @@ void parseInput()
// calling buildClassList may result in cached relations that
// become invalid after resolveClassNestingRelations(), that's why
// we need to clear the cache here
- Doxygen::lookupCache->clear();
+ Doxygen::typeLookupCache->clear();
// we don't need the list of using declaration anymore
g_usingDeclarations.clear();
@@ -12462,7 +12554,7 @@ void generateOutput()
copyLogo(Config_getString(RTF_OUTPUT));
}
- const FormulaManager &fm = FormulaManager::instance();
+ FormulaManager &fm = FormulaManager::instance();
if (fm.hasFormulas() && generateHtml
&& !Config_getBool(USE_MATHJAX))
{
@@ -12653,13 +12745,19 @@ void generateOutput()
g_outputList->cleanup();
- int cacheParam;
- msg("lookup cache used %zu/%zu hits=%" PRIu64 " misses=%" PRIu64 "\n",
- Doxygen::lookupCache->size(),
- Doxygen::lookupCache->capacity(),
- Doxygen::lookupCache->hits(),
- Doxygen::lookupCache->misses());
- cacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::lookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
+ msg("type lookup cache used %zu/%zu hits=%" PRIu64 " misses=%" PRIu64 "\n",
+ Doxygen::typeLookupCache->size(),
+ Doxygen::typeLookupCache->capacity(),
+ Doxygen::typeLookupCache->hits(),
+ Doxygen::typeLookupCache->misses());
+ msg("symbol lookup cache used %zu/%zu hits=%" PRIu64 " misses=%" PRIu64 "\n",
+ Doxygen::symbolLookupCache->size(),
+ Doxygen::symbolLookupCache->capacity(),
+ Doxygen::symbolLookupCache->hits(),
+ Doxygen::symbolLookupCache->misses());
+ int typeCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::typeLookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
+ int symbolCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::symbolLookupCache->misses()));
+ int cacheParam = std::max(typeCacheParam,symbolCacheParam);
if (cacheParam>Config_getInt(LOOKUP_CACHE_SIZE))
{
msg("Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is %d at the cost of higher memory usage.\n",cacheParam);
diff --git a/src/doxygen.h b/src/doxygen.h
index d0ecc1b..53d30ee 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -58,14 +58,24 @@ class NamespaceDefMutable;
struct LookupInfo
{
LookupInfo() = default;
- LookupInfo(const ClassDef *cd,const MemberDef *td,QCString ts,QCString rt)
- : classDef(cd), typeDef(td), templSpec(ts),resolvedType(rt) {}
- const ClassDef *classDef = 0;
+ LookupInfo(const Definition *d,const MemberDef *td,QCString ts,QCString rt)
+ : definition(d), typeDef(td), templSpec(ts),resolvedType(rt) {}
+ const Definition *definition = 0;
const MemberDef *typeDef = 0;
QCString templSpec;
QCString resolvedType;
};
+struct InputFileEncoding
+{
+ InputFileEncoding() {}
+ InputFileEncoding(const QCString &pat, const QCString &enc) : pattern(pat), encoding(enc) {}
+ QCString pattern;
+ QCString encoding;
+};
+
+using InputFileEncodingList = std::vector<InputFileEncoding>;
+
using ClangUsrMap = std::unordered_map<std::string,const Definition *>;
/*! \brief This class serves as a namespace for global variables used by doxygen.
@@ -105,7 +115,8 @@ class Doxygen
static SearchIndexIntf *searchIndex;
static SymbolMap<Definition> *symbolMap;
static ClangUsrMap *clangUsrMap;
- static Cache<std::string,LookupInfo> *lookupCache;
+ static Cache<std::string,LookupInfo> *typeLookupCache;
+ static Cache<std::string,LookupInfo> *symbolLookupCache;
static DirLinkedMap *dirLinkedMap;
static DirRelationLinkedMap dirRelations;
static ParserManager *parserManager;
@@ -119,6 +130,7 @@ class Doxygen
static bool clangAssistedParsing;
static QCString verifiedDotPath;
static volatile bool terminating;
+ static InputFileEncodingList inputFileEncodingList;
};
/** Deleter that only deletes an object if doxygen is not already terminating */
@@ -139,7 +151,6 @@ void adjustConfiguration();
void parseInput();
void generateOutput();
void readAliases();
-void readFormulaRepository(QCString dir, bool cmp = FALSE);
void cleanUpDoxygen();
void readFileOrDirectory(const QCString &s,
FileNameLinkedMap *fnDict,
diff --git a/src/doxygen.md b/src/doxygen.md
index de38efe..bc3c1be 100644
--- a/src/doxygen.md
+++ b/src/doxygen.md
@@ -1,6 +1,8 @@
-Doxygen Internals {#mainpage}
+%Doxygen Internals {#mainpage}
=================
+Generated on \showdate "%A, %B %-d, %Y at %-I:%M %p"
+
Introduction
============
@@ -22,10 +24,11 @@ option.
The format of the configuration file (options and types) is defined
by the file `config.xml`. As part of the build process,
-the python script `configgen.py` will create a file `configoptions.cpp`
-from this, which serves as the input for the configuration file parser
-that is invoked using Config::parse(). The script `configgen.py` will also
-create the documentation for the configuration items, creating the file
+the python script `configgen.py` will create the files `configoptions.cpp`,
+`configvalues.h` and `configvalues.cpp` from this, which serves as the input
+for the configuration file parser that is invoked using Config::parse().
+The script `configgen.py` will also create the documentation for the
+configuration items, creating the file
`config.doc`.
Gathering Input files
@@ -37,12 +40,19 @@ searchInputFiles() and any tag files are read using readTagFile()
Parsing Input files
===================
-The function parseFiles() takes care of parsing all files.
-It uses the ParserManager singleton factory to create a suitable parser object
-for each file. Each parser implements the abstract interface ParserInterface.
+The function parseFilesSingleThreading() takes care of parsing all files
+(in case `NUM_PROC_THREADS!=1`, the function
+parseFilesMultiThreading() is used instead).
+
+These functions use the ParserManager singleton factory to create a suitable parser object
+for each file. Each parser implements two abstract interfaces: OutlineParserInterface
+en CodeParserInterface. The OutlineParserInterface is used to collect information
+about the symbols that can be documented but does not look into the body of functions.
+The CodeParserInterface is used for syntax highlighting, but also to collect the symbol
+references needed for cross reference relations.
If the parser indicates it needs preprocessing
-via ParserInterface::needsPreprocessing(), doxygen will call preprocessFile()
+via OutlineParserInterface::needsPreprocessing(), doxygen will call Preprocessor::processFile()
on the file.
A second step is to convert multiline C++-style comments into C style comments
@@ -54,31 +64,26 @@ aliases (ALIASES option) are resolved. The function that performs these
now coupled to C/C++ code and does not work automatically for other languages!
The third step is the actual language parsing and is done by calling
-ParserInterface::parseInput() on the parser interface returned by
+OutlineParserInterface::parseInput() on the parser interface returned by
the ParserManager.
The result of parsing is a tree of Entry objects.
-These Entry objects are wrapped in a EntryNav object and stored on disk using
-Entry::createNavigationIndex() on the root node of the tree.
-
Each Entry object roughly contains the raw data for a symbol and is later
converted into a Definition object.
When a parser finds a special comment block in the input, it will do a first
-pass parsing via parseCommentBlock(). During this pass the comment block
+pass parsing via CommentScanner::parseCommentBlock(). During this pass the comment block
is split into multiple parts if needed. Some data that is later needed is
extracted like section labels, xref items, and formulas.
-Also Markdown markup is processed using processMarkdown() during this pass.
+Also Markdown markup is processed via Markdown::process() during this pass.
Resolving relations
===================
-The Entry objects created and filled during parsing are stored on disk
-(to keep memory needs low). The name, parent/child relation, and
-location on disk of each Entry is stored as a tree of EntryNav nodes, which is
-kept in memory.
+The Entry objects created and filled during parsing and stored as a tree of Entry nodes,
+which is kept in memory.
-Doxygen does a number of tree walks over the EntryNav nodes in the tree to
+%Doxygen does a number of tree walks over the Entry nodes in the tree to
build up the data structures needed to produce the output.
The resulting data structures are all children of the generic base class
@@ -86,6 +91,7 @@ called Definition which holds all non-specific data for a symbol definition.
Definition is an abstract base class. Concrete subclasses are
- ClassDef: for storing class/struct/union related data
+- ConceptDef: for storing C++20 concept definitions
- NamespaceDef: for storing namespace related data
- FileDef: for storing file related data
- DirDef: for storing directory related data
@@ -95,7 +101,8 @@ For doxygen specific concepts the following subclasses are available
- PageDef: for storing page related data
Finally the data for members of classes, namespaces, and files is stored in
-the subclass MemberDef.
+the subclass MemberDef. This class is used for functions, variables, enums, etc, as indicated by
+MemberDef::memberType().
Producing debug output
======================
@@ -115,12 +122,13 @@ easy ways to get debug information.
- set the item `Write used lex rules` to `Yes`
- see to it that the `.l` file is newer than the corresponding `.cpp` file
or remove the corresponding `.cpp` file
+ - when using `nmake` the same possibilities exist as described with "unices".
- unices
- global change<br>
In the chapter "Doxygen's internals" a `perl` script is given to toggle the
possibility of having the rules debug information.
- command line change<br>
- It is possible to the option `LEX="flex -d"` with the `make` command on the
+ It is possible to the option `LEX_FLAGS="-d"` with the `make` command on the
command line. In this case the `.l` that are converted to the corresponding
`.cpp` files during this `make` get the rules debug information.<br>
To undo the rules debug information output just recompile the file with
@@ -144,6 +152,9 @@ easy ways to get debug information.
Shows the results of the preprocessing phase, i.e. results from include files,
<tt>\#define</tt> statements etc., definitions in the doxygen configuration file like:
`EXPAND_ONLY_PREDEF`, `PREDEFINED` and `MACRO_EXPANSION`.
+ - nolineno<br>
+ In case the line numbers in the results of the preprocessing phase are not wanted they
+ can be removed by means of this option (without `-d preprocessor` this option has no effect.
- commentcnv<br>
Shows the results of the comment conversion, the comment conversion does the
following:
@@ -172,13 +183,32 @@ easy ways to get debug information.
Provide output of the `lex` files used. When a lexer is started and when a lexer
ends the name of the `lex` file is given so it is possible to see in which lexer the
problem occurs. This makes it easier to select the file to be compiled in `lex` debug mode.
+ - cite<br>
+ Retains the temporary files as created and used for the non LaTeX output results of the
+ generation of the bibliographical references.
+ - fortranfixed2free<br>
+ Shows the result ogf the conversion of Fortran fixed formatted files to Fortran free formatted
+ files as done by doxygen.
+ - plantuml<br>
+ Shows information about the plantuml process run and the used input / output filenames, the content of the
+ input file.
+ - rtf<br>
+ - Shows the original names and the anchors names (called bookmarks in RTF) where they are mapped to.
+ - At the end of the generation of the RTF files these files are merged into one large RTF file, with
+ this option the original files are retained.
+ - qhp<br>
+ - The qhp file is created with indentation for better readability (normally no indentation so the file is smaller).
+ - When the setting `QHG_LOCATION` is pointing to the `qhelpgenerator` besides generating the `qch` file
+ also some extra checks are done by means of the `-c` flag of the `qhelpgenerator`.
+ - tag<br>
+ Shows the results of reading the tag files.
Producing output
================
TODO
-Topics TODO
+Documentation Topics TODO
===========
- Grouping of files in Model / Parser / Generator categories
- Index files based on IndexIntf
diff --git a/src/eclipsehelp.cpp b/src/eclipsehelp.cpp
index 53a370b..73eb405 100644
--- a/src/eclipsehelp.cpp
+++ b/src/eclipsehelp.cpp
@@ -12,47 +12,54 @@
* input used in their production; they are not affected by this license.
*
*/
+
+#include <fstream>
+
#include "eclipsehelp.h"
#include "util.h"
#include "config.h"
#include "message.h"
#include "doxygen.h"
-EclipseHelp::EclipseHelp() : m_depth(0), m_endtag(FALSE), m_openTags(0)
+struct EclipseHelp::Private
{
-}
+ int depth = 0;
+ bool endtag = false;
+ int openTags = 0;
-EclipseHelp::~EclipseHelp()
-{
-}
+ std::ofstream tocstream;
+ QCString pathprefix;
-void EclipseHelp::indent()
-{
- int i;
- for (i=0; i<m_depth; i++)
+ /* -- formatting helpers */
+ void indent()
{
- m_tocstream << " ";
+ for (int i=0; i<depth; i++)
+ {
+ tocstream << " ";
+ }
}
-}
-
-void EclipseHelp::closedTag()
-{
- if (m_endtag)
+ void closedTag()
{
- m_tocstream << "/>\n";
- m_endtag = FALSE;
+ if (endtag)
+ {
+ tocstream << "/>\n";
+ endtag = FALSE;
+ }
}
-}
-
-void EclipseHelp::openedTag()
-{
- if (m_endtag)
+ void openedTag()
{
- m_tocstream << ">\n";
- m_endtag = FALSE;
- ++m_openTags;
+ if (endtag)
+ {
+ tocstream << ">\n";
+ endtag = FALSE;
+ ++openTags;
+ }
}
-}
+};
+
+EclipseHelp::EclipseHelp() : p(std::make_unique<Private>()) {}
+EclipseHelp::~EclipseHelp() = default;
+EclipseHelp::EclipseHelp(EclipseHelp&&) = default;
/*!
* \brief Initialize the Eclipse generator
@@ -62,14 +69,10 @@ void EclipseHelp::openedTag()
*/
void EclipseHelp::initialize()
{
- // -- read path prefix from the configuration
- //m_pathprefix = Config_getString(ECLIPSE_PATHPREFIX);
- //if (m_pathprefix.isEmpty()) m_pathprefix = "html/";
-
// -- open the contents file
QCString name = Config_getString(HTML_OUTPUT) + "/toc.xml";
- m_tocstream.open(name.str(), std::ofstream::out | std::ofstream::binary);
- if (!m_tocstream.is_open())
+ p->tocstream.open(name.str(), std::ofstream::out | std::ofstream::binary);
+ if (!p->tocstream.is_open())
{
term("Could not open file %s for writing\n", qPrint(name));
}
@@ -80,10 +83,10 @@ void EclipseHelp::initialize()
{
title = "Doxygen generated documentation";
}
- m_tocstream << "<toc label=\"" << convertToXML(title)
- << "\" topic=\"" << convertToXML(m_pathprefix)
+ p->tocstream << "<toc label=\"" << convertToXML(title)
+ << "\" topic=\"" << convertToXML(p->pathprefix)
<< "index" << Doxygen::htmlFileExtension << "\">\n";
- ++ m_depth;
+ ++ p->depth;
}
/*!
@@ -94,14 +97,14 @@ void EclipseHelp::initialize()
*/
void EclipseHelp::finalize()
{
- closedTag(); // -- close previous tag
+ p->closedTag(); // -- close previous tag
// -- write ending tag
- --m_depth;
- m_tocstream << "</toc>\n";
+ --p->depth;
+ p->tocstream << "</toc>\n";
// -- close the content file
- m_tocstream.close();
+ p->tocstream.close();
QCString name = Config_getString(HTML_OUTPUT) + "/plugin.xml";
std::ofstream t(name.str(),std::ofstream::out | std::ofstream::binary);
@@ -122,8 +125,8 @@ void EclipseHelp::finalize()
*/
void EclipseHelp::incContentsDepth()
{
- openedTag();
- ++m_depth;
+ p->openedTag();
+ ++p->depth;
}
/*!
@@ -134,14 +137,14 @@ void EclipseHelp::incContentsDepth()
void EclipseHelp::decContentsDepth()
{
// -- end of the opened topic
- closedTag();
- --m_depth;
+ p->closedTag();
+ --p->depth;
- if (m_openTags==m_depth)
+ if (p->openTags==p->depth)
{
- --m_openTags;
- indent();
- m_tocstream << "</topic>\n";
+ --p->openTags;
+ p->indent();
+ p->tocstream << "</topic>\n";
}
}
@@ -168,7 +171,7 @@ void EclipseHelp::addContentsItem(
const Definition * /*def*/)
{
// -- write the topic tag
- closedTag();
+ p->closedTag();
if (!file.isEmpty())
{
switch (file[0]) // check for special markers (user defined URLs)
@@ -178,31 +181,31 @@ void EclipseHelp::addContentsItem(
break;
case '!':
- indent();
- m_tocstream << "<topic label=\"" << convertToXML(name) << "\"";
- m_tocstream << " href=\"" << convertToXML(m_pathprefix) << &file[1] << "\"";
- m_endtag = TRUE;
+ p->indent();
+ p->tocstream << "<topic label=\"" << convertToXML(name) << "\"";
+ p->tocstream << " href=\"" << convertToXML(p->pathprefix) << &file[1] << "\"";
+ p->endtag = TRUE;
break;
default:
- indent();
- m_tocstream << "<topic label=\"" << convertToXML(name) << "\"";
- m_tocstream << " href=\"" << convertToXML(m_pathprefix)
+ p->indent();
+ p->tocstream << "<topic label=\"" << convertToXML(name) << "\"";
+ p->tocstream << " href=\"" << convertToXML(p->pathprefix)
<< addHtmlExtensionIfMissing(file);
if (!anchor.isEmpty())
{
- m_tocstream << "#" << anchor;
+ p->tocstream << "#" << anchor;
}
- m_tocstream << "\"";
- m_endtag = TRUE;
+ p->tocstream << "\"";
+ p->endtag = TRUE;
break;
}
}
else
{
- indent();
- m_tocstream << "<topic label=\"" << convertToXML(name) << "\"";
- m_endtag = TRUE;
+ p->indent();
+ p->tocstream << "<topic label=\"" << convertToXML(name) << "\"";
+ p->endtag = TRUE;
}
}
diff --git a/src/eclipsehelp.h b/src/eclipsehelp.h
index 1ba4df4..68d023b 100644
--- a/src/eclipsehelp.h
+++ b/src/eclipsehelp.h
@@ -24,12 +24,13 @@
#ifndef ECLIPSEHELP_H
#define ECLIPSEHELP_H
-#include <fstream>
+#include <memory>
-#include "index.h"
+#include "qcstring.h"
/* -- forward declarations */
class Definition;
+class MemberDef;
/** Generator for Eclipse help files.
*
@@ -37,11 +38,12 @@ class Definition;
* These files can be used to generate a help plugin readable
* by the Eclipse IDE.
*/
-class EclipseHelp : public IndexIntf
+class EclipseHelp
{
public:
EclipseHelp();
virtual ~EclipseHelp();
+ EclipseHelp(EclipseHelp &&);
/* -- index interface */
virtual void initialize();
@@ -58,21 +60,8 @@ class EclipseHelp : public IndexIntf
virtual void addStyleSheetFile(const QCString &name);
private:
- int m_depth;
- bool m_endtag;
- int m_openTags;
-
- std::ofstream m_tocstream;
- QCString m_pathprefix;
-
- /* -- avoid copying */
- EclipseHelp(const EclipseHelp &);
- EclipseHelp & operator = (const EclipseHelp &);
-
- /* -- formatting helpers */
- void indent();
- void closedTag();
- void openedTag();
+ struct Private;
+ std::unique_ptr<Private> p;
};
#endif /* ECLIPSEHELP_H */
diff --git a/src/filedef.cpp b/src/filedef.cpp
index cb67f00..608310e 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -15,6 +15,8 @@
*
*/
+#include <unordered_set>
+
#include "memberlist.h"
#include "classlist.h"
#include "filedef.h"
@@ -1510,11 +1512,11 @@ void FileDefImpl::combineUsingRelations()
bool FileDefImpl::isDocumentationFile() const
{
- return name().right(4)==".doc" ||
- name().right(4)==".txt" ||
- name().right(4)==".dox" ||
- name().right(3)==".md" ||
- name().right(9)==".markdown" ||
+ static const std::unordered_set<std::string> docExtensions =
+ { "doc", "txt", "dox", "md", "markdown" };
+
+ int lastDot = name().findRev('.');
+ return (lastDot!=-1 && docExtensions.find(name().mid(lastDot+1).str())!=docExtensions.end()) ||
getLanguageFromFileName(getFileNameExtension(name())) == SrcLangExt_Markdown;
}
@@ -1522,7 +1524,7 @@ void FileDefImpl::acquireFileVersion()
{
QCString vercmd = Config_getString(FILE_VERSION_FILTER);
if (!vercmd.isEmpty() && !m_filePath.isEmpty() &&
- m_filePath!="generated" && m_filePath!="graph_legend")
+ m_filePath!="generated" && m_filePath!="graph_legend.dox")
{
msg("Version of %s : ",qPrint(m_filePath));
QCString cmd = vercmd+" \""+m_filePath+"\"";
diff --git a/src/filedef.h b/src/filedef.h
index 8b90ecd..6d1d8b7 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -20,7 +20,6 @@
#include <set>
-#include "index.h"
#include "definition.h"
#include "memberlist.h"
#include "containers.h"
diff --git a/src/fileinfo.cpp b/src/fileinfo.cpp
index fdc6b6c..72b591e 100644
--- a/src/fileinfo.cpp
+++ b/src/fileinfo.cpp
@@ -77,7 +77,7 @@ bool FileInfo::isDir() const
bool FileInfo::isSymLink() const
{
std::error_code ec;
- fs::file_status status = fs::status(m_name,ec);
+ fs::file_status status = fs::symlink_status(m_name,ec);
return !ec && fs::is_symlink(status);
}
diff --git a/src/filename.h b/src/filename.h
index aae254f..3d8659c 100644
--- a/src/filename.h
+++ b/src/filename.h
@@ -20,8 +20,8 @@
#include <vector>
#include "linkedmap.h"
-#include "config.h"
#include "utf8.h"
+#include "util.h"
class FileDef;
@@ -59,7 +59,7 @@ class FileNameFn
std::string searchKey(std::string input) const
{
std::string key = input;
- if (!Config_getBool(CASE_SENSE_NAMES))
+ if (!getCaseSenseNames())
{
key = convertUTF8ToLower(key);
}
diff --git a/src/formula.cpp b/src/formula.cpp
index 3217ae1..c39d325 100644
--- a/src/formula.cpp
+++ b/src/formula.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -21,6 +21,8 @@
#include "image.h"
#include "fileinfo.h"
#include "dir.h"
+#include "regex.h"
+#include "linkedmap.h"
#include <map>
#include <vector>
@@ -29,8 +31,8 @@
#include <fstream>
// TODO: remove these dependencies
-#include "doxygen.h" // for Doxygen::indexList
-#include "index.h" // for Doxygen::indexList
+#include "doxygen.h" // for Doxygen::indexList
+#include "indexlist.h" // for Doxygen::indexList
static int determineInkscapeVersion(Dir &thisDir);
@@ -40,25 +42,13 @@ static int determineInkscapeVersion(Dir &thisDir);
struct FormulaManager::Private
{
- void storeDisplaySize(int id,int w,int h)
- {
- displaySizeMap.insert(std::make_pair(id,DisplaySize(w,h)));
- }
- DisplaySize getDisplaySize(int id)
- {
- auto it = displaySizeMap.find(id);
- if (it!=displaySizeMap.end())
- {
- return it->second;
- }
- return DisplaySize(-1,-1);
- }
- StringVector formulas;
- std::map<std::string,size_t> formulaMap;
- std::map<int,DisplaySize> displaySizeMap;
+ LinkedMap<Formula> formulas;
+ std::map<int,Formula *> formulaIdMap;
+ bool repositoriesValid = true;
+ StringVector tempFiles;
};
-FormulaManager::FormulaManager() : p(new Private)
+FormulaManager::FormulaManager() : p(std::make_unique<Private>())
{
}
@@ -68,7 +58,7 @@ FormulaManager &FormulaManager::instance()
return fm;
}
-void FormulaManager::readFormulas(const QCString &dir,bool doCompare)
+void FormulaManager::initFromRepository(const QCString &dir)
{
std::ifstream f(dir.str()+"/formula.repository",std::ifstream::in);
if (f.is_open())
@@ -94,62 +84,107 @@ void FormulaManager::readFormulas(const QCString &dir,bool doCompare)
line += "\n" + readLine;
}
- // format: \_form#<digits>=<digits>x<digits>:formula
- size_t hi=line.find('#');
- size_t ei=line.find('=');
- size_t se=line.find(':'); // find name and text separator.
- if (ei==std::string::npos || hi==std::string::npos || se==std::string::npos || hi>se || ei<hi || ei>se)
+ // new format: \_form#<digits>=<digits>x<digits>:formula
+ static const reg::Ex re_new(R"(\\_form#(\d+)=(\d+)x(\d+):)");
+ // old format: \_form#<digits>:formula
+ static const reg::Ex re_old(R"(\\_form#(\d+):)");
+
+ reg::Match match;
+ int id = -1;
+ int width = -1;
+ int height = -1;
+ std::string text;
+ if (reg::search(line,match,re_new)) // try new format first
+ {
+ id = std::stoi(match[1].str());
+ width = std::stoi(match[2].str());
+ height = std::stoi(match[3].str());
+ text = line.substr(match.position()+match.length());
+ //printf("new format found id=%d width=%d height=%d text=%s\n",id,width,height,text.c_str());
+ }
+ else if (reg::search(line,match,re_old)) // check for old format
{
- warn_uncond("%s/formula.repository is corrupted at line %d!\n",qPrint(dir),lineNr);
+ //id = std::stoi(match[1].str());
+ //text = line.substr(match.position()+match.length());
+ //printf("old format found id=%d text=%s\n",id,text.c_str());
+ msg("old formula.repository format detected; forcing upgrade.\n");
+ p->repositoriesValid = false;
break;
}
- else
+ else // unexpected content
{
- std::string formName = line.substr(0,se); // '\_form#<digits>=<digits>x<digits>' part
- std::string formText = line.substr(se+1); // 'formula' part
- int w=-1,h=-1;
- size_t xi=formName.find('x',ei);
- if (xi!=std::string::npos)
- {
- w=std::stoi(formName.substr(ei+1,xi-ei-1)); // digits from '=<digits>x' part as int
- h=std::stoi(formName.substr(xi+1)); // digits from 'x<digits>' part as int
- }
- formName = formName.substr(0,ei); // keep only the '\_form#<digits>' part
- if (doCompare)
- {
- int formId = std::stoi(formName.substr(hi+1));
- std::string storedFormText = FormulaManager::instance().findFormula(formId);
- if (storedFormText!=formText)
- {
- term("discrepancy between formula repositories! Remove "
- "formula.repository and from_* files from output directories.\n");
- }
- formulaCount++;
- }
- int id = addFormula(formText);
- if (w!=-1 && h!=-1)
+ warn_uncond("%s/formula.repository contains invalid content at line %d: found: '%s'\n",qPrint(dir),lineNr,line.c_str());
+ p->repositoriesValid = false;
+ break;
+ }
+
+ auto it = p->formulaIdMap.find(id);
+ Formula *formula=0;
+ if (it!=p->formulaIdMap.end()) // formula already found in a repository for another output format
+ {
+ formula = it->second;
+ if (formula->text().str()!=text) // inconsistency between repositories detected
{
- p->storeDisplaySize(id,w,h);
+ msg("differences detected between formula.repository files; forcing upgrade.\n");
+ p->repositoriesValid = false;
+ break;
}
+ formulaCount++;
+ }
+ else // create new formula from cache
+ {
+ //printf("formula not found adding it under id=%d\n",id);
+ formula = p->formulas.add(text.c_str(),id,width,height);
+ p->formulaIdMap.insert(std::make_pair(id,formula));
+ }
+
+ if (formula) // if an entry in the repository exists also check if there is a generated image
+ {
+ QCString formImgName;
+ formImgName.sprintf("form_%d",formula->id());
+ FileInfo fiPng((dir+"/"+formImgName+".png").str());
+ FileInfo fiSvg((dir+"/"+formImgName+".svg").str());
+ // mark formula as cached, so we do not need to regenerate the images
+ bool isCached = fiPng.exists() || fiSvg.exists();
+ formula->setCached(isCached);
+ //printf("formula %d: cached=%d\n",formula->id(),isCached);
+
+ FileInfo fiPngDark((dir+"/"+formImgName+"_dark.png").str());
+ FileInfo fiSvgDark((dir+"/"+formImgName+"_dark.svg").str());
+ bool isCachedDark = fiPngDark.exists() || fiSvgDark.exists();
+ formula->setCachedDark(isCachedDark);
+ //printf("formula %d: cachedDark=%d\n",formula->id(),isCachedDark);
}
}
- if (doCompare && formulaCount!=p->formulas.size())
+
+ // For the first repository all formulas should be new (e.g. formulaCount==0).
+ // For the other repositories the same number of formulas should be found
+ // (and number of formulas should be the same for all repositories, content is already check above)
+ if (formulaCount>0 && formulaCount!=p->formulas.size()) // inconsistency between repositories
{
- term("size discrepancy between formula repositories! Remove "
- "formula.repository and from_* files from output directories.\n");
+ msg("differences detected between formula.repository files; forcing upgrade.\n");
+ p->repositoriesValid = false;
}
}
+ else // no repository found for an output format
+ {
+ p->repositoriesValid = false;
+ }
}
-void FormulaManager::generateImages(const QCString &path,Format format,HighDPI hd) const
+void FormulaManager::checkRepositories()
{
- Dir d(path.str());
- // store the original directory
- if (!d.exists())
+ //printf("checkRepositories valid=%d\n",p->repositoriesValid);
+ if (!p->repositoriesValid)
{
- term("Output directory '%s' does not exist!\n",qPrint(path));
+ clear(); // clear cached formulas, so the corresponding images and repository files
+ // are regenerated
+ p->repositoriesValid = true;
}
- std::string oldDir = Dir::currentDirPath();
+}
+
+void FormulaManager::createLatexFile(const QCString &fileName,Format format,Mode mode,IntVector &formulasToGenerate)
+{
QCString macroFile = Config_getString(FORMULA_MACROFILE);
QCString stripMacroFile;
if (!macroFile.isEmpty())
@@ -159,12 +194,8 @@ void FormulaManager::generateImages(const QCString &path,Format format,HighDPI h
stripMacroFile = fi.fileName();
}
- // go to the html output directory (i.e. path)
- Dir::setCurrent(d.absPath());
- Dir thisDir;
// generate a latex file containing one formula per page.
- QCString texName="_formulas.tex";
- IntVector formulasToGenerate;
+ QCString texName=fileName+".tex";
std::ofstream f(texName.str(),std::ofstream::out | std::ofstream::binary);
if (f.is_open())
{
@@ -173,6 +204,14 @@ void FormulaManager::generateImages(const QCString &path,Format format,HighDPI h
t << "\\usepackage{ifthen}\n";
t << "\\usepackage{epsfig}\n"; // for those who want to include images
t << "\\usepackage[utf8]{inputenc}\n"; // looks like some older distributions with newunicode package 1.1 need this option.
+ t << "\\usepackage{xcolor}\n";
+
+ if (mode==Mode::Dark) // invert page and text colors
+ {
+ t << "\\color{white}\n";
+ t << "\\pagecolor{black}\n";
+ }
+
writeExtraLatexPackages(t);
writeLatexSpecialFormulaChars(t);
if (!macroFile.isEmpty())
@@ -182,170 +221,330 @@ void FormulaManager::generateImages(const QCString &path,Format format,HighDPI h
}
t << "\\pagestyle{empty}\n";
t << "\\begin{document}\n";
- for (size_t i=0; i<p->formulas.size(); i++)
+ for (const auto &formula : p->formulas)
{
- QCString resultName;
- resultName.sprintf("form_%d.%s",static_cast<int>(i),format==Format::Vector?"svg":"png");
- // only formulas for which no image exists are generated
- FileInfo fi(resultName.str());
- if (!fi.exists())
+ int id = formula->id();
+ // only formulas for which no image is cached are generated
+ //printf("check formula %d: cached=%d cachedDark=%d\n",formula->id(),formula->isCached(),formula->isCachedDark());
+ if ((mode==Mode::Light && !formula->isCached()) ||
+ (mode==Mode::Dark && !formula->isCachedDark())
+ )
{
// we force a pagebreak after each formula
- t << p->formulas[i].c_str() << "\n\\pagebreak\n\n";
- formulasToGenerate.push_back(static_cast<int>(i));
+ t << formula->text() << "\n\\pagebreak\n\n";
+ formulasToGenerate.push_back(id);
}
+ QCString resultName;
+ resultName.sprintf("form_%d%s.%s",id, mode==Mode::Light?"":"_dark", format==Format::Vector?"svg":"png");
Doxygen::indexList->addImageFile(resultName);
}
t << "\\end{document}\n";
t.flush();
f.close();
}
- if (!formulasToGenerate.empty()) // there are new formulas
+}
+
+static bool createDVIFile(const QCString &fileName)
+{
+ QCString latexCmd = "latex";
+ char args[4096];
+ Portable::sysTimerStart();
+ int rerunCount=1;
+ while (rerunCount<8)
{
- QCString latexCmd = "latex";
- char args[4096];
- Portable::sysTimerStart();
- int rerunCount=1;
- while (rerunCount<8)
+ //printf("Running latex...\n");
+ sprintf(args,"-interaction=batchmode %s >%s",qPrint(fileName),Portable::devNull());
+ if ((Portable::system(latexCmd,args)!=0) || (Portable::system(latexCmd,args)!=0))
+ {
+ err("Problems running latex. Check your installation or look "
+ "for typos in %s.tex and check %s.log!\n",qPrint(fileName),qPrint(fileName));
+ Portable::sysTimerStop();
+ return false;
+ }
+ // check the log file if we need to run latex again to resolve references
+ QCString logFile = fileToString(fileName+".log");
+ if (logFile.isEmpty() ||
+ (logFile.find("Rerun to get cross-references right")==-1 && logFile.find("Rerun LaTeX")==-1))
+ {
+ break;
+ }
+ rerunCount++;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool createPostscriptFile(const QCString &fileName,const QCString &formBase,int pageIndex)
+{
+ char args[4096];
+ // run dvips to convert the page with number pageIndex to an
+ // postscript file.
+ sprintf(args,"-q -D 600 -n 1 -p %d -o %s_tmp.ps %s.dvi",pageIndex,qPrint(formBase),qPrint(fileName));
+ Portable::sysTimerStart();
+ if (Portable::system("dvips",args)!=0)
+ {
+ err("Problems running dvips. Check your installation!\n");
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool createEPSbboxFile(const QCString &formBase)
+{
+ char args[4096];
+ // extract the bounding box for the postscript file
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=bbox %s_tmp.ps 2>%s_tmp.epsi",
+ qPrint(formBase),qPrint(formBase));
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool extractBoundingBox(const QCString &formBase,
+ int *x1,int *y1,int *x2,int *y2,
+ double *x1hi,double *y1hi,double *x2hi,double *y2hi)
+{
+ FileInfo fi((formBase+"_tmp.epsi").str());
+ if (fi.exists())
+ {
+ QCString eps = fileToString(formBase+"_tmp.epsi");
+ int i = eps.find("%%BoundingBox:");
+ if (i!=-1)
+ {
+ sscanf(eps.data()+i,"%%%%BoundingBox:%d %d %d %d",x1,y1,x2,y2);
+ }
+ else
+ {
+ err("Couldn't extract bounding box from %s_tmp.epsi",qPrint(formBase));
+ return false;
+ }
+ i = eps.find("%%HiResBoundingBox:");
+ if (i!=-1)
{
- //printf("Running latex...\n");
- sprintf(args,"-interaction=batchmode _formulas.tex >%s",Portable::devNull());
- if ((Portable::system(latexCmd,args)!=0) || (Portable::system(latexCmd,args)!=0))
+ sscanf(eps.data()+i,"%%%%HiResBoundingBox:%lf %lf %lf %lf",x1hi,y1hi,x2hi,y2hi);
+ }
+ else
+ {
+ err("Couldn't extract high resolution bounding box from %s_tmp.epsi",qPrint(formBase));
+ return false;
+ }
+ }
+ //printf("Bounding box [%d %d %d %d]\n",x1,y1,x2,y2);
+ return true;
+}
+
+double FormulaManager::updateFormulaSize(int pageNum,int x1,int y1,int x2,int y2)
+{
+ double scaleFactor = 1.25;
+ int zoomFactor = Config_getInt(FORMULA_FONTSIZE);
+ if (zoomFactor<8 || zoomFactor>50) zoomFactor=10;
+ scaleFactor *= zoomFactor/10.0;
+
+ auto it = p->formulaIdMap.find(pageNum);
+ if (it!=p->formulaIdMap.end())
+ {
+ Formula *formula = it->second;
+ formula->setWidth(static_cast<int>((x2-x1)*scaleFactor+0.5));
+ formula->setHeight(static_cast<int>((y2-y1)*scaleFactor+0.5));
+ }
+ return scaleFactor;
+}
+
+static bool createCroppedPDF(const QCString &formBase,int x1,int y1,int x2,int y2)
+{
+ char args[4096];
+ // crop the image to its bounding box
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=pdfwrite"
+ " -o %s_tmp.pdf -c \"[/CropBox [%d %d %d %d] /PAGES pdfmark\" -f %s_tmp.ps",
+ qPrint(formBase),x1,y1,x2,y2,qPrint(formBase));
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool createCroppedEPS(const QCString &formBase)
+{
+ char args[4096];
+ // crop the image to its bounding box
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=eps2write"
+ " -o %s_tmp.eps -f %s_tmp.ps",qPrint(formBase),qPrint(formBase));
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ return false;
+ }
+ return true;
+}
+
+static bool createSVGFromPDF(const QCString &formBase,const QCString &outFile)
+{
+ char args[4096];
+ sprintf(args,"%s_tmp.pdf %s",qPrint(formBase),qPrint(outFile));
+ Portable::sysTimerStart();
+ if (Portable::system("pdf2svg",args)!=0)
+ {
+ err("Problems running pdf2svg. Check your installation!\n");
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool createSVGFromPDFviaInkscape(Dir &thisDir,const QCString &formBase,const QCString &outFile)
+{
+ char args[4096];
+ int inkscapeVersion = determineInkscapeVersion(thisDir);
+ if (inkscapeVersion == -1)
+ {
+ err("Problems determining the version of inkscape. Check your installation!\n");
+ return false;
+ }
+ else if (inkscapeVersion == 0)
+ {
+ sprintf(args,"-l %s -z %s_tmp.pdf 2>%s",qPrint(outFile),qPrint(formBase),Portable::devNull());
+ }
+ else // inkscapeVersion >= 1
+ {
+ sprintf(args,"--export-type=svg --export-filename=%s %s_tmp.pdf 2>%s",qPrint(outFile),qPrint(formBase),Portable::devNull());
+ }
+ Portable::sysTimerStart();
+ if (Portable::system("inkscape",args)!=0)
+ {
+ err("Problems running inkscape. Check your installation!\n");
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+
+static bool updateEPSBoundingBox(const QCString &formBase,
+ int x1,int y1,int x2,int y2,
+ double x1hi,double y1hi,double x2hi,double y2hi)
+{
+ // read back %s_tmp.eps and replace
+ // bounding box values with x1,y1,x2,y2 and remove the HiResBoundingBox
+ std::ifstream epsIn(formBase.str()+"_tmp.eps",std::ifstream::in);
+ std::ofstream epsOut(formBase.str()+"_tmp_corr.eps",std::ofstream::out | std::ofstream::binary);
+ if (epsIn.is_open() && epsOut.is_open())
+ {
+ std::string line;
+ while (getline(epsIn,line))
+ {
+ if (line.rfind("%%BoundingBox",0)==0)
{
- err("Problems running latex. Check your installation or look "
- "for typos in _formulas.tex and check _formulas.log!\n");
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
+ epsOut << "%%BoundingBox: " << x1 << " " << y1 << " " << x2 << " " << y2 << "\n";
}
- // check the log file if we need to run latex again to resolve references
- QCString logFile = fileToString("_formulas.log");
- if (logFile.isEmpty() ||
- (logFile.find("Rerun to get cross-references right")==-1 && logFile.find("Rerun LaTeX")==-1))
+ else if (line.rfind("%%HiResBoundingBox",0)==0)
{
- break;
+ epsOut << "%%HiResBoundingBox: " << x1hi << " " << y1hi << " " << x2hi << " " << y2hi << "\n";
+ }
+ else
+ {
+ epsOut << line << "\n";
}
- rerunCount++;
}
+ epsIn.close();
+ epsOut.close();
+ }
+ else
+ {
+ err("Problems correcting the eps files from %s_tmp.eps to %s_tmp_corr.eps\n",
+ qPrint(formBase),qPrint(formBase));
+ return false;
+ }
+ return true;
+}
+
+static bool createPNG(const QCString &formBase,const QCString &outFile,double scaleFactor)
+{
+ char args[4096];
+ Portable::sysTimerStop();
+ sprintf(args,"-q -dNOSAFER -dBATCH -dNOPAUSE -dEPSCrop -sDEVICE=pnggray -dGraphicsAlphaBits=4 -dTextAlphaBits=4 "
+ "-r%d -sOutputFile=%s %s_tmp_corr.eps",static_cast<int>(scaleFactor*72),qPrint(outFile),qPrint(formBase));
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+void FormulaManager::createFormulasTexFile(Dir &thisDir,Format format,HighDPI hd,Mode mode)
+{
+ IntVector formulasToGenerate;
+ QCString formulaFileName = mode==Mode::Light ? "_formulas" : "_formulas_dark";
+ createLatexFile(formulaFileName,format,mode,formulasToGenerate);
+
+ if (!formulasToGenerate.empty()) // there are new formulas
+ {
+ if (!createDVIFile(formulaFileName)) return;
+
//printf("Running dvips...\n");
int pageIndex=1;
for (int pageNum : formulasToGenerate)
{
- msg("Generating image form_%d.%s for formula\n",pageNum,(format==Format::Vector) ? "svg" : "png");
+ QCString outputFile;
+ outputFile.sprintf("form_%d%s.%s",pageNum, mode==Mode::Light?"":"_dark", format==Format::Vector?"svg":"png");
+ msg("Generating image %s for formula\n",qPrint(outputFile));
+
QCString formBase;
- formBase.sprintf("_form%d",pageNum);
- // run dvips to convert the page with number pageIndex to an
- // postscript file.
- sprintf(args,"-q -D 600 -n 1 -p %d -o %s_tmp.ps _formulas.dvi",
- pageIndex,qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system("dvips",args)!=0)
- {
- err("Problems running dvips. Check your installation!\n");
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ formBase.sprintf("_form%d%s",pageNum,mode==Mode::Light?"":"_dark");
- // extract the bounding box for the postscript file
- sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=bbox %s_tmp.ps 2>%s_tmp.epsi",
- qPrint(formBase),qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
- {
- err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ if (!createPostscriptFile(formulaFileName,formBase,pageIndex)) break;
- // extract the bounding box info from the generate .epsi file
int x1=0,y1=0,x2=0,y2=0;
- FileInfo fi((formBase+"_tmp.epsi").str());
- if (fi.exists())
+ double x1hi=0.0,y1hi=0.0,x2hi=0.0,y2hi=0.0;
+ if (mode==Mode::Light)
{
- QCString eps = fileToString(formBase+"_tmp.epsi");
- int i = eps.find("%%BoundingBox:");
- if (i!=-1)
- {
- sscanf(eps.data()+i,"%%%%BoundingBox:%d %d %d %d",&x1,&y1,&x2,&y2);
- }
- else
- {
- err("Couldn't extract bounding box from %s_tmp.epsi",qPrint(formBase));
- }
+ if (!createEPSbboxFile(formBase)) break;
+ // extract the bounding box info from the generated .epsi file
+ if (!extractBoundingBox(formBase,&x1,&y1,&x2,&y2,&x1hi,&y1hi,&x2hi,&y2hi)) break;
+ }
+ else // for dark images the bounding box is wrong (includes the black) so
+ // use the bounding box of the light image instead.
+ {
+ QCString formBaseLight;
+ formBaseLight.sprintf("_form%d",pageNum);
+ if (!extractBoundingBox(formBaseLight,&x1,&y1,&x2,&y2,&x1hi,&y1hi,&x2hi,&y2hi)) break;
}
- //printf("Bounding box [%d %d %d %d]\n",x1,y1,x2,y2);
// convert the corrected EPS to a bitmap
- double scaleFactor = 1.25;
- int zoomFactor = Config_getInt(FORMULA_FONTSIZE);
- if (zoomFactor<8 || zoomFactor>50) zoomFactor=10;
- scaleFactor *= zoomFactor/10.0;
-
- int width = static_cast<int>((x2-x1)*scaleFactor+0.5);
- int height = static_cast<int>((y2-y1)*scaleFactor+0.5);
- p->storeDisplaySize(pageNum,width,height);
+ double scaleFactor = updateFormulaSize(pageNum,x1,y1,x2,y2);
if (format==Format::Vector)
{
- // crop the image to its bounding box
- sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=pdfwrite"
- " -o %s_tmp.pdf -c \"[/CropBox [%d %d %d %d] /PAGES pdfmark\" -f %s_tmp.ps",
- qPrint(formBase),x1,y1,x2,y2,qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
- {
- err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ if (!createCroppedPDF(formBase,x1,y1,x2,y2)) break;
// if we have pdf2svg available use it to create a SVG image
if (Portable::checkForExecutable("pdf2svg"))
{
- sprintf(args,"%s_tmp.pdf form_%d.svg",qPrint(formBase),pageNum);
- Portable::sysTimerStart();
- if (Portable::system("pdf2svg",args)!=0)
- {
- err("Problems running pdf2svg. Check your installation!\n");
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ createSVGFromPDF(formBase,outputFile);
}
else if (Portable::checkForExecutable("inkscape")) // alternative is to use inkscape
{
- int inkscapeVersion = determineInkscapeVersion(thisDir);
- if (inkscapeVersion == -1)
- {
- err("Problems determining the version of inkscape. Check your installation!\n");
- Dir::setCurrent(oldDir);
- return;
- }
- else if (inkscapeVersion == 0)
- {
- sprintf(args,"-l form_%d.svg -z %s_tmp.pdf 2>%s",pageNum,qPrint(formBase),Portable::devNull());
- }
- else // inkscapeVersion >= 1
- {
- sprintf(args,"--export-type=svg --export-filename=form_%d.svg %s_tmp.pdf 2>%s",pageNum,qPrint(formBase),Portable::devNull());
- }
- Portable::sysTimerStart();
- if (Portable::system("inkscape",args)!=0)
- {
- err("Problems running inkscape. Check your installation!\n");
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ createSVGFromPDFviaInkscape(thisDir,formBase,outputFile);
}
else
{
@@ -353,56 +552,13 @@ void FormulaManager::generateImages(const QCString &path,Format format,HighDPI h
return;
}
- if (RM_TMP_FILES)
- {
- thisDir.remove(formBase.str()+"_tmp.pdf");
- }
+ p->tempFiles.push_back(formBase.str()+"_tmp.pdf");
}
else // format==Format::Bitmap
{
- // crop the image to its bounding box
- sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=eps2write"
- " -o %s_tmp.eps -f %s_tmp.ps",qPrint(formBase),qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
- {
- err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
+ if (!createCroppedEPS(formBase)) break;
- // read back %s_tmp.eps and replace
- // bounding box values with x1,y1,x2,y2 and remove the HiResBoundingBox
- std::ifstream epsIn(formBase.str()+"_tmp.eps",std::ifstream::in);
- std::ofstream epsOut(formBase.str()+"_tmp_corr.eps",std::ofstream::out | std::ofstream::binary);
- if (epsIn.is_open() && epsOut.is_open())
- {
- std::string line;
- while (getline(epsIn,line))
- {
- if (line.rfind("%%BoundingBox",0)==0)
- {
- epsOut << "%%BoundingBox: " << x1 << " " << y1 << " " << x2 << " " << y2 << "\n";
- }
- else if (line.rfind("%%HiResBoundingBox",0)==0) // skip this one
- {
- }
- else
- {
- epsOut << line << "\n";
- }
- }
- epsIn.close();
- epsOut.close();
- }
- else
- {
- err("Problems correcting the eps files from %s_tmp.eps to %s_tmp_corr.eps\n",
- qPrint(formBase),qPrint(formBase));
- Dir::setCurrent(oldDir);
- return;
- }
+ if (!updateEPSBoundingBox(formBase,x1,y1,x2,y2,x1hi,y1hi,x2hi,y2hi)) break;
if (hd==HighDPI::On) // for high DPI display it looks much better if the
// image resolution is higher than the display resolution
@@ -410,64 +566,80 @@ void FormulaManager::generateImages(const QCString &path,Format format,HighDPI h
scaleFactor*=2;
}
- Portable::sysTimerStop();
- sprintf(args,"-q -dNOSAFER -dBATCH -dNOPAUSE -dEPSCrop -sDEVICE=pnggray -dGraphicsAlphaBits=4 -dTextAlphaBits=4 "
- "-r%d -sOutputFile=form_%d.png %s_tmp_corr.eps",static_cast<int>(scaleFactor*72),pageNum,qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
- {
- err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ if (!createPNG(formBase,outputFile,scaleFactor)) break;
- if (RM_TMP_FILES)
- {
- thisDir.remove(formBase.str()+"_tmp.eps");
- thisDir.remove(formBase.str()+"_tmp_corr.eps");
- }
+ p->tempFiles.push_back(formBase.str()+"_tmp.eps");
+ p->tempFiles.push_back(formBase.str()+"_tmp_corr.eps");
}
// remove intermediate image files
- if (RM_TMP_FILES)
+ p->tempFiles.push_back(formBase.str()+"_tmp.ps");
+ if (mode==Mode::Light)
{
- thisDir.remove(formBase.str()+"_tmp.ps");
- thisDir.remove(formBase.str()+"_tmp.epsi");
+ p->tempFiles.push_back(formBase.str()+"_tmp.epsi");
}
pageIndex++;
}
// remove intermediate files produced by latex
- if (RM_TMP_FILES)
- {
- thisDir.remove("_formulas.dvi");
- thisDir.remove("_formulas.log"); // keep file in case of errors
- thisDir.remove("_formulas.aux");
- }
+ p->tempFiles.push_back(formulaFileName.str()+".dvi");
+ p->tempFiles.push_back(formulaFileName.str()+".log");
+ p->tempFiles.push_back(formulaFileName.str()+".aux");
}
// remove the latex file itself
- if (RM_TMP_FILES) thisDir.remove("_formulas.tex");
+ p->tempFiles.push_back(formulaFileName.str()+".tex");
// write/update the formula repository so we know what text the
// generated images represent (we use this next time to avoid regeneration
// of the images, and to avoid forcing the user to delete all images in order
// to let a browser refresh the images).
+ std::ofstream f;
f.open("formula.repository",std::ofstream::out | std::ofstream::binary);
if (f.is_open())
{
TextStream t(&f);
- for (size_t i=0; i<p->formulas.size(); i++)
+ for (const auto &formula : p->formulas)
{
- DisplaySize size = p->getDisplaySize(static_cast<int>(i));
- t << "\\_form#" << i;
- if (size.width!=-1 && size.height!=-1)
+ t << "\\_form#" << formula->id();
+ if (formula->width()!=-1 && formula->height()!=-1)
{
- t << "=" << size.width << "x" << size.height;
+ t << "=" << formula->width() << "x" << formula->height();
}
- t << ":" << p->formulas[i].c_str() << "\n";
+ t << ":" << formula->text() << "\n";
}
}
+}
+
+void FormulaManager::generateImages(const QCString &path,Format format,HighDPI hd)
+{
+ Dir d(path.str());
+ // store the original directory
+ if (!d.exists())
+ {
+ term("Output directory '%s' does not exist!\n",qPrint(path));
+ }
+ std::string oldDir = Dir::currentDirPath();
+
+ // go to the html output directory (i.e. path)
+ Dir::setCurrent(d.absPath());
+ Dir thisDir;
+
+ createFormulasTexFile(thisDir,format,hd,Mode::Light);
+ if (Config_getEnum(HTML_COLORSTYLE)!=HTML_COLORSTYLE_t::LIGHT) // all modes other than light need a dark version
+ {
+ // note that the dark version reuses the bounding box of the light version so it needs to be
+ // created after the light version.
+ createFormulasTexFile(thisDir,format,hd,Mode::Dark);
+ }
+
+ // clean up temporary files
+ if (RM_TMP_FILES)
+ {
+ for (const auto &file : p->tempFiles)
+ {
+ thisDir.remove(file);
+ }
+ }
+
// reset the directory to the original location.
Dir::setCurrent(oldDir);
}
@@ -475,40 +647,41 @@ void FormulaManager::generateImages(const QCString &path,Format format,HighDPI h
void FormulaManager::clear()
{
p->formulas.clear();
- p->formulaMap.clear();
+ p->formulaIdMap.clear();
}
-int FormulaManager::addFormula(const std::string &formulaText)
+int FormulaManager::addFormula(const std::string &formulaText,int width,int height)
{
- auto it = p->formulaMap.find(formulaText);
- if (it!=p->formulaMap.end()) // already stored
+ Formula *formula = p->formulas.find(formulaText);
+ if (formula) // same formula already stored
{
- return static_cast<int>(it->second);
+ return formula->id();
}
- // store new formula
- size_t id = p->formulas.size();
- p->formulaMap.insert(std::make_pair(formulaText,id));
- p->formulas.push_back(formulaText);
- return static_cast<int>(id);
+ // add new formula
+ int id = static_cast<int>(p->formulas.size());
+ formula = p->formulas.add(formulaText.c_str(),id,width,height);
+ p->formulaIdMap.insert(std::make_pair(id,formula));
+ return id;
}
-std::string FormulaManager::findFormula(int formulaId) const
+const Formula *FormulaManager::findFormula(int formulaId) const
{
- if (formulaId>=0 && formulaId<static_cast<int>(p->formulas.size()))
- {
- return p->formulas[formulaId];
- }
- return std::string();
+ auto it = p->formulaIdMap.find(formulaId);
+ return it != p->formulaIdMap.end() ? it->second : nullptr;
}
-bool FormulaManager::hasFormulas() const
+#if 0
+Formula *FormulaManager::findFormula(int formulaId)
{
- return !p->formulas.empty();
+ auto it = p->formulaIdMap.find(formulaId);
+ return it != p->formulaIdMap.end() ? it->second : nullptr;
}
+#endif
-FormulaManager::DisplaySize FormulaManager::displaySize(int formulaId) const
+
+bool FormulaManager::hasFormulas() const
{
- return p->getDisplaySize(formulaId);
+ return !p->formulas.empty();
}
// helper function to detect and return the major version of inkscape.
diff --git a/src/formula.h b/src/formula.h
index 9baeb24..b5af7d0 100644
--- a/src/formula.h
+++ b/src/formula.h
@@ -1,8 +1,6 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -22,28 +20,72 @@
#include <string>
#include "qcstring.h"
+#include "containers.h"
+
+class Dir;
+
+/** Class representing a LaTeX formula as found in the documentation */
+class Formula
+{
+ public:
+ Formula(const QCString &text,int id,int width=-1,int height=-1)
+ : m_text(text), m_id(id), m_width(width), m_height(height) {}
+
+ int width() const { return m_width; }
+ int height() const { return m_height; }
+ int id() const { return m_id; }
+ QCString text() const { return m_text; }
+ bool isCached() const { return m_cached && !m_forceRegen; }
+ bool isCachedDark() const { return m_cached && !m_forceRegen; }
+
+ private:
+ friend class FormulaManager;
+ void setWidth(int width) { m_width = width; }
+ void setHeight(int height) { m_height = height; }
+ void setCached(bool cached) { m_cached = cached; m_forceRegen = m_forceRegen || !cached; }
+ void setCachedDark(bool cached) { m_cachedDark = cached; m_forceRegen = m_forceRegen || !cached; }
+
+ QCString m_text;
+ int m_id;
+ int m_width;
+ int m_height;
+ bool m_cached = false;
+ bool m_cachedDark = false; // dark version cached?
+ bool m_forceRegen = false; // true if there is an inconsistency in setCache calls
+};
/*! Manager class to handle formulas */
class FormulaManager
{
public:
- struct DisplaySize
- {
- DisplaySize(int w,int h) : width(w), height(h) {}
- int width;
- int height;
- };
+ static FormulaManager &instance();
+
+ //! @name repository functions
+ //! @{
+ void initFromRepository(const QCString &dir);
+ void checkRepositories();
+ //! @}
+
+ //! @name formula functions
+ //! @{
+ void clear();
+ int addFormula(const std::string &formulaText,int width=-1,int height=-1);
+ const Formula *findFormula(int formulaId) const;
+ bool hasFormulas() const;
+ //! @}
+
+ //! @name generator functions
+ //! @{
enum class Format { Bitmap, Vector };
enum class HighDPI { On, Off };
- static FormulaManager &instance();
- void readFormulas(const QCString &dir,bool doCompare=false);
- void clear();
- int addFormula(const std::string &formulaText);
- void generateImages(const QCString &outputDir,Format format,HighDPI hd = HighDPI::Off) const;
- std::string findFormula(int formulaId) const;
- bool hasFormulas() const;
- DisplaySize displaySize(int formulaId) const;
+ void generateImages(const QCString &outputDir,Format format,HighDPI hd = HighDPI::Off);
+ //! @}
+
private:
+ enum class Mode { Dark, Light };
+ void createFormulasTexFile(Dir &d,Format format,HighDPI hd,Mode mode);
+ void createLatexFile(const QCString &fileName,Format format,Mode mode,IntVector &formulasToGenerate);
+ double updateFormulaSize(int pageNum,int x1,int y1,int x2,int y2);
FormulaManager();
struct Private;
std::unique_ptr<Private> p;
diff --git a/src/fortrancode.l b/src/fortrancode.l
index 12ad042..58aa5d2 100644
--- a/src/fortrancode.l
+++ b/src/fortrancode.l
@@ -63,8 +63,6 @@ typedef yyguts_t *yyscan_t;
#include "fortranscanner.h"
#include "containers.h"
-const int fixedCommentAfter = 72;
-
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
#define DBG_CTX(x) do { } while(0)
@@ -171,6 +169,8 @@ struct fortrancodeYY_state
bool endComment = false;
TooltipManager tooltipManager;
+
+ int fixedCommentAfter = 72;
};
#if USE_STATE2STRING
@@ -211,6 +211,7 @@ static void addLocalVar(yyscan_t yyscanner,const QCString &varName);
static MemberDef *getFortranDefs(yyscan_t yyscanner,const QCString &memberName, const QCString &moduleName,
const UseMap &useMap);
static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+static inline void pop_state(yyscan_t yyscanner);
//-------------------------------------------------------------------
@@ -376,7 +377,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
}
<Use,UseOnly,Import>"\n" {
unput(*yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_RESET
}
<*>"import"{BS}/"\n" |
@@ -437,7 +438,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
yyextra->currentModule = yyextra->currentModule.lower();
}
generateLink(yyscanner,*yyextra->code,yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<ClassName>({ACCESS_SPEC}|ABSTRACT|EXTENDS)/[,:( ] { //| variable declaration
startFontClass(yyscanner,"keyword");
@@ -445,7 +446,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
endFontClass(yyscanner);
}
<ClassName>\n { // interface may be without name
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_REJECT;
}
<Start>^{BS}"end"({BS_}"enum").* {
@@ -486,7 +487,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
}
<Subprog,Subprogend>"\n" { codifyLines(yyscanner,yytext);
yyextra->contLineNr++;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_RESET
}
<Start>"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface")?{BS} { // Fortran subroutine or function ends
@@ -500,7 +501,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
}
<Subprogend>{ID}/{BS}(\n|!|;) {
generateLink(yyscanner,*yyextra->code,yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Start>"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface"){BS}/(\n|!|;) { // Fortran subroutine or function ends
//cout << "===> end function " << yytext << endl;
@@ -572,7 +573,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
}
<DeclarationBinding>{ID} { // Type bound procedure link
generateLink(yyscanner,*yyextra->code, yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Declaration>[(] { // start of array or type / class specification
yyextra->bracketCount++;
@@ -597,7 +598,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
yyextra->contLineNr++;
codifyLines(yyscanner,yytext);
yyextra->bracketCount = 0;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_RESET
}
<Declaration,DeclarationBinding>"\n" { // end declaration line (?)
@@ -614,7 +615,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
if (!(yyextra->hasContLine && yyextra->hasContLine[yyextra->contLineNr - 1]))
{
yyextra->isExternal = false;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
YY_FTN_RESET
}
@@ -632,7 +633,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
yyextra->insideBody=TRUE;
generateLink(yyscanner,*yyextra->code, yytext);
yyextra->insideBody=FALSE;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Start>{ID}{BS}/"(" { // function call
if (yyextra->isFixedForm && yy_my_start == 6)
@@ -708,7 +709,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
}
unput(*yytext);
yyextra->contLineNr--;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_RESET
}
@@ -775,7 +776,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
startFontClass(yyscanner,"stringliteral");
codifyLines(yyscanner,yyextra->str);
endFontClass(yyscanner);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<String>. {yyextra->str+=yytext;}
@@ -806,7 +807,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
<*>^{BS}"type"{BS}"=" { yyextra->code->codify(QCString(yytext)); }
<*>[\x80-\xFF]* { // keep utf8 characters together...
- if (yyextra->isFixedForm && yy_my_start > fixedCommentAfter)
+ if (yyextra->isFixedForm && yy_my_start > yyextra->fixedCommentAfter)
{
startFontClass(yyscanner,"comment");
codifyLines(yyscanner,yytext);
@@ -817,7 +818,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
}
}
<*>. {
- if (yyextra->isFixedForm && yy_my_start > fixedCommentAfter)
+ if (yyextra->isFixedForm && yy_my_start > yyextra->fixedCommentAfter)
{
//yy_push_state(YY_START,yyscanner);
//BEGIN(DocBlock);
@@ -1394,7 +1395,7 @@ static void checkContLines(yyscan_t yyscanner,const char *s)
yyextra->hasContLine = (int *) malloc((numLines) * sizeof(int));
for (i = 0; i < numLines; i++)
yyextra->hasContLine[i] = 0;
- p = prepassFixedForm(s, yyextra->hasContLine);
+ p = prepassFixedForm(s, yyextra->hasContLine,yyextra->fixedCommentAfter);
yyextra->hasContLine[0] = 0;
}
@@ -1481,6 +1482,7 @@ void FortranCodeParser::parseCode(CodeOutputInterface & codeOutIntf,
if (yyextra->isFixedForm)
{
checkContLines(yyscanner,yyextra->inputString);
+ yyextra->fixedCommentAfter = Config_getInt(FORTRAN_COMMENT_AFTER);
}
yyextra->currentFontClass = 0;
yyextra->insideCodeLine = FALSE;
@@ -1538,6 +1540,14 @@ void FortranCodeParser::parseCode(CodeOutputInterface & codeOutIntf,
printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? qPrint(fileDef->fileName()): NULL);
}
+static inline void pop_state(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if ( yyg->yy_start_stack_ptr <= 0 )
+ warn(yyextra->fileName,yyextra->yyLineNr,"Unexpected statement '%s'",yytext );
+ else
+ yy_pop_state(yyscanner);
+}
//---------------------------------------------------------
#if USE_STATE2STRING
diff --git a/src/fortranscanner.h b/src/fortranscanner.h
index bf286c3..34e8cdc 100644
--- a/src/fortranscanner.h
+++ b/src/fortranscanner.h
@@ -53,6 +53,6 @@ class FortranOutlineParserFixed : public FortranOutlineParser
FortranOutlineParserFixed() : FortranOutlineParser(FortranFormat_Fixed) { }
};
-const char* prepassFixedForm(const char* contents, int *hasContLine);
+const char* prepassFixedForm(const char* contents, int *hasContLine, int fixedCommentAfter);
#endif
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index 04421c5..58c774a 100755..100644
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -74,7 +74,6 @@ typedef yyguts_t *yyscan_t;
#include "debug.h"
#include "markdown.h"
-const int fixedCommentAfter = 72;
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
@@ -205,6 +204,10 @@ struct fortranscannerYY_state
//! Holds program scope->symbol name->symbol modifiers.
std::map<Entry*,std::map<std::string,SymbolModifiers> > modifiers;
int anonCount = 0 ;
+
+ int fixedCommentAfter = 72;
+ //! counter for the number of main programs in this file
+ int mainPrograms = 0;
};
//-----------------------------------------------------------------------------
@@ -225,6 +228,7 @@ static void addSubprogram(yyscan_t yyscanner,const QCString &text);
static void addInterface(yyscan_t yyscanner,QCString name, InterfaceType type);
static Argument *getParameter(yyscan_t yyscanner,const QCString &name);
static void scanner_abort(yyscan_t yyscanner);
+static inline void pop_state(yyscan_t yyscanner);
static void startScope(yyscan_t yyscanner,Entry *scope);
static bool endScope(yyscan_t yyscanner,Entry *scope, bool isGlobalRoot=FALSE);
@@ -248,6 +252,8 @@ static inline const char *getLexerFILE() {return __FILE__;}
#include "doxygen_lex.h"
#define YY_USER_ACTION yyextra->colNr+=(int)yyleng;
#define INVALID_ENTRY ((Entry*)0x8)
+
+
//-----------------------------------------------------------------------------
%}
@@ -285,7 +291,7 @@ ATTR_SPEC (EXTERNAL|ALLOCATABLE|DIMENSION{ARGS}|{INTENT_SPEC}|INTRINSIC|OPTIONAL
ACCESS_SPEC (PRIVATE|PUBLIC)
LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}((,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})|(,{BS}NAME{BS}"="{BS}"'"(.*)"'"{BS}))?")"
/* Assume that attribute statements are almost the same as attributes. */
-ATTR_STMT {ATTR_SPEC}|DIMENSION|{ACCESS_SPEC}
+ATTR_STMT {ATTR_SPEC}|DIMENSION
EXTERNAL_STMT (EXTERNAL)
CONTAINS CONTAINS
@@ -372,7 +378,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
//printf("BUFFER:%s\n", (const char*)yyextra->inputStringPrepass);
pushBuffer(yyscanner,yyextra->inputStringPrepass);
yyextra->colNr = 0;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
else
{ // simple line
@@ -413,7 +419,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
{
yyextra->initializer+=yytext;
}
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<String>. { if (yy_top_state(yyscanner) == Initialization ||
yy_top_state(yyscanner) == ArrayInitializer)
@@ -452,7 +458,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
DBG_CTX((stderr,"start comment %d\n",yyextra->lineNr));
}
}
-<StrIgnore>.?/\n { yy_pop_state(yyscanner); // comment ends with endline character
+<StrIgnore>.?/\n { pop_state(yyscanner); // comment ends with endline character
DBG_CTX((stderr,"end comment %d %s\n",yyextra->lineNr,qPrint(yyextra->debugStr)));
} // comment line ends
<StrIgnore>. { yyextra->debugStr+=yytext; }
@@ -476,7 +482,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
yyextra->current->section=Entry::USINGDIR_SEC;
yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
yyextra->current->lang = SrcLangExt_Fortran;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Use>{ID}/, {
yyextra->useModuleName=yytext;
@@ -496,7 +502,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
<Use,UseOnly>"\n" {
yyextra->colNr -= 1;
unput(*yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
/* INTERFACE definitions */
@@ -537,25 +543,26 @@ SCOPENAME ({ID}{BS}"::"{BS})*
yyterminate();
}
yyextra->ifType = IF_NONE;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<InterfaceBody>module{BS}procedure { yy_push_state(YY_START,yyscanner);
BEGIN(ModuleProcedure);
}
-<ModuleProcedure>{ID} { if (yyextra->ifType == IF_ABSTRACT || yyextra->ifType == IF_SPECIFIC)
+<ModuleProcedure>{ID} { QCString name = QCString(yytext).lower();
+ if (yyextra->ifType == IF_ABSTRACT || yyextra->ifType == IF_SPECIFIC)
{
- addInterface(yyscanner,yytext, yyextra->ifType);
+ addInterface(yyscanner,name, yyextra->ifType);
startScope(yyscanner,yyextra->last_entry.get());
}
yyextra->current->section = Entry::FUNCTION_SEC ;
- yyextra->current->name = yytext;
+ yyextra->current->name = name;
yyextra->moduleProcedures.push_back(yyextra->current);
addCurrentEntry(yyscanner,true);
}
<ModuleProcedure>"\n" { yyextra->colNr -= 1;
unput(*yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<InterfaceBody>. {}
@@ -593,7 +600,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
//if (!endScope(yyscanner,yyextra->current_root))
// yyterminate();
yyextra->defaultProtection = Public;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Start,ModuleBody,ModuleBodyContains>"end"({BS}(module|program)({BS_}{ID})?)?{BS}/(\n|!|;) { // end module
resolveModuleProcedures(yyscanner,yyextra->current_root);
@@ -610,7 +617,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
}
else
{
- yy_pop_state(yyscanner); // cannot pop artrificial entry
+ pop_state(yyscanner); // cannot pop artrificial entry
}
}
else
@@ -630,12 +637,14 @@ SCOPENAME ({ID}{BS}"::"{BS})*
/*------- access specification --------------------------------------------------------------------------*/
-<ModuleBody>private/{BS}(\n|"!") { yyextra->defaultProtection = Private;
- yyextra->current->protection = yyextra->defaultProtection ;
- }
-<ModuleBody>public/{BS}(\n|"!") { yyextra->defaultProtection = Public;
- yyextra->current->protection = yyextra->defaultProtection ;
- }
+<ModuleBody,TypedefBody,TypedefBodyContains>private/{BS}(\n|"!") {
+ yyextra->defaultProtection = Private;
+ yyextra->current->protection = yyextra->defaultProtection ;
+ }
+<ModuleBody,TypedefBody,TypedefBodyContains>public/{BS}(\n|"!") {
+ yyextra->defaultProtection = Public;
+ yyextra->current->protection = yyextra->defaultProtection ;
+ }
/*------- type definition -------------------------------------------------------------------------------*/
@@ -648,8 +657,8 @@ SCOPENAME ({ID}{BS}"::"{BS})*
}
yy_push_state(Typedef,yyscanner);
- yyextra->current->protection = yyextra->defaultProtection;
- yyextra->typeProtection = yyextra->defaultProtection;
+ yyextra->current->protection = Package; // invalid in Fortran, replaced below
+ yyextra->typeProtection = Public;
yyextra->typeMode = true;
}
<Typedef>{
@@ -666,11 +675,9 @@ extends{ARGS} {
}
public {
yyextra->current->protection = Public;
- yyextra->typeProtection = Public;
}
private {
yyextra->current->protection = Private;
- yyextra->typeProtection = Private;
}
{LANGUAGE_BIND_SPEC} {
/* ignored for now */
@@ -691,6 +698,20 @@ private {
yyextra->current->name = yyextra->current_root->name + "::" + yyextra->current->name;
}
+ // set modifiers to allow adjusting public/private in surrounding module scope
+ if( yyextra->current->protection == Package )
+ {
+ yyextra->current->protection = yyextra->defaultProtection;
+ }
+ else if( yyextra->current->protection == Public )
+ {
+ yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()] |= QCString("public");
+ }
+ else if( yyextra->current->protection == Private )
+ {
+ yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()] |= QCString("private");
+ }
+
addCurrentEntry(yyscanner,true);
startScope(yyscanner,yyextra->last_entry.get());
BEGIN(TypedefBody);
@@ -745,7 +766,7 @@ private {
yyterminate();
}
yyextra->typeMode = false;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
^{BS}"end"{BS}/(\n|!|;) { /* incorrect end type definition */
warn(yyextra->fileName,yyextra->lineNr, "Found 'END' instead of 'END TYPE'");
@@ -755,7 +776,7 @@ private {
yyterminate();
}
yyextra->typeMode = false;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
}
@@ -780,7 +801,7 @@ private {
}
yyextra->subrCurrent.pop_back();
yyextra->vtype = V_IGNORE;
- yy_pop_state(yyscanner) ;
+ pop_state(yyscanner) ;
}
<BlockData>{
{ID} {
@@ -823,13 +844,30 @@ private {
{ATTR_STMT}/{BS}"::" {
/* attribute statement starts */
DBG_CTX((stderr,"5=========> Attribute statement: %s\n", yytext));
+ if (YY_START == Start)
+ {
+ addModule(yyscanner);
+ yy_push_state(ModuleBody,yyscanner); //anon program
+ }
QCString tmp = yytext;
yyextra->currentModifiers |= tmp.stripWhiteSpace();
yyextra->argType="";
yy_push_state(YY_START,yyscanner);
BEGIN( AttributeList ) ;
}
+"common" {
+ if (YY_START == Start)
+ {
+ addModule(yyscanner);
+ yy_push_state(ModuleBody,yyscanner); //anon program
+ }
+ }
{ID} {
+ if (YY_START == Start)
+ {
+ addModule(yyscanner);
+ yy_push_state(ModuleBody,yyscanner); //anon program
+ }
}
^{BS}"type"{BS_}"is"/{BT_} {}
^{BS}"type"{BS}"=" {}
@@ -876,6 +914,21 @@ private {
/* work around for bug in QCString.replace (QCString works) */
QCString name=yytext;
name = name.lower();
+ /* if variable/type/etc is part of a module, mod name is necessary for output */
+ // get surrounding state
+ int currentState = YY_START;
+ yy_pop_state(yyscanner);
+ int outerState = YY_START;
+ yy_push_state(currentState,yyscanner);
+ if( outerState == Start || outerState == ModuleBody )
+ {
+ if ((yyextra->current_root) &&
+ (yyextra->current_root->section == Entry::CLASS_SEC
+ || yyextra->current_root->section == Entry::NAMESPACE_SEC))
+ {
+ name = yyextra->current_root->name + "::" + name;
+ }
+ }
/* remember attributes for the symbol */
yyextra->modifiers[yyextra->current_root][name.lower().str()] |= yyextra->currentModifiers;
yyextra->argName= name;
@@ -992,12 +1045,12 @@ private {
BEGIN(Initialization);
}
<Variable>"\n" { yyextra->currentModifiers = SymbolModifiers();
- yy_pop_state(yyscanner); // end variable declaration list
+ pop_state(yyscanner); // end variable declaration list
newLine(yyscanner);
yyextra->docBlock.resize(0);
}
<Variable>";".*"\n" { yyextra->currentModifiers = SymbolModifiers();
- yy_pop_state(yyscanner); // end variable declaration list
+ pop_state(yyscanner); // end variable declaration list
yyextra->docBlock.resize(0);
yyextra->inputStringSemi = " \n"+QCString(yytext+1);
yyextra->lineNr--;
@@ -1036,7 +1089,7 @@ private {
<Initialization>{COMMA} { if (yyextra->initializerScope == 0)
{
updateVariablePrepassComment(yyscanner,yyextra->colNr-(int)yyleng, yyextra->colNr);
- yy_pop_state(yyscanner); // end initialization
+ pop_state(yyscanner); // end initialization
if (yyextra->last_enum)
{
yyextra->last_enum->initializer.str(yyextra->initializer.str());
@@ -1052,7 +1105,7 @@ private {
}
}
<Initialization>"\n"|"!" { //|
- yy_pop_state(yyscanner); // end initialization
+ pop_state(yyscanner); // end initialization
if (yyextra->last_enum)
{
yyextra->last_enum->initializer.str(yyextra->initializer.str());
@@ -1105,7 +1158,7 @@ private {
yyterminate();
}
yyextra->typeMode = false;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
/*------ fortran subroutine/function handling ------------------------------------------------------------*/
/* Start is initial condition */
@@ -1153,12 +1206,20 @@ private {
<Subprog>{BS} { /* ignore white space */ }
<Subprog>{ID} { yyextra->current->name = yytext;
//cout << "1a==========> got " << yyextra->current->type << " " << yytext << " " << yyextra->lineNr << endl;
- yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()].returnName = yyextra->current->name.lower();
+ QCString returnName = yyextra->current->name.lower();
+ /* if type is part of a module, mod name is necessary for output */
+ if ((yyextra->current_root) &&
+ (yyextra->current_root->section == Entry::CLASS_SEC ||
+ yyextra->current_root->section == Entry::NAMESPACE_SEC))
+ {
+ yyextra->current->name= yyextra->current_root->name + "::" + yyextra->current->name;
+ }
+ yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()].returnName = returnName;
if (yyextra->ifType == IF_ABSTRACT || yyextra->ifType == IF_SPECIFIC)
{
yyextra->current_root->name = substitute(
- yyextra->current_root->name, "$interface$", yytext);
+ yyextra->current_root->name, "$interface$", QCString(yytext).lower());
}
BEGIN(Parameterlist);
@@ -1273,7 +1334,7 @@ private {
{
subrHandleCommentBlockResult(yyscanner,yyextra->docBlock,TRUE);
}
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
yyextra->docBlock.resize(0);
}
@@ -1301,7 +1362,7 @@ private {
yyextra->colNr -= 1;
unput(*yytext);
handleCommentBlock(yyscanner,yyextra->docBlock,TRUE);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
/*-----Prototype parsing -------------------------------------------------------------------------*/
@@ -1516,7 +1577,7 @@ static void insertCharacter(char *contents, int length, int pos, char c)
/* change yyextra->comments and bring line continuation character to previous line */
/* also used to set continuation marks in case of fortran code usage, done here as it is quite complicated code */
-const char* prepassFixedForm(const char* contents, int *hasContLine)
+const char* prepassFixedForm(const char* contents, int *hasContLine,int fixedCommentAfter)
{
int column=0;
int prevLineLength=0;
@@ -1807,16 +1868,37 @@ static void copyEntry(std::shared_ptr<Entry> dest, const std::shared_ptr<Entry>
void resolveModuleProcedures(yyscan_t yyscanner,Entry *current_root)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- for (const auto &ce1 : yyextra->moduleProcedures)
+ if (yyextra->moduleProcedures.empty()) return;
+
+ // build up map of available functions
+ std::map<std::string,std::shared_ptr<Entry>> procMap;
{
- // check all entries in this module
- for (const auto &ce2 : current_root->children())
+ for (const auto& cf: current_root->children())
{
- if (ce1->name == ce2->name)
+ if (cf->section != Entry::FUNCTION_SEC)
+ continue;
+
+ // remove scope from name
+ QCString name = cf->name;
{
- copyEntry(ce1, ce2);
+ int end = name.findRev(":");
+ if (end != -1)
+ name.remove(0, end+1);
}
- } // for procedures in yyextra->current module
+
+ procMap.insert(std::make_pair(name.str(), cf));
+ }
+ }
+
+
+ // for all module procedures
+ for (const auto& ce1: yyextra->moduleProcedures)
+ {
+ if (procMap.find(ce1->name.str())!=procMap.end())
+ {
+ std::shared_ptr<Entry> proc = procMap[ce1->name.str()];
+ copyEntry(ce1, proc);
+ }
} // for all interface module procedures
yyextra->moduleProcedures.clear();
}
@@ -2265,12 +2347,20 @@ static bool endScope(yyscan_t yyscanner,Entry *scope, bool isGlobalRoot)
// iterate variables: get and apply yyextra->modifiers
for (const auto &ce : scope->children())
{
- if (ce->section != Entry::VARIABLE_SEC && ce->section != Entry::FUNCTION_SEC)
+ if (ce->section != Entry::VARIABLE_SEC && ce->section != Entry::FUNCTION_SEC && ce->section != Entry::CLASS_SEC && ce->section != Entry::FUNCTION_SEC)
continue;
//cout<<ce->name<<", "<<mdfsMap.contains(ce->name.lower())<<mdfsMap.count()<<endl;
if (mdfsMap.find(ce->name.lower().str())!=mdfsMap.end())
applyModifiers(ce.get(), mdfsMap[ce->name.lower().str()]);
+
+ // remove prefix for variable names
+ if (ce->section == Entry::VARIABLE_SEC || ce->section == Entry::FUNCTION_SEC)
+ {
+ int end = ce->name.findRev(":");
+ if (end != -1)
+ ce->name.remove(0, end+1);
+ }
}
}
@@ -2348,8 +2438,10 @@ static void addModule(yyscan_t yyscanner,const QCString &name, bool isModule)
QCString fname = yyextra->fileName;
int index = std::max(fname.findRev('/'), fname.findRev('\\'));
fname = fname.right(fname.length()-index-1);
+ if (yyextra->mainPrograms) fname += "__" + QCString().setNum(yyextra->mainPrograms);
+ yyextra->mainPrograms++;
fname = fname.prepend("__").append("__");
- yyextra->current->name = fname;
+ yyextra->current->name = substitute(fname, ".", "_");
}
yyextra->current->type = "program";
yyextra->current->fileName = yyextra->fileName;
@@ -2665,13 +2757,14 @@ static void parseMain(yyscan_t yyscanner, const QCString &fileName,const char *f
if (yyextra->isFixedForm)
{
+ yyextra->fixedCommentAfter = Config_getInt(FORTRAN_COMMENT_AFTER);
msg("Prepassing fixed form of %s\n", qPrint(fileName));
//printf("---strlen=%d\n", strlen(fileBuf));
//clock_t start=clock();
//printf("Input fixed form string:\n%s\n", fileBuf);
//printf("===========================\n");
- yyextra->inputString = prepassFixedForm(fileBuf, nullptr);
+ yyextra->inputString = prepassFixedForm(fileBuf, nullptr,yyextra->fixedCommentAfter);
Debug::print(Debug::FortranFixed2Free,0,"======== Fixed to Free format =========\n---- Input fixed form string ------- \n%s\n", fileBuf);
Debug::print(Debug::FortranFixed2Free,0,"---- Resulting free form string ------- \n%s\n", yyextra->inputString);
//printf("Resulting free form string:\n%s\n", yyextra->inputString);
@@ -2822,6 +2915,14 @@ static void scanner_abort(yyscan_t yyscanner)
//exit(-1);
}
+static inline void pop_state(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if ( yyg->yy_start_stack_ptr <= 0 )
+ warn(yyextra->fileName,yyextra->lineNr,"Unexpected statement '%s'",yytext );
+ else
+ yy_pop_state(yyscanner);
+}
//----------------------------------------------------------------------------
#include "fortranscanner.l.h"
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
index 85291f5..85f3645 100644
--- a/src/ftvhelp.cpp
+++ b/src/ftvhelp.cpp
@@ -65,14 +65,19 @@ const char *JAVASCRIPT_LICENSE_TEXT = R"LIC(/*
*/
)LIC";
+struct FTVNode;
+using FTVNodePtr = std::shared_ptr<FTVNode>;
+using FTVNodeWeakPtr = std::weak_ptr<FTVNode>;
+using FTVNodes = std::vector<FTVNodePtr>;
+
struct FTVNode
{
FTVNode(bool dir,const QCString &r,const QCString &f,const QCString &a,
const QCString &n,bool sepIndex,bool navIndex,const Definition *df)
- : isLast(TRUE), isDir(dir),ref(r),file(f),anchor(a),name(n), index(0),
- parent(0), separateIndex(sepIndex), addToNavIndex(navIndex),
+ : isLast(TRUE), isDir(dir), ref(r), file(f), anchor(a), name(n),
+ separateIndex(sepIndex), addToNavIndex(navIndex),
def(df) {}
- ~FTVNode() { for (const auto &child : children) delete child; }
+ ~FTVNode() = default;
int computeTreeDepth(int level) const;
int numNodesAtLevel(int level,int maxLevel) const;
bool isLast;
@@ -81,9 +86,9 @@ struct FTVNode
QCString file;
QCString anchor;
QCString name;
- int index;
- std::vector<FTVNode*> children;
- FTVNode *parent;
+ int index = 0;
+ FTVNodes children;
+ FTVNodeWeakPtr parent;
bool separateIndex;
bool addToNavIndex;
const Definition *def;
@@ -119,31 +124,24 @@ int FTVNode::numNodesAtLevel(int level,int maxLevel) const
//----------------------------------------------------------------------------
+struct FTVHelp::Private
+{
+ Private(bool TLI) : topLevelIndex(TLI) { indentNodes.resize(1); }
+ std::vector<FTVNodes> indentNodes;
+ int indent = 0;
+ bool topLevelIndex;
+
+ void generateTree(TextStream &t,const FTVNodes &nl,int level,int maxLevel,int &index);
+ void generateLink(TextStream &t,const FTVNodePtr &n);
+};
+
/*! Constructs an ftv help object.
* The object has to be \link initialize() initialized\endlink before it can
* be used.
*/
-FTVHelp::FTVHelp(bool TLI)
-{
- /* initial depth */
- m_indentNodes.resize(1);
- m_indent=0;
- m_topLevelIndex = TLI;
-}
-
-/*! Destroys the ftv help object. */
-FTVHelp::~FTVHelp()
-{
- for (auto &idx : m_indentNodes)
- {
- for (auto &n : idx)
- {
- delete n;
- }
- idx.clear();
- }
- m_indentNodes.clear();
-}
+FTVHelp::FTVHelp(bool TLI) : p(std::make_unique<Private>(TLI)) {}
+FTVHelp::~FTVHelp() = default;
+FTVHelp::FTVHelp(FTVHelp &&) = default;
/*! This will create a folder tree view table of contents file (tree.js).
* \sa finalize()
@@ -167,9 +165,9 @@ void FTVHelp::finalize()
*/
void FTVHelp::incContentsDepth()
{
- //printf("%p: incContentsDepth() indent=%d\n",this,m_indent);
- m_indent++;
- m_indentNodes.resize(m_indent+1);
+ //printf("%p: incContentsDepth() indent=%d\n",this,p->indent);
+ p->indent++;
+ p->indentNodes.resize(p->indent+1);
}
/*! Decrease the level of the contents hierarchy.
@@ -178,16 +176,16 @@ void FTVHelp::incContentsDepth()
*/
void FTVHelp::decContentsDepth()
{
- //printf("%p: decContentsDepth() indent=%d\n",this,m_indent);
- ASSERT(m_indent>0);
- if (m_indent>0)
+ //printf("%p: decContentsDepth() indent=%d\n",this,p->indent);
+ ASSERT(p->indent>0);
+ if (p->indent>0)
{
- m_indent--;
- std::vector<FTVNode*> &nl = m_indentNodes[m_indent];
+ p->indent--;
+ auto &nl = p->indentNodes[p->indent];
if (!nl.empty())
{
- FTVNode *parent = nl.back();
- std::vector<FTVNode*> &children = m_indentNodes[m_indent+1];
+ auto &parent = nl.back();
+ auto &children = p->indentNodes[p->indent+1];
for (const auto &child : children)
{
parent->children.push_back(child);
@@ -217,18 +215,18 @@ void FTVHelp::addContentsItem(bool isDir,
const Definition *def
)
{
- //printf("%p: m_indent=%d addContentsItem(%s,%s,%s,%s)\n",this,m_indent,name,ref,file,anchor);
- std::vector<FTVNode*> &nl = m_indentNodes[m_indent];
- FTVNode *newNode = new FTVNode(isDir,ref,file,anchor,name,separateIndex,addToNavIndex,def);
+ //printf("%p: p->indent=%d addContentsItem(%s,%s,%s,%s)\n",this,p->indent,name,ref,file,anchor);
+ auto &nl = p->indentNodes[p->indent];
if (!nl.empty())
{
nl.back()->isLast=FALSE;
}
+ auto newNode = std::make_shared<FTVNode>(isDir,ref,file,anchor,name,separateIndex,addToNavIndex,def);
nl.push_back(newNode);
newNode->index = static_cast<int>(nl.size()-1);
- if (m_indent>0)
+ if (p->indent>0)
{
- std::vector<FTVNode*> &pnl = m_indentNodes[m_indent-1];
+ auto &pnl = p->indentNodes[p->indent-1];
if (!pnl.empty())
{
newNode->parent = pnl.back();
@@ -236,7 +234,7 @@ void FTVHelp::addContentsItem(bool isDir,
}
}
-static QCString node2URL(const FTVNode *n,bool overruleFile=FALSE,bool srcLink=FALSE)
+static QCString node2URL(const FTVNodePtr &n,bool overruleFile=FALSE,bool srcLink=FALSE)
{
QCString url = n->file;
if (!url.isEmpty() && url.at(0)=='!') // relative URL
@@ -268,22 +266,23 @@ static QCString node2URL(const FTVNode *n,bool overruleFile=FALSE,bool srcLink=F
return url;
}
-QCString FTVHelp::generateIndentLabel(FTVNode *n,int level)
+static QCString generateIndentLabel(const FTVNodePtr &n,int level)
{
QCString result;
- if (n->parent)
+ auto parent = n->parent.lock();
+ if (parent)
{
- result=generateIndentLabel(n->parent,level+1);
+ result=generateIndentLabel(parent,level+1);
}
result+=QCString().setNum(n->index)+"_";
return result;
}
-void FTVHelp::generateIndent(TextStream &t, FTVNode *n,bool opened)
+static void generateIndent(TextStream &t, const FTVNodePtr &n,bool opened)
{
int indent=0;
- FTVNode *p = n->parent;
- while (p) { indent++; p=p->parent; }
+ auto parent = n->parent.lock();
+ while (parent) { indent++; parent=parent->parent.lock(); }
if (n->isDir)
{
QCString dir = opened ? "&#9660;" : "&#9658;";
@@ -299,7 +298,7 @@ void FTVHelp::generateIndent(TextStream &t, FTVNode *n,bool opened)
}
}
-void FTVHelp::generateLink(TextStream &t,FTVNode *n)
+void FTVHelp::Private::generateLink(TextStream &t,const FTVNodePtr &n)
{
//printf("FTVHelp::generateLink(ref=%s,file=%s,anchor=%s\n",
// qPrint(n->ref),qPrint(n->file),qPrint(n->anchor));
@@ -326,7 +325,7 @@ void FTVHelp::generateLink(TextStream &t,FTVNode *n)
t << node2URL(n);
if (!setTarget)
{
- if (m_topLevelIndex)
+ if (topLevelIndex)
t << "\" target=\"basefrm\">";
else
t << "\" target=\"_self\">";
@@ -387,13 +386,15 @@ static char compoundIcon(const ClassDef *cd)
return icon;
}
-void FTVHelp::generateTree(TextStream &t, const std::vector<FTVNode*> &nl,int level,int maxLevel,int &index)
+void FTVHelp::Private::generateTree(TextStream &t, const FTVNodes &nl,int level,int maxLevel,int &index)
{
for (const auto &n : nl)
{
t << "<tr id=\"row_" << generateIndentLabel(n,0) << "\"";
if ((index&1)==0) // even row
t << " class=\"even\"";
+ else
+ t << " class=\"odd\"";
if (level>=maxLevel) // item invisible by default
t << " style=\"display:none;\"";
else // item visible by default
@@ -522,26 +523,28 @@ class NavIndexEntryList : public std::vector<NavIndexEntry>
{
};
-static QCString pathToNode(const FTVNode *leaf,const FTVNode *n)
+static QCString pathToNode(const FTVNodePtr &leaf,const FTVNodePtr &n)
{
QCString result;
- if (n->parent)
+ auto parent = n->parent.lock();
+ if (parent)
{
- result+=pathToNode(leaf,n->parent);
+ result+=pathToNode(leaf,parent);
}
result+=QCString().setNum(n->index);
if (leaf!=n) result+=",";
return result;
}
-static bool dupOfParent(const FTVNode *n)
+static bool dupOfParent(const FTVNodePtr &n)
{
- if (n->parent==0) return FALSE;
- if (n->file==n->parent->file) return TRUE;
+ auto parent = n->parent.lock();
+ if (!parent) return FALSE;
+ if (n->file==parent->file) return TRUE;
return FALSE;
}
-static void generateJSLink(TextStream &t,const FTVNode *n)
+static void generateJSLink(TextStream &t,const FTVNodePtr &n)
{
if (n->file.isEmpty()) // no link
{
@@ -565,11 +568,12 @@ static QCString convertFileId2Var(const QCString &fileId)
}
static bool generateJSTree(NavIndexEntryList &navIndex,TextStream &t,
- const std::vector<FTVNode*> &nl,int level,bool &first)
+ const FTVNodes &nl,int level,bool &first)
{
QCString htmlOutput = Config_getString(HTML_OUTPUT);
QCString indentStr;
indentStr.fill(' ',level*2);
+
bool found=FALSE;
for (const auto &n : nl)
{
@@ -654,7 +658,7 @@ static bool generateJSTree(NavIndexEntryList &navIndex,TextStream &t,
return found;
}
-static void generateJSNavTree(const std::vector<FTVNode*> &nodeList)
+static void generateJSNavTree(const FTVNodes &nodeList)
{
QCString htmlOutput = Config_getString(HTML_OUTPUT);
std::ofstream f(htmlOutput.str()+"/navtreedata.js",std::ofstream::out | std::ofstream::binary);
@@ -769,9 +773,11 @@ void FTVHelp::generateTreeViewImages()
QCString dname=Config_getString(HTML_OUTPUT);
const ResourceMgr &rm = ResourceMgr::instance();
rm.copyResource("doc.luma",dname);
+ rm.copyResource("docd.luma",dname);
rm.copyResource("folderopen.luma",dname);
rm.copyResource("folderclosed.luma",dname);
rm.copyResource("splitbar.lum",dname);
+ rm.copyResource("splitbard.lum",dname);
}
// new style scripts
@@ -780,11 +786,26 @@ void FTVHelp::generateTreeViewScripts()
QCString htmlOutput = Config_getString(HTML_OUTPUT);
// generate navtree.js & navtreeindex.js
- generateJSNavTree(m_indentNodes[0]);
+ generateJSNavTree(p->indentNodes[0]);
// copy resize.js & navtree.css
- ResourceMgr::instance().copyResource("resize.js",htmlOutput);
- ResourceMgr::instance().copyResource("navtree.css",htmlOutput);
+ auto &mgr = ResourceMgr::instance();
+ {
+ std::ofstream f(htmlOutput.str()+"/resize.js",std::ofstream::out | std::ofstream::binary);
+ if (f.is_open())
+ {
+ TextStream t(&f);
+ t << substitute(mgr.getAsString("resize.js"), "$TREEVIEW_WIDTH", QCString().setNum(Config_getInt(TREEVIEW_WIDTH)));
+ }
+ }
+ {
+ std::ofstream f(htmlOutput.str()+"/navtree.css",std::ofstream::out | std::ofstream::binary);
+ if (f.is_open())
+ {
+ TextStream t(&f);
+ t << HtmlGenerator::getNavTreeCss();
+ }
+ }
}
// write tree inside page
@@ -793,7 +814,7 @@ void FTVHelp::generateTreeViewInline(TextStream &t)
int preferredNumEntries = Config_getInt(HTML_INDEX_NUM_ENTRIES);
t << "<div class=\"directory\">\n";
int d=1, depth=1;
- for (const auto &n : m_indentNodes[0])
+ for (const auto &n : p->indentNodes[0])
{
if (!n->children.empty())
{
@@ -820,7 +841,7 @@ void FTVHelp::generateTreeViewInline(TextStream &t)
for (int i=1;i<=depth;i++)
{
int num=0;
- for (const auto &n : m_indentNodes[0])
+ for (const auto &n : p->indentNodes[0])
{
num+=n->numNodesAtLevel(0,i);
}
@@ -837,11 +858,11 @@ void FTVHelp::generateTreeViewInline(TextStream &t)
}
//printf("preferred depth=%d\n",preferredDepth);
- if (!m_indentNodes[0].empty())
+ if (!p->indentNodes[0].empty())
{
t << "<table class=\"directory\">\n";
int index=0;
- generateTree(t,m_indentNodes[0],0,preferredDepth,index);
+ p->generateTree(t,p->indentNodes[0],0,preferredDepth,index);
t << "</table>\n";
}
diff --git a/src/ftvhelp.h b/src/ftvhelp.h
index 196b01c..e726065 100644
--- a/src/ftvhelp.h
+++ b/src/ftvhelp.h
@@ -24,20 +24,23 @@
#ifndef FTVHELP_H
#define FTVHELP_H
+#include <memory>
#include <vector>
-#include "index.h"
+#include "qcstring.h"
class Definition;
+class MemberDef;
class TextStream;
-struct FTVNode;
+
/** A class that generates a dynamic tree view side panel.
*/
-class FTVHelp : public IndexIntf
+class FTVHelp
{
public:
FTVHelp(bool LTI);
~FTVHelp();
+ FTVHelp(FTVHelp &&);
void initialize();
void finalize();
void incContentsDepth();
@@ -59,13 +62,8 @@ class FTVHelp : public IndexIntf
static void generateTreeViewImages();
void generateTreeViewScripts();
private:
- void generateTree(TextStream &t,const std::vector<FTVNode*> &nl,int level,int maxLevel,int &index);
- QCString generateIndentLabel(FTVNode *n,int level);
- void generateIndent(TextStream &t,FTVNode *n,bool opened);
- void generateLink(TextStream &t,FTVNode *n);
- std::vector< std::vector<FTVNode*> > m_indentNodes;
- int m_indent;
- bool m_topLevelIndex;
+ struct Private;
+ std::unique_ptr<Private> p;
};
extern const char *JAVASCRIPT_LICENSE_TEXT;
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index f9b3c71..c6d3fc0 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -707,7 +707,7 @@ void GroupDefImpl::writeTagFile(TextStream &tagFile)
MemberList * ml = getMemberList(lmd->type);
if (ml)
{
- ml->writeTagFile(tagFile);
+ ml->writeTagFile(tagFile,true);
}
}
}
@@ -716,7 +716,7 @@ void GroupDefImpl::writeTagFile(TextStream &tagFile)
{
for (const auto &mg : m_memberGroups)
{
- mg->writeTagFile(tagFile);
+ mg->writeTagFile(tagFile,true);
}
}
break;
diff --git a/src/growbuf.h b/src/growbuf.h
index ba4c5fe..6581572 100644
--- a/src/growbuf.h
+++ b/src/growbuf.h
@@ -106,6 +106,11 @@ class GrowBuf
m_pos+=l;
}
}
+ void addInt(const char *fmt,int value) {
+ char tmp[50];
+ snprintf(tmp,50,fmt,value);
+ addStr(tmp);
+ }
char *get() { return m_str; }
const char *get() const { return m_str; }
size_t getPos() const { return m_pos; }
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 04598c2..c97a50e 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -34,6 +34,8 @@
#include "plantuml.h"
#include "formula.h"
#include "fileinfo.h"
+#include "indexlist.h"
+#include "growbuf.h"
static const int NUM_HTML_LIST_TYPES = 4;
static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
@@ -116,6 +118,7 @@ static bool mustBeOutsideParagraph(const DocNodeVariant &n)
/* <hr> */ DocHorRuler,
/* <blockquote> */ DocHtmlBlockQuote,
/* \parblock */ DocParBlock,
+ /* <details> */ DocHtmlDetails,
DocIncOperator >(n))
{
return TRUE;
@@ -522,9 +525,6 @@ void HtmlDocVisitor::operator()(const DocStyleChange &s)
case DocStyleChange::Span:
if (s.enable()) m_t << "<span" << htmlAttribsToString(s.attribs()) << ">"; else m_t << "</span>";
break;
- case DocStyleChange::Details:
- if (s.enable()) m_t << "<details" << htmlAttribsToString(s.attribs()) << ">\n"; else m_t << "</details>\n";
- break;
case DocStyleChange::Summary:
if (s.enable()) m_t << "<summary" << htmlAttribsToString(s.attribs()) << ">"; else m_t << "</summary>";
break;
@@ -909,30 +909,77 @@ void HtmlDocVisitor::operator()(const DocFormula &f)
}
else
{
- m_t << "<img class=\"formula"
- << (bDisplay ? "Dsp" : "Inl");
- m_t << "\" alt=\"";
- filterQuotedCdataAttr(f.text());
- m_t << "\"";
- m_t << " src=\"" << f.relPath() << f.name();
- if (Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg)
- {
- m_t << ".svg";
- }
- else
- {
- m_t << ".png";
- }
- FormulaManager::DisplaySize size = FormulaManager::instance().displaySize(f.id());
- if (size.width!=-1)
- {
- m_t << "\" width=\"" << size.width;
- }
- if (size.height!=-1)
+ const Formula *formula = FormulaManager::instance().findFormula(f.id());
+
+ enum class ImageType { Light, Dark };
+ enum class Visibility { Always, Dark, Light, AutoDark, AutoLight };
+ auto writeFormula = [&](ImageType imgType,Visibility visibility) -> QCString {
+ // see https://chipcullen.com/how-to-have-dark-mode-image-that-works-with-user-choice for the design idea
+ TextStream t;
+ QCString extension = Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ? ".svg":".png" ;
+ if (visibility==Visibility::AutoDark || visibility==Visibility::AutoLight)
+ {
+ t << "<picture>";
+ t << "<source srcset=\"" << f.relPath() << f.name();
+ if (visibility==Visibility::AutoDark)
+ {
+ t << extension;
+ t << "\" media=\"(prefers-color-scheme: light)\"";
+ }
+ else // AutoLight
+ {
+ t << "_dark";
+ t << extension;
+ t << "\" media=\"(prefers-color-scheme: dark)\"";
+ }
+ t << "/>";
+ }
+ t << "<img class=\"formula";
+ t << (bDisplay ? "Dsp" : "Inl");
+ if (visibility==Visibility::Light) t << " light-mode-visible";
+ else if (visibility==Visibility::Dark) t << " dark-mode-visible";
+ t << "\" alt=\"" << filterQuotedCdataAttr(f.text()) << "\"" << " src=\"" << f.relPath() << f.name();
+ if (imgType==ImageType::Dark) t << "_dark";
+ t << extension;
+ if (formula && formula->width()!=-1)
+ {
+ t << "\" width=\"";
+ t << formula->width();
+ }
+ if (formula && formula->height()!=-1)
+ {
+ t << "\" height=\"";
+ t << formula->height();
+ }
+ t << "\"/>";
+ if (visibility==Visibility::AutoDark || visibility==Visibility::AutoLight)
+ {
+ t << "</picture>";
+ }
+ return QCString(t.str());
+ };
+
+ auto colorStyle = Config_getEnum(HTML_COLORSTYLE);
+ switch(colorStyle)
{
- m_t << "\" height=\"" << size.height;
+ case HTML_COLORSTYLE_t::LIGHT:
+ m_t << writeFormula(ImageType::Light,Visibility::Always);
+ break;
+ case HTML_COLORSTYLE_t::DARK:
+ m_t << writeFormula(ImageType::Dark, Visibility::Always);
+ break;
+ case HTML_COLORSTYLE_t::AUTO_LIGHT:
+ m_t << writeFormula(ImageType::Light, Visibility::AutoLight);
+ break;
+ case HTML_COLORSTYLE_t::AUTO_DARK:
+ m_t << writeFormula(ImageType::Dark, Visibility::AutoDark);
+ break;
+ case HTML_COLORSTYLE_t::TOGGLE:
+ // write the image twice and use javascript (darkmode_toggle.js) to show only one of them
+ m_t << writeFormula(ImageType::Light,Visibility::Light);
+ m_t << writeFormula(ImageType::Dark, Visibility::Dark);
+ break;
}
- m_t << "\"/>";
}
if (bDisplay)
{
@@ -1227,7 +1274,8 @@ static bool determineIfNeedsTag(const DocPara &p)
DocSimpleSect,
DocXRefItem,
DocHtmlBlockQuote,
- DocParBlock
+ DocParBlock,
+ DocHtmlDetails
>(*p.parent()))
{
needsTag = TRUE;
@@ -1566,7 +1614,7 @@ void HtmlDocVisitor::operator()(const DocInternal &i)
void HtmlDocVisitor::operator()(const DocHRef &href)
{
if (m_hide) return;
- if (href.url().left(7)=="mailto:")
+ if (href.url().startsWith("mailto:"))
{
writeObfuscatedMailAddress(href.url().mid(7));
}
@@ -1580,6 +1628,16 @@ void HtmlDocVisitor::operator()(const DocHRef &href)
m_t << "</a>";
}
+void HtmlDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ forceEndParagraph(d);
+ m_t << "<details " << htmlAttribsToString(d.attribs()) << ">\n";
+ visitChildren(d);
+ m_t << "</details>\n";
+ forceStartParagraph(d);
+}
+
void HtmlDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
@@ -1954,7 +2012,6 @@ void HtmlDocVisitor::operator()(const DocHtmlBlockQuote &b)
{
if (m_hide) return;
forceEndParagraph(b);
- QCString attrs = htmlAttribsToString(b.attribs());
m_t << "<blockquote class=\"doxtable\"" << htmlAttribsToString(b.attribs()) << ">\n";
visitChildren(b);
m_t << "</blockquote>\n";
@@ -2032,9 +2089,10 @@ void HtmlDocVisitor::filter(const QCString &str, const bool retainNewline)
/// Escape basic entities to produce a valid CDATA attribute value,
/// assume that the outer quoting will be using the double quote &quot;
-void HtmlDocVisitor::filterQuotedCdataAttr(const QCString &str)
+QCString HtmlDocVisitor::filterQuotedCdataAttr(const QCString &str)
{
- if (str.isEmpty()) return;
+ GrowBuf growBuf;
+ if (str.isEmpty()) return str;
const char *p=str.data();
char c;
while (*p)
@@ -2042,30 +2100,41 @@ void HtmlDocVisitor::filterQuotedCdataAttr(const QCString &str)
c=*p++;
switch(c)
{
- case '&': m_t << "&amp;"; break;
- case '"': m_t << "&quot;"; break;
- case '<': m_t << "&lt;"; break;
- case '>': m_t << "&gt;"; break;
- case '\\': if ((*p == '(') || (*p == ')'))
- m_t << "\\&zwj;" << *p++;
+ case '&': growBuf.addStr("&amp;"); break;
+ case '"': growBuf.addStr("&quot;"); break;
+ case '<': growBuf.addStr("&lt;"); break;
+ case '>': growBuf.addStr("&gt;"); break;
+ case '\\':
+ if ((*p == '(') || (*p == ')'))
+ {
+ growBuf.addStr("\\&zwj;");
+ growBuf.addChar(*p++);
+ }
else
- m_t << c;
+ {
+ growBuf.addChar(c);
+ }
break;
default:
{
uchar uc = static_cast<uchar>(c);
if (uc<32 && !isspace(c)) // non-printable control characters
{
- m_t << "&#x24" << hex[uc>>4] << hex[uc&0xF] << ";";
+ growBuf.addStr("&#x24");
+ growBuf.addChar(hex[uc>>4]);
+ growBuf.addChar(hex[uc&0xF]);
+ growBuf.addStr(";");
}
else
{
- m_t << c;
+ growBuf.addChar(c);
}
}
break;
}
}
+ growBuf.addChar(0);
+ return growBuf.get();
}
void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h
index 36fb760..510f349 100644
--- a/src/htmldocvisitor.h
+++ b/src/htmldocvisitor.h
@@ -78,6 +78,7 @@ class HtmlDocVisitor : public DocVisitor
void operator()(const DocHtmlCaption &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
@@ -115,7 +116,7 @@ class HtmlDocVisitor : public DocVisitor
void writeObfuscatedMailAddress(const QCString &url);
void filter(const QCString &str, const bool retainNewline = false);
- void filterQuotedCdataAttr(const QCString &str);
+ QCString filterQuotedCdataAttr(const QCString &str);
void startLink(const QCString &ref,const QCString &file,
const QCString &relPath,const QCString &anchor,
const QCString &tooltip = "");
diff --git a/src/htmlentity.cpp b/src/htmlentity.cpp
index bcd1b25..16d4469 100644
--- a/src/htmlentity.cpp
+++ b/src/htmlentity.cpp
@@ -479,7 +479,7 @@ void HtmlEntityMapper::writeXMLSchema(TextStream &t)
for (int i=0;i<g_numHtmlEntities - g_numberHtmlMappedCmds;i++)
{
QCString bareName = g_htmlEntities[i].xml;
- if (!bareName.isEmpty() && bareName.at(0)=='<' && bareName.right(2)=="/>")
+ if (!bareName.isEmpty() && bareName.at(0)=='<' && bareName.endsWith("/>"))
{
bareName = bareName.mid(1,bareName.length()-3); // strip < and />
t << " <xsd:element name=\"" << bareName << "\" type=\"docEmptyType\" />\n";
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index ea1f7e6..9f00196 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -54,6 +54,7 @@
#include "dir.h"
#include "utf8.h"
#include "textstream.h"
+#include "indexlist.h"
//#define DBG_HTML(x) x;
#define DBG_HTML(x)
@@ -70,11 +71,10 @@ static void writeClientSearchBox(TextStream &t,const QCString &relPath)
{
t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
t << " <span class=\"left\">\n";
- t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag_sel.svg\"\n";
- t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
- t << " onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
- t << " alt=\"\"/>\n";
- t << " <input type=\"text\" id=\"MSearchField\" value=\""
+ t << " <span id=\"MSearchSelect\" ";
+ t << " onmouseover=\"return searchBox.OnSearchSelectShow()\" ";
+ t << " onmouseout=\"return searchBox.OnSearchSelectHide()\">&#160;</span>\n";
+ t << " <input type=\"text\" id=\"MSearchField\" value=\"\" placeholder=\""
<< theTranslator->trSearch() << "\" accesskey=\"S\"\n";
t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
t << " onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
@@ -103,10 +103,10 @@ static void writeServerSearchBox(TextStream &t,const QCString &relPath,bool high
t << "search.php";
}
t << "\" method=\"get\">\n";
- t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag.svg\" alt=\"\"/>\n";
+ t << " <span id=\"MSearchSelectExt\">&#160;</span>\n";
if (!highlightSearch)
{
- t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\""
+ t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" placeholder=\""
<< theTranslator->trSearch() << "\" size=\"20\" accesskey=\"S\" \n";
t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
t << " onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
@@ -349,14 +349,17 @@ static QCString substituteHtmlKeywords(const QCString &str,
}
else
{
- FileInfo cssfi(cssFile.str());
- if (cssfi.exists())
+ if (!cssFile.startsWith("http:") && !cssFile.startsWith("https:"))
{
- cssFile = cssfi.fileName();
- }
- else
- {
- cssFile = "doxygen.css";
+ FileInfo cssfi(cssFile.str());
+ if (cssfi.exists())
+ {
+ cssFile = cssfi.fileName();
+ }
+ else
+ {
+ cssFile = "doxygen.css";
+ }
}
}
@@ -366,10 +369,18 @@ static QCString substituteHtmlKeywords(const QCString &str,
{
if (!fileName.empty())
{
- FileInfo fi(fileName);
- if (fi.exists())
+ QCString htmlStyleSheet = fileName.c_str();
+ if (htmlStyleSheet.startsWith("http:") || htmlStyleSheet.startsWith("https:"))
{
- extraCssText += "<link href=\"$relpath^"+stripPath(fileName.c_str())+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ extraCssText += "<link href=\""+htmlStyleSheet+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ }
+ else
+ {
+ FileInfo fi(fileName);
+ if (fi.exists())
+ {
+ extraCssText += "<link href=\"$relpath^"+stripPath(fileName.c_str())+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ }
}
}
}
@@ -443,7 +454,7 @@ static QCString substituteHtmlKeywords(const QCString &str,
{
auto mathJaxVersion = Config_getEnum(MATHJAX_VERSION);
QCString path = Config_getString(MATHJAX_RELPATH);
- if (path.isEmpty() || path.left(2)=="..") // relative path
+ if (path.isEmpty() || path.startsWith("..")) // relative path
{
path.prepend(relPath);
}
@@ -549,6 +560,12 @@ static QCString substituteHtmlKeywords(const QCString &str,
}
}
+ QCString darkModeJs;
+ if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ darkModeJs="<script type=\"text/javascript\" src=\"$relpath^darkmode_toggle.js\"></script>\n";
+ }
+
// first substitute generic keywords
QCString result = substituteKeywords(str,title,
convertToHtml(Config_getString(PROJECT_NAME)),
@@ -562,6 +579,7 @@ static QCString substituteHtmlKeywords(const QCString &str,
result = substitute(result,"$searchbox",searchBox);
result = substitute(result,"$search",searchCssJs);
result = substitute(result,"$mathjax",mathJaxJs);
+ result = substitute(result,"$darkmode",darkModeJs);
result = substitute(result,"$generatedby",generatedBy);
result = substitute(result,"$extrastylesheet",extraCssText);
result = substitute(result,"$relpath$",relPath); //<-- obsolete: for backwards compatibility only
@@ -583,6 +601,72 @@ static QCString substituteHtmlKeywords(const QCString &str,
return result;
}
+//---------------------------------------------------------------------------------------------
+
+static StringUnorderedMap g_lightMap;
+static StringUnorderedMap g_darkMap;
+
+static void fillColorStyleMap(const QCString &definitions,StringUnorderedMap &map)
+{
+ int p=0,i=0;
+ while ((i=definitions.find('\n',p))!=-1)
+ {
+ QCString line = definitions.mid(p,i-p);
+ if (line.startsWith("--"))
+ {
+ int separator = line.find(':');
+ assert(separator!=-1);
+ std::string key = line.left(separator).str();
+ int semi = line.find(';');
+ assert(semi!=-1);
+ std::string value = line.mid(separator+1,semi-separator-1).stripWhiteSpace().str();
+ map.insert(std::make_pair(key,value));
+ //printf("var(%s)=%s\n",qPrint(key),qPrint(value));
+ }
+ p=i+1;
+ }
+}
+
+static QCString replaceVariables(const QCString &input)
+{
+ auto doReplacements = [&input](const StringUnorderedMap &mapping) -> QCString
+ {
+ GrowBuf output;
+ int p=0,i=0;
+ while ((i=input.find("var(",p))!=-1)
+ {
+ output.addStr(input.data()+p,i-p);
+ int j=input.find(")",i+4);
+ assert(j!=-1);
+ auto it = mapping.find(input.mid(i+4,j-i-4).str()); // find variable
+ assert(it!=mapping.end()); // should be found
+ output.addStr(it->second); // add it value
+ //printf("replace '%s' by '%s'\n",qPrint(input.mid(i+4,j-i-4)),qPrint(it->second));
+ p=j+1;
+ }
+ output.addStr(input.data()+p,input.length()-p);
+ output.addChar(0);
+ return output.get();
+ };
+
+ auto colorStyle = Config_getEnum(HTML_COLORSTYLE);
+ if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
+ {
+ return doReplacements(g_lightMap);
+ }
+ else if (colorStyle==HTML_COLORSTYLE_t::DARK)
+ {
+ return doReplacements(g_darkMap);
+ }
+ else
+ {
+ return input;
+ }
+}
+
+//----------------------------------------------------------------------------------------------
+
+
//--------------------------------------------------------------------------
HtmlCodeGenerator::HtmlCodeGenerator(TextStream &t) : m_t(t)
@@ -941,7 +1025,6 @@ HtmlGenerator::~HtmlGenerator()
//printf("HtmlGenerator::~HtmlGenerator()\n");
}
-
void HtmlGenerator::init()
{
QCString dname = Config_getString(HTML_OUTPUT);
@@ -984,14 +1067,36 @@ void HtmlGenerator::init()
createSubDirs(d);
ResourceMgr &mgr = ResourceMgr::instance();
- if (Config_getBool(HTML_DYNAMIC_MENUS))
+ auto colorStyle = Config_getEnum(HTML_COLORSTYLE);
+ if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
{
- mgr.copyResourceAs("tabs.css",dname,"tabs.css");
+ fillColorStyleMap(replaceColorMarkers(mgr.getAsString("lightmode_settings.css")),g_lightMap);
}
- else // stylesheet for the 'old' static tabs
+ else if (colorStyle==HTML_COLORSTYLE_t::DARK)
{
- mgr.copyResourceAs("fixed_tabs.css",dname,"tabs.css");
+ fillColorStyleMap(replaceColorMarkers(mgr.getAsString("darkmode_settings.css")),g_darkMap);
+ }
+
+ {
+ QCString tabsCss;
+ if (Config_getBool(HTML_DYNAMIC_MENUS))
+ {
+ tabsCss = mgr.getAsString("tabs.css");
+ }
+ else // stylesheet for the 'old' static tabs
+ {
+ tabsCss = mgr.getAsString("fixed_tabs.css");
+ }
+
+ std::ofstream f(dname.str()+"/tabs.css",std::ofstream::out | std::ofstream::binary);
+ if (f.is_open())
+ {
+ TextStream t(&f);
+ t << replaceVariables(tabsCss);
+ }
}
+
+
mgr.copyResource("jquery.js",dname);
if (Config_getBool(INTERACTIVE_SVG))
{
@@ -1003,6 +1108,17 @@ void HtmlGenerator::init()
mgr.copyResource("menu.js",dname);
}
+ if (colorStyle==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ //mgr.copyResource("darkmode_toggle.js",dname);
+ std::ofstream f(dname.str()+"/darkmode_toggle.js",std::ofstream::out | std::ofstream::binary);
+ if (f.is_open())
+ {
+ TextStream t(&f);
+ t << replaceColorMarkers(mgr.getAsString("darkmode_toggle.js"));
+ }
+ }
+
{
std::ofstream f(dname.str()+"/dynsections.js",std::ofstream::out | std::ofstream::binary);
if (f.is_open())
@@ -1031,13 +1147,20 @@ void HtmlGenerator::writeTabData()
QCString dname=Config_getString(HTML_OUTPUT);
ResourceMgr &mgr = ResourceMgr::instance();
//writeColoredImgData(dname,colored_tab_data);
- mgr.copyResource("tab_a.lum",dname);
- mgr.copyResource("tab_b.lum",dname);
- mgr.copyResource("tab_h.lum",dname);
- mgr.copyResource("tab_s.lum",dname);
- mgr.copyResource("nav_h.lum",dname);
- mgr.copyResource("nav_f.lum",dname);
- mgr.copyResource("bc_s.luma",dname);
+ mgr.copyResource("tab_a.lum",dname); // active, light mode
+ mgr.copyResource("tab_b.lum",dname); // normal, light mode
+ mgr.copyResource("tab_h.lum",dname); // highlight, light mode
+ mgr.copyResource("tab_s.lum",dname); // separator, light mode
+ mgr.copyResource("tab_ad.lum",dname); // active, dark mode
+ mgr.copyResource("tab_bd.lum",dname); // normal, dark mode
+ mgr.copyResource("tab_hd.lum",dname); // highlight, dark mode
+ mgr.copyResource("tab_sd.lum",dname); // separator, light mode
+ mgr.copyResource("nav_h.lum",dname); // header gradient, light mode
+ mgr.copyResource("nav_hd.lum",dname); // header gradient, dark mode
+ mgr.copyResource("nav_f.lum",dname); // member definition header, light mode
+ mgr.copyResource("nav_fd.lum",dname); // member definition header, dark mode
+ mgr.copyResource("bc_s.luma",dname); // breadcrumb separator, light mode
+ mgr.copyResource("bc_sd.luma",dname); // breadcrumb separator, dark mode
mgr.copyResource("doxygen.svg",dname);
Doxygen::indexList->addImageFile("doxygen.svg");
mgr.copyResource("closed.luma",dname);
@@ -1058,28 +1181,23 @@ void HtmlGenerator::writeTabData()
void HtmlGenerator::writeSearchData(const QCString &dname)
{
- bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
+ //bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
//writeImgData(dname,serverBasedSearch ? search_server_data : search_client_data);
ResourceMgr &mgr = ResourceMgr::instance();
- mgr.copyResource("search_l.png",dname);
- Doxygen::indexList->addImageFile("search/search_l.png");
- mgr.copyResource("search_m.png",dname);
- Doxygen::indexList->addImageFile("search/search_m.png");
- mgr.copyResource("search_r.png",dname);
- Doxygen::indexList->addImageFile("search/search_r.png");
- if (serverBasedSearch)
- {
- mgr.copyResource("mag.svg",dname);
- Doxygen::indexList->addImageFile("search/mag.svg");
- }
- else
- {
- mgr.copyResource("close.svg",dname);
- Doxygen::indexList->addImageFile("search/close.svg");
- mgr.copyResource("mag_sel.svg",dname);
- Doxygen::indexList->addImageFile("search/mag_sel.svg");
- }
+ // server side search resources
+ mgr.copyResource("mag.svg",dname);
+ mgr.copyResource("mag_d.svg",dname);
+ Doxygen::indexList->addImageFile("search/mag.svg");
+ Doxygen::indexList->addImageFile("search/mag_d.svg");
+
+ // client side search resources
+ mgr.copyResource("close.svg",dname);
+ Doxygen::indexList->addImageFile("search/close.svg");
+ mgr.copyResource("mag_sel.svg",dname);
+ mgr.copyResource("mag_seld.svg",dname);
+ Doxygen::indexList->addImageFile("search/mag_sel.svg");
+ Doxygen::indexList->addImageFile("search/mag_seld.svg");
QCString searchDirName = dname;
std::ofstream f(searchDirName.str()+"/search.css",std::ofstream::out | std::ofstream::binary);
@@ -1087,35 +1205,89 @@ void HtmlGenerator::writeSearchData(const QCString &dname)
{
TextStream t(&f);
QCString searchCss;
+ // the position of the search box depends on a number of settings.
+ // Insert the right piece of CSS code depending on which options are selected
if (Config_getBool(DISABLE_INDEX))
{
if (Config_getBool(GENERATE_TREEVIEW) && Config_getBool(FULL_SIDEBAR))
{
- searchCss = mgr.getAsString("search_sidebar.css");
+ searchCss = mgr.getAsString("search_sidebar.css"); // we have a full height side bar
+ }
+ else if (Config_getBool(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ searchCss = mgr.getAsString("search_nomenu_toggle.css"); // we have no tabs but do have a darkmode button
}
else
{
- searchCss = mgr.getAsString("search_nomenu.css");
+ searchCss = mgr.getAsString("search_nomenu.css"); // we have no tabs and no darkmode button
}
}
else if (!Config_getBool(HTML_DYNAMIC_MENUS))
{
- searchCss = mgr.getAsString("search_fixedtabs.css");
+ searchCss = mgr.getAsString("search_fixedtabs.css"); // we have tabs, but they are static
}
else
{
- searchCss = mgr.getAsString("search.css");
+ searchCss = mgr.getAsString("search.css"); // default case with a dynamic menu bar
}
+ // and then add the option independent part of the styling
searchCss += mgr.getAsString("search_common.css");
- searchCss = substitute(replaceColorMarkers(searchCss),"$doxygenversion",getDoxygenVersion());
- t << searchCss;
+ searchCss = substitute(searchCss,"$doxygenversion",getDoxygenVersion());
+ t << replaceVariables(searchCss);
Doxygen::indexList->addStyleSheetFile("search/search.css");
}
}
+static void writeDefaultStyleSheet(TextStream &t)
+{
+ t << "/* The standard CSS for doxygen " << getDoxygenVersion() << "*/\n\n";
+ switch (Config_getEnum(HTML_COLORSTYLE))
+ {
+ case HTML_COLORSTYLE_t::LIGHT:
+ case HTML_COLORSTYLE_t::DARK:
+ /* variables will be resolved while writing to the CSS file */
+ break;
+ case HTML_COLORSTYLE_t::AUTO_LIGHT:
+ case HTML_COLORSTYLE_t::TOGGLE:
+ t << "html {\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("lightmode_settings.css"));
+ t << "}\n\n";
+ break;
+ case HTML_COLORSTYLE_t::AUTO_DARK:
+ t << "html {\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("darkmode_settings.css"));
+ t << "}\n\n";
+ break;
+ }
+ if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_LIGHT)
+ {
+ t << "@media (prefers-color-scheme: dark) {\n";
+ t << " html:not(.dark-mode) {\n";
+ t << " color-scheme: dark;\n\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("darkmode_settings.css"));
+ t << "}}\n";
+ }
+ else if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_DARK)
+ {
+ t << "@media (prefers-color-scheme: light) {\n";
+ t << " html:not(.light-mode) {\n";
+ t << " color-scheme: light;\n\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("lightmode_settings.css"));
+ t << "}}\n";
+ }
+ else if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ t << "html.dark-mode {\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("darkmode_settings.css"));
+ t << "}\n\n";
+ }
+
+ t << replaceVariables(ResourceMgr::instance().getAsString("doxygen.css"));
+}
+
void HtmlGenerator::writeStyleSheetFile(TextStream &t)
{
- t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",getDoxygenVersion()));
+ writeDefaultStyleSheet(t);
}
void HtmlGenerator::writeHeaderFile(TextStream &t, const QCString & /*cssname*/)
@@ -1153,18 +1325,16 @@ void HtmlGenerator::startFile(const QCString &name,const QCString &,
m_t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
<< getDoxygenVersion() << " -->\n";
- //bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
bool searchEngine = Config_getBool(SEARCHENGINE);
if (searchEngine /*&& !generateTreeView*/)
{
m_t << "<script type=\"text/javascript\">\n";
m_t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */\n";
m_t << "var searchBox = new SearchBox(\"searchBox\", \""
- << m_relPath<< "search\",'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
+ << m_relPath<< "search/\",'" << Doxygen::htmlFileExtension << "');\n";
m_t << "/* @license-end */\n";
m_t << "</script>\n";
}
- //generateDynamicSections(t,relPath);
m_sectionCount=0;
}
@@ -1183,10 +1353,17 @@ void HtmlGenerator::writeSearchInfo(TextStream &t,const QCString &)
t << "\n";
t << "<!-- iframe showing the search results (closed by default) -->\n";
t << "<div id=\"MSearchResultsWindow\">\n";
- t << "<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n";
- t << " name=\"MSearchResults\" id=\"MSearchResults\">\n";
- t << "</iframe>\n";
- t << "</div>\n";
+ t << "<div id=\"MSearchResults\">\n";
+ t << "<div class=\"SRPage\">\n";
+ t << "<div id=\"SRIndex\">\n";
+ t << "<div id=\"SRResults\"></div>\n"; // here the results will be inserted
+ t << "<div class=\"SRStatus\" id=\"Loading\">" << theTranslator->trLoading() << "</div>\n";
+ t << "<div class=\"SRStatus\" id=\"Searching\">" << theTranslator->trSearching() << "</div>\n";
+ t << "<div class=\"SRStatus\" id=\"NoMatches\">" << theTranslator->trNoMatches() << "</div>\n";
+ t << "</div>\n"; // SRIndex
+ t << "</div>\n"; // SRPage
+ t << "</div>\n"; // MSearchResults
+ t << "</div>\n"; // MSearchResultsWindow
t << "\n";
}
}
@@ -1261,33 +1438,31 @@ void HtmlGenerator::writeStyleInfo(int part)
{
//printf("write doxygen.css\n");
startPlainFile("doxygen.css");
-
- // alternative, cooler looking titles
- //t << "H1 { text-align: center; border-width: thin none thin none;\n";
- //t << " border-style : double; border-color : blue; padding-left : 1em; padding-right : 1em }\n";
-
- m_t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",getDoxygenVersion()));
+ writeDefaultStyleSheet(m_t);
endPlainFile();
Doxygen::indexList->addStyleSheetFile("doxygen.css");
}
else // write user defined style sheet
{
- QCString cssname=Config_getString(HTML_STYLESHEET);
- FileInfo cssfi(cssname.str());
- if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
- {
- err("style sheet %s does not exist or is not readable!", qPrint(Config_getString(HTML_STYLESHEET)));
- }
- else
+ QCString cssName=Config_getString(HTML_STYLESHEET);
+ if (!cssName.startsWith("http:") && !cssName.startsWith("https:"))
{
- // convert style sheet to string
- QCString fileStr = fileToString(cssname);
- // write the string into the output dir
- startPlainFile(cssfi.fileName().c_str());
- m_t << fileStr;
- endPlainFile();
+ FileInfo cssfi(cssName.str());
+ if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
+ {
+ err("style sheet %s does not exist or is not readable!", qPrint(Config_getString(HTML_STYLESHEET)));
+ }
+ else
+ {
+ // convert style sheet to string
+ QCString fileStr = fileToString(cssName);
+ // write the string into the output dir
+ startPlainFile(cssfi.fileName().c_str());
+ m_t << fileStr;
+ endPlainFile();
+ }
+ Doxygen::indexList->addStyleSheetFile(cssfi.fileName().c_str());
}
- Doxygen::indexList->addStyleSheetFile(cssfi.fileName().c_str());
}
const StringVector &extraCssFiles = Config_getList(HTML_EXTRA_STYLESHEET);
for (const auto &fileName : extraCssFiles)
@@ -1306,6 +1481,11 @@ void HtmlGenerator::writeStyleInfo(int part)
Doxygen::indexList->addStyleSheetFile("dynsections.js");
+ if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ Doxygen::indexList->addStyleSheetFile("darkmode_toggle.js");
+ }
+
if (Config_getBool(INTERACTIVE_SVG))
{
Doxygen::indexList->addStyleSheetFile("svgpan.js");
@@ -1851,24 +2031,22 @@ void HtmlGenerator::endIndexList()
void HtmlGenerator::startIndexKey()
{
- // inserted 'class = ...', 02 jan 2002, jh
- m_t << " <tr><td class=\"indexkey\">";
+ //m_t << " <tr><td class=\"indexkey\">";
}
void HtmlGenerator::endIndexKey()
{
- m_t << "</td>";
+ //m_t << "</td>";
}
void HtmlGenerator::startIndexValue(bool)
{
- // inserted 'class = ...', 02 jan 2002, jh
- m_t << "<td class=\"indexvalue\">";
+ //m_t << "<td class=\"indexvalue\">";
}
void HtmlGenerator::endIndexValue(const QCString &,bool)
{
- m_t << "</td></tr>\n";
+ //m_t << "</td></tr>\n";
}
void HtmlGenerator::startMemberDocList()
@@ -1887,7 +2065,7 @@ void HtmlGenerator::startMemberDoc( const QCString &clName, const QCString &memN
{
DBG_HTML(m_t << "<!-- startMemberDoc -->\n";)
m_t << "\n<h2 class=\"memtitle\">"
- << "<span class=\"permalink\"><a href=\"#" << anchor << "\">&#9670;&nbsp;</a></span>";
+ << "<span class=\"permalink\"><a href=\"#" << anchor << "\">&#9670;&#160;</a></span>";
docify(title);
if (memTotal>1)
{
@@ -2337,9 +2515,9 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind)
case LayoutNavEntry::ClassIndex: return annotatedClasses>0;
case LayoutNavEntry::ClassHierarchy: return hierarchyClasses>0;
case LayoutNavEntry::ClassMembers: return documentedClassMembers[CMHL_All]>0;
- case LayoutNavEntry::Files: return documentedFiles>0;
- case LayoutNavEntry::FileList: return documentedFiles>0;
- case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
+ case LayoutNavEntry::Files: return Config_getBool(SHOW_FILES) && documentedFiles>0;
+ case LayoutNavEntry::FileList: return Config_getBool(SHOW_FILES) && documentedFiles>0;
+ case LayoutNavEntry::FileGlobals: return Config_getBool(SHOW_FILES) && documentedFileMembers[FMHL_All]>0;
case LayoutNavEntry::Examples: return !Doxygen::exampleLinkedMap->empty();
case LayoutNavEntry::Interfaces: return annotatedInterfaces>0;
case LayoutNavEntry::InterfaceList: return annotatedInterfaces>0;
@@ -2708,7 +2886,7 @@ void HtmlGenerator::writeSearchPage()
t << "<script type=\"text/javascript\">\n";
t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
- << "search\",'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
+ << "search/\",'" << Doxygen::htmlFileExtension << "');\n";
t << "/* @license-end */\n";
t << "</script>\n";
if (!Config_getBool(DISABLE_INDEX))
@@ -2764,13 +2942,17 @@ void HtmlGenerator::writeExternalSearchPage()
t << "<script type=\"text/javascript\">\n";
t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
- << "search\",'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
+ << "search/\",'" << Doxygen::htmlFileExtension << "');\n";
t << "/* @license-end */\n";
t << "</script>\n";
if (!Config_getBool(DISABLE_INDEX))
{
writeDefaultQuickLinks(t,TRUE,HLI_Search,QCString(),QCString());
- t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" size=\"20\" accesskey=\"S\" onfocus=\"searchBox.OnSearchFieldFocus(true)\" onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
+ if (!Config_getBool(HTML_DYNAMIC_MENUS)) // for dynamic menus, menu.js creates this part
+ {
+ t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" placeholder=\"" << theTranslator->trSearch() <<
+ "\" size=\"20\" accesskey=\"S\" onfocus=\"searchBox.OnSearchFieldFocus(true)\" onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
+ }
t << " </form>\n";
t << " </div><div class=\"right\"></div>\n";
t << " </div>\n";
@@ -3087,3 +3269,10 @@ QCString HtmlGenerator::getMathJaxMacros()
{
return getConvertLatexMacro();
}
+
+QCString HtmlGenerator::getNavTreeCss()
+{
+ ResourceMgr &mgr = ResourceMgr::instance();
+ return replaceVariables(mgr.getAsString("navtree.css"));
+}
+
diff --git a/src/htmlgen.h b/src/htmlgen.h
index fc2c8aa..6bb2744 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -84,6 +84,7 @@ class HtmlGenerator : public OutputGenerator
static QCString writeLogoAsString(const QCString &path);
static QCString writeSplitBarAsString(const QCString &name,const QCString &relpath);
static QCString getMathJaxMacros();
+ static QCString getNavTreeCss();
// ---- CodeOutputInterface
void codify(const QCString &text)
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
index 51cf757..847c740 100644
--- a/src/htmlhelp.cpp
+++ b/src/htmlhelp.cpp
@@ -316,6 +316,8 @@ class HtmlHelp::Private
Private() : index(recoder) {}
void createProjectFile();
std::ofstream cts,kts;
+ QCString prevFile;
+ QCString prevAnc;
bool ctsItemPresent = false;
int dc = 0;
StringSet indexFiles;
@@ -330,13 +332,9 @@ class HtmlHelp::Private
* The object has to be \link initialize() initialized\endlink before it can
* be used.
*/
-HtmlHelp::HtmlHelp() : p(std::make_unique<Private>())
-{
-}
-
-HtmlHelp::~HtmlHelp()
-{
-}
+HtmlHelp::HtmlHelp() : p(std::make_unique<Private>()) {}
+HtmlHelp::~HtmlHelp() = default;
+HtmlHelp::HtmlHelp(HtmlHelp &&) = default;
/*! This will create a contents file (index.hhc) and a index file (index.hhk)
* and write the header of those files.
@@ -526,16 +524,6 @@ void HtmlHelp::addContentsItem(bool isDir,
bool /* addToNavIndex */,
const Definition * /* def */)
{
- bool binaryTOC = Config_getBool(BINARY_TOC);
- // If we're using a binary toc then folders cannot have links.
- // Tried this and I didn't see any problems, when not using
- // the resetting of file and anchor the TOC works better
- // (prev / next button)
- //if(Config_getBool(BINARY_TOC) && isDir)
- //{
- //file = 0;
- //anchor = 0;
- //}
p->ctsItemPresent = true;
int i; for (i=0;i<p->dc;i++) p->cts << " ";
p->cts << "<LI><OBJECT type=\"text/sitemap\">";
@@ -552,13 +540,18 @@ void HtmlHelp::addContentsItem(bool isDir,
}
else
{
- if (!(binaryTOC && isDir))
+ QCString currFile = addHtmlExtensionIfMissing(file);
+ QCString currAnc = anchor;
+ p->cts << "<param name=\"Local\" value=\"";
+ p->cts << currFile;
+ if (p->prevFile == currFile && p->prevAnc.isEmpty() && currAnc.isEmpty())
{
- p->cts << "<param name=\"Local\" value=\"";
- p->cts << addHtmlExtensionIfMissing(file);
- if (!anchor.isEmpty()) p->cts << "#" << anchor;
- p->cts << "\">";
+ currAnc = "top";
}
+ if (!currAnc.isEmpty()) p->cts << "#" << currAnc;
+ p->cts << "\">";
+ p->prevFile = currFile;
+ p->prevAnc = currAnc;
}
}
p->cts << "<param name=\"ImageNumber\" value=\"";
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
index a2f3683..28e2682 100644
--- a/src/htmlhelp.h
+++ b/src/htmlhelp.h
@@ -20,16 +20,17 @@
#define HTMLHELP_H
#include <memory>
-#include "index.h"
+#include "qcstring.h"
class Definition;
+class MemberDef;
/** A class that generated the HTML Help specific files.
*
* These files can be used with the Microsoft HTML Help workshop
* to generate compressed HTML files (.chm).
*/
-class HtmlHelp : public IndexIntf
+class HtmlHelp
{
/*! used in imageNumber param of HTMLHelp::addContentsItem() function
to specify document icon in tree view.
@@ -61,6 +62,7 @@ class HtmlHelp : public IndexIntf
//static HtmlHelp *getInstance();
HtmlHelp();
~HtmlHelp();
+ HtmlHelp(HtmlHelp &&);
void initialize();
void finalize();
void incContentsDepth();
diff --git a/src/image.cpp b/src/image.cpp
index 06985df..2589646 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -158,54 +158,13 @@ static Color palette[] =
{ 0x00, 0x00, 0x00, 0xff },
{ 0xff, 0xff, 0xc0, 0xff },
{ 0x9f, 0x9f, 0x60, 0xff },
- { 0x90, 0x00, 0x00, 0xff },
- { 0x00, 0x90, 0x00, 0xff },
- { 0x00, 0x00, 0x90, 0xff },
- { 0xc0, 0xc0, 0xc0, 0xff }
-};
-
-// for alpha we use x^(1/1.3)
-static Color palette2[] =
-{
- { 0x00, 0x00, 0x00, 0x00 },
- { 0x00, 0x00, 0x00, 0x2e },
- { 0x00, 0x00, 0x00, 0x48 },
- { 0x00, 0x00, 0x00, 0x5d },
- { 0x00, 0x00, 0x00, 0x6f },
- { 0x00, 0x00, 0x00, 0x80 },
- { 0x00, 0x00, 0x00, 0x8f },
- { 0x00, 0x00, 0x00, 0x9e },
- { 0x00, 0x00, 0x00, 0xac },
- { 0x00, 0x00, 0x00, 0xb9 },
- { 0x00, 0x00, 0x00, 0xc5 },
- { 0x00, 0x00, 0x00, 0xd2 },
- { 0x00, 0x00, 0x00, 0xdd },
- { 0x00, 0x00, 0x00, 0xe9 },
- { 0x00, 0x00, 0x00, 0xf4 },
- { 0x00, 0x00, 0x00, 0xff }
-};
-
-static Color palette3[] =
-{
- { 0xff, 0xff, 0xff, 0xff },
- { 0xe0, 0xe0, 0xe0, 0xff },
- { 0xd0, 0xd0, 0xd0, 0xff },
+ { 0xa7, 0x38, 0x30, 0xff },
+ { 0x29, 0x70, 0x18, 0xff },
+ { 0x97, 0xCC, 0xE8, 0xff },
{ 0xc0, 0xc0, 0xc0, 0xff },
- { 0xb0, 0xb0, 0xb0, 0xff },
- { 0xa0, 0xa0, 0xa0, 0xff },
- { 0x90, 0x90, 0x90, 0xff },
- { 0x80, 0x80, 0x80, 0xff },
- { 0x70, 0x70, 0x70, 0xff },
- { 0x60, 0x60, 0x60, 0xff },
- { 0x50, 0x50, 0x50, 0xff },
- { 0x40, 0x40, 0x40, 0xff },
- { 0x30, 0x30, 0x30, 0xff },
- { 0x20, 0x20, 0x20, 0xff },
- { 0x10, 0x10, 0x10, 0xff },
- { 0x00, 0x00, 0x00, 0xff }
+ { 0xff, 0xff, 0xff, 0xff }
};
-
Image::Image(uint w,uint h)
{
int hue = Config_getInt(HTML_COLORSTYLE_HUE);
@@ -379,17 +338,14 @@ void Image::fillRect(uint x,uint y,uint width,uint height,uchar colIndex,uint ma
setPixel(xp,yp,colIndex);
}
-bool Image::save(const QCString &fileName,int mode)
+bool Image::save(const QCString &fileName)
{
- bool useTransparency = Config_getBool(FORMULA_TRANSPARENT);
uchar* buffer;
size_t bufferSize;
LodePNG_Encoder encoder;
LodePNG_Encoder_init(&encoder);
- uint numCols = mode==0 ? 8 : 16;
- Color *pPal = mode==0 ? palette :
- useTransparency ? palette2 :
- palette3 ;
+ uint numCols = 9;
+ Color *pPal = palette;
uint i;
for (i=0;i<numCols;i++,pPal++)
{
diff --git a/src/image.h b/src/image.h
index be523c8..e024bb0 100644
--- a/src/image.h
+++ b/src/image.h
@@ -40,7 +40,7 @@ class Image
void drawVertArrow(uint x,uint ys,uint ye,uchar colIndex,uint mask);
void drawRect(uint x,uint y,uint width,uint height,uchar colIndex,uint mask);
void fillRect(uint x,uint y,uint width,uint height,uchar colIndex,uint mask);
- bool save(const QCString &fileName,int mode=0);
+ bool save(const QCString &fileName);
friend uint stringLength(const QCString &s);
uint width() const { return m_width; }
uint height() const { return m_height; }
diff --git a/src/index.cpp b/src/index.cpp
index a0ad1b6..b5a9588 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -25,6 +25,7 @@
#include "message.h"
#include "index.h"
+#include "indexlist.h"
#include "doxygen.h"
#include "config.h"
#include "filedef.h"
@@ -4271,7 +4272,7 @@ static void writeConceptIndex(OutputList &ol)
static void writeUserGroupStubPage(OutputList &ol,LayoutNavEntry *lne)
{
- if (lne->baseFile().left(9)=="usergroup")
+ if (lne->baseFile().startsWith("usergroup"))
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
@@ -4701,6 +4702,10 @@ static std::vector<bool> indexWritten;
static void writeIndexHierarchyEntries(OutputList &ol,const LayoutNavEntryList &entries)
{
+ auto isRef = [](const QCString &s)
+ {
+ return s.startsWith("@ref") || s.startsWith("\\ref");
+ };
bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
for (const auto &lne : entries)
{
@@ -4933,8 +4938,8 @@ static void writeIndexHierarchyEntries(OutputList &ol,const LayoutNavEntryList &
{
url.prepend("^"); // prepend ^ to absolute URL
}
- bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
- Doxygen::indexList->addContentsItem(TRUE,lne->title(),QCString(),url,QCString(),FALSE,isRef || isRelative);
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),QCString(),
+ url,QCString(),FALSE,isRef(lne->baseFile()) || isRelative);
}
break;
case LayoutNavEntry::UserGroup:
@@ -4954,8 +4959,8 @@ static void writeIndexHierarchyEntries(OutputList &ol,const LayoutNavEntryList &
{
url.prepend("^"); // prepend ^ to absolute URL
}
- bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
- Doxygen::indexList->addContentsItem(TRUE,lne->title(),QCString(),url,QCString(),FALSE,isRef || isRelative);
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),QCString(),
+ url,QCString(),FALSE,isRef(lne->baseFile()) || isRelative);
}
}
else
diff --git a/src/index.h b/src/index.h
index 30d6e5f..2b07c73 100644
--- a/src/index.h
+++ b/src/index.h
@@ -16,110 +16,13 @@
#ifndef INDEX_H
#define INDEX_H
-#include <utility>
-#include <vector>
-#include <memory>
-#include <mutex>
-
#include "qcstring.h"
class Definition;
+class OutputList;
class DefinitionMutable;
class NamespaceDef;
class MemberDef;
-class OutputList;
-
-/** \brief Abstract interface for index generators. */
-class IndexIntf
-{
- public:
- virtual ~IndexIntf() = default;
- virtual void initialize() = 0;
- virtual void finalize() = 0;
- virtual void incContentsDepth() = 0;
- virtual void decContentsDepth() = 0;
- virtual void addContentsItem(bool isDir, const QCString &name, const QCString &ref,
- const QCString &file, const QCString &anchor, bool separateIndex,
- bool addToNavIndex,const Definition *def) = 0;
- virtual void addIndexItem(const Definition *context,const MemberDef *md,
- const QCString &sectionAnchor,const QCString &title) = 0;
- virtual void addIndexFile(const QCString &name) = 0;
- virtual void addImageFile(const QCString &name) = 0;
- virtual void addStyleSheetFile(const QCString &name) = 0;
-};
-
-/** \brief A list of index interfaces.
- *
- * This class itself implements all methods of IndexIntf and
- * just forwards the calls to all items in the list (composite design pattern).
- */
-class IndexList : public IndexIntf
-{
- private:
- std::vector< std::unique_ptr<IndexIntf> > m_intfs;
-
- // For each index format we forward the method call.
- // We use C++11 variadic templates and perfect forwarding to implement foreach() generically,
- // and split the types of the methods from the arguments passed to allow implicit conversions.
- template<class... Ts,class... As>
- void foreach(void (IndexIntf::*methodPtr)(Ts...),As&&... args)
- {
- for (const auto &intf : m_intfs)
- {
- (intf.get()->*methodPtr)(std::forward<As>(args)...);
- }
- }
- // For each version with locking
- template<class... Ts,class... As>
- void foreach_locked(void (IndexIntf::*methodPtr)(Ts...),As&&... args)
- {
- std::lock_guard<std::mutex> lock(m_mutex);
- foreach(methodPtr,std::forward<As>(args)...);
- }
-
- public:
- /** Creates a list of indexes */
- IndexList() { m_enabled=TRUE; }
-
- /** Add an index generator to the list, using a syntax similar to std::make_unique<T>() */
- template<class T,class... As>
- void addIndex(As&&... args)
- { m_intfs.push_back(std::make_unique<T>(std::forward<As>(args)...)); }
-
- void disable()
- { m_enabled = FALSE; }
- void enable()
- { m_enabled = TRUE; }
- bool isEnabled() const
- { return m_enabled; }
-
- // IndexIntf implementation
- void initialize()
- { foreach(&IndexIntf::initialize); }
- void finalize()
- { foreach(&IndexIntf::finalize); }
- void incContentsDepth()
- { if (m_enabled) foreach_locked(&IndexIntf::incContentsDepth); }
- void decContentsDepth()
- { if (m_enabled) foreach_locked(&IndexIntf::decContentsDepth); }
- void addContentsItem(bool isDir, const QCString &name, const QCString &ref,
- const QCString &file, const QCString &anchor,bool separateIndex=FALSE,bool addToNavIndex=FALSE,
- const Definition *def=0)
- { if (m_enabled) foreach_locked(&IndexIntf::addContentsItem,isDir,name,ref,file,anchor,separateIndex,addToNavIndex,def); }
- void addIndexItem(const Definition *context,const MemberDef *md,const QCString &sectionAnchor=QCString(),const QCString &title=QCString())
- { if (m_enabled) foreach_locked(&IndexIntf::addIndexItem,context,md,sectionAnchor,title); }
- void addIndexFile(const QCString &name)
- { if (m_enabled) foreach_locked(&IndexIntf::addIndexFile,name); }
- void addImageFile(const QCString &name)
- { if (m_enabled) foreach_locked(&IndexIntf::addImageFile,name); }
- void addStyleSheetFile(const QCString &name)
- { if (m_enabled) foreach_locked(&IndexIntf::addStyleSheetFile,name); }
-
- private:
- bool m_enabled;
- std::mutex m_mutex;
-};
-
enum IndexSections
{
diff --git a/src/indexlist.h b/src/indexlist.h
new file mode 100644
index 0000000..50385db
--- /dev/null
+++ b/src/indexlist.h
@@ -0,0 +1,134 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2021 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef INDEXLIST_H
+#define INDEXLIST_H
+
+#include <utility>
+#include <vector>
+#include <memory>
+#include <mutex>
+#include <variant>
+
+#include "qcstring.h"
+#include "dispatcher.h"
+
+#include "docsets.h"
+#include "eclipsehelp.h"
+#include "ftvhelp.h"
+#include "htmlhelp.h"
+#include "qhp.h"
+
+class Definition;
+class MemberDef;
+class OutputList;
+
+/** Namespace containing typed wrappers to refer to member functions for each method of the indices using a fixed `method` static variable.
+ * Based on this idea https://stackoverflow.com/a/71357544/784672
+ */
+namespace IndexIntf
+{
+ template <class T> struct initialize { static constexpr auto method = &T::initialize; };
+ template <class T> struct finalize { static constexpr auto method = &T::finalize; };
+ template <class T> struct incContentsDepth { static constexpr auto method = &T::incContentsDepth; };
+ template <class T> struct decContentsDepth { static constexpr auto method = &T::decContentsDepth; };
+ template <class T> struct addContentsItem { static constexpr auto method = &T::addContentsItem; };
+ template <class T> struct addIndexItem { static constexpr auto method = &T::addIndexItem; };
+ template <class T> struct addIndexFile { static constexpr auto method = &T::addIndexFile; };
+ template <class T> struct addImageFile { static constexpr auto method = &T::addImageFile; };
+ template <class T> struct addStyleSheetFile { static constexpr auto method = &T::addStyleSheetFile; };
+}
+
+/** \brief A list of index interfaces.
+ *
+ * This class itself implements all methods of IndexIntf and
+ * just forwards the calls to all items in the list (composite design pattern).
+ */
+class IndexList
+{
+ using IndexVariant = std::variant<DocSets, EclipseHelp, FTVHelp, HtmlHelp, Qhp>;
+
+ template<template <class> class IndexT, class... As>
+ void foreach(As&&... args)
+ {
+ for (auto &v : m_indices)
+ {
+ dispatch_call<IndexT>(v,std::forward<As>(args)...);
+ }
+ }
+ template<template <class> class IndexT, class... As>
+ void foreach_locked(As&&... args)
+ {
+ std::lock_guard<std::mutex> lock(m_mutex);
+ for (auto &v : m_indices)
+ {
+ dispatch_call<IndexT>(v,std::forward<As>(args)...);
+ }
+ }
+
+ public:
+ /** disable the indices */
+ void disable()
+ { m_enabled = FALSE; }
+
+ /** enable the indices */
+ void enable()
+ { m_enabled = TRUE; }
+
+ /** returns true iff the indices are enabled */
+ bool isEnabled() const
+ { return m_enabled; }
+
+ /** Add an index generator to the list, using a syntax similar to std::make_unique<T>() */
+ template<class T,class... As>
+ void addIndex(As&&... args)
+ { m_indices.push_back(std::move(T{std::forward<As>(args)...})); }
+
+ void initialize()
+ { foreach<IndexIntf::initialize>(); }
+
+ void finalize()
+ { foreach<IndexIntf::finalize>(); }
+
+ void incContentsDepth()
+ { if (m_enabled) foreach_locked<IndexIntf::incContentsDepth>(); }
+
+ void decContentsDepth()
+ { if (m_enabled) foreach_locked<IndexIntf::decContentsDepth>(); }
+
+ void addContentsItem(bool isDir, const QCString &name, const QCString &ref,
+ const QCString &file, const QCString &anchor,bool separateIndex=FALSE,bool addToNavIndex=FALSE,
+ const Definition *def=0)
+ { if (m_enabled) foreach_locked<IndexIntf::addContentsItem>(isDir,name,ref,file,anchor,separateIndex,addToNavIndex,def); }
+
+ void addIndexItem(const Definition *context,const MemberDef *md,const QCString &sectionAnchor=QCString(),const QCString &title=QCString())
+ { if (m_enabled) foreach_locked<IndexIntf::addIndexItem>(context,md,sectionAnchor,title); }
+
+ void addIndexFile(const QCString &name)
+ { if (m_enabled) foreach_locked<IndexIntf::addIndexFile>(name); }
+
+ void addImageFile(const QCString &name)
+ { if (m_enabled) foreach_locked<IndexIntf::addImageFile>(name); }
+
+ void addStyleSheetFile(const QCString &name)
+ { if (m_enabled) foreach_locked<IndexIntf::addStyleSheetFile>(name); }
+
+ private:
+ bool m_enabled = true;
+ std::mutex m_mutex;
+ std::vector<IndexVariant> m_indices;
+};
+
+#endif // INDEXLIST_H
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 2b48c3c..feb4f93 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -378,11 +378,8 @@ void LatexDocVisitor::operator()(const DocStyleChange &s)
break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- if (!s.enable()) m_t << "\n\n";
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
- if (s.enable()) m_t << "{\\bfseries{"; else m_t << "}}";
+ if (s.enable()) m_t << "{\\bfseries{"; else m_t << "}}\\newline";
break;
}
}
@@ -1412,6 +1409,14 @@ void LatexDocVisitor::operator()(const DocHRef &href)
m_t << "}}";
}
+void LatexDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ m_t << "\n\n";
+ visitChildren(d);
+ m_t << "\n\n";
+}
+
void LatexDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
@@ -1426,7 +1431,7 @@ void LatexDocVisitor::operator()(const DocImage &img)
{
if (m_hide) return;
QCString gfxName = img.name();
- if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
+ if (gfxName.endsWith(".eps") || gfxName.endsWith(".pdf"))
{
gfxName=gfxName.left(gfxName.length()-4);
}
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
index 8ce8524..fcd7f12 100644
--- a/src/latexdocvisitor.h
+++ b/src/latexdocvisitor.h
@@ -80,6 +80,7 @@ class LatexDocVisitor : public DocVisitor
void operator()(const DocHtmlCell &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 33087a0..c5f436c 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -337,7 +337,7 @@ static void writeLatexMakefile()
}
t << "\techo \"Rerunning latex....\"\n"
<< "\t$(LATEX_CMD) $(MANUAL_FILE).tex\n"
- << "\tlatex_count=%(LATEX_COUNT) ; \\\n"
+ << "\tlatex_count=$(LATEX_COUNT) ; \\\n"
<< "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\\\n"
<< "\t do \\\n"
<< "\t echo \"Rerunning latex....\" ;\\\n"
@@ -565,7 +565,7 @@ void LatexGenerator::startFile(const QCString &name,const QCString &,const QCStr
#endif
QCString fileName=name;
m_relPath = relativePathToRoot(fileName);
- if (fileName.right(4)!=".tex" && fileName.right(4)!=".sty") fileName+=".tex";
+ if (!fileName.endsWith(".tex") && !fileName.endsWith(".sty")) fileName+=".tex";
startPlainFile(fileName);
m_codeGen.setRelativePath(m_relPath);
m_codeGen.setSourceFileName(stripPath(fileName));
@@ -693,10 +693,12 @@ static QCString substituteLatexKeywords(const QCString &str,
copyFile(formulaMacrofile,Config_getString(LATEX_OUTPUT) + "/" + stripMacroFile);
}
+ QCString projectNumber = Config_getString(PROJECT_NUMBER);
+
// first substitute generic keywords
QCString result = substituteKeywords(str,title,
convertToLaTeX(Config_getString(PROJECT_NAME)),
- convertToLaTeX(Config_getString(PROJECT_NUMBER)),
+ convertToLaTeX(projectNumber),
convertToLaTeX(Config_getString(PROJECT_BRIEF)));
// additional LaTeX only keywords
@@ -726,6 +728,7 @@ static QCString substituteLatexKeywords(const QCString &str,
result = selectBlock(result,"LATEX_BATCHMODE",latexBatchmode,OutputGenerator::Latex);
result = selectBlock(result,"LATEX_FONTENC",!latexFontenc.isEmpty(),OutputGenerator::Latex);
result = selectBlock(result,"FORMULA_MACROFILE",!formulaMacrofile.isEmpty(),OutputGenerator::Latex);
+ result = selectBlock(result,"PROJECT_NUMBER",!projectNumber.isEmpty(),OutputGenerator::Latex);
result = removeEmptyLines(result);
diff --git a/src/layout.cpp b/src/layout.cpp
index ce7110b..ad8393a 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -139,11 +139,11 @@ QCString LayoutNavEntry::url() const
{
QCString url = baseFile().stripWhiteSpace();
if ((kind()!=LayoutNavEntry::User && kind()!=LayoutNavEntry::UserGroup) ||
- (kind()==LayoutNavEntry::UserGroup && url.left(9)=="usergroup"))
+ (kind()==LayoutNavEntry::UserGroup && url.startsWith("usergroup")))
{
url = addHtmlExtensionIfMissing(url);
}
- else if (url.left(5)=="@ref " || url.left(5)=="\\ref ")
+ else if (url.startsWith("@ref ") || url.startsWith("\\ref "))
{
const Definition *d = 0;
QCString anchor;
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
index 3995007..a1ae522 100644
--- a/src/mandocvisitor.cpp
+++ b/src/mandocvisitor.cpp
@@ -188,16 +188,8 @@ void ManDocVisitor::operator()(const DocStyleChange &s)
break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- if (!s.enable())
- {
- if (!m_firstCol) m_t << "\n";
- m_t << ".PP\n";
- m_firstCol=TRUE;
- }
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
- if (s.enable()) m_t << "\\fB"; else m_t << "\\fP";
+ if (s.enable()) m_t << "\\fB"; else m_t << "\\fP\n.PP\n";
m_firstCol=FALSE;
break;
}
@@ -784,6 +776,22 @@ void ManDocVisitor::operator()(const DocHRef &href)
m_t << "\\fP";
}
+void ManDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ if (!m_firstCol)
+ {
+ m_t << "\n";
+ m_t << ".PP\n";
+ }
+ m_t << ".RS 4\n"; // TODO: add support for nested detailes sections
+ visitChildren(d);
+ if (!m_firstCol) m_t << "\n";
+ m_t << ".RE\n";
+ m_t << ".PP\n";
+ m_firstCol=TRUE;
+}
+
void ManDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h
index 96910bd..43fd19f 100644
--- a/src/mandocvisitor.h
+++ b/src/mandocvisitor.h
@@ -81,6 +81,7 @@ class ManDocVisitor : public DocVisitor
void operator()(const DocHtmlCell &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 27484ce..7e69459 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -627,7 +627,7 @@ void ManGenerator::endSection(const QCString &,SectionType type)
}
else
{
- m_t << "\n";
+ m_t << "\n.PP\n";
m_firstCol=TRUE;
m_paragraph=FALSE;
m_inHeader=FALSE;
diff --git a/src/markdown.cpp b/src/markdown.cpp
index 350863b..c2c0585 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -311,6 +311,8 @@ static QCString escapeSpecialChars(const QCString &s)
case '\\': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('\\'); break;
case '@': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('@'); break;
case '#': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('#'); break;
+ case '$': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('$'); break;
+ case '&': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('&'); break;
default: growBuf.addChar(c); break;
}
pc=c;
@@ -432,8 +434,10 @@ QCString Markdown::isBlockCommand(const char *data,int offset,int size)
{
{ "dot", getEndBlock },
{ "code", getEndCode },
+ { "icode", getEndBlock },
{ "msc", getEndBlock },
{ "verbatim", getEndBlock },
+ { "iverbatim", getEndBlock },
{ "iliteral", getEndBlock },
{ "latexonly", getEndBlock },
{ "htmlonly", getEndBlock },
@@ -2765,7 +2769,7 @@ int Markdown::writeCodeBlock(const char *data,int size,int refIndent)
int i=0,end;
//printf("writeCodeBlock: data={%s}\n",qPrint(QCString(data).left(size)));
// no need for \ilinebr here as the previous line was empty and was skipped
- m_out.addStr("@verbatim\n");
+ m_out.addStr("@iverbatim\n");
int emptyLines=0;
while (i<size)
{
@@ -2799,7 +2803,7 @@ int Markdown::writeCodeBlock(const char *data,int size,int refIndent)
break;
}
}
- m_out.addStr("@endverbatim\\ilinebr ");
+ m_out.addStr("@endiverbatim\\ilinebr ");
while (emptyLines>0) // write skipped empty lines
{
// add empty line
@@ -2899,13 +2903,13 @@ void Markdown::writeFencedCodeBlock(const char *data,const char *lng,
blockStart--;
blockEnd--;
}
- m_out.addStr("@code");
+ m_out.addStr("@icode");
if (!lang.isEmpty())
{
m_out.addStr("{"+lang+"}");
}
addStrEscapeUtf8Nbsp(data+blockStart,blockEnd-blockStart);
- m_out.addStr("@endcode");
+ m_out.addStr("@endicode");
}
QCString Markdown::processQuotations(const QCString &s,int refIndent)
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 9e116b9..5456d97 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -320,7 +320,7 @@ class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
virtual void writeMemberDocSimple(OutputList &ol,const Definition *container) const;
virtual void writeEnumDeclaration(OutputList &typeDecl,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd) const;
- virtual void writeTagFile(TextStream &) const;
+ virtual void writeTagFile(TextStream &,bool useQualifiedName) const;
virtual void warnIfUndocumented() const;
virtual void warnIfUndocumentedParams() const;
virtual bool visibleInIndex() const;
@@ -1353,7 +1353,7 @@ void MemberDefImpl::IMPL::init(Definition *d,
hasDocumentedParams = FALSE;
hasDocumentedReturnType = FALSE;
docProvider = 0;
- isDMember = d->getDefFileName().right(2).lower()==".d";
+ isDMember = d->getDefFileName().lower().endsWith(".d");
}
@@ -1841,8 +1841,6 @@ ClassDef *MemberDefImpl::getClassDefOfAnonymousType() const
cname=getNamespaceDef()->name();
}
QCString ltype(m_impl->type);
- // strip 'static' keyword from ltype
- //if (ltype.left(7)=="static ") ltype=ltype.right(ltype.length()-7);
// strip 'friend' keyword from ltype
ltype.stripPrefix("friend ");
@@ -3708,7 +3706,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
static QCString simplifyTypeForTable(const QCString &s)
{
QCString ts=removeAnonymousScopes(s);
- if (ts.right(2)=="::") ts = ts.left(ts.length()-2);
+ if (ts.endsWith("::")) ts = ts.left(ts.length()-2);
static const reg::Ex re1(R"(\a\w*::)"); // non-template version
static const reg::Ex re2(R"(\a\w*<[^>]*>::)"); // template version
reg::Match match;
@@ -3801,6 +3799,11 @@ void MemberDefImpl::writeMemberDocSimple(OutputList &ol, const Definition *conta
{
linkifyText(TextGeneratorOLImpl(ol),getOuterScope(),getBodyDef(),this,m_impl->bitfields);
}
+ if (hasOneLineInitializer() && !isDefine())
+ {
+ ol.writeString(" ");
+ linkifyText(TextGeneratorOLImpl(ol),getOuterScope(),getBodyDef(),this,m_impl->initializer.simplifyWhiteSpace());
+ }
ol.endInlineMemberName();
ol.startInlineMemberDoc();
@@ -4003,14 +4006,14 @@ void MemberDefImpl::warnIfUndocumentedParams() const
bool isFortran = getLanguage()==SrcLangExt_Fortran;
bool isFortranSubroutine = isFortran && returnType.find("subroutine")!=-1;
- bool isVoidReturn = (returnType=="void") || (returnType.right(5)==" void");
+ bool isVoidReturn = (returnType=="void") || (returnType.endsWith(" void"));
if (!isVoidReturn && returnType == "auto")
{
const ArgumentList &defArgList=isDocsForDefinition() ? argumentList() : declArgumentList();
if (!defArgList.trailingReturnType().isEmpty())
{
QCString strippedTrailingReturn = stripTrailingReturn(defArgList.trailingReturnType());
- isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.right(5)==" void");
+ isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.endsWith(" void"));
}
}
if (!Config_getBool(EXTRACT_ALL) &&
@@ -4182,7 +4185,7 @@ MemberDefMutable *MemberDefImpl::createTemplateInstanceMember(
}
QCString methodName=name();
- if (methodName.left(9)=="operator ") // conversion operator
+ if (methodName.startsWith("operator ")) // conversion operator
{
methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs);
}
@@ -4325,7 +4328,7 @@ Specifier MemberDefImpl::virtualness(int count) const
return v;
}
-void MemberDefImpl::writeTagFile(TextStream &tagFile) const
+void MemberDefImpl::writeTagFile(TextStream &tagFile,bool useQualifiedName) const
{
if (!isLinkableInProject()) return;
tagFile << " <member kind=\"";
@@ -4370,7 +4373,7 @@ void MemberDefImpl::writeTagFile(TextStream &tagFile) const
{
tagFile << " <type>" << convertToXML(typeString()) << "</type>\n";
}
- tagFile << " <name>" << convertToXML(name()) << "</name>\n";
+ tagFile << " <name>" << convertToXML(useQualifiedName ? qualifiedName() : name()) << "</name>\n";
tagFile << " <anchorfile>" << addHtmlExtensionIfMissing(getOutputFileBase()) << "</anchorfile>\n";
tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>\n";
QCString idStr = id();
diff --git a/src/memberdef.h b/src/memberdef.h
index 9b6e30d..d7e9751 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -417,7 +417,7 @@ class MemberDefMutable : public DefinitionMutable, public MemberDef
bool inGroup,bool showEnumValues=FALSE,bool
showInline=FALSE) const = 0;
virtual void writeMemberDocSimple(OutputList &ol,const Definition *container) const = 0;
- virtual void writeTagFile(TextStream &) const = 0;
+ virtual void writeTagFile(TextStream &,bool useQualifiedName) const = 0;
virtual void writeLink(OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
bool onlyText=FALSE) const = 0;
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 809308a..28521d0 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -270,9 +270,9 @@ void MemberGroup::setRefItems(const RefItemVector &sli)
m_xrefListItems.insert(m_xrefListItems.end(), sli.cbegin(), sli.cend());
}
-void MemberGroup::writeTagFile(TextStream &tagFile)
+void MemberGroup::writeTagFile(TextStream &tagFile,bool qualifiedName)
{
- memberList->writeTagFile(tagFile);
+ memberList->writeTagFile(tagFile,qualifiedName);
}
//--------------------------------------------------------------------------
diff --git a/src/membergroup.h b/src/membergroup.h
index 5d1c78e..5f51d09 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -59,7 +59,7 @@ class MemberGroup
const Definition *container,bool showEnumValues,bool showInline) const;
void writeDocumentationPage(OutputList &ol,const QCString &scopeName,
const DefinitionMutable *container) const;
- void writeTagFile(TextStream &);
+ void writeTagFile(TextStream &,bool qualifiedName=false);
void addGroupedInheritedMembers(OutputList &ol,const ClassDef *cd,
MemberListType lt,
const ClassDef *inheritedFrom,const QCString &inheritId) const;
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 4a062e5..8632ddf 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -937,7 +937,7 @@ QCString MemberList::listTypeAsString(MemberListType type)
return "";
}
-void MemberList::writeTagFile(TextStream &tagFile)
+void MemberList::writeTagFile(TextStream &tagFile,bool useQualifiedName)
{
for (const auto &imd : m_members)
{
@@ -946,7 +946,7 @@ void MemberList::writeTagFile(TextStream &tagFile)
{
if (md->getLanguage()!=SrcLangExt_VHDL)
{
- md->writeTagFile(tagFile);
+ md->writeTagFile(tagFile,useQualifiedName);
if (md->memberType()==MemberType_Enumeration && !md->isStrong())
{
for (const auto &ivmd : md->enumFieldList())
@@ -954,7 +954,7 @@ void MemberList::writeTagFile(TextStream &tagFile)
MemberDefMutable *vmd = toMemberDefMutable(ivmd);
if (vmd)
{
- vmd->writeTagFile(tagFile);
+ vmd->writeTagFile(tagFile,useQualifiedName);
}
}
}
@@ -967,7 +967,7 @@ void MemberList::writeTagFile(TextStream &tagFile)
}
for (const auto &mg : m_memberGroupRefList)
{
- mg->writeTagFile(tagFile);
+ mg->writeTagFile(tagFile,useQualifiedName);
}
}
diff --git a/src/memberlist.h b/src/memberlist.h
index 2f207c6..2cf265c 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -109,7 +109,7 @@ class MemberList : public MemberVector
void writeSimpleDocumentation(OutputList &ol,const Definition *container) const;
void writeDocumentationPage(OutputList &ol,
const QCString &scopeName, const DefinitionMutable *container) const;
- void writeTagFile(TextStream &);
+ void writeTagFile(TextStream &,bool useQualifiedName=false);
bool declVisible() const;
void addMemberGroup(MemberGroup *mg);
void addListReferences(Definition *def);
diff --git a/src/msc.cpp b/src/msc.cpp
index b05edfd..8a99e95 100644
--- a/src/msc.cpp
+++ b/src/msc.cpp
@@ -22,7 +22,7 @@
#include "docparser.h"
#include "docnode.h"
#include "doxygen.h"
-#include "index.h"
+#include "indexlist.h"
#include "util.h"
#include "mscgen_api.h"
#include "dir.h"
diff --git a/src/outputlist.h b/src/outputlist.h
index ae143f8..7023019 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -20,7 +20,6 @@
#include <vector>
#include <memory>
-#include "index.h" // for IndexSections
#include "outputgen.h"
#include "searchindex.h" // for SIDataCollection
#include "doxygen.h"
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index 8100d30..f413d1a 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -336,6 +336,7 @@ class PerlModDocVisitor : public DocVisitor
void operator()(const DocHtmlCaption &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
@@ -625,9 +626,6 @@ void PerlModDocVisitor::operator()(const DocStyleChange &s)
case DocStyleChange::Preformatted: style = "preformatted"; break;
case DocStyleChange::Div: style = "div"; break;
case DocStyleChange::Span: style = "span"; break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- style = "details";
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
style = "summary";
break;
@@ -1033,6 +1031,15 @@ void PerlModDocVisitor::operator()(const DocHRef &href)
#endif
}
+void PerlModDocVisitor::operator()(const DocHtmlDetails &details)
+{
+ openItem("details");
+ openSubBlock("content");
+ visitChildren(details);
+ closeSubBlock();
+ closeItem();
+}
+
void PerlModDocVisitor::operator()(const DocHtmlHeader &header)
{
#if 0
@@ -1474,6 +1481,7 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
case MemberType_Dictionary: memType="dictionary"; break;
}
+ bool isFortran = md->getLanguage()==SrcLangExt_Fortran;
name = md->name();
if (md->isAnonymous()) name = "__unnamed" + name.right(name.length() - 1)+"__";
@@ -1517,7 +1525,9 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name)
m_output.addFieldQuotedString("definition_name", defArg->name);
- if (!a.type.isEmpty())
+ if (isFortran && defArg && !defArg->type.isEmpty())
+ m_output.addFieldQuotedString("type", defArg->type);
+ else if (!a.type.isEmpty())
m_output.addFieldQuotedString("type", a.type);
if (!a.array.isEmpty())
diff --git a/src/plantuml.cpp b/src/plantuml.cpp
index 33c7d1e..90dcec2 100644
--- a/src/plantuml.cpp
+++ b/src/plantuml.cpp
@@ -22,6 +22,7 @@
#include "debug.h"
#include "fileinfo.h"
#include "dir.h"
+#include "indexlist.h"
QCString PlantumlManager::writePlantUMLSource(const QCString &outDirArg,const QCString &fileName,
const QCString &content,OutputFormat format, const QCString &engine,
diff --git a/src/plantuml.h b/src/plantuml.h
index e3809d7..7594339 100644
--- a/src/plantuml.h
+++ b/src/plantuml.h
@@ -49,16 +49,16 @@ class PlantumlManager
void run();
/** Write a PlantUML compatible file.
- * @param[in] outDir the output directory to write the file to.
- * @param[in] fileName the name of the file. If empty a name will be chosen automatically.
- * @param[in] content the contents of the PlantUML file.
- * @param[in] format the image format to generate.
- * @param[in] engine the plantuml engine to use.
- * @param[in] srcFile the source file resulting in the write command.
- * @param[in] srcLine the line number resulting in the write command.
+ * @param[in] outDirArg the output directory to write the file to.
+ * @param[in] fileName the name of the file. If empty a name will be chosen automatically.
+ * @param[in] content the contents of the PlantUML file.
+ * @param[in] format the image format to generate.
+ * @param[in] engine the plantuml engine to use.
+ * @param[in] srcFile the source file resulting in the write command.
+ * @param[in] srcLine the line number resulting in the write command.
* @returns The name of the generated file.
*/
- QCString writePlantUMLSource(const QCString &outDir,const QCString &fileName,
+ QCString writePlantUMLSource(const QCString &outDirArg,const QCString &fileName,
const QCString &content, OutputFormat format,
const QCString &engine,const QCString &srcFile,
int srcLine);
diff --git a/src/post_lex.py b/src/post_lex.py
new file mode 100644
index 0000000..459a1e8
--- /dev/null
+++ b/src/post_lex.py
@@ -0,0 +1,94 @@
+#!/usr/bin/python
+# python script to correct the linenumbers due to inclusion of common parts in lex files
+#
+# Copyright (C) 1997-2022 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+import sys
+import os
+import re
+
+def main():
+ if len(sys.argv)!=6:
+ sys.exit('Usage: {0} <input_cpp_file> <output_cpp_file> <correction_file> <original_lex_file> <generated_lex_file>'.format(sys.argv[0]))
+
+ inp_cpp_file, out_cpp_file, corr_cpp_file, org_lex, gen_lex = sys.argv[1:]
+
+ quoted_inp_cpp_file = '"' + inp_cpp_file + '"'
+ quoted_gen_lex = '"' + gen_lex + '"'
+
+ corr_list = []
+ if (os.path.exists(corr_cpp_file)):
+ # read correction file as list of tuples
+ with open(corr_cpp_file,"r") as corr_file:
+ corr_list = [tuple(map(int, line.split(' '))) for line in corr_file]
+
+ if (os.path.exists(inp_cpp_file)):
+ with open(out_cpp_file,"w") as out_file:
+ rule_correction = False
+ with open(inp_cpp_file) as in_file:
+ for line in in_file:
+ # helper function to find the correction needed for the given line number
+ def get_line_correction(line_no):
+ corr_cnt = 0
+ for elem in corr_list:
+ if elem[0] <= line_no:
+ corr_cnt = elem[1]
+ return corr_cnt
+
+ if re.search(r'^#line ', line): # statement added by C-preprocessing
+ inc_line, inc_file = line.split()[1:3]
+ if inc_file == quoted_gen_lex:
+ line_cnt = int(inc_line)
+ line_cnt -= get_line_correction(line_cnt) # adjust line number
+ out_file.write("#line {0} \"{1}\"\n".format(line_cnt,org_lex))
+ else:
+ out_file.write(line)
+ elif re.search(r'^ /\* #line ', line): # statement added by lex-preprocessing
+ inc_line, inc_file = line.split()[2:4] # first token is `/*` part
+ out_file.write("#line {0} \"{1}\"\n".format(inc_line,inc_file))
+ elif re.search(r'static .* yy_rule_linenum', line): # linenum table generated in debug mode (flex -d)
+ out_file.write(line)
+ rule_correction = True
+ # read next lines till } and correct numbers
+ # Assumption structure is like:
+ # static const flex_int16_t yy_rule_linenum[26] =
+ # { 0,
+ # 981, 985, 989, 995, 1093, 1151, 1153, 1154, 1179, 1182,
+ # 1195, 1198, 1201, 1207, 1211, 1214, 1217, 1223, 1226, 1228,
+ # 1230, 1235, 1236, 1237, 1238
+ # } ;
+ elif rule_correction:
+ if re.search(r'{', line): # start of yy_rule_linenum array
+ out_file.write(line)
+ elif re.search(r'}', line): # end of yy_rule_linenum array
+ out_file.write(line)
+ rule_correction = False
+ else: # inside the table
+ out_file.write(" ")
+ out_list = []
+ rule_list = line.replace(',',' ').split()
+ for rule_cnt in rule_list:
+ rule_num = int(rule_cnt)
+ rule_num -= get_line_correction(rule_num)
+ out_list.append("{0:5d}".format(rule_num))
+ out_file.write(','.join(out_list));
+ if re.search(r',$', line): # re-add trailing comma
+ out_file.write(",")
+ out_file.write("\n")
+ else: # normal line -> just copy
+ out_file.write(line)
+ else: # input file does not exist
+ sys.exit("Input cpp file '{0}' does not exist.".format(sys.argv[1]))
+ exit(1)
+
+if __name__ == '__main__':
+ main()
diff --git a/src/pre.l b/src/pre.l
index ca46efb..d3ae106 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -476,7 +476,9 @@ WSopt [ \t\r]*
BEGIN(CopyLine);
}
<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"{B}*\n | // function list macro with one (...) argument, e.g. for K_GLOBAL_STATIC_WITH_ARGS
-<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"{B}*\n { // function like macro
+<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"{B}*\n | // function like macro
+<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"/{B}*("//"|"/\*") | // function list macro with one (...) argument followed by comment
+<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"/{B}*("//"|"/\*") { // function like macro followed by comment
bool skipFuncMacros = Config_getBool(SKIP_FUNCTION_MACROS);
QCString name(yytext);
int pos = name.find('(');
@@ -495,8 +497,12 @@ WSopt [ \t\r]*
)
)
{
- outputChar(yyscanner,'\n');
- yyextra->yyLineNr++;
+ // Only when ends on \n
+ if (yytext[yyleng-1] == '\n')
+ {
+ outputChar(yyscanner,'\n');
+ yyextra->yyLineNr++;
+ }
}
else // don't skip
{
@@ -628,7 +634,6 @@ WSopt [ \t\r]*
if ((yyextra->includeStack.empty() || yyextra->curlyCount>0) &&
yyextra->macroExpansion &&
(def=isDefined(yyscanner,yytext)) &&
- /*(def->isPredefined || macroIsAccessible(def)) && */
(!yyextra->expandOnlyPredef || def->isPredefined)
)
{
@@ -637,7 +642,9 @@ WSopt [ \t\r]*
yyextra->defArgsStr=yytext;
if (def->nargs==-1) // no function macro
{
- QCString result = def->isPredefined ? def->definition : expandMacro(yyscanner,yyextra->defArgsStr);
+ QCString result = def->isPredefined && !def->expandAsDefined ?
+ def->definition :
+ expandMacro(yyscanner,yyextra->defArgsStr);
outputString(yyscanner,result);
}
else // zero or more arguments
@@ -657,11 +664,12 @@ WSopt [ \t\r]*
yyextra->macroExpansion &&
(def=isDefined(yyscanner,yytext)) &&
def->nargs==-1 &&
- /*(def->isPredefined || macroIsAccessible(def)) &&*/
(!yyextra->expandOnlyPredef || def->isPredefined)
)
{
- QCString result=def->isPredefined ? def->definition : expandMacro(yyscanner,yytext);
+ QCString result=def->isPredefined && !def->expandAsDefined ?
+ def->definition :
+ expandMacro(yyscanner,yytext);
outputString(yyscanner,result);
}
else
@@ -1395,7 +1403,7 @@ WSopt [ \t\r]*
{
if (yyextra->ccomment)
{
- outputArray(yyscanner,"/** ",4);
+ outputArray(yyscanner,"/** ",4); // */
}
BEGIN(yyextra->condCtx);
}
@@ -2058,7 +2066,7 @@ static QCString extractTrailingComment(const QCString &s)
{
i++;
}
- // only /*!< or /**< are treated as a comment for the macro name,
+ // only /*!< ... */ or /**< ... */ are treated as a comment for the macro name,
// otherwise the comment is treated as part of the macro definition
return ((s[i+1]=='*' || s[i+1]=='!') && s[i+2]=='<') ? &s[i-1] : "";
}
@@ -2557,6 +2565,7 @@ static int getNextId(const QCString &expr,int p,int *l)
*/
static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,int pos,int level)
{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
//printf(">expandExpression(expr='%s',rest='%s',pos=%d,level=%d)\n",qPrint(expr),rest ? qPrint(*rest) : "", pos, level);
if (expr.isEmpty())
@@ -2590,6 +2599,9 @@ static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,in
if (state->expandedDict.find(macroName.str())==state->expandedDict.end()) // expand macro
{
Define *def=isDefined(yyscanner,macroName);
+ // In case EXPAND_ONLY_PREDEF is enabled prevent expansion unless the macro was explicitly
+ // predefined
+ if (yyextra->expandOnlyPredef && def && !def->isPredefined) def=nullptr;
if (macroName=="defined")
{
//printf("found defined inside macro definition '%s'\n",qPrint(expr.right(expr.length()-p)));
@@ -2642,10 +2654,10 @@ static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,in
expanded = expandExpression(yyscanner,resultExpr,&restExpr,0,level+1);
state->expandedDict.erase(toStdString(macroName));
}
- else if (def && def->nonRecursive)
- {
- expanded = true;
- }
+ else if (def && def->nonRecursive)
+ {
+ expanded = true;
+ }
if (expanded)
{
expr=expr.left(p)+resultExpr+restExpr;
@@ -2967,6 +2979,7 @@ static void addDefine(yyscan_t yyscanner)
Doxygen::expandAsDefinedSet.find(def.name.str())!=Doxygen::expandAsDefinedSet.end())
{
def.isPredefined=TRUE;
+ def.expandAsDefined=TRUE;
}
auto it = state->localDefines.find(def.name.str());
if (it!=state->localDefines.end()) // redefine
@@ -3127,9 +3140,7 @@ static void readIncludeFile(yyscan_t yyscanner,const QCString &inc)
{
// extract include path+name
QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
-
- QCString dosExt = incFileName.right(4);
- if (dosExt==".exe" || dosExt==".dll" || dosExt==".tlb")
+ if (incFileName.endsWith(".exe") || incFileName.endsWith(".dll") || incFileName.endsWith(".tlb"))
{
// skip imported binary files (e.g. M$ type libraries)
return;
diff --git a/src/pre_lex.py b/src/pre_lex.py
new file mode 100644
index 0000000..3d3da43
--- /dev/null
+++ b/src/pre_lex.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+# python script to include common parts in lex file
+#
+# Copyright (C) 1997-2022 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+import sys
+import os
+import re
+
+def main():
+ if len(sys.argv)!=6:
+ sys.exit('Usage: {0} <input_lex_file> <output_lex_file> <correction_file> <dependency_lex_file> <include_path>'.format(sys.argv[0]))
+
+ inp_lex_file, out_lex_file, corr_lex_file, dep_lex_file, inc_path = sys.argv[1:]
+
+ out_cnt = rd_cnt = add_cnt = 0
+ if (os.path.exists(inp_lex_file)):
+ with open(out_lex_file,"w") as out_file:
+ with open(corr_lex_file,"w") as corr_file:
+ first_corr = True
+ with open(dep_lex_file,"w") as dep_file:
+ dep_file.write("{0}:".format(out_lex_file))
+ with open(inp_lex_file) as in_file:
+ for line in in_file:
+ if re.search(r'^%doxygen', line): # special include file marker
+ inc_file = inc_path + "/" + line.split()[1]
+ dep_file.write(" {0}".format(inc_file))
+ first_line = True
+ with open(inc_file) as f_inc:
+ for inc_line in f_inc:
+ if first_line:
+ first_line = False
+ out_file.write(" /* #line 1 {0} */\n".format(inc_file))
+ out_cnt += 1
+ add_cnt += 1
+ out_file.write(inc_line)
+ f_inc.close()
+ if not first_line:
+ out_file.write(" /* #line {0} {1} */\n".format(rd_cnt+2,inp_lex_file))
+ out_cnt += 2
+ add_cnt += 1
+ if first_corr:
+ corr_file.write("{0} {1}\n".format(0,0))
+ first_corr = False
+ corr_file.write("{0} {1}\n".format(out_cnt,add_cnt))
+ else:
+ out_cnt += 1
+ rd_cnt += 1
+ out_file.write(line)
+ dep_file.write("\n")
+ else: # input file does not exist
+ sys.exit("Input lex file '{0}' does not exist.".format(sys.argv[1]))
+
+if __name__ == '__main__':
+ main()
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
index e5e801b..6efb18a 100644
--- a/src/printdocvisitor.h
+++ b/src/printdocvisitor.h
@@ -147,18 +147,6 @@ class PrintDocVisitor
case DocStyleChange::Span:
if (s.enable()) printf("<span>"); else printf("</span>");
break;
- case DocStyleChange::Details:
- if (s.enable())
- {
- indent_pre();
- printf("<details>\n");
- }
- else
- {
- indent_post();
- printf("</details>\n");
- }
- break;
case DocStyleChange::Summary:
if (s.enable())
{
@@ -530,6 +518,19 @@ class PrintDocVisitor
indent_post();
printf("</a>\n");
}
+ void operator()(const DocHtmlDetails &details)
+ {
+ indent_pre();
+ printf("<details");
+ for (const auto &opt : details.attribs())
+ {
+ printf(" %s=\"%s\"",qPrint(opt.name),qPrint(opt.value));
+ }
+ printf(">\n");
+ visitChildren(details);
+ indent_post();
+ printf("</details>\n");
+ }
void operator()(const DocHtmlHeader &header)
{
indent_pre();
diff --git a/src/pycode.l b/src/pycode.l
index 8756325..8bcf6d9 100644
--- a/src/pycode.l
+++ b/src/pycode.l
@@ -143,11 +143,12 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner, CodeOutputInterface &o
static void generateFunctionLink(yyscan_t yyscanner, CodeOutputInterface &ol,
const QCString &funcName);
static bool findMemberLink(yyscan_t yyscanner, CodeOutputInterface &ol,
- Definition *sym, const QCString &symName);
+ const Definition *sym, const QCString &symName);
static void findMemberLink(yyscan_t yyscanner, CodeOutputInterface &ol,
const QCString &symName);
static void adjustScopesAndSuites(yyscan_t yyscanner,unsigned indentLength);
static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+static inline void pop_state(yyscan_t yyscanner);
#if 0 // TODO: call me to store local variables and get better syntax highlighting, see code.l
static void addVariable(yyscan_t yyscanner, QCString type, QCString name);
@@ -780,7 +781,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBU
endFontClass(yyscanner);
}
unput(*yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<*>{POUNDCOMMENT}.* {
if (YY_START==SingleQuoteString ||
@@ -1483,7 +1484,7 @@ static void generateFunctionLink(yyscan_t yyscanner,
static bool findMemberLink(yyscan_t yyscanner,
CodeOutputInterface &ol,
- Definition *sym,
+ const Definition *sym,
const QCString &symName)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
@@ -1533,10 +1534,10 @@ static void findMemberLink(yyscan_t yyscanner,
bool found = false;
if (yyextra->currentDefinition)
{
- auto range = Doxygen::symbolMap->find(symName);
- for (auto it = range.first; it!=range.second; ++it)
+ auto v = Doxygen::symbolMap->find(symName);
+ for (auto p : v)
{
- if (findMemberLink(yyscanner,ol,it->second,symName)) found = true;
+ if (findMemberLink(yyscanner,ol,p,symName)) found = true;
}
}
//printf("sym %s not found\n",&yytext[5]);
@@ -1664,6 +1665,15 @@ void PythonCodeParser::parseCode(CodeOutputInterface &codeOutIntf,
printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? qPrint(fileDef->fileName()): NULL);
}
+static inline void pop_state(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if ( yyg->yy_start_stack_ptr <= 0 )
+ warn(yyextra->fileName,yyextra->yyLineNr,"Unexpected statement '%s'",yytext );
+ else
+ yy_pop_state(yyscanner);
+}
+
#if USE_STATE2STRING
#include "pycode.l.h"
#endif
diff --git a/src/pyscanner.l b/src/pyscanner.l
index 7782125..8c87980 100644
--- a/src/pyscanner.l
+++ b/src/pyscanner.l
@@ -1187,6 +1187,10 @@ STARTDOCSYMS "##"
yyextra->start_init = FALSE;
yyextra->current->initializer << yytext;
}
+ "\\\n" {
+ yyextra->current->initializer << yytext;
+ incLineNr(yyscanner);
+ }
. {
yyextra->start_init = FALSE;
yyextra->current->initializer << *yytext;
@@ -1284,8 +1288,8 @@ STARTDOCSYMS "##"
if (!actualDoc.isEmpty())
{
stripIndentation(actualDoc,yyextra->commentIndent);
- actualDoc.prepend("\\verbatim\n");
- actualDoc.append("\\endverbatim ");
+ actualDoc.prepend("@iverbatim\n");
+ actualDoc.append("@endiverbatim ");
}
}
//printf("-------> yyextra->current=%p yyextra->bodyEntry=%p\n",yyextra->current,yyextra->bodyEntry);
@@ -1299,8 +1303,8 @@ STARTDOCSYMS "##"
if (!actualDoc.isEmpty())
{
stripIndentation(actualDoc,yyextra->commentIndent);
- actualDoc.prepend("\\verbatim\n");
- actualDoc.append("\\endverbatim ");
+ actualDoc.prepend("@iverbatim\n");
+ actualDoc.append("@endiverbatim ");
}
}
if (yyextra->moduleScope.startsWith("__") && yyextra->moduleScope.endsWith("__"))
@@ -1534,7 +1538,7 @@ static void newVariable(yyscan_t yyscanner)
static void newFunction(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->current->name.left(2)=="__" && yyextra->current->name.right(2)=="__")
+ if (yyextra->current->name.startsWith("__") && yyextra->current->name.endsWith("__"))
{
// special method name, see
// http://docs.python.org/ref/specialnames.html
diff --git a/src/qhp.cpp b/src/qhp.cpp
index c093adb..eb6de0b 100644
--- a/src/qhp.cpp
+++ b/src/qhp.cpp
@@ -187,13 +187,9 @@ static QCString makeRef(const QCString & withoutExtension, const QCString & anch
return result+"#"+anchor;
}
-Qhp::Qhp() : p(std::make_unique<Private>())
-{
-}
-
-Qhp::~Qhp()
-{
-}
+Qhp::Qhp() : p(std::make_unique<Private>()) {}
+Qhp::~Qhp() = default;
+Qhp::Qhp(Qhp &&) = default;
void Qhp::initialize()
{
diff --git a/src/qhp.h b/src/qhp.h
index 677b4d1..c0b3f08 100644
--- a/src/qhp.h
+++ b/src/qhp.h
@@ -16,13 +16,17 @@
#include <memory>
-#include "index.h"
+#include "qcstring.h"
-class Qhp : public IndexIntf
+class Definition;
+class MemberDef;
+
+class Qhp
{
public:
Qhp();
~Qhp();
+ Qhp(Qhp &&);
void initialize();
void finalize();
diff --git a/src/regex.h b/src/regex.h
index 531092b..61e53ee 100644
--- a/src/regex.h
+++ b/src/regex.h
@@ -64,7 +64,7 @@ class Ex
* - `\s` matches any whitespace as defined by `std::isspace()`
* - `\d` matches any digit as defined by `std::digit()`
* - `\a` matches any alphabetical characters, same as `[a-z_A-Z\x80-\xFF]`
- * - `\w` matches any alpha numercial character, same as `[a-z_A-Z0-9\x80-\xFF]`
+ * - `\w` matches any alpha numerical character, same as `[a-z_A-Z0-9\x80-\xFF]`
* - `\xHH` matches a hexadecimal character, e.g. `\xA0` matches character code 160.
*
* A character range can be used to match a character that falls inside a range
diff --git a/src/res2cc_cmd.py b/src/res2cc_cmd.py
index f6321f6..245c312 100755
--- a/src/res2cc_cmd.py
+++ b/src/res2cc_cmd.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Script that compiles a set of resources into a single C++ source file. The C++ file
# offers an initResources() function, which registers the resources with the resource
# manager (class ResourceMgr)
@@ -20,106 +20,106 @@ from os.path import isfile, join, splitext
import sys
class File(object):
- def __init__(self,directory,subdir,fileName,mode):
- self.directory = directory
- self.subdir = subdir
- self.fileName = fileName
- filePath = join(directory,subdir,fileName)
- self.fileSize = stat(filePath).st_size
- self.bareName = fileName.replace('.','_')
- self.inputFile = open(filePath,mode)
+ def __init__(self,directory,subdir,fileName,mode):
+ self.directory = directory
+ self.subdir = subdir
+ self.fileName = fileName
+ filePath = join(directory,subdir,fileName)
+ self.fileSize = stat(filePath).st_size
+ self.bareName = fileName.replace('.','_')
+ self.inputFile = open(filePath,mode)
- def formatByte(self,byte):
- if isinstance(byte,int):
- return "%02x" % byte
- else:
- return format(ord(byte),'02x')
+ def formatByte(self,byte):
+ if isinstance(byte,int):
+ return "%02x" % byte
+ else:
+ return format(ord(byte),'02x')
- def writeBytes(self,data,outputFile):
- bytes_per_line=16
- print("static const unsigned char %s_data[] = " % self.bareName,file=outputFile)
- print("{",file=outputFile)
- lines = [data[x:x+bytes_per_line] for x in range(0,len(data),bytes_per_line)]
- linesAsString = ',\n '.join([', '.join(['0x'+self.formatByte(byte) for byte in line]) for line in lines])
- print(' %s' % linesAsString,file=outputFile)
- print("};",file=outputFile)
- print("const int %s_len = %d;\n" % (self.bareName,len(data)),file=outputFile)
+ def writeBytes(self,data,outputFile):
+ bytes_per_line=16
+ print("static const unsigned char %s_data[] = " % self.bareName,file=outputFile)
+ print("{",file=outputFile)
+ lines = [data[x:x+bytes_per_line] for x in range(0,len(data),bytes_per_line)]
+ linesAsString = ',\n '.join([', '.join(['0x'+self.formatByte(byte) for byte in line]) for line in lines])
+ print(' %s' % linesAsString,file=outputFile)
+ print("};",file=outputFile)
+ print("const int %s_len = %d;\n" % (self.bareName,len(data)),file=outputFile)
- def convertToBytes(self,outputFile):
- lines = [x for x in self.inputFile.readlines() if not x.startswith('#')]
- w,h = (int(x) for x in lines[0].split())
- data = "".join(map(chr,[int(w>>8),int(w&0xFF),int(h>>8),int(h&0xFF)]+
- [int(x) for line in lines[1:] for x in line.split()]))
- self.writeBytes(data,outputFile)
+ def convertToBytes(self,outputFile):
+ lines = [x for x in self.inputFile.readlines() if not x.startswith('#')]
+ w,h = (int(x) for x in lines[0].split())
+ data = "".join(map(chr,[int(w>>8),int(w&0xFF),int(h>>8),int(h&0xFF)]+
+ [int(x) for line in lines[1:] for x in line.split()]))
+ self.writeBytes(data,outputFile)
- @staticmethod
- def factory(directory,subdir,fname):
- ext = splitext(fname)[1]
- if ext=='.lum': return LumFile(directory,subdir,fname)
- if ext=='.luma': return LumaFile(directory,subdir,fname)
- if ext=='.css': return CSSFile(directory,subdir,fname)
- if ext=='.svg': return SVGFile(directory,subdir,fname)
- return VerbatimFile(directory,subdir,fname)
+ @staticmethod
+ def factory(directory,subdir,fname):
+ ext = splitext(fname)[1]
+ if ext=='.lum': return LumFile(directory,subdir,fname)
+ if ext=='.luma': return LumaFile(directory,subdir,fname)
+ if ext=='.css': return CSSFile(directory,subdir,fname)
+ if ext=='.svg': return SVGFile(directory,subdir,fname)
+ return VerbatimFile(directory,subdir,fname)
class VerbatimFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"rb")
- def writeContents(self,outputFile):
- self.writeBytes(self.inputFile.read(),outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Verbatim }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"rb")
+ def writeContents(self,outputFile):
+ self.writeBytes(self.inputFile.read(),outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Verbatim }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
class CSSFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"r")
- def writeContents(self,outputFile):
- self.writeBytes(self.inputFile.read(),outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::CSS }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.writeBytes(self.inputFile.read(),outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::CSS }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
class SVGFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"r")
- def writeContents(self,outputFile):
- self.writeBytes(self.inputFile.read(),outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::SVG }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.writeBytes(self.inputFile.read(),outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::SVG }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
class LumFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"r")
- def writeContents(self,outputFile):
- self.convertToBytes(outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Luminance }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.convertToBytes(outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Luminance }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
class LumaFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"r")
- def writeContents(self,outputFile):
- self.convertToBytes(outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::LumAlpha }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.convertToBytes(outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::LumAlpha }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
def main():
- if len(sys.argv)<3:
- sys.exit('Usage: %s directory output_file.cpp' % sys.argv[0])
- directory = sys.argv[1]
- files = []
- for dirName, subdirList, fileList in walk(directory):
- for fname in fileList:
- subdir = dirName[len(directory)+1:] if dirName.startswith(directory) else dirName
- if subdir:
- files.append(File.factory(directory,subdir,fname))
- files.sort(key=lambda f: f.subdir + "/" + f.fileName)
- outputFile = open(sys.argv[2],"w")
- print("#include \"resourcemgr.h\"\n",file=outputFile)
- for f in files:
- f.writeContents(outputFile)
- print("void initResources() { ResourceMgr::instance().registerResources({",file=outputFile)
- for f in files:
- f.writeDirEntry(outputFile)
- print("});}",file=outputFile)
+ if len(sys.argv)<3:
+ sys.exit('Usage: %s directory output_file.cpp' % sys.argv[0])
+ directory = sys.argv[1]
+ files = []
+ for dirName, subdirList, fileList in walk(directory):
+ for fname in fileList:
+ subdir = dirName[len(directory)+1:] if dirName.startswith(directory) else dirName
+ if subdir:
+ files.append(File.factory(directory,subdir,fname))
+ files.sort(key=lambda f: f.subdir + "/" + f.fileName)
+ outputFile = open(sys.argv[2],"w")
+ print("#include \"resourcemgr.h\"\n",file=outputFile)
+ for f in files:
+ f.writeContents(outputFile)
+ print("void initResources() { ResourceMgr::instance().registerResources({",file=outputFile)
+ for f in files:
+ f.writeDirEntry(outputFile)
+ print("});}",file=outputFile)
if __name__ == '__main__':
- main()
+ main()
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index 01a259b..1e2afaa 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -286,21 +286,8 @@ void RTFDocVisitor::operator()(const DocStyleChange &s)
break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- if (s.enable())
- {
- m_t << "{\n";
- m_t << "\\par\n";
- }
- else
- {
- m_t << "\\par";
- m_t << "}\n";
- }
- m_lastIsPara=TRUE;
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
- if (s.enable()) m_t << "{\\b "; else m_t << "} ";
+ if (s.enable()) m_t << "{\\b "; else m_t << "}\\par ";
break;
}
}
@@ -1144,6 +1131,28 @@ void RTFDocVisitor::operator()(const DocHRef &href)
m_lastIsPara=FALSE;
}
+void RTFDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ //m_lastIsPara=TRUE;
+ //m_t << "{\n";
+ //m_t << "\\par\n";
+ //visitChildren(d);
+ //m_t << "\\par";
+ //m_t << "}\n";
+ //m_lastIsPara=TRUE;
+ DBG_RTF("{\\comment RTFDocVisitor::operator()(const DocHtmlDetails &)}\n");
+ if (!m_lastIsPara) m_t << "\\par\n";
+ m_t << "{"; // start desc
+ incIndentLevel();
+ m_t << rtf_Style_Reset << getStyle("DescContinue");
+ visitChildren(d);
+ if (!m_lastIsPara) m_t << "\\par\n";
+ decIndentLevel();
+ m_t << "}"; // end desc
+ m_lastIsPara=TRUE;
+}
+
void RTFDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h
index fc3257c..fc1b539 100644
--- a/src/rtfdocvisitor.h
+++ b/src/rtfdocvisitor.h
@@ -80,6 +80,7 @@ class RTFDocVisitor : public DocVisitor
void operator()(const DocHtmlCell &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index a905fc0..882271d 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -17,8 +17,6 @@
*
*/
-#include <chrono>
-#include <ctime>
#include <stdlib.h>
#include "rtfgen.h"
@@ -48,17 +46,14 @@
#include "dir.h"
#include "utf8.h"
#include "debug.h"
-
+#include "datetime.h"
//#define DBG_RTF(x) x;
#define DBG_RTF(x)
static QCString dateToRTFDateString()
{
- auto now = std::chrono::system_clock::now();
- auto time = std::chrono::system_clock::to_time_t(now);
- auto tm = *localtime(&time);
-
+ auto tm = getCurrentDateTime();
QCString result;
result.sprintf("\\yr%d\\mo%d\\dy%d\\hr%d\\min%d\\sec%d",
tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
@@ -374,7 +369,7 @@ void RTFGenerator::startFile(const QCString &name,const QCString &,const QCStrin
QCString fileName=name;
m_relPath = relativePathToRoot(fileName);
- if (fileName.right(4)!=".rtf" ) fileName+=".rtf";
+ if (!fileName.endsWith(".rtf")) fileName+=".rtf";
startPlainFile(fileName);
setRelativePath(m_relPath);
setSourceFileName(stripPath(fileName));
diff --git a/src/scan_states.py b/src/scan_states.py
index e3924e0..ef159fe 100644
--- a/src/scan_states.py
+++ b/src/scan_states.py
@@ -1,5 +1,5 @@
-#!/usr/bin/python
-# python script to generate an overview of the staes based on the input lex file.
+#!/usr/bin/env python
+# python script to generate an overview of the states based on the input lex file.
#
# Copyright (C) 1997-2019 by Dimitri van Heesch.
#
diff --git a/src/scanner.l b/src/scanner.l
index 92387cc..980b8c8 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -202,7 +202,10 @@ struct scannerYY_state
std::vector< std::pair<Entry*,std::shared_ptr<Entry> > > outerScopeEntries;
QCString programStr;
- ClangTUParser * clangParser = 0;
+ ClangTUParser *clangParser = 0;
+
+ int fakeNS = 0; //<! number of file scoped namespaces in CSharp file
+ TextStream dummyTextStream;
};
#if USE_STATE2STRING
@@ -1098,6 +1101,10 @@ NONLopt [^\n]*
if (yyextra->insideCli) yyextra->current->spec |= Entry::Initonly;
lineCount(yyscanner);
}
+<FindMembers>{B}*"static"{BN}*/"{" { yyextra->current->type += " static ";
+ yyextra->current->stat = TRUE;
+ lineCount(yyscanner);
+ }
<FindMembers>{B}*"static"{BN}+ { yyextra->current->type += " static ";
yyextra->current->stat = TRUE;
lineCount(yyscanner);
@@ -2072,9 +2079,9 @@ NONLopt [^\n]*
}
}
<HereDocEnd>. { }
-<CopyHereDocEnd>^{ID} { // id at start of the line could mark the end of the block
+<CopyHereDocEnd>^{Bopt}{ID} { // id at start of the line could mark the end of the block
*yyextra->pCopyHereDocGString << yytext;
- if (yyextra->delimiter==yytext) // it is the end marker
+ if (yyextra->delimiter==QCString(yytext).stripWhiteSpace()) // it is the end marker
{
BEGIN(yyextra->lastHereDocContext);
}
@@ -2089,7 +2096,7 @@ NONLopt [^\n]*
<CopyHereDocEnd>. {
*yyextra->pCopyHereDocGString << yytext;
}
-<FindMembers>"Q_OBJECT" { // Qt object macro
+<FindMembers>"Q_OBJECT"|"Q_GADGET" { // Qt object / gadget macro
}
<FindMembers>"Q_PROPERTY" { // Qt property declaration
yyextra->current->protection = Public ; // see bug734245 & bug735462
@@ -2361,12 +2368,12 @@ NONLopt [^\n]*
yyextra->current->name = yytext;
else
yyextra->current->name += yytext;
- if (yyextra->current->name.left(7)=="static ")
+ if (yyextra->current->name.startsWith("static "))
{
yyextra->current->stat = TRUE;
yyextra->current->name= yyextra->current->name.mid(7);
}
- else if (yyextra->current->name.left(7)=="inline ")
+ else if (yyextra->current->name.startsWith("inline "))
{
if (yyextra->current->type.isEmpty())
{
@@ -2378,7 +2385,7 @@ NONLopt [^\n]*
}
yyextra->current->name= yyextra->current->name.mid(7);
}
- else if (yyextra->current->name.left(10)=="constexpr ")
+ else if (yyextra->current->name.startsWith("constexpr "))
{
if (yyextra->current->type.isEmpty())
{
@@ -2390,7 +2397,7 @@ NONLopt [^\n]*
}
yyextra->current->name=yyextra->current->name.mid(10);
}
- else if (yyextra->current->name.left(6)=="const ")
+ else if (yyextra->current->name.startsWith("const "))
{
if (yyextra->current->type.isEmpty())
{
@@ -2402,7 +2409,7 @@ NONLopt [^\n]*
}
yyextra->current->name=yyextra->current->name.mid(6);
}
- else if (yyextra->current->name.left(9)=="volatile ")
+ else if (yyextra->current->name.startsWith("volatile "))
{
if (yyextra->current->type.isEmpty())
{
@@ -2414,7 +2421,7 @@ NONLopt [^\n]*
}
yyextra->current->name=yyextra->current->name.mid(9);
}
- else if (yyextra->current->name.left(8)=="typedef ")
+ else if (yyextra->current->name.startsWith("typedef "))
{
if (yyextra->current->type.isEmpty())
{
@@ -3268,6 +3275,15 @@ NONLopt [^\n]*
yyextra->lastStringContext=YY_START;
BEGIN(CopyGString);
}
+<GCopySquare>\' {
+ *yyextra->pCopySquareGString << *yytext;
+ if (yyextra->insidePHP)
+ {
+ yyextra->pCopyQuotedGString=yyextra->pCopySquareGString;
+ yyextra->lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ }
<GCopySquare>"[" {
*yyextra->pCopySquareGString << *yytext;
yyextra->squareCount++;
@@ -3304,7 +3320,7 @@ NONLopt [^\n]*
*yyextra->pCopySquareGString << yytext;
}
}
-<GCopySquare>[^"\[\]\n\/,]+ {
+<GCopySquare>[^"'\[\]\n\/,]+ {
*yyextra->pCopySquareGString << yytext;
}
<GCopySquare>. {
@@ -3459,11 +3475,11 @@ NONLopt [^\n]*
yyextra->current->bodyLine = yyextra->yyLineNr;
yyextra->current->bodyColumn = yyextra->yyColNr;
}
- if ( yyextra->insidePHP && yyextra->current->type.left(3) == "var" )
+ if ( yyextra->insidePHP && yyextra->current->type.startsWith("var"))
{
yyextra->current->type = yyextra->current->type.mid(3);
}
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ if (yyextra->isTypedef && !yyextra->current->type.startsWith("typedef "))
{
yyextra->current->type.prepend("typedef ");
}
@@ -4429,7 +4445,8 @@ NONLopt [^\n]*
yyextra->current->type += *yytext;
}
<FindMembers>"("/{BN}*{ID}{BN}*"*"{BN}*{ID}*")"{BN}*"(" { // for catching typedef void (__stdcall *f)() like definitions
- if (yyextra->current->type.left(7)=="typedef" && yyextra->current->bodyLine==-1)
+ if (yyextra->current->type.startsWith("typedef") &&
+ yyextra->current->bodyLine==-1)
// the bodyLine check is to prevent this guard to be true more than once
{
yyextra->current->bodyLine = yyextra->yyLineNr;
@@ -5151,10 +5168,11 @@ NONLopt [^\n]*
int te=yyextra->current->type.findRev('>');
// bug677315: A<int(void *, char *)> get(); is not a function pointer
+ bool startsWithTypedef = yyextra->current->type.startsWith("typedef ");
bool isFunction = ti==-1 || // not a (...*...) pattern
(ts!=-1 && ts<te && ts<ti && ti<te); // (...*...) is part of a template argument list
- bool isVariable = (!yyextra->current->type.isEmpty() &&
- (!isFunction || yyextra->current->type.left(8)=="typedef "));
+ bool isVariable = !yyextra->current->type.isEmpty() &&
+ (!isFunction || startsWithTypedef);
//printf("type=%s ts=%d te=%d ti=%d isFunction=%d\n",
// qPrint(yyextra->current->type),ts,te,ti,isFunction);
@@ -5167,7 +5185,7 @@ NONLopt [^\n]*
if (isVariable)
{
//printf("Scanner.l: found in class variable: '%s' '%s' '%s'\n", qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args));
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ if (yyextra->isTypedef && !startsWithTypedef)
{
yyextra->current->type.prepend("typedef ");
}
@@ -5185,7 +5203,7 @@ NONLopt [^\n]*
//printf("Scanner.l: prototype? type='%s' name='%s' args='%s'\n",qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args));
if (isVariable)
{
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ if (yyextra->isTypedef && !startsWithTypedef)
{
yyextra->current->type.prepend("typedef ");
}
@@ -5458,8 +5476,10 @@ NONLopt [^\n]*
<SkipInits,SkipCurly,SkipCurlyCpp>@\" {
if (!yyextra->insideCS) REJECT;
// C# verbatim string
+ // we want to discard the string, due to reuse of states we need a dummy stream
yyextra->lastSkipVerbStringContext=YY_START;
- yyextra->pSkipVerbString=&yyextra->current->initializer;
+ yyextra->pSkipVerbString=&yyextra->dummyTextStream;
+ yyextra->dummyTextStream.clear(); // remove old data so it won't grow too much
BEGIN(SkipVerbString);
}
<SkipInits,SkipCurly,SkipCurlyCpp>{CHARLIT} {
@@ -5595,8 +5615,18 @@ NONLopt [^\n]*
<ClassTemplSpec>. {
yyextra->current->name += yytext;
}
-<CompoundName>{SCOPENAME}{BN}*";" { // forward declaration
- if (!yyextra->current->tArgLists.empty())
+<CompoundName>{SCOPENAME}{BN}*";" { // forward declaration?
+ if (yyextra->insideCS && yyextra->current->type == "namespace")
+ {
+ // file scoped CSharp namespace
+ lineCount(yyscanner);
+ yyextra->current->name = yytext;
+ yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
+ yyextra->fakeNS++;
+ unput('{'); // fake start of body
+ BEGIN( ClassVar );
+ }
+ else if (!yyextra->current->tArgLists.empty())
{
// found a forward template declaration, this has
// a purpose of its own
@@ -5634,19 +5664,22 @@ NONLopt [^\n]*
yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
}
- unput(';');
- yyextra->current->reset();
- initEntry(yyscanner);
- if (yyextra->insideObjC) // see bug746361
- {
- yyextra->language = yyextra->current->lang = SrcLangExt_Cpp;
- yyextra->insideObjC = FALSE;
- }
- if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
+ if (!(yyextra->insideCS && yyextra->current->type == "namespace"))
{
- yyextra->current->type.prepend("typedef");
+ unput(';');
+ yyextra->current->reset();
+ initEntry(yyscanner);
+ if (yyextra->insideObjC) // see bug746361
+ {
+ yyextra->language = yyextra->current->lang = SrcLangExt_Cpp;
+ yyextra->insideObjC = FALSE;
+ }
+ if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
+ {
+ yyextra->current->type.prepend("typedef");
+ }
+ BEGIN( FindMembers );
}
- BEGIN( FindMembers );
}
<CompoundName>{SCOPENAME}/{BN}*"(" {
yyextra->current->name = yytext ;
@@ -7052,6 +7085,18 @@ NONLopt [^\n]*
yyextra->lastCContext = YY_START ;
BEGIN( SkipCxxComment ) ;
}
+<<EOF>> {
+ if (yyextra->insideCS && yyextra->fakeNS)
+ {
+ yyextra->fakeNS--;
+ unput('}');
+ BEGIN ( ReadNSBody);
+ }
+ else
+ {
+ yyterminate();
+ }
+ }
%%
//----------------------------------------------------------------------------
@@ -7250,7 +7295,7 @@ static void prependScope(yyscan_t yyscanner)
static bool checkForKnRstyleC(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (((QCString)yyextra->fileName).right(2).lower()!=".c") return FALSE; // must be a C file
+ if (!yyextra->fileName.lower().endsWith(".c")) return FALSE; // must be a C file
if (yyextra->current->argList.empty()) return FALSE; // must have arguments
for (const Argument &a : yyextra->current->argList)
{
@@ -7361,10 +7406,7 @@ static void addKnRArgInfo(yyscan_t yyscanner,const QCString &type,const QCString
if (a.type==name)
{
a.type=type.stripWhiteSpace();
- if (a.type.left(9)=="register ") // strip keyword
- {
- a.type=a.type.mid(9);
- }
+ a.type.stripPrefix("register ");
a.name=name.stripWhiteSpace();
if (!brief.isEmpty() && !docs.isEmpty())
{
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
index d0bfd49..789a8eb 100644
--- a/src/searchindex.cpp
+++ b/src/searchindex.cpp
@@ -49,40 +49,7 @@ const size_t numIndexEntries = 256*256;
//--------------------------------------------------------------------
-struct URL
-{
- URL(QCString n,QCString u) : name(n), url(u) {}
- QCString name;
- QCString url;
-};
-
-struct URLInfo
-{
- URLInfo(int idx,int f) : urlIdx(idx), freq(f) {}
- int urlIdx;
- int freq;
-};
-
-class IndexWord
-{
- public:
- using URLInfoMap = std::unordered_map<int,URLInfo>;
- IndexWord(QCString word);
- void addUrlIndex(int,bool);
- URLInfoMap urls() const { return m_urls; }
- QCString word() const { return m_word; }
-
- private:
- QCString m_word;
- URLInfoMap m_urls;
-};
-
-IndexWord::IndexWord(QCString word) : m_word(word)
-{
- //printf("IndexWord::IndexWord(%s)\n",word);
-}
-
-void IndexWord::addUrlIndex(int idx,bool hiPriority)
+void SearchIndex::IndexWord::addUrlIndex(int idx,bool hiPriority)
{
//printf("IndexWord::addUrlIndex(%d,%d)\n",idx,hiPriority);
auto it = m_urls.find(idx);
@@ -97,23 +64,7 @@ void IndexWord::addUrlIndex(int idx,bool hiPriority)
//--------------------------------------------------------------------
-class SearchIndex : public SearchIndexIntf
-{
- public:
- SearchIndex();
- void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile) override;
- void addWord(const QCString &word,bool hiPriority) override;
- void write(const QCString &file) override;
- private:
- void addWord(const QCString &word,bool hiPrio,bool recurse);
- std::unordered_map<std::string,int> m_words;
- std::vector< std::vector< IndexWord> > m_index;
- std::unordered_map<std::string,int> m_url2IdMap;
- std::map<int,URL> m_urls;
- int m_urlIndex = -1;
-};
-
-SearchIndex::SearchIndex() : SearchIndexIntf(Internal)
+SearchIndex::SearchIndex()
{
m_index.resize(numIndexEntries);
}
@@ -232,7 +183,7 @@ static int charsToIndex(const QCString &word)
return c1*256+c2;
}
-void SearchIndex::addWord(const QCString &word,bool hiPriority,bool recurse)
+void SearchIndex::addWordRec(const QCString &word,bool hiPriority,bool recurse)
{
if (word.isEmpty()) return;
QCString wStr = QCString(word).lower();
@@ -254,7 +205,7 @@ void SearchIndex::addWord(const QCString &word,bool hiPriority,bool recurse)
i=getPrefixIndex(word);
if (i>0)
{
- addWord(word.data()+i,hiPriority,TRUE);
+ addWordRec(word.data()+i,hiPriority,TRUE);
found=TRUE;
}
}
@@ -269,14 +220,14 @@ void SearchIndex::addWord(const QCString &word,bool hiPriority,bool recurse)
}
if (word[i]!=0 && i>=1)
{
- addWord(word.data()+i+1,hiPriority,TRUE);
+ addWordRec(word.data()+i+1,hiPriority,TRUE);
}
}
}
void SearchIndex::addWord(const QCString &word,bool hiPriority)
{
- addWord(word,hiPriority,FALSE);
+ addWordRec(word,hiPriority,FALSE);
}
static void writeInt(std::ostream &f,size_t index)
@@ -450,36 +401,7 @@ void SIDataCollection::transfer()
//---------------------------------------------------------------------------
// the following part is for writing an external search index
-struct SearchDocEntry
-{
- QCString type;
- QCString name;
- QCString args;
- QCString extId;
- QCString url;
- GrowBuf importantText;
- GrowBuf normalText;
-};
-
-class SearchIndexExternal : public SearchIndexIntf
-{
- struct Private;
- public:
- SearchIndexExternal();
- void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile) override;
- void addWord(const QCString &word,bool hiPriority) override;
- void write(const QCString &file) override;
- private:
- std::unique_ptr<Private> p;
-};
-
-struct SearchIndexExternal::Private
-{
- std::map<std::string,SearchDocEntry> docEntries;
- SearchDocEntry *current = 0;
-};
-
-SearchIndexExternal::SearchIndexExternal() : SearchIndexIntf(External), p(std::make_unique<Private>())
+SearchIndexExternal::SearchIndexExternal()
{
}
@@ -548,8 +470,8 @@ void SearchIndexExternal::setCurrentDoc(const Definition *ctx,const QCString &an
if (!anchor.isEmpty()) url+=QCString("#")+anchor;
QCString key = extId+";"+url;
- auto it = p->docEntries.find(key.str());
- if (it == p->docEntries.end())
+ auto it = m_docEntries.find(key.str());
+ if (it == m_docEntries.end())
{
SearchDocEntry e;
e.type = isSourceFile ? QCString("source") : definitionToName(ctx);
@@ -560,16 +482,16 @@ void SearchIndexExternal::setCurrentDoc(const Definition *ctx,const QCString &an
}
e.extId = extId;
e.url = url;
- it = p->docEntries.insert({key.str(),e}).first;
+ it = m_docEntries.insert({key.str(),e}).first;
//printf("searchIndexExt %s : %s\n",qPrint(e->name),qPrint(e->url));
}
- p->current = &it->second;
+ m_current = &it->second;
}
void SearchIndexExternal::addWord(const QCString &word,bool hiPriority)
{
- if (word.isEmpty() || !isId(word[0]) || p->current==0) return;
- GrowBuf *pText = hiPriority ? &p->current->importantText : &p->current->normalText;
+ if (word.isEmpty() || !isId(word[0]) || m_current==0) return;
+ GrowBuf *pText = hiPriority ? &m_current->importantText : &m_current->normalText;
if (pText->getPos()>0) pText->addChar(' ');
pText->addStr(word);
//printf("addWord %s\n",word);
@@ -582,7 +504,7 @@ void SearchIndexExternal::write(const QCString &fileName)
{
t << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
t << "<add>\n";
- for (auto &kv : p->docEntries)
+ for (auto &kv : m_docEntries)
{
SearchDocEntry &doc = kv.second;
doc.normalText.addChar(0); // make sure buffer ends with a 0 terminator
@@ -620,14 +542,7 @@ void initSearchIndexer()
bool externalSearch = Config_getBool(EXTERNAL_SEARCH);
if (searchEngine && serverBasedSearch)
{
- if (externalSearch) // external tools produce search index and engine
- {
- Doxygen::searchIndex = new SearchIndexExternal;
- }
- else // doxygen produces search index and engine
- {
- Doxygen::searchIndex = new SearchIndex;
- }
+ Doxygen::searchIndex = new SearchIndexIntf(externalSearch ? SearchIndexIntf::External : SearchIndexIntf::Internal);
}
else // no search engine or pure javascript based search function
{
diff --git a/src/searchindex.h b/src/searchindex.h
index ad79858..428f36b 100644
--- a/src/searchindex.h
+++ b/src/searchindex.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -24,11 +24,15 @@
#include <memory>
#include <vector>
+#include <map>
+#include <unordered_map>
#include <string>
#include <array>
#include <variant>
#include "qcstring.h"
+#include "growbuf.h"
+#include "dispatcher.h"
class Definition;
class SearchIndexIntf;
@@ -81,18 +85,112 @@ class SIDataCollection
//-----------------------------
+/** Writes search index for doxygen provided server based search engine that uses PHP. */
+class SearchIndex
+{
+ struct URL
+ {
+ URL(QCString n,QCString u) : name(n), url(u) {}
+ QCString name;
+ QCString url;
+ };
+
+ struct URLInfo
+ {
+ URLInfo(int idx,int f) : urlIdx(idx), freq(f) {}
+ int urlIdx;
+ int freq;
+ };
+
+ class IndexWord
+ {
+ public:
+ using URLInfoMap = std::unordered_map<int,URLInfo>;
+ IndexWord(QCString word) : m_word(word) {}
+ void addUrlIndex(int,bool);
+ URLInfoMap urls() const { return m_urls; }
+ QCString word() const { return m_word; }
+
+ private:
+ QCString m_word;
+ URLInfoMap m_urls;
+ };
+
+ public:
+ SearchIndex();
+ void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile);
+ void addWord(const QCString &word,bool hiPriority);
+ void write(const QCString &file);
+ private:
+ void addWordRec(const QCString &word,bool hiPrio,bool recurse);
+ std::unordered_map<std::string,int> m_words;
+ std::vector< std::vector< IndexWord> > m_index;
+ std::unordered_map<std::string,int> m_url2IdMap;
+ std::map<int,URL> m_urls;
+ int m_urlIndex = -1;
+};
+
+/** Writes search index that should be used with an externally provided search engine,
+ * e.g. doxyindexer and doxysearch.cgi.
+ */
+class SearchIndexExternal
+{
+ struct SearchDocEntry
+ {
+ QCString type;
+ QCString name;
+ QCString args;
+ QCString extId;
+ QCString url;
+ GrowBuf importantText;
+ GrowBuf normalText;
+ };
+
+ public:
+ SearchIndexExternal();
+ void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile);
+ void addWord(const QCString &word,bool hiPriority);
+ void write(const QCString &file);
+ private:
+ std::map<std::string,SearchDocEntry> m_docEntries;
+ SearchDocEntry *m_current = 0;
+};
+
+namespace SearchIndexMethods
+{
+ template <class T> struct setCurrentDoc { static constexpr auto method = &T::setCurrentDoc; };
+ template <class T> struct addWord { static constexpr auto method = &T::addWord; };
+ template <class T> struct write { static constexpr auto method = &T::write; };
+}
+
+/** Abstract proxy interface for non-javascript based search indices.
+ * It forwards calls to either SearchIndex or SearchIndexExternal depending
+ * on the Kind passed during construction.
+ */
class SearchIndexIntf
{
public:
+ using SearchIndexVariant = std::variant<SearchIndex,SearchIndexExternal>;
enum Kind { Internal, External };
- SearchIndexIntf(Kind k) : m_kind(k) {}
- virtual ~SearchIndexIntf() = default;
- virtual void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile) = 0;
- virtual void addWord(const QCString &word,bool hiPriority) = 0;
- virtual void write(const QCString &file) = 0;
+ SearchIndexIntf(Kind k) : m_kind(k),
+ m_variant(k==Internal ? SearchIndexVariant(SearchIndex()) :
+ SearchIndexVariant(SearchIndexExternal())) { }
+ void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile)
+ {
+ dispatch_call<SearchIndexMethods::setCurrentDoc>(m_variant,ctx,anchor,isSourceFile);
+ }
+ void addWord(const QCString &word,bool hiPriority)
+ {
+ dispatch_call<SearchIndexMethods::addWord>(m_variant,word,hiPriority);
+ }
+ void write(const QCString &file)
+ {
+ dispatch_call<SearchIndexMethods::write>(m_variant,file);
+ }
Kind kind() const { return m_kind; }
private:
Kind m_kind;
+ SearchIndexVariant m_variant;
};
diff --git a/src/searchindex_js.cpp b/src/searchindex_js.cpp
index ad1ef98..4486712 100644
--- a/src/searchindex_js.cpp
+++ b/src/searchindex_js.cpp
@@ -32,6 +32,7 @@
#include "version.h"
#include "message.h"
#include "resourcemgr.h"
+#include "indexlist.h"
QCString searchName(const Definition *d)
{
@@ -406,56 +407,11 @@ void writeJavaScriptSearchIndex()
QCString baseName;
baseName.sprintf("%s_%x",sii.name.data(),p);
- QCString fileName = searchDirName + "/"+baseName+Doxygen::htmlFileExtension;
QCString dataFileName = searchDirName + "/"+baseName+".js";
- std::ofstream t(fileName.str(), std::ofstream::out | std::ofstream::binary);
std::ofstream ti(dataFileName.str(), std::ofstream::out | std::ofstream::binary);
- if (t.is_open() && ti.is_open())
+ if (ti.is_open())
{
- {
- t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
- " \"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
- t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
- t << "<head><title></title>\n";
- t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n";
- t << "<meta name=\"generator\" content=\"Doxygen " << getDoxygenVersion() << "\"/>\n";
- t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n";
- t << "<script type=\"text/javascript\" src=\"" << baseName << ".js\"></script>\n";
- t << "<script type=\"text/javascript\" src=\"search.js\"></script>\n";
- t << "</head>\n";
- t << "<body class=\"SRPage\">\n";
- t << "<div id=\"SRIndex\">\n";
- t << "<div class=\"SRStatus\" id=\"Loading\">" << theTranslator->trLoading() << "</div>\n";
- t << "<div id=\"SRResults\"></div>\n"; // here the results will be inserted
- t << "<script type=\"text/javascript\">\n";
- t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */\n";
- t << "createResults();\n"; // this function will insert the results
- t << "/* @license-end */\n";
- t << "</script>\n";
- t << "<div class=\"SRStatus\" id=\"Searching\">"
- << theTranslator->trSearching() << "</div>\n";
- t << "<div class=\"SRStatus\" id=\"NoMatches\">"
- << theTranslator->trNoMatches() << "</div>\n";
-
- t << "<script type=\"text/javascript\">\n";
- t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */\n";
- t << "document.getElementById(\"Loading\").style.display=\"none\";\n";
- t << "document.getElementById(\"NoMatches\").style.display=\"none\";\n";
- t << "var searchResults = new SearchResults(\"searchResults\");\n";
- t << "searchResults.Search();\n";
- t << "window.addEventListener(\"message\", function(event) {\n";
- t << " if (event.data == \"take_focus\") {\n";
- t << " var elem = searchResults.NavNext(0);\n";
- t << " if (elem) elem.focus();\n";
- t << " }\n";
- t << "});\n";
- t << "/* @license-end */\n";
- t << "</script>\n";
- t << "</div>\n"; // SRIndex
- t << "</body>\n";
- t << "</html>\n";
- }
ti << "var searchData=\n";
// format
@@ -619,7 +575,7 @@ void writeJavaScriptSearchIndex()
}
else
{
- err("Failed to open file '%s' for writing...\n",qPrint(fileName));
+ err("Failed to open file '%s' for writing...\n",qPrint(dataFileName));
}
p++;
}
@@ -683,29 +639,6 @@ void writeJavaScriptSearchIndex()
ResourceMgr::instance().copyResource("search.js",searchDirName);
}
- {
- QCString noMatchesFileName =searchDirName+"/nomatches"+Doxygen::htmlFileExtension;
- std::ofstream t(noMatchesFileName.str(), std::ofstream::out | std::ofstream::binary);
- if (t.is_open())
- {
- t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
- "\"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
- t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
- t << "<head><title></title>\n";
- t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n";
- t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n";
- t << "<script type=\"text/javascript\" src=\"search.js\"></script>\n";
- t << "</head>\n";
- t << "<body class=\"SRPage\">\n";
- t << "<div id=\"SRIndex\">\n";
- t << "<div class=\"SRStatus\" id=\"NoMatches\">"
- << theTranslator->trNoMatches() << "</div>\n";
- t << "</div>\n";
- t << "</body>\n";
- t << "</html>\n";
- }
- }
-
Doxygen::indexList->addStyleSheetFile("search/search.js");
}
diff --git a/src/symbolmap.h b/src/symbolmap.h
index 63e1e3a..1c46e89 100644
--- a/src/symbolmap.h
+++ b/src/symbolmap.h
@@ -17,7 +17,7 @@
#define SYMBOLMAP_H
#include <algorithm>
-#include <map>
+#include <unordered_map>
#include <vector>
#include <string>
#include <utility>
@@ -31,38 +31,54 @@ class SymbolMap
{
public:
using Ptr = T *;
- using Map = std::multimap<std::string,Ptr>;
+ using VectorPtr = std::vector<Ptr>;
+ using Map = std::unordered_map<std::string,VectorPtr>;
using iterator = typename Map::iterator;
using const_iterator = typename Map::const_iterator;
//! Add a symbol \a def into the map under key \a name
void add(const QCString &name,Ptr def)
{
- m_map.insert({name.str(),def});
+ auto it = m_map.find(name.str());
+ if (it!=m_map.end())
+ {
+ it->second.push_back(def);
+ }
+ else
+ {
+ m_map.emplace(std::make_pair(name.str(),VectorPtr({def})));
+ }
}
//! Remove a symbol \a def from the map that was stored under key \a name
void remove(const QCString &name,Ptr def)
{
- auto range = find(name);
- for (auto it=range.first; it!=range.second; )
+ VectorPtr &v = find(name);
+ auto it = std::find(v.begin(),v.end(),def);
+ if (it!=v.end())
{
- if (it->second==def) it = m_map.erase(it); else ++it;
+ v.erase(it);
+ if (v.empty())
+ {
+ m_map.erase(name.str());
+ }
}
}
//! Find the list of symbols stored under key \a name
//! Returns a pair of iterators pointing to the start and end of the range of matching symbols
- std::pair<const_iterator,const_iterator> find(const QCString &name) const
+ const VectorPtr &find(const QCString &name) const
{
- return m_map.equal_range(name.str());
+ auto it = m_map.find(name.str());
+ return it==m_map.end() ? m_noMatch : it->second;
}
//! Find the list of symbols stored under key \a name
//! Returns a pair of iterators pointing to the start and end of the range of matching symbols
- std::pair<iterator,iterator> find(const QCString &name)
+ VectorPtr &find(const QCString &name)
{
- return m_map.equal_range(name.str());
+ auto it = m_map.find(name.str());
+ return it==m_map.end() ? m_noMatch : it->second;
}
iterator begin() { return m_map.begin(); }
@@ -70,10 +86,10 @@ class SymbolMap
const_iterator begin() const { return m_map.cbegin(); }
const_iterator end() const { return m_map.cend(); }
bool empty() const { return m_map.empty(); }
- size_t size() const { return m_map.size(); }
private:
Map m_map;
+ VectorPtr m_noMatch;
};
#endif
diff --git a/src/symbolresolver.cpp b/src/symbolresolver.cpp
index cf7fea1..9bc618e 100644
--- a/src/symbolresolver.cpp
+++ b/src/symbolresolver.cpp
@@ -37,7 +37,8 @@ class AccessStack
/** Element in the stack. */
struct AccessElem
{
- AccessElem(const Definition *d,const FileDef *f,const Definition *i,QCString e = QCString()) : scope(d), fileScope(f), item(i), expScope(e) {}
+ AccessElem(const Definition *d,const FileDef *f,const Definition *i) : scope(d), fileScope(f), item(i) {}
+ AccessElem(const Definition *d,const FileDef *f,const Definition *i,const QCString &e) : scope(d), fileScope(f), item(i), expScope(e) {}
const Definition *scope;
const FileDef *fileScope;
const Definition *item;
@@ -103,9 +104,18 @@ struct SymbolResolver::Private
const MemberDef *typeDef = 0;
QCString templateSpec;
- const ClassDef *getResolvedClassRec(
+ const ClassDef *getResolvedTypeRec(
const Definition *scope, // in
- const QCString &n, // in
+ const QCString &n, // in
+ const MemberDef **pTypeDef, // out
+ QCString *pTemplSpec, // out
+ QCString *pResolvedType); // out
+ //
+ const Definition *getResolvedSymbolRec(
+ const Definition *scope, // in
+ const QCString &n, // in
+ const QCString &args, // in
+ bool checkCV, // in
const MemberDef **pTypeDef, // out
QCString *pTemplSpec, // out
QCString *pResolvedType); // out
@@ -122,7 +132,7 @@ struct SymbolResolver::Private
const QCString &explicitScopePart);
private:
- void getResolvedSymbol(const Definition *scope, // in
+ void getResolvedType( const Definition *scope, // in
const Definition *d, // in
const QCString &explicitScopePart, // in
const std::unique_ptr<ArgumentList> &actTemplParams, // in
@@ -131,6 +141,19 @@ struct SymbolResolver::Private
const MemberDef *&bestTypedef, // out
QCString &bestTemplSpec, // out
QCString &bestResolvedType // out
+ );
+
+ void getResolvedSymbol(const Definition *scope, // in
+ const Definition *d, // in
+ const QCString &args, // in
+ bool checkCV, // in
+ const QCString &explicitScopePart, // in
+ const std::unique_ptr<ArgumentList> &actTemplParams, // in
+ int &minDistance, // inout
+ const Definition *&bestMatch, // out
+ const MemberDef *&bestTypedef, // out
+ QCString &bestTemplSpec, // out
+ QCString &bestResolvedType // out
);
const ClassDef *newResolveTypedef(
@@ -164,7 +187,7 @@ struct SymbolResolver::Private
-const ClassDef *SymbolResolver::Private::getResolvedClassRec(
+const ClassDef *SymbolResolver::Private::getResolvedTypeRec(
const Definition *scope,
const QCString &n,
const MemberDef **pTypeDef,
@@ -173,13 +196,10 @@ const ClassDef *SymbolResolver::Private::getResolvedClassRec(
{
if (n.isEmpty()) return 0;
//static int level=0;
- //fprintf(stderr,"%d [getResolvedClassRec(%s,%s)\n",level++,scope?qPrint(scope->name()):"<global>",n);
- QCString name;
+ //printf("\n%d [getResolvedTypeRec(%s,%s)\n",level++,scope?qPrint(scope->name()):"<global>",qPrint(n));
QCString explicitScopePart;
QCString strippedTemplateParams;
- name=stripTemplateSpecifiersFromScope
- (removeRedundantWhiteSpace(n),TRUE,
- &strippedTemplateParams);
+ QCString name=stripTemplateSpecifiersFromScope(n,TRUE,&strippedTemplateParams);
std::unique_ptr<ArgumentList> actTemplParams;
if (!strippedTemplateParams.isEmpty()) // template part that was stripped
{
@@ -199,24 +219,17 @@ const ClassDef *SymbolResolver::Private::getResolvedClassRec(
if (name.isEmpty())
{
- //fprintf(stderr,"%d ] empty name\n",--level);
+ //printf("%d ] empty name\n",--level);
return 0; // empty name
}
- //printf("Looking for symbol %s\n",qPrint(name));
- auto range = Doxygen::symbolMap->find(name);
- // the -g (for C# generics) and -p (for ObjC protocols) are now already
- // stripped from the key used in the symbolMap, so that is not needed here.
- if (range.first==range.second)
+ //printf("Looking for type %s\n",qPrint(name));
+ auto &range = Doxygen::symbolMap->find(name);
+ if (range.empty())
{
- range = Doxygen::symbolMap->find(name+"-p");
- if (range.first==range.second)
- {
- //fprintf(stderr,"%d ] no such symbol!\n",--level);
- return 0;
- }
+ return 0;
}
- //printf("found symbol!\n");
+ //printf("found type!\n");
bool hasUsingStatements =
(m_fileScope && (!m_fileScope->getUsedNamespaces().empty() ||
@@ -235,7 +248,7 @@ const ClassDef *SymbolResolver::Private::getResolvedClassRec(
int fileScopeLen = hasUsingStatements ? 1+m_fileScope->absFilePath().length() : 0;
// below is a more efficient coding of
- // QCString key=scope->name()+"+"+name+"+"+explicitScopePart;
+ // QCString key=scope->name()+"+"+name+"+"+explicitScopePart+args+typesOnly?'T':'F';
QCString key(scopeNameLen+nameLen+explicitPartLen+fileScopeLen+1);
char *pk=key.rawData();
qstrcpy(pk,scope->name().data()); *(pk+scopeNameLen-1)='+';
@@ -261,8 +274,8 @@ const ClassDef *SymbolResolver::Private::getResolvedClassRec(
{
std::lock_guard<std::mutex> lock(g_cacheMutex);
- LookupInfo *pval = Doxygen::lookupCache->find(key.str());
- //printf("Searching for %s result=%p\n",qPrint(key),pval);
+ LookupInfo *pval = Doxygen::typeLookupCache->find(key.str());
+ //printf("Searching for %s result=%p\n",qPrint(key),(void*)pval);
if (pval)
{
//printf("LookupInfo %p %p '%s' %p\n",
@@ -271,16 +284,16 @@ const ClassDef *SymbolResolver::Private::getResolvedClassRec(
if (pTemplSpec) *pTemplSpec=pval->templSpec;
if (pTypeDef) *pTypeDef=pval->typeDef;
if (pResolvedType) *pResolvedType=pval->resolvedType;
- //fprintf(stderr,"%d ] cachedMatch=%s\n",--level,
- // pval->classDef?qPrint(pval->classDef->name()):"<none>");
+ //printf("%d ] cachedMatch=%s\n",--level,
+ // pval->definition?qPrint(pval->definition->name()):"<none>");
//if (pTemplSpec)
// printf("templSpec=%s\n",pTemplSpec->data());
- return pval->classDef;
+ return toClassDef(pval->definition);
}
else // not found yet; we already add a 0 to avoid the possibility of
// endless recursion.
{
- Doxygen::lookupCache->insert(key.str(),LookupInfo());
+ Doxygen::typeLookupCache->insert(key.str(),LookupInfo());
}
}
@@ -290,11 +303,184 @@ const ClassDef *SymbolResolver::Private::getResolvedClassRec(
QCString bestResolvedType;
int minDistance=10000; // init at "infinite"
- for (auto it=range.first ; it!=range.second; ++it)
+ for (Definition *d : range)
{
- Definition *d = it->second;
- getResolvedSymbol(scope,d,explicitScopePart,actTemplParams,
+ getResolvedType(scope,d,explicitScopePart,actTemplParams,
+ minDistance,bestMatch,bestTypedef,bestTemplSpec,bestResolvedType);
+ if (minDistance==0) break; // we can stop reaching if we already reached distance 0
+ }
+
+ if (pTypeDef)
+ {
+ *pTypeDef = bestTypedef;
+ }
+ if (pTemplSpec)
+ {
+ *pTemplSpec = bestTemplSpec;
+ }
+ if (pResolvedType)
+ {
+ *pResolvedType = bestResolvedType;
+ }
+
+ //printf("getResolvedSymbolRec: bestMatch=%p pval->resolvedType=%s\n",
+ // bestMatch,qPrint(bestResolvedType));
+
+ {
+ // we need to insert the item in the cache again, as it could be removed in the meantime
+ std::lock_guard<std::mutex> lock(g_cacheMutex);
+ Doxygen::typeLookupCache->insert(key.str(),
+ LookupInfo(bestMatch,bestTypedef,bestTemplSpec,bestResolvedType));
+ }
+ //printf("%d ] bestMatch=%s distance=%d\n",--level,
+ // bestMatch?qPrint(bestMatch->name()):"<none>",minDistance);
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
+ return bestMatch;
+}
+
+const Definition *SymbolResolver::Private::getResolvedSymbolRec(
+ const Definition *scope,
+ const QCString &n,
+ const QCString &args,
+ bool checkCV,
+ const MemberDef **pTypeDef,
+ QCString *pTemplSpec,
+ QCString *pResolvedType)
+{
+ if (n.isEmpty()) return 0;
+ //static int level=0;
+ //printf("\n%d [getResolvedSymbolRec(%s,%s)\n",level++,scope?qPrint(scope->name()):"<global>",qPrint(n));
+ QCString explicitScopePart;
+ QCString strippedTemplateParams;
+ QCString name=stripTemplateSpecifiersFromScope(n,TRUE,&strippedTemplateParams);
+ std::unique_ptr<ArgumentList> actTemplParams;
+ if (!strippedTemplateParams.isEmpty()) // template part that was stripped
+ {
+ actTemplParams = stringToArgumentList(scope->getLanguage(),strippedTemplateParams);
+ }
+
+ int qualifierIndex = computeQualifiedIndex(name);
+ //printf("name=%s qualifierIndex=%d\n",qPrint(name),qualifierIndex);
+ if (qualifierIndex!=-1) // qualified name
+ {
+ // split off the explicit scope part
+ explicitScopePart=name.left(qualifierIndex);
+ // todo: improve namespace alias substitution
+ replaceNamespaceAliases(explicitScopePart,explicitScopePart.length());
+ name=name.mid(qualifierIndex+2);
+ }
+
+ if (name.isEmpty())
+ {
+ //printf("%d ] empty name\n",--level);
+ return 0; // empty name
+ }
+
+ //printf("Looking for symbol %s\n",qPrint(name));
+ auto &range = Doxygen::symbolMap->find(name);
+ if (range.empty())
+ {
+ //printf("%d ] not symbols\n",--level);
+ return 0;
+ }
+ //printf("found symbol %zu times!\n",range.size());
+
+ bool hasUsingStatements =
+ (m_fileScope && (!m_fileScope->getUsedNamespaces().empty() ||
+ !m_fileScope->getUsedClasses().empty())
+ );
+ //printf("hasUsingStatements=%d\n",hasUsingStatements);
+ // Since it is often the case that the same name is searched in the same
+ // scope over an over again (especially for the linked source code generation)
+ // we use a cache to collect previous results. This is possible since the
+ // result of a lookup is deterministic. As the key we use the concatenated
+ // scope, the name to search for and the explicit scope prefix. The speedup
+ // achieved by this simple cache can be enormous.
+ int scopeNameLen = scope->name().length()+1;
+ int nameLen = name.length()+1;
+ int explicitPartLen = explicitScopePart.length();
+ int fileScopeLen = hasUsingStatements ? 1+m_fileScope->absFilePath().length() : 0;
+ int argsLen = args.length()+1;
+
+ // below is a more efficient coding of
+ // QCString key=scope->name()+"+"+name+"+"+explicitScopePart+args+typesOnly?'T':'F';
+ QCString key(scopeNameLen+nameLen+explicitPartLen+fileScopeLen+argsLen+1);
+ char *pk=key.rawData();
+ qstrcpy(pk,scope->name().data()); *(pk+scopeNameLen-1)='+';
+ pk+=scopeNameLen;
+ qstrcpy(pk,name.data()); *(pk+nameLen-1)='+';
+ pk+=nameLen;
+ qstrcpy(pk,explicitScopePart.data());
+ pk+=explicitPartLen;
+
+ // if a file scope is given and it contains using statements we should
+ // also use the file part in the key (as a class name can be in
+ // two different namespaces and a using statement in a file can select
+ // one of them).
+ if (hasUsingStatements)
+ {
+ // below is a more efficient coding of
+ // key+="+"+m_fileScope->name();
+ *pk++='+';
+ qstrcpy(pk,m_fileScope->absFilePath().data());
+ pk+=fileScopeLen-1;
+ }
+ if (argsLen>0)
+ {
+ qstrcpy(pk,args.data());
+ pk+=argsLen-1;
+ }
+ *pk='\0';
+
+ {
+ std::lock_guard<std::mutex> lock(g_cacheMutex);
+ LookupInfo *pval = Doxygen::symbolLookupCache->find(key.str());
+ //printf("Searching for %s result=%p\n",qPrint(key),(void*)pval);
+ if (pval)
+ {
+ //printf("LookupInfo %p %p '%s' %p\n",
+ // pval->classDef, pval->typeDef, qPrint(pval->templSpec),
+ // qPrint(pval->resolvedType));
+ if (pTemplSpec) *pTemplSpec=pval->templSpec;
+ if (pTypeDef) *pTypeDef=pval->typeDef;
+ if (pResolvedType) *pResolvedType=pval->resolvedType;
+ //printf("%d ] cachedMatch=%s\n",--level,
+ // pval->definition?qPrint(pval->definition->name()):"<none>");
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
+ return pval->definition;
+ }
+ else // not found yet; we already add a 0 to avoid the possibility of
+ // endless recursion.
+ {
+ Doxygen::symbolLookupCache->insert(key.str(),LookupInfo());
+ }
+ }
+
+ const Definition *bestMatch=0;
+ const MemberDef *bestTypedef=0;
+ QCString bestTemplSpec;
+ QCString bestResolvedType;
+ int minDistance=10000; // init at "infinite"
+
+ for (Definition *d : range)
+ {
+ getResolvedSymbol(scope,d,args,checkCV,explicitScopePart,actTemplParams,
+ minDistance,bestMatch,bestTypedef,bestTemplSpec,bestResolvedType);
+ if (minDistance==0) break; // we can stop reaching if we already reached distance 0
+ }
+
+ // in case we are looking for e.g. func() and the real function is func(int x) we also
+ // accept func(), see example 036 in the test set.
+ if (bestMatch==0 && args=="()")
+ {
+ for (Definition *d : range)
+ {
+ getResolvedSymbol(scope,d,QCString(),false,explicitScopePart,actTemplParams,
minDistance,bestMatch,bestTypedef,bestTemplSpec,bestResolvedType);
+ if (minDistance==0) break; // we can stop reaching if we already reached distance 0
+ }
}
if (pTypeDef)
@@ -310,23 +496,23 @@ const ClassDef *SymbolResolver::Private::getResolvedClassRec(
*pResolvedType = bestResolvedType;
}
- //printf("getResolvedClassRec: bestMatch=%p pval->resolvedType=%s\n",
+ //printf("getResolvedSymbolRec: bestMatch=%p pval->resolvedType=%s\n",
// bestMatch,qPrint(bestResolvedType));
{
// we need to insert the item in the cache again, as it could be removed in the meantime
std::lock_guard<std::mutex> lock(g_cacheMutex);
- Doxygen::lookupCache->insert(key.str(),
+ Doxygen::symbolLookupCache->insert(key.str(),
LookupInfo(bestMatch,bestTypedef,bestTemplSpec,bestResolvedType));
}
- //fprintf(stderr,"%d ] bestMatch=%s distance=%d\n",--level,
+ //printf("%d ] bestMatch=%s distance=%d\n",--level,
// bestMatch?qPrint(bestMatch->name()):"<none>",minDistance);
//if (pTemplSpec)
// printf("templSpec=%s\n",pTemplSpec->data());
return bestMatch;
}
-void SymbolResolver::Private::getResolvedSymbol(
+void SymbolResolver::Private::getResolvedType(
const Definition *scope, // in
const Definition *d, // in
const QCString &explicitScopePart, // in
@@ -338,7 +524,7 @@ void SymbolResolver::Private::getResolvedSymbol(
QCString &bestResolvedType // out
)
{
- //fprintf(stderr,"getResolvedSymbol(%s,%s)\n",qPrint(scope->name()),qPrint(d->qualifiedName()));
+ //fprintf(stderr,"getResolvedType(%s,%s)\n",qPrint(scope->name()),qPrint(d->qualifiedName()));
// only look at classes and members that are enums or typedefs
if (d->definitionType()==Definition::TypeClass ||
(d->definitionType()==Definition::TypeMember &&
@@ -485,6 +671,124 @@ void SymbolResolver::Private::getResolvedSymbol(
//printf(" bestMatch=%p bestResolvedType=%s\n",bestMatch,qPrint(bestResolvedType));
}
+
+void SymbolResolver::Private::getResolvedSymbol(
+ const Definition *scope, // in
+ const Definition *d, // in
+ const QCString &args, // in
+ bool checkCV, // in
+ const QCString &explicitScopePart, // in
+ const std::unique_ptr<ArgumentList> &actTemplParams, // in
+ int &minDistance, // inout
+ const Definition *&bestMatch, // out
+ const MemberDef *&bestTypedef, // out
+ QCString &bestTemplSpec, // out
+ QCString &bestResolvedType // out
+ )
+{
+ //fprintf(stderr,"getResolvedSymbol(%s,%s)\n",qPrint(scope->name()),qPrint(d->qualifiedName()));
+ // only look at classes and members that are enums or typedefs
+ VisitedNamespaces visitedNamespaces;
+ AccessStack accessStack;
+ // test accessibility of definition within scope.
+ int distance = isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope,d,explicitScopePart);
+ //fprintf(stderr," %s; distance %s (%p) is %d\n",qPrint(scope->name()),qPrint(d->name()),d,distance);
+ //printf("%s: distance=%d scope=%s explScope=%s\n",qPrint(d->name()),distance,qPrint(scope?scope->name():QCString()),qPrint(explicitScopePart));
+ if (distance!=-1) // definition is accessible
+ {
+ // see if we are dealing with a class or a typedef
+ if (d->definitionType()==Definition::TypeClass) // d is a class
+ {
+ const ClassDef *cd = toClassDef(d);
+ //printf("cd=%s\n",qPrint(cd->name()));
+ if (!cd->isTemplateArgument()) // skip classes that
+ // are only there to
+ // represent a template
+ // argument
+ {
+ //printf("is not a templ arg\n");
+ if (distance<minDistance) // found a definition that is "closer"
+ {
+ minDistance=distance;
+ bestMatch = d;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType = cd->qualifiedName();
+ }
+ else if (distance==minDistance &&
+ m_fileScope && bestMatch &&
+ !m_fileScope->getUsedNamespaces().empty() &&
+ d->getOuterScope()->definitionType()==Definition::TypeNamespace &&
+ bestMatch->getOuterScope()==Doxygen::globalScope
+ )
+ {
+ // in case the distance is equal it could be that a class X
+ // is defined in a namespace and in the global scope. When searched
+ // in the global scope the distance is 0 in both cases. We have
+ // to choose one of the definitions: we choose the one in the
+ // namespace if the fileScope imports namespaces and the definition
+ // found was in a namespace while the best match so far isn't.
+ // Just a non-perfect heuristic but it could help in some situations
+ // (kdecore code is an example).
+ minDistance=distance;
+ bestMatch = d;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType = cd->qualifiedName();
+ }
+ }
+ else
+ {
+ //printf(" is a template argument!\n");
+ }
+ }
+ else if (d->definitionType()==Definition::TypeMember)
+ {
+ const MemberDef *md = toMemberDef(d);
+
+ bool match = true;
+ //printf("@@ checking %s\n",qPrint(md->name()));
+ if (md->isFunction() && !args.isEmpty())
+ {
+ std::unique_ptr<ArgumentList> argList = stringToArgumentList(md->getLanguage(),args);
+ const ArgumentList &mdAl = md->argumentList();
+ match = matchArguments2(md->getOuterScope(),md->getFileDef(),&mdAl,
+ scope, md->getFileDef(),argList.get(),
+ checkCV,md->getLanguage());
+ //printf("@@ %s (%p): matching %s against %s -> %d\n",qPrint(md->name()),(void*)md,qPrint(args),qPrint(argListToString(mdAl)),match);
+ }
+
+ //fprintf(stderr," member isTypedef()=%d\n",md->isTypedef());
+ if (match && distance<minDistance)
+ {
+ minDistance=distance;
+ bestMatch = md;
+ bestTypedef = md;
+ bestTemplSpec = "";
+ bestResolvedType = md->qualifiedName();
+ }
+ }
+ else if ((d->definitionType()==Definition::TypeNamespace ||
+ d->definitionType()==Definition::TypeFile))
+ {
+ if (distance<minDistance) // found a definition that is "closer"
+ {
+ minDistance=distance;
+ bestMatch = d;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType.resize(0);
+ }
+ }
+ } // if definition accessible
+ else
+ {
+ //printf(" Not accessible!\n");
+ }
+ //printf("bestMatch=%s bestResolvedType=%s\n",qPrint(bestMatch?bestMatch->name():"<none>"),qPrint(bestResolvedType));
+}
+
+
const ClassDef *SymbolResolver::Private::newResolveTypedef(
const Definition *scope, // in
const MemberDef *md, // in
@@ -540,7 +844,7 @@ const ClassDef *SymbolResolver::Private::newResolveTypedef(
tl=type.length(); // length may have been changed
while (sp<tl && type.at(sp)==' ') sp++;
const MemberDef *memTypeDef = 0;
- const ClassDef *result = getResolvedClassRec(md->getOuterScope(),type,
+ const ClassDef *result = getResolvedTypeRec(md->getOuterScope(),type,
&memTypeDef,0,pResolvedType);
// if type is a typedef then return what it resolves to.
if (memTypeDef && memTypeDef->isTypedef())
@@ -562,7 +866,7 @@ const ClassDef *SymbolResolver::Private::newResolveTypedef(
if (si==-1 && i!=-1) // typedef of a template => try the unspecialized version
{
if (pTemplSpec) *pTemplSpec = type.mid(i);
- result = getResolvedClassRec(md->getOuterScope(),type.left(i),0,0,pResolvedType);
+ result = getResolvedTypeRec(md->getOuterScope(),type.left(i),0,0,pResolvedType);
//printf("result=%p pRresolvedType=%s sp=%d ip=%d tl=%d\n",
// result,pResolvedType?pResolvedType->data():"<none>",sp,ip,tl);
}
@@ -577,7 +881,7 @@ const ClassDef *SymbolResolver::Private::newResolveTypedef(
{
if (pTemplSpec) *pTemplSpec = type.mid(i);
}
- result = getResolvedClassRec(md->getOuterScope(),
+ result = getResolvedTypeRec(md->getOuterScope(),
stripTemplateSpecifiersFromScope(type.left(i),FALSE),0,0,pResolvedType);
}
@@ -587,7 +891,7 @@ const ClassDef *SymbolResolver::Private::newResolveTypedef(
done:
if (pResolvedType)
{
- if (result)
+ if (result && result->definitionType()==Definition::TypeClass)
{
*pResolvedType = result->qualifiedName();
//printf("*pResolvedType=%s\n",pResolvedType->data());
@@ -623,6 +927,15 @@ done:
return result;
}
+#if 0
+static bool isParentScope(const Definition *parent,const Definition *item)
+{
+ if (parent==item || item==0 || item==Doxygen::globalScope) return false;
+ if (parent==0 || parent==Doxygen::globalScope) return true;
+ return isParentScope(parent->getOuterScope(),item);
+}
+#endif
+
int SymbolResolver::Private::isAccessibleFromWithExpScope(
VisitedNamespaces &visitedNamespaces,
AccessStack &accessStack,
@@ -643,15 +956,28 @@ int SymbolResolver::Private::isAccessibleFromWithExpScope(
accessStack.push(scope,m_fileScope,item,explicitScopePart);
- //printf(" <isAccessibleFromWithExpScope(%s,%s,%s)\n",scope?qPrint(scope->name()):"<global>",
- // item?qPrint(item->name()):"<none>",
+ //printf(" <isAccessibleFromWithExpScope(%s,%s,%s)\n",scope?qPrint(scope->name()):"<global>",
+ // item?qPrint(item->qualifiedName()):"<none>",
// qPrint(explicitScopePart));
int result=0; // assume we found it
const Definition *newScope = followPath(scope,explicitScopePart);
if (newScope) // explicitScope is inside scope => newScope is the result
{
Definition *itemScope = item->getOuterScope();
+
//printf(" scope traversal successful %s<->%s!\n",qPrint(itemScope->name()),qPrint(newScope->name()));
+
+ bool nestedClassInsideBaseClass =
+ itemScope &&
+ itemScope->definitionType()==Definition::TypeClass &&
+ newScope->definitionType()==Definition::TypeClass &&
+ (toClassDef(newScope))->isBaseClass(toClassDef(itemScope),TRUE);
+
+ bool enumValueWithinEnum =
+ item->definitionType()==Definition::TypeMember &&
+ toMemberDef(item)->isEnumValue() &&
+ toMemberDef(item)->getEnumScope()==newScope;
+
//if (newScope && newScope->definitionType()==Definition::TypeClass)
//{
// ClassDef *cd = (ClassDef *)newScope;
@@ -659,13 +985,9 @@ int SymbolResolver::Private::isAccessibleFromWithExpScope(
//}
if (itemScope==newScope) // exact match of scopes => distance==0
{
- //printf("> found it\n");
+ //printf(" > found it\n");
}
- else if (itemScope && newScope &&
- itemScope->definitionType()==Definition::TypeClass &&
- newScope->definitionType()==Definition::TypeClass &&
- (toClassDef(newScope))->isBaseClass(toClassDef(itemScope),TRUE,0)
- )
+ else if (nestedClassInsideBaseClass)
{
// inheritance is also ok. Example: looking for B::I, where
// class A { public: class I {} };
@@ -679,6 +1001,10 @@ int SymbolResolver::Private::isAccessibleFromWithExpScope(
//printf("scope(%s) is base class of newScope(%s)\n",
// qPrint(scope->name()),qPrint(newScope->name()));
}
+ else if (enumValueWithinEnum)
+ {
+ result=1;
+ }
else
{
int i=-1;
@@ -712,6 +1038,16 @@ int SymbolResolver::Private::isAccessibleFromWithExpScope(
}
}
}
+#if 0 // this caused problems resolving A::f() in the docs when there was a A::f(int) but also a
+ // global function f() that exactly matched the argument list.
+ else if (isParentScope(scope,newScope) && newScope->definitionType()==Definition::TypeClass)
+ {
+ // if we a look for a type B and have explicit scope A, then it is also fine if B
+ // is found at the global scope.
+ result = 1;
+ goto done;
+ }
+#endif
// repeat for the parent scope
if (scope!=Doxygen::globalScope)
{
@@ -723,14 +1059,14 @@ int SymbolResolver::Private::isAccessibleFromWithExpScope(
}
else // failed to resolve explicitScope
{
- //printf(" failed to resolve: scope=%s\n",qPrint(scope->name()));
+ //printf(" failed to resolve explicitScope=%s: scope=%s\n",qPrint(explicitScopePart), qPrint(scope->name()));
if (scope->definitionType()==Definition::TypeNamespace)
{
const NamespaceDef *nscope = toNamespaceDef(scope);
StringUnorderedSet visited;
if (accessibleViaUsingNamespace(visited,nscope->getUsedNamespaces(),item,explicitScopePart))
{
- //printf("> found in used namespace\n");
+ //printf(" > found in used namespace\n");
goto done;
}
}
@@ -741,23 +1077,23 @@ int SymbolResolver::Private::isAccessibleFromWithExpScope(
StringUnorderedSet visited;
if (accessibleViaUsingNamespace(visited,m_fileScope->getUsedNamespaces(),item,explicitScopePart))
{
- //printf("> found in used namespace\n");
+ //printf(" > found in used namespace\n");
goto done;
}
}
- //printf("> not found\n");
+ //printf(" > not found\n");
result=-1;
}
else // continue by looking into the parent scope
{
int i=isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope->getOuterScope(),item,explicitScopePart);
- //printf("> result=%d\n",i);
+ //printf(" > result=%d\n",i);
result= (i==-1) ? -1 : i+2;
}
}
done:
- //printf(" > result=%d\n",result);
+ //printf(" > result=%d\n",result);
accessStack.pop();
return result;
}
@@ -775,7 +1111,7 @@ const Definition *SymbolResolver::Private::followPath(const Definition *start,co
// try to resolve the part if it is a typedef
const MemberDef *memTypeDef=0;
QCString qualScopePart = substTypedef(current,path.mid(is,l),&memTypeDef);
- //printf(" qualScopePart=%s\n",qPrint(qualScopePart));
+ //printf(" qualScopePart=%s\n",qPrint(qualScopePart));
if (memTypeDef)
{
const ClassDef *type = newResolveTypedef(m_fileScope,memTypeDef,0,0,0);
@@ -790,6 +1126,50 @@ const Definition *SymbolResolver::Private::followPath(const Definition *start,co
// qPrint(qualScopePart),
// qPrint(current->name()),
// next?qPrint(next->name()):"<null>");
+ if (next==0)
+ {
+ next = current->findInnerCompound(qualScopePart+"-p");
+ }
+ if (current->definitionType()==Definition::TypeClass)
+ {
+ const MemberDef *classMember = toClassDef(current)->getMemberByName(qualScopePart);
+ if (classMember && classMember->isEnumerate())
+ {
+ next = classMember;
+ }
+ }
+ else if (current->definitionType()==Definition::TypeNamespace)
+ {
+ const MemberDef *namespaceMember = toNamespaceDef(current)->getMemberByName(qualScopePart);
+ if (namespaceMember && namespaceMember->isEnumerate())
+ {
+ next = namespaceMember;
+ }
+ }
+ else if (current==Doxygen::globalScope || current->definitionType()==Definition::TypeFile)
+ {
+ auto &range = Doxygen::symbolMap->find(qualScopePart);
+ for (Definition *def : range)
+ {
+ const Definition *outerScope = def->getOuterScope();
+ if (
+ (outerScope==Doxygen::globalScope || // global scope or
+ (outerScope && // anonymous namespace in the global scope
+ outerScope->name().startsWith("anonymous_namespace{") &&
+ outerScope->getOuterScope()==Doxygen::globalScope
+ )
+ ) &&
+ (def->definitionType()==Definition::TypeClass ||
+ def->definitionType()==Definition::TypeMember ||
+ def->definitionType()==Definition::TypeNamespace
+ )
+ )
+ {
+ next=def;
+ break;
+ }
+ }
+ }
if (next==0) // failed to follow the path
{
//printf("==> next==0!\n");
@@ -809,7 +1189,7 @@ const Definition *SymbolResolver::Private::followPath(const Definition *start,co
else // continue to follow scope
{
current = next;
- //printf("==> current = %p\n",current);
+ //printf("==> current = %p\n",(void*)current);
}
ps=is+l;
}
@@ -896,29 +1276,82 @@ int SymbolResolver::Private::isAccessibleFrom(AccessStack &accessStack,
int result=0; // assume we found it
int i;
- Definition *itemScope=item->getOuterScope();
+ const Definition *itemScope=item->getOuterScope();
+ bool itemIsMember = item->definitionType()==Definition::TypeMember;
+ bool itemIsClass = item->definitionType()==Definition::TypeClass;
+
+ // if item is a global member and scope points to a specific file
+ // we adjust the scope so the file gets preference over members with the same name in
+ // other files.
+ if ((itemIsMember || itemIsClass) &&
+ (itemScope==Doxygen::globalScope || // global
+ (itemScope && itemScope->name().startsWith("anonymous_namespace{")) // member of an anonymous namespace
+ ) &&
+ scope->definitionType()==Definition::TypeFile)
+ {
+ if (itemIsMember)
+ {
+ itemScope = toMemberDef(item)->getFileDef();
+ }
+ else if (itemIsClass)
+ {
+ itemScope = toClassDef(item)->getFileDef();
+ }
+ //printf("adjust scope to %s\n",qPrint(itemScope?itemScope->name():QCString()));
+ }
+
bool memberAccessibleFromScope =
- (item->definitionType()==Definition::TypeMember && // a member
+ (itemIsMember && // a member
itemScope && itemScope->definitionType()==Definition::TypeClass && // of a class
scope->definitionType()==Definition::TypeClass && // accessible
(toClassDef(scope))->isAccessibleMember(toMemberDef(item)) // from scope
);
bool nestedClassInsideBaseClass =
- (item->definitionType()==Definition::TypeClass && // a nested class
+ (itemIsClass && // a nested class
itemScope && itemScope->definitionType()==Definition::TypeClass && // inside a base
scope->definitionType()==Definition::TypeClass && // class of scope
(toClassDef(scope))->isBaseClass(toClassDef(itemScope),TRUE)
);
+ bool enumValueOfStrongEnum =
+ (itemIsMember &&
+ toMemberDef(item)->isStrongEnumValue() &&
+ scope->definitionType()==Definition::TypeMember &&
+ toMemberDef(scope)->isEnumerate() &&
+ scope==toMemberDef(item)->getEnumScope()
+ );
- if (itemScope==scope || memberAccessibleFromScope || nestedClassInsideBaseClass)
+ if (itemScope==scope || memberAccessibleFromScope || nestedClassInsideBaseClass || enumValueOfStrongEnum)
{
- //printf("> found it\n");
- if (nestedClassInsideBaseClass) result++; // penalty for base class to prevent
+ //printf("> found it memberAccessibleFromScope=%d nestedClassInsideBaseClass=%d enumValueOfStrongEnum=%d\n",memberAccessibleFromScope,nestedClassInsideBaseClass,enumValueOfStrongEnum);
+ int distanceToBase=0;
+ if (nestedClassInsideBaseClass)
+ {
+ result++; // penalty for base class to prevent
// this is preferred over nested class in this class
// see bug 686956
+ }
+ else if (memberAccessibleFromScope &&
+ itemScope &&
+ itemScope->definitionType()==Definition::TypeClass &&
+ scope->definitionType()==Definition::TypeClass &&
+ (distanceToBase=toClassDef(scope)->isBaseClass(toClassDef(itemScope),TRUE))>0
+ )
+ {
+ result+=distanceToBase; // penalty if member is accessible via a base class
+ }
}
else if (scope==Doxygen::globalScope)
{
+ if (itemScope &&
+ itemScope->definitionType()==Definition::TypeNamespace &&
+ toNamespaceDef(itemScope)->isAnonymous() &&
+ itemScope->getOuterScope()==Doxygen::globalScope)
+ { // item is in an anonymous namespace in the global scope and we are
+ // looking in the global scope
+ //printf("> found in anonymous namespace\n");
+ result++;
+ goto done;
+ }
if (m_fileScope)
{
if (accessibleViaUsingClass(m_fileScope->getUsedClasses(),item))
@@ -956,7 +1389,19 @@ int SymbolResolver::Private::isAccessibleFrom(AccessStack &accessStack,
}
}
// repeat for the parent scope
- i=isAccessibleFrom(accessStack,scope->getOuterScope(),item);
+ const Definition *parentScope = scope->getOuterScope();
+ if (parentScope==Doxygen::globalScope)
+ {
+ if (scope->definitionType()==Definition::TypeClass)
+ {
+ const FileDef *fd = toClassDef(scope)->getFileDef();
+ if (fd)
+ {
+ parentScope = fd;
+ }
+ }
+ }
+ i=isAccessibleFrom(accessStack,parentScope,item);
//printf("> result=%d\n",i);
result= (i==-1) ? -1 : i+2;
}
@@ -972,16 +1417,15 @@ QCString SymbolResolver::Private::substTypedef(
QCString result=name;
if (name.isEmpty()) return result;
- auto range = Doxygen::symbolMap->find(name);
- if (range.first==range.second)
+ auto &range = Doxygen::symbolMap->find(name);
+ if (range.empty())
return result; // no matches
MemberDef *bestMatch=0;
int minDistance=10000; // init at "infinite"
- for (auto it = range.first; it!=range.second; ++it)
+ for (Definition *d : range)
{
- Definition *d = it->second;
// only look at members
if (d->definitionType()==Definition::TypeMember)
{
@@ -1049,14 +1493,14 @@ const ClassDef *SymbolResolver::resolveClass(const Definition *scope,
// qPrint(name),
// mayBeUnlinkable
// );
- const ClassDef *result;
+ const ClassDef *result=0;
if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
{
result = getClass(name);
}
else
{
- result = p->getResolvedClassRec(scope,name,&p->typeDef,&p->templateSpec,&p->resolvedType);
+ result = p->getResolvedTypeRec(scope,name,&p->typeDef,&p->templateSpec,&p->resolvedType);
if (result==0) // for nested classes imported via tag files, the scope may not
// present, so we check the class name directly as well.
// See also bug701314
@@ -1077,6 +1521,18 @@ const ClassDef *SymbolResolver::resolveClass(const Definition *scope,
return result;
}
+const Definition *SymbolResolver::resolveSymbol(const Definition *scope,
+ const QCString &name,
+ const QCString &args,
+ bool checkCV)
+{
+ p->reset();
+ if (scope==0) scope=Doxygen::globalScope;
+ const Definition *result = p->getResolvedSymbolRec(scope,name,args,checkCV,&p->typeDef,&p->templateSpec,&p->resolvedType);
+ //printf("resolveSymbol(%s,%s,%s,%d)=%s\n",qPrint(scope?scope->name():QCString()),qPrint(name),qPrint(args),checkCV,qPrint(result?result->qualifiedName():QCString()));
+ return result;
+}
+
int SymbolResolver::isAccessibleFrom(const Definition *scope,const Definition *item)
{
p->reset();
diff --git a/src/symbolresolver.h b/src/symbolresolver.h
index 89c3e6d..32c6e21 100644
--- a/src/symbolresolver.h
+++ b/src/symbolresolver.h
@@ -60,6 +60,17 @@ class SymbolResolver
return toClassDefMutable(resolveClass(scope,name,mayBeUnlinkable,mayBeHidden));
}
+ /** Find the symbool definition matching name within the scope set.
+ * @param scope The scope to search from.
+ * @param name The name of the symbol.
+ * @param args Argument list associated with the symbol (for functions)
+ * @param checkCV Check const/volatile qualifiers (for methods)
+ */
+ const Definition *resolveSymbol(const Definition *scope,
+ const QCString &name,
+ const QCString &args=QCString(),
+ bool checkCV=false);
+
/** Checks if symbol \a item is accessible from within \a scope.
* @returns -1 if \a item is not accessible or a number indicating how
* many scope levels up the nearest match was found.
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index e83bcc2..97c8933 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -457,7 +457,7 @@ class TagFileParser
case InMember:
case InPackage:
case InDir:
- if (m_curString.right(10)=="autotoc_md") return;
+ if (m_curString.endsWith("autotoc_md")) return;
break;
default:
warn("Unexpected tag 'docanchor' found");
diff --git a/src/template.cpp b/src/template.cpp
index 1a483d0..f1c10ec 100755..100644
--- a/src/template.cpp
+++ b/src/template.cpp
@@ -1221,7 +1221,7 @@ class FilterRelative
public:
static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &)
{
- if (v.isValid() && v.isString() && v.toString().left(2)=="..")
+ if (v.isValid() && v.isString() && v.toString().startsWith(".."))
{
return TRUE;
}
@@ -3123,7 +3123,7 @@ class TemplateNodeIf : public TemplateNodeCreator<TemplateNodeIf>
auto tok = parser->takeNextToken();
// elif 'nodes'
- while (tok && tok->data.left(5)=="elif ")
+ while (tok && tok->data.startsWith("elif "))
{
m_ifGuardedNodes.push_back(std::make_unique<GuardedNodes>());
auto &guardedNodes = m_ifGuardedNodes.back();
diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h
index 6cfed63..5360c35 100644
--- a/src/textdocvisitor.h
+++ b/src/textdocvisitor.h
@@ -85,6 +85,7 @@ class TextDocVisitor : public DocVisitor
void operator()(const DocHtmlCaption &c) { visitChildren(c); }
void operator()(const DocInternal &i) { visitChildren(i); }
void operator()(const DocHRef &h) { visitChildren(h); }
+ void operator()(const DocHtmlDetails &d) { visitChildren(d); }
void operator()(const DocHtmlHeader &h) { visitChildren(h); }
void operator()(const DocImage &i) { visitChildren(i); }
void operator()(const DocDotFile &df) { visitChildren(df); }
diff --git a/src/translator.h b/src/translator.h
index adb552f..a190bfa 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -606,6 +606,9 @@ class Translator
virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
int hour,int minutes,int seconds,
bool includeTime) = 0;
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full) = 0;
+ virtual QCString trMonth(int month, bool first_capital, bool full) = 0;
+ virtual QCString trDayPeriod(int period) = 0;
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_adapter.h b/src/translator_adapter.h
index 241b9dd..c4c014d 100644
--- a/src/translator_adapter.h
+++ b/src/translator_adapter.h
@@ -324,6 +324,9 @@ class TranslatorAdapter_1_7_5 : public TranslatorAdapter_1_8_0
int hour,int minutes,int seconds,
bool includeTime)
{ return english.trDateTime(year,month,day,dayOfWeek,hour,minutes,seconds,includeTime); }
+ virtual QCString trDayPeriod(int period)
+ { return english.trDayPeriod(period); }
+
};
/** Adapter class for languages that only contain translations up to
diff --git a/src/translator_am.h b/src/translator_am.h
index 5159493..43281f2 100644
--- a/src/translator_am.h
+++ b/src/translator_am.h
@@ -1,1794 +1,1811 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- */
-
-/*
- * Translation by
- * Armen Tangamyan <armen.tangamyan@anu.edu.au>
- */
-
-#ifndef TRANSLATOR_AM_H
-#define TRANSLATOR_AM_H
-
-class TranslatorArmenian : public TranslatorAdapter_1_8_0
-{
- public:
- /*! Used for identification of the language. */
- virtual QCString idLanguage()
- { return "armenian"; }
-
- /* Used to get the command(s) for the language support. */
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[latin]{armtex}\n"
- "\\usepackage[armscii8]{inputenc}\n";
- }
- virtual QCString trISOLang()
- { return "hy"; }
- virtual QCString getLanguageString()
- {
- return "0x42b Armenian";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Դասին վերաբերվող ֆունկցիաներ"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Հաշվի առեք, որ սրանք անդամ ֆունկցիաներ չեն)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Մանրամասն նկարագրություն"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Անդամ տիպի սահմանումներ (typedef)"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Անդամ hամարակալումներ"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Անդամ ֆունկցիաներ"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Դաշտեր";
- }
- else
- {
- return "Անդամ տվյալներ";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Մանրամասն..."; }
-
- /*! put in the class documentation */
- /* Isn't used when optimization for C is on. */
- virtual QCString trListOfAllMembers()
- {
- return "Բոլոր անդամների ցուցակը";
- }
-
- /*! used as the title of the "list of all members" page of a class */
- /* Isn't used when optimization for C is on. */
- virtual QCString trMemberList()
- {
- return "Անդամների ցուցակ";
- }
-
- /*! this is the first part of a sentence that is followed by a class name */
- /* Isn't used when optimization for C is on. */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Սա դասի անդամների ամբողջական ցուցակն է "; }
-
- /*! this is the remainder of the sentence after the class name */
- /* Isn't used when optimization for C is on. */
- virtual QCString trIncludingInheritedMembers()
- { return ", ներառյալ բոլոր ժառանգված անդամները"; }
-
- /*! this is put at the author sections at the bottom of man pages.
- * parameter s is name of the project name.
- */
- virtual QCString trGeneratedAutomatically(const QCString &s)
- { QCString result="Ավտոմատ ստեղծված է ելքային կոդից, Doxygen-ի միջոցով, ";
- if (!s.isEmpty()) result+=s+" համար:";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "համարակալման անուն"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "համարակալման արժեք"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "սահմանված"; }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- virtual QCString trModules()
- { return "Մոդուլներ"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Դասերի հիերարխա"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Տվյալների կառուցվածք";
- }
- else
- {
- return "Դասերի ցուցակ";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Ֆայլերի ցուցակ"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Տվյալների դաշտեր";
- }
- else
- {
- return "Դասի անդամներ";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- /*??*/
- virtual QCString trFileMembers()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Գլոբալներ";
- }
- else
- {
- return "Ֆայլի անդամներ";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Նմանատիպ էջեր"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Օրինակներ"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Որոնում"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Այս ժառանգման ցուցակը կոպտորեն է տեսակավորված, "
- "բայց ոչ ամբողջապես, այբբենական կարգով.";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Բոլոր ";
- if (!extractAll) result+="փաստագրված ";
- result+="ֆայլերի մի ցուցակ` կարճ բացատրություններով:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Տվյալների կառուցվածքը` կարճ բացատրություններով.";
- }
- else
- {
- return "Դասերը, կառուցվածքները, միավորումները "
- "և ինտերֆեյսները` կարճ բացատրություններով.";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Բոլոր ";
- if(!extractAll) result+="փաստագրված ";
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- result+="կառուցվածքների և միավորումների դաշտերի ";
- else
- result+="դասի անդամների ";
- result+="ցուցակը`";
- result+=" հղումներով դեպի ";
- if(!extractAll)
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- result+="կառուցվածք/միավորում փաստագրությունները բոլոր անդամների համար.";
- else
- result+="դասի փաստագրությունը բոլոր անդամների համար.";
- }
- else
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- result += "կառուցվածքները/միավորումները, որոնց նրանք պատկանում են.";
- else
- result += "դասերը, որոնց նրանք պատկանում են.";
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Բոլոր ";
- if (!extractAll) result+="փաստագրված ";
-
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- result+="ֆունկցիաների, փոփոխականների, մակրո-հայտարարությունների, "
- "համարակալումների և տիպի սահմանումների (typedef)";
- }
- else
- {
- result+="ֆայլի անդամների ";
- }
- result+="ցուցակը`";
- result+=" հղումներով դեպի ";
- if (extractAll)
- result+="ֆայլերը, որոնց նրանք պատկանում են.";
- else
- result+="փաստագրությունը.";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Բոլոր օրինակների ցուցակը."; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Բոլոր նմանատիպ փաստագրության էջերի ցուցակը."; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Բոլոր մոդուլների ցուցակը."; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return " - Փաստագրություն"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Մոդուլներ"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Դասակարգումներ"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Տվյալների կառուցվածք";
- }
- else
- {
- return "Դասեր";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Ֆայլեր"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Մոդուլներ"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Տվյալների կառուցվածքներ";
- }
- else if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
- {
- return trDesignUnitDocumentation();
- }
- else
- {
- return "Դասեր";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Ֆայլեր"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Օրինակներ"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Հղումների ձեռնարկ"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Մակրոսներ"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Տիպի սահմանումներ (typedef)"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Համարակալումներ"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Ֆունկցիաներ"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Փոփոխականներ"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Հաշվիչ"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Մակրոսներ"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Տիպի սահմանումներ (typedef)"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Համարակալման տիպեր"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Ֆունկցիաներ"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Փոփոխականներ"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Տվյալների կառուցվածք";
- }
- else
- {
- return "Դասեր";
- }
- }
-
- /*! This is used in the documentation of a group before the list of
- * links to documented files
- */
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
- */
- virtual QCString trGeneratedAt(const QCString &date,const QCString &projName)
- {
- QCString result=QCString("Ստեղծվել է ")+date;
- if (!projName.isEmpty()) result+=projName+" -ի համար,";
- result+=" հետևյալ համակարգով.";
- return result;
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const QCString &clName)
- {
- return clName+QCString(" -ի ժառանգման գծագիրը.");
- }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Զգուշացում"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Տարբերակ"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Տարեթիվ"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Վերադարձնում է"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Տեսեք նաև"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Պարամետրեր"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Բացառություններ"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Ստեղծված է հետևյալ համակարգի կողմից"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Անունների տարածությունների ցուցակ"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Բոլոր ";
- if (!extractAll) result+="փաստագրված ";
- result+="անունների տարածությունների ցուցակը` կարճ բացատրություններով.";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Ընկերներ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Դասի ընկերներ և կապված ֆունկցիաներ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const QCString &clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=clName;
- if (isTemplate)
- {
- switch(compType)
- {
- case ClassDef::Class: result+=" Դասի"; break;
- case ClassDef::Struct: result+=" Կառուցվածքի"; break;
- case ClassDef::Union: result+=" Միավորման"; break;
- case ClassDef::Interface: result+=" Ինտերֆեյսի"; break;
- case ClassDef::Protocol: result+=" Արձանագրության"; break;
- case ClassDef::Category: result+=" Դասակարգման"; break;
- case ClassDef::Exception: result+=" Բացառության"; break;
- default: break;
- }
- result+=" Ձևանմուշներ";
- }
- else
- {
- switch(compType)
- {
- case ClassDef::Class: result+=" Դաս"; break;
- case ClassDef::Struct: result+=" Կառուցվածք"; break;
- case ClassDef::Union: result+=" Միավորում"; break;
- case ClassDef::Interface: result+=" Ինտերֆեյս"; break;
- case ClassDef::Protocol: result+=" Արձանագրություն"; break;
- case ClassDef::Category: result+=" Դասակարգում"; break;
- case ClassDef::Exception: result+=" Բացառություն"; break;
- default: break;
- }
- }
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const QCString &fileName)
- {
- return fileName+QCString(" ֆայլեր");
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const QCString &namespaceName)
- {
- QCString result=namespaceName;
- result+=" անունների տարածություններ";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Բաց անդամ ֆունկցիաներ"; }
- virtual QCString trPublicSlots()
- { return "Բաց սլոթեր"; }
- virtual QCString trSignals()
- { return "Ազդանշաններ"; }
- virtual QCString trStaticPublicMembers()
- { return "Բաց ստատիկ անդամ ֆունկցիաներ"; }
- virtual QCString trProtectedMembers()
- { return "Պաշտպանված անդամ ֆունկցիաներ"; }
- virtual QCString trProtectedSlots()
- { return "Պաշտպանված սլոթեր"; }
- virtual QCString trStaticProtectedMembers()
- { return "Պաշտպանված ստատիկ անդամ ֆունկցիաներ"; }
- virtual QCString trPrivateMembers()
- { return "Փակ ֆունկցիաներ"; }
- virtual QCString trPrivateSlots()
- { return "Փակ սլոթեր"; }
- virtual QCString trStaticPrivateMembers()
- { return "Փակ ստատիկ անդամ ֆունկցիաներ"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" և ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Հենքային դասեր - "+trWriteList(numEntries)+":";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Ժառանգորդ դասեր - "+trWriteList(numEntries)+":";
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- return "Վերասահմանված ֆունկցիաներ - "+trWriteList(numEntries)+":";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- return "Վերասահմանված է "+trWriteList(numEntries)+" ում:";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Անունների տարածության անդամներ"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Բոլոր ";
- if (!extractAll) result+="փաստագրված ";
- result+="անունների տարածության անդամների ցուցակը` "
- "հղումներով դեպի ";
- if (extractAll)
- result+="բոլոր անդամների անունների տարածության փաստագրությունը.";
- else
- result+="անունների տարածությունը, որին նրանք պատկանում են.";
- return result;
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Անունների տարածություններ"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Անունների տարածություն"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Անունների տարածություններ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- {
- QCString result = "Այս ";
- switch(compType)
- {
- case ClassDef::Class: result+="դասի"; break;
- case ClassDef::Struct: result+="կառուցվածքի"; break;
- case ClassDef::Union: result+="միավորման"; break;
- case ClassDef::Interface: result+="ինտերֆեյսի"; break;
- case ClassDef::Protocol: result+="արձանագրության"; break;
- case ClassDef::Category: result+="դասակարգման"; break;
- case ClassDef::Exception: result+="բացառության"; break;
- default: break;
- }
- result+=" փաստագրությունը ստեղծվել է հետևյալ ֆայլ";
- if (single) result+="ից."; else result+="երից.";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Վերադարձվող արժեքներ"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Գլխավոր էջ"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "էջ:"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991106
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Սահմանումը @1 ֆայլի @0 տողում է:";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Սահմանումը @0 ֆայլում է:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Հնացած է";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const QCString &clName)
- {
- return clName+"-ի համագործակցությունների գծագիր.";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const QCString &fName)
- {
- return fName+"-ի ներառումների կախվածությունների գծագիր.";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Կառուցիչներ";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Տե'ս այս ֆայլի ելքային կոդը";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Տե'ս այս ֆայլի փաստագրությունը:";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Նախապայման";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Հետպայման";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Անփոփոխ";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Նախնական արժեք";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "Ելքային կոդ";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Գրաֆիկական դասերի հիերարխիա:";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Տե'ս դասերի գրաֆիկական հիերարխիան:";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Տե'ս դասերի տեքստային հիերարխիան:";
- }
- virtual QCString trPageIndex()
- {
- return "էջեր";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Նշում";
- }
- virtual QCString trPublicTypes()
- {
- return "Բաց տիպեր";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Տվյալների դաշտեր";
- }
- else
- {
- return "Բաց ատրիբուտներ";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Բաց ստատիկ ատրիբուտներ";
- }
- virtual QCString trProtectedTypes()
- {
- return "Պաշտպանված տիպեր";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Պաշտպանված ատրիբուտներ";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Պաշտպանված ստատիկ ատրիբուտներ";
- }
- virtual QCString trPrivateTypes()
- {
- return "Փակ տիպեր";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Փակ ատրիբուտներ";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Փակ ստատիկ ատրիբուտներ";
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- /*??*/
- {
- return "Կատարման ենթակա";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- /*??*/
- {
- return "Խնդիրների ցուցակ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Օգտագործվում է հետևյալում - ";
- }
- virtual QCString trRemarks()
- {
- return "Դիտողություններ";
- }
- virtual QCString trAttention()
- {
- return "Ուշադրություն";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Այս գրաֆը ցույց է տալիս, թե որ ֆայլերն են "
- "ուղղակի կամ անուղղակի ներառում տվյալ ֆայլը.";
- }
- virtual QCString trSince()
- /*??*/
- {
- return "Սկսած";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Լեգենդ";
- }
- /*! page explaining how the dot graph's should be interpreted
- * The %A in the text below are to prevent link to classes called "A".
- */
- virtual QCString trLegendDocs()
- {
- return
- "Այս էջը նկարագրում է, թե ինչպես մեկնաբանել doxygen-ի ստեղծած գրաֆները:<p>\n"
- "Դիտարկենք հետևյալ օրինակը.\n"
- "\\code\n"
- "/*! Կրճատման հետևանքով անտեսանելի դաս */\n"
- "class Invisible { };\n\n"
- "/*! Կրճատված դաս, ժառանգությունների հարաբերությունը փակ է */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Չփաստագրված դաս */\n"
- "class Undocumented { };\n\n"
- "/*! Բաց ժառանգում */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Դասի ձևաչափ */\n"
- "template<class T> class Templ {};\n\n"
- "/*! Պաշտպանված ժառանգում */\n"
- "class ProtectedBase { };\n\n"
- "/*! Փակ ժառանգում */\n"
- "class PrivateBase { };\n\n"
- "/*! Դաս, որը օգտագործվում է Inherited դասի կողմից */\n"
- "class Used { };\n\n"
- "/*! Դաս, որը ժառանգում է մի շարք այլ դասերից */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented,\n"
- " public Templ<int>\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Սրանով կստանանք հետևյալ գրաֆը."
- "<p><center><img src=\"graph_legend."+getDotImageExtension()+"\"></center>\n"
- "<p>\n"
- "Այս գրաֆի ուղղանկյունները ունեն հետևյալ իմաստը.\n"
- "<ul>\n"
- "<li>%A լցոնվաց մոխրագույն ուղղանկյունը ներկայացնում է այն դասը կամ կառուցվածքը, "
- "որի համար ստեղծվել է տվյալ գրաֆը:</li>\n"
- "<li>%A սև եզրերով ուղղանկյունը նշանակում է փաստագրված դաս կամ կարուցվածք:</li>\n"
- "<li>%A մոխրագույն եզրերով ուղղանկյունը նշանակում է չփաստագրված դաս կամ կառուցվածք:</li>\n"
- "<li>%A կարմիր եզրերով ուղղանկյունը նշանակում է դաս կամ կառուցվածք, որի համար\n"
- " ոչ բոլոր ժառանգում/պարունակում կապերն են ցուցադրված: Գրաֆը կրճատված է, "
- "եթե այն չի տեղավորվում նշված սահմաններում:</li>\n"
- "</ul>\n"
- "Սլաքները ունեն հետևյալ իմաստը.\n"
- "<ul>\n"
- "<li>%A մուգ կապույտ սլաքը օգտագործվում է երկու դասերի միջև բաց ժառանգում "
- "կապը ցուցադրելու համար:</li>\n"
- "<li>%A մուգ կանաչ սլաքը օգտագործվում է պաշտպանված ժառանգման համար:</li>\n"
- "<li>%A մուգ կարմիր սլաքը օգտագործվում է փակ ժառանգման համար:</li>\n"
- "<li>%A մանուշակագույն կետագիծ սլաքը օգտագորշվում է, եթե դասը պարունակվում է"
- "այլ դասում կամ օգտագորշվում է այլ դասի կողմից: Սլաքը պիտակավորվաշ է"
- "փոփոխական(ներ)ով, որի միջոցով մատնանշված դասը կամ կառուցվածքը հասանելի է:</li>\n"
- "<li>Դեզին կետագիծ սլաքը ցույց է տալիս ձևանմուշի օրինակի կապը այն ձևանմուշի հետ, "
- "որից այն իրականցվել է. Սլաքը պիտակավորված է օրինակի ձևանմուշային պարամետրերով:</li>\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "լեգենդ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Թեստ";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Թեստերի ցուցակ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Հատկություններ";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Հատկություններ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Տվյալների կառուցվածք";
- }
- else
- {
- return "Դասեր";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const QCString &name)
- {
- return "Փաթեթ "+name;
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Բոլոր փաթեթները` կարճ բացատրություններով (եթե հասանելի են).";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Փաթեթներ";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Արժեքներ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Սխալ";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Սխալների ցուցակ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
- /*! Used as ansicpg for RTF file */
- virtual QCString trRTFansicp()
- {
- return "armscii-8";
- }
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Ցուցիչ";
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trClass(bool first_capital, bool singular)
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- QCString result((first_capital ? "Տվյալների կառուցվածք" : "տվյալների կառուցվածք"));
- return result;
- }
- else
- {
- QCString result((first_capital ? "Դաս" : "դաս"));
- if(!singular) result+="եր";
- return result;
- }
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Ֆայլ" : "ֆայլ"));
- if (!singular) result+="եր";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Անունների տարածություն" : "անունների տարածություն"));
- if (!singular) result+="ներ";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Խ" : "խ"));
- result+=(singular ? "ումբ" : "մբեր");
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Էջ" : "էջ"));
- if (!singular) result+="եր";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Անդամ" : "անդամ"));
- if (!singular) result+="ներ";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Գլոբալ" : "գլոբալ"));
- if (!singular) result+="ներ";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Հեղինակ" : "հեղինակ"));
- if (!singular) result+="ներ";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Հղումներ - ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.13
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in member documentation blocks to produce a list of
- * members that are implemented by this one.
- */
- virtual QCString trImplementedFromList(int numEntries)
- {
- return "Իրագործում է հետևյալ դաս(եր)ի ֆունկցիաները - "+trWriteList(numEntries)+":";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implementation this member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return "Իրագործվում է հետևյալում - "+trWriteList(numEntries)+":";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Բովանդակություն";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Հնացած սահմանումների ցուցակը";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Պատահարներ";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Պատահարների ցուցակը";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Փաթեթի տիպեր";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageFunctions()
- {
- return "Փաթեթի ֆունկցիաներ";
- }
- virtual QCString trPackageMembers()
- {
- return "Փաթեթի անդամներ";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageFunctions()
- {
- return "Փաթեթի ստատիկ ֆունկցիաներ";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Փաթեթի ատրիբուտներ";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Փաթեթի ստատիկ ատրիբուտներ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used in the quick index of a class/file/namespace member list page
- * to link to the unfiltered list of all members.
- */
- virtual QCString trAll()
- {
- return "Բոլոր";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Այս ֆունկցիայի կանչերի գրաֆը.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Որոնման արդյունքները";
- }
- /*! This string is put just before listing the search results. The
- * text can be different depending on the number of documents found.
- * Inside the text you can put the special marker $num to insert
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Ներեցեք, բայց Ձեր որոնումը արդյունք չտվեց:";
- }
- else if( numDocuments == 1 )
- {
- return "Հայտնաբերվել է 1 փաստաթուղթ:";
- }
- else
- {
- return "Հայտնաբերվել է <b>$num</b> փաստաթուղթ:"
- "Փաստաթղթերը դասակարգված են ըստ համապասխանության";
- }
- }
- /*! This string is put before the list of matched words, for each search
- * result. What follows is the list of words that matched the query.
- */
- virtual QCString trSearchMatches()
- {
- return "Որոնման արդյունքներ:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.8
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in HTML as the title of page with source code for file filename
- */
- virtual QCString trSourceFile(QCString& filename)
- {
- return "Ելակետային ֆայլ " + filename;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Ֆայլադարանների հիերարխիա"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Ֆայլադարաններ"; }
-
- /*! This is used as the title of the directory index and also in the
- * Quick links of a HTML page, to link to the directory hierarchy.
- */
- virtual QCString trDirectories()
- { return "Ֆայլադրաններ"; }
-
- /*! This returns the title of a directory page. The name of the
- * directory is passed via \a dirName.
- */
- virtual QCString trDirReference(const QCString &dirName)
- { QCString result=dirName; result+=" Ֆայլադարան"; return result; }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Ֆայլադարան" : "ֆայլադարան"));
- if (!singular) result+="ներ";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.4.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is added to the documentation when the \\overload command
- * is used for a overloaded function.
- */
- virtual QCString trOverloadText()
- {
- return "Սա վերաբեռնված ֆունկցիա է` տրամադրված հարմարության համար: "
- "Այն տարբերվում է նախնականից միայն արգումնետներով:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.4.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used to introduce a caller (or called-by) graph */
- virtual QCString trCallerGraph()
- {
- return "Այս ֆունկցիայի կանչերի գրաֆը.";
- }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Համարակալումներ"; }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.5.4 (mainly for Fortran)
-//////////////////////////////////////////////////////////////////////////
- /*! header that is put before the list of member subprograms (Fortran). */
- virtual QCString trMemberFunctionDocumentationFortran()
- { return "Անդամ ֆունցիաներ/ենթածրագրեր"; }
-
- /*! This is put above each page as a link to the list of annotated data types (Fortran). */
- virtual QCString trCompoundListFortran()
- { return "Տվյալների տիպերի ցուցակը"; }
-
- /*! This is put above each page as a link to all members of compounds (Fortran). */
- virtual QCString trCompoundMembersFortran()
- { return "Տվյալների դաշտեր"; }
-
- /*! This is an introduction to the annotated compound list (Fortran). */
- virtual QCString trCompoundListDescriptionFortran()
- { return "Տվյալների տիպերը` կարճ բացատրություններով."; }
-
- /*! This is an introduction to the page with all data types (Fortran). */
- virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
- {
- QCString result="Բոլոր ";
- if (!extractAll)
- {
- result+="փաստագրված ";
- }
- result+="տվյալների տիպերի անդամների ցուցակը` հղումներով դեպի ";
- if (!extractAll)
- {
- result+="բոլոր անդամների տվյալների կառուցվածքի փաստագրությունը";
- }
- else
- {
- result+="տվյալների տիպերը, որոնց նրանք պատկանում են";
- }
- return result;
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index (Fortran).
- */
- virtual QCString trCompoundIndexFortran()
- { return "Տվյալների տիպեր"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all data types (Fortran).
- */
- virtual QCString trTypeDocumentation()
- { return "Տվյալների տիպեր"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) subprograms (Fortran).
- */
- virtual QCString trSubprograms()
- { return "Ֆունկցիաներ/ենթածրագրեր"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for subprograms (Fortran)
- */
- virtual QCString trSubprogramDocumentation()
- { return "Ֆունկցիաներ/ենթածրագրեր"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds (Fortran)
- */
- virtual QCString trDataTypes()
- { return "Տվյալների տիպեր"; }
-
- /*! used as the title of page containing all the index of all modules (Fortran). */
- virtual QCString trModulesList()
- { return "Մոդուլների ցուցակ"; }
-
- /*! used as an introduction to the modules list (Fortran) */
- virtual QCString trModulesListDescription(bool extractAll)
- {
- QCString result="Բոլոր";
- if (!extractAll) result+="փաստագրված ";
- result+="մոդուլների ցուցակը` կարճ բացատրություններով.";
- return result;
- }
-
- /*! used as the title of the HTML page of a module/type (Fortran) */
- virtual QCString trCompoundReferenceFortran(const QCString &clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=clName;
- if (!isTemplate)
- {
- switch(compType)
- {
- case ClassDef::Class: result+=" Մոդուլ"; break;
- case ClassDef::Struct: result+=" Տիպ"; break;
- case ClassDef::Union: result+=" Միավորում"; break;
- case ClassDef::Interface: result+=" Ինտերֆեյս"; break;
- case ClassDef::Protocol: result+=" Արձանագրություն"; break;
- case ClassDef::Category: result+=" Դասակարգում"; break;
- case ClassDef::Exception: result+=" Բացառություն"; break;
- default: break;
- }
- }
- else
- {
- switch(compType)
- {
- case ClassDef::Class: result+=" Մոդուլի"; break;
- case ClassDef::Struct: result+=" Տիպի"; break;
- case ClassDef::Union: result+=" Միավորման"; break;
- case ClassDef::Interface: result+=" Ինտերֆեյսի"; break;
- case ClassDef::Protocol: result+=" Արձանագրության"; break;
- case ClassDef::Category: result+=" Դասակարգման"; break;
- case ClassDef::Exception: result+=" Բացառության"; break;
- default: break;
- }
- result+=" Ձևանմուշ";
- }
- return result;
- }
- /*! used as the title of the HTML page of a module (Fortran) */
- virtual QCString trModuleReference(const QCString &namespaceName)
- {
- return QCString("Մոդուլ ") + namespaceName;
- }
-
- /*! This is put above each page as a link to all members of modules. (Fortran) */
- virtual QCString trModulesMembers()
- { return "Մոդուլի անդամներ"; }
-
- /*! This is an introduction to the page with all modules members (Fortran) */
- virtual QCString trModulesMemberDescription(bool extractAll)
- {
- QCString result="Մոդուլի բոլոր ";
- if (!extractAll) result+="փաստագրված ";
- result+="անդամների ցուցակը` հղումներով դեպի ";
- if (extractAll)
- {
- result+="բոլոր անդամների փաստագրությունները.";
- }
- else
- {
- result+="մոդուլները, որոնց նրանք պատկանում են.";
- }
- return result;
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all modules (Fortran).
- */
- virtual QCString trModulesIndex()
- { return "Մոդուլներ"; }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trModule(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Մոդուլ" : "մոդուլ"));
- if (!singular) result+="ներ";
- return result;
- }
- /*! This is put at the bottom of a module documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Module", " Struct" or " Union"
- // single is true implies a single file
- QCString result="Այս ";
- switch(compType)
- {
- case ClassDef::Class: result+="մոդուլի"; break;
- case ClassDef::Struct: result+="տիպի"; break;
- case ClassDef::Union: result+="միավորման"; break;
- case ClassDef::Interface: result+="ինտերֆեյսի"; break;
- case ClassDef::Protocol: result+="արձանագրության"; break;
- case ClassDef::Category: result+="դասակարգման"; break;
- case ClassDef::Exception: result+="բացառության"; break;
- default: break;
- }
- result+=" փաստագրությունը ստեղծվել է հետևալ ֆայլ";
- if (single) result+="ից."; else result+="երից.";
- return result;
- }
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trType(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Տիպ" : "տիպ"));
- if (!singular) result+="եր";
- return result;
- }
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trSubprogram(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Ե" : "ե"));
- if (singular) result+="նթածրագիր"; else result+="նթածրագրեր";
- return result;
- }
-
- /*! C# Type Constraint list */
- virtual QCString trTypeConstraints()
- {
- return "Տիպերի Սահմանափակումներ";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.6.0 (mainly for the new search engine)
-//////////////////////////////////////////////////////////////////////////
-
- /*! directory relation for \a name */
- virtual QCString trDirRelation(const QCString &name)
- {
- return QCString(name)+" Կապ";
- }
-
- /*! Loading message shown when loading search results */
- virtual QCString trLoading()
- {
- return "Բեռնում...";
- }
-
- /*! Label used for search results in the global namespace */
- virtual QCString trGlobalNamespace()
- {
- return "Գլոբալ անունների տարածություն";
- }
-
- /*! Message shown while searching */
- virtual QCString trSearching()
- {
- return "Որոնում...";
- }
-
- /*! Text shown when no search results are found */
- virtual QCString trNoMatches()
- {
- return "Անարդյունք";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.6.3 (missing items for the directory pages)
-//////////////////////////////////////////////////////////////////////////
-
- /*! when clicking a directory dependency label, a page with a
- * table is shown. The heading for the first column mentions the
- * source file that has a relation to another file.
- */
- virtual QCString trFileIn(const QCString &name)
- {
- return "Ֆայլը " + name + " ում";
- }
-
- /*! when clicking a directory dependency label, a page with a
- * table is shown. The heading for the second column mentions the
- * destination file that is included.
- */
- virtual QCString trIncludesFileIn(const QCString &name)
- {
- return "Ներառում է ֆայլը " + name + " ում";
- }
-
- /** Compiles a date string.
- * @param year Year in 4 digits
- * @param month Month of the year: 1=January
- * @param day Day of the Month: 1..31
- * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
- * @param hour Hour of the day: 0..23
- * @param minutes Minutes in the hour: 0..59
- * @param seconds Seconds within the minute: 0..59
- * @param includeTime Include time in the result string?
- */
- virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
- int hour,int minutes,int seconds,
- bool includeTime)
- {
- static const char *days[] = { "Երկուշաբթի,","Երեքշաբթի,","Չորեքշաբթի,","Հինգշաբթի,",
- "Ուրբաթ,","Շաբաթ,","Կիրակի," };
- static const char *months[] = { "Հունիսի","Փետրվարի","Մարտի","Ապրրիլի","Մայիսի","Հունիսի",
- "Հուլիսի","Օգոստոսի","Սեպտեմբերի","Հոկտեբմերի","Նոյեմբերի","Դեկտեմբերի" };
- QCString sdate;
- sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
- if (includeTime)
- {
- QCString stime;
- stime.sprintf(" %.2d:%.2d:%.2d ",hour,minutes,seconds);
- sdate+=stime;
- }
- return sdate;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.7.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Header for the page with bibliographic citations */
- virtual QCString trCiteReferences()
- { return "Գրականություն"; }
-
- /*! Text for copyright paragraph */
- virtual QCString trCopyright()
- { return "Հեղինակային իրավունք"; }
-
- /*! Header for the graph showing the directory dependencies */
- virtual QCString trDirDepGraph(const QCString &name)
- { return name + QCString("-ի ֆայլադարանների կախվածությունների գծագիր:"); }
-
-};
-#endif
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ */
+
+/*
+ * Translation by
+ * Armen Tangamyan <armen.tangamyan@anu.edu.au>
+ */
+
+#ifndef TRANSLATOR_AM_H
+#define TRANSLATOR_AM_H
+
+class TranslatorArmenian : public TranslatorAdapter_1_8_0
+{
+ public:
+ /*! Used for identification of the language. */
+ virtual QCString idLanguage()
+ { return "armenian"; }
+
+ /* Used to get the command(s) for the language support. */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[latin]{armtex}\n"
+ "\\usepackage[armscii8]{inputenc}\n";
+ }
+ virtual QCString trISOLang()
+ { return "hy"; }
+ virtual QCString getLanguageString()
+ {
+ return "0x42b Armenian";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Դասին վերաբերվող ֆունկցիաներ"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Հաշվի առեք, որ սրանք անդամ ֆունկցիաներ չեն)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Մանրամասն նկարագրություն"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Անդամ տիպի սահմանումներ (typedef)"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Անդամ hամարակալումներ"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Անդամ ֆունկցիաներ"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Դաշտեր";
+ }
+ else
+ {
+ return "Անդամ տվյալներ";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Մանրամասն..."; }
+
+ /*! put in the class documentation */
+ /* Isn't used when optimization for C is on. */
+ virtual QCString trListOfAllMembers()
+ {
+ return "Բոլոր անդամների ցուցակը";
+ }
+
+ /*! used as the title of the "list of all members" page of a class */
+ /* Isn't used when optimization for C is on. */
+ virtual QCString trMemberList()
+ {
+ return "Անդամների ցուցակ";
+ }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ /* Isn't used when optimization for C is on. */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Սա դասի անդամների ամբողջական ցուցակն է "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ /* Isn't used when optimization for C is on. */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", ներառյալ բոլոր ժառանգված անդամները"; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const QCString &s)
+ { QCString result="Ավտոմատ ստեղծված է ելքային կոդից, Doxygen-ի միջոցով, ";
+ if (!s.isEmpty()) result+=s+" համար:";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "համարակալման անուն"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "համարակալման արժեք"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "սահմանված"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Մոդուլներ"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Դասերի հիերարխա"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասերի ցուցակ";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Ֆայլերի ցուցակ"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների դաշտեր";
+ }
+ else
+ {
+ return "Դասի անդամներ";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ /*??*/
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Գլոբալներ";
+ }
+ else
+ {
+ return "Ֆայլի անդամներ";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Նմանատիպ էջեր"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Օրինակներ"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Որոնում"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Այս ժառանգման ցուցակը կոպտորեն է տեսակավորված, "
+ "բայց ոչ ամբողջապես, այբբենական կարգով.";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="ֆայլերի մի ցուցակ` կարճ բացատրություններով:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածքը` կարճ բացատրություններով.";
+ }
+ else
+ {
+ return "Դասերը, կառուցվածքները, միավորումները "
+ "և ինտերֆեյսները` կարճ բացատրություններով.";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if(!extractAll) result+="փաստագրված ";
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ result+="կառուցվածքների և միավորումների դաշտերի ";
+ else
+ result+="դասի անդամների ";
+ result+="ցուցակը`";
+ result+=" հղումներով դեպի ";
+ if(!extractAll)
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ result+="կառուցվածք/միավորում փաստագրությունները բոլոր անդամների համար.";
+ else
+ result+="դասի փաստագրությունը բոլոր անդամների համար.";
+ }
+ else
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ result += "կառուցվածքները/միավորումները, որոնց նրանք պատկանում են.";
+ else
+ result += "դասերը, որոնց նրանք պատկանում են.";
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ result+="ֆունկցիաների, փոփոխականների, մակրո-հայտարարությունների, "
+ "համարակալումների և տիպի սահմանումների (typedef)";
+ }
+ else
+ {
+ result+="ֆայլի անդամների ";
+ }
+ result+="ցուցակը`";
+ result+=" հղումներով դեպի ";
+ if (extractAll)
+ result+="ֆայլերը, որոնց նրանք պատկանում են.";
+ else
+ result+="փաստագրությունը.";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Բոլոր օրինակների ցուցակը."; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Բոլոր նմանատիպ փաստագրության էջերի ցուցակը."; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Բոլոր մոդուլների ցուցակը."; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return " - Փաստագրություն"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Մոդուլներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Դասակարգումներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Ֆայլեր"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Մոդուլներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածքներ";
+ }
+ else if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
+ {
+ return trDesignUnitDocumentation();
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Ֆայլեր"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Օրինակներ"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Հղումների ձեռնարկ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Մակրոսներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Տիպի սահմանումներ (typedef)"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Համարակալումներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Ֆունկցիաներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Փոփոխականներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Հաշվիչ"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Մակրոսներ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Տիպի սահմանումներ (typedef)"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Համարակալման տիպեր"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Ֆունկցիաներ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Փոփոխականներ"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+
+ /*! This is used in the documentation of a group before the list of
+ * links to documented files
+ */
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const QCString &date,const QCString &projName)
+ {
+ QCString result=QCString("Ստեղծվել է ")+date;
+ if (!projName.isEmpty()) result+=projName+" -ի համար,";
+ result+=" հետևյալ համակարգով.";
+ return result;
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const QCString &clName)
+ {
+ return clName+QCString(" -ի ժառանգման գծագիրը.");
+ }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Զգուշացում"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Տարբերակ"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Տարեթիվ"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Վերադարձնում է"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Տեսեք նաև"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Պարամետրեր"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Բացառություններ"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Ստեղծված է հետևյալ համակարգի կողմից"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Անունների տարածությունների ցուցակ"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="անունների տարածությունների ցուցակը` կարճ բացատրություններով.";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Ընկերներ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Դասի ընկերներ և կապված ֆունկցիաներ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const QCString &clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=clName;
+ if (isTemplate)
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Դասի"; break;
+ case ClassDef::Struct: result+=" Կառուցվածքի"; break;
+ case ClassDef::Union: result+=" Միավորման"; break;
+ case ClassDef::Interface: result+=" Ինտերֆեյսի"; break;
+ case ClassDef::Protocol: result+=" Արձանագրության"; break;
+ case ClassDef::Category: result+=" Դասակարգման"; break;
+ case ClassDef::Exception: result+=" Բացառության"; break;
+ default: break;
+ }
+ result+=" Ձևանմուշներ";
+ }
+ else
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Դաս"; break;
+ case ClassDef::Struct: result+=" Կառուցվածք"; break;
+ case ClassDef::Union: result+=" Միավորում"; break;
+ case ClassDef::Interface: result+=" Ինտերֆեյս"; break;
+ case ClassDef::Protocol: result+=" Արձանագրություն"; break;
+ case ClassDef::Category: result+=" Դասակարգում"; break;
+ case ClassDef::Exception: result+=" Բացառություն"; break;
+ default: break;
+ }
+ }
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const QCString &fileName)
+ {
+ return fileName+QCString(" ֆայլեր");
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const QCString &namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" անունների տարածություններ";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Բաց անդամ ֆունկցիաներ"; }
+ virtual QCString trPublicSlots()
+ { return "Բաց սլոթեր"; }
+ virtual QCString trSignals()
+ { return "Ազդանշաններ"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Բաց ստատիկ անդամ ֆունկցիաներ"; }
+ virtual QCString trProtectedMembers()
+ { return "Պաշտպանված անդամ ֆունկցիաներ"; }
+ virtual QCString trProtectedSlots()
+ { return "Պաշտպանված սլոթեր"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Պաշտպանված ստատիկ անդամ ֆունկցիաներ"; }
+ virtual QCString trPrivateMembers()
+ { return "Փակ ֆունկցիաներ"; }
+ virtual QCString trPrivateSlots()
+ { return "Փակ սլոթեր"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Փակ ստատիկ անդամ ֆունկցիաներ"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" և ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Հենքային դասեր - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Ժառանգորդ դասեր - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Վերասահմանված ֆունկցիաներ - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Վերասահմանված է "+trWriteList(numEntries)+" ում:";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Անունների տարածության անդամներ"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="անունների տարածության անդամների ցուցակը` "
+ "հղումներով դեպի ";
+ if (extractAll)
+ result+="բոլոր անդամների անունների տարածության փաստագրությունը.";
+ else
+ result+="անունների տարածությունը, որին նրանք պատկանում են.";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Անունների տարածություններ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Անունների տարածություն"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Անունների տարածություններ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ {
+ QCString result = "Այս ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="դասի"; break;
+ case ClassDef::Struct: result+="կառուցվածքի"; break;
+ case ClassDef::Union: result+="միավորման"; break;
+ case ClassDef::Interface: result+="ինտերֆեյսի"; break;
+ case ClassDef::Protocol: result+="արձանագրության"; break;
+ case ClassDef::Category: result+="դասակարգման"; break;
+ case ClassDef::Exception: result+="բացառության"; break;
+ default: break;
+ }
+ result+=" փաստագրությունը ստեղծվել է հետևյալ ֆայլ";
+ if (single) result+="ից."; else result+="երից.";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Վերադարձվող արժեքներ"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Գլխավոր էջ"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "էջ:"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Սահմանումը @1 ֆայլի @0 տողում է:";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Սահմանումը @0 ֆայլում է:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Հնացած է";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const QCString &clName)
+ {
+ return clName+"-ի համագործակցությունների գծագիր.";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const QCString &fName)
+ {
+ return fName+"-ի ներառումների կախվածությունների գծագիր.";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Կառուցիչներ";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Տե'ս այս ֆայլի ելքային կոդը";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Տե'ս այս ֆայլի փաստագրությունը:";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Նախապայման";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Հետպայման";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Անփոփոխ";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Նախնական արժեք";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "Ելքային կոդ";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Գրաֆիկական դասերի հիերարխիա:";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Տե'ս դասերի գրաֆիկական հիերարխիան:";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Տե'ս դասերի տեքստային հիերարխիան:";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "էջեր";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Նշում";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Բաց տիպեր";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների դաշտեր";
+ }
+ else
+ {
+ return "Բաց ատրիբուտներ";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Բաց ստատիկ ատրիբուտներ";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Պաշտպանված տիպեր";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Պաշտպանված ատրիբուտներ";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Պաշտպանված ստատիկ ատրիբուտներ";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Փակ տիպեր";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Փակ ատրիբուտներ";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Փակ ստատիկ ատրիբուտներ";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ /*??*/
+ {
+ return "Կատարման ենթակա";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ /*??*/
+ {
+ return "Խնդիրների ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Օգտագործվում է հետևյալում - ";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Դիտողություններ";
+ }
+ virtual QCString trAttention()
+ {
+ return "Ուշադրություն";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Այս գրաֆը ցույց է տալիս, թե որ ֆայլերն են "
+ "ուղղակի կամ անուղղակի ներառում տվյալ ֆայլը.";
+ }
+ virtual QCString trSince()
+ /*??*/
+ {
+ return "Սկսած";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Լեգենդ";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Այս էջը նկարագրում է, թե ինչպես մեկնաբանել doxygen-ի ստեղծած գրաֆները:<p>\n"
+ "Դիտարկենք հետևյալ օրինակը.\n"
+ "\\code\n"
+ "/*! Կրճատման հետևանքով անտեսանելի դաս */\n"
+ "class Invisible { };\n\n"
+ "/*! Կրճատված դաս, ժառանգությունների հարաբերությունը փակ է */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Չփաստագրված դաս */\n"
+ "class Undocumented { };\n\n"
+ "/*! Բաց ժառանգում */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Դասի ձևաչափ */\n"
+ "template<class T> class Templ {};\n\n"
+ "/*! Պաշտպանված ժառանգում */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Փակ ժառանգում */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Դաս, որը օգտագործվում է Inherited դասի կողմից */\n"
+ "class Used { };\n\n"
+ "/*! Դաս, որը ժառանգում է մի շարք այլ դասերից */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Սրանով կստանանք հետևյալ գրաֆը."
+ "<p><center><img src=\"graph_legend."+getDotImageExtension()+"\"></center>\n"
+ "<p>\n"
+ "Այս գրաֆի ուղղանկյունները ունեն հետևյալ իմաստը.\n"
+ "<ul>\n"
+ "<li>%A լցոնվաց մոխրագույն ուղղանկյունը ներկայացնում է այն դասը կամ կառուցվածքը, "
+ "որի համար ստեղծվել է տվյալ գրաֆը:</li>\n"
+ "<li>%A սև եզրերով ուղղանկյունը նշանակում է փաստագրված դաս կամ կարուցվածք:</li>\n"
+ "<li>%A մոխրագույն եզրերով ուղղանկյունը նշանակում է չփաստագրված դաս կամ կառուցվածք:</li>\n"
+ "<li>%A կարմիր եզրերով ուղղանկյունը նշանակում է դաս կամ կառուցվածք, որի համար\n"
+ " ոչ բոլոր ժառանգում/պարունակում կապերն են ցուցադրված: Գրաֆը կրճատված է, "
+ "եթե այն չի տեղավորվում նշված սահմաններում:</li>\n"
+ "</ul>\n"
+ "Սլաքները ունեն հետևյալ իմաստը.\n"
+ "<ul>\n"
+ "<li>%A մուգ կապույտ սլաքը օգտագործվում է երկու դասերի միջև բաց ժառանգում "
+ "կապը ցուցադրելու համար:</li>\n"
+ "<li>%A մուգ կանաչ սլաքը օգտագործվում է պաշտպանված ժառանգման համար:</li>\n"
+ "<li>%A մուգ կարմիր սլաքը օգտագործվում է փակ ժառանգման համար:</li>\n"
+ "<li>%A մանուշակագույն կետագիծ սլաքը օգտագորշվում է, եթե դասը պարունակվում է"
+ "այլ դասում կամ օգտագորշվում է այլ դասի կողմից: Սլաքը պիտակավորվաշ է"
+ "փոփոխական(ներ)ով, որի միջոցով մատնանշված դասը կամ կառուցվածքը հասանելի է:</li>\n"
+ "<li>Դեզին կետագիծ սլաքը ցույց է տալիս ձևանմուշի օրինակի կապը այն ձևանմուշի հետ, "
+ "որից այն իրականցվել է. Սլաքը պիտակավորված է օրինակի ձևանմուշային պարամետրերով:</li>\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "լեգենդ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Թեստ";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Թեստերի ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Հատկություններ";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Հատկություններ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const QCString &name)
+ {
+ return "Փաթեթ "+name;
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Բոլոր փաթեթները` կարճ բացատրություններով (եթե հասանելի են).";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Փաթեթներ";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Արժեքներ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Սխալ";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Սխալների ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "armscii-8";
+ }
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Ցուցիչ";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ QCString result((first_capital ? "Տվյալների կառուցվածք" : "տվյալների կառուցվածք"));
+ return result;
+ }
+ else
+ {
+ QCString result((first_capital ? "Դաս" : "դաս"));
+ if(!singular) result+="եր";
+ return result;
+ }
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ֆայլ" : "ֆայլ"));
+ if (!singular) result+="եր";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Անունների տարածություն" : "անունների տարածություն"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Խ" : "խ"));
+ result+=(singular ? "ումբ" : "մբեր");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Էջ" : "էջ"));
+ if (!singular) result+="եր";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Անդամ" : "անդամ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Գլոբալ" : "գլոբալ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Հեղինակ" : "հեղինակ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Հղումներ - ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Իրագործում է հետևյալ դաս(եր)ի ֆունկցիաները - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implementation this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Իրագործվում է հետևյալում - "+trWriteList(numEntries)+":";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Բովանդակություն";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Հնացած սահմանումների ցուցակը";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Պատահարներ";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Պատահարների ցուցակը";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Փաթեթի տիպեր";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageFunctions()
+ {
+ return "Փաթեթի ֆունկցիաներ";
+ }
+ virtual QCString trPackageMembers()
+ {
+ return "Փաթեթի անդամներ";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageFunctions()
+ {
+ return "Փաթեթի ստատիկ ֆունկցիաներ";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Փաթեթի ատրիբուտներ";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Փաթեթի ստատիկ ատրիբուտներ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Բոլոր";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Այս ֆունկցիայի կանչերի գրաֆը.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Որոնման արդյունքները";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Ներեցեք, բայց Ձեր որոնումը արդյունք չտվեց:";
+ }
+ else if( numDocuments == 1 )
+ {
+ return "Հայտնաբերվել է 1 փաստաթուղթ:";
+ }
+ else
+ {
+ return "Հայտնաբերվել է <b>$num</b> փաստաթուղթ:"
+ "Փաստաթղթերը դասակարգված են ըստ համապասխանության";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Որոնման արդյունքներ:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Ելակետային ֆայլ " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Ֆայլադարանների հիերարխիա"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Ֆայլադարաններ"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Ֆայլադրաններ"; }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const QCString &dirName)
+ { QCString result=dirName; result+=" Ֆայլադարան"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ֆայլադարան" : "ֆայլադարան"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Սա վերաբեռնված ֆունկցիա է` տրամադրված հարմարության համար: "
+ "Այն տարբերվում է նախնականից միայն արգումնետներով:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Այս ֆունկցիայի կանչերի գրաֆը.";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Համարակալումներ"; }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Անդամ ֆունցիաներ/ենթածրագրեր"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Տվյալների տիպերի ցուցակը"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Տվյալների դաշտեր"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Տվյալների տիպերը` կարճ բացատրություններով."; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll)
+ {
+ result+="փաստագրված ";
+ }
+ result+="տվյալների տիպերի անդամների ցուցակը` հղումներով դեպի ";
+ if (!extractAll)
+ {
+ result+="բոլոր անդամների տվյալների կառուցվածքի փաստագրությունը";
+ }
+ else
+ {
+ result+="տվյալների տիպերը, որոնց նրանք պատկանում են";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Տվյալների տիպեր"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Տվյալների տիպեր"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Ֆունկցիաներ/ենթածրագրեր"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Ֆունկցիաներ/ենթածրագրեր"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Տվյալների տիպեր"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Մոդուլների ցուցակ"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Բոլոր";
+ if (!extractAll) result+="փաստագրված ";
+ result+="մոդուլների ցուցակը` կարճ բացատրություններով.";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const QCString &clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=clName;
+ if (!isTemplate)
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Մոդուլ"; break;
+ case ClassDef::Struct: result+=" Տիպ"; break;
+ case ClassDef::Union: result+=" Միավորում"; break;
+ case ClassDef::Interface: result+=" Ինտերֆեյս"; break;
+ case ClassDef::Protocol: result+=" Արձանագրություն"; break;
+ case ClassDef::Category: result+=" Դասակարգում"; break;
+ case ClassDef::Exception: result+=" Բացառություն"; break;
+ default: break;
+ }
+ }
+ else
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Մոդուլի"; break;
+ case ClassDef::Struct: result+=" Տիպի"; break;
+ case ClassDef::Union: result+=" Միավորման"; break;
+ case ClassDef::Interface: result+=" Ինտերֆեյսի"; break;
+ case ClassDef::Protocol: result+=" Արձանագրության"; break;
+ case ClassDef::Category: result+=" Դասակարգման"; break;
+ case ClassDef::Exception: result+=" Բացառության"; break;
+ default: break;
+ }
+ result+=" Ձևանմուշ";
+ }
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const QCString &namespaceName)
+ {
+ return QCString("Մոդուլ ") + namespaceName;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Մոդուլի անդամներ"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Մոդուլի բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="անդամների ցուցակը` հղումներով դեպի ";
+ if (extractAll)
+ {
+ result+="բոլոր անդամների փաստագրությունները.";
+ }
+ else
+ {
+ result+="մոդուլները, որոնց նրանք պատկանում են.";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Մոդուլներ"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Մոդուլ" : "մոդուլ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result="Այս ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="մոդուլի"; break;
+ case ClassDef::Struct: result+="տիպի"; break;
+ case ClassDef::Union: result+="միավորման"; break;
+ case ClassDef::Interface: result+="ինտերֆեյսի"; break;
+ case ClassDef::Protocol: result+="արձանագրության"; break;
+ case ClassDef::Category: result+="դասակարգման"; break;
+ case ClassDef::Exception: result+="բացառության"; break;
+ default: break;
+ }
+ result+=" փաստագրությունը ստեղծվել է հետևալ ֆայլ";
+ if (single) result+="ից."; else result+="երից.";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Տիպ" : "տիպ"));
+ if (!singular) result+="եր";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ե" : "ե"));
+ if (singular) result+="նթածրագիր"; else result+="նթածրագրեր";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Տիպերի Սահմանափակումներ";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const QCString &name)
+ {
+ return QCString(name)+" Կապ";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Բեռնում...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Գլոբալ անունների տարածություն";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Որոնում...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Անարդյունք";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const QCString &name)
+ {
+ return "Ֆայլը " + name + " ում";
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const QCString &name)
+ {
+ return "Ներառում է ֆայլը " + name + " ում";
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Երկուշաբթի,","Երեքշաբթի,","Չորեքշաբթի,","Հինգշաբթի,",
+ "Ուրբաթ,","Շաբաթ,","Կիրակի," };
+ static const char *months[] = { "Հունիսի","Փետրվարի","Մարտի","Ապրրիլի","Մայիսի","Հունիսի",
+ "Հուլիսի","Օգոստոսի","Սեպտեմբերի","Հոկտեբմերի","Նոյեմբերի","Դեկտեմբերի" };
+ QCString sdate;
+ sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d ",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Երկ", "Երք", "Չրք", "Հնգ", "Ուր", "Շբթ", "Կիր" };
+ static const char *days_full[] = { "Երկուշաբթի", "Երեքշաբթի", "Չորեքշաբթի", "Հինգշաբթի", "Ուրբաթ", "Շաբաթ", "Կիրակի" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Հնվ", "Փտվ", "Մրտ", "Ապր", "Մյս", "Հնս", "Հլս", "Օգս", "Սպտ", "Հկտ", "Նյմ", "Դկտ" };
+ static const char *months_full[] = { "Հունվար", "Փետրվար", "Մարտ", "Ապրիլ", "Մայիս", "Հունիս", "Հուլիս", "Օգոստոս", "Սեպտեմբեր", "Հոկտեմբեր", "Նոյեմբեր", "Դեկտեմբեր" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Header for the page with bibliographic citations */
+ virtual QCString trCiteReferences()
+ { return "Գրականություն"; }
+
+ /*! Text for copyright paragraph */
+ virtual QCString trCopyright()
+ { return "Հեղինակային իրավունք"; }
+
+ /*! Header for the graph showing the directory dependencies */
+ virtual QCString trDirDepGraph(const QCString &name)
+ { return name + QCString("-ի ֆայլադարանների կախվածությունների գծագիր:"); }
+
+};
+#endif
diff --git a/src/translator_ar.h b/src/translator_ar.h
index 6b6f1cc..38c0d5f 100644
--- a/src/translator_ar.h
+++ b/src/translator_ar.h
@@ -1509,6 +1509,23 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
"فقط في نوعية ال argument(s) التي تقبلها.";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد" };
+ static const char *days_full[] = { "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" };
+ static const char *months_full[] = { "يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "ص", "م" };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_bg.h b/src/translator_bg.h
index b9639b4..b38bfca 100644
--- a/src/translator_bg.h
+++ b/src/translator_bg.h
@@ -1831,6 +1831,23 @@ class TranslatorBulgarian : public TranslatorAdapter_1_9_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "пон", "вт", "ср", "четв", "пет", "съб", "нед" };
+ static const char *days_full[] = { "понеделник", "вторник", "сряда", "четвъртък", "петък", "събота", "неделя" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "яну", "фев", "мар", "апр", "май", "юни", "юли", "авг", "сеп", "окт", "ное", "дек" };
+ static const char *months_full[] = { "януари", "февруари", "март", "април", "май", "юни", "юли", "август", "септември", "октомври", "ноември", "декември" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "пр.об.", "сл.об." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_br.h b/src/translator_br.h
index 2d7abcb..d7efd64 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -19,6 +19,8 @@
* Thanks to Jorge Ramos, Fernando Carijo and others for their contributions.
*
* History:
+ * 20220525:
+ * - Updated to 1.9.4;
* 20211003:
* - Updated to 1.9.3;
* 20200112:
@@ -54,7 +56,7 @@
#ifndef TRANSLATOR_BR_H
#define TRANSLATOR_BR_H
-class TranslatorBrazilian : public TranslatorAdapter_1_9_4
+class TranslatorBrazilian : public Translator
{
public:
@@ -1897,6 +1899,27 @@ class TranslatorBrazilian : public TranslatorAdapter_1_9_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "seg", "ter", "qua", "qui", "sex", "sáb", "dom" };
+ static const char *days_full[] = { "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado", "domingo" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez" };
+ static const char *months_full[] = { "janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
@@ -2388,6 +2411,12 @@ class TranslatorBrazilian : public TranslatorAdapter_1_9_4
{
return "Definição de conceito";
}
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.9.4
+ //////////////////////////////////////////////////////////////////////////
+ virtual QCString trPackageList()
+ { return "Lista de pacotes"; }
};
#endif
diff --git a/src/translator_ca.h b/src/translator_ca.h
index 53dbffb..03a52b3 100644
--- a/src/translator_ca.h
+++ b/src/translator_ca.h
@@ -1819,6 +1819,27 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "dl.", "dt.", "dc.", "dj.", "dv.", "ds.", "dg." };
+ static const char *days_full[] = { "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte", "diumenge" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des." };
+ static const char *months_full[] = { "gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "a.m.", "p.m." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_cn.h b/src/translator_cn.h
index 24aa3a1..3f673e3 100644
--- a/src/translator_cn.h
+++ b/src/translator_cn.h
@@ -1739,7 +1739,7 @@ class TranslatorChinese : public TranslatorAdapter_1_9_4
bool includeTime)
{
static const char *days[] = { "一","二","三","四","五","六","日" };
- static const char *months[] = { "一","二","三","四","五","六","七","八","九","十","十一","十二" };
+ static const char *months[] = { "一","二","三","四","五","六","七","八","九","十","十一","十二" };
QCString sdate;
@@ -1753,6 +1753,23 @@ class TranslatorChinese : public TranslatorAdapter_1_9_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "周一", "周二", "周三", "周四", "周五", "周六", "周日" };
+ static const char *days_full[] = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" };
+ static const char *months_full[] = { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "上午", "下午" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_cz.h b/src/translator_cz.h
index ddd6033..497a729 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -20,8 +20,25 @@
// Updates:
// --------
-// 2021/08/31 - Updated for 1.9.3 version by: <petyovsky@feec.vutbr.cz>.
-// 2021/01/22 - Updated for 1.9.2 version by: <petyovsky@feec.vutbr.cz>.
+// 2022/08/25 - Updated for "new since 1.9.4" by: <petyovsky@vut.cz>
+// removed all implicit conversion from QCString to const char *,
+// fixed issues: #7434, #8404, #9192,
+// fixed typo and spacing in: `trLegendDocs()`,
+// fixed plural in: `trTemplateParameters()`,
+// better translation considering the context: `trMemberTypedefDocumentation()`,
+// `trMemberEnumerationDocumentation()`, `trMemberFunctionDocumentation()`,
+// `trMemberDataDocumentation()`, `trDefineDocumentation()`, `trDirDocumentation()`,
+// `trTypeDocumentation()`.
+// updated translation in context of non OO languages: `trHierarchicalIndex()`
+// `trGotoGraphicalHierarchy()`, `trGotoTextualHierarchy()`, `trCompoundMembersFortran()`.
+// updated translation in: `trNoMatches()`, trPackageAttribs(), trStaticPackageAttribs().
+// fixed wrong translation in: `trCompoundReferenceFortran()` of `case ClassDef::Class:`.
+// unified translation string in: `trGeneratedFromFilesFortran` according to `trGeneratedFromFiles()`.
+// fixed wrong wording in: `trCompoundReferenceSlice` of `case ClassDef::Interface:` when `isLocal==true`.
+// minor spacing and comments changes for better convergence to the reference file: `translator_en.h`.
+// all unclear or fuzzy czech translations marked with ???.
+// 2021/08/31 - Updated for "new since 1.9.3" by: <petyovsky@vut.cz>.
+// 2021/01/22 - Updated for "new since 1.9.2" by: <petyovsky@vut.cz>.
// 2013/04/11 - Updates for "new since 1.8.4".
// 2012/07/31 - Updates for "new since 1.8.2".
// 2012/04/10 - Updates for "new since 1.8.0".
@@ -87,14 +104,57 @@
// something else. It is difficult to find the general translation
// for all kinds in the Czech language.
-class TranslatorCzech : public TranslatorAdapter_1_9_4
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionally to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorCzech : public Translator
{
public:
+
// --- Language control methods -------------------
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
virtual QCString idLanguage()
{ return "czech"; }
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
virtual QCString latexLanguageSupportCommand()
{
return "\\usepackage[T2A]{fontenc}\n"
@@ -111,11 +171,11 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
{
return "cs";
}
+
virtual QCString getLanguageString()
{
return "0x405 Czech";
}
-
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -132,26 +192,26 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! header that is put before the list of typedefs. */
virtual QCString trMemberTypedefDocumentation()
- { return "Dokumentace k členským typům"; }
+ { return "Dokumentace členských typů"; }
/*! header that is put before the list of enumerations. */
virtual QCString trMemberEnumerationDocumentation()
- { return "Dokumentace k členským výčtům"; }
+ { return "Dokumentace členských výčtů"; }
/*! header that is put before the list of member functions. */
virtual QCString trMemberFunctionDocumentation()
- { return "Dokumentace k metodám"; }
+ { return "Dokumentace členských funkcí"; }
/*! header that is put before the list of member attributes. */
virtual QCString trMemberDataDocumentation()
{
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- return "Dokumentace k položkám";
+ return "Dokumentace položek";
}
else
{
- return "Dokumentace k datovým členům";
+ return "Dokumentace datových členů";
}
}
@@ -179,10 +239,10 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
* parameter s is name of the project name.
*/
virtual QCString trGeneratedAutomatically(const QCString &s)
- { QCString result("Vygenerováno automaticky programem Doxygen "
- "ze zdrojových textů");
- if (!s.isEmpty()) result += QCString(" projektu ") + s;
- result += ".";
+ { QCString result="Vygenerováno automaticky programem Doxygen "
+ "ze zdrojových textů";
+ if (!s.isEmpty()) result+=" projektu "+s;
+ result+=".";
return result;
}
@@ -295,40 +355,40 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
return "Následující seznam obsahuje identifikace datových "
- "struktur a jejich stručné popisy:";
+ "struktur a jejich stručné popisy:";
}
else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
{
return "Následující seznam obsahuje identifikace tříd. "
- "V seznamu jsou uvedeny jejich stručné popisy:";
+ "V seznamu jsou uvedeny jejich stručné popisy:";
}
else
{
return "Následující seznam obsahuje především identifikace "
- "tříd, ale nacházejí se zde i další netriviální prvky, "
- "jako jsou struktury (struct), unie (union) a rozhraní "
- "(interface). V seznamu jsou uvedeny jejich stručné "
- "popisy:";
+ "tříd, ale nacházejí se zde i další netriviální prvky, "
+ "jako jsou struktury (struct), unie (union) a rozhraní "
+ "(interface). V seznamu jsou uvedeny jejich stručné "
+ "popisy:";
}
}
/*! This is an introduction to the page with all class members. */
virtual QCString trCompoundMembersDescription(bool extractAll)
{
- QCString result= "Zde naleznete seznam všech ";
+ QCString result="Zde naleznete seznam všech ";
if (!extractAll)
{
- result += "dokumentovaných ";
+ result+="dokumentovaných ";
}
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- result += "položek struktur (struct) a unií (union) ";
+ result+="položek struktur (struct) a unií (union)";
}
else
{
- result += "členů tříd ";
+ result+="členů tříd";
}
- result += "s odkazy na ";
+ result+=" s odkazy na ";
if (!extractAll)
{
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
@@ -344,11 +404,11 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
{
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- result += "dokumentaci struktur/unií, ke kterým příslušejí:";
+ result+="dokumentaci struktur/unií, ke kterým příslušejí:";
}
else
{
- result += "dokumentaci tříd, ke kterým příslušejí:";
+ result+="dokumentaci tříd, ke kterým příslušejí:";
}
}
return result;
@@ -363,14 +423,14 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
result+="funkcí, proměnných, maker, výčtů a definic typů (typedef) "
- "s odkazy na ";
+ "s odkazy";
}
else
{
result+="symbolů, které jsou definovány na úrovni svých souborů. "
- "Pro každý symbol je uveden odkaz na ";
+ "Pro každý symbol je uveden odkaz";
}
-
+ result+=" na ";
if (extractAll)
result+="soubory, ke kterým příslušejí:";
else
@@ -406,7 +466,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
* class hierarchy.
*/
virtual QCString trHierarchicalIndex()
- { return "Rejstřík hierarchie tříd"; }
+ { return "Rejstřík hierarchie"; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
@@ -510,7 +570,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
* documentation blocks for defines
*/
virtual QCString trDefineDocumentation()
- { return "Dokumentace k definicím maker"; }
+ { return "Dokumentace definic maker"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
@@ -557,7 +617,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
virtual QCString trGeneratedAt(const QCString &date,const QCString &projName)
{
QCString result="Vygenerováno dne: "+date;
- if (!projName.isEmpty()) result += QCString(", pro projekt: ") + projName;
+ if (!projName.isEmpty()) result +=", pro projekt: "+projName;
result+=", programem";
return result;
}
@@ -565,7 +625,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! this text is put before a class diagram */
virtual QCString trClassDiagram(const QCString &clName)
{
- return QCString("Diagram dědičnosti pro třídu ") + clName+":";
+ return "Diagram dědičnosti pro třídu "+clName+":";
}
/*! this text is generated when the \\warning command is used. */
@@ -642,17 +702,17 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
ClassDef::CompoundType compType,
bool isTemplate)
{
- QCString result("Dokumentace ");
+ QCString result="Dokumentace ";
if (isTemplate) result += "šablony ";
switch(compType)
{
- case ClassDef::Class: result += "třídy "; break;
- case ClassDef::Struct: result += "struktury "; break;
- case ClassDef::Union: result += "unie "; break;
- case ClassDef::Interface: result += "rozhraní "; break;
- case ClassDef::Protocol: result += "protokolu "; break;
- case ClassDef::Category: result += "kategorie "; break;
- case ClassDef::Exception: result += "výjimky "; break;
+ case ClassDef::Class: result+="třídy "; break;
+ case ClassDef::Struct: result+="struktury "; break;
+ case ClassDef::Union: result+="unie "; break;
+ case ClassDef::Interface: result+="rozhraní "; break;
+ case ClassDef::Protocol: result+="protokolu "; break;
+ case ClassDef::Category: result+="kategorie "; break;
+ case ClassDef::Exception: result+="výjimky "; break;
default: break;
}
result += clName;
@@ -662,7 +722,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const QCString &fileName)
{
- QCString result("Dokumentace souboru ");
+ QCString result="Dokumentace souboru ";
result+=fileName;
return result;
}
@@ -670,7 +730,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! used as the title of the HTML page of a namespace */
virtual QCString trNamespaceReference(const QCString &namespaceName)
{
- QCString result("Dokumentace jmenného prostoru ");
+ QCString result="Dokumentace jmenného prostoru ";
result+=namespaceName;
return result;
}
@@ -729,7 +789,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
*/
virtual QCString trInheritsList(int numEntries)
{
- QCString result("Dědí z ");
+ QCString result="Dědí z ";
result += (numEntries == 1) ? "bázové třídy " : "bázových tříd ";
result += trWriteList(numEntries) + ".";
return result;
@@ -740,7 +800,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
*/
virtual QCString trInheritedByList(int numEntries)
{
- QCString result("Zděděna ");
+ QCString result="Zděděna ";
result += (numEntries == 1) ? "třídou " : "třídami ";
result += trWriteList(numEntries) + ".";
return result;
@@ -751,7 +811,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
*/
virtual QCString trReimplementedFromList(int numEntries)
{
- QCString result("Reimplementuje stejnojmenný prvek z ");
+ QCString result="Reimplementuje stejnojmenný prvek z ";
result += trWriteList(numEntries) + ".";
return result;
}
@@ -813,10 +873,11 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
{ // single is true implies a single file
+ bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
QCString result="Dokumentace pro ";
switch(compType)
{
- case ClassDef::Class: result+="tuto třídu"; break;
+ case ClassDef::Class: result+=vhdlOpt?"tuto návrhovou jednotku":"tuto třídu"; break;
case ClassDef::Struct: result+="tuto strukturu"; break;
case ClassDef::Union: result+="tuto unii"; break;
case ClassDef::Interface: result+="toto rozhraní"; break;
@@ -825,9 +886,9 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
case ClassDef::Exception: result+="tuto výjimku"; break;
default: break;
}
- result+=" byla vygenerována z ";
- if (single) result+="následujícího souboru:";
- else result+="následujících souborů:";
+ result+=" byla vygenerována z následující";
+ if (single) result+="ho souboru:";
+ else result+="ch souborů:";
return result;
}
@@ -901,20 +962,22 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
{
return "Zobrazit dokumentaci tohoto souboru.";
}
+
+ /*! ??? Jak to prelozit? Bylo by dobre, kdyby se ozval nekdo, kdo to pouziva.*/
/*! Text for the \\pre command */
virtual QCString trPrecondition()
{
- return "Precondition";
+ return "Precondition"; // ???
}
/*! Text for the \\post command */
virtual QCString trPostcondition()
{
- return "Postcondition";
+ return "Postcondition"; // ???
}
/*! Text for the \\invariant command */
virtual QCString trInvariant()
{
- return "Invariant";
+ return "Invariant"; // ???
}
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
@@ -932,11 +995,11 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
virtual QCString trGotoGraphicalHierarchy()
{
- return "Zobrazit grafickou podobu hierarchie tříd";
+ return "Zobrazit grafickou podobu hierarchie";
}
virtual QCString trGotoTextualHierarchy()
{
- return "Zobrazit textovou podobu hierarchie tříd";
+ return "Zobrazit textovou podobu hierarchie";
}
virtual QCString trPageIndex()
{
@@ -1020,11 +1083,11 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
virtual QCString trRemarks()
{
- return "Poznámky"; // ??? not checked in a context
+ return "Poznámky"; // ??? not checked in a context
}
virtual QCString trAttention()
{
- return "Upozornění"; // ??? not checked in a context
+ return "Upozornění"; // ??? not checked in a context
}
virtual QCString trInclByDepGraph()
{
@@ -1033,7 +1096,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
virtual QCString trSince()
{
- return "Od"; // ??? not checked in a context
+ return "Od"; // ??? not checked in a context
}
//////////////////////////////////////////////////////////////////////////
@@ -1045,7 +1108,9 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
{
return "Vysvětlivky ke grafu";
}
- /*! page explaining how the dot graph's should be interpreted */
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
virtual QCString trLegendDocs()
{
return
@@ -1106,7 +1171,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
"Šipky (tj. hrany grafu) mají následující význam:\n"
"</p>\n"
"<ul>\n"
- "<li>Tmavě modrá šipka se používá pro označení vztahu veřejné "
+ "<li>Modrá šipka se používá pro označení vztahu veřejné "
"dědičnosti (public) mezi dvěma třídami.</li>\n"
"<li>Tmavě zelená šipka označuje vztah chráněné dědičnosti "
"(protected).</li>\n"
@@ -1114,13 +1179,13 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
"(private).</li>\n"
"<li>Purpurová šipka kreslená čárkovaně se používá v případě, "
"kdy je třída obsažena v jiné třídě,\n"
- "nebo kdy je používána jinou třídou. Je označena identifikátorem "
- "jedné nebo více proměných, přes které\n"
+ "nebo kdy je používána jinou třídou. Šipka je označena "
+ "identifikátorem jedné nebo více proměnných, přes které\n"
"je třída nebo struktura zpřístupněna.</li>\n"
"<li>Žlutá šipka kreslená čárkovaně vyjadřuje vztah mezi instancí šablony "
"a šablonou třídy, na základě které byla\n"
- "instance šablony vytvořena. V popisu šipky jsou uvedeny příslušné"
- " parametry šablony.</li>\n"
+ "instance šablony vytvořena. V popisu šipky jsou uvedeny příslušné "
+ "parametry šablony.</li>\n"
"</ul>\n";
}
/*! text for the link to the legend page */
@@ -1156,7 +1221,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! Used as a section header for IDL property documentation */
virtual QCString trPropertyDocumentation()
{
- return "Dokumentace k vlastnosti";
+ return "Dokumentace vlastností";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.4
@@ -1177,13 +1242,12 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! Used as the title of a Java package */
virtual QCString trPackage(const QCString &name)
{
- return QCString("Balík ") + name;
+ return "Balík "+name;
}
/*! The description of the package index page */
virtual QCString trPackageListDescription()
{
- return "Zde naleznete seznam balíků se stručným popisem "
- "(pokud byl uveden):";
+ return "Zde naleznete seznam balíků se stručným popisem (pokud byl uveden):";
}
/*! The link name in the Quick links header for each page */
virtual QCString trPackages()
@@ -1328,9 +1392,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
return result;
}
- /*! ??? Jak to prelozit? Bylo by dobre, kdyby se ozval nekdo,
- * kdo to pouziva.
- */
+ /*! ??? Jak to prelozit? Bylo by dobre, kdyby se ozval nekdo, kdo to pouziva.*/
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
@@ -1379,7 +1441,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
/*! used in member documentation blocks to produce a list of
- * all members that implement this member.
+ * all members that implement this abstract member.
*/
virtual QCString trImplementedInList(int numEntries)
{
@@ -1446,7 +1508,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
virtual QCString trPackageMembers()
{
- return "Členy v balíku";
+ return "Členy v balíku"; // ??? not checked in a context
}
/*! Used as a heading for a list of static Java class functions with
* package scope.
@@ -1460,14 +1522,14 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
*/
virtual QCString trPackageAttribs()
{
- return "Atributy balíku";
+ return "Atributy v balíku"; // ??? not checked in a context
}
/*! Used as a heading for a list of static Java class variables with
* package scope.
*/
virtual QCString trStaticPackageAttribs()
{
- return "Statické atributy balíku";
+ return "Statické atributy v balíku"; // ??? not checked in a context
}
//////////////////////////////////////////////////////////////////////////
@@ -1539,7 +1601,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
*/
virtual QCString trSourceFile(QCString& filename)
{
- return QCString("Zdrojový soubor ") + filename;
+ return "Zdrojový soubor " + filename;
}
//////////////////////////////////////////////////////////////////////////
@@ -1556,7 +1618,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
* of the directories.
*/
virtual QCString trDirDocumentation()
- { return "Dokumentace k adresářům"; }
+ { return "Dokumentace adresářů"; }
/*! This is used as the title of the directory index and also in the
* Quick links of an HTML page, to link to the directory hierarchy.
@@ -1568,11 +1630,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
* directory is passed via \a dirName.
*/
virtual QCString trDirReference(const QCString &dirName)
- {
- QCString result = "Reference k adresáři ";
- result += dirName;
- return result;
- }
+ { QCString result="Reference k adresáři "; result+=dirName; return result; }
/*! This returns the word directory with or without starting capital
* (\a first_capital) and in singular or plural form (\a singular).
@@ -1580,8 +1638,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
virtual QCString trDir(bool first_capital, bool singular)
{
QCString result((first_capital ? "Adresář" : "adresář"));
- if (!singular)
- result += "e";
+ if (!singular) result+="e";
return result;
}
@@ -1629,7 +1686,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! This is put above each page as a link to all members of compounds (Fortran). */
virtual QCString trCompoundMembersFortran()
- { return "Datová pole"; }
+ { return "Datové položky"; }
/*! This is an introduction to the annotated compound list (Fortran). */
virtual QCString trCompoundListDescriptionFortran()
@@ -1651,7 +1708,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
else
{
- result+="příslušné datové typy:";
+ result+="příslušné datové typy:";
}
return result;
}
@@ -1666,7 +1723,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
* the documentation of all data types (Fortran).
*/
virtual QCString trTypeDocumentation()
- { return "Dokumentace k datovým typům"; }
+ { return "Dokumentace datových typů"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) subprograms (Fortran).
@@ -1704,22 +1761,21 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
ClassDef::CompoundType compType,
bool isTemplate)
{
- QCString result("Dokumentace ");
+ QCString result="Dokumentace ";
if (isTemplate) result += "šablony ";
switch(compType)
{
- case ClassDef::Class: result += "třídy "; break;
- case ClassDef::Struct: result += "typu "; break;
- case ClassDef::Union: result += "unie "; break;
- case ClassDef::Interface: result += "rozhraní "; break;
- case ClassDef::Protocol: result += "protokolu "; break;
- case ClassDef::Category: result += "kategorie "; break;
- case ClassDef::Exception: result += "výjimky "; break;
+ case ClassDef::Class: result+="modulu "; break;
+ case ClassDef::Struct: result+="typu "; break;
+ case ClassDef::Union: result+="unie "; break;
+ case ClassDef::Interface: result+="rozhraní "; break;
+ case ClassDef::Protocol: result+="protokolu "; break;
+ case ClassDef::Category: result+="kategorie "; break;
+ case ClassDef::Exception: result+="výjimky "; break;
default: break;
}
- result += clName;
+ result+=clName;
return result;
-
}
/*! used as the title of the HTML page of a module (Fortran) */
virtual QCString trModuleReference(const QCString &namespaceName)
@@ -1774,21 +1830,21 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
bool single)
{
// single is true implies a single file
- QCString result="Dokumentace ";
+ QCString result="Dokumentace pro ";
switch(compType)
{
- case ClassDef::Class: result+="k tomuto modulu"; break;
- case ClassDef::Struct: result+="k tomuto typu"; break;
- case ClassDef::Union: result+="k této unii"; break;
- case ClassDef::Interface: result+="k tomuto rozhraní"; break;
- case ClassDef::Protocol: result+="k tomuto protokolu"; break;
- case ClassDef::Category: result+="k této kategorii"; break;
- case ClassDef::Exception: result+="k této výjimce"; break;
+ case ClassDef::Class: result+="tento modul"; break;
+ case ClassDef::Struct: result+="tento typ"; break;
+ case ClassDef::Union: result+="tuto unii"; break;
+ case ClassDef::Interface: result+="toto rozhraní"; break;
+ case ClassDef::Protocol: result+="tento protokol"; break;
+ case ClassDef::Category: result+="tuto kategorii"; break;
+ case ClassDef::Exception: result+="tuto výjimku"; break;
default: break;
}
- result+=" byla vygenerována z ";
- if (single) result+="následujícího souboru:";
- else result+="následujících souborů:";
+ result+=" byla vygenerována z následující";
+ if (single) result+="ho souboru:";
+ else result+="ch souborů:";
return result;
}
@@ -1827,7 +1883,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! directory relation for \a name */
virtual QCString trDirRelation(const QCString &name)
{
- return "Relace " + QCString(name);
+ return "Relace "+name; // ??? not checked in a context
}
/*! Loading message shown when loading search results */
@@ -1851,7 +1907,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! Text shown when no search results are found */
virtual QCString trNoMatches()
{
- return "Nic se nenašlo";
+ return "Nebylo nic nalezeno";
}
//////////////////////////////////////////////////////////////////////////
@@ -1902,6 +1958,27 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "po", "út", "st", "čt", "pá", "so", "ne" };
+ static const char *days_full[] = { "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota", "neděle" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "led", "úno", "bře", "dub", "kvě", "čvn", "čvc", "srp", "zář", "říj", "lis", "pro" };
+ static const char *months_full[] = { "leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "dop.", "odp." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
@@ -1917,7 +1994,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! Header for the graph showing the directory dependencies */
virtual QCString trDirDepGraph(const QCString &name)
- { return QCString("Graf závislosti na adresářích pro ")+name+":"; }
+ { return "Graf závislosti na adresářích pro "+name+":"; } // ??? not checked in a context
//////////////////////////////////////////////////////////////////////////
// new since 1.8.0
@@ -1929,7 +2006,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! Section header for list of template parameters */
virtual QCString trTemplateParameters()
- { return "Parametry šablon"; }
+ { return "Parametry šablony"; }
/*! Used in dot graph when UML_LOOK is enabled and there are many fields */
virtual QCString trAndMore(const QCString &number)
@@ -1937,21 +2014,21 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! Used file list for a Java enum */
virtual QCString trEnumGeneratedFromFiles(bool single)
- { QCString result = "Dokumentace pro tento výčet byla vygenerována z ";
+ { QCString result = "Dokumentace pro tento výčet byla vygenerována z následující";
if (single)
- result += "následujícího souboru:";
+ result += "ho souboru:";
else
- result += "následujících souborů:";
+ result += "ch souborů:";
return result;
}
/*! Header of a Java enum page (Java enums are represented as classes). */
virtual QCString trEnumReference(const QCString &name)
- { return "Reference k výčtu "+QCString(name); }
+ { return "Reference k výčtu "+name; }
/*! Used for a section containing inherited members */
virtual QCString trInheritedFrom(const QCString &members,const QCString &what)
- { return QCString(members)+" dědí se z "+what; }
+ { return members+" dědí se z "+what; }
/*! Header of the sections with inherited members specific for the
* base class(es)
@@ -2034,39 +2111,39 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
virtual QCString trConstantGroupReference(const QCString &namespaceName)
{
QCString result="Konstantní skupiny z ";
- result += namespaceName;
+ result+=namespaceName;
return result;
}
/** UNO IDL service page title */
virtual QCString trServiceReference(const QCString &sName)
{
QCString result="Popis služby ";
- result += sName;
+ result+=sName;
return result;
}
/** UNO IDL singleton page title */
virtual QCString trSingletonReference(const QCString &sName)
{
QCString result="Popis singletonu ";
- result += sName;
+ result+=sName;
return result;
}
/** UNO IDL service page */
virtual QCString trServiceGeneratedFromFiles(bool single)
{
// single is true implies a single file
- QCString result="Dokumentace k této službě byla vygenerována ";
- if (single) result+="z následujícího souboru:";
- else result+="z následujících souborů:";
+ QCString result="Dokumentace k této službě byla vygenerována z následující";
+ if (single) result+="ho souboru:";
+ else result+="ch souborů:";
return result;
}
/** UNO IDL singleton page */
virtual QCString trSingletonGeneratedFromFiles(bool single)
{
// single is true implies a single file
- QCString result="Dokumentace k tomuto singletonu byla vygenerována ";
- if (single) result+="z následujícího souboru:";
- else result+="z následujících souborů:";
+ QCString result="Dokumentace k tomuto singletonu byla vygenerována z následující";
+ if (single) result+="ho souboru:";
+ else result+="ch souborů:";
return result;
}
@@ -2082,7 +2159,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
{ return "Seznam návrhových jednotek"; }
/** VHDL design unit members */
virtual QCString trDesignUnitMembers()
- { return "Seznam členů návrhových jednotky"; }
+ { return "Seznam členů návrhových jednotek"; }
/** VHDL design unit list description */
virtual QCString trDesignUnitListDescription()
{
@@ -2185,7 +2262,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
}
virtual QCString trCustomReference(const QCString &name)
- { return "Dokumentace pro "+QCString(name); }
+ { return "Dokumentace pro "+name; }
/* Slice */
virtual QCString trConstants()
@@ -2286,23 +2363,24 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
}
virtual QCString trCompoundReferenceSlice(const QCString &clName, ClassDef::CompoundType compType, bool isLocal)
{
- QCString result("Dokumentace ");
+ QCString result="Dokumentace";
if (isLocal) result+=" lokální";
switch(compType)
{
case ClassDef::Class: result+=" třídy "; break;
case ClassDef::Struct: result+=" struktury "; break;
case ClassDef::Union: result+=" unie "; break;
- case ClassDef::Interface: result+=" rozhraní "; break;
+ case ClassDef::Interface:
+ if (isLocal) result+="ho";
+ result+=" rozhraní "; break;
case ClassDef::Protocol:
- if (isLocal) result+="ho";
- result+=" protokolu ";
- break;
+ if (isLocal) result+="ho";
+ result+=" protokolu "; break;
case ClassDef::Category: result+=" kategorie "; break;
case ClassDef::Exception: result+=" vyjímky "; break;
default: break;
}
- result += clName;
+ result+=clName;
return result;
}
virtual QCString trOperations()
@@ -2344,7 +2422,7 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
/*! used as the title of the HTML page of a C++20 concept page */
virtual QCString trConceptReference(const QCString &conceptName)
{
- QCString result("Dokumentace konceptu ");
+ QCString result="Dokumentace konceptu ";
result+=conceptName;
return result;
}
@@ -2375,6 +2453,13 @@ class TranslatorCzech : public TranslatorAdapter_1_9_4
{
return "Definice konceptů";
}
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.9.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trPackageList()
+ { return "Seznam balíků"; }
};
#endif // TRANSLATOR_CZ_H
diff --git a/src/translator_de.h b/src/translator_de.h
index c28385c..e6b7a4a 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -1176,7 +1176,7 @@ class TranslatorGerman : public TranslatorAdapter_1_8_15
"Die Pfeile bedeuten:\n"
"</p>\n"
"<ul>\n"
- "<li>Ein dunkelblauer Pfeil stellt eine öffentliche Vererbungsbeziehung "
+ "<li>Ein blauer Pfeil stellt eine öffentliche Vererbungsbeziehung "
"zwischen zwei Klassen dar.</li>\n"
"<li>Ein dunkelgrüner Pfeil stellt geschützte Vererbung dar.</li>\n"
"<li>Ein dunkelroter Pfeil stellt private Vererbung dar.</li>\n"
@@ -1952,6 +1952,25 @@ class TranslatorGerman : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" };
+ static const char *days_full[] = { "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez" };
+ static const char *months_full[] = { "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_dk.h b/src/translator_dk.h
index cd348a8..afc3fce 100644
--- a/src/translator_dk.h
+++ b/src/translator_dk.h
@@ -1742,6 +1742,27 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "ma", "ti", "on", "to", "fr", "lø", "sø" };
+ static const char *days_full[] = { "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag", "søndag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_en.h b/src/translator_en.h
index 236675b..f0ca0e7 100644
--- a/src/translator_en.h
+++ b/src/translator_en.h
@@ -1047,7 +1047,7 @@ class TranslatorEnglish : public Translator
"The arrows have the following meaning:\n"
"</p>\n"
"<ul>\n"
- "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "<li>%A blue arrow is used to visualize a public inheritance "
"relation between two classes.</li>\n"
"<li>%A dark green arrow is used for protected inheritance.</li>\n"
"<li>%A dark red arrow is used for private inheritance.</li>\n"
@@ -1825,6 +1825,23 @@ class TranslatorEnglish : public Translator
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
+ static const char *days_full[] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+ static const char *months_full[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_eo.h b/src/translator_eo.h
index d86ffaf..40992cc 100644
--- a/src/translator_eo.h
+++ b/src/translator_eo.h
@@ -1822,6 +1822,27 @@ class TranslatorEsperanto : public TranslatorAdapter_1_8_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lu", "ma", "me", "ĵa", "ve", "sa", "di" };
+ static const char *days_full[] = { "lundo", "mardo", "merkredo", "ĵaŭdo", "vendredo", "sabato", "dimanĉo" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aŭg", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januaro", "februaro", "marto", "aprilo", "majo", "junio", "julio", "aŭgusto", "septembro", "oktobro", "novembro", "decembro" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "atm", "ptm" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_es.h b/src/translator_es.h
index f7c22b7..4fd955e 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -34,7 +34,7 @@
* Updated to 1.8.4 by Bartomeu Creus Navarro (17-julio-2013)
*/
-class TranslatorSpanish : public TranslatorAdapter_1_8_15
+class TranslatorSpanish : public TranslatorAdapter_1_8_19
{
public:
@@ -1071,7 +1071,7 @@ class TranslatorSpanish : public TranslatorAdapter_1_8_15
"Las flechas tienen el siguiente significado:\n"
"</p>\n"
"<ul>\n"
- "<li>Una flecha azul oscuro es usada para visualizar una relación herencia publica entre dos clases.\n"
+ "<li>Una azul oscuro es usada para visualizar una relación herencia publica entre dos clases.\n"
"<li>Una flecha verde oscuro es usada para herencia protegida.\n"
"<li>Una flecha rojo oscuro es usada para herencia privada.\n"
"<li>Una flecha segmentada púrpura se usa si la clase es contenida o "
@@ -1879,6 +1879,27 @@ class TranslatorSpanish : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lu.", "ma.", "mi.", "ju.", "vi.", "sá.", "do." };
+ static const char *days_full[] = { "lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "sep.", "oct.", "nov.", "dic." };
+ static const char *months_full[] = { "enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "a. m.", "p. m." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_fa.h b/src/translator_fa.h
index b609623..a4c1c10 100644
--- a/src/translator_fa.h
+++ b/src/translator_fa.h
@@ -1773,6 +1773,25 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
}
return convertDigitsToFarsi(sdate);
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه", "يكشنبه" };
+ static const char *days_full[] = { "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه", "يكشنبه" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "ژانويه", "فوريه", "مارس", "آوريل", "مه", "ژوئن", "ژوئيه", "اوت", "سپتامبر", "اُكتبر", "نوامبر", "دسامبر" };
+ static const char *months_full[] = { "ژانويه", "فوريه", "مارس", "آوريل", "مه", "ژوئن", "ژوئيه", "اوت", "سپتامبر", "اُكتبر", "نوامبر", "دسامبر" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "قبل‌ازظهر", "بعدازظهر" };
+ return dayPeriod[period];
+ }
};
diff --git a/src/translator_fi.h b/src/translator_fi.h
index dd1d418..c86ef94 100644
--- a/src/translator_fi.h
+++ b/src/translator_fi.h
@@ -1840,6 +1840,27 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
return "Tyyppien rajoitteet"; // "Type Constraints"
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "ma", "ti", "ke", "to", "pe", "la", "su" };
+ static const char *days_full[] = { "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "tammi", "helmi", "maalis", "huhti", "touko", "kesä", "heinä", "elo", "syys", "loka", "marras", "joulu" };
+ static const char *months_full[] = { "tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "ap.", "ip." };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_fr.h b/src/translator_fr.h
index f50d5c9..a601b3d 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -103,7 +103,7 @@
// Translator class (by the local maintainer) when the localized
// translator is made up-to-date again.
-class TranslatorFrench : public TranslatorAdapter_1_8_15
+class TranslatorFrench : public TranslatorAdapter_1_8_19
{
public:
@@ -1107,7 +1107,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
"</ul>\n"
"Les flèches ont la signification suivante :\n"
"<ul>\n"
- "<li>Une flèche bleu foncé est utilisée pour visualiser une relation d'héritage publique "
+ "<li>Une bleu foncé est utilisée pour visualiser une relation d'héritage publique "
"entre deux classes.\n"
"<li>Une flèche vert foncé est utilisée pour une relation d'héritage protégée.\n"
"<li>Une flèche rouge foncé est utilisée pour une relation d'héritage privée.\n"
@@ -1885,6 +1885,27 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lun.", "mar.", "mer.", "jeu.", "ven.", "sam.", "dim." };
+ static const char *days_full[] = { "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc." };
+ static const char *months_full[] = { "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_gr.h b/src/translator_gr.h
index 4f9e5ee..e429d37 100644
--- a/src/translator_gr.h
+++ b/src/translator_gr.h
@@ -1829,6 +1829,25 @@ class TranslatorGreek : public TranslatorAdapter_1_9_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ" };
+ static const char *days_full[] = { "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο", "Κυριακή" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Ιαν", "Φεβ", "Μαρ", "Απρ", "Μαϊ", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ" };
+ static const char *months_full[] = { "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "π.μ.", "μ.μ." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_hi.h b/src/translator_hi.h
index fb50015..1197687 100644
--- a/src/translator_hi.h
+++ b/src/translator_hi.h
@@ -74,7 +74,7 @@
* instantiations = उदाहरणीकरणगण
* interface = अंतराफलक
* interfaces = अंतराफलकगण
- * inherit =
+ * inherit =
* inheritance = वरासत
* inherited = वरासित
* library = संग्रह
@@ -1789,6 +1789,25 @@ class TranslatorHindi : public TranslatorAdapter_1_9_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "सोम.", "मंगल.", "बुध.", "गुरु.", "शुक्र.", "शनि.", "रवि." };
+ static const char *days_full[] = { "सोमवार", "मंगलवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार", "रविवार" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "जनवरी", "फरवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितम्बर", "अक्तूबर", "नवम्बर", "दिसम्बर" };
+ static const char *months_full[] = { "जनवरी", "फरवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितम्बर", "अक्तूबर", "नवम्बर", "दिसम्बर" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "am", "pm" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_hr.h b/src/translator_hr.h
index 1329f1c..fc867b0 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -1512,6 +1512,27 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "pon", "uto", "sri", "čet", "pet", "sub", "ned" };
+ static const char *days_full[] = { "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota", "nedjelja" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "sij", "vlj", "ožu", "tra", "svi", "lip", "srp", "kol", "ruj", "lis", "stu", "pro" };
+ static const char *months_full[] = { "siječanj", "veljača", "ožujak", "travanj", "svibanj", "lipanj", "srpanj", "kolovoz", "rujan", "listopad", "studeni", "prosinac" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
+
+
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
//////////////////////////////////////////////////////////////////////////
diff --git a/src/translator_hu.h b/src/translator_hu.h
index ccf35db..d657832 100644
--- a/src/translator_hu.h
+++ b/src/translator_hu.h
@@ -1843,6 +1843,27 @@ class TranslatorHungarian : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "H", "K", "Sze", "Cs", "P", "Szo", "V" };
+ static const char *days_full[] = { "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat", "vasárnap" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan.", "febr.", "márc.", "ápr.", "máj.", "jún.", "júl.", "aug.", "szept.", "okt.", "nov.", "dec." };
+ static const char *months_full[] = { "január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "de.", "du." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_id.h b/src/translator_id.h
index 1e4052f..bd25c7a 100644
--- a/src/translator_id.h
+++ b/src/translator_id.h
@@ -1794,6 +1794,23 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Sen", "Sel", "Rab", "Kam", "Jum", "Sab", "Min" };
+ static const char *days_full[] = { "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des" };
+ static const char *months_full[] = { "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_it.h b/src/translator_it.h
index 04ebbf5..eea9160 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -1795,6 +1795,27 @@ class TranslatorItalian : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lun", "mar", "mer", "gio", "ven", "sab", "dom" };
+ static const char *days_full[] = { "lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato", "domenica" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic" };
+ static const char *months_full[] = { "gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_jp.h b/src/translator_jp.h
index 4d5d1dd..38992c3 100644
--- a/src/translator_jp.h
+++ b/src/translator_jp.h
@@ -1814,6 +1814,25 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "月", "火", "水", "木", "金", "土", "日" };
+ static const char *days_full[] = { "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" };
+ static const char *months_full[] = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "午前", "午後" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_kr.h b/src/translator_kr.h
index 43a2fbe..5635e97 100644
--- a/src/translator_kr.h
+++ b/src/translator_kr.h
@@ -1833,6 +1833,25 @@ class TranslatorKorean : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "월", "화", "수", "목", "금", "토", "일" };
+ static const char *days_full[] = { "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" };
+ static const char *months_full[] = { "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "오전", "오후" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_lt.h b/src/translator_lt.h
index 9f16716..e0c167e 100644
--- a/src/translator_lt.h
+++ b/src/translator_lt.h
@@ -1509,6 +1509,27 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pr", "an", "tr", "kt", "pn", "št", "sk" };
+ static const char *days_full[] = { "pirmadienis", "antradienis", "trečiadienis", "ketvirtadienis", "penktadienis", "šeštadienis", "sekmadienis" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "saus.", "vas.", "kov.", "bal.", "geg.", "birž.", "liep.", "rugp.", "rugs.", "spal.", "lapkr.", "gruod." };
+ static const char *months_full[] = { "sausis", "vasaris", "kovas", "balandis", "gegužė", "birželis", "liepa", "rugpjūtis", "rugsėjis", "spalis", "lapkritis", "gruodis" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "priešpiet", "popiet" };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_lv.h b/src/translator_lv.h
index c54fe7e..927351a 100644
--- a/src/translator_lv.h
+++ b/src/translator_lv.h
@@ -1822,6 +1822,27 @@ class TranslatorLatvian : public TranslatorAdapter_1_8_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pirmd.", "otrd.", "trešd.", "ceturtd.", "piektd.", "sestd.", "svētd." };
+ static const char *days_full[] = { "pirmdiena", "otrdiena", "trešdiena", "ceturtdiena", "piektdiena", "sestdiena", "svētdiena" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "janv.", "febr.", "marts", "apr.", "maijs", "jūn.", "jūl.", "aug.", "sept.", "okt.", "nov.", "dec." };
+ static const char *months_full[] = { "janvāris", "februāris", "marts", "aprīlis", "maijs", "jūnijs", "jūlijs", "augusts", "septembris", "oktobris", "novembris", "decembris" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "priekšp.", "pēcp." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_mk.h b/src/translator_mk.h
index 0be70fc..c8e1217 100644
--- a/src/translator_mk.h
+++ b/src/translator_mk.h
@@ -1718,6 +1718,25 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
return "Ограничувања на Тип";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "пон.", "вт.", "сре.", "чет.", "пет.", "саб.", "нед." };
+ static const char *days_full[] = { "понеделник", "вторник", "среда", "четврток", "петок", "сабота", "недела" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "јан.", "фев.", "мар.", "апр.", "мај", "јун.", "јул.", "авг.", "септ.", "окт.", "ноем.", "дек." };
+ static const char *months_full[] = { "јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "претпл.", "попл." };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_nl.h b/src/translator_nl.h
index 8b95637..e97a854 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -705,7 +705,7 @@ class TranslatorDutch : public Translator
"</ul>\n"
"De pijlen hebben de volgende betekenis:\n"
"<ul>\n"
- "<li>Een donkerblauwe pijl visualizeert een public inheritance "
+ "<li>Een blauwe pijl visualizeert een public inheritance "
"relatie tussen twee klassen.\n"
"<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n"
"<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n"
@@ -1438,6 +1438,27 @@ class TranslatorDutch : public Translator
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "ma", "di", "wo", "do", "vr", "za", "zo" };
+ static const char *days_full[] = { "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "a.m.", "p.m." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_no.h b/src/translator_no.h
index 916ba89..fc5ad63 100755..100644
--- a/src/translator_no.h
+++ b/src/translator_no.h
@@ -1520,6 +1520,27 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
"funksjonen ovenfor i argument(ene) den aksepterer.";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "må.", "ty.", "on.", "to.", "fr.", "la.", "sø." };
+ static const char *days_full[] = { "måndag", "tysdag", "onsdag", "torsdag", "fredag", "laurdag", "søndag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des" };
+ static const char *months_full[] = { "januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "f.m.", "e.m." };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_pl.h b/src/translator_pl.h
index c8a215f..8309a7d 100644
--- a/src/translator_pl.h
+++ b/src/translator_pl.h
@@ -1768,6 +1768,27 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pon.", "wt.", "śr.", "czw.", "pt.", "sob.", "niedz." };
+ static const char *days_full[] = { "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota", "niedziela" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "paź", "lis", "gru" };
+ static const char *months_full[] = { "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_pt.h b/src/translator_pt.h
index cad2a06..24f9083 100644
--- a/src/translator_pt.h
+++ b/src/translator_pt.h
@@ -26,6 +26,8 @@
* VERSION HISTORY
* ---------------
* History:
+ * 20220525:
+ * - Updated to 1.9.4;
* 20211003:
* - Updated to 1.9.3;
* 20200112:
@@ -65,7 +67,7 @@
#define TRANSLATOR_PT_H
-class TranslatorPortuguese : public TranslatorAdapter_1_9_4
+class TranslatorPortuguese : public Translator
{
public:
@@ -1841,6 +1843,27 @@ class TranslatorPortuguese : public TranslatorAdapter_1_9_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "seg", "ter", "qua", "qui", "sex", "sáb", "dom" };
+ static const char *days_full[] = { "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado", "domingo" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez" };
+ static const char *months_full[] = { "janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
@@ -2334,6 +2357,12 @@ class TranslatorPortuguese : public TranslatorAdapter_1_9_4
{
return "Definição de conceito";
}
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.9.4
+ //////////////////////////////////////////////////////////////////////////
+ virtual QCString trPackageList()
+ { return "Lista de pacotes"; }
};
#endif
diff --git a/src/translator_ro.h b/src/translator_ro.h
index 011bc29..7503381 100644
--- a/src/translator_ro.h
+++ b/src/translator_ro.h
@@ -1828,6 +1828,27 @@ class TranslatorRomanian : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lun.", "mar.", "mie.", "joi", "vin.", "sâm.", "dum." };
+ static const char *days_full[] = { "luni", "mar?i", "miercuri", "joi", "vineri", "sâmbătă", "duminică" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "ian.", "feb.", "mar.", "apr.", "mai", "iun.", "iul.", "aug.", "sept.", "oct.", "nov.", "dec." };
+ static const char *months_full[] = { "ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "a.m.", "p.m." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_ru.h b/src/translator_ru.h
index 0ae718c..3fd63b4 100644
--- a/src/translator_ru.h
+++ b/src/translator_ru.h
@@ -1790,6 +1790,25 @@ class TranslatorRussian : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс" };
+ static const char *days_full[] = { "понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек" };
+ static const char *months_full[] = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
///////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_sc.h b/src/translator_sc.h
index 90eff44..e2a69f6 100644
--- a/src/translator_sc.h
+++ b/src/translator_sc.h
@@ -1762,6 +1762,25 @@ class TranslatorSerbianCyrillic : public TranslatorAdapter_1_6_0
return "Ограничења типова";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "пон", "уто", "сри", "чет", "пет", "суб", "нед" };
+ static const char *days_full[] = { "Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота", "Недеља" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", " новембар", "дец" };
+ static const char *months_full[] = { "јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", " Новембар Децембар" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "пре подне", "по подне" };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_si.h b/src/translator_si.h
index 2440c1b..3fa3fb9 100644
--- a/src/translator_si.h
+++ b/src/translator_si.h
@@ -1163,6 +1163,27 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
"samo v številu in/ali tipu formalnih argumentov.";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pon.", "tor.", "sre.", "čet.", "pet.", "sob.", "ned." };
+ static const char *days_full[] = { "ponedeljek", "torek", "sreda", "četrtek", "petek", "sobota", "nedelja" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan.", "feb.", "mar.", "apr.", "maj", "jun.", "jul.", "avg.", "sep.", "okt.", "nov.", "dec." };
+ static const char *months_full[] = { "januar", "februar", "marec", "april", "maj", "junij", "julij", "avgust", "september", "oktober", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "dop.", "pop." };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_sk.h b/src/translator_sk.h
index a7a44b3..331f860 100644
--- a/src/translator_sk.h
+++ b/src/translator_sk.h
@@ -1778,6 +1778,27 @@ class TranslatorSlovak : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "po", "ut", "st", "št", "pi", "so", "ne" };
+ static const char *days_full[] = { "pondelok", "utorok", "streda", "štvrtok", "piatok", "sobota", "nedeľa" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "máj", "jún", "júl", "aug", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "január", "február", "marec", "apríl", "máj", "jún", "júl", "august", "september", "október", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_sr.h b/src/translator_sr.h
index 2ef83c2..8d7ed4b 100644
--- a/src/translator_sr.h
+++ b/src/translator_sr.h
@@ -1720,6 +1720,27 @@ class TranslatorSerbian : public TranslatorAdapter_1_6_0
return "Interfejsi"; //!< Radna okruzenja. Ali to je dve reci.
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pon", "uto", "sre", "čet", "pet", "sub", "ned" };
+ static const char *days_full[] = { "ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "avg", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januar", "februar", "mart", "april", "maj", "jun", "jul", "avgust", "septembar", "oktobar", "novembar", "decembar" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "pre podne", "po podne" };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_sv.h b/src/translator_sv.h
index f7a788c..e1f852b 100644
--- a/src/translator_sv.h
+++ b/src/translator_sv.h
@@ -1922,6 +1922,27 @@ class TranslatorSwedish : public TranslatorAdapter_1_9_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "mån", "tis", "ons", "tor", "fre", "lör", "sön" };
+ static const char *days_full[] = { "måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag", "söndag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "fm", "em" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_tr.h b/src/translator_tr.h
index 20a1eec..eb133ba 100644
--- a/src/translator_tr.h
+++ b/src/translator_tr.h
@@ -1808,6 +1808,25 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz" };
+ static const char *days_full[] = { "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara" };
+ static const char *months_full[] = { "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "ÖÖ", "ÖS" };
+ return dayPeriod[period];
+ }
};
diff --git a/src/translator_tw.h b/src/translator_tw.h
index 0fb7b11..c2730b0 100644
--- a/src/translator_tw.h
+++ b/src/translator_tw.h
@@ -1797,6 +1797,25 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_15
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "周一", "周二", "周三", "周四", "周五", "周六", "周日" };
+ static const char *days_full[] = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" };
+ static const char *months_full[] = { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "上午", "下午" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_ua.h b/src/translator_ua.h
index 746616a..7503363 100644
--- a/src/translator_ua.h
+++ b/src/translator_ua.h
@@ -1788,6 +1788,25 @@ class TranslatorUkrainian : public TranslatorAdapter_1_8_4
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Нд" };
+ static const char *days_full[] = { "понеділок", "вівторок", "середа", "четвер", "п'ятниця", "субота", "неділя" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру" };
+ static const char *months_full[] = { "січень", "лютий", "березень", "квітень", "травень", "червень", "липень", "серпень", "вересень", "жовтень", "листопад", "грудень" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "дп", "пп" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
diff --git a/src/translator_vi.h b/src/translator_vi.h
index 7b3b5d8..b9d101c 100644
--- a/src/translator_vi.h
+++ b/src/translator_vi.h
@@ -1747,6 +1747,25 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
return "Ràng buộc của kiểu (Type)";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "T2", "T3", "T4", "T5", "T6", "T7", "CN" };
+ static const char *days_full[] = { "Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Thg1", "Thg2", "Thg3", "Thg4", "Thg5", "Thg6", "Thg7", "Thg8", "Thg9", "Thg10", "Thg11", "Thg12" };
+ static const char *months_full[] = { "Tháng Giêng", "Tháng Hai", "Tháng Ba", "Tháng Tư", "Tháng Năm", "Tháng Sáu", "Tháng Bảy", "Tháng Tám", "Tháng Chín", "Tháng Mười", "Tháng Mười Một", "Tháng Mười Hai" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "SA", "CH" };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/translator_za.h b/src/translator_za.h
index ad5bc3c..b85a4de 100644
--- a/src/translator_za.h
+++ b/src/translator_za.h
@@ -1713,6 +1713,27 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
return "Tipe Limiete";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "Ma.", "Di.", "Wo.", "Do.", "Vr.", "Sa.", "So." };
+ static const char *days_full[] = { "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrydag", "Saterdag", "Sondag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "Jan.", "Feb.", "Mrt.", "Apr.", "Mei", "Jun.", "Jul.", "Aug.", "Sep.", "Okt.", "Nov.", "Des." };
+ static const char *months_full[] = { "Januarie", "Februarie", "Maart", "April", "Mei", "Junie", "Julie", "Augustus", "September", "Oktober", "November", "Desember" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "vm.", "nm." };
+ return dayPeriod[period];
+ }
};
#endif
diff --git a/src/types.h b/src/types.h
index 69d8f7e..e0fa9a5 100644
--- a/src/types.h
+++ b/src/types.h
@@ -300,6 +300,7 @@ enum FortranFormat
FortranFormat_Fixed
};
+
class LocalToc
{
public:
diff --git a/src/util.cpp b/src/util.cpp
index f957181..12d13eb 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -73,6 +73,8 @@
#include "dir.h"
#include "utf8.h"
#include "textstream.h"
+#include "indexlist.h"
+#include "datetime.h"
#define ENABLE_TRACINGSUPPORT 0
@@ -331,33 +333,31 @@ QCString stripFromIncludePath(const QCString &path)
int guessSection(const QCString &name)
{
QCString n=name.lower();
- if (n.right(2)==".c" || // source
- n.right(3)==".cc" ||
- n.right(4)==".cxx" ||
- n.right(4)==".cpp" ||
- n.right(4)==".c++" ||
- n.right(5)==".java" ||
- n.right(2)==".m" ||
- n.right(3)==".mm" ||
- n.right(3)==".ii" || // inline
- n.right(4)==".ixx" ||
- n.right(4)==".ipp" ||
- n.right(4)==".i++" ||
- n.right(4)==".inl" ||
- n.right(4)==".xml" ||
- n.right(4)==".lex" ||
- n.right(4)==".sql"
- ) return Entry::SOURCE_SEC;
- if (n.right(2)==".h" || // header
- n.right(3)==".hh" ||
- n.right(4)==".hxx" ||
- n.right(4)==".hpp" ||
- n.right(4)==".h++" ||
- n.right(4)==".idl" ||
- n.right(4)==".ddl" ||
- n.right(5)==".pidl" ||
- n.right(4)==".ice"
- ) return Entry::HEADER_SEC;
+ static const std::unordered_set<std::string> sourceExt = {
+ "c","cc","cxx","cpp","c++", // C/C++
+ "java", // Java
+ "cs", // C#
+ "m","mm", // Objective-C
+ "ii","ixx","ipp","i++","inl", // C/C++ inline
+ "xml","lex","sql" // others
+ };
+ static const std::unordered_set<std::string> headerExt = {
+ "h", "hh", "hxx", "hpp", "h++" // C/C++ header
+ "idl", "ddl", "pidl", "ice" // IDL like
+ };
+ int lastDot = n.findRev('.');
+ if (lastDot!=-1)
+ {
+ QCString extension = n.mid(lastDot+1); // part after the last dot
+ if (sourceExt.find(extension.str())!=sourceExt.end())
+ {
+ return Entry::SOURCE_SEC;
+ }
+ if (headerExt.find(extension.str())!=headerExt.end())
+ {
+ return Entry::HEADER_SEC;
+ }
+ }
return 0;
}
@@ -488,12 +488,6 @@ QCString resolveTypeDef(const Definition *context,const QCString &qualifiedName,
}
-int computeQualifiedIndex(const QCString &name)
-{
- int i = name.find('<');
- return name.findRev("::",i==-1 ? name.length() : i);
-}
-
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
@@ -896,7 +890,7 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
size_t strLen = txtStr.length();
if (strLen==0) return;
- static const reg::Ex regExp(R"((::)?\a[\w~!\\.:$]*)");
+ static const reg::Ex regExp(R"((::)?\a[\w~!\\.:$"]*)");
reg::Iterator it(txtStr,regExp);
reg::Iterator end;
@@ -926,6 +920,7 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
for (size_t i=index;i<newIndex;i++)
{
if (txtStr.at(i)=='"') insideString=!insideString;
+ if (txtStr.at(i)=='\\') i++; // skip next character it is escaped
}
//printf("floatingIndex=%d strlen=%d autoBreak=%d\n",floatingIndex,strLen,autoBreak);
@@ -1067,7 +1062,7 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
if (md!=self && (self==0 || md->name()!=self->name()))
// name check is needed for overloaded members, where getDefs just returns one
{
- /* in case of Fortran scop and the variable is a non Fortran variable: don't link,
+ /* in case of Fortran scope and the variable is a non Fortran variable: don't link,
* see also getLink in fortrancode.l
*/
if (!(scope && (scope->getLanguage() == SrcLangExt_Fortran) && md->isVariable() && (md->getLanguage() != SrcLangExt_Fortran)))
@@ -1339,20 +1334,18 @@ QCString getFileFilter(const QCString &name,bool isSourceCode)
else
{
/* remove surrounding double quotes */
- if ((filterName.right(1) == "\"") && (filterName.left(1) == "\""))
+ if (filterName.length()>=2 && filterName[0]=='"' && filterName[filterName.length()-1]=='"')
{
- filterName.remove(filterName.length() - 1, 1);
- filterName.remove(0, 1);
+ filterName = filterName.mid(1,filterName.length()-2);
}
return filterName;
}
}
-QCString transcodeCharacterStringToUTF8(const QCString &input)
+QCString transcodeCharacterStringToUTF8(const QCString &inputEncoding, const QCString &input)
{
bool error=FALSE;
- QCString inputEncoding = Config_getString(INPUT_ENCODING);
const char *outputEncoding = "UTF-8";
if (inputEncoding.isEmpty() || qstricmp(inputEncoding,outputEncoding)==0) return input;
int inputSize=input.length();
@@ -1384,8 +1377,8 @@ QCString transcodeCharacterStringToUTF8(const QCString &input)
qPrint(inputEncoding),outputEncoding,qPrint(input));
error=TRUE;
}
+ portable_iconv_close(cd);
}
- portable_iconv_close(cd);
return error ? input : output;
}
@@ -1435,58 +1428,6 @@ QCString fileToString(const QCString &name,bool filter,bool isSourceCode)
return "";
}
-static std::tm getCurrentDateTime()
-{
- QCString sourceDateEpoch = Portable::getenv("SOURCE_DATE_EPOCH");
- if (!sourceDateEpoch.isEmpty()) // see https://reproducible-builds.org/specs/source-date-epoch/
- {
- bool ok;
- uint64 epoch = sourceDateEpoch.toUInt64(&ok);
- if (!ok)
- {
- static bool warnedOnce=FALSE;
- if (!warnedOnce)
- {
- warn_uncond("Environment variable SOURCE_DATE_EPOCH does not contain a valid number; value is '%s'\n",
- qPrint(sourceDateEpoch));
- warnedOnce=TRUE;
- }
- }
- else // use given epoch value as current 'built' time
- {
- auto epoch_start = std::chrono::time_point<std::chrono::system_clock>{};
- auto epoch_seconds = std::chrono::seconds(epoch);
- auto build_time = epoch_start + epoch_seconds;
- std::time_t time = std::chrono::system_clock::to_time_t(build_time);
- return *gmtime(&time);
- }
- }
-
- // return current local time
- auto now = std::chrono::system_clock::now();
- std::time_t time = std::chrono::system_clock::to_time_t(now);
- return *localtime(&time);
-}
-
-QCString dateToString(bool includeTime)
-{
- auto current = getCurrentDateTime();
- return theTranslator->trDateTime(current.tm_year + 1900,
- current.tm_mon + 1,
- current.tm_mday,
- (current.tm_wday+6)%7+1, // map: Sun=0..Sat=6 to Mon=1..Sun=7
- current.tm_hour,
- current.tm_min,
- current.tm_sec,
- includeTime);
-}
-
-QCString yearToString()
-{
- auto current = getCurrentDateTime();
- return QCString().setNum(current.tm_year+1900);
-}
-
void trimBaseClassScope(const BaseClassList &bcl,QCString &s,int level=0)
{
//printf("trimBaseClassScope level=%d '%s'\n",level,qPrint(s));
@@ -2143,6 +2084,8 @@ void mergeArguments(ArgumentList &srcAl,ArgumentList &dstAl,bool forceNameOverwr
}
}
+//---------------------------------------------------------------------------------------
+
static void findMembersWithSpecificName(const MemberName *mn,
const QCString &args,
bool checkStatics,
@@ -2185,6 +2128,51 @@ static void findMembersWithSpecificName(const MemberName *mn,
}
}
+//---------------------------------------------------------------------------------------
+
+bool getDefsNew(const QCString &scName,
+ const QCString &mbName,
+ const QCString &args,
+ const MemberDef *&md,
+ const ClassDef *&cd,
+ const FileDef *&fd,
+ const NamespaceDef *&nd,
+ const GroupDef *&gd,
+ bool forceEmptyScope,
+ const FileDef *currentFile,
+ bool checkCV
+ )
+{
+ fd=0, md=0, cd=0, nd=0, gd=0;
+ if (mbName.isEmpty()) return false;
+
+ //printf("@@ --- getDefsNew(%s,%s)-----------\n",qPrint(scName),qPrint(mbName));
+ const Definition *scope = Doxygen::globalScope;
+ SymbolResolver resolver;
+ if (currentFile) resolver.setFileScope(currentFile);
+ if (!scName.isEmpty())
+ {
+ scope = resolver.resolveSymbol(scope,scName);
+ }
+ if (scope==Doxygen::globalScope)
+ {
+ scope = currentFile;
+ }
+ //printf("@@ -> found scope scope=%s member=%s out=%s\n",qPrint(scName),qPrint(mbName),qPrint(scope?scope->name():""));
+ //
+ const Definition *symbol = resolver.resolveSymbol(scope,mbName,args,checkCV);
+ //printf("@@ -> found symbol in=%s out=%s\n",qPrint(mbName),qPrint(symbol?symbol->qualifiedName():QCString()));
+ if (symbol && symbol->definitionType()==Definition::TypeMember)
+ {
+ md = toMemberDef(symbol);
+ cd = md->getClassDef();
+ if (cd==0) nd = md->getNamespaceDef();
+ if (cd==0 && nd==0) fd = md->getFileDef();
+ gd = md->getGroupDef();
+ }
+ return md!=0;
+}
+
/*!
* Searches for a member definition given its name 'memberName' as a string.
* memberName may also include a (partial) scope to indicate the scope
@@ -2207,7 +2195,7 @@ static void findMembersWithSpecificName(const MemberName *mn,
* - if 'fd' is non zero, the member was found in the global namespace of
* file fd.
*/
-bool getDefs(const QCString &scName,
+bool getDefsOld(const QCString &scName,
const QCString &mbName,
const QCString &args,
const MemberDef *&md,
@@ -2221,16 +2209,23 @@ bool getDefs(const QCString &scName,
)
{
fd=0, md=0, cd=0, nd=0, gd=0;
- if (mbName.isEmpty()) return FALSE; /* empty name => nothing to link */
+ bool result = FALSE;
+ QCString scopeName;
+ QCString memberName;
+ QCString mName;
+ QCString mScope;
+ MemberName *mn = 0;
+ int is,im=0,pm=0;
+
+ if (mbName.isEmpty()) goto exit; /* empty name => nothing to link */
- QCString scopeName=scName;
- QCString memberName=mbName;
- scopeName = substitute(scopeName,"\\","::"); // for PHP
+ scopeName = scName;
+ scopeName = substitute(scopeName,"\\","::"); // for PHP
+ memberName = mbName;
memberName = substitute(memberName,"\\","::"); // for PHP
//printf("Search for name=%s args=%s in scope=%s forceEmpty=%d\n",
// qPrint(memberName),qPrint(args),qPrint(scopeName),forceEmptyScope);
- int is,im=0,pm=0;
// strip common part of the scope from the scopeName
while ((is=scopeName.findRev("::"))!=-1 &&
(im=memberName.find("::",pm))!=-1 &&
@@ -2243,9 +2238,8 @@ bool getDefs(const QCString &scName,
//printf("result after scope corrections scope=%s name=%s\n",
// qPrint(scopeName), qPrint(memberName));
- QCString mName=memberName;
- QCString mScope;
- if (memberName.left(9)!="operator " && // treat operator conversion methods
+ mName=memberName;
+ if (!memberName.startsWith("operator ") && // treat operator conversion methods
// as a special case
(im=memberName.findRev("::"))!=-1 &&
im<static_cast<int>(memberName.length())-2 // not A::
@@ -2260,7 +2254,7 @@ bool getDefs(const QCString &scName,
//printf("mScope='%s' mName='%s'\n",qPrint(mScope),qPrint(mName));
- MemberName *mn = Doxygen::memberNameLinkedMap->find(mName);
+ mn = Doxygen::memberNameLinkedMap->find(mName);
//printf("mName=%s mn=%p\n",qPrint(mName),mn);
if ((!forceEmptyScope || scopeName.isEmpty()) && // this was changed for bug638856, forceEmptyScope => empty scopeName
@@ -2362,13 +2356,15 @@ bool getDefs(const QCString &scName,
{
md=0; // avoid returning things we cannot link to
cd=0;
- return FALSE; // match found, but was not linkable
+ result=FALSE; // match found, but was not linkable
+ goto exit;
}
else
{
gd=md->getGroupDef();
if (gd) cd=0;
- return TRUE; /* found match */
+ result=TRUE; /* found match */
+ goto exit;
}
}
}
@@ -2383,13 +2379,15 @@ bool getDefs(const QCString &scName,
{
cd=tmd->getClassDef();
md=emd;
- return TRUE;
+ result=TRUE;
+ goto exit;
}
else
{
cd=0;
md=0;
- return FALSE;
+ result=FALSE;
+ goto exit;
}
}
}
@@ -2453,7 +2451,8 @@ bool getDefs(const QCString &scName,
{
md = fuzzy_mmd;
cd = fuzzy_mmd->getClassDef();
- return TRUE;
+ result=TRUE;
+ goto exit;
}
}
@@ -2508,7 +2507,8 @@ bool getDefs(const QCString &scName,
{
md=0;
cd=0;
- return FALSE;
+ result=FALSE;
+ goto exit;
}
}
else if (mmd->getOuterScope()==fnd /* && mmd->isLinkable() */ )
@@ -2554,13 +2554,15 @@ bool getDefs(const QCString &scName,
{
md=0; // avoid returning things we cannot link to
nd=0;
- return FALSE; // match found but not linkable
+ result=FALSE; // match found but not linkable
+ goto exit;
}
else
{
gd=md->resolveAlias()->getGroupDef();
if (gd && gd->isLinkable()) nd=0; else gd=0;
- return TRUE;
+ result=TRUE;
+ goto exit;
}
}
}
@@ -2588,7 +2590,8 @@ bool getDefs(const QCString &scName,
if (gd && gd->isLinkable()) fd=0; else gd=0;
//printf("Found scoped enum %s fd=%p gd=%p\n",
// qPrint(mmd->name()),fd,gd);
- return TRUE;
+ result=TRUE;
+ goto exit;
}
}
}
@@ -2668,15 +2671,84 @@ bool getDefs(const QCString &scName,
gd=md->getGroupDef();
//printf("fd=%p gd=%p gd->isLinkable()=%d\n",fd,gd,gd->isLinkable());
if (gd && gd->isLinkable()) fd=0; else gd=0;
- return TRUE;
+ result=TRUE;
+ goto exit;
}
}
}
- // no nothing found
- return FALSE;
+exit:
+ return result;
+}
+
+bool getDefs(const QCString &scName,
+ const QCString &mbName,
+ const QCString &args,
+ const MemberDef *&md,
+ const ClassDef *&cd,
+ const FileDef *&fd,
+ const NamespaceDef *&nd,
+ const GroupDef *&gd,
+ bool forceEmptyScope,
+ const FileDef *currentFile,
+ bool checkCV
+ )
+{
+ if (false) // set this to true to try the old and new routine side-by-side and compare the results
+ {
+ printf("@@ ------ getDefsOld start\n");
+ bool result = getDefsOld(scName,mbName,args,md,cd,fd,nd,gd,forceEmptyScope,currentFile,checkCV);
+ printf("@@ ------ getDefsOld end\n");
+ const MemberDef *nmd = 0;
+ const ClassDef *ncd = 0;
+ const FileDef *nfd = 0;
+ const NamespaceDef *nnd = 0;
+ const GroupDef *ngd = 0;
+ printf("@@ ------ getDefsNew start\n");
+ bool newResult = getDefsNew(scName,mbName,args,
+ nmd,ncd,nfd,nnd,ngd,
+ forceEmptyScope,currentFile,checkCV);
+ printf("@@ ------ getDefsNew end\n");
+ if (result!=newResult || nmd!=md || ncd!=cd || nfd!=fd || nnd!=nd || ngd!=gd)
+ {
+ printf("@@ getDefsOld(scName=%s, mbName=%s, args=%s, forceEmptyScope=%d "
+ "currentFile=%s checkCV=%d)=%d md=%s (%p) cd=%s fd=%s nd=%s gd=%s\n",
+ qPrint(scName), qPrint(mbName), qPrint(args),
+ forceEmptyScope, qPrint(currentFile?currentFile->name():QCString()),
+ checkCV,
+ result,
+ qPrint(md?md->name():QCString()),
+ (void*)md,
+ qPrint(cd?cd->name():QCString()),
+ qPrint(fd?fd->name():QCString()),
+ qPrint(nd?nd->name():QCString()),
+ qPrint(gd?gd->name():QCString())
+ );
+ printf("@@ ------ getDefsOld start\n");
+ printf("@@ getDefsNew(scName=%s, mbName=%s, args=%s, forceEmptyScope=%d "
+ "currentFile=%s checkCV=%d)=%d md=%s (%p) cd=%s fd=%s nd=%s gd=%s\n",
+ qPrint(scName), qPrint(mbName), qPrint(args),
+ forceEmptyScope, qPrint(currentFile?currentFile->name():QCString()),
+ checkCV,
+ newResult,
+ qPrint(nmd?nmd->name():QCString()),
+ (void*)nmd,
+ qPrint(ncd?ncd->name():QCString()),
+ qPrint(nfd?nfd->name():QCString()),
+ qPrint(nnd?nnd->name():QCString()),
+ qPrint(ngd?ngd->name():QCString())
+ );
+ }
+ return result; // use return newResult to use the result of the new routine
+ }
+ else // do one of the two getDefs routines (comment out the other one)
+ {
+ return getDefsNew(scName,mbName,args,md,cd,fd,nd,gd,forceEmptyScope,currentFile,checkCV);
+ //return getDefsOld(scName,mbName,args,md,cd,fd,nd,gd,forceEmptyScope,currentFile,checkCV);
+ }
}
+
/*!
* Searches for a scope definition given its name as a string via parameter
* `scope`.
@@ -2780,10 +2852,10 @@ bool resolveRef(/* in */ const QCString &scName,
int bracePos=findParameterList(fullName);
int endNamePos=bracePos!=-1 ? bracePos : fullName.length();
int scopePos=fullName.findRev("::",endNamePos);
- bool explicitScope = fullName.left(2)=="::" && // ::scope or #scope
- (scopePos>2 || // ::N::A
- tsName.left(2)=="::" || // ::foo in local scope
- scName==0 // #foo in global scope
+ bool explicitScope = fullName.startsWith("::") && // ::scope or #scope
+ (scopePos>2 || // ::N::A
+ tsName.startsWith("::") || // ::foo in local scope
+ scName==0 // #foo in global scope
);
// default result values
@@ -3346,6 +3418,7 @@ QCString substituteKeywords(const QCString &s,const QCString &title,
result = substitute(result,"$projectnumber",projNum);
result = substitute(result,"$projectbrief",projBrief);
result = substitute(result,"$projectlogo",stripPath(Config_getString(PROJECT_LOGO)));
+ result = substitute(result,"$langISO",theTranslator->trISOLang());
return result;
}
@@ -3439,11 +3512,20 @@ int getUtf8Char(const char *input,char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modi
}
#endif
+bool getCaseSenseNames()
+{
+ auto caseSenseNames = Config_getEnum(CASE_SENSE_NAMES);
+
+ if (caseSenseNames == CASE_SENSE_NAMES_t::YES) return true;
+ else if (caseSenseNames == CASE_SENSE_NAMES_t::NO) return false;
+ else return Portable::fileSystemIsCaseSensitive();
+}
+
// note that this function is not reentrant due to the use of static growBuf!
QCString escapeCharsInString(const QCString &name,bool allowDots,bool allowUnderscore)
{
if (name.isEmpty()) return name;
- bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
+ bool caseSenseNames = getCaseSenseNames();
bool allowUnicodeNames = Config_getBool(ALLOW_UNICODE_NAMES);
GrowBuf growBuf;
signed char c;
@@ -3525,7 +3607,7 @@ QCString escapeCharsInString(const QCString &name,bool allowDots,bool allowUnder
QCString unescapeCharsInString(const QCString &s)
{
if (s.isEmpty()) return s;
- bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
+ bool caseSenseNames = getCaseSenseNames();
QCString result;
const char *p = s.data();
if (p)
@@ -3779,7 +3861,7 @@ done:
}
//printf("extractNamespace '%s' => '%s|%s'\n",qPrint(scopeName),
// qPrint(className),qPrint(namespaceName));
- if (/*className.right(2)=="-g" ||*/ className.right(2)=="-p")
+ if (className.endsWith("-p"))
{
className = className.left(className.length()-2);
}
@@ -4358,7 +4440,7 @@ int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCStri
if (lang == SrcLangExt_Fortran)
{
if (type[pos]==',') return -1;
- if (QCString(type).left(4).lower()!="type")
+ if (!type.lower().startsWith("type"))
{
re = &re_fortran;
}
@@ -4525,17 +4607,17 @@ QCString substituteTemplateArgumentsInString(
{
actArg = *actIt;
}
- if (formArg.type.left(6)=="class " && formArg.name.isEmpty())
+ if (formArg.type.startsWith("class ") && formArg.name.isEmpty())
{
formArg.name = formArg.type.mid(6);
formArg.type = "class";
}
- if (formArg.type.left(9)=="typename " && formArg.name.isEmpty())
+ if (formArg.type.startsWith("typename ") && formArg.name.isEmpty())
{
formArg.name = formArg.type.mid(9);
formArg.type = "typename";
}
- if (formArg.type=="class" || formArg.type=="typename" || formArg.type.left(8)=="template")
+ if (formArg.type=="class" || formArg.type=="typename" || formArg.type.startsWith("template"))
{
//printf("n=%s formArg->type='%s' formArg->name='%s' formArg->defval='%s'\n",
// qPrint(n),qPrint(formArg->type),qPrint(formArg->name),qPrint(formArg->defval));
@@ -4797,7 +4879,7 @@ PageDef *addRelatedPage(const QCString &name,const QCString &ptitle,
if (newPage) // new page
{
QCString baseName=name;
- if (baseName.right(4)==".tex")
+ if (baseName.endsWith(".tex"))
baseName=baseName.left(baseName.length()-4);
else if (baseName.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
baseName=baseName.left(baseName.length()-Doxygen::htmlFileExtension.length());
@@ -5656,8 +5738,8 @@ static MemberDef *getMemberFromSymbol(const Definition *scope,const FileDef *fil
if (name.isEmpty())
return 0; // no name was given
- auto range = Doxygen::symbolMap->find(name);
- if (range.first==range.second)
+ auto &range = Doxygen::symbolMap->find(name);
+ if (range.empty())
return 0; // could not find any matching symbols
// mostly copied from getResolvedClassRec()
@@ -5674,9 +5756,8 @@ static MemberDef *getMemberFromSymbol(const Definition *scope,const FileDef *fil
int minDistance = 10000;
MemberDef *bestMatch = 0;
- for (auto it=range.first; it!=range.second; ++it)
+ for (Definition *d : range)
{
- Definition *d = it->second;
if (d->definitionType()==Definition::TypeMember)
{
SymbolResolver resolver(fileScope);
@@ -5949,7 +6030,7 @@ static QCString escapeCommas(const QCString &s)
static QCString expandAliasRec(StringUnorderedSet &aliasesProcessed,const QCString &s,bool allowRecursion)
{
QCString result;
- static const reg::Ex re(R"([\\@](\a\w*))");
+ static const reg::Ex re(R"([\\@](\a[\w-]*))");
std::string str = s.str();
reg::Match match;
size_t p = 0;
@@ -6010,6 +6091,13 @@ static QCString expandAliasRec(StringUnorderedSet &aliasesProcessed,const QCStri
result+=s.right(s.length()-p);
//printf("expandAliases '%s'->'%s'\n",s.data(),result.data());
+ if (result == s)
+ {
+ std::string orgStr = s.str();
+ int ridx = orgStr.rfind('-');
+ if (ridx != -1) return expandAliasRec(aliasesProcessed,s.left(ridx),allowRecursion) + s.right(s.length() - ridx);
+ }
+
return result;
}
@@ -6250,7 +6338,7 @@ bool readInputFile(const QCString &fileName,BufStr &inBuf,bool filter,bool isSou
{
// do character transcoding if needed.
transcodeCharacterBuffer(fileName,inBuf,inBuf.curPos(),
- Config_getString(INPUT_ENCODING),"UTF-8");
+ getEncoding(fi),"UTF-8");
}
//inBuf.addChar('\n'); /* to prevent problems under Windows ? */
@@ -6290,13 +6378,15 @@ QCString filterTitle(const QCString &title)
return QCString(tf);
}
-//----------------------------------------------------------------------------
-// returns TRUE if the name of the file represented by 'fi' matches
-// one of the file patterns in the 'patList' list.
+//---------------------------------------------------------------------------------------------------
-bool patternMatch(const FileInfo &fi,const StringVector &patList)
+template<class PatternList, class PatternElem, typename PatternGet = QCString(*)(const PatternElem &)>
+bool genericPatternMatch(const FileInfo &fi,
+ const PatternList &patList,
+ PatternElem &elem,
+ PatternGet getter)
{
- bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
+ bool caseSenseNames = getCaseSenseNames();
bool found = FALSE;
// For platforms where the file system is non case sensitive overrule the setting
@@ -6311,8 +6401,9 @@ bool patternMatch(const FileInfo &fi,const StringVector &patList)
std::string fp = fi.filePath();
std::string afp= fi.absFilePath();
- for (auto pattern: patList)
+ for (const auto &li : patList)
{
+ std::string pattern = getter(li).str();
if (!pattern.empty())
{
size_t i=pattern.find('=');
@@ -6329,7 +6420,11 @@ bool patternMatch(const FileInfo &fi,const StringVector &patList)
found = re.isValid() && (reg::match(fn,re) ||
(fn!=fp && reg::match(fp,re)) ||
(fn!=afp && fp!=afp && reg::match(afp,re)));
- if (found) break;
+ if (found)
+ {
+ elem = li;
+ break;
+ }
//printf("Matching '%s' against pattern '%s' found=%d\n",
// qPrint(fi->fileName()),qPrint(pattern),found);
}
@@ -6338,6 +6433,31 @@ bool patternMatch(const FileInfo &fi,const StringVector &patList)
return found;
}
+//----------------------------------------------------------------------------
+// returns TRUE if the name of the file represented by 'fi' matches
+// one of the file patterns in the 'patList' list.
+
+bool patternMatch(const FileInfo &fi,const StringVector &patList)
+{
+ std::string elem;
+ auto getter = [](std::string s) { return QCString(s); };
+ return genericPatternMatch(fi,patList,elem,getter);
+}
+
+QCString getEncoding(const FileInfo &fi)
+{
+ InputFileEncoding elem;
+ auto getter = [](const InputFileEncoding &e) { return e.pattern; };
+ if (genericPatternMatch(fi,Doxygen::inputFileEncodingList,elem,getter)) // check for file specific encoding
+ {
+ return elem.encoding;
+ }
+ else // fall back to default encoding
+ {
+ return Config_getString(INPUT_ENCODING);
+ }
+}
+
QCString externalLinkTarget(const bool parent)
{
bool extLinksInWindow = Config_getBool(EXT_LINKS_IN_WINDOW);
@@ -6578,12 +6698,12 @@ QCString getLanguageSpecificSeparator(SrcLangExt lang,bool classScope)
/** Checks whether the given url starts with a supported protocol */
bool isURL(const QCString &url)
{
+ static const std::unordered_set<std::string> schemes = {
+ "http", "https", "ftp", "ftps", "sftp", "file", "news", "irc", "ircs"
+ };
QCString loc_url = url.stripWhiteSpace();
- return loc_url.left(5)=="http:" || loc_url.left(6)=="https:" ||
- loc_url.left(4)=="ftp:" || loc_url.left(5)=="ftps:" ||
- loc_url.left(5)=="sftp:" || loc_url.left(5)=="file:" ||
- loc_url.left(5)=="news:" || loc_url.left(4)=="irc:" ||
- loc_url.left(5)=="ircs:";
+ int colonPos = loc_url.find(':');
+ return colonPos!=-1 && schemes.find(loc_url.left(colonPos).str())!=schemes.end();
}
/** Corrects URL \a url according to the relative path \a relPath.
* Returns the corrected URL. For absolute URLs no correction will be done.
diff --git a/src/util.h b/src/util.h
index c98353e..8a99700 100644
--- a/src/util.h
+++ b/src/util.h
@@ -282,6 +282,8 @@ PageDef *addRelatedPage(const QCString &name,
SrcLangExt lang=SrcLangExt_Unknown
);
+bool getCaseSenseNames();
+
QCString escapeCharsInString(const QCString &name,bool allowDots,bool allowUnderscore=FALSE);
QCString unescapeCharsInString(const QCString &s);
@@ -314,7 +316,20 @@ QCString stripExtension(const QCString &fName);
void replaceNamespaceAliases(QCString &scope,int i);
-int computeQualifiedIndex(const QCString &name);
+//! Return the index of the last :: in the string \a name that is still before the first <
+inline int computeQualifiedIndex(const QCString &name)
+{
+ int l = static_cast<int>(name.length());
+ int lastSepPos = -1;
+ const char *p = name.data();
+ for (int i=0;i<l-1;i++)
+ {
+ char c=*p++;
+ if (c==':' && *p==':') lastSepPos=i;
+ if (c=='<') break;
+ }
+ return lastSepPos;
+}
void addDirPrefix(QCString &fileName);
@@ -342,7 +357,7 @@ bool checkIfTypedef(const Definition *scope,const FileDef *fileScope,const QCStr
QCString parseCommentAsText(const Definition *scope,const MemberDef *member,const QCString &doc,const QCString &fileName,int lineNr);
-QCString transcodeCharacterStringToUTF8(const QCString &input);
+QCString transcodeCharacterStringToUTF8(const QCString &inputEncoding,const QCString &input);
QCString recodeString(const QCString &str,const char *fromEncoding,const char *toEncoding);
@@ -430,4 +445,6 @@ FortranFormat convertFileNameFortranParserCode(QCString fn);
QCString integerToAlpha(int n, bool upper=true);
QCString integerToRoman(int n, bool upper=true);
+QCString getEncoding(const FileInfo &fi);
+
#endif
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
index 59a24a7..cb06554 100644
--- a/src/vhdldocgen.cpp
+++ b/src/vhdldocgen.cpp
@@ -39,7 +39,6 @@
#include "util.h"
#include "language.h"
#include "commentscan.h"
-#include "index.h"
#include "definition.h"
#include "searchindex.h"
#include "outputlist.h"
@@ -2558,7 +2557,7 @@ static void addInstance(ClassDefMutable* classEntity, ClassDefMutable* ar,
// fprintf(stderr,"\naddInstance %s to %s %s %s\n",qPrint( classEntity->name()),qPrint(cd->name()),qPrint(ar->name()),cur->name);
n1=classEntity->name();
- if (!cd->isBaseClass(classEntity, true, 0))
+ if (!cd->isBaseClass(classEntity, true))
{
cd->insertBaseClass(classEntity,n1,Public,Normal,QCString());
}
@@ -2670,7 +2669,7 @@ bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int
{
err("Possible recursive class relation while inside %s and looking for %s\n",qPrint(cd->name()),qPrint(scd->name()));
abort();
- return FALSE;
+ return false;
}
for (const auto &bcd :cd->subClasses())
@@ -2680,13 +2679,17 @@ bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int
//printf("isSubClass() subclass %s\n",qPrint(ccd->name()));
if (ccd==scd)
{
- found=TRUE;
+ found=true;
}
else
{
if (level <256)
{
- found=ccd->isBaseClass(scd,followInstances,level+1);
+ level = ccd->isBaseClass(scd,followInstances);
+ if (level>0)
+ {
+ found=true;
+ }
}
}
}
diff --git a/src/vhdljjparser.cpp b/src/vhdljjparser.cpp
index bea252f..b9cc8a8 100644
--- a/src/vhdljjparser.cpp
+++ b/src/vhdljjparser.cpp
@@ -22,7 +22,6 @@
#include "util.h"
#include "language.h"
#include "commentscan.h"
-#include "index.h"
#include "definition.h"
#include "searchindex.h"
#include "outputlist.h"
diff --git a/src/vhdljjparser.h b/src/vhdljjparser.h
index 542f48d..542f48d 100755..100644
--- a/src/vhdljjparser.h
+++ b/src/vhdljjparser.h
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
index d3395db..9335f8d 100644
--- a/src/xmldocvisitor.cpp
+++ b/src/xmldocvisitor.cpp
@@ -294,9 +294,6 @@ void XmlDocVisitor::operator()(const DocStyleChange &s)
break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details:
- if (s.enable()) m_t << "<details>"; else m_t << "</details>";
- break;
case DocStyleChange::Summary:
if (s.enable()) m_t << "<summary>"; else m_t << "</summary>";
break;
@@ -834,17 +831,17 @@ void XmlDocVisitor::operator()(const DocHtmlCell &c)
}
else if (opt.name=="class") // handle markdown generated attributes
{
- if (opt.value.left(13)=="markdownTable") // handle markdown generated attributes
+ if (opt.value.startsWith("markdownTable")) // handle markdown generated attributes
{
- if (opt.value.right(5)=="Right")
+ if (opt.value.endsWith("Right"))
{
m_t << " align='right'";
}
- else if (opt.value.right(4)=="Left")
+ else if (opt.value.endsWith("Left"))
{
m_t << " align='left'";
}
- else if (opt.value.right(6)=="Center")
+ else if (opt.value.endsWith("Center"))
{
m_t << " align='center'";
}
@@ -890,6 +887,14 @@ void XmlDocVisitor::operator()(const DocHRef &href)
m_t << "</ulink>";
}
+void XmlDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ m_t << "<details>";
+ visitChildren(d);
+ m_t << "</details>";
+}
+
void XmlDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h
index ce3b657..0670fe5 100644
--- a/src/xmldocvisitor.h
+++ b/src/xmldocvisitor.h
@@ -82,6 +82,7 @@ class XmlDocVisitor : public DocVisitor
void operator()(const DocHtmlCaption &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 07b0d83..5594fcb 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -866,6 +866,7 @@ static void generateXMLForMember(const MemberDef *md,TextStream &ti,TextStream &
{
const ArgumentList &declAl = md->declArgumentList();
const ArgumentList &defAl = md->argumentList();
+ bool isFortran = md->getLanguage()==SrcLangExt_Fortran;
if (declAl.hasParameters())
{
auto defIt = defAl.begin();
@@ -885,7 +886,13 @@ static void generateXMLForMember(const MemberDef *md,TextStream &ti,TextStream &
writeXMLString(t,a.attrib);
t << "</attributes>\n";
}
- if (!a.type.isEmpty())
+ if (isFortran && defArg && !defArg->type.isEmpty())
+ {
+ t << " <type>";
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,defArg->type);
+ t << "</type>\n";
+ }
+ else if (!a.type.isEmpty())
{
t << " <type>";
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a.type);
diff --git a/templates/html/bc_sd.luma b/templates/html/bc_sd.luma
new file mode 100644
index 0000000..edeb6ad
--- /dev/null
+++ b/templates/html/bc_sd.luma
@@ -0,0 +1,67 @@
+# breadcrumb tabs
+# width & height
+8 30
+# luma data
+ 45 82 82 43 43 43 43 43
+ 42 70 81 42 42 42 42 42
+ 41 48 80 80 41 41 41 41
+ 39 39 72 78 39 39 39 39
+ 39 39 54 77 39 39 39 39
+ 38 38 39 74 76 38 38 38
+ 37 37 37 60 75 37 37 37
+ 36 36 36 39 73 73 36 36
+ 34 34 34 34 62 71 34 34
+ 32 32 32 32 41 69 32 32
+ 32 32 32 32 32 64 68 32
+ 30 30 30 30 30 45 66 30
+ 28 28 28 28 28 30 62 64
+ 27 27 27 27 27 27 49 62
+ 24 24 24 24 24 24 35 59
+ 24 24 24 24 24 24 49 58
+ 22 22 22 22 22 23 56 56
+ 20 20 20 20 20 36 53 20
+ 18 18 18 18 18 47 51 18
+ 16 16 16 16 24 49 16 16
+ 15 15 15 15 38 47 15 15
+ 13 13 13 15 45 45 13 13
+ 12 12 12 27 43 12 12 12
+ 9 9 9 37 40 9 9 9
+ 8 8 15 38 8 8 8 8
+ 6 6 28 36 6 6 6 6
+ 5 7 35 35 5 5 5 5
+ 4 19 33 4 4 4 4 4
+ 2 28 31 2 2 2 2 2
+ 6 29 1 1 1 1 1 1
+ 0 0 0 0 0 0 0 0
+# alpha data
+241 241 21 0 0 0 0 0
+162 205 117 0 0 0 0 0
+ 54 231 225 3 0 0 0 0
+ 0 198 215 78 0 0 0 0
+ 0 93 211 186 0 0 0 0
+ 0 6 232 235 42 0 0 0
+ 0 0 132 203 147 0 0 0
+ 0 0 27 242 241 15 0 0
+ 0 0 0 168 205 108 0 0
+ 0 0 0 63 228 219 0 0
+ 0 0 0 0 207 221 72 0
+ 0 0 0 0 102 208 177 0
+ 0 0 0 0 9 238 240 36
+ 0 0 0 0 0 138 201 138
+ 0 0 0 0 0 77 187 158
+ 0 0 0 0 0 159 204 120
+ 0 0 0 0 15 241 241 21
+ 0 0 0 0 111 208 171 0
+ 0 0 0 0 210 222 66 0
+ 0 0 0 60 227 219 0 0
+ 0 0 0 162 204 114 0 0
+ 0 0 18 238 238 21 0 0
+ 0 0 114 205 165 0 0 0
+ 0 0 216 225 60 0 0 0
+ 0 66 226 216 0 0 0 0
+ 0 165 204 111 0 0 0 0
+ 21 241 241 18 0 0 0 0
+117 203 159 0 0 0 0 0
+219 227 57 0 0 0 0 0
+211 201 0 0 0 0 0 0
+
diff --git a/templates/html/bib2xhtml.pl b/templates/html/bib2xhtml.pl
index 99e569e..2a44e74 100755
--- a/templates/html/bib2xhtml.pl
+++ b/templates/html/bib2xhtml.pl
@@ -221,6 +221,7 @@ while (<BBLFILE>) {
s/\\\{/\002/g;
s/\\\}/\003/g;
s/\\\$/\004/g;
+ s/\n / /g;
{
local ($c, $l, $z) = (0, 0, ());
s/([\{\}])/join("","\001",($1 eq "\{" ? $z[$l++]=$c++ : $z[--$l]),$1)/ge;
diff --git a/templates/html/darkmode_settings.css b/templates/html/darkmode_settings.css
new file mode 100644
index 0000000..612f9c8
--- /dev/null
+++ b/templates/html/darkmode_settings.css
@@ -0,0 +1,158 @@
+/* page base colors */
+--page-background-color: black;
+--page-foreground-color: #C9D1D9;
+--page-link-color: ##A0;
+--page-visited-link-color: ##B0;
+
+/* index */
+--index-odd-item-bg-color: ##0A;
+--index-even-item-bg-color: black;
+--index-header-color: ##CC;
+--index-separator-color: ##40;
+
+/* header */
+--header-background-color: ##06;
+--header-separator-color: ##14;
+--header-gradient-image: url('nav_hd.png');
+--group-header-separator-color: ##30;
+--group-header-color: ##A0;
+--inherit-header-color: #A0A0A0;
+
+--footer-foreground-color: ##76;
+--footer-logo-width: 60px;
+--citation-label-color: ##A0;
+--glow-color: cyan;
+
+--title-background-color: ##08;
+--title-separator-color: ##43;
+--directory-separator-color: ##30;
+--separator-color: ##30;
+
+--blockquote-background-color: ##10;
+--blockquote-border-color: ##30;
+
+--scrollbar-thumb-color: ##30;
+--scrollbar-background-color: ##06;
+
+--icon-background-color: ##40;
+--icon-foreground-color: ##CC;
+--icon-doc-image: url('docd.png');
+
+/* brief member declaration list */
+--memdecl-background-color: ##0A;
+--memdecl-separator-color: ##35;
+--memdecl-foreground-color: #BBB;
+--memdecl-template-color: ##90;
+
+/* detailed member list */
+--memdef-border-color: ##28;
+--memdef-title-background-color: ##1E;
+--memdef-title-gradient-image: url('nav_fd.png');
+--memdef-proto-background-color: ##1B;
+--memdef-proto-text-color: ##AB;
+--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9);
+--memdef-doc-background-color: black;
+--memdef-param-name-color: #D28757;
+--memdef-template-color: ##90;
+
+/* tables */
+--table-cell-border-color: ##30;
+--table-header-background-color: ##30;
+--table-header-foreground-color: ##CC;
+
+/* labels */
+--label-background-color: ##44;
+--label-left-top-border-color: ##60;
+--label-right-bottom-border-color: ##30;
+--label-foreground-color: #CCCCCC;
+
+/** navigation bar/tree/menu */
+--nav-background-color: ##10;
+--nav-foreground-color: ##45;
+--nav-gradient-image: url('tab_bd.png');
+--nav-gradient-hover-image: url('tab_hd.png');
+--nav-gradient-active-image: url('tab_ad.png');
+--nav-gradient-active-image-parent: url("../tab_ad.png");
+--nav-separator-image: url('tab_sd.png');
+--nav-breadcrumb-image: url('bc_sd.png');
+--nav-breadcrumb-border-color: ##33;
+--nav-splitbar-image: url('splitbard.png');
+--nav-font-size-level1: 13px;
+--nav-font-size-level2: 10px;
+--nav-font-size-level3: 9px;
+--nav-text-normal-color: ##C0;
+--nav-text-hover-color: ##E0;
+--nav-text-active-color: ##E0;
+--nav-text-normal-shadow: 0px 1px 1px black;
+--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+--nav-menu-button-color: ##C0;
+--nav-menu-background-color: ##04;
+--nav-menu-foreground-color: #BBBBBB;
+--nav-menu-toggle-color: rgba(255, 255, 255, 0.2);
+--nav-arrow-color: ##40;
+--nav-arrow-selected-color: ##A0;
+
+/* table of contents */
+--toc-background-color: ##15;
+--toc-border-color: ##24;
+--toc-header-color: ##B0;
+
+/** search field */
+--search-background-color: black;
+--search-foreground-color: #C5C5C5;
+--search-magnification-image: url('mag_d.svg');
+--search-magnification-select-image: url('mag_seld.svg');
+--search-active-color: #C5C5C5;
+--search-filter-background-color: ##10;
+--search-filter-foreground-color: ##A0;
+--search-filter-border-color: ##90;
+--search-filter-highlight-text-color: ##C5;
+--search-filter-highlight-bg-color: ##30;
+--search-results-background-color: ##10;
+--search-results-foreground-color: ##A0;
+--search-results-border-color: ##90;
+--search-box-shadow: inset 0.5px 0.5px 3px 0px ##3A;
+
+/** code fragments */
+--code-keyword-color: #CC99CD;
+--code-type-keyword-color: #AB99CD;
+--code-flow-keyword-color: #E08000;
+--code-comment-color: #717790;
+--code-preprocessor-color: #65CABE;
+--code-string-literal-color: #7EC699;
+--code-char-literal-color: #00E0F0;
+--code-vhdl-digit-color: #FF00FF;
+--code-vhdl-char-color: #000000;
+--code-vhdl-keyword-color: #700070;
+--code-vhdl-logic-color: #FF0000;
+--code-link-color: #79C0FF;
+--code-external-link-color: #79C0FF;
+--fragment-foreground-color: #C9D1D9;
+--fragment-background-color: black;
+--fragment-border-color: #30363D;
+--fragment-lineno-border-color: #30363D;
+--fragment-lineno-background-color: black;
+--fragment-lineno-foreground-color: #6E7681;
+--fragment-lineno-link-fg-color: #6E7681;
+--fragment-lineno-link-bg-color: #303030;
+--fragment-lineno-link-hover-fg-color: #8E96A1;
+--fragment-lineno-link-hover-bg-color: #505050;
+--tooltip-foreground-color: #C9D1D9;
+--tooltip-background-color: #202020;
+--tooltip-border-color: #C9D1D9;
+--tooltip-doc-color: #D9E1E9;
+--tooltip-declaration-color: #20C348;
+--tooltip-link-color: #79C0FF;
+--tooltip-shadow: none;
+
+/** font-family */
+--font-family-normal: Roboto,sans-serif;
+--font-family-monospace: monospace,fixed;
+--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+--font-family-title: Tahoma,Arial,sans-serif;
+--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif;
+--font-family-search: Arial,Verdana,sans-serif;
+--font-family-icon: Arial,Helvetica;
+--font-family-tooltip: Roboto,sans-serif;
+
diff --git a/templates/html/darkmode_toggle.js b/templates/html/darkmode_toggle.js
new file mode 100644
index 0000000..e2331dc
--- /dev/null
+++ b/templates/html/darkmode_toggle.js
@@ -0,0 +1,266 @@
+/**
+
+The code below is based on the Doxygen Awesome project with some minor modifications
+https://github.com/jothepro/doxygen-awesome-css
+
+MIT License
+
+Copyright (c) 2021 - 2022 jothepro
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+*/
+
+class DarkModeToggle extends HTMLElement {
+ static icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="1em" width="1em"><g fill="none" fill-rule="evenodd"><path d="M0 0h24v24H0z"></path><rect width="1" height="3" x="12" fill="currentColor" rx=".5"></rect><rect width="1" height="3" x="12" y="21" fill="currentColor" rx=".5"></rect><rect width="1" height="3" x="22" y="10.5" fill="currentColor" rx=".5" transform="rotate(90 22.5 12)"></rect><rect width="1" height="3" x="1" y="10.5" fill="currentColor" rx=".5" transform="rotate(90 1.5 12)"></rect><rect width="1" height="3" x="19" y="3" fill="currentColor" rx=".5" transform="rotate(-135 19.5 4.5)"></rect><rect width="1" height="3" x="19" y="18" fill="currentColor" rx=".5" transform="rotate(135 19.5 19.5)"></rect><rect width="1" height="3" x="4" y="3" fill="currentColor" rx=".5" transform="scale(1 -1) rotate(45 15.37 0)"></rect><rect width="1" height="3" x="4" y="18" fill="currentColor" rx=".5" transform="scale(1 -1) rotate(-45 -42.57 0)"></rect><circle cx="12" cy="12" r="6.5" stroke="currentColor"></circle><path fill="currentColor" stroke="currentColor" d="M12.5 18.48V5.52a6.5 6.5 0 010 12.96z"></path></g></svg>';
+ static title = "Toggle Light/Dark Mode"
+
+ static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
+ static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
+
+ static _staticConstructor = function() {
+ DarkModeToggle.enableDarkMode(DarkModeToggle.userPreference)
+ // Update the color scheme when the browsers preference changes
+ // without user interaction on the website.
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
+ DarkModeToggle.onSystemPreferenceChanged()
+ })
+ // Update the color scheme when the tab is made visible again.
+ // It is possible that the appearance was changed in another tab
+ // while this tab was in the background.
+ document.addEventListener("visibilitychange", visibilityState => {
+ if (document.visibilityState === 'visible') {
+ DarkModeToggle.onSystemPreferenceChanged()
+ }
+ });
+ }()
+
+ static init() {
+ $(function() {
+ $(document).ready(function() {
+ const toggleButton = document.createElement('dark-mode-toggle')
+ toggleButton.title = DarkModeToggle.title
+ toggleButton.innerHTML = DarkModeToggle.icon
+
+ function addButton() {
+ var titleArea = document.getElementById("titlearea");
+ var searchBox = document.getElementById("MSearchBox");
+ var mainMenu = document.getElementById("main-menu");
+ var navRow1 = document.getElementById("navrow1");
+ var mainMenuVisible = false;
+ if (mainMenu) {
+ var menuStyle = window.getComputedStyle(mainMenu);
+ mainMenuVisible = menuStyle.display!=='none'
+ }
+ var searchBoxPos1 = document.getElementById("searchBoxPos1");
+ if (searchBox) { // (1) search box visible
+ searchBox.parentNode.appendChild(toggleButton)
+ } else if (navRow1) { // (2) no search box, static menu bar
+ var li = document.createElement('li');
+ li.style = 'float: right;'
+ li.appendChild(toggleButton);
+ toggleButton.style = 'width: 24px; height: 25px; padding-top: 11px; float: right;';
+ var row = document.querySelector('#navrow1 > ul:first-of-type');
+ row.appendChild(li)
+ } else if (mainMenu && mainMenuVisible) { // (3) no search box + dynamic menu bar expanded
+ var li = document.createElement('li');
+ li.style = 'float: right;'
+ li.appendChild(toggleButton);
+ toggleButton.style = 'width: 14px; height: 36px; padding-top: 10px; float: right;';
+ mainMenu.appendChild(li)
+ } else if (searchBoxPos1) { // (4) no search box + dynamic menu bar collapsed
+ toggleButton.style = 'width: 24px; height: 36px; padding-top: 10px; float: right;';
+ searchBoxPos1.style = 'top: 0px;'
+ searchBoxPos1.appendChild(toggleButton);
+ } else if (titleArea) { // (5) no search box and no navigation tabs
+ toggleButton.style = 'width: 24px; height: 24px; position: absolute; right: 0px; top: 34px;';
+ titleArea.append(toggleButton);
+ }
+ }
+
+ $(document).ready(function(){
+ addButton();
+ })
+ $(window).resize(function(){
+ addButton();
+ })
+ DarkModeToggle.setDarkModeVisibility(DarkModeToggle.darkModeEnabled)
+ })
+ })
+ }
+
+ constructor() {
+ super();
+ this.onclick=this.toggleDarkMode
+ }
+
+ static createCookie(name, value, days) {
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+ var expires = "; expires=" + date.toGMTString();
+ }
+ else var expires = "";
+
+ document.cookie = name + "=" + value + expires + "; path=/";
+ }
+
+ static readCookie(name) {
+ var nameEQ = name + "=";
+ var ca = document.cookie.split(';');
+ for (var i = 0; i < ca.length; i++) {
+ var c = ca[i];
+ while (c.charAt(0) == ' ') c = c.substring(1, c.length);
+ if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
+ }
+ return null;
+ }
+
+ static eraseCookie(name) {
+ DarkModeToggle.createCookie(name, "", -1);
+ }
+
+ /**
+ * @returns `true` for dark-mode, `false` for light-mode system preference
+ */
+ static get systemPreference() {
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
+ }
+
+ static get prefersDarkModeInLightMode() {
+ if (window.chrome) { // Chrome supports localStorage in combination with file:// but not cookies
+ return localStorage.getItem(DarkModeToggle.prefersDarkModeInLightModeKey)
+ } else { // Other browsers support cookies in combination with file:// but not localStorage
+ return DarkModeToggle.readCookie('doxygen_prefers_dark')=='1'
+ }
+ }
+
+ static set prefersDarkModeInLightMode(preference) {
+ if (window.chrome) {
+ if (preference) {
+ localStorage.setItem(DarkModeToggle.prefersDarkModeInLightModeKey, true)
+ } else {
+ localStorage.removeItem(DarkModeToggle.prefersDarkModeInLightModeKey)
+ }
+ } else {
+ if (preference) {
+ DarkModeToggle.createCookie('doxygen_prefers_dark','1',365)
+ } else {
+ DarkModeToggle.eraseCookie('doxygen_prefers_dark')
+ }
+ }
+ }
+
+ static get prefersLightModeInDarkMode() {
+ if (window.chrome) { // Chrome supports localStorage in combination with file:// but not cookies
+ return localStorage.getItem(DarkModeToggle.prefersLightModeInDarkModeKey)
+ } else { // Other browsers support cookies in combination with file:// but not localStorage
+ return DarkModeToggle.readCookie('doxygen_prefers_light')=='1'
+ }
+ }
+
+ static set prefersLightModeInDarkMode(preference) {
+ if (window.chrome) {
+ if (preference) {
+ localStorage.setItem(DarkModeToggle.prefersLightModeInDarkModeKey, true)
+ } else {
+ localStorage.removeItem(DarkModeToggle.prefersLightModeInDarkModeKey)
+ }
+ } else {
+ if (preference) {
+ DarkModeToggle.createCookie('doxygen_prefers_light','1',365)
+ } else {
+ DarkModeToggle.eraseCookie('doxygen_prefers_light')
+ }
+ }
+ }
+
+
+ /**
+ * @returns `true` for dark-mode, `false` for light-mode user preference
+ */
+ static get userPreference() {
+ return (!DarkModeToggle.systemPreference && DarkModeToggle.prefersDarkModeInLightMode) ||
+ (DarkModeToggle.systemPreference && !DarkModeToggle.prefersLightModeInDarkMode)
+ }
+
+ static set userPreference(userPreference) {
+ DarkModeToggle.darkModeEnabled = userPreference
+ if (!userPreference) {
+ if (DarkModeToggle.systemPreference) {
+ DarkModeToggle.prefersLightModeInDarkMode = true
+ } else {
+ DarkModeToggle.prefersDarkModeInLightMode = false
+ }
+ } else {
+ if (!DarkModeToggle.systemPreference) {
+ DarkModeToggle.prefersDarkModeInLightMode = true
+ } else {
+ DarkModeToggle.prefersLightModeInDarkMode = false
+ }
+ }
+ DarkModeToggle.onUserPreferenceChanged()
+ }
+
+ static setDarkModeVisibility(enable) {
+ var darkModeStyle, lightModeStyle;
+ if(enable) {
+ darkModeStyle = 'inline-block';
+ lightModeStyle = 'none'
+ } else {
+ darkModeStyle = 'none';
+ lightModeStyle = 'inline-block'
+ }
+ document.querySelectorAll('.dark-mode-visible').forEach(function(el) {
+ el.style.display = darkModeStyle;
+ });
+ document.querySelectorAll('.light-mode-visible').forEach(function(el) {
+ el.style.display = lightModeStyle;
+ });
+ }
+ static enableDarkMode(enable) {
+ if(enable) {
+ DarkModeToggle.darkModeEnabled = true
+ document.documentElement.classList.add("dark-mode")
+ document.documentElement.classList.remove("light-mode")
+ } else {
+ DarkModeToggle.darkModeEnabled = false
+ document.documentElement.classList.remove("dark-mode")
+ document.documentElement.classList.add("light-mode")
+ }
+ DarkModeToggle.setDarkModeVisibility(enable)
+ }
+
+ static onSystemPreferenceChanged() {
+ DarkModeToggle.darkModeEnabled = DarkModeToggle.userPreference
+ DarkModeToggle.enableDarkMode(DarkModeToggle.darkModeEnabled)
+ }
+
+ static onUserPreferenceChanged() {
+ DarkModeToggle.enableDarkMode(DarkModeToggle.darkModeEnabled)
+ }
+
+ toggleDarkMode() {
+ DarkModeToggle.userPreference = !DarkModeToggle.userPreference
+ }
+}
+
+customElements.define("dark-mode-toggle", DarkModeToggle);
+
+DarkModeToggle.init();
diff --git a/templates/html/docd.luma b/templates/html/docd.luma
new file mode 100644
index 0000000..69aaa60
--- /dev/null
+++ b/templates/html/docd.luma
@@ -0,0 +1,50 @@
+# document icon for dark mode
+# width & height
+24 22
+# luma data
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 148 144 138 138 134 121 109 120 127 139 161 255 255 255 255 255 255 255 255
+255 255 255 255 255 125 154 156 156 152 144 134 111 133 159 118 155 255 255 255 255 255 255 255
+255 255 255 255 255 128 156 158 157 157 154 145 133 110 182 159 114 154 255 255 255 255 255 255
+255 255 255 255 255 128 159 160 159 159 158 154 144 84 182 182 159 117 165 255 255 255 255 255
+255 255 255 255 255 128 162 163 163 162 161 160 153 106 84 74 95 107 146 255 255 255 255 255
+255 255 255 255 255 128 166 166 146 156 168 149 162 155 139 120 119 96 123 255 255 255 255 255
+255 255 255 255 255 128 169 170 108 107 160 105 99 114 118 149 138 119 117 255 255 255 255 255
+255 255 255 255 255 128 171 172 170 148 167 166 170 165 171 174 151 138 112 255 255 255 255 255
+255 255 255 255 255 128 173 173 118 84 113 88 96 70 115 128 161 149 107 255 255 255 255 255
+255 255 255 255 255 128 173 175 178 158 171 171 156 179 167 157 169 162 107 255 255 255 255 255
+255 255 255 255 255 128 174 176 143 102 93 79 101 130 97 79 172 169 107 255 255 255 255 255
+255 255 255 255 255 128 179 178 170 148 167 166 170 165 171 174 174 172 107 255 255 255 255 255
+255 255 255 255 255 128 179 181 118 85 114 88 96 70 115 128 176 174 107 255 255 255 255 255
+255 255 255 255 255 128 181 183 178 158 171 171 156 179 167 157 179 176 107 255 255 255 255 255
+255 255 255 255 255 126 183 182 182 182 182 181 181 180 180 179 179 178 105 255 255 255 255 255
+255 255 255 255 255 124 0 0 0 0 0 0 0 0 0 0 0 0 118 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+# alpha data
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
diff --git a/templates/html/doxygen.css b/templates/html/doxygen.css
index 6440cf7..b4d4abb 100644
--- a/templates/html/doxygen.css
+++ b/templates/html/doxygen.css
@@ -1,29 +1,48 @@
-/* The standard CSS for doxygen $doxygenversion */
+body {
+ background-color: var(--page-background-color);
+ color: var(--page-foreground-color);
+ scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color);
+}
-body, table, div, p, dl {
- font: 400 14px/22px Roboto,sans-serif;
+::-webkit-scrollbar {
+ background-color: var(--scrollbar-background-color);
+ height: 10px;
+ width: 10px;
+}
+::-webkit-scrollbar-thumb {
+ background-color: var(--scrollbar-thumb-color);
+ border-radius: 8px;
+}
+::-webkit-scrollbar-corner {
+ background-color: var(--scrollbar-background-color);
}
-p.reference, p.definition {
- font: 400 14px/22px Roboto,sans-serif;
+body, table, div, p, dl {
+ font-weight: 400;
+ font-size: 14px;
+ font-family: var(--font-family-normal);
+ line-height: 22px;
}
/* @group Heading Levels */
-h1.groupheader {
- font-size: 150%;
-}
-
.title {
- font: 400 14px/28px Roboto,sans-serif;
+ font-weight: 400;
+ font-size: 14px;
+ font-family: var(--font-family-normal);
+ line-height: 28px;
font-size: 150%;
font-weight: bold;
margin: 10px 2px;
}
+h1.groupheader {
+ font-size: 150%;
+}
+
h2.groupheader {
- border-bottom: 1px solid ##99;
- color: ##44;
+ border-bottom: 1px solid var(--group-header-separator-color);
+ color: var(--group-header-color);
font-size: 150%;
font-weight: normal;
margin-top: 1.75em;
@@ -46,22 +65,13 @@ h1, h2, h3, h4, h5, h6 {
}
h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
- text-shadow: 0 0 15px cyan;
+ text-shadow: 0 0 15px var(--glow-color);
}
dt {
font-weight: bold;
}
-ul.multicol {
- -moz-column-gap: 1em;
- -webkit-column-gap: 1em;
- column-gap: 1em;
- -moz-column-count: 3;
- -webkit-column-count: 3;
- column-count: 3;
-}
-
p.startli, p.startdd {
margin-top: 2px;
}
@@ -113,7 +123,6 @@ h3.version {
}
div.navtab {
- border-right: 1px solid ##b0;
padding-right: 15px;
text-align: right;
line-height: 110%;
@@ -127,16 +136,17 @@ td.navtab {
padding-right: 6px;
padding-left: 6px;
}
+
td.navtabHL {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
padding-right: 6px;
padding-left: 6px;
}
td.navtabHL a, td.navtabHL a:visited {
- color: #fff;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ color: var(--nav-text-hover-color);
+ text-shadow: var(--nav-text-hover-shadow);
}
a.navtab {
@@ -148,7 +158,7 @@ div.qindex{
width: 100%;
line-height: 140%;
font-size: 130%;
- color: #A0A0A0;
+ color: var(--index-separator-color);
}
dt.alphachar{
@@ -157,7 +167,7 @@ dt.alphachar{
}
.alphachar a{
- color: black;
+ color: var(--index-header-color);
}
.alphachar a:hover, .alphachar a:visited{
@@ -176,8 +186,12 @@ dt.alphachar{
line-height: 1.15em;
}
+.classindex dl.even {
+ background-color: var(--index-even-item-bg-color);
+}
+
.classindex dl.odd {
- background-color: ##F9;
+ background-color: var(--index-odd-item-bg-color);
}
@media(min-width: 1120px) {
@@ -196,23 +210,19 @@ dt.alphachar{
/* @group Link Styling */
a {
- color: ##50;
+ color: var(--page-link-color);
font-weight: normal;
text-decoration: none;
}
.contents a:visited {
- color: ##60;
+ color: var(--page-visited-link-color);
}
a:hover {
text-decoration: underline;
}
-.contents a.qindexHL:visited {
- color: ##ff;
-}
-
a.el {
font-weight: bold;
}
@@ -221,11 +231,11 @@ a.elRef {
}
a.code, a.code:visited, a.line, a.line:visited {
- color: ##60;
+ color: var(--code-link-color);
}
a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
- color: ##60;
+ color: var(--code-external-link-color);
}
a.code.hl_class { /* style for links to class names in code snippets */ }
@@ -281,27 +291,29 @@ ul {
}
pre.fragment {
- border: 1px solid ##CC;
- background-color: ##FC;
+ border: 1px solid var(--fragment-border-color);
+ background-color: var(--fragment-background-color);
+ color: var(--fragment-foreground-color);
padding: 4px 6px;
margin: 4px 8px 4px 2px;
overflow: auto;
word-wrap: break-word;
font-size: 9pt;
line-height: 125%;
- font-family: monospace, fixed;
+ font-family: var(--font-family-monospace);
font-size: 105%;
}
div.fragment {
- padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
- margin: 4px 8px 4px 2px;
- background-color: ##FC;
- border: 1px solid ##CC;
+ padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
+ margin: 4px 8px 4px 2px;
+ color: var(--fragment-foreground-color);
+ background-color: var(--fragment-background-color);
+ border: 1px solid var(--fragment-border-color);
}
div.line {
- font-family: monospace, fixed;
+ font-family: var(--font-family-monospace);
font-size: 13px;
min-height: 13px;
line-height: 1.0;
@@ -333,8 +345,8 @@ div.line:after {
}
div.line.glow {
- background-color: cyan;
- box-shadow: 0 0 10px cyan;
+ background-color: var(--glow-color);
+ box-shadow: 0 0 10px var(--glow-color);
}
@@ -342,16 +354,19 @@ span.lineno {
padding-right: 4px;
margin-right: 9px;
text-align: right;
- border-right: 2px solid #0F0;
- background-color: #E8E8E8;
+ border-right: 2px solid var(--fragment-lineno-border-color);
+ color: var(--fragment-lineno-foreground-color);
+ background-color: var(--fragment-lineno-background-color);
white-space: pre;
}
-span.lineno a {
- background-color: #D8D8D8;
+span.lineno a, span.lineno a:visited {
+ color: var(--fragment-lineno-link-fg-color);
+ background-color: var(--fragment-lineno-link-bg-color);
}
span.lineno a:hover {
- background-color: #C8C8C8;
+ color: var(--fragment-lineno-link-hover-fg-color);
+ background-color: var(--fragment-lineno-link-hover-bg-color);
}
.lineno {
@@ -363,24 +378,6 @@ span.lineno a:hover {
user-select: none;
}
-div.ah, span.ah {
- background-color: black;
- font-weight: bold;
- color: ##ff;
- margin-bottom: 3px;
- margin-top: 3px;
- padding: 0.2em;
- border: solid thin #333;
- border-radius: 0.5em;
- -webkit-border-radius: .5em;
- -moz-border-radius: .5em;
- box-shadow: 2px 2px 3px #999;
- -webkit-box-shadow: 2px 2px 3px #999;
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
- background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
-}
-
div.classindex ul {
list-style: none;
padding-left: 0;
@@ -402,8 +399,7 @@ div.groupText {
}
body {
- background-color: white;
- color: black;
+ color: var(--page-foreground-color);
margin: 0;
}
@@ -413,29 +409,15 @@ div.contents {
margin-right: 8px;
}
-td.indexkey {
- background-color: ##ee;
- font-weight: bold;
- border: 1px solid ##cc;
- margin: 2px 0px 2px 0;
- padding: 2px 10px;
- white-space: nowrap;
- vertical-align: top;
-}
-
-td.indexvalue {
- background-color: ##ee;
- border: 1px solid ##cc;
- padding: 2px 10px;
- margin: 2px 0px;
+p.formulaDsp {
+ text-align: center;
}
-tr.memlist {
- background-color: ##f0;
+img.dark-mode-visible {
+ display: none;
}
-
-p.formulaDsp {
- text-align: center;
+img.light-mode-visible {
+ display: none;
}
img.formulaDsp {
@@ -465,10 +447,11 @@ address.footer {
img.footer {
border: 0px;
vertical-align: middle;
+ width: var(--footer-logo-width);
}
.compoundTemplParams {
- color: ##60;
+ color: var(--memdecl-template-color);
font-size: 80%;
line-height: 120%;
}
@@ -476,84 +459,58 @@ img.footer {
/* @group Code Colorization */
span.keyword {
- color: #008000
+ color: var(--code-keyword-color);
}
span.keywordtype {
- color: #604020
+ color: var(--code-type-keyword-color);
}
span.keywordflow {
- color: #e08000
+ color: var(--code-flow-keyword-color);
}
span.comment {
- color: #800000
+ color: var(--code-comment-color);
}
span.preprocessor {
- color: #806020
+ color: var(--code-preprocessor-color);
}
span.stringliteral {
- color: #002080
+ color: var(--code-string-literal-color);
}
span.charliteral {
- color: #008080
+ color: var(--code-char-literal-color);
}
span.vhdldigit {
- color: #ff00ff
+ color: var(--code-vhdl-digit-color);
}
span.vhdlchar {
- color: #000000
+ color: var(--code-vhdl-char-color);
}
span.vhdlkeyword {
- color: #700070
+ color: var(--code-vhdl-keyword-color);
}
span.vhdllogic {
- color: #ff0000
+ color: var(--code-vhdl-logic-color);
}
blockquote {
- background-color: ##F8;
- border-left: 2px solid ##AA;
+ background-color: var(--blockquote-background-color);
+ border-left: 2px solid var(--blockquote-border-color);
margin: 0 24px 0 4px;
padding: 0 12px 0 16px;
}
-blockquote.DocNodeRTL {
- border-left: 0;
- border-right: 2px solid ##AA;
- margin: 0 4px 0 24px;
- padding: 0 16px 0 12px;
-}
-
/* @end */
-/*
-.search {
- color: #003399;
- font-weight: bold;
-}
-
-form.search {
- margin-bottom: 0px;
- margin-top: 0px;
-}
-
-input.search {
- font-size: 75%;
- color: #000080;
- font-weight: normal;
- background-color: #e8eef2;
-}
-*/
-
td.tiny {
font-size: 75%;
}
@@ -561,18 +518,19 @@ td.tiny {
.dirtab {
padding: 4px;
border-collapse: collapse;
- border: 1px solid ##b0;
+ border: 1px solid var(--table-cell-border-color);
}
th.dirtab {
- background: ##ee;
+ background-color: var(--table-header-background-color);
+ color: var(--table-header-foreground-color);
font-weight: bold;
}
hr {
height: 0px;
border: none;
- border-top: 1px solid ##66;
+ border-top: 1px solid var(--separator-color);
}
hr.footer {
@@ -600,14 +558,14 @@ table.memberdecls {
}
.memberdecls td.glow, .fieldtable tr.glow {
- background-color: cyan;
- box-shadow: 0 0 15px cyan;
+ background-color: var(--glow-color);
+ box-shadow: 0 0 15px var(--glow-color);
}
.mdescLeft, .mdescRight,
.memItemLeft, .memItemRight,
.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
- background-color: ##FA;
+ background-color: var(--memdecl-background-color);
border: none;
margin: 4px;
padding: 1px 0 0 8px;
@@ -615,11 +573,11 @@ table.memberdecls {
.mdescLeft, .mdescRight {
padding: 0px 8px 4px 8px;
- color: #555;
+ color: var(--memdecl-foreground-color);
}
.memSeparator {
- border-bottom: 1px solid ##E2;
+ border-bottom: 1px solid var(--memdecl-separator-color);
line-height: 1px;
margin: 0px;
padding: 0px;
@@ -634,7 +592,7 @@ table.memberdecls {
}
.memTemplParams {
- color: ##60;
+ color: var(--memdecl-template-color);
white-space: nowrap;
font-size: 80%;
}
@@ -647,15 +605,15 @@ table.memberdecls {
.memtitle {
padding: 8px;
- border-top: 1px solid ##B4;
- border-left: 1px solid ##B4;
- border-right: 1px solid ##B4;
+ border-top: 1px solid var(--memdef-border-color);
+ border-left: 1px solid var(--memdef-border-color);
+ border-right: 1px solid var(--memdef-border-color);
border-top-right-radius: 4px;
border-top-left-radius: 4px;
margin-bottom: -1px;
- background-image: url('nav_f.png');
+ background-image: var(--memdef-title-gradient-image);
background-repeat: repeat-x;
- background-color: ##e6;
+ background-color: var(--memdef-title-background-color);
line-height: 1.25;
font-weight: 300;
float:left;
@@ -670,20 +628,11 @@ table.memberdecls {
.memtemplate {
font-size: 80%;
- color: ##60;
+ color: var(--memdef-template-color);
font-weight: normal;
margin-left: 9px;
}
-.memnav {
- background-color: ##ee;
- border: 1px solid ##b0;
- text-align: center;
- margin: 2px;
- margin-right: 15px;
- padding: 2px;
-}
-
.mempage {
width: 100%;
}
@@ -702,7 +651,7 @@ table.memberdecls {
}
.memitem.glow {
- box-shadow: 0 0 15px cyan;
+ box-shadow: 0 0 15px var(--glow-color);
}
.memname {
@@ -715,41 +664,32 @@ table.memberdecls {
}
.memproto, dl.reflist dt {
- border-top: 1px solid ##B4;
- border-left: 1px solid ##B4;
- border-right: 1px solid ##B4;
+ border-top: 1px solid var(--memdef-border-color);
+ border-left: 1px solid var(--memdef-border-color);
+ border-right: 1px solid var(--memdef-border-color);
padding: 6px 0px 6px 0px;
- color: ##2b;
+ color: var(--memdef-proto-text-color);
font-weight: bold;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
- background-color: ##E3;
- /* opera specific markup */
+ text-shadow: var(--memdef-proto-text-shadow);
+ background-color: var(--memdef-proto-background-color);
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
border-top-right-radius: 4px;
- /* firefox specific markup */
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
- -moz-border-radius-topright: 4px;
- /* webkit specific markup */
- -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
- -webkit-border-top-right-radius: 4px;
-
}
.overload {
- font-family: "courier new",courier,monospace;
+ font-family: var(--font-family-monospace);
font-size: 65%;
}
.memdoc, dl.reflist dd {
- border-bottom: 1px solid ##B4;
- border-left: 1px solid ##B4;
- border-right: 1px solid ##B4;
+ border-bottom: 1px solid var(--memdef-border-color);
+ border-left: 1px solid var(--memdef-border-color);
+ border-right: 1px solid var(--memdef-border-color);
padding: 6px 10px 2px 10px;
- background-color: ##FC;
border-top-width: 0;
background-image:url('nav_g.png');
background-repeat:repeat-x;
- background-color: ##ff;
+ background-color: var(--memdef-doc-background-color);
/* opera specific markup */
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
@@ -782,7 +722,7 @@ dl.reflist dd {
}
.paramname {
- color: #602020;
+ color: var(--memdef-param-name-color);
white-space: nowrap;
}
.paramname em {
@@ -795,20 +735,20 @@ dl.reflist dd {
.params, .retval, .exception, .tparams {
margin-left: 0px;
padding-left: 0px;
-}
+}
.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
font-weight: bold;
vertical-align: top;
}
-
+
.params .paramtype, .tparams .paramtype {
font-style: italic;
vertical-align: top;
-}
-
+}
+
.params .paramdir, .tparams .paramdir {
- font-family: "courier new",courier,monospace;
+ font-family: var(--font-family-monospace);
vertical-align: top;
}
@@ -832,13 +772,13 @@ span.mlabels {
}
span.mlabel {
- background-color: ##88;
- border-top:1px solid ##70;
- border-left:1px solid ##70;
- border-right:1px solid ##CC;
- border-bottom:1px solid ##CC;
+ background-color: var(--label-background-color);
+ border-top:1px solid var(--label-left-top-border-color);
+ border-left:1px solid var(--label-left-top-border-color);
+ border-right:1px solid var(--label-right-bottom-border-color);
+ border-bottom:1px solid var(--label-right-bottom-border-color);
text-shadow: none;
- color: white;
+ color: var(--label-foreground-color);
margin-right: 4px;
padding: 2px 3px;
border-radius: 3px;
@@ -855,8 +795,8 @@ span.mlabel {
div.directory {
margin: 10px 0px;
- border-top: 1px solid ##AA;
- border-bottom: 1px solid ##AA;
+ border-top: 1px solid var(--directory-separator-color);
+ border-bottom: 1px solid var(--directory-separator-color);
width: 100%;
}
@@ -892,9 +832,14 @@ div.directory {
border-left: 1px solid rgba(0,0,0,0.05);
}
+.directory tr.odd {
+ padding-left: 6px;
+ background-color: var(--index-odd-item-bg-color);
+}
+
.directory tr.even {
padding-left: 6px;
- background-color: ##F8;
+ background-color: var(--index-even-item-bg-color);
}
.directory img {
@@ -912,11 +857,11 @@ div.directory {
cursor: pointer;
padding-left: 2px;
padding-right: 2px;
- color: ##50;
+ color: var(--page-link-color);
}
.arrow {
- color: ##AA;
+ color: var(--nav-arrow-color);
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
@@ -930,14 +875,15 @@ div.directory {
}
.icon {
- font-family: Arial, Helvetica;
+ font-family: var(--font-family-icon);
+ line-height: normal;
font-weight: bold;
font-size: 12px;
height: 14px;
width: 16px;
display: inline-block;
- background-color: ##88;
- color: white;
+ background-color: var(--icon-background-color);
+ color: var(--icon-foreground-color);
text-align: center;
border-radius: 4px;
margin-left: 2px;
@@ -976,17 +922,13 @@ div.directory {
width: 24px;
height: 18px;
margin-bottom: 4px;
- background-image:url('doc.png');
+ background-image:var(--icon-doc-image);
background-position: 0px -4px;
background-repeat: repeat-y;
vertical-align:top;
display: inline-block;
}
-table.directory {
- font: 400 14px Roboto,sans-serif;
-}
-
/* @end */
div.dynheader {
@@ -1001,7 +943,7 @@ div.dynheader {
address {
font-style: normal;
- color: ##33;
+ color: var(--footer-foreground-color);
}
table.doxtable caption {
@@ -1015,28 +957,23 @@ table.doxtable {
}
table.doxtable td, table.doxtable th {
- border: 1px solid ##37;
+ border: 1px solid var(--table-cell-border-color);
padding: 3px 7px 2px;
}
table.doxtable th {
- background-color: ##47;
- color: ##ff;
+ background-color: var(--table-header-background-color);
+ color: var(--table-header-foreground-color);
font-size: 110%;
padding-bottom: 4px;
padding-top: 5px;
}
table.fieldtable {
- /*width: 100%;*/
margin-bottom: 10px;
- border: 1px solid ##B4;
+ border: 1px solid var(--memdef-border-color);
border-spacing: 0px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
border-radius: 4px;
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
- -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
}
@@ -1046,8 +983,8 @@ table.fieldtable {
.fieldtable td.fieldtype, .fieldtable td.fieldname {
white-space: nowrap;
- border-right: 1px solid ##B4;
- border-bottom: 1px solid ##B4;
+ border-right: 1px solid var(--memdef-border-color);
+ border-bottom: 1px solid var(--memdef-border-color);
vertical-align: top;
}
@@ -1056,14 +993,13 @@ table.fieldtable {
}
.fieldtable td.fielddoc {
- border-bottom: 1px solid ##B4;
- /*width: 100%;*/
+ border-bottom: 1px solid var(--memdef-border-color);
}
.fieldtable td.fielddoc p:first-child {
margin-top: 0px;
-}
-
+}
+
.fieldtable td.fielddoc p:last-child {
margin-bottom: 2px;
}
@@ -1073,22 +1009,18 @@ table.fieldtable {
}
.fieldtable th {
- background-image:url('nav_f.png');
+ background-image: var(--memdef-title-gradient-image);
background-repeat:repeat-x;
- background-color: ##E6;
+ background-color: var(--memdef-title-background-color);
font-size: 90%;
- color: ##2B;
+ color: var(--memdef-proto-text-color);
padding-bottom: 4px;
padding-top: 5px;
text-align:left;
font-weight: 400;
- -moz-border-radius-topleft: 4px;
- -moz-border-radius-topright: 4px;
- -webkit-border-top-left-radius: 4px;
- -webkit-border-top-right-radius: 4px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
- border-bottom: 1px solid ##B4;
+ border-bottom: 1px solid var(--memdef-border-color);
}
@@ -1096,7 +1028,7 @@ table.fieldtable {
top: 0px;
left: 10px;
height: 36px;
- background-image: url('tab_b.png');
+ background-image: var(--nav-gradient-image);
z-index: 101;
overflow: hidden;
font-size: 13px;
@@ -1105,13 +1037,13 @@ table.fieldtable {
.navpath ul
{
font-size: 11px;
- background-image:url('tab_b.png');
+ background-image: var(--nav-gradient-image);
background-repeat:repeat-x;
background-position: 0 -5px;
height:30px;
line-height:30px;
- color:##9b;
- border:solid 1px ##ca;
+ color:var(--nav-text-normal-color);
+ border:solid 1px var(--nav-breadcrumb-border-color);
overflow:hidden;
margin:0px;
padding:0px;
@@ -1123,10 +1055,10 @@ table.fieldtable {
float:left;
padding-left:10px;
padding-right:15px;
- background-image:url('bc_s.png');
+ background-image:var(--nav-breadcrumb-image);
background-repeat:no-repeat;
background-position:right;
- color:##45;
+ color: var(--nav-foreground-color);
}
.navpath li.navelem a
@@ -1135,15 +1067,16 @@ table.fieldtable {
display:block;
text-decoration: none;
outline: none;
- color: ##30;
- font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
- text-decoration: none;
+ color: var(--nav-text-normal-color);
+ font-family: var(--font-family-nav);
+ text-shadow: var(--nav-text-normal-shadow);
+ text-decoration: none;
}
.navpath li.navelem a:hover
{
- color:##80;
+ color: var(--nav-text-hover-color);
+ text-shadow: var(--nav-text-hover-shadow);
}
.navpath li.footer
@@ -1155,7 +1088,7 @@ table.fieldtable {
background-image:none;
background-repeat:no-repeat;
background-position:right;
- color:##45;
+ color: var(--footer-foreground-color);
font-size: 8pt;
}
@@ -1167,7 +1100,7 @@ div.summary
padding-right: 5px;
width: 50%;
text-align: right;
-}
+}
div.summary a
{
@@ -1182,7 +1115,7 @@ table.classindex
margin-right: 3%;
width: 94%;
border: 0;
- border-spacing: 0;
+ border-spacing: 0;
padding: 0;
}
@@ -1200,11 +1133,11 @@ div.ingroups a
div.header
{
- background-image:url('nav_h.png');
+ background-image: var(--header-gradient-image);
background-repeat:repeat-x;
- background-color: ##FA;
+ background-color: var(--header-background-color);
margin: 0px;
- border-bottom: 1px solid ##CC;
+ border-bottom: 1px solid var(--header-separator-color);
}
div.headertitle
@@ -1227,11 +1160,6 @@ dl.section {
padding-left: 0px;
}
-dl.section.DocNodeRTL {
- margin-right: 0px;
- padding-right: 0px;
-}
-
dl.note {
margin-left: -7px;
padding-left: 3px;
@@ -1239,16 +1167,6 @@ dl.note {
border-color: #D0C000;
}
-dl.note.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #D0C000;
-}
-
dl.warning, dl.attention {
margin-left: -7px;
padding-left: 3px;
@@ -1256,16 +1174,6 @@ dl.warning, dl.attention {
border-color: #FF0000;
}
-dl.warning.DocNodeRTL, dl.attention.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #FF0000;
-}
-
dl.pre, dl.post, dl.invariant {
margin-left: -7px;
padding-left: 3px;
@@ -1273,16 +1181,6 @@ dl.pre, dl.post, dl.invariant {
border-color: #00D000;
}
-dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #00D000;
-}
-
dl.deprecated {
margin-left: -7px;
padding-left: 3px;
@@ -1290,16 +1188,6 @@ dl.deprecated {
border-color: #505050;
}
-dl.deprecated.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #505050;
-}
-
dl.todo {
margin-left: -7px;
padding-left: 3px;
@@ -1307,16 +1195,6 @@ dl.todo {
border-color: #00C0E0;
}
-dl.todo.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #00C0E0;
-}
-
dl.test {
margin-left: -7px;
padding-left: 3px;
@@ -1324,16 +1202,6 @@ dl.test {
border-color: #3030E0;
}
-dl.test.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #3030E0;
-}
-
dl.bug {
margin-left: -7px;
padding-left: 3px;
@@ -1341,16 +1209,6 @@ dl.bug {
border-color: #C08050;
}
-dl.bug.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #C08050;
-}
-
dl.section dd {
margin-bottom: 6px;
}
@@ -1381,21 +1239,24 @@ dl.section dd {
#projectname
{
- font: 200% Tahoma, Arial,sans-serif;
+ font-size: 200%;
+ font-family: var(--font-family-title);
margin: 0px;
padding: 2px 0px;
}
-
+
#projectbrief
{
- font: 90% Tahoma, Arial,sans-serif;
+ font-size: 90%;
+ font-family: var(--font-family-title);
margin: 0px;
padding: 0px;
}
#projectnumber
{
- font: 50% Tahoma, Arial,sans-serif;
+ font-size: 50%;
+ font-family: 50% var(--font-family-title);
margin: 0px;
padding: 0px;
}
@@ -1405,7 +1266,8 @@ dl.section dd {
padding: 0px;
margin: 0px;
width: 100%;
- border-bottom: 1px solid ##70;
+ border-bottom: 1px solid var(--title-separator-color);
+ background-color: var(--title-background-color);
}
.image
@@ -1438,17 +1300,12 @@ dl.section dd {
font-weight: bold;
}
-div.zoom
-{
- border: 1px solid ##A0;
-}
-
dl.citelist {
margin-bottom:50px;
}
dl.citelist dt {
- color:##40;
+ color:var(--citation-label-color);
float:left;
font-weight:bold;
margin-right:10px;
@@ -1464,8 +1321,8 @@ dl.citelist dd {
div.toc {
padding: 14px 25px;
- background-color: ##F6;
- border: 1px solid ##DD;
+ background-color: var(--toc-background-color);
+ border: 1px solid var(--toc-border-color);
border-radius: 7px 7px 7px 7px;
float: right;
height: auto;
@@ -1473,28 +1330,17 @@ div.toc {
width: 200px;
}
-.PageDocRTL-title div.toc {
- float: left !important;
- text-align: right;
-}
-
div.toc li {
background: url("bdwn.png") no-repeat scroll 0 5px transparent;
- font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ font: 10px/1.2 var(--font-family-toc);
margin-top: 5px;
padding-left: 10px;
padding-top: 2px;
}
-.PageDocRTL-title div.toc li {
- background-position-x: right !important;
- padding-left: 0 !important;
- padding-right: 10px;
-}
-
div.toc h3 {
- font: bold 12px/1.2 Arial,FreeSans,sans-serif;
- color: ##60;
+ font: bold 12px/1.2 var(--font-family-toc);
+ color: var(--toc-header-color);
border-bottom: 0 none;
margin: 0;
}
@@ -1503,7 +1349,7 @@ div.toc ul {
list-style: none outside none;
border: medium none;
padding: 0px;
-}
+}
div.toc li.level1 {
margin-left: 0px;
@@ -1531,29 +1377,9 @@ span.obfuscator {
display: none;
}
-.PageDocRTL-title div.toc li.level1 {
- margin-left: 0 !important;
- margin-right: 0;
-}
-
-.PageDocRTL-title div.toc li.level2 {
- margin-left: 0 !important;
- margin-right: 15px;
-}
-
-.PageDocRTL-title div.toc li.level3 {
- margin-left: 0 !important;
- margin-right: 30px;
-}
-
-.PageDocRTL-title div.toc li.level4 {
- margin-left: 0 !important;
- margin-right: 45px;
-}
-
.inherit_header {
font-weight: bold;
- color: gray;
+ color: var(--inherit-header-color);
cursor: pointer;
-webkit-touch-callout: none;
-webkit-user-select: none;
@@ -1586,10 +1412,11 @@ tr.heading h2 {
#powerTip {
cursor: default;
/*white-space: nowrap;*/
- background-color: white;
- border: 1px solid gray;
+ color: var(--tooltip-foreground-color);
+ background-color: var(--tooltip-background-color);
+ border: 1px solid var(--tooltip-border-color);
border-radius: 4px 4px 4px 4px;
- box-shadow: 1px 1px 7px gray;
+ box-shadow: var(--tooltip-shadow);
display: none;
font-size: smaller;
max-width: 80%;
@@ -1600,7 +1427,7 @@ tr.heading h2 {
}
#powerTip div.ttdoc {
- color: grey;
+ color: var(--tooltip-doc-color);
font-style: italic;
}
@@ -1608,18 +1435,24 @@ tr.heading h2 {
font-weight: bold;
}
+#powerTip a {
+ color: var(--tooltip-link-color);
+}
+
#powerTip div.ttname {
font-weight: bold;
}
#powerTip div.ttdeci {
- color: #006318;
+ color: var(--tooltip-declaration-color);
}
#powerTip div {
margin: 0px;
padding: 0px;
- font: 12px/16px Roboto,sans-serif;
+ font-size: 12px;
+ font-family: var(--font-family-tooltip);
+ line-height: 16px;
}
#powerTip:before, #powerTip:after {
@@ -1664,12 +1497,12 @@ tr.heading h2 {
}
#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
- border-top-color: ##ff;
+ border-top-color: var(--tooltip-background-color);
border-width: 10px;
margin: 0px -10px;
}
-#powerTip.n:before {
- border-top-color: #808080;
+#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before {
+ border-top-color: var(--tooltip-border-color);
border-width: 11px;
margin: 0px -11px;
}
@@ -1692,13 +1525,13 @@ tr.heading h2 {
}
#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
- border-bottom-color: ##ff;
+ border-bottom-color: var(--tooltip-background-color);
border-width: 10px;
margin: 0px -10px;
}
#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
- border-bottom-color: #808080;
+ border-bottom-color: var(--tooltip-border-color);
border-width: 11px;
margin: 0px -11px;
}
@@ -1719,13 +1552,13 @@ tr.heading h2 {
left: 100%;
}
#powerTip.e:after {
- border-left-color: ##ff;
+ border-left-color: var(--tooltip-border-color);
border-width: 10px;
top: 50%;
margin-top: -10px;
}
#powerTip.e:before {
- border-left-color: #808080;
+ border-left-color: var(--tooltip-border-color);
border-width: 11px;
top: 50%;
margin-top: -11px;
@@ -1735,13 +1568,13 @@ tr.heading h2 {
right: 100%;
}
#powerTip.w:after {
- border-right-color: ##ff;
+ border-right-color: var(--tooltip-border-color);
border-width: 10px;
top: 50%;
margin-top: -10px;
}
#powerTip.w:before {
- border-right-color: #808080;
+ border-right-color: var(--tooltip-border-color);
border-width: 11px;
top: 50%;
margin-top: -11px;
@@ -1775,7 +1608,7 @@ table.markdownTable {
}
table.markdownTable td, table.markdownTable th {
- border: 1px solid ##37;
+ border: 1px solid var(--table-cell-border-color);
padding: 3px 7px 2px;
}
@@ -1783,8 +1616,8 @@ table.markdownTable tr {
}
th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
- background-color: ##47;
- color: ##ff;
+ background-color: var(--table-header-background-color);
+ color: var(--table-header-foreground-color);
font-size: 110%;
padding-bottom: 4px;
padding-top: 5px;
@@ -1802,36 +1635,9 @@ th.markdownTableHeadCenter, td.markdownTableBodyCenter {
text-align: center
}
-.DocNodeRTL {
- text-align: right;
- direction: rtl;
-}
-
-.DocNodeLTR {
- text-align: left;
- direction: ltr;
-}
-
-table.DocNodeRTL {
- width: auto;
- margin-right: 0;
- margin-left: auto;
-}
-
-table.DocNodeLTR {
- width: auto;
- margin-right: auto;
- margin-left: 0;
-}
-
-code.JavaDocCode {
- direction:ltr;
-}
-
tt, code, kbd, samp
{
display: inline-block;
- direction:ltr;
}
/* @end */
diff --git a/templates/html/dynsections.js b/templates/html/dynsections.js
index 3174bd7..f579fbf 100644
--- a/templates/html/dynsections.js
+++ b/templates/html/dynsections.js
@@ -47,6 +47,8 @@ function updateStripes()
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
+ $('table.directory tr').
+ removeClass('odd').filter(':visible:odd').addClass('odd');
}
function toggleLevel(level)
diff --git a/templates/html/extsearch.js b/templates/html/extsearch.js
index ffbe252..7c9e6d4 100644
--- a/templates/html/extsearch.js
+++ b/templates/html/extsearch.js
@@ -22,9 +22,8 @@
@licend The above is the entire license notice for the JavaScript code in this file
*/
-function SearchBox(name, resultsPath, inFrame, label)
+function SearchBox(name, resultsPath, extension)
{
- this.searchLabel = label;
this.DOMSearchField = function()
{ return document.getElementById("MSearchField"); }
this.DOMSearchBox = function()
@@ -34,16 +33,10 @@ function SearchBox(name, resultsPath, inFrame, label)
if (isActive)
{
this.DOMSearchBox().className = 'MSearchBoxActive';
- var searchField = this.DOMSearchField();
- if (searchField.value == this.searchLabel)
- {
- searchField.value = '';
- }
}
else
{
this.DOMSearchBox().className = 'MSearchBoxInactive';
- this.DOMSearchField().value = this.searchLabel;
}
}
}
@@ -115,7 +108,7 @@ function searchFor(query,page,count) {
r+='<div class="searchpages">';
if (data.page>0)
{
- r+='<span class="pages"><a href="javascript:searchFor(\''+escapeHtml(query)+'\','+(page-1).toString()+','+count.toString()+')">&laquo;</a></span>&nbsp;';
+ r+='<span class="pages"><a href="javascript:searchFor(\''+escapeHtml(query)+'\','+(page-1).toString()+','+count.toString()+')">&laquo;</a></span>&#160;';
}
var firstPage = data.page-5;
var lastPage = data.page+5;
@@ -132,11 +125,11 @@ function searchFor(query,page,count) {
{
if (i==data.page)
{
- r+='<span class="pages"><b>'+(i+1).toString()+'</b></span>&nbsp;';
+ r+='<span class="pages"><b>'+(i+1).toString()+'</b></span>&#160;';
}
else
{
- r+='<span class="pages"><a href="javascript:searchFor(\''+escapeHtml(query)+'\','+i.toString()+','+count.toString()+')">'+(i+1).toString()+'</a></span>&nbsp;';
+ r+='<span class="pages"><a href="javascript:searchFor(\''+escapeHtml(query)+'\','+i.toString()+','+count.toString()+')">'+(i+1).toString()+'</a></span>&#160;';
}
}
if (data.page+1<data.pages)
diff --git a/templates/html/fixed_tabs.css b/templates/html/fixed_tabs.css
index 93b0d51..b56f46e 100644
--- a/templates/html/fixed_tabs.css
+++ b/templates/html/fixed_tabs.css
@@ -1,28 +1,29 @@
.tabs, .tabs2, .tabs3 {
- background-image: url('tab_b.png');
+ background-image: var(--nav-gradient-image);
width: 100%;
z-index: 101;
- font-size: 13px;
- font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ font-size: var(--nav-font-size-level1);
+ font-family: var(--font-family-nav);
+ display: table;
}
.tabs2 {
- font-size: 10px;
+ font-size: var(--nav-font-size-level2);
}
.tabs3 {
- font-size: 9px;
+ font-size: var(--nav-font-size-level3);
}
.tablist {
margin: 0;
padding: 0;
- display: table;
+ display: block;
}
.tablist li {
float: left;
display: table-cell;
- background-image: url('tab_b.png');
+ background-image: var(--nav-gradient-image);
line-height: 36px;
list-style: none;
}
@@ -31,11 +32,11 @@
display: block;
padding: 0 20px;
font-weight: bold;
- background-image:url('tab_s.png');
+ background-image:var(--nav-separator-image);
background-repeat:no-repeat;
background-position:right;
- color: ##30;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ color: var(--nav-text-normal-color);
+ text-shadow: var(--nav-text-normal-shadow);
text-decoration: none;
outline: none;
}
@@ -45,17 +46,17 @@
}
.tablist a:hover {
- background-image: url('tab_h.png');
+ background-image: var(--nav-gradient-hover-image);
background-repeat:repeat-x;
- color: #fff;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ color: var(--nav-text-hover-color);
+ text-shadow: var(--nav-text-hover-shadow);
text-decoration: none;
}
.tablist li.current a {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
- color: #fff;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ color: var(--nav-text-active-color);
+ text-shadow: var(--nav-text-active-shadow);
}
diff --git a/templates/html/header.html b/templates/html/header.html
index adf16b6..2428886 100644
--- a/templates/html/header.html
+++ b/templates/html/header.html
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="$langISO">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
@@ -18,6 +18,7 @@
$treeview
$search
$mathjax
+$darkmode
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
</head>
diff --git a/templates/html/htmlbase.tpl b/templates/html/htmlbase.tpl
index 61ebf90..b77f826 100644
--- a/templates/html/htmlbase.tpl
+++ b/templates/html/htmlbase.tpl
@@ -122,7 +122,7 @@ MathJax.Hub.Config({
<div class="left">
<form id="FSearchBox" action="{{ page.relPath }}{% if config.EXTERNAL_SEARCH %}search{{ doxygen.htmlFileExtension }}{% else %}search.php{% endif %}" method="get">
<img id="MSearchSelect" src="{{ page.relPath }}search/mag.svg" alt=""/>
- <input type="text" id="MSearchField" name="query" value="{{ tr.search }}" size="20" accesskey="S"
+ <input type="text" id="MSearchField" name="query" value="" placeholder="{{ tr.search }}" size="20" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"/>
</form>
@@ -136,7 +136,7 @@ MathJax.Hub.Config({
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
- <input type="text" id="MSearchField" value="{{ tr.search }}" accesskey="S"
+ <input type="text" id="MSearchField" value="" placeholder="{{ tr.search }}" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
@@ -161,7 +161,7 @@ MathJax.Hub.Config({
{% if config.SEARCHENGINE %}
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
- var searchBox = new SearchBox("searchBox", "{{ page.relPath }}search",'{{ tr.search }}','{{ config.HTML_FILE_EXTENSION }}');
+ var searchBox = new SearchBox("searchBox", "{{ page.relPath }}search", '{{ config.HTML_FILE_EXTENSION }}');
/* @license-end */
</script>
{% endif %}
diff --git a/templates/html/htmllayout.tpl b/templates/html/htmllayout.tpl
index 35cb0c1..05291c0 100644
--- a/templates/html/htmllayout.tpl
+++ b/templates/html/htmllayout.tpl
@@ -44,9 +44,6 @@
{% resource 'splitbar.lum' %}
{# general search resources #}
-{% resource 'search_l.png' as 'search/search_l.png' %}
-{% resource 'search_m.png' as 'search/search_m.png' %}
-{% resource 'search_r.png' as 'search/search_r.png' %}
{% if config.DISABLE_INDEX %}
{% if config.GENERATE_TREEVIEW and config.FULL_SIDEBAR %}
{% resource 'search_sidebar.css' as 'search/search.css' %}
diff --git a/templates/html/htmlmemdef.tpl b/templates/html/htmlmemdef.tpl
index d6bce5b..07709e6 100644
--- a/templates/html/htmlmemdef.tpl
+++ b/templates/html/htmlmemdef.tpl
@@ -5,7 +5,7 @@
{% for member in memberListInfo.members %}
{% if member.detailsVisibleFor:compound.compoundKind %}
<a id="{{ member.anchor }}" name="{{ member.anchor }}"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#{{ member.anchor }}">&#9670;&nbsp;</a></span>{{ member.name }}{% if member.isFunction and not member.isObjCMethod %}(){% endif %}
+ <h2 class="memtitle"><span class="permalink"><a href="#{{ member.anchor }}">&#9670;&#160;</a></span>{{ member.name }}{% if member.isFunction and not member.isObjCMethod %}(){% endif %}
{% if memberListInfo.members|length>1 %}<span class="overload">[{{ forloop.counter }}/{{ memberListInfo.members|length }}]</a>{% endif %}
</h2>
<div class="memitem">
diff --git a/templates/html/jquery.js b/templates/html/jquery.js
index c9ed3d9..1dffb65 100644
--- a/templates/html/jquery.js
+++ b/templates/html/jquery.js
@@ -1,12 +1,11 @@
/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
-/*! jQuery UI - v1.12.1 - 2019-01-27
+/*! jQuery UI - v1.13.2 - 2022-08-01
* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
+* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
* Copyright jQuery Foundation and other contributors; Licensed MIT */
-(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}t.ui=t.ui||{},t.ui.version="1.12.1";var i=0,s=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,n,o=s.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,m,g,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),x={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,m=_.offset,g=t.extend({},m),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?g.left+=p:"center"===n.at[0]&&(g.left+=p/2),"bottom"===n.at[1]?g.top+=f:"center"===n.at[1]&&(g.top+=f/2),u=e(x.at,p,f),g.left+=u[0],g.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),k=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},g),T=e(x.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:k,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=m.left-D.left,i=e+p-l,s=m.top-D.top,r=s+f-c,u={target:{element:v,left:m.left,top:m.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element
-},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/**
+!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(y){"use strict";y.ui=y.ui||{};y.ui.version="1.13.2";var n,i=0,h=Array.prototype.hasOwnProperty,a=Array.prototype.slice;y.cleanData=(n=y.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=y._data(i,"events"))&&e.remove&&y(i).triggerHandler("remove");n(t)}),y.widget=function(t,i,e){var s,n,o,h={},a=t.split(".")[0],r=a+"-"+(t=t.split(".")[1]);return e||(e=i,i=y.Widget),Array.isArray(e)&&(e=y.extend.apply(null,[{}].concat(e))),y.expr.pseudos[r.toLowerCase()]=function(t){return!!y.data(t,r)},y[a]=y[a]||{},s=y[a][t],n=y[a][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},y.extend(n,s,{version:e.version,_proto:y.extend({},e),_childConstructors:[]}),(o=new i).options=y.widget.extend({},o.options),y.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}h[e]="function"==typeof s?function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}:s}),n.prototype=y.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},h,{constructor:n,namespace:a,widgetName:t,widgetFullName:r}),s?(y.each(s._childConstructors,function(t,e){var i=e.prototype;y.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),y.widget.bridge(t,n),n},y.widget.extend=function(t){for(var e,i,s=a.call(arguments,1),n=0,o=s.length;n<o;n++)for(e in s[n])i=s[n][e],h.call(s[n],e)&&void 0!==i&&(y.isPlainObject(i)?t[e]=y.isPlainObject(t[e])?y.widget.extend({},t[e],i):y.widget.extend({},i):t[e]=i);return t},y.widget.bridge=function(o,e){var h=e.prototype.widgetFullName||o;y.fn[o]=function(i){var t="string"==typeof i,s=a.call(arguments,1),n=this;return t?this.length||"instance"!==i?this.each(function(){var t,e=y.data(this,h);return"instance"===i?(n=e,!1):e?"function"!=typeof e[i]||"_"===i.charAt(0)?y.error("no such method '"+i+"' for "+o+" widget instance"):(t=e[i].apply(e,s))!==e&&void 0!==t?(n=t&&t.jquery?n.pushStack(t.get()):t,!1):void 0:y.error("cannot call methods on "+o+" prior to initialization; attempted to call method '"+i+"'")}):n=void 0:(s.length&&(i=y.widget.extend.apply(null,[i].concat(s))),this.each(function(){var t=y.data(this,h);t?(t.option(i||{}),t._init&&t._init()):y.data(this,h,new e(i,this))})),n}},y.Widget=function(){},y.Widget._childConstructors=[],y.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n<i.length-1;n++)s[i[n]]=s[i[n]]||{},s=s[i[n]];if(t=i.pop(),1===arguments.length)return void 0===s[t]?null:s[t];s[t]=e}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=e}return this._setOptions(o),this},_setOptions:function(t){for(var e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(t){var e,i,s;for(e in t)s=this.classesElementLookup[e],t[e]!==this.options.classes[e]&&s&&s.length&&(i=y(s.get()),this._removeClass(s,e),i.addClass(this._classes({element:i,keys:e,classes:t,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(n){var o=[],h=this;function t(t,e){for(var i,s=0;s<t.length;s++)i=h.classesElementLookup[t[s]]||y(),i=n.add?(function(){var i=[];n.element.each(function(t,e){y.map(h.classesElementLookup,function(t){return t}).some(function(t){return t.is(e)})||i.push(e)}),h._on(y(i),{remove:"_untrackClassesElement"})}(),y(y.uniqueSort(i.get().concat(n.element.get())))):y(i.not(n.element).get()),h.classesElementLookup[t[s]]=i,o.push(t[s]),e&&n.classes[t[s]]&&o.push(n.classes[t[s]])}return(n=y.extend({element:this.element,classes:this.options.classes||{}},n)).keys&&t(n.keys.match(/\S+/g)||[],!0),n.extra&&t(n.extra.match(/\S+/g)||[]),o.join(" ")},_untrackClassesElement:function(i){var s=this;y.each(s.classesElementLookup,function(t,e){-1!==y.inArray(i.target,e)&&(s.classesElementLookup[t]=y(e.not(i.target).get()))}),this._off(y(i.target))},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){var n="string"==typeof t||null===t,i={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s="boolean"==typeof s?s:i};return i.element.toggleClass(this._classes(i),s),this},_on:function(n,o,t){var h,a=this;"boolean"!=typeof n&&(t=o,o=n,n=!1),t?(o=h=y(o),this.bindings=this.bindings.add(o)):(t=o,o=this.element,h=this.widget()),y.each(t,function(t,e){function i(){if(n||!0!==a.options.disabled&&!y(this).hasClass("ui-state-disabled"))return("string"==typeof e?a[e]:e).apply(a,arguments)}"string"!=typeof e&&(i.guid=e.guid=e.guid||i.guid||y.guid++);var s=t.match(/^([\w:-]*)\s*(.*)$/),t=s[1]+a.eventNamespace,s=s[2];s?h.on(t,s,i):o.on(t,i)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.off(e),this.bindings=y(this.bindings.not(t).get()),this.focusable=y(this.focusable.not(t).get()),this.hoverable=y(this.hoverable.not(t).get())},_delay:function(t,e){var i=this;return setTimeout(function(){return("string"==typeof t?i[t]:t).apply(i,arguments)},e||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){this._addClass(y(t.currentTarget),null,"ui-state-hover")},mouseleave:function(t){this._removeClass(y(t.currentTarget),null,"ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){this._addClass(y(t.currentTarget),null,"ui-state-focus")},focusout:function(t){this._removeClass(y(t.currentTarget),null,"ui-state-focus")}})},_trigger:function(t,e,i){var s,n,o=this.options[t];if(i=i||{},(e=y.Event(e)).type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),e.target=this.element[0],n=e.originalEvent)for(s in n)s in e||(e[s]=n[s]);return this.element.trigger(e,i),!("function"==typeof o&&!1===o.apply(this.element[0],[e].concat(i))||e.isDefaultPrevented())}},y.each({show:"fadeIn",hide:"fadeOut"},function(o,h){y.Widget.prototype["_"+o]=function(e,t,i){var s,n=(t="string"==typeof t?{effect:t}:t)?!0!==t&&"number"!=typeof t&&t.effect||h:o;"number"==typeof(t=t||{})?t={duration:t}:!0===t&&(t={}),s=!y.isEmptyObject(t),t.complete=i,t.delay&&e.delay(t.delay),s&&y.effects&&y.effects.effect[n]?e[o](t):n!==o&&e[n]?e[n](t.duration,t.easing,i):e.queue(function(t){y(this)[o](),i&&i.call(e[0]),t()})}});var s,x,D,o,r,l,u,p,W;y.widget;function E(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function H(t,e){return parseInt(y.css(t,e),10)||0}function S(t){return null!=t&&t===t.window}x=Math.max,D=Math.abs,o=/left|center|right/,r=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,u=/^\w+/,p=/%$/,W=y.fn.position,y.position={scrollbarWidth:function(){if(void 0!==s)return s;var t,e=y("<div style='display:block;position:absolute;width:200px;height:200px;overflow:hidden;'><div style='height:300px;width:auto;'></div></div>"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.width<t.element[0].scrollWidth;return{width:"scroll"===i||"auto"===i&&t.height<t.element[0].scrollHeight?y.position.scrollbarWidth():0,height:e?y.position.scrollbarWidth():0}},getWithinInfo:function(t){var e=y(t||window),i=S(e[0]),s=!!e[0]&&9===e[0].nodeType;return{element:e,isWindow:i,isDocument:s,offset:!i&&!s?y(t).offset():{left:0,top:0},scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop(),width:e.outerWidth(),height:e.outerHeight()}}},y.fn.position=function(p){if(!p||!p.of)return W.apply(this,arguments);var d,c,f,g,m,t,_="string"==typeof(p=y.extend({},p)).of?y(document).find(p.of):y(p.of),w=y.position.getWithinInfo(p.within),v=y.position.getScrollInfo(w),b=(p.collision||"flip").split(" "),z={},e=9===(t=(e=_)[0]).nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:S(t)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:t.preventDefault?{width:0,height:0,offset:{top:t.pageY,left:t.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()};return _[0].preventDefault&&(p.at="left top"),c=e.width,f=e.height,m=y.extend({},g=e.offset),y.each(["my","at"],function(){var t,e,i=(p[this]||"").split(" ");(i=1===i.length?o.test(i[0])?i.concat(["center"]):r.test(i[0])?["center"].concat(i):["center","center"]:i)[0]=o.test(i[0])?i[0]:"center",i[1]=r.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),z[this]=[t?t[0]:0,e?e[0]:0],p[this]=[u.exec(i[0])[0],u.exec(i[1])[0]]}),1===b.length&&(b[1]=b[0]),"right"===p.at[0]?m.left+=c:"center"===p.at[0]&&(m.left+=c/2),"bottom"===p.at[1]?m.top+=f:"center"===p.at[1]&&(m.top+=f/2),d=E(z.at,c,f),m.left+=d[0],m.top+=d[1],this.each(function(){var i,t,h=y(this),a=h.outerWidth(),r=h.outerHeight(),e=H(this,"marginLeft"),s=H(this,"marginTop"),n=a+e+H(this,"marginRight")+v.width,o=r+s+H(this,"marginBottom")+v.height,l=y.extend({},m),u=E(z.my,h.outerWidth(),h.outerHeight());"right"===p.my[0]?l.left-=a:"center"===p.my[0]&&(l.left-=a/2),"bottom"===p.my[1]?l.top-=r:"center"===p.my[1]&&(l.top-=r/2),l.left+=u[0],l.top+=u[1],i={marginLeft:e,marginTop:s},y.each(["left","top"],function(t,e){y.ui.position[b[t]]&&y.ui.position[b[t]][e](l,{targetWidth:c,targetHeight:f,elemWidth:a,elemHeight:r,collisionPosition:i,collisionWidth:n,collisionHeight:o,offset:[d[0]+u[0],d[1]+u[1]],my:p.my,at:p.at,within:w,elem:h})}),p.using&&(t=function(t){var e=g.left-l.left,i=e+c-a,s=g.top-l.top,n=s+f-r,o={target:{element:_,left:g.left,top:g.top,width:c,height:f},element:{element:h,left:l.left,top:l.top,width:a,height:r},horizontal:i<0?"left":0<e?"right":"center",vertical:n<0?"top":0<s?"bottom":"middle"};c<a&&D(e+i)<c&&(o.horizontal="center"),f<r&&D(s+n)<f&&(o.vertical="middle"),x(D(e),D(i))>x(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0<h&&a<=0?(i=t.left+h+e.collisionWidth-n-s,t.left+=h-i):t.left=!(0<a&&h<=0)&&a<h?s+n-e.collisionWidth:s:0<h?t.left+=h:0<a?t.left-=a:t.left=x(t.left-o,t.left)},top:function(t,e){var i=e.within,s=i.isWindow?i.scrollTop:i.offset.top,n=e.within.height,o=t.top-e.collisionPosition.marginTop,h=s-o,a=o+e.collisionHeight-n-s;e.collisionHeight>n?0<h&&a<=0?(i=t.top+h+e.collisionHeight-n-s,t.top+=h-i):t.top=!(0<a&&h<=0)&&a<h?s+n-e.collisionHeight:s:0<h?t.top+=h:0<a?t.top-=a:t.top=x(t.top-o,t.top)}},flip:{left:function(t,e){var i=e.within,s=i.offset.left+i.scrollLeft,n=i.width,o=i.isWindow?i.scrollLeft:i.offset.left,h=t.left-e.collisionPosition.marginLeft,a=h-o,r=h+e.collisionWidth-n-o,l="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,i="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,h=-2*e.offset[0];a<0?((s=t.left+l+i+h+e.collisionWidth-n-s)<0||s<D(a))&&(t.left+=l+i+h):0<r&&(0<(o=t.left-e.collisionPosition.marginLeft+l+i+h-o)||D(o)<r)&&(t.left+=l+i+h)},top:function(t,e){var i=e.within,s=i.offset.top+i.scrollTop,n=i.height,o=i.isWindow?i.scrollTop:i.offset.top,h=t.top-e.collisionPosition.marginTop,a=h-o,r=h+e.collisionHeight-n-o,l="top"===e.my[1]?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,i="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,h=-2*e.offset[1];a<0?((s=t.top+l+i+h+e.collisionHeight-n-s)<0||s<D(a))&&(t.top+=l+i+h):0<r&&(0<(o=t.top-e.collisionPosition.marginTop+l+i+h-o)||D(o)<r)&&(t.top+=l+i+h)}},flipfit:{left:function(){y.ui.position.flip.left.apply(this,arguments),y.ui.position.fit.left.apply(this,arguments)},top:function(){y.ui.position.flip.top.apply(this,arguments),y.ui.position.fit.top.apply(this,arguments)}}};var t;y.ui.position,y.extend(y.expr.pseudos,{data:y.expr.createPseudo?y.expr.createPseudo(function(e){return function(t){return!!y.data(t,e)}}):function(t,e,i){return!!y.data(t,i[3])}}),y.fn.extend({disableSelection:(t="onselectstart"in document.createElement("div")?"selectstart":"mousedown",function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}),enableSelection:function(){return this.off(".ui-disableSelection")}});y.ui.focusable=function(t,e){var i,s,n,o,h=t.nodeName.toLowerCase();return"area"===h?(s=(i=t.parentNode).name,!(!t.href||!s||"map"!==i.nodeName.toLowerCase())&&(0<(s=y("img[usemap='#"+s+"']")).length&&s.is(":visible"))):(/^(input|select|textarea|button|object)$/.test(h)?(n=!t.disabled)&&(o=y(t).closest("fieldset")[0])&&(n=!o.disabled):n="a"===h&&t.href||e,n&&y(t).is(":visible")&&function(t){var e=t.css("visibility");for(;"inherit"===e;)t=t.parent(),e=t.css("visibility");return"visible"===e}(y(t)))},y.extend(y.expr.pseudos,{focusable:function(t){return y.ui.focusable(t,null!=y.attr(t,"tabindex"))}});var e,d;y.ui.focusable,y.fn._form=function(){return"string"==typeof this[0].form?this.closest("form"):y(this[0].form)},y.ui.formResetMixin={_formResetHandler:function(){var e=y(this);setTimeout(function(){var t=e.data("ui-form-reset-instances");y.each(t,function(){this.refresh()})})},_bindFormResetHandler:function(){var t;this.form=this.element._form(),this.form.length&&((t=this.form.data("ui-form-reset-instances")||[]).length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t))},_unbindFormResetHandler:function(){var t;this.form.length&&((t=this.form.data("ui-form-reset-instances")).splice(y.inArray(this,t),1),t.length?this.form.data("ui-form-reset-instances",t):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset"))}};y.expr.pseudos||(y.expr.pseudos=y.expr[":"]),y.uniqueSort||(y.uniqueSort=y.unique),y.escapeSelector||(e=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,d=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},y.escapeSelector=function(t){return(t+"").replace(e,d)}),y.fn.even&&y.fn.odd||y.fn.extend({even:function(){return this.filter(function(t){return t%2==0})},odd:function(){return this.filter(function(t){return t%2==1})}});y.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},y.fn.labels=function(){var t,e,i;return this.length?this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),(t=this.attr("id"))&&(i=(i=this.eq(0).parents().last()).add((i.length?i:this).siblings()),t="label[for='"+y.escapeSelector(t)+"']",e=e.add(i.find(t).addBack(t))),this.pushStack(e)):this.pushStack([])},y.fn.scrollParent=function(t){var e=this.css("position"),i="absolute"===e,s=t?/(auto|scroll|hidden)/:/(auto|scroll)/,t=this.parents().filter(function(){var t=y(this);return(!i||"static"!==t.css("position"))&&s.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&t.length?t:y(this[0].ownerDocument||document)},y.extend(y.expr.pseudos,{tabbable:function(t){var e=y.attr(t,"tabindex"),i=null!=e;return(!i||0<=e)&&y.ui.focusable(t,i)}}),y.fn.extend({uniqueId:(c=0,function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++c)})}),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&y(this).removeAttr("id")})}}),y.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c,f=!1;y(document).on("mouseup",function(){f=!1});y.widget("ui.mouse",{version:"1.13.2",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(t){if(!0===y.data(t.target,e.widgetName+".preventClickEvent"))return y.removeData(t.target,e.widgetName+".preventClickEvent"),t.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!f){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var e=this,i=1===t.which,s=!("string"!=typeof this.options.cancel||!t.target.nodeName)&&y(t.target).closest(this.options.cancel).length;return i&&!s&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(t),!this._mouseStarted)?(t.preventDefault(),!0):(!0===y.data(t.target,this.widgetName+".preventClickEvent")&&y.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return e._mouseMove(t)},this._mouseUpDelegate=function(t){return e._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),f=!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(y.ui.ie&&(!document.documentMode||document.documentMode<9)&&!t.button)return this._mouseUp(t);if(!t.which)if(t.originalEvent.altKey||t.originalEvent.ctrlKey||t.originalEvent.metaKey||t.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,t),this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&y.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,f=!1,t.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n<o.length;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}};y.widget("ui.resizable",y.ui.mouse,{version:"1.13.2",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(t,e){if("hidden"===y(t).css("overflow"))return!1;var i=e&&"left"===e?"scrollLeft":"scrollTop",e=!1;if(0<t[i])return!0;try{t[i]=1,e=0<t[i],t[i]=0}catch(t){}return e},_create:function(){var t,e=this.options,i=this;this._addClass("ui-resizable"),y.extend(this,{_aspectRatio:!!e.aspectRatio,aspectRatio:e.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:e.helper||e.ghost||e.animate?e.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(y("<div class='ui-wrapper'></div>").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e<i.length;e++)s="ui-resizable-"+(t=String.prototype.trim.call(i[e])),n=y("<div>"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),s<n.maxWidth&&(n.maxWidth=s),t<n.maxHeight&&(n.maxHeight=t)),this._vBoundaries=n},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e<this._proportionallyResizeElements.length;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,e=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||y("<div></div>").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidth<d,g=i.maxHeight&&i.maxHeight<c,m=i.minWidth&&i.minWidth>d,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0<c-l?(e.size.height=c,e.position.top=o.top-p):(c=l-t.height,e.size.height=c,e.position.top=o.top+n.height-c),0<d-r?(e.size.width=d,e.position.left=o.left-u):(d=r-t.width,e.size.width=d,e.position.left=o.left+n.width-d))}});y.ui.resizable});/**
* Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler
* Licensed under MIT
* @author Ariel Flesler
diff --git a/templates/html/lightmode_settings.css b/templates/html/lightmode_settings.css
new file mode 100644
index 0000000..f9c0a44
--- /dev/null
+++ b/templates/html/lightmode_settings.css
@@ -0,0 +1,158 @@
+/* page base colors */
+--page-background-color: white;
+--page-foreground-color: black;
+--page-link-color: ##50;
+--page-visited-link-color: ##60;
+
+/* index */
+--index-odd-item-bg-color: ##F9;
+--index-even-item-bg-color: white;
+--index-header-color: black;
+--index-separator-color: #A0A0A0;
+
+/* header */
+--header-background-color: ##FA;
+--header-separator-color: ##CC;
+--header-gradient-image: url('nav_h.png');
+--group-header-separator-color: ##99;
+--group-header-color: ##44;
+--inherit-header-color: gray;
+
+--footer-foreground-color: ##33;
+--footer-logo-width: 104px;
+--citation-label-color: ##40;
+--glow-color: cyan;
+
+--title-background-color: white;
+--title-separator-color: ##70;
+--directory-separator-color: ##AA;
+--separator-color: ##66;
+
+--blockquote-background-color: ##F8;
+--blockquote-border-color: ##AA;
+
+--scrollbar-thumb-color: ##AA;
+--scrollbar-background-color: ##FA;
+
+--icon-background-color: ##88;
+--icon-foreground-color: white;
+--icon-doc-image: url('doc.png');
+
+/* brief member declaration list */
+--memdecl-background-color: ##FA;
+--memdecl-separator-color: ##E2;
+--memdecl-foreground-color: #555;
+--memdecl-template-color: ##60;
+
+/* detailed member list */
+--memdef-border-color: ##B4;
+--memdef-title-background-color: ##E6;
+--memdef-title-gradient-image: url('nav_f.png');
+--memdef-proto-background-color: ##E3;
+--memdef-proto-text-color: ##2b;
+--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+--memdef-doc-background-color: white;
+--memdef-param-name-color: #602020;
+--memdef-template-color: ##60;
+
+/* tables */
+--table-cell-border-color: ##37;
+--table-header-background-color: ##47;
+--table-header-foreground-color: ##ff;
+
+/* labels */
+--label-background-color: ##88;
+--label-left-top-border-color: ##70;
+--label-right-bottom-border-color: ##CC;
+--label-foreground-color: white;
+
+/** navigation bar/tree/menu */
+--nav-background-color: ##FA;
+--nav-foreground-color: ##45;
+--nav-gradient-image: url('tab_b.png');
+--nav-gradient-hover-image: url('tab_h.png');
+--nav-gradient-active-image: url('tab_a.png');
+--nav-gradient-active-image-parent: url("../tab_a.png");
+--nav-separator-image: url('tab_s.png');
+--nav-breadcrumb-image: url('bc_s.png');
+--nav-breadcrumb-border-color: ##CA;
+--nav-splitbar-image: url('splitbar.png');
+--nav-font-size-level1: 13px;
+--nav-font-size-level2: 10px;
+--nav-font-size-level3: 9px;
+--nav-text-normal-color: ##30;
+--nav-text-hover-color: white;
+--nav-text-active-color: white;
+--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+--nav-menu-button-color: ##45;
+--nav-menu-background-color: white;
+--nav-menu-foreground-color: #555555;
+--nav-menu-toggle-color: rgba(255, 255, 255, 0.5);
+--nav-arrow-color: ##AA;
+--nav-arrow-selected-color: ##AA;
+
+/* table of contents */
+--toc-background-color: ##F6;
+--toc-border-color: ##DD;
+--toc-header-color: ##60;
+
+/** search field */
+--search-background-color: white;
+--search-foreground-color: #909090;
+--search-magnification-image: url('mag.svg');
+--search-magnification-select-image: url('mag_sel.svg');
+--search-active-color: black;
+--search-filter-background-color: ##FA;
+--search-filter-foreground-color: black;
+--search-filter-border-color: ##A0;
+--search-filter-highlight-text-color: white;
+--search-filter-highlight-bg-color: ##50;
+--search-results-foreground-color: ##58;
+--search-results-background-color: ##F0;
+--search-results-border-color: black;
+--search-box-shadow: inset 0.5px 0.5px 3px 0px #555;
+
+/** code fragments */
+--code-keyword-color: #008000;
+--code-type-keyword-color: #604020;
+--code-flow-keyword-color: #E08000;
+--code-comment-color: #800000;
+--code-preprocessor-color: #806020;
+--code-string-literal-color: #002080;
+--code-char-literal-color: #008080;
+--code-vhdl-digit-color: #FF00FF;
+--code-vhdl-char-color: #000000;
+--code-vhdl-keyword-color: #700070;
+--code-vhdl-logic-color: #FF0000;
+--code-link-color: ##60;
+--code-external-link-color: ##60;
+--fragment-foreground-color: black;
+--fragment-background-color: ##FC;
+--fragment-border-color: ##CC;
+--fragment-lineno-border-color: #00FF00;
+--fragment-lineno-background-color: #E8E8E8;
+--fragment-lineno-foreground-color: black;
+--fragment-lineno-link-fg-color: ##60;
+--fragment-lineno-link-bg-color: #D8D8D8;
+--fragment-lineno-link-hover-fg-color: ##60;
+--fragment-lineno-link-hover-bg-color: #C8C8C8;
+--tooltip-foreground-color: black;
+--tooltip-background-color: white;
+--tooltip-border-color: gray;
+--tooltip-doc-color: grey;
+--tooltip-declaration-color: #006318;
+--tooltip-link-color: ##60;
+--tooltip-shadow: 1px 1px 7px gray;
+
+/** font-family */
+--font-family-normal: Roboto,sans-serif;
+--font-family-monospace: monospace,fixed;
+--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+--font-family-title: Tahoma,Arial,sans-serif;
+--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif;
+--font-family-search: Arial,Verdana,sans-serif;
+--font-family-icon: Arial,Helvetica;
+--font-family-tooltip: Roboto,sans-serif;
+
diff --git a/templates/html/mag.png b/templates/html/mag.png
deleted file mode 100644
index 858fea5..0000000
--- a/templates/html/mag.png
+++ /dev/null
Binary files differ
diff --git a/templates/html/mag_d.svg b/templates/html/mag_d.svg
new file mode 100644
index 0000000..b9a814c
--- /dev/null
+++ b/templates/html/mag_d.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 20 19"
+ height="19"
+ width="20"
+ id="svg2"
+ version="1.1">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <circle
+ r="3.5"
+ cy="8.5"
+ cx="5.5"
+ id="path4611"
+ style="fill:#000000;fill-opacity:0;stroke:#C5C5C5;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
+ <path
+ id="path4630"
+ d="m 8.1085854,11.109059 2.7823556,2.782356"
+ style="fill:none;stroke:#C5C5C5;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+</svg>
diff --git a/templates/html/mag_sel.png b/templates/html/mag_sel.png
deleted file mode 100644
index 39c0ed5..0000000
--- a/templates/html/mag_sel.png
+++ /dev/null
Binary files differ
diff --git a/templates/html/mag_seld.svg b/templates/html/mag_seld.svg
new file mode 100644
index 0000000..6e720dc
--- /dev/null
+++ b/templates/html/mag_seld.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg2"
+ width="20"
+ height="19"
+ viewBox="0 0 20 19"
+ sodipodi:docname="mag_sel.svg"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="2096"
+ id="namedview4"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="32"
+ inkscape:cx="5.9792688"
+ inkscape:cy="1.1436277"
+ inkscape:window-x="1920"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <circle
+ style="fill:#000000;fill-opacity:0;stroke:#C5C5C5;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ id="path4611"
+ cx="5.5"
+ cy="8.5"
+ r="3.5" />
+ <path
+ style="fill:#C5C5C5;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 11,7 13.5,10 16,7 Z"
+ id="path4609"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#C5C5C5;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.1085854,11.109059 2.7823556,2.782356"
+ id="path4630"
+ inkscape:connector-curvature="0" />
+</svg>
diff --git a/templates/html/menu.js b/templates/html/menu.js
index 818b859..b0b2693 100644
--- a/templates/html/menu.js
+++ b/templates/html/menu.js
@@ -44,28 +44,26 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
}
return result;
}
- var searchBox;
+ var searchBoxHtml;
if (searchEnabled) {
if (serverSide) {
- searchBox='<div id="MSearchBox" class="MSearchBoxInactive">'+
+ searchBoxHtml='<div id="MSearchBox" class="MSearchBoxInactive">'+
'<div class="left">'+
'<form id="FSearchBox" action="'+relPath+searchPage+
- '" method="get"><img id="MSearchSelect" src="'+
- relPath+'search/mag.svg" alt=""/>'+
- '<input type="text" id="MSearchField" name="query" value="'+search+
+ '" method="get"><span id="MSearchSelectExt">&#160;</span>'+
+ '<input type="text" id="MSearchField" name="query" value="" placeholder="'+search+
'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)"'+
- ' onblur="searchBox.OnSearchFieldFocus(false)">'+
+ ' onblur="searchBox.OnSearchFieldFocus(false)"/>'+
'</form>'+
'</div>'+
'<div class="right"></div>'+
'</div>';
} else {
- searchBox='<div id="MSearchBox" class="MSearchBoxInactive">'+
+ searchBoxHtml='<div id="MSearchBox" class="MSearchBoxInactive">'+
'<span class="left">'+
- '<img id="MSearchSelect" src="'+relPath+
- 'search/mag_sel.svg" onmouseover="return searchBox.OnSearchSelectShow()"'+
- ' onmouseout="return searchBox.OnSearchSelectHide()" alt=""/>'+
- '<input type="text" id="MSearchField" value="'+search+
+ '<span id="MSearchSelect" onmouseover="return searchBox.OnSearchSelectShow()"'+
+ ' onmouseout="return searchBox.OnSearchSelectHide()">&#160;</span>'+
+ '<input type="text" id="MSearchField" value="" placeholder="'+search+
'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" '+
'onblur="searchBox.OnSearchFieldFocus(false)" '+
'onkeyup="searchBox.OnSearchFieldChange(event)"/>'+
@@ -73,8 +71,8 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
'<span class="right"><a id="MSearchClose" '+
'href="javascript:searchBox.CloseResultsWindow()">'+
'<img id="MSearchCloseImg" border="0" src="'+relPath+
- 'search/close.svg" alt=""/></a>'
- '</span>'
+ 'search/close.svg" alt=""/></a>'+
+ '</span>'+
'</div>';
}
}
@@ -87,7 +85,7 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
'</div>');
$('#main-nav').append(makeTree(menudata,relPath));
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
- if (searchBox) {
+ if (searchBoxHtml) {
$('#main-menu').append('<li id="searchBoxPos2" style="float:right"></li>');
}
var $mainMenuState = $('#main-menu-state');
@@ -116,14 +114,17 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
if (newWidth!=prevWidth) {
if ($(window).outerWidth()<768) {
$mainMenuState.prop('checked',false); $menu.hide();
- $('#searchBoxPos1').html(searchBox);
+ $('#searchBoxPos1').html(searchBoxHtml);
$('#searchBoxPos2').hide();
} else {
$menu.show();
$('#searchBoxPos1').empty();
- $('#searchBoxPos2').html(searchBox);
+ $('#searchBoxPos2').html(searchBoxHtml);
$('#searchBoxPos2').show();
}
+ if (typeof searchBox!=='undefined') {
+ searchBox.CloseResultsWindow();
+ }
prevWidth = newWidth;
}
}
diff --git a/templates/html/nav_fd.lum b/templates/html/nav_fd.lum
new file mode 100644
index 0000000..7d72ff8
--- /dev/null
+++ b/templates/html/nav_fd.lum
@@ -0,0 +1,11 @@
+# function header in dark mode
+# width & height
+1 56
+# luma data
+48 47 46 45 44 43 42 41
+40 39 38 37 36 35 34 33
+32 31 30 29 28 23 23 23
+23 23 23 23 23 23 23 23
+24 24 24 24 25 25 25 25
+25 26 26 26 27 27 27 27
+28 28 28 29 29 29 29 29
diff --git a/templates/html/nav_h.lum b/templates/html/nav_h.lum
index d30ee08..63bacf2 100644
--- a/templates/html/nav_h.lum
+++ b/templates/html/nav_h.lum
@@ -1,4 +1,4 @@
-# shadowed header
+# shadowed header for light mode
# width & height
1 12
# luma data
diff --git a/templates/html/nav_hd.lum b/templates/html/nav_hd.lum
new file mode 100644
index 0000000..4e2cc8d
--- /dev/null
+++ b/templates/html/nav_hd.lum
@@ -0,0 +1,7 @@
+# shadowed header for dark mode
+# width & height
+1 12
+# luma data
+ 23 16 15 14 13 12
+ 11 10 9 8 7 6
+
diff --git a/templates/html/navtree.css b/templates/html/navtree.css
index 585ecad..c8a7766 100644
--- a/templates/html/navtree.css
+++ b/templates/html/navtree.css
@@ -22,8 +22,13 @@
#nav-tree .selected {
background-image: url('tab_a.png');
background-repeat:repeat-x;
- color: #fff;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ color: var(--nav-text-active-color);
+ text-shadow: var(--nav-text-active-shadow);
+}
+
+#nav-tree .selected .arrow {
+ color: var(--nav-arrow-selected-color);
+ text-shadow: none;
}
#nav-tree img {
@@ -43,7 +48,7 @@
#nav-tree .label {
margin:0px;
padding:0px;
- font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ font: 12px var(--font-family-nav);
}
#nav-tree .label a {
@@ -52,7 +57,7 @@
#nav-tree .selected a {
text-decoration:none;
- color:#fff;
+ color:var(--nav-text-active-color);
}
#nav-tree .children_ul {
@@ -67,7 +72,6 @@
#nav-tree {
padding: 0px 0px;
- background-color: #FAFAFF;
font-size:14px;
overflow:auto;
}
@@ -95,7 +99,7 @@
}
.ui-resizable-e {
- background-image:url("splitbar.png");
+ background-image:var(--nav-splitbar-image);
background-size:100%;
background-repeat:repeat-y;
background-attachment: scroll;
@@ -118,9 +122,8 @@
}
#nav-tree {
- background-image:url('nav_h.png');
background-repeat:repeat-x;
- background-color: ##FA;
+ background-color: var(--nav-background-color);
-webkit-overflow-scrolling : touch; /* iOS 5+ */
}
diff --git a/templates/html/resize.js b/templates/html/resize.js
index 7fe30d1..5c083ca 100644
--- a/templates/html/resize.js
+++ b/templates/html/resize.js
@@ -22,38 +22,45 @@
@licend The above is the entire license notice for the JavaScript code in this file
*/
+var once=1;
function initResizable()
{
var cookie_namespace = 'doxygen';
- var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight;
+ var sidenav,navtree,content,header,barWidth=6,desktop_vp=768,titleHeight;
- function readCookie(cookie)
+ function readSetting(cookie)
{
- var myCookie = cookie_namespace+"_"+cookie+"=";
- if (document.cookie) {
- var index = document.cookie.indexOf(myCookie);
- if (index != -1) {
- var valStart = index + myCookie.length;
- var valEnd = document.cookie.indexOf(";", valStart);
- if (valEnd == -1) {
- valEnd = document.cookie.length;
+ if (window.chrome) {
+ var val = localStorage.getItem(cookie_namespace+'_width');
+ if (val) return val;
+ } else {
+ var myCookie = cookie_namespace+"_"+cookie+"=";
+ if (document.cookie) {
+ var index = document.cookie.indexOf(myCookie);
+ if (index != -1) {
+ var valStart = index + myCookie.length;
+ var valEnd = document.cookie.indexOf(";", valStart);
+ if (valEnd == -1) {
+ valEnd = document.cookie.length;
+ }
+ var val = document.cookie.substring(valStart, valEnd);
+ return val;
}
- var val = document.cookie.substring(valStart, valEnd);
- return val;
}
}
- return 0;
+ return $TREEVIEW_WIDTH;
}
- function writeCookie(cookie, val, expiration)
+ function writeSetting(cookie, val)
{
- if (val==undefined) return;
- if (expiration == null) {
+ if (window.chrome) {
+ localStorage.setItem(cookie_namespace+"_width",val);
+ } else {
var date = new Date();
date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
expiration = date.toGMTString();
+ document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/";
}
- document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/";
}
function resizeWidth()
@@ -61,13 +68,19 @@ function initResizable()
var windowWidth = $(window).width() + "px";
var sidenavWidth = $(sidenav).outerWidth();
content.css({marginLeft:parseInt(sidenavWidth)+"px"});
- writeCookie('width',sidenavWidth-barWidth, null);
+ if (typeof page_layout!=='undefined' && page_layout==1) {
+ footer.css({marginLeft:parseInt(sidenavWidth)+"px"});
+ }
+ writeSetting('width',sidenavWidth-barWidth);
}
function restoreWidth(navWidth)
{
var windowWidth = $(window).width() + "px";
content.css({marginLeft:parseInt(navWidth)+barWidth+"px"});
+ if (typeof page_layout!=='undefined' && page_layout==1) {
+ footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"});
+ }
sidenav.css({width:navWidth + "px"});
}
@@ -89,19 +102,6 @@ function initResizable()
content.css({height:contentHeight + "px"});
navtree.css({height:navtreeHeight + "px"});
sidenav.css({height:sideNavHeight + "px"});
- var width=$(window).width();
- if (width!=collapsedWidth) {
- if (width<desktop_vp && collapsedWidth>=desktop_vp) {
- if (!collapsed) {
- collapseExpand();
- }
- } else if (width>desktop_vp && collapsedWidth<desktop_vp) {
- if (collapsed) {
- collapseExpand();
- }
- }
- collapsedWidth=width;
- }
if (location.hash.slice(1)) {
(document.getElementById(location.hash.slice(1))||document.body).scrollIntoView();
}
@@ -109,15 +109,17 @@ function initResizable()
function collapseExpand()
{
+ var newWidth;
if (sidenav.width()>0) {
- restoreWidth(0);
- collapsed=true;
+ newWidth=0;
}
else {
- var width = readCookie('width');
- if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); }
- collapsed=false;
+ var width = readSetting('width');
+ newWidth = (width>$TREEVIEW_WIDTH && width<$(window).width()) ? width : $TREEVIEW_WIDTH;
}
+ restoreWidth(newWidth);
+ var sidenavWidth = $(sidenav).outerWidth();
+ writeSetting('width',sidenavWidth-barWidth);
}
header = $("#top");
@@ -136,7 +138,7 @@ function initResizable()
$('#nav-sync').css({ right:'34px' });
barWidth=20;
}
- var width = readCookie('width');
+ var width = readSetting('width');
if (width) { restoreWidth(width); } else { resizeWidth(); }
resizeHeight();
var url = location.href;
@@ -144,7 +146,10 @@ function initResizable()
if (i>=0) window.location.hash=url.substr(i);
var _preventDefault = function(evt) { evt.preventDefault(); };
$("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
- $(".ui-resizable-handle").dblclick(collapseExpand);
+ if (once) {
+ $(".ui-resizable-handle").dblclick(collapseExpand);
+ once=0
+ }
$(window).on('load',resizeHeight);
}
/* @license-end */
diff --git a/templates/html/search.css b/templates/html/search.css
index 222cd0a..84b5cf5 100644
--- a/templates/html/search.css
+++ b/templates/html/search.css
@@ -1,78 +1,4 @@
-/*---------------- Search Box */
-
-#MSearchBox {
- white-space : nowrap;
- background: white;
- border-radius: 0.65em;
- box-shadow: inset 0.5px 0.5px 3px 0px #555;
- z-index: 102;
-}
-
-#MSearchBox .left {
- display: inline-block;
- vertical-align: middle;
- height: 1.4em;
-}
-
-#MSearchSelect {
- display: inline-block;
- vertical-align: middle;
- height: 19px;
- padding: 0 0 0 0.3em;
- margin: 0;
-}
-
-#MSearchField {
- display: inline-block;
- vertical-align: middle;
- width: 7.5em;
- height: 19px;
- margin: 0 0.15em;
- padding: 0;
- line-height: 1em;
- border:none;
- color: #909090;
- outline: none;
- font-family: Arial, Verdana, sans-serif;
- -webkit-border-radius: 0px;
- border-radius: 0px;
- background: none;
-}
-
-@media(hover: none) {
- /* to avoid zooming on iOS */
- #MSearchField {
- font-size: 16px;
- }
-}
-
-#MSearchBox .right {
- display: inline-block;
- vertical-align: middle;
- width: 1.4em;
- height: 1.4em;
-}
-
-#MSearchClose {
- display: none;
- font-size: inherit;
- background : none;
- border: none;
- margin: 0;
- padding: 0;
- outline: none;
-
-}
-
-#MSearchCloseImg {
- height: 1.4em;
- padding: 0.3em;
- margin: 0;
-}
-
-.MSearchBoxActive #MSearchField {
- color: #000000;
-}
+/*---------------- Search Box positioning */
#main-menu > li:last-child {
/* This <li> object is the parent of the search bar */
diff --git a/templates/html/search.js b/templates/html/search.js
index 607f4e1..e103a26 100644
--- a/templates/html/search.js
+++ b/templates/html/search.js
@@ -73,6 +73,8 @@ function getYPos(item)
return y;
}
+var searchResults = new SearchResults("searchResults");
+
/* A class handling everything associated with the search panel.
Parameters:
@@ -80,7 +82,7 @@ function getYPos(item)
storing this instance. Is needed to be able to set timeouts.
resultPath - path to use for external files
*/
-function SearchBox(name, resultsPath, label, extension)
+function SearchBox(name, resultsPath, extension)
{
if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
if (!extension || extension == "") { extension = ".html"; }
@@ -96,7 +98,6 @@ function SearchBox(name, resultsPath, label, extension)
this.hideTimeout = 0;
this.searchIndex = 0;
this.searchActive = false;
- this.searchLabel = label;
this.extension = extension;
// ----------- DOM Elements
@@ -188,7 +189,8 @@ function SearchBox(name, resultsPath, label, extension)
}
else
{
- window.frames.MSearchResults.postMessage("take_focus", "*");
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
}
}
else if (e.keyCode==27) // Escape out of the search field
@@ -324,48 +326,66 @@ function SearchBox(name, resultsPath, label, extension)
idxChar = searchValue.substr(0, 2);
}
- var resultsPage;
- var resultsPageWithSearch;
- var hasResultsPage;
+ var jsFile;
var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
if (idx!=-1)
{
var hexCode=idx.toString(16);
- resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension;
- resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
- hasResultsPage = true;
+ jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js';
}
- else // nothing available for this search term
- {
- resultsPage = this.resultsPath + '/nomatches' + this.extension;
- resultsPageWithSearch = resultsPage;
- hasResultsPage = false;
+
+ var loadJS = function(url, impl, loc){
+ var scriptTag = document.createElement('script');
+ scriptTag.src = url;
+ scriptTag.onload = impl;
+ scriptTag.onreadystatechange = impl;
+ loc.appendChild(scriptTag);
}
- window.frames.MSearchResults.location = resultsPageWithSearch;
var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+ var domSearchBox = this.DOMSearchBox();
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var domSearchClose = this.DOMSearchClose();
+ var resultsPath = this.resultsPath;
+
+ var handleResults = function() {
+ document.getElementById("Loading").style.display="none";
+ if (typeof searchData !== 'undefined') {
+ createResults(resultsPath);
+ document.getElementById("NoMatches").style.display="none";
+ }
+
+ searchResults.Search(searchValue);
- if (domPopupSearchResultsWindow.style.display!='block')
- {
- var domSearchBox = this.DOMSearchBox();
- this.DOMSearchClose().style.display = 'inline-block';
- var domPopupSearchResults = this.DOMPopupSearchResults();
- var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
- var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
- domPopupSearchResultsWindow.style.display = 'block';
- left -= domPopupSearchResults.offsetWidth;
- var maxWidth = document.body.clientWidth;
- var width = 400;
- if (left<10) left=10;
- if (width+left+8>maxWidth) width=maxWidth-left-8;
- domPopupSearchResultsWindow.style.top = top + 'px';
- domPopupSearchResultsWindow.style.left = left + 'px';
- domPopupSearchResultsWindow.style.width = width + 'px';
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ domSearchClose.style.display = 'inline-block';
+ var left = getXPos(domSearchBox) + 150;
+ var top = getYPos(domSearchBox) + 20;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ var maxWidth = document.body.clientWidth;
+ var maxHeight = document.body.clientHeight;
+ var width = 300;
+ if (left<10) left=10;
+ if (width+left+8>maxWidth) width=maxWidth-left-8;
+ var height = 400;
+ if (height+top+8>maxHeight) height=maxHeight-top-8;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResultsWindow.style.height = height + 'px';
+ }
+ }
+
+ if (jsFile) {
+ loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow());
+ } else {
+ handleResults();
}
this.lastSearchValue = searchValue;
- this.lastResultsPage = resultsPage;
}
// -------- Activation Functions
@@ -379,22 +399,15 @@ function SearchBox(name, resultsPath, label, extension)
)
{
this.DOMSearchBox().className = 'MSearchBoxActive';
-
- var searchField = this.DOMSearchField();
-
- if (searchField.value == this.searchLabel) // clear "Search" term upon entry
- {
- searchField.value = '';
- this.searchActive = true;
- }
+ this.searchActive = true;
}
else if (!isActive) // directly remove the panel
{
this.DOMSearchBox().className = 'MSearchBoxInactive';
- this.DOMSearchField().value = this.searchLabel;
this.searchActive = false;
this.lastSearchValue = ''
this.lastResultsPage = '';
+ this.DOMSearchField().value = '';
}
}
}
@@ -623,7 +636,7 @@ function SearchResults(name)
}
else // return focus to search field
{
- parent.document.getElementById("MSearchField").focus();
+ document.getElementById("MSearchField").focus();
}
}
else if (this.lastKey==40) // Down
@@ -653,8 +666,8 @@ function SearchResults(name)
}
else if (this.lastKey==27) // Escape
{
- parent.searchBox.CloseResultsWindow();
- parent.document.getElementById("MSearchField").focus();
+ searchBox.CloseResultsWindow();
+ document.getElementById("MSearchField").focus();
}
else if (this.lastKey==13) // Enter
{
@@ -696,8 +709,8 @@ function SearchResults(name)
}
else if (this.lastKey==27) // Escape
{
- parent.searchBox.CloseResultsWindow();
- parent.document.getElementById("MSearchField").focus();
+ searchBox.CloseResultsWindow();
+ document.getElementById("MSearchField").focus();
}
else if (this.lastKey==13) // Enter
{
@@ -720,9 +733,10 @@ function setClassAttr(elem,attr)
elem.setAttribute('className',attr);
}
-function createResults()
+function createResults(resultsPath)
{
var results = document.getElementById("SRResults");
+ results.innerHTML = '';
for (var e=0; e<searchData.length; e++)
{
var id = searchData[e][0];
@@ -739,8 +753,8 @@ function createResults()
srEntry.appendChild(srLink);
if (searchData[e][1].length==2) // single result
{
- srLink.setAttribute('href',searchData[e][1][1][0]);
- srLink.setAttribute('onclick','parent.searchBox.CloseResultsWindow()');
+ srLink.setAttribute('href',resultsPath+searchData[e][1][1][0]);
+ srLink.setAttribute('onclick','searchBox.CloseResultsWindow()');
if (searchData[e][1][1][1])
{
srLink.setAttribute('target','_parent');
@@ -765,8 +779,8 @@ function createResults()
srChild.setAttribute('id','Item'+e+'_c'+c);
setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
setClassAttr(srChild,'SRScope');
- srChild.setAttribute('href',searchData[e][1][c+1][0]);
- srChild.setAttribute('onclick','parent.searchBox.CloseResultsWindow()');
+ srChild.setAttribute('href',resultsPath+searchData[e][1][c+1][0]);
+ srChild.setAttribute('onclick','searchBox.CloseResultsWindow()');
if (searchData[e][1][c+1][1])
{
srChild.setAttribute('target','_parent');
diff --git a/templates/html/search_common.css b/templates/html/search_common.css
index a23a9ad..bc13cf7 100644
--- a/templates/html/search_common.css
+++ b/templates/html/search_common.css
@@ -1,11 +1,113 @@
+/*---------------- Search box styling */
+
+.SRPage * {
+ font-weight: normal;
+ line-height: normal;
+}
+
+dark-mode-toggle {
+ margin-left: 5px;
+ display: flex;
+ float: right;
+}
+
+#MSearchBox {
+ display: inline-block;
+ white-space : nowrap;
+ background: var(--search-background-color);
+ border-radius: 0.65em;
+ box-shadow: var(--search-box-shadow);
+ z-index: 102;
+}
+
+#MSearchBox .left {
+ display: inline-block;
+ vertical-align: middle;
+ height: 1.4em;
+}
+
+#MSearchSelect {
+ display: inline-block;
+ vertical-align: middle;
+ width: 20px;
+ height: 19px;
+ background-image: var(--search-magnification-select-image);
+ margin: 0 0 0 0.3em;
+ padding: 0;
+}
+
+#MSearchSelectExt {
+ display: inline-block;
+ vertical-align: middle;
+ width: 10px;
+ height: 19px;
+ background-image: var(--search-magnification-image);
+ margin: 0 0 0 0.5em;
+ padding: 0;
+}
+
+
+#MSearchField {
+ display: inline-block;
+ vertical-align: middle;
+ width: 7.5em;
+ height: 19px;
+ margin: 0 0.15em;
+ padding: 0;
+ line-height: 1em;
+ border:none;
+ color: var(--search-foreground-color);
+ outline: none;
+ font-family: var(--font-family-search);
+ -webkit-border-radius: 0px;
+ border-radius: 0px;
+ background: none;
+}
+
+@media(hover: none) {
+ /* to avoid zooming on iOS */
+ #MSearchField {
+ font-size: 16px;
+ }
+}
+
+#MSearchBox .right {
+ display: inline-block;
+ vertical-align: middle;
+ width: 1.4em;
+ height: 1.4em;
+}
+
+#MSearchClose {
+ display: none;
+ font-size: inherit;
+ background : none;
+ border: none;
+ margin: 0;
+ padding: 0;
+ outline: none;
+
+}
+
+#MSearchCloseImg {
+ padding: 0.3em;
+ margin: 0;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: var(--search-active-color);
+}
+
+
+
/*---------------- Search filter selection */
#MSearchSelectWindow {
display: none;
position: absolute;
left: 0; top: 0;
- border: 1px solid ##A0;
- background-color: ##FA;
+ border: 1px solid var(--search-filter-border-color);
+ background-color: var(--search-filter-background-color);
z-index: 10001;
padding-top: 4px;
padding-bottom: 4px;
@@ -18,7 +120,7 @@
}
.SelectItem {
- font: 8pt Arial, Verdana, sans-serif;
+ font: 8pt var(--font-family-search);
padding-left: 2px;
padding-right: 12px;
border: 0px;
@@ -26,7 +128,7 @@
span.SelectionMark {
margin-right: 4px;
- font-family: monospace;
+ font-family: var(--font-family-monospace);
outline-style: none;
text-decoration: none;
}
@@ -34,7 +136,7 @@ span.SelectionMark {
a.SelectItem {
display: block;
outline-style: none;
- color: #000000;
+ color: var(--search-filter-foreground-color);
text-decoration: none;
padding-left: 6px;
padding-right: 12px;
@@ -42,14 +144,14 @@ a.SelectItem {
a.SelectItem:focus,
a.SelectItem:active {
- color: #000000;
+ color: var(--search-filter-foreground-color);
outline-style: none;
text-decoration: none;
}
a.SelectItem:hover {
- color: #FFFFFF;
- background-color: ##50;
+ color: var(--search-filter-highlight-text-color);
+ background-color: var(--search-filter-highlight-bg-color);
outline-style: none;
text-decoration: none;
cursor: pointer;
@@ -67,9 +169,12 @@ iframe#MSearchResults {
display: none;
position: absolute;
left: 0; top: 0;
- border: 1px solid #000;
- background-color: ##F0;
+ border: 1px solid var(--search-results-border-color);
+ background-color: var(--search-results-background-color);
z-index:10000;
+ width: 300px;
+ height: 400px;
+ overflow: auto;
}
/* ----------------------------------- */
@@ -77,7 +182,6 @@ iframe#MSearchResults {
#SRIndex {
clear:both;
- padding-bottom: 15px;
}
.SREntry {
@@ -90,8 +194,9 @@ iframe#MSearchResults {
padding: 1px 5px;
}
-body.SRPage {
+div.SRPage {
margin: 5px 2px;
+ background-color: var(--search-results-background-color);
}
.SRChildren {
@@ -103,17 +208,18 @@ body.SRPage {
}
.SRSymbol {
- font-weight: bold;
- color: ##58;
- font-family: Arial, Verdana, sans-serif;
+ font-weight: bold;
+ color: var(--search-results-foreground-color);
+ font-family: var(--font-family-search);
text-decoration: none;
outline: none;
}
a.SRScope {
display: block;
- color: ##58;
- font-family: Arial, Verdana, sans-serif;
+ color: var(--search-results-foreground-color);
+ font-family: var(--font-family-search);
+ font-size: 8pt;
text-decoration: none;
outline: none;
}
@@ -125,14 +231,14 @@ a.SRScope:focus, a.SRScope:active {
span.SRScope {
padding-left: 4px;
- font-family: Arial, Verdana, sans-serif;
+ font-family: var(--font-family-search);
}
.SRPage .SRStatus {
padding: 2px 5px;
font-size: 8pt;
font-style: italic;
- font-family: Arial, Verdana, sans-serif;
+ font-family: var(--font-family-search);
}
.SRResult {
@@ -146,14 +252,10 @@ div.searchresults {
/*---------------- External search page results */
-.searchresult {
- background-color: ##F2;
-}
-
.pages b {
color: white;
padding: 5px 5px 3px 5px;
- background-image: url("../tab_a.png");
+ background-image: var(--nav-gradient-active-image-parent);
background-repeat: repeat-x;
text-shadow: 0 1px 1px #000000;
}
diff --git a/templates/html/search_fixedtabs.css b/templates/html/search_fixedtabs.css
index 0baa94a..ffff45c 100644
--- a/templates/html/search_fixedtabs.css
+++ b/templates/html/search_fixedtabs.css
@@ -1,96 +1,12 @@
-/*---------------- Search Box */
-
-#FSearchBox {
- float: left;
-}
-
-#MSearchBox {
- white-space : nowrap;
- position: absolute;
- float: none;
- display: inline;
- margin-top: 8px;
- right: 0px;
- width: 170px;
- z-index: 102;
- background-color: white;
-}
-
-#MSearchBox .left
-{
- display:block;
- position:absolute;
- left:10px;
- width:20px;
- height:19px;
- background:url('search_l.png') no-repeat;
- background-position:right;
-}
-
-#MSearchSelect {
- display:block;
- position:absolute;
- width:20px;
- height:19px;
-}
-
-.left #MSearchSelect {
- left:4px;
-}
-
-.right #MSearchSelect {
- right:5px;
-}
-
-#MSearchField {
- display:block;
- position:absolute;
- height:19px;
- background:url('search_m.png') repeat-x;
- border:none;
- width:111px;
- margin-left:20px;
- padding-left:4px;
- color: #909090;
- outline: none;
- font: 9pt Arial, Verdana, sans-serif;
-}
-
-#FSearchBox #MSearchField {
- margin-left:15px;
-}
-
-#MSearchBox .right {
- display:block;
- position:absolute;
- right:10px;
- top:0px;
- width:20px;
- height:19px;
- background:url('search_r.png') no-repeat;
- background-position:left;
-}
-
-#MSearchClose {
- display: none;
- position: absolute;
- top: 4px;
- background : none;
- border: none;
- margin: 0px 4px 0px 0px;
- padding: 0px 0px;
- outline: none;
-}
-
-.left #MSearchClose {
- left: 6px;
-}
-
-.right #MSearchClose {
- right: 2px;
-}
-
-.MSearchBoxActive #MSearchField {
- color: #000000;
+/*---------------- Search Box positioning */
+
+#navrow1 .tablist > li:last-child {
+ /* This <li> object is the parent of the search bar */
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 36px;
+ margin-right: 1em;
+ float: right;
}
diff --git a/templates/html/search_l.png b/templates/html/search_l.png
deleted file mode 100644
index fd5f7da..0000000
--- a/templates/html/search_l.png
+++ /dev/null
Binary files differ
diff --git a/templates/html/search_m.png b/templates/html/search_m.png
deleted file mode 100644
index b429a16..0000000
--- a/templates/html/search_m.png
+++ /dev/null
Binary files differ
diff --git a/templates/html/search_nomenu.css b/templates/html/search_nomenu.css
index 62d82cd..7981a36 100644
--- a/templates/html/search_nomenu.css
+++ b/templates/html/search_nomenu.css
@@ -1,96 +1,6 @@
/*---------------- Search Box */
-#FSearchBox {
- float: left;
-}
-
#MSearchBox {
- white-space : nowrap;
- float: none;
- margin-top: 0px;
- width: 161px;
- height: 24px;
- z-index: 102;
- right: 10px;
- display: inline;
- position: absolute;
-}
-
-#MSearchBox .left
-{
- display:block;
- position:absolute;
- left:10px;
- width:20px;
- height:19px;
- background:url('search_l.png') no-repeat;
- background-position:right;
-}
-
-#MSearchSelect {
- display:block;
- position:absolute;
- width:20px;
- height:19px;
-}
-
-.left #MSearchSelect {
- left:4px;
-}
-
-.right #MSearchSelect {
- right:5px;
-}
-
-#MSearchField {
- display:block;
- position:absolute;
- height:19px;
- background:url('search_m.png') repeat-x;
- border:none;
- width:111px;
- margin-left:20px;
- padding-left:4px;
- color: #909090;
- outline: none;
- font: 9pt Arial, Verdana, sans-serif;
- -webkit-border-radius: 0px;
-}
-
-#FSearchBox #MSearchField {
- margin-left:15px;
-}
-
-#MSearchBox .right {
- display:block;
- position:absolute;
- left:141px;
- width:20px;
- height:19px;
- background:url('search_r.png') no-repeat;
- background-position:left;
-}
-
-#MSearchClose {
- display: none;
position: absolute;
- top: 4px;
- background : none;
- border: none;
- margin: 0px 4px 0px 0px;
- padding: 0px 0px;
- outline: none;
+ right: 5px;
}
-
-.left #MSearchClose {
- left: 6px;
-}
-
-.right #MSearchClose {
- right: 2px;
-}
-
-.MSearchBoxActive #MSearchField {
- color: #000000;
-}
-
diff --git a/templates/html/search_nomenu_toggle.css b/templates/html/search_nomenu_toggle.css
new file mode 100644
index 0000000..9763bfc
--- /dev/null
+++ b/templates/html/search_nomenu_toggle.css
@@ -0,0 +1,17 @@
+/*---------------- Search Box */
+
+.titlearea table {
+ width: 100%;
+}
+
+dark-mode-toggle {
+ position: absolute;
+ right: 5px;
+ padding-top: 3px;
+}
+
+#MSearchBox {
+ position: absolute;
+ right: 34px;
+}
+
diff --git a/templates/html/search_r.png b/templates/html/search_r.png
deleted file mode 100644
index 1af5d21..0000000
--- a/templates/html/search_r.png
+++ /dev/null
Binary files differ
diff --git a/templates/html/search_sidebar.css b/templates/html/search_sidebar.css
index 0c91293..a448f59 100644
--- a/templates/html/search_sidebar.css
+++ b/templates/html/search_sidebar.css
@@ -1,93 +1,9 @@
-/*---------------- Search Box */
-
-#FSearchBox {
- float: left;
-}
+/*---------------- Search Box positioning */
#MSearchBox {
- white-space : nowrap;
- float: none;
- margin-top: 0px;
- width: 161px;
- height: 24px;
- z-index: 102;
-}
-
-#MSearchBox .left
-{
- display:block;
- position:absolute;
- left:10px;
- width:20px;
- height:19px;
- background:url('search_l.png') no-repeat;
- background-position:right;
-}
-
-#MSearchSelect {
- display:block;
- position:absolute;
- width:20px;
- height:19px;
-}
-
-.left #MSearchSelect {
- left:4px;
-}
-
-.right #MSearchSelect {
- right:5px;
-}
-
-#MSearchField {
- display:block;
- position:absolute;
- height:19px;
- background:url('search_m.png') repeat-x;
- border:none;
- width:111px;
- margin-left:20px;
- padding-left:4px;
- color: #909090;
- outline: none;
- font: 9pt Arial, Verdana, sans-serif;
- -webkit-border-radius: 0px;
+ margin: 5px;
}
-#FSearchBox #MSearchField {
- margin-left:15px;
+dark-mode-toggle {
+ padding-top: 8px;
}
-
-#MSearchBox .right {
- display:block;
- position:absolute;
- left:141px;
- width:20px;
- height:19px;
- background:url('search_r.png') no-repeat;
- background-position:left;
-}
-
-#MSearchClose {
- display: none;
- position: absolute;
- top: 4px;
- background : none;
- border: none;
- margin: 0px 4px 0px 0px;
- padding: 0px 0px;
- outline: none;
-}
-
-.left #MSearchClose {
- left: 6px;
-}
-
-.right #MSearchClose {
- right: 2px;
-}
-
-.MSearchBoxActive #MSearchField {
- color: #000000;
-}
-
diff --git a/templates/html/splitbard.lum b/templates/html/splitbard.lum
new file mode 100644
index 0000000..184a8f3
--- /dev/null
+++ b/templates/html/splitbard.lum
@@ -0,0 +1,1028 @@
+# vertical split bar for treeview
+# width & height
+6 1024
+# luma data
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 20 52 20 20
+20 93 74 155 33 155
+20 92 20 52 20 20
+20 93 74 155 33 155
+20 92 20 52 20 20
+20 93 74 155 33 155
+20 92 20 52 20 20
+20 93 74 155 33 155
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
diff --git a/templates/html/tab_ad.lum b/templates/html/tab_ad.lum
new file mode 100644
index 0000000..496ff7b
--- /dev/null
+++ b/templates/html/tab_ad.lum
@@ -0,0 +1,8 @@
+# active tab background luma for dark mode
+# width & height
+1 36
+# luma data
+ 0 0 9 19 23 24 25 27 27
+27 29 30 30 31 32 33 34 36
+37 38 39 40 41 41 43 44 44
+46 46 47 48 48 49 49 34 3
diff --git a/templates/html/tab_bd.lum b/templates/html/tab_bd.lum
new file mode 100644
index 0000000..983d2f6
--- /dev/null
+++ b/templates/html/tab_bd.lum
@@ -0,0 +1,8 @@
+# normal tab background luma for dark mode
+# width & height
+1 36
+# luma data
+ 33 43 50 48 45 42 40 37 36
+ 33 32 30 29 28 27 26 25 24
+ 24 12 13 14 15 16 17 18 19
+ 20 22 24 26 28 32 34 21 3
diff --git a/templates/html/tab_hd.lum b/templates/html/tab_hd.lum
new file mode 100644
index 0000000..38e67ca
--- /dev/null
+++ b/templates/html/tab_hd.lum
@@ -0,0 +1,8 @@
+# hovering tab background luma for dark mode
+# width & height
+1 36
+# luma data
+ 81 91 98 96 93 90 88 85 84
+ 81 80 78 77 76 75 74 73 72
+ 72 54 55 56 57 58 59 60 61
+ 62 64 66 68 70 74 76 63 45
diff --git a/templates/html/tab_sd.lum b/templates/html/tab_sd.lum
new file mode 100644
index 0000000..8289bd3
--- /dev/null
+++ b/templates/html/tab_sd.lum
@@ -0,0 +1,8 @@
+# tab separator for dark mode
+# width & height
+1 36
+# luma data
+ 67 66 65 63 62 61 60 58 56
+ 54 53 51 49 47 44 43 41 38
+ 36 34 32 30 28 25 23 21 20
+ 18 16 14 11 11 8 6 5 4
diff --git a/templates/html/tabs.css b/templates/html/tabs.css
index 00d1c60..71c8a47 100644
--- a/templates/html/tabs.css
+++ b/templates/html/tabs.css
@@ -1 +1 @@
-.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file
diff --git a/templates/latex/footer.tex b/templates/latex/footer.tex
index 0227221..0227221 100755..100644
--- a/templates/latex/footer.tex
+++ b/templates/latex/footer.tex
diff --git a/templates/latex/header.tex b/templates/latex/header.tex
index 696fdf0..bb256ec 100644
--- a/templates/latex/header.tex
+++ b/templates/latex/header.tex
@@ -220,6 +220,9 @@
\vspace*{7cm}
\begin{center}%
{\Large $title}\\
+%%BEGIN PROJECT_NUMBER
+ [1ex]\large $projectnumber \\
+%%END PROJECT_NUMBER
\vspace*{1cm}
{\large $generatedby Doxygen $doxygenversion}\\
%%BEGIN LATEX_TIMESTAMP
diff --git a/templates/latex/longtable_doxygen.sty b/templates/latex/longtable_doxygen.sty
index a0eb314..a0eb314 100755..100644
--- a/templates/latex/longtable_doxygen.sty
+++ b/templates/latex/longtable_doxygen.sty
diff --git a/templates/latex/tabu_doxygen.sty b/templates/latex/tabu_doxygen.sty
index 3f17d1d..3f17d1d 100755..100644
--- a/templates/latex/tabu_doxygen.sty
+++ b/templates/latex/tabu_doxygen.sty
diff --git a/templates/xml/compound.xsd b/templates/xml/compound.xsd
index 01cb3da..714364b 100644
--- a/templates/xml/compound.xsd
+++ b/templates/xml/compound.xsd
@@ -431,7 +431,6 @@
<xsd:element name="cite" type="docMarkupType" />
<xsd:element name="del" type="docMarkupType" />
<xsd:element name="ins" type="docMarkupType" />
- <xsd:element name="details" type="docMarkupType" />
<xsd:element name="summary" type="docMarkupType" />
<xsd:element name="htmlonly" type="docHtmlOnlyType" />
<xsd:element name="manonly" type="xsd:string" />
@@ -481,6 +480,7 @@
<xsd:element name="parameterlist" type="docParamListType" />
<xsd:element name="xrefsect" type="docXRefSectType" />
<xsd:element name="copydoc" type="docCopyType" />
+ <xsd:element name="details" type="docDetailsType" />
<xsd:element name="blockquote" type="docBlockQuoteType" />
<xsd:element name="parblock" type="docParBlockType" />
</xsd:choice>
@@ -713,6 +713,12 @@
<xsd:attribute name="link" type="xsd:string" />
</xsd:complexType>
+ <xsd:complexType name="docDetailsType">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
<xsd:complexType name="docBlockQuoteType">
<xsd:sequence>
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
@@ -826,6 +832,8 @@
<xsd:enumeration value="XML" />
<xsd:enumeration value="SQL" />
<xsd:enumeration value="Markdown" />
+ <xsd:enumeration value="Slice" />
+ <xsd:enumeration value="Lex" />
</xsd:restriction>
</xsd:simpleType>
diff --git a/templates/xml/doxyfile.xsd b/templates/xml/doxyfile.xsd
index fbfc2c1..fbfc2c1 100755..100644
--- a/templates/xml/doxyfile.xsd
+++ b/templates/xml/doxyfile.xsd
diff --git a/testing/028_formula.c b/testing/028_formula.c
index 2a4c5cb..eb2fff3 100644
--- a/testing/028_formula.c
+++ b/testing/028_formula.c
@@ -3,15 +3,15 @@
/** @mainpage
Here are some formulas:
--# The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is
+-# The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is
\f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$.
-# Unnumbered formula:
- \f[ |I_2|=\left| \int_{0}^T \psi(t) \left\{ u(a,t)- \int_{\gamma(t)}^a
+ \f[ |I_2|=\left| \int_{0}^T \psi(t) \left\{ u(a,t)- \int_{\gamma(t)}^a
\frac{d\theta}{k(\theta,t)} \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi \right\} dt \right| \f]
-# Formula in different environment
- \f{eqnarray*}{ g &=& \frac{Gm_2}{r^2} \\
+ \f{eqnarray*}{ g &=& \frac{Gm_2}{r^2} \\
&=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
- \mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
+ \mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
&=& 9.82066032\,\mbox{m/s}^2
\f}
*/
diff --git a/testing/076_emojis.cpp b/testing/076_emojis.cpp
index 736e410..736e410 100755..100644
--- a/testing/076_emojis.cpp
+++ b/testing/076_emojis.cpp
diff --git a/testing/087/structmymodule_1_1t1.xml b/testing/087/structmymodule_1_1t1.xml
new file mode 100644
index 0000000..feec3dc
--- /dev/null
+++ b/testing/087/structmymodule_1_1t1.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structmymodule_1_1t1" kind="type" language="Fortran" prot="public">
+ <compoundname>mymodule::t1</compoundname>
+ <sectiondef kind="public-attrib">
+ <memberdef kind="variable" id="structmymodule_1_1t1_1a40dabbcb827e13ffbb38bb7e9e5957cc" prot="public" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer mymodule::t1::publicvariable</definition>
+ <argsstring/>
+ <name>publicvariable</name>
+ <qualifiedname>mymodule::t1::publicvariable</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="087_public_type.F90" line="16" column="1" bodyfile="087_public_type.F90" bodystart="16" bodyend="16"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="087_public_type.F90" line="15" column="1" bodyfile="087_public_type.F90" bodystart="15" bodyend="17"/>
+ <listofallmembers>
+ <member refid="structmymodule_1_1t1_1a40dabbcb827e13ffbb38bb7e9e5957cc" prot="public" virt="non-virtual">
+ <scope>mymodule::t1</scope>
+ <name>publicvariable</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/087/structmymodule_1_1t2.xml b/testing/087/structmymodule_1_1t2.xml
new file mode 100644
index 0000000..5f90128
--- /dev/null
+++ b/testing/087/structmymodule_1_1t2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structmymodule_1_1t2" kind="type" language="Fortran" prot="public">
+ <compoundname>mymodule::t2</compoundname>
+ <sectiondef kind="public-attrib">
+ <memberdef kind="variable" id="structmymodule_1_1t2_1af907af6c7950c587a50eadd26987799a" prot="public" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer mymodule::t2::publicvariable</definition>
+ <argsstring/>
+ <name>publicvariable</name>
+ <qualifiedname>mymodule::t2::publicvariable</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="087_public_type.F90" line="22" column="1" bodyfile="087_public_type.F90" bodystart="22" bodyend="22"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="087_public_type.F90" line="21" column="1" bodyfile="087_public_type.F90" bodystart="21" bodyend="24"/>
+ <listofallmembers>
+ <member refid="structmymodule_1_1t2_1af907af6c7950c587a50eadd26987799a" prot="public" virt="non-virtual">
+ <scope>mymodule::t2</scope>
+ <name>publicvariable</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/087/structmymodule_1_1t3.xml b/testing/087/structmymodule_1_1t3.xml
new file mode 100644
index 0000000..d539b06
--- /dev/null
+++ b/testing/087/structmymodule_1_1t3.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structmymodule_1_1t3" kind="type" language="Fortran" prot="public">
+ <compoundname>mymodule::t3</compoundname>
+ <sectiondef kind="private-attrib">
+ <memberdef kind="variable" id="structmymodule_1_1t3_1a8c70e7ad082657d4ddd9967c11ea5c68" prot="private" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer mymodule::t3::privatevariable</definition>
+ <argsstring/>
+ <name>privatevariable</name>
+ <qualifiedname>mymodule::t3::privatevariable</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="087_public_type.F90" line="28" column="1" bodyfile="087_public_type.F90" bodystart="28" bodyend="28"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="087_public_type.F90" line="26" column="1" bodyfile="087_public_type.F90" bodystart="26" bodyend="29"/>
+ <listofallmembers>
+ <member refid="structmymodule_1_1t3_1a8c70e7ad082657d4ddd9967c11ea5c68" prot="private" virt="non-virtual">
+ <scope>mymodule::t3</scope>
+ <name>privatevariable</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/087/structmymodule_1_1t4.xml b/testing/087/structmymodule_1_1t4.xml
new file mode 100644
index 0000000..4b6950a
--- /dev/null
+++ b/testing/087/structmymodule_1_1t4.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structmymodule_1_1t4" kind="type" language="Fortran" prot="private">
+ <compoundname>mymodule::t4</compoundname>
+ <sectiondef kind="public-attrib">
+ <memberdef kind="variable" id="structmymodule_1_1t4_1aca212dfbb52db21b5c166b416b3019ac" prot="public" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer mymodule::t4::publicvariable</definition>
+ <argsstring/>
+ <name>publicvariable</name>
+ <qualifiedname>mymodule::t4::publicvariable</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="087_public_type.F90" line="32" column="1" bodyfile="087_public_type.F90" bodystart="32" bodyend="32"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="087_public_type.F90" line="31" column="1" bodyfile="087_public_type.F90" bodystart="31" bodyend="33"/>
+ <listofallmembers>
+ <member refid="structmymodule_1_1t4_1aca212dfbb52db21b5c166b416b3019ac" prot="public" virt="non-virtual">
+ <scope>mymodule::t4</scope>
+ <name>publicvariable</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/087_public_type.F90 b/testing/087_public_type.F90
new file mode 100644
index 0000000..f013335
--- /dev/null
+++ b/testing/087_public_type.F90
@@ -0,0 +1,35 @@
+!// objective: test visibility of types in modules
+!// check: structmymodule_1_1t1.xml
+!// check: structmymodule_1_1t2.xml
+!// check: structmymodule_1_1t3.xml
+!// check: structmymodule_1_1t4.xml
+!// config: OPTIMIZE_FOR_FORTRAN=YES
+!// config: WARN_IF_UNDOCUMENTED=NO
+
+module myModule
+ implicit none
+ private
+
+ public :: T3
+
+ type T1
+ integer :: publicVariable
+ end type T1
+
+ public :: T1
+
+ type, public :: T2
+ integer :: publicVariable
+ contains
+ end type
+
+ type T3
+ private
+ integer :: privateVariable
+ end type
+
+ type, private :: T4
+ integer :: publicVariable
+ end type
+
+end module myModule
diff --git a/testing/088/namespacem1.xml b/testing/088/namespacem1.xml
new file mode 100644
index 0000000..1ec89da
--- /dev/null
+++ b/testing/088/namespacem1.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem1" kind="namespace" language="Fortran">
+ <compoundname>m1</compoundname>
+ <sectiondef kind="var">
+ <memberdef kind="variable" id="088__module__var_8f90_1a55e8d6a2f6109fb1922ad6632985d31e" prot="public" static="no" mutable="no">
+ <type>integer, public</type>
+ <definition>integer, public m1::v1</definition>
+ <argsstring/>
+ <name>v1</name>
+ <qualifiedname>m1::v1</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="12" column="1" bodyfile="088_module_var.f90" bodystart="12" bodyend="12"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1a7b21adea511c81513d1be2f1f3b6b9eb" prot="public" static="no" mutable="no">
+ <type>integer, public</type>
+ <definition>integer, public m1::v2</definition>
+ <argsstring/>
+ <name>v2</name>
+ <qualifiedname>m1::v2</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="15" column="1" bodyfile="088_module_var.f90" bodystart="15" bodyend="15"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1a1ef6299cbb534bef991fc651df8274ec" prot="public" static="no" mutable="no">
+ <type>integer, public</type>
+ <definition>integer, public m1::v3</definition>
+ <argsstring/>
+ <name>v3</name>
+ <qualifiedname>m1::v3</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="16" column="1" bodyfile="088_module_var.f90" bodystart="16" bodyend="16"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="088_module_var.f90" line="6" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/088/namespacem2.xml b/testing/088/namespacem2.xml
new file mode 100644
index 0000000..ab057a9
--- /dev/null
+++ b/testing/088/namespacem2.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem2" kind="namespace" language="Fortran">
+ <compoundname>m2</compoundname>
+ <sectiondef kind="var">
+ <memberdef kind="variable" id="088__module__var_8f90_1aa9535f64b6a936c2e53e2f4ddd2f7043" prot="private" static="no" mutable="no">
+ <type>integer, private</type>
+ <definition>integer, private m2::v1</definition>
+ <argsstring/>
+ <name>v1</name>
+ <qualifiedname>m2::v1</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="24" column="1" bodyfile="088_module_var.f90" bodystart="24" bodyend="24"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1aab4499a13318c88c757d70bbfc8278e5" prot="public" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer m2::v2</definition>
+ <argsstring/>
+ <name>v2</name>
+ <qualifiedname>m2::v2</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="26" column="1" bodyfile="088_module_var.f90" bodystart="26" bodyend="26"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1a14cb0c2e7f4f108ca3a06b79f6635c5c" prot="private" static="no" mutable="no">
+ <type>integer, private</type>
+ <definition>integer, private m2::v3</definition>
+ <argsstring/>
+ <name>v3</name>
+ <qualifiedname>m2::v3</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="28" column="1" bodyfile="088_module_var.f90" bodystart="28" bodyend="28"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1a7e7474396674938ae25b1a2300109b1c" prot="public" static="no" mutable="no">
+ <type>integer, public</type>
+ <definition>integer, public m2::v4</definition>
+ <argsstring/>
+ <name>v4</name>
+ <qualifiedname>m2::v4</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="30" column="1" bodyfile="088_module_var.f90" bodystart="30" bodyend="30"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="088_module_var.f90" line="20" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/088_module_var.f90 b/testing/088_module_var.f90
new file mode 100644
index 0000000..b6f93f1
--- /dev/null
+++ b/testing/088_module_var.f90
@@ -0,0 +1,33 @@
+!// objective: test visibility of variables in modules
+!// check: namespacem1.xml
+!// check: namespacem2.xml
+!// config: OPTIMIZE_FOR_FORTRAN=YES
+
+module M1
+ implicit none
+ private
+
+ public :: V3
+
+ integer :: V1
+ public :: V1
+
+ integer, public :: V2
+ integer :: V3
+
+end module M1
+
+module M2
+ implicit none
+
+ private :: V1
+ integer :: V1
+
+ integer :: V2
+
+ integer, private :: V3
+
+ integer :: V4
+ public :: V4
+
+end module M2
diff --git a/testing/089/namespacem1.xml b/testing/089/namespacem1.xml
new file mode 100644
index 0000000..1620a4f
--- /dev/null
+++ b/testing/089/namespacem1.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem1" kind="namespace" language="Fortran">
+ <compoundname>m1</compoundname>
+ <sectiondef kind="func">
+ <memberdef kind="function" id="089__module__proc_8f90_1ad35985ac837c9f6b7d8eda2d753144a1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, public</type>
+ <definition>subroutine, public m1::f1</definition>
+ <argsstring/>
+ <name>f1</name>
+ <qualifiedname>m1::f1</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="15" column="1" bodyfile="089_module_proc.f90" bodystart="16" bodyend="15"/>
+ </memberdef>
+ <memberdef kind="function" id="089__module__proc_8f90_1a8b970b4cce0abecdba010cc682e9894e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, public</type>
+ <definition>subroutine, public m1::f2</definition>
+ <argsstring/>
+ <name>f2</name>
+ <qualifiedname>m1::f2</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="18" column="1" bodyfile="089_module_proc.f90" bodystart="19" bodyend="18"/>
+ </memberdef>
+ <memberdef kind="function" id="089__module__proc_8f90_1abee3d0fa94615ec38bca901754207860" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, public</type>
+ <definition>subroutine, public m1::f3</definition>
+ <argsstring/>
+ <name>f3</name>
+ <qualifiedname>m1::f3</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="21" column="1" bodyfile="089_module_proc.f90" bodystart="22" bodyend="21"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="089_module_proc.f90" line="6" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/089/namespacem2.xml b/testing/089/namespacem2.xml
new file mode 100644
index 0000000..a850e70
--- /dev/null
+++ b/testing/089/namespacem2.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem2" kind="namespace" language="Fortran">
+ <compoundname>m2</compoundname>
+ <sectiondef kind="func">
+ <memberdef kind="function" id="089__module__proc_8f90_1aa7111755564ab9d350b9ad05c9272ddb" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, private</type>
+ <definition>subroutine, private m2::f1</definition>
+ <argsstring/>
+ <name>f1</name>
+ <qualifiedname>m2::f1</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="35" column="1" bodyfile="089_module_proc.f90" bodystart="36" bodyend="35"/>
+ </memberdef>
+ <memberdef kind="function" id="089__module__proc_8f90_1a43afff306423f5c42342d1e8a484ffa8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>integer function, public</type>
+ <definition>integer function, public m2::f2</definition>
+ <argsstring/>
+ <name>f2</name>
+ <qualifiedname>m2::f2</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="38" column="1" bodyfile="089_module_proc.f90" bodystart="39" bodyend="39"/>
+ </memberdef>
+ <memberdef kind="function" id="089__module__proc_8f90_1a924eff4c3fc96894fa67cc3f86fd2690" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, public</type>
+ <definition>subroutine, public m2::f3</definition>
+ <argsstring/>
+ <name>f3</name>
+ <qualifiedname>m2::f3</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="42" column="1" bodyfile="089_module_proc.f90" bodystart="43" bodyend="42"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="089_module_proc.f90" line="26" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/089_module_proc.f90 b/testing/089_module_proc.f90
new file mode 100644
index 0000000..9a07c76
--- /dev/null
+++ b/testing/089_module_proc.f90
@@ -0,0 +1,45 @@
+!// objective: test visibility of variables in modules
+!// check: namespacem1.xml
+!// check: namespacem2.xml
+!// config: OPTIMIZE_FOR_FORTRAN=YES
+
+module M1
+ implicit none
+ private
+
+ public :: f1
+ public :: f2, f3
+
+contains
+
+ subroutine f1
+ end subroutine
+
+ subroutine f2
+ end subroutine
+
+ subroutine f3
+ end subroutine
+
+end module M1
+
+module M2
+ implicit none
+
+ private :: f1
+ public :: f2
+ public :: f3
+
+contains
+
+ subroutine f1
+ end subroutine
+
+ function f2
+ integer :: f2
+ end subroutine
+
+ subroutine f3
+ end subroutine
+
+end module M2
diff --git a/testing/095/namespacem1.xml b/testing/095/namespacem1.xml
new file mode 100644
index 0000000..c560cd9
--- /dev/null
+++ b/testing/095/namespacem1.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem1" kind="namespace" language="Fortran">
+ <compoundname>m1</compoundname>
+ <innerclass refid="structm1_1_1t1" prot="public">m1::t1</innerclass>
+ <innerclass refid="structm1_1_1t2" prot="public">m1::t2</innerclass>
+ <innerclass refid="structm1_1_1t3" prot="public">m1::t3</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="095_inheritance.f03" line="12" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/095/namespacem2.xml b/testing/095/namespacem2.xml
new file mode 100644
index 0000000..31c670d
--- /dev/null
+++ b/testing/095/namespacem2.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem2" kind="namespace" language="Fortran">
+ <compoundname>m2</compoundname>
+ <innerclass refid="structm2_1_1t3" prot="public">m2::t3</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="095_inheritance.f03" line="28" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/095/namespacem3.xml b/testing/095/namespacem3.xml
new file mode 100644
index 0000000..d30c881
--- /dev/null
+++ b/testing/095/namespacem3.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem3" kind="namespace" language="Fortran">
+ <compoundname>m3</compoundname>
+ <innerclass refid="structm3_1_1t4" prot="public">m3::t4</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="095_inheritance.f03" line="37" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/095/structm1_1_1t1.xml b/testing/095/structm1_1_1t1.xml
new file mode 100644
index 0000000..b250b39
--- /dev/null
+++ b/testing/095/structm1_1_1t1.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t1" kind="type" language="Fortran" prot="public">
+ <compoundname>m1::t1</compoundname>
+ <derivedcompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</derivedcompoundref>
+ <derivedcompoundref refid="structm3_1_1t4" prot="public" virt="non-virtual">m3::t4</derivedcompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="1">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="3">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="4">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="5">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <location file="095_inheritance.f03" line="16" column="1" bodyfile="095_inheritance.f03" bodystart="16" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/095/structm1_1_1t2.xml b/testing/095/structm1_1_1t2.xml
new file mode 100644
index 0000000..39b84f9
--- /dev/null
+++ b/testing/095/structm1_1_1t2.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t2" kind="type" language="Fortran" prot="public">
+ <compoundname>m1::t2</compoundname>
+ <basecompoundref refid="structm1_1_1t1" prot="public" virt="non-virtual">m1::t1</basecompoundref>
+ <derivedcompoundref refid="structm1_1_1t3" prot="public" virt="non-virtual">m1::t3</derivedcompoundref>
+ <derivedcompoundref refid="structm2_1_1t3" prot="public" virt="non-virtual">m2::t3</derivedcompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="3">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="4">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="095_inheritance.f03" line="19" column="1" bodyfile="095_inheritance.f03" bodystart="19" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/095/structm1_1_1t3.xml b/testing/095/structm1_1_1t3.xml
new file mode 100644
index 0000000..e32657d
--- /dev/null
+++ b/testing/095/structm1_1_1t3.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t3" kind="type" language="Fortran" prot="public">
+ <compoundname>m1::t3</compoundname>
+ <basecompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="095_inheritance.f03" line="23" column="1" bodyfile="095_inheritance.f03" bodystart="23" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/095/structm2_1_1t3.xml b/testing/095/structm2_1_1t3.xml
new file mode 100644
index 0000000..42c6be2
--- /dev/null
+++ b/testing/095/structm2_1_1t3.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm2_1_1t3" kind="type" language="Fortran" prot="public">
+ <compoundname>m2::t3</compoundname>
+ <basecompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="095_inheritance.f03" line="32" column="1" bodyfile="095_inheritance.f03" bodystart="32" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/095/structm3_1_1t4.xml b/testing/095/structm3_1_1t4.xml
new file mode 100644
index 0000000..5442314
--- /dev/null
+++ b/testing/095/structm3_1_1t4.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm3_1_1t4" kind="type" language="Fortran" prot="public">
+ <compoundname>m3::t4</compoundname>
+ <basecompoundref refid="structm1_1_1t1" prot="public" virt="non-virtual">m1::t1</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="095_inheritance.f03" line="41" column="1" bodyfile="095_inheritance.f03" bodystart="41" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/095_inheritance.f03 b/testing/095_inheritance.f03
new file mode 100644
index 0000000..ecfca0b
--- /dev/null
+++ b/testing/095_inheritance.f03
@@ -0,0 +1,44 @@
+!// objective: test inheritance in Fortran
+!// check: structm1_1_1t1.xml
+!// check: structm1_1_1t2.xml
+!// check: structm1_1_1t3.xml
+!// check: structm2_1_1t3.xml
+!// check: structm3_1_1t4.xml
+!// check: namespacem1.xml
+!// check: namespacem2.xml
+!// check: namespacem3.xml
+!// config: OPTIMIZE_FOR_FORTRAN=YES
+
+module M1
+ implicit none
+ public
+
+ type T1
+ end type T1
+
+ type, extends(T1) :: T2
+ contains
+ end type
+
+ type, extends(T2) :: T3
+ end type
+
+end module M1
+
+module M2
+ use M1
+ implicit none
+
+ type, extends(T2) :: T3
+ end type
+
+end module M2
+
+module M3
+ use M2, only: T1
+ implicit none
+
+ type, extends(T1) :: T4
+ end type
+
+end module M3
diff --git a/testing/096/namespacem1.xml b/testing/096/namespacem1.xml
new file mode 100644
index 0000000..98f8983
--- /dev/null
+++ b/testing/096/namespacem1.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem1" kind="namespace" language="C++">
+ <compoundname>m1</compoundname>
+ <innerclass refid="structm1_1_1t1" prot="public">m1::t1</innerclass>
+ <innerclass refid="structm1_1_1t2" prot="public">m1::t2</innerclass>
+ <innerclass refid="structm1_1_1t3" prot="public">m1::t3</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="096_namespace_inheritance.cpp" line="11" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/096/namespacem2.xml b/testing/096/namespacem2.xml
new file mode 100644
index 0000000..4513a4c
--- /dev/null
+++ b/testing/096/namespacem2.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem2" kind="namespace" language="C++">
+ <compoundname>m2</compoundname>
+ <innerclass refid="structm2_1_1t3" prot="public">m2::t3</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="096_namespace_inheritance.cpp" line="26" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/096/namespacem3.xml b/testing/096/namespacem3.xml
new file mode 100644
index 0000000..5d4bf1a
--- /dev/null
+++ b/testing/096/namespacem3.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem3" kind="namespace" language="C++">
+ <compoundname>m3</compoundname>
+ <innerclass refid="structm3_1_1t4" prot="public">m3::t4</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="096_namespace_inheritance.cpp" line="35" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/096/structm1_1_1t1.xml b/testing/096/structm1_1_1t1.xml
new file mode 100644
index 0000000..a73bdad
--- /dev/null
+++ b/testing/096/structm1_1_1t1.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t1" kind="struct" language="C++" prot="public">
+ <compoundname>m1::t1</compoundname>
+ <derivedcompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</derivedcompoundref>
+ <derivedcompoundref refid="structm3_1_1t4" prot="public" virt="non-virtual">m3::t4</derivedcompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="1">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="3">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="4">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="5">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <location file="096_namespace_inheritance.cpp" line="13" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="14" bodyend="15"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/096/structm1_1_1t2.xml b/testing/096/structm1_1_1t2.xml
new file mode 100644
index 0000000..3319d2c
--- /dev/null
+++ b/testing/096/structm1_1_1t2.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t2" kind="struct" language="C++" prot="public">
+ <compoundname>m1::t2</compoundname>
+ <basecompoundref refid="structm1_1_1t1" prot="public" virt="non-virtual">m1::t1</basecompoundref>
+ <derivedcompoundref refid="structm1_1_1t3" prot="public" virt="non-virtual">m1::t3</derivedcompoundref>
+ <derivedcompoundref refid="structm2_1_1t3" prot="public" virt="non-virtual">m2::t3</derivedcompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="3">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="4">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="096_namespace_inheritance.cpp" line="17" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="18" bodyend="19"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/096/structm1_1_1t3.xml b/testing/096/structm1_1_1t3.xml
new file mode 100644
index 0000000..b19e3ff
--- /dev/null
+++ b/testing/096/structm1_1_1t3.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t3" kind="struct" language="C++" prot="public">
+ <compoundname>m1::t3</compoundname>
+ <basecompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="096_namespace_inheritance.cpp" line="21" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="22" bodyend="23"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/096/structm2_1_1t3.xml b/testing/096/structm2_1_1t3.xml
new file mode 100644
index 0000000..54c3f82
--- /dev/null
+++ b/testing/096/structm2_1_1t3.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm2_1_1t3" kind="struct" language="C++" prot="public">
+ <compoundname>m2::t3</compoundname>
+ <basecompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="096_namespace_inheritance.cpp" line="30" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="31" bodyend="32"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/096/structm3_1_1t4.xml b/testing/096/structm3_1_1t4.xml
new file mode 100644
index 0000000..6586a8c
--- /dev/null
+++ b/testing/096/structm3_1_1t4.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm3_1_1t4" kind="struct" language="C++" prot="public">
+ <compoundname>m3::t4</compoundname>
+ <basecompoundref refid="structm1_1_1t1" prot="public" virt="non-virtual">m1::t1</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="096_namespace_inheritance.cpp" line="39" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="40" bodyend="41"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/096_namespace_inheritance.cpp b/testing/096_namespace_inheritance.cpp
new file mode 100644
index 0000000..d1be8ed
--- /dev/null
+++ b/testing/096_namespace_inheritance.cpp
@@ -0,0 +1,42 @@
+// objective: test inheritance over namespace works the same in C++ and Fortran (see test 095)
+// check: structm1_1_1t1.xml
+// check: structm1_1_1t2.xml
+// check: structm1_1_1t3.xml
+// check: structm2_1_1t3.xml
+// check: structm3_1_1t4.xml
+// check: namespacem1.xml
+// check: namespacem2.xml
+// check: namespacem3.xml
+
+namespace m1
+{
+ struct t1
+ {
+ };
+
+ struct t2: public t1
+ {
+ };
+
+ struct t3: public t2
+ {
+ };
+}
+
+namespace m2
+{
+ using namespace m1;
+
+ struct t3: public t2
+ {
+ };
+}
+
+namespace m3
+{
+ using m2::t1;
+
+ struct t4: public t1
+ {
+ };
+}
diff --git a/testing/dtd/xhtml-lat1.ent b/testing/dtd/xhtml-lat1.ent
index ffee223..ffee223 100755..100644
--- a/testing/dtd/xhtml-lat1.ent
+++ b/testing/dtd/xhtml-lat1.ent
diff --git a/testing/dtd/xhtml-special.ent b/testing/dtd/xhtml-special.ent
index ca358b2..ca358b2 100755..100644
--- a/testing/dtd/xhtml-special.ent
+++ b/testing/dtd/xhtml-special.ent
diff --git a/testing/dtd/xhtml-symbol.ent b/testing/dtd/xhtml-symbol.ent
index 5f59f0e..5f59f0e 100755..100644
--- a/testing/dtd/xhtml-symbol.ent
+++ b/testing/dtd/xhtml-symbol.ent
diff --git a/testing/dtd/xhtml1-strict.dtd b/testing/dtd/xhtml1-strict.dtd
index 2927b9e..2927b9e 100755..100644
--- a/testing/dtd/xhtml1-strict.dtd
+++ b/testing/dtd/xhtml1-strict.dtd
diff --git a/testing/dtd/xhtml1-transitional.dtd b/testing/dtd/xhtml1-transitional.dtd
index 764c41a..cdfef9d 100755..100644
--- a/testing/dtd/xhtml1-transitional.dtd
+++ b/testing/dtd/xhtml1-transitional.dtd
@@ -30,6 +30,11 @@
<!ATTLIST script
added
async (async) #IMPLIED
+
+ Adjustemens:
+ - added picture tag
+ - added source tag
+ - adjusted possible children of a number of elements so they support the picture tag
-->
<!--================ Character mnemonic entities =========================-->
@@ -206,7 +211,7 @@
<!--=================== Text Elements ====================================-->
<!ENTITY % special.extra
- "object | applet | img | map | iframe">
+ "object | applet | img | map | iframe | picture">
<!ENTITY % special.basic
"br | span | bdo">
@@ -250,7 +255,7 @@
"p | %heading; | div | %lists; | %blocktext; | isindex |fieldset | table">
<!-- %Flow; mixes block and inline and is used for list items etc. -->
-<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc; | picture)*">
<!--================== Content models for exclusions =====================-->
@@ -860,6 +865,16 @@
vspace %Pixels; #IMPLIED
>
+<!ELEMENT source EMPTY>
+<!ATTLIST source
+ %attrs;
+ media %MediaDesc; #REQUIRED
+ srcset %URI; #REQUIRED
+ >
+
+<!ELEMENT picture (source+, img)>
+<!ATTLIST picture %attrs;>
+
<!-- usemap points to a map element which may be in this document
or an external document, although the latter is not widely supported -->
diff --git a/testing/obsolete b/testing/obsolete
new file mode 100644
index 0000000..b1db8a3
--- /dev/null
+++ b/testing/obsolete
@@ -0,0 +1,11 @@
+# Manual test for function Config::updateObsolete
+#
+# Usage:
+#
+# cat obsolete | ../build/bin/doxygen -s -u - | grep -e 'DOT_COMMON_ATTR.*F1.*123' -e 'DOT_EDGE_ATTR.*F1.*123'
+#
+# Check output manually. Expected two lines in stderr and two lines in stdout.
+
+# obsoleted attributes:
+DOT_FONTNAME=F1
+DOT_FONTSIZE=123
diff --git a/testing/runtests.py b/testing/runtests.py
index 610c521..a0f4cf8 100755
--- a/testing/runtests.py
+++ b/testing/runtests.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
from __future__ import print_function
import argparse, glob, itertools, re, shutil, os, sys
@@ -12,591 +12,591 @@ pageref_reg = re.compile(r'.*PAGEREF\s+([A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]
def xopen(fname, mode='r', encoding='utf-8'):
- '''Unified file opening for Python 2 an Python 3.
+ '''Unified file opening for Python 2 an Python 3.
- Python 2 does not have the encoding argument. Python 3 has one.
- '''
+ Python 2 does not have the encoding argument. Python 3 has one.
+ '''
- if sys.version_info[0] == 2:
- return open(fname, mode=mode) # Python 2 without encoding
- else:
- return open(fname, mode=mode, encoding=encoding) # Python 3 with encoding
+ if sys.version_info[0] == 2:
+ return open(fname, mode=mode) # Python 2 without encoding
+ else:
+ return open(fname, mode=mode, encoding=encoding) # Python 3 with encoding
def xpopen(cmd, cmd1="",encoding='utf-8-sig', getStderr=False):
- '''Unified file pipe opening for Python 2 an Python 3.
+ '''Unified file pipe opening for Python 2 an Python 3.
- Python 2 does not have the encoding argument. Python 3 has one. and
- '''
+ Python 2 does not have the encoding argument. Python 3 has one. and
+ '''
- if sys.version_info[0] == 2:
- return os.popen(cmd).read() # Python 2 without encoding
- else:
- if (getStderr):
- proc = subprocess.Popen(shlex.split(cmd1),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
- return proc.stderr.read()
- else:
- proc = subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
- return proc.stdout.read()
+ if sys.version_info[0] == 2:
+ return os.popen(cmd).read() # Python 2 without encoding
+ else:
+ if (getStderr):
+ proc = subprocess.Popen(shlex.split(cmd1),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
+ return proc.stderr.read()
+ else:
+ proc = subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
+ return proc.stdout.read()
def clean_header(errmsg):
- # messages (due to the usage of more) have a contents like:
- # ::::::::::::
- # <file name>
- # ::::::::::::
- # we want to skip these
- msg = errmsg.split('\n')
- rtnmsg = ""
- cnt = -1
- for o in msg:
- if (o):
- if (cnt == -1):
- if o.startswith(":::::::"):
- cnt = 3
- if (cnt > 0):
- cnt-=1
- else:
- rtnmsg+=o
- return rtnmsg
+ # messages (due to the usage of more) have a contents like:
+ # ::::::::::::
+ # <file name>
+ # ::::::::::::
+ # we want to skip these
+ msg = errmsg.split('\n')
+ rtnmsg = ""
+ cnt = -1
+ for o in msg:
+ if (o):
+ if (cnt == -1):
+ if o.startswith(":::::::"):
+ cnt = 3
+ if (cnt > 0):
+ cnt-=1
+ else:
+ rtnmsg+=o
+ return rtnmsg
class Tester:
- def __init__(self,args,test):
- self.args = args
- self.test = test
- self.update = args.updateref
- self.config = self.get_config()
- self.test_name = '[%s]: %s' % (self.test,self.config['objective'][0])
- self.test_id = self.test.split('_')[0]
- if self.update:
- self.test_out = self.args.inputdir+'/'+self.test_id
- else:
- self.test_out = self.args.outputdir+'/test_output_'+self.test_id
- self.prepare_test()
-
- def compare_ok(self,got_file,expected_file,name):
- if not os.path.isfile(got_file):
- return (True,'%s absent' % got_file)
- elif not os.path.isfile(expected_file):
- return (True,'%s absent' % expected_file)
- else:
- diff = xpopen('diff -b -w -u %s %s' % (got_file,expected_file))
- if diff and not diff.startswith("No differences"):
- return (True,'Difference between generated output and reference:\n%s' % diff)
- return (False,'')
-
- def cleanup_xmllint(self,errmsg):
- msg = errmsg.split('\n')
- rtnmsg = ""
- for o in msg:
- if (o):
- if (o.startswith("I/O error : Attempt")):
- pass
- else:
- if (rtnmsg):
- rtnmsg += '\n'
- rtnmsg += o
- return rtnmsg
-
- def cleanup_xmllint_docbook(self,errmsg):
- # For future work, first get everything valid XML
- msg = self.cleanup_xmllint(errmsg).split('\n')
- rtnmsg = ""
- cnt = 0
- for o in msg:
- if (o):
- if (cnt):
- cnt -= 1
- pass
- elif (o.endswith("does not validate")):
- pass
- elif (o.find("no DTD found!")!=-1):
- pass
- elif (o.find("is not an NCName")!=-1):
- cnt = 2
- else:
- if (rtnmsg):
- rtnmsg += '\n'
- rtnmsg += o
- return rtnmsg
-
- def get_config(self):
- config = {}
- with xopen(self.args.inputdir+'/'+self.test,'r') as f:
- for line in f.readlines():
- m = config_reg.match(line)
- if m:
- key = m.group('name')
- value = m.group('value')
- if (key=='config'):
- value = value.replace('$INPUTDIR',self.args.inputdir)
- # print('key=%s value=%s' % (key,value))
- config.setdefault(key, []).append(value)
- return config
-
- def prepare_test(self):
- # prepare test environment
- shutil.rmtree(self.test_out,ignore_errors=True)
- os.mkdir(self.test_out)
- shutil.copy(self.args.inputdir+'/Doxyfile',self.test_out)
- with xopen(self.test_out+'/Doxyfile','a') as f:
- print('INPUT=%s/%s' % (self.args.inputdir,self.test), file=f)
- print('STRIP_FROM_PATH=%s' % self.args.inputdir, file=f)
- print('EXAMPLE_PATH=%s' % self.args.inputdir, file=f)
- print('WARN_LOGFILE=%s/warnings.log' % self.test_out, file=f)
- if 'config' in self.config:
- for option in self.config['config']:
- print(option, file=f)
- if (self.args.xml or self.args.xmlxsd):
- print('GENERATE_XML=YES', file=f)
- print('XML_OUTPUT=%s/out' % self.test_out, file=f)
- else:
- print('GENERATE_XML=NO', file=f)
- if (self.args.rtf):
- print('GENERATE_RTF=YES', file=f)
- print('RTF_HYPERLINKS=YES', file=f)
- print('RTF_OUTPUT=%s/rtf' % self.test_out, file=f)
- else:
- print('GENERATE_RTF=NO', file=f)
- if (self.args.docbook):
- print('GENERATE_DOCBOOK=YES', file=f)
- print('DOCBOOK_OUTPUT=%s/docbook' % self.test_out, file=f)
- else:
- print('GENERATE_DOCBOOK=NO', file=f)
- if (self.args.qhp):
- print('GENERATE_QHP=YES', file=f)
- if (self.args.xhtml or self.args.qhp):
- print('GENERATE_HTML=YES', file=f)
- # HTML_OUTPUT can also have been set locally
- print('HTML_OUTPUT=%s/html' % self.test_out, file=f)
- print('HTML_FILE_EXTENSION=.xhtml', file=f)
- if (self.args.pdf):
- print('GENERATE_LATEX=YES', file=f)
- print('LATEX_BATCHMODE=YES', file=f)
- print('LATEX_OUTPUT=%s/latex' % self.test_out, file=f)
- if self.args.subdirs:
- print('CREATE_SUBDIRS=YES', file=f)
- if (self.args.clang):
- print('CLANG_ASSISTED_PARSING=YES', file=f)
- if (self.args.cfgs):
- for cfg in self.args.cfgs:
- if cfg[0].find('=') == -1:
- print("Not a doxygen configuration item, missing '=' sign: '%s'."%cfg)
- sys.exit(1)
- print(cfg[0], file=f)
-
- if 'check' not in self.config or not self.config['check']:
- print('Test doesn\'t specify any files to check')
- sys.exit(1)
-
- # run doxygen
- if (sys.platform == 'win32'):
- redir=' > nul: 2>&1'
- else:
- redir=' 2> /dev/null > /dev/null'
-
- if (self.args.noredir):
- redir=''
-
- if os.system('%s %s/Doxyfile %s' % (self.args.doxygen,self.test_out,redir))!=0:
- print('Error: failed to run %s on %s/Doxyfile' % (self.args.doxygen,self.test_out))
- sys.exit(1)
-
-
- def check_link_rtf_file(self,fil):
- bkmk_res = []
- hyper_res = []
- pageref_res = []
- with xopen(fil,'r') as f:
- for line in f.readlines():
- if ("bkmkstart" in line) or ("HYPERLINK" in line) or ("PAGEREF" in line):
- msg = line.split('}')
- for m in msg:
- if bkmk_reg.match(m):
- m1 = re.sub(bkmk_reg, '\\1', m)
- bkmk_res.append(m1)
- elif hyper_reg.match(m):
- m1 = re.sub(hyper_reg, '\\1', m)
- hyper_res.append(m1)
- elif pageref_reg.match(m):
- m1 = re.sub(pageref_reg, '\\1', m)
- pageref_res.append(m1)
- # Has been commented out as in the test 57, inline namespace, there is still a small problem.
- #if sorted(bkmk_res) != sorted(set(bkmk_res)):
- # return (False, "RTF: one (or more) bookmark(s) has(have) been defined multiple times")
- hyper_res = sorted(set(hyper_res))
- for h in hyper_res:
- if h not in bkmk_res:
- #print(bkmk_res)
- #print(hyper_res)
- return (False, "RTF: Not all used hyperlinks have been defined")
- pageref_res = sorted(set(pageref_res))
- for p in pageref_res:
- if p not in bkmk_res:
- #print(bkmk_res)
- #print(pageref_res)
- return (False, "RTF: Not all used page reference bookmarks have been defined")
- return (True,"")
-
-
- # update the reference data for this test
- def update_test(self,testmgr):
- print('Updating reference for %s' % self.test_name)
-
- if 'check' in self.config:
- for check in self.config['check']:
- check_file='%s/out/%s' % (self.test_out,check)
- # check if the file we need to check is actually generated
- if not os.path.isfile(check_file):
- print('Non-existing file %s after \'check:\' statement' % check_file)
- return False
- # convert output to canonical form
- data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
- if data:
- # strip version
- data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
- else:
- print('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out))
- return False
- out_file='%s/%s' % (self.test_out,check)
- with xopen(out_file,'w') as f:
- print(data,file=f)
- shutil.rmtree(self.test_out+'/out',ignore_errors=True)
- os.remove(self.test_out+'/Doxyfile')
- return True
-
- # check the relevant files of a doxygen run with the reference material
- def perform_test(self,testmgr):
- if (sys.platform == 'win32'):
- redir=' > nul:'
- separ='&'
- else:
- redir=' 2> /dev/null'
- separ=';'
-
- if (self.args.noredir):
- redir=''
-
- failed_xml=False
- failed_html=False
- failed_qhp=False
- failed_latex=False
- failed_docbook=False
- failed_rtf=False
- failed_xmlxsd=False
- msg = ()
- # look for files to check against the reference
- if self.args.xml or self.args.xmlxsd:
- failed_xml=False
- if 'check' in self.config and self.args.xml:
- failed_xml=True
- for check in self.config['check']:
- check_file='%s/out/%s' % (self.test_out,check)
- # check if the file we need to check is actually generated
- if not os.path.isfile(check_file):
- # try with sub dirs
- check_file = glob.glob('%s/out/*/*/%s' % (self.test_out,check))
- if not check_file:
- check_file='%s/out/%s' % (self.test_out,check)
- msg += ('Non-existing file %s after \'check:\' statement' % check_file,)
- break
- else:
- check_file = check_file[0]
- # convert output to canonical form
- check_file = check_file.replace('\\','/')
- data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
- if data:
- # strip version
- data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
- else:
- msg += ('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out),)
- break
- if self.args.subdirs:
- data = re.sub('d[0-9a-f]/d[0-9a-f][0-9a-f]/','',data)
- out_file='%s/%s' % (self.test_out,check)
- with xopen(out_file,'w') as f:
- print(data,file=f)
- ref_file='%s/%s/%s' % (self.args.inputdir,self.test_id,check)
- (failed_xml,xml_msg) = self.compare_ok(out_file,ref_file,self.test_name)
- if failed_xml:
- msg+= (xml_msg,)
- break
- failed_xmlxsd=False
- if self.args.xmlxsd:
- xmlxsd_output='%s/out' % self.test_out
- if (sys.platform == 'win32'):
- redirx=' 2> %s/temp >nul:'%xmlxsd_output
- else:
- redirx='2>%s/temp >/dev/null'%xmlxsd_output
- #
- index_xml = []
- index_xml.append(glob.glob('%s/index.xml' % (xmlxsd_output)))
- index_xml.append(glob.glob('%s/*/*/index.xml' % (xmlxsd_output)))
- index_xml = ' '.join(list(itertools.chain.from_iterable(index_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
- index_xsd = []
- index_xsd.append(glob.glob('%s/index.xsd' % (xmlxsd_output)))
- index_xsd.append(glob.glob('%s/*/*/index.xsd' % (xmlxsd_output)))
- index_xsd = ' '.join(list(itertools.chain.from_iterable(index_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,index_xsd,index_xml)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
-
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- if xmllint_out:
- xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
- else:
- msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,index_xsd,index_xml),)
- failed_xmlxsd=True
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_xmlxsd=True
- #
- doxyfile_xml = []
- doxyfile_xml.append(glob.glob('%s/Doxyfile.xml' % (xmlxsd_output)))
- doxyfile_xml.append(glob.glob('%s/*/*/Doxyfile.xml' % (xmlxsd_output)))
- doxyfile_xml = ' '.join(list(itertools.chain.from_iterable(doxyfile_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
- doxyfile_xsd = []
- doxyfile_xsd.append(glob.glob('%s/doxyfile.xsd' % (xmlxsd_output)))
- doxyfile_xsd.append(glob.glob('%s/*/*/doxyfile.xsd' % (xmlxsd_output)))
- doxyfile_xsd = ' '.join(list(itertools.chain.from_iterable(doxyfile_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,doxyfile_xsd,doxyfile_xml)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
-
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- if xmllint_out:
- xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
- else:
- msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,doxyfile_xsd,doxyfile_xml),)
- failed_xmlxsd=True
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_xmlxsd=True
- #
- compound_xml = []
- compound_xml.append(glob.glob('%s/*.xml' % (xmlxsd_output)))
- compound_xml.append(glob.glob('%s/*/*/*.xml' % (xmlxsd_output)))
- compound_xml = ' '.join(list(itertools.chain.from_iterable(compound_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
- compound_xml = re.sub(r' [^ ]*/index.xml','',compound_xml)
- compound_xml = re.sub(r'[^ ]*/index.xml ','',compound_xml)
- compound_xml = re.sub(r' [^ ]*/Doxyfile.xml','',compound_xml)
- compound_xml = re.sub(r'[^ ]*/Doxyfile.xml ','',compound_xml)
-
- compound_xsd = []
- compound_xsd.append(glob.glob('%s/compound.xsd' % (xmlxsd_output)))
- compound_xsd.append(glob.glob('%s/*/*/compound.xsd' % (xmlxsd_output)))
- compound_xsd = ' '.join(list(itertools.chain.from_iterable(compound_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,compound_xsd,compound_xml)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
-
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- if xmllint_out:
- xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
- else:
- msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,compound_xsd,compound_xml),)
- failed_xmlxsd=True
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_xmlxsd=True
-
- if not failed_xml and not failed_xmlxsd and not self.args.keep:
- xml_output='%s/out' % self.test_out
- shutil.rmtree(xml_output,ignore_errors=True)
-
- if (self.args.rtf):
- (res, msg1) = self.check_link_rtf_file("%s/rtf/refman.rtf" % self.test_out)
- if not res:
- #msg += ("RTF: Not all used hyperlinks have been defined",)
- msg += (msg1,)
- failed_rtf=True
-
- if (self.args.docbook):
- docbook_output='%s/docbook' % self.test_out
- if (sys.platform == 'win32'):
- redirx=' 2> %s/temp >nul:'%docbook_output
- else:
- redirx='2>%s/temp >/dev/null'%docbook_output
- # For future work, first get everything valid XML
- # exe_string = '%s --relaxng db/docbook.rng --nonet --postvalid %s/*xml %s % (self.args.xmllint,docbook_output,redirx)
- tests = []
- tests.append(glob.glob('%s/*.xml' % (docbook_output)))
- tests.append(glob.glob('%s/*/*/*.xml' % (docbook_output)))
- tests = ' '.join(list(itertools.chain.from_iterable(tests))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --nonet --postvalid %s' % (self.args.xmllint,tests)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,docbook_output)
-
- failed_docbook=False
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- xmllint_out = self.cleanup_xmllint_docbook(xmllint_out)
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_docbook=True
- elif not self.args.keep:
- shutil.rmtree(docbook_output,ignore_errors=True)
-
- if (self.args.xhtml or self.args.qhp):
- html_output='%s/html' % self.test_out
- if (sys.platform == 'win32'):
- redirx=' 2> %s/temp >nul:'%html_output
- else:
- redirx='2>%s/temp >/dev/null'%html_output
- check_file = []
- check_file.append(glob.glob('%s/*.xhtml' % (html_output)))
- check_file.append(glob.glob('%s/*/*/*.xhtml' % (html_output)))
- check_file = ' '.join(list(itertools.chain.from_iterable(check_file))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --path dtd --nonet --postvalid %s' % (self.args.xmllint,check_file)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,html_output)
- failed_html=False
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- xmllint_out = self.cleanup_xmllint(xmllint_out)
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_html=True
-
- failed_qhp=False
- if not failed_html and self.args.qhp:
- check_file = "%s/index.qhp"%(html_output)
- exe_string = '%s --noout %s' % (self.args.xmllint,check_file)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,html_output)
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- xmllint_out = self.cleanup_xmllint(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_qhp=True
- if not failed_html and not failed_qhp and not self.args.keep:
- shutil.rmtree(html_output,ignore_errors=True)
- if (self.args.pdf):
- failed_latex=False
- latex_output='%s/latex' % self.test_out
- # with languages like Hungarian we had problems with some tests on windows when stderr was used.
- if (sys.platform == 'win32'):
- outType=False
- redirl='>nul: 2>temp'
- mk='make.bat'
- else:
- outType=True
- redirl='>/dev/null 2>temp'
- mk='make'
- cur_directory = os.getcwd()
- os.chdir(latex_output)
- exe_string = mk
- exe_string1 = exe_string
- exe_string += ' %s' % (redirl)
- if outType:
- exe_string += ' %s more temp' % (separ)
- latex_out = xpopen(exe_string,exe_string1,getStderr=outType)
- os.chdir(cur_directory);
- if (outType and latex_out.find("Error")!=-1):
- msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_latex=True
- elif (not outType and xopen(latex_output + "/temp",'r').read().find("Error")!= -1):
- msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_latex=True
- elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Error")!= -1:
- msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_latex=True
- elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Emergency stop")!= -1:
- msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_latex=True
- elif not self.args.keep:
- shutil.rmtree(latex_output,ignore_errors=True)
-
- warnings = xopen(self.test_out + "/warnings.log",'r',encoding='ISO-8859-1').read()
- failed_warn = len(warnings)!=0
- if failed_warn:
- msg += (warnings,)
-
- if failed_warn or failed_xml or failed_html or failed_qhp or failed_latex or failed_docbook or failed_rtf or failed_xmlxsd:
- testmgr.ok(False,self.test_name,msg)
- return False
-
- testmgr.ok(True,self.test_name)
- if not self.args.keep:
- shutil.rmtree(self.test_out,ignore_errors=True)
- return True
-
- def run(self,testmgr):
- if self.update:
- return self.update_test(testmgr)
- else:
- return self.perform_test(testmgr)
+ def __init__(self,args,test):
+ self.args = args
+ self.test = test
+ self.update = args.updateref
+ self.config = self.get_config()
+ self.test_name = '[%s]: %s' % (self.test,self.config['objective'][0])
+ self.test_id = self.test.split('_')[0]
+ if self.update:
+ self.test_out = self.args.inputdir+'/'+self.test_id
+ else:
+ self.test_out = self.args.outputdir+'/test_output_'+self.test_id
+ self.prepare_test()
+
+ def compare_ok(self,got_file,expected_file,name):
+ if not os.path.isfile(got_file):
+ return (True,'%s absent' % got_file)
+ elif not os.path.isfile(expected_file):
+ return (True,'%s absent' % expected_file)
+ else:
+ diff = xpopen('diff -b -w -u %s %s' % (got_file,expected_file))
+ if diff and not diff.startswith("No differences"):
+ return (True,'Difference between generated output and reference:\n%s' % diff)
+ return (False,'')
+
+ def cleanup_xmllint(self,errmsg):
+ msg = errmsg.split('\n')
+ rtnmsg = ""
+ for o in msg:
+ if (o):
+ if (o.startswith("I/O error : Attempt")):
+ pass
+ else:
+ if (rtnmsg):
+ rtnmsg += '\n'
+ rtnmsg += o
+ return rtnmsg
+
+ def cleanup_xmllint_docbook(self,errmsg):
+ # For future work, first get everything valid XML
+ msg = self.cleanup_xmllint(errmsg).split('\n')
+ rtnmsg = ""
+ cnt = 0
+ for o in msg:
+ if (o):
+ if (cnt):
+ cnt -= 1
+ pass
+ elif (o.endswith("does not validate")):
+ pass
+ elif (o.find("no DTD found!")!=-1):
+ pass
+ elif (o.find("is not an NCName")!=-1):
+ cnt = 2
+ else:
+ if (rtnmsg):
+ rtnmsg += '\n'
+ rtnmsg += o
+ return rtnmsg
+
+ def get_config(self):
+ config = {}
+ with xopen(self.args.inputdir+'/'+self.test,'r') as f:
+ for line in f.readlines():
+ m = config_reg.match(line)
+ if m:
+ key = m.group('name')
+ value = m.group('value')
+ if (key=='config'):
+ value = value.replace('$INPUTDIR',self.args.inputdir)
+ # print('key=%s value=%s' % (key,value))
+ config.setdefault(key, []).append(value)
+ return config
+
+ def prepare_test(self):
+ # prepare test environment
+ shutil.rmtree(self.test_out,ignore_errors=True)
+ os.mkdir(self.test_out)
+ shutil.copy(self.args.inputdir+'/Doxyfile',self.test_out)
+ with xopen(self.test_out+'/Doxyfile','a') as f:
+ print('INPUT=%s/%s' % (self.args.inputdir,self.test), file=f)
+ print('STRIP_FROM_PATH=%s' % self.args.inputdir, file=f)
+ print('EXAMPLE_PATH=%s' % self.args.inputdir, file=f)
+ print('WARN_LOGFILE=%s/warnings.log' % self.test_out, file=f)
+ if 'config' in self.config:
+ for option in self.config['config']:
+ print(option, file=f)
+ if (self.args.xml or self.args.xmlxsd):
+ print('GENERATE_XML=YES', file=f)
+ print('XML_OUTPUT=%s/out' % self.test_out, file=f)
+ else:
+ print('GENERATE_XML=NO', file=f)
+ if (self.args.rtf):
+ print('GENERATE_RTF=YES', file=f)
+ print('RTF_HYPERLINKS=YES', file=f)
+ print('RTF_OUTPUT=%s/rtf' % self.test_out, file=f)
+ else:
+ print('GENERATE_RTF=NO', file=f)
+ if (self.args.docbook):
+ print('GENERATE_DOCBOOK=YES', file=f)
+ print('DOCBOOK_OUTPUT=%s/docbook' % self.test_out, file=f)
+ else:
+ print('GENERATE_DOCBOOK=NO', file=f)
+ if (self.args.qhp):
+ print('GENERATE_QHP=YES', file=f)
+ if (self.args.xhtml or self.args.qhp):
+ print('GENERATE_HTML=YES', file=f)
+ # HTML_OUTPUT can also have been set locally
+ print('HTML_OUTPUT=%s/html' % self.test_out, file=f)
+ print('HTML_FILE_EXTENSION=.xhtml', file=f)
+ if (self.args.pdf):
+ print('GENERATE_LATEX=YES', file=f)
+ print('LATEX_BATCHMODE=YES', file=f)
+ print('LATEX_OUTPUT=%s/latex' % self.test_out, file=f)
+ if self.args.subdirs:
+ print('CREATE_SUBDIRS=YES', file=f)
+ if (self.args.clang):
+ print('CLANG_ASSISTED_PARSING=YES', file=f)
+ if (self.args.cfgs):
+ for cfg in self.args.cfgs:
+ if cfg[0].find('=') == -1:
+ print("Not a doxygen configuration item, missing '=' sign: '%s'."%cfg)
+ sys.exit(1)
+ print(cfg[0], file=f)
+
+ if 'check' not in self.config or not self.config['check']:
+ print('Test doesn\'t specify any files to check')
+ sys.exit(1)
+
+ # run doxygen
+ if (sys.platform == 'win32'):
+ redir=' > nul: 2>&1'
+ else:
+ redir=' 2> /dev/null > /dev/null'
+
+ if (self.args.noredir):
+ redir=''
+
+ if os.system('%s %s/Doxyfile %s' % (self.args.doxygen,self.test_out,redir))!=0:
+ print('Error: failed to run %s on %s/Doxyfile' % (self.args.doxygen,self.test_out))
+ sys.exit(1)
+
+
+ def check_link_rtf_file(self,fil):
+ bkmk_res = []
+ hyper_res = []
+ pageref_res = []
+ with xopen(fil,'r') as f:
+ for line in f.readlines():
+ if ("bkmkstart" in line) or ("HYPERLINK" in line) or ("PAGEREF" in line):
+ msg = line.split('}')
+ for m in msg:
+ if bkmk_reg.match(m):
+ m1 = re.sub(bkmk_reg, '\\1', m)
+ bkmk_res.append(m1)
+ elif hyper_reg.match(m):
+ m1 = re.sub(hyper_reg, '\\1', m)
+ hyper_res.append(m1)
+ elif pageref_reg.match(m):
+ m1 = re.sub(pageref_reg, '\\1', m)
+ pageref_res.append(m1)
+ # Has been commented out as in the test 57, inline namespace, there is still a small problem.
+ #if sorted(bkmk_res) != sorted(set(bkmk_res)):
+ # return (False, "RTF: one (or more) bookmark(s) has(have) been defined multiple times")
+ hyper_res = sorted(set(hyper_res))
+ for h in hyper_res:
+ if h not in bkmk_res:
+ #print(bkmk_res)
+ #print(hyper_res)
+ return (False, "RTF: Not all used hyperlinks have been defined")
+ pageref_res = sorted(set(pageref_res))
+ for p in pageref_res:
+ if p not in bkmk_res:
+ #print(bkmk_res)
+ #print(pageref_res)
+ return (False, "RTF: Not all used page reference bookmarks have been defined")
+ return (True,"")
+
+
+ # update the reference data for this test
+ def update_test(self,testmgr):
+ print('Updating reference for %s' % self.test_name)
+
+ if 'check' in self.config:
+ for check in self.config['check']:
+ check_file='%s/out/%s' % (self.test_out,check)
+ # check if the file we need to check is actually generated
+ if not os.path.isfile(check_file):
+ print('Non-existing file %s after \'check:\' statement' % check_file)
+ return False
+ # convert output to canonical form
+ data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
+ if data:
+ # strip version
+ data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
+ else:
+ print('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out))
+ return False
+ out_file='%s/%s' % (self.test_out,check)
+ with xopen(out_file,'w') as f:
+ print(data,file=f)
+ shutil.rmtree(self.test_out+'/out',ignore_errors=True)
+ os.remove(self.test_out+'/Doxyfile')
+ return True
+
+ # check the relevant files of a doxygen run with the reference material
+ def perform_test(self,testmgr):
+ if (sys.platform == 'win32'):
+ redir=' > nul:'
+ separ='&'
+ else:
+ redir=' 2> /dev/null'
+ separ=';'
+
+ if (self.args.noredir):
+ redir=''
+
+ failed_xml=False
+ failed_html=False
+ failed_qhp=False
+ failed_latex=False
+ failed_docbook=False
+ failed_rtf=False
+ failed_xmlxsd=False
+ msg = ()
+ # look for files to check against the reference
+ if self.args.xml or self.args.xmlxsd:
+ failed_xml=False
+ if 'check' in self.config and self.args.xml:
+ failed_xml=True
+ for check in self.config['check']:
+ check_file='%s/out/%s' % (self.test_out,check)
+ # check if the file we need to check is actually generated
+ if not os.path.isfile(check_file):
+ # try with sub dirs
+ check_file = glob.glob('%s/out/*/*/%s' % (self.test_out,check))
+ if not check_file:
+ check_file='%s/out/%s' % (self.test_out,check)
+ msg += ('Non-existing file %s after \'check:\' statement' % check_file,)
+ break
+ else:
+ check_file = check_file[0]
+ # convert output to canonical form
+ check_file = check_file.replace('\\','/')
+ data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
+ if data:
+ # strip version
+ data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
+ else:
+ msg += ('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out),)
+ break
+ if self.args.subdirs:
+ data = re.sub('d[0-9a-f]/d[0-9a-f][0-9a-f]/','',data)
+ out_file='%s/%s' % (self.test_out,check)
+ with xopen(out_file,'w') as f:
+ print(data,file=f)
+ ref_file='%s/%s/%s' % (self.args.inputdir,self.test_id,check)
+ (failed_xml,xml_msg) = self.compare_ok(out_file,ref_file,self.test_name)
+ if failed_xml:
+ msg+= (xml_msg,)
+ break
+ failed_xmlxsd=False
+ if self.args.xmlxsd:
+ xmlxsd_output='%s/out' % self.test_out
+ if (sys.platform == 'win32'):
+ redirx=' 2> %s/temp >nul:'%xmlxsd_output
+ else:
+ redirx='2>%s/temp >/dev/null'%xmlxsd_output
+ #
+ index_xml = []
+ index_xml.append(glob.glob('%s/index.xml' % (xmlxsd_output)))
+ index_xml.append(glob.glob('%s/*/*/index.xml' % (xmlxsd_output)))
+ index_xml = ' '.join(list(itertools.chain.from_iterable(index_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
+ index_xsd = []
+ index_xsd.append(glob.glob('%s/index.xsd' % (xmlxsd_output)))
+ index_xsd.append(glob.glob('%s/*/*/index.xsd' % (xmlxsd_output)))
+ index_xsd = ' '.join(list(itertools.chain.from_iterable(index_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,index_xsd,index_xml)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
+
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ if xmllint_out:
+ xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
+ else:
+ msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,index_xsd,index_xml),)
+ failed_xmlxsd=True
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_xmlxsd=True
+ #
+ doxyfile_xml = []
+ doxyfile_xml.append(glob.glob('%s/Doxyfile.xml' % (xmlxsd_output)))
+ doxyfile_xml.append(glob.glob('%s/*/*/Doxyfile.xml' % (xmlxsd_output)))
+ doxyfile_xml = ' '.join(list(itertools.chain.from_iterable(doxyfile_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
+ doxyfile_xsd = []
+ doxyfile_xsd.append(glob.glob('%s/doxyfile.xsd' % (xmlxsd_output)))
+ doxyfile_xsd.append(glob.glob('%s/*/*/doxyfile.xsd' % (xmlxsd_output)))
+ doxyfile_xsd = ' '.join(list(itertools.chain.from_iterable(doxyfile_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,doxyfile_xsd,doxyfile_xml)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
+
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ if xmllint_out:
+ xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
+ else:
+ msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,doxyfile_xsd,doxyfile_xml),)
+ failed_xmlxsd=True
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_xmlxsd=True
+ #
+ compound_xml = []
+ compound_xml.append(glob.glob('%s/*.xml' % (xmlxsd_output)))
+ compound_xml.append(glob.glob('%s/*/*/*.xml' % (xmlxsd_output)))
+ compound_xml = ' '.join(list(itertools.chain.from_iterable(compound_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
+ compound_xml = re.sub(r' [^ ]*/index.xml','',compound_xml)
+ compound_xml = re.sub(r'[^ ]*/index.xml ','',compound_xml)
+ compound_xml = re.sub(r' [^ ]*/Doxyfile.xml','',compound_xml)
+ compound_xml = re.sub(r'[^ ]*/Doxyfile.xml ','',compound_xml)
+
+ compound_xsd = []
+ compound_xsd.append(glob.glob('%s/compound.xsd' % (xmlxsd_output)))
+ compound_xsd.append(glob.glob('%s/*/*/compound.xsd' % (xmlxsd_output)))
+ compound_xsd = ' '.join(list(itertools.chain.from_iterable(compound_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,compound_xsd,compound_xml)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
+
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ if xmllint_out:
+ xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
+ else:
+ msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,compound_xsd,compound_xml),)
+ failed_xmlxsd=True
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_xmlxsd=True
+
+ if not failed_xml and not failed_xmlxsd and not self.args.keep:
+ xml_output='%s/out' % self.test_out
+ shutil.rmtree(xml_output,ignore_errors=True)
+
+ if (self.args.rtf):
+ (res, msg1) = self.check_link_rtf_file("%s/rtf/refman.rtf" % self.test_out)
+ if not res:
+ #msg += ("RTF: Not all used hyperlinks have been defined",)
+ msg += (msg1,)
+ failed_rtf=True
+
+ if (self.args.docbook):
+ docbook_output='%s/docbook' % self.test_out
+ if (sys.platform == 'win32'):
+ redirx=' 2> %s/temp >nul:'%docbook_output
+ else:
+ redirx='2>%s/temp >/dev/null'%docbook_output
+ # For future work, first get everything valid XML
+ # exe_string = '%s --relaxng db/docbook.rng --nonet --postvalid %s/*xml %s % (self.args.xmllint,docbook_output,redirx)
+ tests = []
+ tests.append(glob.glob('%s/*.xml' % (docbook_output)))
+ tests.append(glob.glob('%s/*/*/*.xml' % (docbook_output)))
+ tests = ' '.join(list(itertools.chain.from_iterable(tests))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --nonet --postvalid %s' % (self.args.xmllint,tests)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,docbook_output)
+
+ failed_docbook=False
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ xmllint_out = self.cleanup_xmllint_docbook(xmllint_out)
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_docbook=True
+ elif not self.args.keep:
+ shutil.rmtree(docbook_output,ignore_errors=True)
+
+ if (self.args.xhtml or self.args.qhp):
+ html_output='%s/html' % self.test_out
+ if (sys.platform == 'win32'):
+ redirx=' 2> %s/temp >nul:'%html_output
+ else:
+ redirx='2>%s/temp >/dev/null'%html_output
+ check_file = []
+ check_file.append(glob.glob('%s/*.xhtml' % (html_output)))
+ check_file.append(glob.glob('%s/*/*/*.xhtml' % (html_output)))
+ check_file = ' '.join(list(itertools.chain.from_iterable(check_file))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --path dtd --nonet --postvalid %s' % (self.args.xmllint,check_file)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,html_output)
+ failed_html=False
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ xmllint_out = self.cleanup_xmllint(xmllint_out)
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_html=True
+
+ failed_qhp=False
+ if not failed_html and self.args.qhp:
+ check_file = "%s/index.qhp"%(html_output)
+ exe_string = '%s --noout %s' % (self.args.xmllint,check_file)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,html_output)
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ xmllint_out = self.cleanup_xmllint(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_qhp=True
+ if not failed_html and not failed_qhp and not self.args.keep:
+ shutil.rmtree(html_output,ignore_errors=True)
+ if (self.args.pdf):
+ failed_latex=False
+ latex_output='%s/latex' % self.test_out
+ # with languages like Hungarian we had problems with some tests on windows when stderr was used.
+ if (sys.platform == 'win32'):
+ outType=False
+ redirl='>nul: 2>temp'
+ mk='make.bat'
+ else:
+ outType=True
+ redirl='>/dev/null 2>temp'
+ mk='make'
+ cur_directory = os.getcwd()
+ os.chdir(latex_output)
+ exe_string = mk
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirl)
+ if outType:
+ exe_string += ' %s more temp' % (separ)
+ latex_out = xpopen(exe_string,exe_string1,getStderr=outType)
+ os.chdir(cur_directory);
+ if (outType and latex_out.find("Error")!=-1):
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
+ elif (not outType and xopen(latex_output + "/temp",'r').read().find("Error")!= -1):
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
+ elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Error")!= -1:
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
+ elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Emergency stop")!= -1:
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
+ elif not self.args.keep:
+ shutil.rmtree(latex_output,ignore_errors=True)
+
+ warnings = xopen(self.test_out + "/warnings.log",'r',encoding='ISO-8859-1').read()
+ failed_warn = len(warnings)!=0
+ if failed_warn:
+ msg += (warnings,)
+
+ if failed_warn or failed_xml or failed_html or failed_qhp or failed_latex or failed_docbook or failed_rtf or failed_xmlxsd:
+ testmgr.ok(False,self.test_name,msg)
+ return False
+
+ testmgr.ok(True,self.test_name)
+ if not self.args.keep:
+ shutil.rmtree(self.test_out,ignore_errors=True)
+ return True
+
+ def run(self,testmgr):
+ if self.update:
+ return self.update_test(testmgr)
+ else:
+ return self.perform_test(testmgr)
def do_generation_work(test):
- tester = Tester(test[0].args,test[1])
- return tester.run(test[0])
+ tester = Tester(test[0].args,test[1])
+ return tester.run(test[0])
class TestManager:
- def __init__(self,args,tests):
- self.args = args
- self.tests = tests
- self.num_tests = len(tests)
- self.count=1
- self.passed=0
- if (self.args.xhtml or self.args.qhp):
- self.prepare_dtd()
- print('1..%d' % self.num_tests)
-
- def ok(self,result,test_name,msg='Ok'):
- if result:
- print('ok - %s' % (test_name))
- self.passed = self.passed + 1
- else:
- print('not ok - %s' % (test_name))
- print('-------------------------------------')
- for o in msg:
- print(o)
- print('-------------------------------------')
- self.count = self.count + 1
-
- def result(self):
- if self.passed==self.num_tests:
- print('All tests passed!')
- else:
- print('%d out of %s tests failed' % (self.num_tests-self.passed,self.num_tests))
- return 0 if self.passed==self.num_tests else 1
-
- def perform_tests(self):
- if (self.args.pool == 1):
- passed = 0
- for test in self.tests:
- tester = Tester(self.args,test)
- passed += tester.run(self)
- self.passed = passed
- else:
- dl = []
- for test in self.tests:
- dl += [(self, test)]
- import multiprocessing as mp
- p = mp.Pool(processes=self.args.pool)
- passed = p.map(do_generation_work, dl)
- self.passed = sum(passed)
- res=self.result()
- if (self.args.xhtml or self.args.qhp) and self.args.inputdir!='.' and not res and not self.args.keep:
- shutil.rmtree("dtd",ignore_errors=True)
- return 0 if self.args.updateref else res
-
- def prepare_dtd(self):
- if self.args.inputdir!='.':
- shutil.rmtree("dtd",ignore_errors=True)
- shutil.copytree(self.args.inputdir+"/dtd", "dtd")
+ def __init__(self,args,tests):
+ self.args = args
+ self.tests = tests
+ self.num_tests = len(tests)
+ self.count=1
+ self.passed=0
+ if (self.args.xhtml or self.args.qhp):
+ self.prepare_dtd()
+ print('1..%d' % self.num_tests)
+
+ def ok(self,result,test_name,msg='Ok'):
+ if result:
+ print('ok - %s' % (test_name))
+ self.passed = self.passed + 1
+ else:
+ print('not ok - %s' % (test_name))
+ print('-------------------------------------')
+ for o in msg:
+ print(o)
+ print('-------------------------------------')
+ self.count = self.count + 1
+
+ def result(self):
+ if self.passed==self.num_tests:
+ print('All tests passed!')
+ else:
+ print('%d out of %s tests failed' % (self.num_tests-self.passed,self.num_tests))
+ return 0 if self.passed==self.num_tests else 1
+
+ def perform_tests(self):
+ if (self.args.pool == 1):
+ passed = 0
+ for test in self.tests:
+ tester = Tester(self.args,test)
+ passed += tester.run(self)
+ self.passed = passed
+ else:
+ dl = []
+ for test in self.tests:
+ dl += [(self, test)]
+ import multiprocessing as mp
+ p = mp.Pool(processes=self.args.pool)
+ passed = p.map(do_generation_work, dl)
+ self.passed = sum(passed)
+ res=self.result()
+ if (self.args.xhtml or self.args.qhp) and self.args.inputdir!='.' and not res and not self.args.keep:
+ shutil.rmtree("dtd",ignore_errors=True)
+ return 0 if self.args.updateref else res
+
+ def prepare_dtd(self):
+ if self.args.inputdir!='.':
+ shutil.rmtree("dtd",ignore_errors=True)
+ shutil.copytree(self.args.inputdir+"/dtd", "dtd")
def split_and_keep(s,sep):
s = s.replace('"','') # add token separator
@@ -608,96 +608,96 @@ def split_and_keep(s,sep):
return s
def main():
- # argument handling
- parser = argparse.ArgumentParser(description='run doxygen tests')
- parser.add_argument('--updateref',help=
- 'update the reference files. Should be used in combination with --id to '
- 'update the reference file(s) for the given test',action="store_true")
- parser.add_argument('--doxygen',nargs='?',default='doxygen',help=
- 'path/name of the doxygen executable')
- parser.add_argument('--xmllint',nargs='?',default='xmllint',help=
- 'path/name of the xmllint executable')
- parser.add_argument('--id',nargs='+',dest='ids',action='append',type=int,help=
- 'run test with number n only (the option can be specified to run test with '
- 'number n only (the option can be specified multiple times')
- parser.add_argument('--start_id',dest='start_id',type=int,help=
- 'run tests starting with number n')
- parser.add_argument('--end_id',dest='end_id',type=int,help=
- 'run tests ending with number n')
- parser.add_argument('--all',help=
- 'can be used in combination with -updateref to update the reference files '
- 'for all tests.',action="store_true")
- parser.add_argument('--inputdir',nargs='?',default='.',help=
- 'input directory containing the tests')
- parser.add_argument('--outputdir',nargs='?',default='.',help=
- 'output directory to write the doxygen output to')
- parser.add_argument('--noredir',help=
- 'disable redirection of doxygen warnings',action="store_true")
- parser.add_argument('--pool',nargs='?',default='1',type=int,help=
- 'pool size of multiprocess tests')
- parser.add_argument('--xml',help='create xml output and check',
- action="store_true")
- parser.add_argument('--rtf',help=
- 'create rtf output',action="store_true")
- parser.add_argument('--docbook',help=
- 'create docbook output and check with xmllint',action="store_true")
- parser.add_argument('--xhtml',help=
- 'create xhtml output and check with xmllint',action="store_true")
- parser.add_argument('--qhp',help=
- 'create qhp output and check with xmllint',action="store_true")
- parser.add_argument('--xmlxsd',help=
- 'create xml output and check with xmllint against xsd',action="store_true")
- parser.add_argument('--pdf',help='create LaTeX output and create pdf from it',
- action="store_true")
- parser.add_argument('--subdirs',help='use the configuration parameter CREATE_SUBDIRS=YES',
- action="store_true")
- parser.add_argument('--clang',help='use CLANG_ASSISTED_PARSING, works only when '
+ # argument handling
+ parser = argparse.ArgumentParser(description='run doxygen tests')
+ parser.add_argument('--updateref',help=
+ 'update the reference files. Should be used in combination with --id to '
+ 'update the reference file(s) for the given test',action="store_true")
+ parser.add_argument('--doxygen',nargs='?',default='doxygen',help=
+ 'path/name of the doxygen executable')
+ parser.add_argument('--xmllint',nargs='?',default='xmllint',help=
+ 'path/name of the xmllint executable')
+ parser.add_argument('--id',nargs='+',dest='ids',action='append',type=int,help=
+ 'run test with number n only (the option can be specified to run test with '
+ 'number n only (the option can be specified multiple times')
+ parser.add_argument('--start_id',dest='start_id',type=int,help=
+ 'run tests starting with number n')
+ parser.add_argument('--end_id',dest='end_id',type=int,help=
+ 'run tests ending with number n')
+ parser.add_argument('--all',help=
+ 'can be used in combination with -updateref to update the reference files '
+ 'for all tests.',action="store_true")
+ parser.add_argument('--inputdir',nargs='?',default='.',help=
+ 'input directory containing the tests')
+ parser.add_argument('--outputdir',nargs='?',default='.',help=
+ 'output directory to write the doxygen output to')
+ parser.add_argument('--noredir',help=
+ 'disable redirection of doxygen warnings',action="store_true")
+ parser.add_argument('--pool',nargs='?',default='1',type=int,help=
+ 'pool size of multiprocess tests')
+ parser.add_argument('--xml',help='create xml output and check',
+ action="store_true")
+ parser.add_argument('--rtf',help=
+ 'create rtf output',action="store_true")
+ parser.add_argument('--docbook',help=
+ 'create docbook output and check with xmllint',action="store_true")
+ parser.add_argument('--xhtml',help=
+ 'create xhtml output and check with xmllint',action="store_true")
+ parser.add_argument('--qhp',help=
+ 'create qhp output and check with xmllint',action="store_true")
+ parser.add_argument('--xmlxsd',help=
+ 'create xml output and check with xmllint against xsd',action="store_true")
+ parser.add_argument('--pdf',help='create LaTeX output and create pdf from it',
+ action="store_true")
+ parser.add_argument('--subdirs',help='use the configuration parameter CREATE_SUBDIRS=YES',
+ action="store_true")
+ parser.add_argument('--clang',help='use CLANG_ASSISTED_PARSING, works only when '
'doxygen has been compiled with "use_libclang"',
- action="store_true")
- parser.add_argument('--keep',help='keep result directories',
- action="store_true")
- parser.add_argument('--cfg',nargs='+',dest='cfgs',action='append',help=
- 'run test with extra doxygen configuration settings '
- '(the option may be specified multiple times')
-
- test_flags = split_and_keep(os.getenv('TEST_FLAGS', default=''), '--')
-
- args = parser.parse_args(test_flags + sys.argv[1:])
-
- # sanity check
- if (not args.xml) and (not args.pdf) and (not args.xhtml) and (not args.qhp) and (not args.docbook and (not args.rtf) and (not args.xmlxsd)):
- args.xml=True
- if (not args.updateref is None) and (args.ids is None) and (args.all is None):
- parser.error('--updateref requires either --id or --all')
-
- starting_directory = os.getcwd()
- os.chdir(args.inputdir)
- # find the tests to run
- tests = []
- if args.start_id:
- if args.end_id:
- for id in range(args.start_id, args.end_id + 1):
- tests.append(glob.glob('%s_*'%id))
- tests.append(glob.glob('0%s_*'%id))
- tests.append(glob.glob('00%s_*'%id))
- else:
- parser.error('--start_id requires --end_id')
- elif args.end_id:
- parser.error('--end_id requires --start_id')
- if args.ids: # test ids are given by user
- for id in list(itertools.chain.from_iterable(args.ids)):
- tests.append(glob.glob('%s_*'%id))
- tests.append(glob.glob('0%s_*'%id))
- tests.append(glob.glob('00%s_*'%id))
- if (not args.ids and not args.start_id): # find all tests
- tests = sorted(glob.glob('[0-9][0-9][0-9]_*'))
- else:
- tests = list(itertools.chain.from_iterable(tests))
- os.chdir(starting_directory)
-
- # create test manager to run the tests
- testManager = TestManager(args,tests)
- sys.exit(testManager.perform_tests())
+ action="store_true")
+ parser.add_argument('--keep',help='keep result directories',
+ action="store_true")
+ parser.add_argument('--cfg',nargs='+',dest='cfgs',action='append',help=
+ 'run test with extra doxygen configuration settings '
+ '(the option may be specified multiple times')
+
+ test_flags = split_and_keep(os.getenv('TEST_FLAGS', default=''), '--')
+
+ args = parser.parse_args(test_flags + sys.argv[1:])
+
+ # sanity check
+ if (not args.xml) and (not args.pdf) and (not args.xhtml) and (not args.qhp) and (not args.docbook and (not args.rtf) and (not args.xmlxsd)):
+ args.xml=True
+ if (not args.updateref is None) and (args.ids is None) and (args.all is None):
+ parser.error('--updateref requires either --id or --all')
+
+ starting_directory = os.getcwd()
+ os.chdir(args.inputdir)
+ # find the tests to run
+ tests = []
+ if args.start_id:
+ if args.end_id:
+ for id in range(args.start_id, args.end_id + 1):
+ tests.append(glob.glob('%s_*'%id))
+ tests.append(glob.glob('0%s_*'%id))
+ tests.append(glob.glob('00%s_*'%id))
+ else:
+ parser.error('--start_id requires --end_id')
+ elif args.end_id:
+ parser.error('--end_id requires --start_id')
+ if args.ids: # test ids are given by user
+ for id in list(itertools.chain.from_iterable(args.ids)):
+ tests.append(glob.glob('%s_*'%id))
+ tests.append(glob.glob('0%s_*'%id))
+ tests.append(glob.glob('00%s_*'%id))
+ if (not args.ids and not args.start_id): # find all tests
+ tests = sorted(glob.glob('[0-9][0-9][0-9]_*'))
+ else:
+ tests = list(itertools.chain.from_iterable(tests))
+ os.chdir(starting_directory)
+
+ # create test manager to run the tests
+ testManager = TestManager(args,tests)
+ sys.exit(testManager.perform_tests())
if __name__ == '__main__':
- main()
+ main()
diff --git a/testing/testsqlite3.py b/testing/testsqlite3.py
index 1d94f70..c3dd24c 100755
--- a/testing/testsqlite3.py
+++ b/testing/testsqlite3.py
@@ -1,4 +1,4 @@
-#! /usr/bin/python
+#!/usr/bin/env python
from xml.etree import cElementTree as ET
import os
import sqlite3
diff --git a/vhdlparser/vhdl_adj.py b/vhdlparser/vhdl_adj.py
index 559abc3..8f549aa 100644
--- a/vhdlparser/vhdl_adj.py
+++ b/vhdlparser/vhdl_adj.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# python script to adjust generated VhdlParser.cc
#
# Copyright (C) 1997-2021 by Dimitri van Heesch.
diff --git a/vhdlparser/vhdlparser.jj b/vhdlparser/vhdlparser.jj
index 96c705b..96c705b 100755..100644
--- a/vhdlparser/vhdlparser.jj
+++ b/vhdlparser/vhdlparser.jj
diff --git a/vhdlparser/vhdlstring.h b/vhdlparser/vhdlstring.h
index 59e9e22..59e9e22 100755..100644
--- a/vhdlparser/vhdlstring.h
+++ b/vhdlparser/vhdlstring.h