summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml32
-rw-r--r--CMakeLists.txt5
-rw-r--r--README.md39
-rwxr-xr-xaddon/doxypysql/search.py124
-rwxr-xr-xaddon/doxywizard/doxywizard.cpp2
-rw-r--r--addon/doxywizard/expert.cpp5
-rwxr-xr-xaddon/doxywizard/images/tunecolor.pngbin102299 -> 79154 bytes
-rw-r--r--addon/doxywizard/input.h1
-rw-r--r--addon/doxywizard/inputstring.h1
-rw-r--r--addon/doxywizard/inputstrlist.cpp8
-rw-r--r--addon/doxywizard/inputstrlist.h1
-rw-r--r--appveyor.yml59
-rw-r--r--cmake/FindSQLite3.cmake10
-rw-r--r--doc/CMakeLists.txt19
-rw-r--r--doc/Doxyfile3
-rw-r--r--doc/arch.doc16
-rw-r--r--doc/autolink.doc2
-rw-r--r--doc/changelog.doc634
-rw-r--r--doc/commands.doc127
-rw-r--r--doc/custcmd.doc5
-rw-r--r--doc/diagrams.doc2
-rw-r--r--doc/docblocks.doc29
-rw-r--r--doc/doxygen.14
-rw-r--r--doc/doxygen_manual.tex25
-rw-r--r--doc/doxywizard_expert.pngbin30056 -> 24299 bytes
-rw-r--r--doc/doxywizard_main.pngbin57204 -> 39432 bytes
-rw-r--r--doc/doxywizard_menu.pngbin58661 -> 46176 bytes
-rw-r--r--doc/doxywizard_page1.pngbin39646 -> 29943 bytes
-rw-r--r--doc/doxywizard_page2.pngbin39048 -> 29907 bytes
-rw-r--r--doc/doxywizard_page3.pngbin50904 -> 38861 bytes
-rw-r--r--doc/doxywizard_page4.pngbin43718 -> 33348 bytes
-rw-r--r--doc/emojisup.doc120
-rw-r--r--doc/extsearch_flow.pngbin21062 -> 7583 bytes
-rw-r--r--doc/faq.doc2
-rw-r--r--doc/features.doc4
-rw-r--r--doc/grouping.doc4
-rw-r--r--doc/index.doc6
-rw-r--r--doc/infoflow.pngbin100602 -> 86929 bytes
-rw-r--r--doc/install.doc21
-rw-r--r--doc/maintainers.txt4
-rw-r--r--doc/markdown.doc27
-rw-r--r--doc/output.doc2
-rw-r--r--doc/perlmod.doc2
-rw-r--r--doc/searching.doc4
-rw-r--r--doc/smile.pngbin0 -> 3686 bytes
-rw-r--r--doc/starting.doc60
-rw-r--r--doc/translator.py24
-rw-r--r--doc/trouble.doc2
-rw-r--r--doc/xmlcmds.doc2
-rw-r--r--examples/CMakeLists.txt6
-rw-r--r--examples/dbusxml.cfg14
-rw-r--r--examples/dbusxml.xml78
-rw-r--r--examples/example.cfg2
-rw-r--r--examples/example.tag14
-rw-r--r--examples/jdstyle.cfg2
-rw-r--r--examples/tag.cfg4
-rw-r--r--examples/tag.cpp2
-rw-r--r--examples/templ.cfg4
-rw-r--r--jquery/README8
-rw-r--r--libmd5/md5.c2
-rw-r--r--qtools/qcstring.cpp32
-rw-r--r--qtools/qdatastream.cpp28
-rw-r--r--qtools/qgarray.cpp24
-rw-r--r--qtools/qgcache.cpp2
-rw-r--r--qtools/qgdict.cpp14
-rw-r--r--qtools/qglist.cpp24
-rw-r--r--qtools/qgvector.cpp4
-rw-r--r--qtools/qstring.cpp10
-rw-r--r--qtools/qtextstream.cpp4
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/cite.cpp4
-rw-r--r--src/clangparser.cpp1
-rw-r--r--src/classdef.cpp309
-rw-r--r--src/classdef.h4
-rw-r--r--src/cmdmapper.cpp1
-rw-r--r--src/cmdmapper.h3
-rw-r--r--src/code.l60
-rw-r--r--src/commentscan.h4
-rw-r--r--src/commentscan.l68
-rw-r--r--src/config.h7
-rw-r--r--src/config.xml1147
-rw-r--r--src/configimpl.h20
-rw-r--r--src/configimpl.l127
-rw-r--r--src/context.cpp209
-rw-r--r--src/defargs.l17
-rw-r--r--src/defgen.cpp36
-rw-r--r--src/definition.cpp370
-rw-r--r--src/diagram.cpp2
-rw-r--r--src/dirdef.cpp6
-rw-r--r--src/docbookgen.cpp2703
-rw-r--r--src/docbookgen.h345
-rw-r--r--src/docbookvisitor.cpp614
-rw-r--r--src/docbookvisitor.h19
-rw-r--r--src/docparser.cpp418
-rw-r--r--src/docparser.h41
-rw-r--r--src/docsets.cpp5
-rw-r--r--src/doctokenizer.h5
-rw-r--r--src/doctokenizer.l96
-rw-r--r--src/docvisitor.h2
-rw-r--r--src/dot.cpp114
-rw-r--r--src/dot.h15
-rw-r--r--src/doxygen.cpp312
-rw-r--r--src/doxygen.h1
-rw-r--r--src/emoji.cpp1599
-rw-r--r--src/emoji.h41
-rw-r--r--src/entry.cpp7
-rw-r--r--src/entry.h68
-rw-r--r--src/filedef.cpp162
-rw-r--r--src/filedef.h6
-rw-r--r--src/fortrancode.l17
-rw-r--r--src/fortranscanner.l50
-rw-r--r--src/ftvhelp.cpp60
-rw-r--r--src/groupdef.cpp8
-rw-r--r--src/htmldocvisitor.cpp281
-rw-r--r--src/htmldocvisitor.h1
-rw-r--r--src/htmlentity.cpp3
-rw-r--r--src/htmlgen.cpp103
-rw-r--r--src/index.cpp955
-rw-r--r--src/index.h24
-rw-r--r--src/latexdocvisitor.cpp98
-rw-r--r--src/latexdocvisitor.h1
-rw-r--r--src/latexgen.cpp64
-rw-r--r--src/layout.cpp200
-rw-r--r--src/layout.h20
-rw-r--r--src/layout_default.xml32
-rw-r--r--src/mandocvisitor.cpp21
-rw-r--r--src/mandocvisitor.h1
-rw-r--r--src/mangen.cpp2
-rw-r--r--src/markdown.cpp91
-rw-r--r--src/marshal.cpp12
-rw-r--r--src/memberdef.cpp132
-rw-r--r--src/memberdef.h11
-rw-r--r--src/membergroup.cpp10
-rw-r--r--src/membergroup.h2
-rw-r--r--src/memberlist.cpp64
-rw-r--r--src/memberlist.h26
-rw-r--r--src/msc.cpp13
-rw-r--r--src/namespacedef.cpp190
-rw-r--r--src/namespacedef.h18
-rw-r--r--src/outputgen.h2
-rw-r--r--src/pagedef.cpp4
-rw-r--r--src/perlmodgen.cpp50
-rw-r--r--src/portable.cpp4
-rw-r--r--src/pre.l2
-rw-r--r--src/printdocvisitor.h25
-rw-r--r--src/pycode.l4
-rw-r--r--src/pyscanner.l182
-rw-r--r--src/reflist.cpp39
-rwxr-xr-xsrc/res2cc_cmd.py3
-rw-r--r--src/rtfdocvisitor.cpp114
-rw-r--r--src/rtfdocvisitor.h11
-rw-r--r--src/rtfgen.cpp28
-rw-r--r--src/rtfstyle.cpp368
-rw-r--r--src/rtfstyle.h2
-rw-r--r--src/scanner.l235
-rw-r--r--src/searchindex.cpp119
-rw-r--r--src/searchindex.h37
-rw-r--r--src/sqlite3gen.cpp2160
-rw-r--r--src/tagreader.cpp85
-rw-r--r--src/tclscanner.l1
-rw-r--r--src/template.cpp4
-rw-r--r--src/textdocvisitor.cpp13
-rw-r--r--src/textdocvisitor.h1
-rw-r--r--src/translator.h32
-rw-r--r--src/translator_adapter.h89
-rw-r--r--src/translator_br.h11
-rw-r--r--src/translator_de.h8
-rw-r--r--src/translator_en.h136
-rw-r--r--src/translator_es.h248
-rw-r--r--src/translator_fr.h252
-rw-r--r--src/translator_nl.h77
-rw-r--r--src/translator_pt.h6
-rw-r--r--src/types.h32
-rw-r--r--src/util.cpp173
-rw-r--r--src/util.h32
-rw-r--r--src/vhdlcode.l69
-rw-r--r--src/vhdldocgen.cpp13
-rw-r--r--src/xmldocvisitor.cpp39
-rw-r--r--src/xmldocvisitor.h1
-rw-r--r--src/xmlgen.cpp275
-rw-r--r--src/xmlgen.h42
-rw-r--r--templates/html/doxygen.css17
-rw-r--r--templates/html/header.html2
-rw-r--r--templates/html/htmlbase.tpl2
-rw-r--r--templates/html/htmlsearchresult.tpl2
-rw-r--r--templates/html/mag.pngbin524 -> 449 bytes
-rw-r--r--templates/html/mag_sel.pngbin563 -> 465 bytes
-rw-r--r--templates/html/search_l.pngbin604 -> 567 bytes
-rw-r--r--templates/html/search_r.pngbin612 -> 553 bytes
-rw-r--r--templates/latex/doxygen.sty6
-rw-r--r--templates/xml/compound.xsd34
-rw-r--r--testing/005_attention.dox2
-rw-r--r--testing/009/bug.xml9
-rw-r--r--testing/009/deprecated.xml8
-rw-r--r--testing/009/reminders.xml8
-rw-r--r--testing/009/test.xml8
-rw-r--r--testing/009/todo.xml8
-rw-r--r--testing/012/citelist.xml2
-rw-r--r--testing/030/indexpage.xml2
-rw-r--r--testing/030_htmlinclude.dox2
-rw-r--r--testing/031/indexpage.xml1
-rw-r--r--testing/031_image.dox1
-rw-r--r--testing/043_page.dox2
-rw-r--r--testing/051/indexpage.xml2
-rw-r--r--testing/051_escape.dox2
-rw-r--r--testing/074/struct_foo.xml287
-rw-r--r--testing/074_ref.cpp49
-rw-r--r--testing/README.txt14
-rwxr-xr-xtesting/dtd/xhtml1-transitional.dtd19
-rw-r--r--testing/runtests.py126
-rw-r--r--testing/sample.pngbin3779 -> 2560 bytes
211 files changed, 13393 insertions, 5444 deletions
diff --git a/.travis.yml b/.travis.yml
index 071a7d1..1130bec 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,6 @@
language: cpp
os:
- - linux-ppc64le
+ - linux-ppc64le
- linux
dist: xenial
compiler:
@@ -22,6 +22,36 @@ addons:
- cmake
- cmake-data
+jobs:
+ include:
+ - os: osx
+ compiler: clang
+
+before_script:
+ - if [ "${TRAVIS_OS_NAME}" == "osx" ]; then
+ sudo mkdir -p /usr/local/man;
+ sudo chown -R "${USER}:admin" /usr/local/man;
+ pip install --quiet conan;
+ export HOMEBREW_NO_AUTO_UPDATE=1;
+ brew install ghostscript;
+
+ travis_wait brew cask install mactex-no-gui;
+ curl -O -L http://mirrors.ctan.org/support/epstopdf.zip;
+ unzip epstopdf.zip;
+ mkdir -p /Users/travis/Library/TeX/texbin/;
+ mv epstopdf/epstopdf.pl /Users/travis/Library/TeX/texbin/epstopdf;
+ chmod a+x /Users/travis/Library/TeX/texbin/epstopdf;
+ rm -rf epstopdf*;
+ export PATH=/Users/travis/Library/TeX/texbin:/Library/TeX/texbin:$PATH;
+
+ conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan;
+ printf "[requires]\n
+ libxml2/2.9.8@bincrafters/stable\n
+ qt/5.11.3@bincrafters/stable" >> conanfile.txt;
+ conan install . -g virtualrunenv;
+ source activate_run.sh;
+ fi;
+
script:
- mkdir build
- cd build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1e0fb55..45c2f2c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -86,7 +86,10 @@ find_package(BISON REQUIRED)
find_package(Threads)
if (sqlite3)
- find_package(SQLite3 REQUIRED)
+ find_package(SQLite3 REQUIRED)
+ if (SQLITE3_VERSION VERSION_LESS 3.9.0)
+ message(SEND_ERROR "Doxygen requires at least sqlite3 version 3.9.0 (installed: ${SQLITE3_VERSION})")
+ endif()
endif()
find_package(Iconv REQUIRED)
diff --git a/README.md b/README.md
index 7035c6e..3e1c608 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,25 @@
Doxygen
===============
-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, VHDL, Tcl,
+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, VHDL, Tcl,
and to some extent D.
Doxygen can help you in three ways:
-1. It can generate an on-line documentation browser (in HTML) and/or an
- off-line reference manual (in LaTeX) from a set of documented source files.
- There is also support for generating output in RTF (MS-Word), PostScript,
- hyperlinked PDF, compressed HTML, DocBook and Unix man pages.
- The documentation is extracted directly from the sources, which makes
+1. It can generate an on-line documentation browser (in HTML) and/or an
+ off-line reference manual (in LaTeX) from a set of documented source files.
+ There is also support for generating output in RTF (MS-Word), PostScript,
+ hyperlinked PDF, compressed HTML, DocBook and Unix man pages.
+ The documentation is extracted directly from the sources, which makes
it much easier to keep the documentation consistent with the source code.
-2. You can configure doxygen to extract the code structure from undocumented
- source files. This is very useful to quickly find your way in large
- source distributions. Doxygen can also visualize the relations between
- the various elements by means of include dependency graphs, inheritance
+2. You can configure doxygen to extract the code structure from undocumented
+ source files. This is very useful to quickly find your way in large
+ source distributions. Doxygen can also visualize the relations between
+ the various elements by means of include dependency graphs, inheritance
diagrams, and collaboration diagrams, which are all generated automatically.
-3. You can also use doxygen for creating normal documentation (as I did for
+3. You can also use doxygen for creating normal documentation (as I did for
the doxygen user manual and doxygen web-site).
Download
@@ -29,15 +29,14 @@ The latest binaries and source of Doxygen can be downloaded from:
Developers
---------
-* Build Status: <a href="https://travis-ci.org/doxygen/doxygen"><img src="https://secure.travis-ci.org/doxygen/doxygen.png?branch=master"/></a>
+* Linux & macOS Build Status: <a href="https://travis-ci.org/doxygen/doxygen"><img src="https://secure.travis-ci.org/doxygen/doxygen.png?branch=master"/></a>
+* Windows Build Status: <a href="https://ci.appveyor.com/project/doxygen/doxygen"><img src="https://ci.appveyor.com/api/projects/status/github/doxygen/doxygen"/></a>
* 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>
-* Install
- * Quick install see (./INSTALL)
- * else http://www.doxygen.org/manual/install.html
+* Install: Please read the installation section of the manual (http://www.doxygen.org/manual/install.html)
* Project stats: https://www.openhub.net/p/doxygen
@@ -59,10 +58,10 @@ There are three mailing lists:
Source Code
----------------------------------
-In May 2013, Doxygen moved from
+In May 2013, Doxygen moved from
subversion to git hosted at GitHub
* https://github.com/doxygen/doxygen
Enjoy,
-Dimitri van Heesch (dimitri at stack.nl)
+Dimitri van Heesch (doxygen at gmail.com)
diff --git a/addon/doxypysql/search.py b/addon/doxypysql/search.py
index c185138..5f820de 100755
--- a/addon/doxypysql/search.py
+++ b/addon/doxypysql/search.py
@@ -17,19 +17,19 @@ import json
import re
class MemberType:
- Define="0"
- Function="1"
- Variable="2"
- Typedef="3"
- Enumeration="4"
- EnumValue="5"
- Signal="6"
- Slot="7"
- Friend="8"
- DCOP="9"
- Property="10"
- Event="11"
- File="12"
+ 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"
@@ -69,27 +69,27 @@ class Finder:
def match(self,row):
if self.row_type is int:
- return " id=?"
+ return " rowid=?"
else:
if g_use_regexp == True:
return " REGEXP (?,%s)" %row
else:
return " %s=?" %row
- def fileName(self,id_file):
- if self.cn.execute("SELECT COUNT(*) FROM files WHERE rowid=?",[id_file]).fetchone()[0] > 1:
- print >>sys.stderr,"WARNING: non-uniq fileid [%s]. Considering only the first match." % id_file
+ def fileName(self,file_id):
+ if self.cn.execute("SELECT COUNT(*) FROM path WHERE rowid=?",[file_id]).fetchone()[0] > 1:
+ sys.stderr.write("WARNING: non-uniq fileid [%s]. Considering only the first match." % file_id)
- for r in self.cn.execute("SELECT * FROM files WHERE rowid=?",[id_file]).fetchall():
+ for r in self.cn.execute("SELECT * FROM path WHERE rowid=?",[file_id]).fetchall():
return r['name']
return ""
def fileId(self,name):
- if self.cn.execute("SELECT COUNT(*) FROM files WHERE"+self.match("name"),[name]).fetchone()[0] > 1:
- print >>sys.stderr,"WARNING: non-uniq file name [%s]. Considering only the first match." % name
+ if self.cn.execute("SELECT COUNT(*) FROM path WHERE"+self.match("name"),[name]).fetchone()[0] > 1:
+ sys.stderr.write("WARNING: non-uniq file name [%s]. Considering only the first match." % name)
- for r in self.cn.execute("SELECT rowid FROM files WHERE"+self.match("name"),[name]).fetchall():
+ for r in self.cn.execute("SELECT rowid FROM path WHERE"+self.match("name"),[name]).fetchall():
return r[0]
return -1
@@ -97,23 +97,24 @@ class Finder:
def references(self):
o=[]
cur = self.cn.cursor()
- cur.execute("SELECT refid FROM memberdef WHERE"+self.match("name"),[self.name])
- refids = cur.fetchall()
+ cur.execute("SELECT rowid FROM memberdef WHERE"+self.match("name"),[self.name])
+ rowids = cur.fetchall()
- if len(refids) == 0:
+ if len(rowids) == 0:
return o
- refid = refids[0]['refid']
+ rowid = rowids[0]['rowid']
cur = self.cn.cursor()
- #TODO:SELECT rowid from refids where refid=refid
- for info in cur.execute("SELECT * FROM xrefs WHERE refid_dst LIKE '%"+refid+"%'"):
+ #TODO:SELECT rowid from refid where refid=refid
+ for info in cur.execute("SELECT * FROM xrefs WHERE dst_rowid=?", [rowid]):
item={}
cur = self.cn.cursor()
- for i2 in cur.execute("SELECT * FROM memberdef WHERE refid=?",[info['src']]):
+ for i2 in cur.execute("SELECT * FROM memberdef WHERE rowid=?",[info['src_rowid']]):
item['name']=i2['name']
- item['src']=info['src']
- item['file']=self.fileName(info['id_file'])
- item['line']=info['line']
+ item['src']=info['src_rowid']
+ # Below no longer directly supported on this entry; can be found from either memberdef
+ #item['file']=self.fileName(info['file_id'])
+ #item['line']=info['line']
o.append(item)
return o
@@ -126,7 +127,7 @@ class Finder:
item['name'] = r['name']
item['definition'] = r['definition']
item['argsstring'] = r['argsstring']
- item['file'] = self.fileName(r['id_file'])
+ item['file'] = self.fileName(r['file_id'])
item['line'] = r['line']
item['detaileddescription'] = r['detaileddescription']
o.append(item)
@@ -134,7 +135,7 @@ class Finder:
###############################################################################
def file(self):
o=[]
- for r in self.cn.execute("SELECT rowid,* FROM files WHERE"+self.match("name"),[self.name]).fetchall():
+ for r in self.cn.execute("SELECT rowid,name FROM local_file WHERE"+self.match("name"),[self.name]).fetchall():
item={}
item['name'] = r['name']
item['id'] = r['rowid']
@@ -151,7 +152,7 @@ class Finder:
if r['argsstring']:
item['argsstring'] = r['argsstring']
item['definition'] = r['initializer']
- item['file'] = self.fileName(r['id_file'])
+ item['file'] = self.fileName(r['file_id'])
item['line'] = r['line']
o.append(item)
return o
@@ -163,7 +164,7 @@ class Finder:
item={}
item['name'] = r['name']
item['definition'] = r['definition']
- item['file'] = self.fileName(r['id_file'])
+ item['file'] = self.fileName(r['file_id'])
item['line'] = r['line']
o.append(item)
return o
@@ -175,16 +176,16 @@ class Finder:
item={}
item['name'] = r['name']
item['definition'] = r['definition']
- item['file'] = self.fileName(r['id_file'])
+ item['file'] = self.fileName(r['file_id'])
item['line'] = r['line']
o.append(item)
return o
###############################################################################
def params(self):
o=[]
- c=self.cn.execute('SELECT id FROM memberdef WHERE'+self.match("name"),[self.name])
+ c=self.cn.execute('SELECT rowid FROM memberdef WHERE'+self.match("name"),[self.name])
for r in c.fetchall():
- #a=("SELECT * FROM params where id=(SELECT id_param FROM memberdef_params where id_memberdef=?",[id_memberdef])
+ #a=("SELECT * FROM param where id=(SELECT param_id FROM memberdef_param where memberdef_id=?",[memberdef_id])
item={}
item['id'] = r['id']
o.append(item)
@@ -202,20 +203,20 @@ class Finder:
def includers(self):
o=[]
fid = self.fileId(self.name)
- c=self.cn.execute('SELECT * FROM includes WHERE id_dst=?',[fid])
+ c=self.cn.execute('SELECT * FROM includes WHERE dst_id=?',[fid])
for r in c.fetchall():
item={}
- item['name'] = self.fileName(r['id_src'])
+ item['name'] = self.fileName(r['src_id'])
o.append(item)
return o
###############################################################################
def includees(self):
o=[]
fid = self.fileId(self.name)
- c=self.cn.execute('SELECT * FROM includes WHERE id_src=?',[fid])
+ c=self.cn.execute('SELECT * FROM includes WHERE src_id=?',[fid])
for r in c.fetchall():
item={}
- item['name'] = self.fileName(r['id_dst'])
+ item['name'] = self.fileName(r['dst_id'])
o.append(item)
return o
###############################################################################
@@ -227,7 +228,7 @@ class Finder:
item['name'] = r['name']
item['definition'] = r['definition']
item['argsstring'] = r['argsstring']
- item['file'] = self.fileName(r['id_file'])
+ item['file'] = self.fileName(r['file_id'])
item['line'] = r['line']
#item['documentation'] = r['documentation']
o.append(item)
@@ -235,19 +236,19 @@ class Finder:
###############################################################################
def baseClasses(self):
o=[]
- c=self.cn.execute('SELECT base FROM basecompoundref WHERE'+self.match("derived"),[self.name])
+ c=self.cn.execute('SELECT compounddef.name FROM compounddef JOIN compoundref ON compounddef.rowid=compoundref.base_rowid WHERE compoundref.derived_rowid IN (SELECT rowid FROM compounddef WHERE'+self.match("name")+')',[self.name])
for r in c.fetchall():
item={}
- item['name'] = r['base']
+ item['name'] = r['name']
o.append(item)
return o
###############################################################################
def subClasses(self):
o=[]
- c=self.cn.execute('SELECT derived FROM basecompoundref WHERE'+self.match("base"),[self.name])
+ c=self.cn.execute('SELECT compounddef.name FROM compounddef JOIN compoundref ON compounddef.rowid=compoundref.derived_rowid WHERE compoundref.base_rowid IN (SELECT rowid FROM compounddef WHERE'+self.match("name")+')',[self.name])
for r in c.fetchall():
item={}
- item['name'] = r['derived']
+ item['name'] = r['name']
o.append(item)
return o
###############################################################################
@@ -268,21 +269,23 @@ def process(f,kind):
}
return request_processors[kind]()
###############################################################################
+
+# the -H option isn't documented. It's one of the more recent additions, but it's treating refids as if they would be a string. I'm just taking a stab at updating it for now, converting to use rowid, and making other edits necessary to get it to run.
def processHref(cn,ref):
j={}
# is it in memberdef ?
table="memberdef"
- if ( cn.execute("SELECT count(*) from %s WHERE refid=?"%table,[ref] ).fetchone()[0] > 0 ):
- for r in cn.execute("SELECT kind,id FROM %s WHERE refid='%s'" % (table,ref) ).fetchall():
- f=Finder(cn,r['id'],int)
+ if ( cn.execute("SELECT count(*) from %s WHERE rowid=?"%table,[ref] ).fetchone()[0] > 0 ):
+ for r in cn.execute("SELECT kind,rowid FROM %s WHERE rowid=?" % table,[ref]).fetchall():
+ f=Finder(cn,r['rowid'],int)
j=process(f,str(r['kind']))
# is it in compounddef ?
table="compounddef"
- if ( cn.execute("SELECT count(*) from %s WHERE refid=?"%table,[ref]).fetchone()[0] > 0 ):
- for r in cn.execute("SELECT id FROM %s WHERE refid=?"%table,[ref] ).fetchall():
- f=Finder(cn,r['id'],int)
+ if ( cn.execute("SELECT count(*) from %s WHERE rowid=?"%table,[ref]).fetchone()[0] > 0 ):
+ for r in cn.execute("SELECT rowid FROM %s WHERE rowid=?"%table,[ref] ).fetchall():
+ f=Finder(cn,r[0],int)
j=process(f,RequestType.Struct)
return j
@@ -290,7 +293,7 @@ def processHref(cn,ref):
def serveCgi():
import cgi
- print 'Content-Type: application/json\n'
+ print('Content-Type: application/json\n')
fieldStorage = cgi.FieldStorage()
form = dict((key, fieldStorage.getvalue(key)) for key in fieldStorage.keys())
@@ -298,17 +301,17 @@ def serveCgi():
if 'href' in form:
ref = form['href']
else:
- print '{"result": null, "error": "no refid given"}'
+ print('{"result": null, "error": "no refid given"}')
sys.exit(0)
cn=openDb('doxygen_sqlite3.db')
j = processHref(cn,ref)
- print json.dumps({"result":j,"error":None})
+ print(json.dumps({"result":j,"error":None}))
###############################################################################
def usage():
- print >>sys.stderr,"""Usage: search.py [Options]
+ sys.stderr.write("""Usage: search.py [Options]
Options:
-h, --help
-d <D> Use database <D> for queries.
@@ -323,7 +326,7 @@ Options:
-M <C> Get all members of class <C>.
-S <C> Get the sub classes of class <C>.
-R Consider the search <term> to be a regex.
-"""
+""")
###############################################################################
def serveCli(argv):
try:
@@ -362,6 +365,8 @@ def serveCli(argv):
elif a in ('-f'):
kind=MemberType.Function
elif a in ('-F'):
+ # undocumented
+ # seems to fit with the lower case "search" patterns?
kind=MemberType.File
elif a in ('-m'):
kind=MemberType.Define
@@ -370,6 +375,7 @@ def serveCli(argv):
elif a in ('-v'):
kind=MemberType.Variable
elif a in ('-H'):
+ # undocumented
ref = o
cn=openDb(dbname)
@@ -378,7 +384,7 @@ def serveCli(argv):
j=processHref(cn,ref)
else:
j=process(f,kind)
- print json.dumps(j,indent=4)
+ print(json.dumps(j,indent=4))
def main(argv):
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
index 492912b..4e0d1aa 100755
--- a/addon/doxywizard/doxywizard.cpp
+++ b/addon/doxywizard/doxywizard.cpp
@@ -267,7 +267,7 @@ void MainWindow::saveConfig(const QString &fileName)
{
if (fileName.isEmpty()) return;
QFile f(fileName);
- if (!f.open(QIODevice::WriteOnly))
+ if (!f.open(QIODevice::WriteOnly | QIODevice::Text ))
{
QMessageBox::warning(this,
tr("Error saving"),
diff --git a/addon/doxywizard/expert.cpp b/addon/doxywizard/expert.cpp
index 66a0955..44dea78 100644
--- a/addon/doxywizard/expert.cpp
+++ b/addon/doxywizard/expert.cpp
@@ -765,9 +765,10 @@ void Expert::saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,
t << convertToComment(option->templateDocs());
t << endl;
}
- t << name.leftJustified(MAX_OPTION_LENGTH) << "= ";
- if (option)
+ t << name.leftJustified(MAX_OPTION_LENGTH) << "=";
+ if (option && !option->isEmpty())
{
+ t << " ";
option->writeValue(t,codec);
}
t << endl;
diff --git a/addon/doxywizard/images/tunecolor.png b/addon/doxywizard/images/tunecolor.png
index 4c7dd9d..9e595e4 100755
--- a/addon/doxywizard/images/tunecolor.png
+++ b/addon/doxywizard/images/tunecolor.png
Binary files differ
diff --git a/addon/doxywizard/input.h b/addon/doxywizard/input.h
index 9e0a1bf..5d86cc8 100644
--- a/addon/doxywizard/input.h
+++ b/addon/doxywizard/input.h
@@ -30,6 +30,7 @@ class Input
virtual void reset() = 0;
virtual void writeValue(QTextStream &t,QTextCodec *codec) = 0;
virtual void setTemplateDocs(const QString &docs) = 0;
+ virtual bool isEmpty() { return false; };
};
diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h
index dba31f6..6234256 100644
--- a/addon/doxywizard/inputstring.h
+++ b/addon/doxywizard/inputstring.h
@@ -60,6 +60,7 @@ class InputString : public QObject, public Input
void updateDependencies() {}
void writeValue(QTextStream &t,QTextCodec *codec);
void setTemplateDocs(const QString &docs) { m_tdocs = docs; }
+ bool isEmpty() { return m_str.isEmpty(); }
public slots:
void reset();
diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp
index 660ce40..822bc4c 100644
--- a/addon/doxywizard/inputstrlist.cpp
+++ b/addon/doxywizard/inputstrlist.cpp
@@ -260,3 +260,11 @@ void InputStrList::writeValue(QTextStream &t,QTextCodec *codec)
}
}
+bool InputStrList::isEmpty()
+{
+ foreach (QString s, m_strList)
+ {
+ if (!s.isEmpty()) return false;
+ }
+ return true;
+}
diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h
index 53f3bcc..c374092 100644
--- a/addon/doxywizard/inputstrlist.h
+++ b/addon/doxywizard/inputstrlist.h
@@ -55,6 +55,7 @@ class InputStrList : public QObject, public Input
void updateDependencies() {}
void writeValue(QTextStream &t,QTextCodec *codec);
void setTemplateDocs(const QString &docs) { m_tdocs = docs; }
+ bool isEmpty();
public slots:
void reset();
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..61cb2e8
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,59 @@
+image: Visual Studio 2017
+
+configuration:
+ - Release
+ - Debug
+
+platform:
+ - x64
+ - Win32
+
+environment:
+ # VS VERSION IN CMAKE STYLE
+ matrix:
+ - VSVERSION: "15 2017"
+ - VSVERSION: "14 2015"
+
+init:
+ - cmake --version
+ - perl --version
+ - msbuild /version
+
+install:
+ - ps: Invoke-WebRequest http://doxygen.nl/testing/miktex.zip -OutFile miktex.zip
+ - 7z x miktex.zip -oC:\deps\miktex
+# Disabled MikTeX installed due to unreliable download
+# - ps: Invoke-WebRequest https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs924/gs924w32.exe -OutFile gswin32c.exe
+# - gswin32c /S /D=C:\deps\ghostscript
+# - ps: if($env:platform -eq "x64") { Invoke-WebRequest https://miktex.org/download/win/miktexsetup-x64.zip -OutFile miktexsetup.zip }
+# - ps: if($env:platform -eq "Win32") { Invoke-WebRequest https://miktex.org/download/win/miktexsetup-x86.zip -OutFile miktexsetup.zip }
+# - 7z x miktexsetup.zip -oC:\tmpmiktex
+# - C:\tmpmiktex\miktexsetup --local-package-repository=C:\temp\miktex --package-set=basic download
+# - C:\tmpmiktex\miktexsetup --verbose --local-package-repository=C:\temp\miktex --package-set=basic install
+ - refreshenv
+ - pip install conan
+ - ps: |
+ "[requires]
+ libxml2/2.9.8@bincrafters/stable
+ winflexbison/2.5.16@bincrafters/stable" | Out-File -Encoding ASCII -FilePath conanfile.txt
+ - conan install . -g virtualrunenv --build missing
+ - activate_run.bat
+ - set "PATH=%PATH%;C:\deps\ghostscript\bin;C:\deps\miktex\miktex\bin"
+
+before_build:
+ - if "%platform%"=="Win32" ( set "CMAKE_GENERATOR_NAME=Visual Studio %VSVERSION%" )
+ - if "%platform%"=="x64" ( set "CMAKE_GENERATOR_NAME=Visual Studio %VSVERSION% Win64")
+ - mkdir build
+ - cd build
+ - cmake -G "%CMAKE_GENERATOR_NAME%" ..
+
+build:
+ project: "build\\PACKAGE.vcxproj"
+ parallel: false
+
+test_script:
+ - msbuild "testing\tests.vcxproj" /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
+# Disabled building document due to unreliable MikTeX installation
+# - cmake -G "%CMAKE_GENERATOR_NAME%" -D build_doc=ON ..
+ - cmake -G "%CMAKE_GENERATOR_NAME%" ..
+# - msbuild "doc\docs.vcxproj" /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
diff --git a/cmake/FindSQLite3.cmake b/cmake/FindSQLite3.cmake
index 77b8eb4..45cc212 100644
--- a/cmake/FindSQLite3.cmake
+++ b/cmake/FindSQLite3.cmake
@@ -71,8 +71,16 @@ else (SQLITE3_LIBRARIES AND SQLITE3_INCLUDE_DIRS)
endif (SQLITE3_INCLUDE_DIRS AND SQLITE3_LIBRARIES)
if (SQLITE3_FOUND)
+
+ # Extract version from header file
+ find_file(SQLITE3_HEADER "sqlite3.h" HINTS ${SQLITE3_INCLUDE_DIRS})
+ if(SQLITE3_HEADER)
+ file(STRINGS "${SQLITE3_HEADER}" _DEF_TMP REGEX "^#define SQLITE_VERSION +\\\"[^\\\"]+\\\"")
+ string (REGEX REPLACE ".*\\\"(([0-9]+[.]?)+).*" "\\1" SQLITE3_VERSION "${_DEF_TMP}")
+ endif (SQLITE3_HEADER)
+
if (NOT Sqlite3_FIND_QUIETLY)
- message(STATUS "Found Sqlite3: ${SQLITE3_LIBRARIES}")
+ message(STATUS "Found Sqlite3: ${SQLITE3_LIBRARIES} (found version \"${SQLITE3_VERSION}\")")
endif (NOT Sqlite3_FIND_QUIETLY)
else (SQLITE3_FOUND)
if (Sqlite3_FIND_REQUIRED)
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index b95afd8..448646f 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -27,6 +27,17 @@ else()
# doxygen project variables are unknown so look for doxygen in PATH
find_package(Doxygen)
endif()
+#
+# set output directory for some extra HTML files
+#
+file(STRINGS Doxyfile DOXY_HTML_OUTPUT REGEX "HTML_OUTPUT.*")
+string(LENGTH "${DOXY_HTML_OUTPUT}" DOXY_HTML_OUTPUT_LEN)
+if (${DOXY_HTML_OUTPUT_LEN})
+ string(REGEX REPLACE ".*HTML_OUTPUT *= *\([^ ]*\)" "\\1" DOXY_HTML_OUTPUT ${DOXY_HTML_OUTPUT})
+else()
+ set(DOXY_HTML_OUTPUT "html")
+endif()
+set(PROJECT_BINARY_HTML_DIR ${PROJECT_BINARY_DIR}/${DOXY_HTML_OUTPUT}/)
set(DOC_INSTALL_DIR "share/doc/packages/doxygen" CACHE STRING "Relative path where to install the documentation")
set(DOC_FILES
@@ -80,9 +91,11 @@ set(DOC_FILES
starting.doc
trouble.doc
xmlcmds.doc
+ emojisup.doc
language.tpl
maintainers.txt
translator.py
+ smile.png
)
file(GLOB LANG_FILES "${TOP}/src/translator_??.h")
@@ -113,7 +126,7 @@ configure_file(${CMAKE_SOURCE_DIR}/doc/doxyindexer.1 ${PROJECT_BINARY_DIR}/
# doc/language.doc (see tag Doxyfile:INPUT)
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} translator.py
+ COMMAND ${PYTHON_EXECUTABLE} translator.py ${CMAKE_SOURCE_DIR}
DEPENDS ${PROJECT_BINARY_DIR}/doc/maintainers.txt ${PROJECT_BINARY_DIR}/doc/language.tpl ${PROJECT_BINARY_DIR}/doc/translator.py
OUTPUT language.doc
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/doc
@@ -152,8 +165,8 @@ add_custom_target(doxygen_pdf
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/latex
)
add_custom_target(docs
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/doxygen_logo.gif ${PROJECT_BINARY_DIR}/html/
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/doxygen_logo_low.gif ${PROJECT_BINARY_DIR}/html/
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/doxygen_logo.gif ${PROJECT_BINARY_HTML_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/doxygen_logo_low.gif ${PROJECT_BINARY_HTML_DIR}
DEPENDS ${PROJECT_BINARY_DIR}/man/doxygen.1
${PROJECT_BINARY_DIR}/man/doxywizard.1
${PROJECT_BINARY_DIR}/man/doxysearch.1
diff --git a/doc/Doxyfile b/doc/Doxyfile
index ceb6385..4c0a19d 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -38,7 +38,7 @@ INPUT = index.doc install.doc starting.doc docblocks.doc markdown.do
autolink.doc output.doc searching.doc extsearch.doc customize.doc custcmd.doc \
external.doc faq.doc trouble.doc features.doc \
doxygen_usage.doc doxywizard_usage.doc \
- config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \
+ config.doc commands.doc htmlcmds.doc xmlcmds.doc emojisup.doc language.doc \
perlmod.doc perlmod_tree.doc arch.doc changelog.doc
FILE_PATTERNS = *.cpp *.h *.doc
EXAMPLE_PATH = ../examples
@@ -55,3 +55,4 @@ ALIASES = LaTeX="\f$\mbox{\LaTeX}\f$"
ALIASES += TeX="\f$\mbox{\TeX}\f$"
LATEX_BATCHMODE = YES
LATEX_EXTRA_STYLESHEET = manual.sty
+LATEX_EMOJI_DIRECTORY = ../doc
diff --git a/doc/arch.doc b/doc/arch.doc
index ed9d579..bd51a1b 100644
--- a/doc/arch.doc
+++ b/doc/arch.doc
@@ -248,7 +248,21 @@ Note that by running doxygen with `-d lex` you get information about which
<h3>Testing</h3>
Doxygen has a small set of tests available to test, some, code integrity.
-The tests can be run by means of the command `make tests`. When only one or a few tests are required one can set the variable \c TEST_FLAGS when running the test e.g. `make TEST_FLAGS="--id 5" tests` or for multiple tests `make TEST_FLAGS="--id 5 --id 7" tests`.
+The tests can be run by means of the command `make tests`. When only one or a
+few tests are required one can set the variable \c TEST_FLAGS when running the
+test e.g. `make TEST_FLAGS="--id 5" tests` or for multiple tests
+`make TEST_FLAGS="--id 5 --id 7" tests`. For a full set of possibilities give the
+command `make TEST_FLAGS="--help" tests`. It is also possible to specify the
+`TEST_FLAGS` as an environment variable (works also for testing through Visual
+Studio projects), e.g. `setenv TEST_FLAGS "--id 5 --id 7"` and `make tests`.
+
+<h3>Doxyfile differences</h3>
+
+In case one has to communicate through e.g. a forum the configuration settings that
+are different from the standard doxygen configuration file settings one can run the
+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).
\htmlonly
Return to the <a href="index.html">index</a>.
diff --git a/doc/autolink.doc b/doc/autolink.doc
index ff468e4..bf9fe57 100644
--- a/doc/autolink.doc
+++ b/doc/autolink.doc
@@ -80,7 +80,7 @@
are required to identify the target, i.e. 'func(int) const' and 'func(int)'
target different member functions.
\par Note 3:
- For JavaDoc compatibility a \# may be used instead of a :: in
+ For Javadoc compatibility a \# may be used instead of a :: in
the patterns above.
\par Note 4:
In the documentation of a class containing a member foo,
diff --git a/doc/changelog.doc b/doc/changelog.doc
index 0b245b6..bcbfe44 100644
--- a/doc/changelog.doc
+++ b/doc/changelog.doc
@@ -8,123 +8,123 @@
<a name="1.8.14"></a>
</p>
<ul>
-<li>Add language type attribute to programlisting tag [<a href="http://github.com/doxygen/doxygen/commit/141dbfd5a4f79c98da14a1b414c6db4e1b34618b">view</a>]
-<li>Add links behind nav entries &quot;Namespaces&quot; and &quot;Files&quot; (matching &quot;Classes&quot;) [<a href="http://github.com/doxygen/doxygen/commit/464919adf1cdae9057ff840f40c60472b4c30bfd">view</a>]
-<li>Allow case insensitive file pattern matching based on CASE_SENSE_NAMES [<a href="http://github.com/doxygen/doxygen/commit/bd759f9a3aa4096bc8574ea45ad6b23fed830742">view</a>]
-<li>Async load of mathjax javascript [<a href="http://github.com/doxygen/doxygen/commit/340e516dbf5efd3ae21d964e92369e97b252e4ab">view</a>]
-<li>Avoid generating unused dir_* output files for non HTML output formats [<a href="http://github.com/doxygen/doxygen/commit/38987846ec0752b8deee7bab69c7890aa861af00">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3138">3138</a> - Wrong spacing in function names with french language (latex output) [<a href="http://github.com/doxygen/doxygen/commit/9d478d2fedd091ceac8e689507676292f5455882">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4289">4289</a> - does ALIAS work for VHDL code? [<a href="http://github.com/doxygen/doxygen/commit/05364c46f806e73cce76be37a6a31230d0468507">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5468">5468</a> - (UnFriendlyTemplate) Spurious warning when documenting friend template [<a href="http://github.com/doxygen/doxygen/commit/2fe7bc7f1df9a2483355b0743b5e0455aaccc969">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5525">5525</a> - parser misinterpreting fortran [<a href="http://github.com/doxygen/doxygen/commit/747fc768476aef8b8b70fdd78749702a410dcd29">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5724">5724</a> - Duplicate attribute (target=&quot;_top&quot; target=&quot;_top&quot;) generated in .SVG files [<a href="http://github.com/doxygen/doxygen/commit/97bfbfa6c4d4eb07ac8c60545086c3370e9683b8">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6128">6128</a> - Usage of underscore&#39;s in parameter names [<a href="http://github.com/doxygen/doxygen/commit/c10af45c61a1f9b25c514f397ace16c94cc7c8df">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6135">6135</a> - [1.8.13 Regression] Segfault building the breathe docs [<a href="http://github.com/doxygen/doxygen/commit/0f02761a158a5e9ddbd5801682482af8986dbc35">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6137">6137</a> - XML Parsing Error for operator&lt;&lt; methods when outputting to XHTML [<a href="http://github.com/doxygen/doxygen/commit/0e8530e42b69c909ef2c26468b24dfb88cc0997f">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6139">6139</a> - Menu does not work without Javascript [<a href="http://github.com/doxygen/doxygen/commit/1be97720b7820361e85242d08d4cac3e46570bfe">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6141">6141</a> - Too greedy behavior of @ref const matching [<a href="http://github.com/doxygen/doxygen/commit/04001c8926fb0f37dfcf284b3637b182125bba75">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6169">6169</a> - doxygen build fails [<a href="http://github.com/doxygen/doxygen/commit/bb5c8dd29782ecbb05a4ef9788f2507e9a156848">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6170">6170</a> - Add &quot;\~&quot; command to internatioalization article [<a href="http://github.com/doxygen/doxygen/commit/e204b982eebd54bd15148a520da6608935e33e50">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6223">6223</a> - Problem RTF output: The class list &quot;classes&quot; within the namespace report is wrong indicated. [<a href="http://github.com/doxygen/doxygen/commit/753c06281f6b2e9172c449157fc9f863063232e3">view</a>]
+<li>Add language type attribute to programlisting tag [<a href="http://github.com/doxygen/doxygen/commit/141dbfd5a4f79c98da14a1b414c6db4e1b34618b">view</a>]</li>
+<li>Add links behind nav entries &quot;Namespaces&quot; and &quot;Files&quot; (matching &quot;Classes&quot;) [<a href="http://github.com/doxygen/doxygen/commit/464919adf1cdae9057ff840f40c60472b4c30bfd">view</a>]</li>
+<li>Allow case insensitive file pattern matching based on CASE_SENSE_NAMES [<a href="http://github.com/doxygen/doxygen/commit/bd759f9a3aa4096bc8574ea45ad6b23fed830742">view</a>]</li>
+<li>Async load of mathjax javascript [<a href="http://github.com/doxygen/doxygen/commit/340e516dbf5efd3ae21d964e92369e97b252e4ab">view</a>]</li>
+<li>Avoid generating unused dir_* output files for non HTML output formats [<a href="http://github.com/doxygen/doxygen/commit/38987846ec0752b8deee7bab69c7890aa861af00">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/3138">3138</a> - Wrong spacing in function names with french language (latex output) [<a href="http://github.com/doxygen/doxygen/commit/9d478d2fedd091ceac8e689507676292f5455882">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4289">4289</a> - does ALIAS work for VHDL code? [<a href="http://github.com/doxygen/doxygen/commit/05364c46f806e73cce76be37a6a31230d0468507">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5468">5468</a> - (UnFriendlyTemplate) Spurious warning when documenting friend template [<a href="http://github.com/doxygen/doxygen/commit/2fe7bc7f1df9a2483355b0743b5e0455aaccc969">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5525">5525</a> - parser misinterpreting fortran [<a href="http://github.com/doxygen/doxygen/commit/747fc768476aef8b8b70fdd78749702a410dcd29">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5724">5724</a> - Duplicate attribute (target=&quot;_top&quot; target=&quot;_top&quot;) generated in .SVG files [<a href="http://github.com/doxygen/doxygen/commit/97bfbfa6c4d4eb07ac8c60545086c3370e9683b8">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6128">6128</a> - Usage of underscore&#39;s in parameter names [<a href="http://github.com/doxygen/doxygen/commit/c10af45c61a1f9b25c514f397ace16c94cc7c8df">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6135">6135</a> - [1.8.13 Regression] Segfault building the breathe docs [<a href="http://github.com/doxygen/doxygen/commit/0f02761a158a5e9ddbd5801682482af8986dbc35">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6137">6137</a> - XML Parsing Error for operator&lt;&lt; methods when outputting to XHTML [<a href="http://github.com/doxygen/doxygen/commit/0e8530e42b69c909ef2c26468b24dfb88cc0997f">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6139">6139</a> - Menu does not work without Javascript [<a href="http://github.com/doxygen/doxygen/commit/1be97720b7820361e85242d08d4cac3e46570bfe">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6141">6141</a> - Too greedy behavior of @ref const matching [<a href="http://github.com/doxygen/doxygen/commit/04001c8926fb0f37dfcf284b3637b182125bba75">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6169">6169</a> - doxygen build fails [<a href="http://github.com/doxygen/doxygen/commit/bb5c8dd29782ecbb05a4ef9788f2507e9a156848">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6170">6170</a> - Add &quot;\~&quot; command to internatioalization article [<a href="http://github.com/doxygen/doxygen/commit/e204b982eebd54bd15148a520da6608935e33e50">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6223">6223</a> - Problem RTF output: The class list &quot;classes&quot; within the namespace report is wrong indicated. [<a href="http://github.com/doxygen/doxygen/commit/753c06281f6b2e9172c449157fc9f863063232e3">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6238">6238</a> - parsing error in Fortran file with preprocessing [<a href="http://github.com/doxygen/doxygen/commit/2f5e22a4be9d237a150d04659bf6abec1349fbd9">view</a>]
-, [<a href="http://github.com/doxygen/doxygen/commit/ec12eb659d8c8e78ad4bb15d1a941ac3153a0f66">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6259">6259</a> - Problem parsing c++ gnu::visibility [<a href="http://github.com/doxygen/doxygen/commit/d8001efd89146e04d92f5ea41ab27a7de09b6c53">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6262">6262</a> - C++: False warning message when inheriting class from tag file [<a href="http://github.com/doxygen/doxygen/commit/aac84d5624b96d8937ff543ab8724c269b8726ab">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6273">6273</a> - Error in markdown emphasis examples [<a href="http://github.com/doxygen/doxygen/commit/81956108f2e6e97bf4dd0f1011fcae1b5c4c4408">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6277">6277</a> - Increasing access of inherited C++ members with &#39;using...&#39; is not recognized by Doxygen [<a href="http://github.com/doxygen/doxygen/commit/9468ede259153cf79eb8d61635389744e9a2ee7d">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6286">6286</a> - C++ parameter from lambda not recognized [<a href="http://github.com/doxygen/doxygen/commit/7b43be09e513ea6f86f9ca53ce05c94d63eada4c">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6290">6290</a> - Doxygen not showing the public, non-static member function [<a href="http://github.com/doxygen/doxygen/commit/137b2e8dd03a98e692c2f6d813b47f19f2c64e5b">view</a>]
-<li>CMake: avoid if() around the whole contents of documentation CMakeLists.txt [<a href="http://github.com/doxygen/doxygen/commit/62e87408cb7094eeac130775e62d5b7a6f4a79c9">view</a>]
-<li>CMake: avoid if() around the whole contents of plugin CMakeLists.txt [<a href="http://github.com/doxygen/doxygen/commit/7c1c75a2c5583415d178e0e46a1a356bef9b0c84">view</a>]
-<li>CMake: let CMake handle the C++ standard setting if target_compile_features() is used [<a href="http://github.com/doxygen/doxygen/commit/ca7e60edd370949cfb2adb83ca0b532bb3fdc441">view</a>]
-<li>CMake: let file(MAKE_DIRECTORY) create all directories at once [<a href="http://github.com/doxygen/doxygen/commit/0d7be027a6fea2ac198dded58f8b55cda1bbe962">view</a>]
-<li>CMake: remove CUSTOM_(LINK|INCLUDE)_DIR [<a href="http://github.com/doxygen/doxygen/commit/28f09783b1e45a827729abaca61f963dd869381b">view</a>]
-<li>CMake: remove needless variable expansions [<a href="http://github.com/doxygen/doxygen/commit/975fb19eb07bc65ef48ddd5f26bf6be2736d0e0a">view</a>]
-<li>CMake: remove unused program searching [<a href="http://github.com/doxygen/doxygen/commit/02f726b63e2b3a2ed4c5da43c164dcaad5fcfe94">view</a>]
-<li>CMake: search for Qt5 only in config file mode [<a href="http://github.com/doxygen/doxygen/commit/ac5ca4ef86ad50232be75a65fab99302307b7795">view</a>]
-<li>CMake: use GNUInstallDirs module for man pages directory [<a href="http://github.com/doxygen/doxygen/commit/fcf5fecb64d5c194430e10cbe52482b14224d645">view</a>]
-<li>CMake: use add_test to create a test [<a href="http://github.com/doxygen/doxygen/commit/b54b843accb97105ae4afaf24136e33bfd1ea9d4">view</a>]
-<li>CMakeLists: Avoid MSVC iconv changes for MinGW builds [<a href="http://github.com/doxygen/doxygen/commit/9532e0f19532e9d76c3f1092d131af91125a2dff">view</a>]
-<li>Call endMemberItem consistently. [<a href="http://github.com/doxygen/doxygen/commit/1aafbbc97bdb643cae8be036f2b9ab569ca7f15e">view</a>]
-<li>Change navtree collapsed list icon [<a href="http://github.com/doxygen/doxygen/commit/b3869a3ed82957c1785dc955876885f8b73a020b">view</a>]
-<li>Code color of , (comma) together with only in use statement [<a href="http://github.com/doxygen/doxygen/commit/6f7264f4a16f5b1240291c6d33a0e4cc98ba30e4">view</a>]
-<li>Corrected small type [<a href="http://github.com/doxygen/doxygen/commit/4360982dbaee9b32973a95ba88290022d0643e10">view</a>]
-<li>Correction display of backtick in LaTeX [<a href="http://github.com/doxygen/doxygen/commit/beaa386ca97341e66ad673660c808993240df637">view</a>]
-<li>Correction of non reachable links and redirected links in documentation. [<a href="http://github.com/doxygen/doxygen/commit/31cf78d223e52fe078ad9b0651672aeb73926065">view</a>]
-<li>Documentation, correct referenced file [<a href="http://github.com/doxygen/doxygen/commit/c93a7c34e7efd5ae1f2c3e4d230e29a333bc237a">view</a>]
-<li>Doxygen/VHDLdocgen: [<a href="http://github.com/doxygen/doxygen/commit/77e0cf86eadbec22b81e26e083ffc831240869da">view</a>]
-<li>Encode invalid XML characters instead of skipping them. [<a href="http://github.com/doxygen/doxygen/commit/b6a7abf02652b74872b9c676fcfa545e18d9bde7">view</a>]
-<li>Expose TOC placeholder in XML output. [<a href="http://github.com/doxygen/doxygen/commit/fe760977e2cb643b94fbf21847e0c81e8a080966">view</a>]
-<li>Expose underlying enum type in the XML output. [<a href="http://github.com/doxygen/doxygen/commit/17bceb8f4580535de52d19e8cadf0d088f972bef">view</a>]
-<li>Fetch filename property from object instead of hardcoded duplicated string [<a href="http://github.com/doxygen/doxygen/commit/84fd1fecfe2de7b4f8c88e1923ef7d5958dc70b0">view</a>]
-<li>Fix C# property initializer parsing [<a href="http://github.com/doxygen/doxygen/commit/14a0bcc74a121525917aefc8c9034e283e94884b">view</a>]
-<li>Fix for regression in XML output generation after fixing bug 789168 [<a href="http://github.com/doxygen/doxygen/commit/1a1fdbed64de6ce01959b2e4d0988be823fb6bad">view</a>]
-<li>Fix <a href="https://github.com/doxygen/doxygen/issues/6210">6210</a>. [<a href="http://github.com/doxygen/doxygen/commit/c87f730fe4bc40f72ed5fa52fe032a7bdf2d549c">view</a>]
-<li>Fix minor markup issue in the documentation. [<a href="http://github.com/doxygen/doxygen/commit/b4df85466cf0447d46f311046fc5b3fe062b957f">view</a>]
-<li>Fix not initialized pointer when parser is starting on a new file. [<a href="http://github.com/doxygen/doxygen/commit/52fb4cd5bb085960476e0cd256cc81db1370839d">view</a>]
-<li>Fix typo [<a href="http://github.com/doxygen/doxygen/commit/d6e9db71645d895450993972ed41406c1cf1fc52">view</a>]
-<li>Fix: add missing newline char &#39;\n&#39; [<a href="http://github.com/doxygen/doxygen/commit/856a43cfe08179ebbcebe656262b0229925547c8">view</a>]
-<li>Fix: add missing semicolon &#39;;&#39; at end of line [<a href="http://github.com/doxygen/doxygen/commit/507880a0c7ed6029ce7ede2e85d23a9650a3f6bf">view</a>]
-<li>Fix: change &#39;CMakefiles&#39; to &#39;CMakeFiles&#39; (the &#39;F&#39; is uppercase) [<a href="http://github.com/doxygen/doxygen/commit/bcc09aa2ba01eff458a00aff853d58ed8213a5da">view</a>]
-<li>Fix: perl script regexp to toggle flex debug information [<a href="http://github.com/doxygen/doxygen/commit/b11b19badf4ef7318512c28f448dbecd6a47a715">view</a>]
-<li>Fixed problem where automatic line breaking caused missing vertical bars in the parameter table for Latex output. [<a href="http://github.com/doxygen/doxygen/commit/5fc82b2275e202438ac61b070ac5f4be0df792d6">view</a>]
-<li>Fixes for cross platform build with new LLVM/CLANG version [<a href="http://github.com/doxygen/doxygen/commit/b0aae61c97966cb9d424b500d7ced5bdf500d8db">view</a>]
-<li>Fixup man page NAME section when page has title [<a href="http://github.com/doxygen/doxygen/commit/9d0908359363dbb43236767669c214721700acf7">view</a>]
-<li>Function declaration following a function definition incorrectly listed as calling dependencing [<a href="http://github.com/doxygen/doxygen/commit/436fc7ed1158d517dd6f6d25aa3e05568f8c3d94">view</a>]
-<li>Further cleanup of lodepng code [<a href="http://github.com/doxygen/doxygen/commit/c627108f3315144f5d9fb84d0197502b939caf7d">view</a>]
-<li>Implement &quot;double-space line breaks&quot; syntax in Markdown [<a href="http://github.com/doxygen/doxygen/commit/e4596c7eab90ba4d307e2c212cefeab8ac820269">view</a>]
-<li>Improve Chinese translation [<a href="http://github.com/doxygen/doxygen/commit/ded5247523ec8d47129405df3999ce391cca9e2d">view</a>]
-<li>Inline attribute got reset for functions returning an explicit struct type [<a href="http://github.com/doxygen/doxygen/commit/127a43d464790dd0312794fe7ae1d92247cd9eef">view</a>]
-<li>Isolated none-existing posix threading functions on Android [<a href="http://github.com/doxygen/doxygen/commit/4e25f081847cf2717ad561214e90d9750da5a511">view</a>]
-<li>Marks JS as freely licensed [<a href="http://github.com/doxygen/doxygen/commit/6b5617e5a4c87afd2c7f2f7b8cb03de2b6735627">view</a>]
-<li>Misc. doxy and comment typos [<a href="http://github.com/doxygen/doxygen/commit/1764f7a0f199b9f2a85f885cfd0f1804f8292c49">view</a>]
-<li>Misc. typos [<a href="http://github.com/doxygen/doxygen/commit/9fd7f3aeb4c2e78bda669bf4ef6fff1c12c062a4">view</a>]
-<li>New table features mentioned in the documentation were not enabled. [<a href="http://github.com/doxygen/doxygen/commit/c120ac4762331513305e8a19fd9b267b2d4f9e41">view</a>]
-<li>Pass strings as const references. [<a href="http://github.com/doxygen/doxygen/commit/ebf75c1fe8a0ff2cc9235155b6d63367944d6342">view</a>]
-<li>Physical newlines in ALIASES configuration tags. [<a href="http://github.com/doxygen/doxygen/commit/d6801c4c5eaeebc5e14f5d1cd7c312ad82c1dbbd">view</a>]
-<li>Propagate language information to all &lt;programlisting&gt; XML elements. [<a href="http://github.com/doxygen/doxygen/commit/eaf8edbac7e6a1873aa5c4ff0df063cd367351d6">view</a>]
-<li>Properly copy images for the XML output. [<a href="http://github.com/doxygen/doxygen/commit/507dd0a60dd12c61ff2088db419187efc928c010">view</a>]
-<li>Provide dot path to plantuml [<a href="http://github.com/doxygen/doxygen/commit/c24cb9a74ef0af854455047f29f9925d79ac0195">view</a>]
-<li>Provide information about enum type &quot;strongness&quot; in the XML output. [<a href="http://github.com/doxygen/doxygen/commit/169cad806ea795e5c425fd397aa0de54cbc0a81e">view</a>]
-<li>Provide page brief in &lt;briefdescription&gt; of XML output. [<a href="http://github.com/doxygen/doxygen/commit/bd2cf98e75c600e0c2f5ae95301df8745d65571a">view</a>]
-<li>Provide template parameters also for type aliases in the XML output. [<a href="http://github.com/doxygen/doxygen/commit/21f0ca0085c034a37df07c1ab690472bada0a1f1">view</a>]
-<li>Removed -Wno-deprecated flag from bison as it is not support on the bison 2.3 that ships with XCode [<a href="http://github.com/doxygen/doxygen/commit/6c288bf0e7548117aa358719aaecffedcc579590">view</a>]
-<li>Restore &#39;make tests&#39; rule [<a href="http://github.com/doxygen/doxygen/commit/7ce59c9fbd5e99619a9ab0ac6177d21e6aca49c7">view</a>]
-<li>Restore Makefile in vhdlparser dir [<a href="http://github.com/doxygen/doxygen/commit/aee944fe954de993a4273fafef6b5f0c726be7f3">view</a>]
-<li>Spelling correction [<a href="http://github.com/doxygen/doxygen/commit/4cca51612a50a9016be5adbd6ccdc26c03d12b58">view</a>]
-<li>Stripped unused LodePNG code to prevent false positives for coverity [<a href="http://github.com/doxygen/doxygen/commit/64865ad3e91fffe6e50b51b29ae2a54126f80126">view</a>]
-<li>Suppresses warning for XML &lt;see langword=&quot;...&quot;/&gt; [<a href="http://github.com/doxygen/doxygen/commit/a3c5958b437b5dc9de91de5f40917ec53532b60a">view</a>]
-<li>Suppression warnings about deprecated directive [<a href="http://github.com/doxygen/doxygen/commit/cd0faad90e9b6ce83fa1f7b4fb27a39357b0cae3">view</a>]
+, [<a href="http://github.com/doxygen/doxygen/commit/ec12eb659d8c8e78ad4bb15d1a941ac3153a0f66">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6259">6259</a> - Problem parsing c++ gnu::visibility [<a href="http://github.com/doxygen/doxygen/commit/d8001efd89146e04d92f5ea41ab27a7de09b6c53">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6262">6262</a> - C++: False warning message when inheriting class from tag file [<a href="http://github.com/doxygen/doxygen/commit/aac84d5624b96d8937ff543ab8724c269b8726ab">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6273">6273</a> - Error in markdown emphasis examples [<a href="http://github.com/doxygen/doxygen/commit/81956108f2e6e97bf4dd0f1011fcae1b5c4c4408">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6277">6277</a> - Increasing access of inherited C++ members with &#39;using...&#39; is not recognized by Doxygen [<a href="http://github.com/doxygen/doxygen/commit/9468ede259153cf79eb8d61635389744e9a2ee7d">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6286">6286</a> - C++ parameter from lambda not recognized [<a href="http://github.com/doxygen/doxygen/commit/7b43be09e513ea6f86f9ca53ce05c94d63eada4c">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6290">6290</a> - Doxygen not showing the public, non-static member function [<a href="http://github.com/doxygen/doxygen/commit/137b2e8dd03a98e692c2f6d813b47f19f2c64e5b">view</a>]</li>
+<li>CMake: avoid if() around the whole contents of documentation CMakeLists.txt [<a href="http://github.com/doxygen/doxygen/commit/62e87408cb7094eeac130775e62d5b7a6f4a79c9">view</a>]</li>
+<li>CMake: avoid if() around the whole contents of plugin CMakeLists.txt [<a href="http://github.com/doxygen/doxygen/commit/7c1c75a2c5583415d178e0e46a1a356bef9b0c84">view</a>]</li>
+<li>CMake: let CMake handle the C++ standard setting if target_compile_features() is used [<a href="http://github.com/doxygen/doxygen/commit/ca7e60edd370949cfb2adb83ca0b532bb3fdc441">view</a>]</li>
+<li>CMake: let file(MAKE_DIRECTORY) create all directories at once [<a href="http://github.com/doxygen/doxygen/commit/0d7be027a6fea2ac198dded58f8b55cda1bbe962">view</a>]</li>
+<li>CMake: remove CUSTOM_(LINK|INCLUDE)_DIR [<a href="http://github.com/doxygen/doxygen/commit/28f09783b1e45a827729abaca61f963dd869381b">view</a>]</li>
+<li>CMake: remove needless variable expansions [<a href="http://github.com/doxygen/doxygen/commit/975fb19eb07bc65ef48ddd5f26bf6be2736d0e0a">view</a>]</li>
+<li>CMake: remove unused program searching [<a href="http://github.com/doxygen/doxygen/commit/02f726b63e2b3a2ed4c5da43c164dcaad5fcfe94">view</a>]</li>
+<li>CMake: search for Qt5 only in config file mode [<a href="http://github.com/doxygen/doxygen/commit/ac5ca4ef86ad50232be75a65fab99302307b7795">view</a>]</li>
+<li>CMake: use GNUInstallDirs module for man pages directory [<a href="http://github.com/doxygen/doxygen/commit/fcf5fecb64d5c194430e10cbe52482b14224d645">view</a>]</li>
+<li>CMake: use add_test to create a test [<a href="http://github.com/doxygen/doxygen/commit/b54b843accb97105ae4afaf24136e33bfd1ea9d4">view</a>]</li>
+<li>CMakeLists: Avoid MSVC iconv changes for MinGW builds [<a href="http://github.com/doxygen/doxygen/commit/9532e0f19532e9d76c3f1092d131af91125a2dff">view</a>]</li>
+<li>Call endMemberItem consistently. [<a href="http://github.com/doxygen/doxygen/commit/1aafbbc97bdb643cae8be036f2b9ab569ca7f15e">view</a>]</li>
+<li>Change navtree collapsed list icon [<a href="http://github.com/doxygen/doxygen/commit/b3869a3ed82957c1785dc955876885f8b73a020b">view</a>]</li>
+<li>Code color of , (comma) together with only in use statement [<a href="http://github.com/doxygen/doxygen/commit/6f7264f4a16f5b1240291c6d33a0e4cc98ba30e4">view</a>]</li>
+<li>Corrected small type [<a href="http://github.com/doxygen/doxygen/commit/4360982dbaee9b32973a95ba88290022d0643e10">view</a>]</li>
+<li>Correction display of backtick in LaTeX [<a href="http://github.com/doxygen/doxygen/commit/beaa386ca97341e66ad673660c808993240df637">view</a>]</li>
+<li>Correction of non reachable links and redirected links in documentation. [<a href="http://github.com/doxygen/doxygen/commit/31cf78d223e52fe078ad9b0651672aeb73926065">view</a>]</li>
+<li>Documentation, correct referenced file [<a href="http://github.com/doxygen/doxygen/commit/c93a7c34e7efd5ae1f2c3e4d230e29a333bc237a">view</a>]</li>
+<li>Doxygen/VHDLdocgen: [<a href="http://github.com/doxygen/doxygen/commit/77e0cf86eadbec22b81e26e083ffc831240869da">view</a>]</li>
+<li>Encode invalid XML characters instead of skipping them. [<a href="http://github.com/doxygen/doxygen/commit/b6a7abf02652b74872b9c676fcfa545e18d9bde7">view</a>]</li>
+<li>Expose TOC placeholder in XML output. [<a href="http://github.com/doxygen/doxygen/commit/fe760977e2cb643b94fbf21847e0c81e8a080966">view</a>]</li>
+<li>Expose underlying enum type in the XML output. [<a href="http://github.com/doxygen/doxygen/commit/17bceb8f4580535de52d19e8cadf0d088f972bef">view</a>]</li>
+<li>Fetch filename property from object instead of hardcoded duplicated string [<a href="http://github.com/doxygen/doxygen/commit/84fd1fecfe2de7b4f8c88e1923ef7d5958dc70b0">view</a>]</li>
+<li>Fix C# property initializer parsing [<a href="http://github.com/doxygen/doxygen/commit/14a0bcc74a121525917aefc8c9034e283e94884b">view</a>]</li>
+<li>Fix for regression in XML output generation after fixing bug 789168 [<a href="http://github.com/doxygen/doxygen/commit/1a1fdbed64de6ce01959b2e4d0988be823fb6bad">view</a>]</li>
+<li>Fix <a href="https://github.com/doxygen/doxygen/issues/6210">6210</a>. [<a href="http://github.com/doxygen/doxygen/commit/c87f730fe4bc40f72ed5fa52fe032a7bdf2d549c">view</a>]</li>
+<li>Fix minor markup issue in the documentation. [<a href="http://github.com/doxygen/doxygen/commit/b4df85466cf0447d46f311046fc5b3fe062b957f">view</a>]</li>
+<li>Fix not initialized pointer when parser is starting on a new file. [<a href="http://github.com/doxygen/doxygen/commit/52fb4cd5bb085960476e0cd256cc81db1370839d">view</a>]</li>
+<li>Fix typo [<a href="http://github.com/doxygen/doxygen/commit/d6e9db71645d895450993972ed41406c1cf1fc52">view</a>]</li>
+<li>Fix: add missing newline char &#39;\n&#39; [<a href="http://github.com/doxygen/doxygen/commit/856a43cfe08179ebbcebe656262b0229925547c8">view</a>]</li>
+<li>Fix: add missing semicolon &#39;;&#39; at end of line [<a href="http://github.com/doxygen/doxygen/commit/507880a0c7ed6029ce7ede2e85d23a9650a3f6bf">view</a>]</li>
+<li>Fix: change &#39;CMakefiles&#39; to &#39;CMakeFiles&#39; (the &#39;F&#39; is uppercase) [<a href="http://github.com/doxygen/doxygen/commit/bcc09aa2ba01eff458a00aff853d58ed8213a5da">view</a>]</li>
+<li>Fix: perl script regexp to toggle flex debug information [<a href="http://github.com/doxygen/doxygen/commit/b11b19badf4ef7318512c28f448dbecd6a47a715">view</a>]</li>
+<li>Fixed problem where automatic line breaking caused missing vertical bars in the parameter table for Latex output. [<a href="http://github.com/doxygen/doxygen/commit/5fc82b2275e202438ac61b070ac5f4be0df792d6">view</a>]</li>
+<li>Fixes for cross platform build with new LLVM/CLANG version [<a href="http://github.com/doxygen/doxygen/commit/b0aae61c97966cb9d424b500d7ced5bdf500d8db">view</a>]</li>
+<li>Fixup man page NAME section when page has title [<a href="http://github.com/doxygen/doxygen/commit/9d0908359363dbb43236767669c214721700acf7">view</a>]</li>
+<li>Function declaration following a function definition incorrectly listed as calling dependencing [<a href="http://github.com/doxygen/doxygen/commit/436fc7ed1158d517dd6f6d25aa3e05568f8c3d94">view</a>]</li>
+<li>Further cleanup of lodepng code [<a href="http://github.com/doxygen/doxygen/commit/c627108f3315144f5d9fb84d0197502b939caf7d">view</a>]</li>
+<li>Implement &quot;double-space line breaks&quot; syntax in Markdown [<a href="http://github.com/doxygen/doxygen/commit/e4596c7eab90ba4d307e2c212cefeab8ac820269">view</a>]</li>
+<li>Improve Chinese translation [<a href="http://github.com/doxygen/doxygen/commit/ded5247523ec8d47129405df3999ce391cca9e2d">view</a>]</li>
+<li>Inline attribute got reset for functions returning an explicit struct type [<a href="http://github.com/doxygen/doxygen/commit/127a43d464790dd0312794fe7ae1d92247cd9eef">view</a>]</li>
+<li>Isolated none-existing posix threading functions on Android [<a href="http://github.com/doxygen/doxygen/commit/4e25f081847cf2717ad561214e90d9750da5a511">view</a>]</li>
+<li>Marks JS as freely licensed [<a href="http://github.com/doxygen/doxygen/commit/6b5617e5a4c87afd2c7f2f7b8cb03de2b6735627">view</a>]</li>
+<li>Misc. doxy and comment typos [<a href="http://github.com/doxygen/doxygen/commit/1764f7a0f199b9f2a85f885cfd0f1804f8292c49">view</a>]</li>
+<li>Misc. typos [<a href="http://github.com/doxygen/doxygen/commit/9fd7f3aeb4c2e78bda669bf4ef6fff1c12c062a4">view</a>]</li>
+<li>New table features mentioned in the documentation were not enabled. [<a href="http://github.com/doxygen/doxygen/commit/c120ac4762331513305e8a19fd9b267b2d4f9e41">view</a>]</li>
+<li>Pass strings as const references. [<a href="http://github.com/doxygen/doxygen/commit/ebf75c1fe8a0ff2cc9235155b6d63367944d6342">view</a>]</li>
+<li>Physical newlines in ALIASES configuration tags. [<a href="http://github.com/doxygen/doxygen/commit/d6801c4c5eaeebc5e14f5d1cd7c312ad82c1dbbd">view</a>]</li>
+<li>Propagate language information to all &lt;programlisting&gt; XML elements. [<a href="http://github.com/doxygen/doxygen/commit/eaf8edbac7e6a1873aa5c4ff0df063cd367351d6">view</a>]</li>
+<li>Properly copy images for the XML output. [<a href="http://github.com/doxygen/doxygen/commit/507dd0a60dd12c61ff2088db419187efc928c010">view</a>]</li>
+<li>Provide dot path to plantuml [<a href="http://github.com/doxygen/doxygen/commit/c24cb9a74ef0af854455047f29f9925d79ac0195">view</a>]</li>
+<li>Provide information about enum type &quot;strongness&quot; in the XML output. [<a href="http://github.com/doxygen/doxygen/commit/169cad806ea795e5c425fd397aa0de54cbc0a81e">view</a>]</li>
+<li>Provide page brief in &lt;briefdescription&gt; of XML output. [<a href="http://github.com/doxygen/doxygen/commit/bd2cf98e75c600e0c2f5ae95301df8745d65571a">view</a>]</li>
+<li>Provide template parameters also for type aliases in the XML output. [<a href="http://github.com/doxygen/doxygen/commit/21f0ca0085c034a37df07c1ab690472bada0a1f1">view</a>]</li>
+<li>Removed -Wno-deprecated flag from bison as it is not support on the bison 2.3 that ships with XCode [<a href="http://github.com/doxygen/doxygen/commit/6c288bf0e7548117aa358719aaecffedcc579590">view</a>]</li>
+<li>Restore &#39;make tests&#39; rule [<a href="http://github.com/doxygen/doxygen/commit/7ce59c9fbd5e99619a9ab0ac6177d21e6aca49c7">view</a>]</li>
+<li>Restore Makefile in vhdlparser dir [<a href="http://github.com/doxygen/doxygen/commit/aee944fe954de993a4273fafef6b5f0c726be7f3">view</a>]</li>
+<li>Spelling correction [<a href="http://github.com/doxygen/doxygen/commit/4cca51612a50a9016be5adbd6ccdc26c03d12b58">view</a>]</li>
+<li>Stripped unused LodePNG code to prevent false positives for coverity [<a href="http://github.com/doxygen/doxygen/commit/64865ad3e91fffe6e50b51b29ae2a54126f80126">view</a>]</li>
+<li>Suppresses warning for XML &lt;see langword=&quot;...&quot;/&gt; [<a href="http://github.com/doxygen/doxygen/commit/a3c5958b437b5dc9de91de5f40917ec53532b60a">view</a>]</li>
+<li>Suppression warnings about deprecated directive [<a href="http://github.com/doxygen/doxygen/commit/cd0faad90e9b6ce83fa1f7b4fb27a39357b0cae3">view</a>]</li>
<li>Update .travis.yml [<a href="http://github.com/doxygen/doxygen/commit/5f028fd744526148aace4c971f739c9876b6108a">view</a>]
-, [<a href="http://github.com/doxygen/doxygen/commit/b7fc8a384b091f5761159d263ec27e30c3160a50">view</a>]
-<li>Update mathjax path [<a href="http://github.com/doxygen/doxygen/commit/57e69ba26eff5eac4b31b088cd7d3dfa7532f12c">view</a>]
-<li>Updated translator_de.h to doxygen 1.8.13 [<a href="http://github.com/doxygen/doxygen/commit/a9e3d5378ffbef542045d04239482bd6fec33e15">view</a>]
-<li>Use hidden symbol visibility by default [<a href="http://github.com/doxygen/doxygen/commit/dcb3b2d0b888902a062eefd8200ea194ed1c42d6">view</a>]
-<li>Use language identifier instead of file extension for language attribute [<a href="http://github.com/doxygen/doxygen/commit/ed9acb6e1bb81a2eec334180f7b8c1bf0598b444">view</a>]
-<li>Use language in stead of lang for language name attribute [<a href="http://github.com/doxygen/doxygen/commit/4e4741221f4290412ef4a6b6bbfe9799abafaf6c">view</a>]
-<li>Update of the Brazillian translation [<a href="http://github.com/doxygen/doxygen/commit/d283dfcdcaa0837e84d7995676d436fa04e96d1f">view</a>]
-<li>[preprocessing.doc] typo amended [<a href="http://github.com/doxygen/doxygen/commit/6b67a64bd0bd1c6759294c323433dbd7d37df6ac">view</a>]
-<li>add decimal to base identifier [<a href="http://github.com/doxygen/doxygen/commit/9cbc1a04e584e83d91ff3f7501f38b0a825e1953">view</a>]
-<li>add the number of conditionals path and bugfix [<a href="http://github.com/doxygen/doxygen/commit/20af63f43e583a31dfe93f78807aa868f9b9ff14">view</a>]
-<li>build: fix the way lang_cfg.h is generated [<a href="http://github.com/doxygen/doxygen/commit/cc3a9e611c15f32ae4913a87306699db60758245">view</a> and <a href="http://github.com/doxygen/doxygen/commit/a4b6f59e0c99457ba8f4f71782e51d50b7a1057f">view</a>]
-<li>bump version number for the development version/next release [<a href="http://github.com/doxygen/doxygen/commit/0a6d8bf6f5ef3a537de6ab517d0ae9c4f5d558d0">view</a>]
-<li>const-ify [<a href="http://github.com/doxygen/doxygen/commit/5df4341210ec2374b8b7c09f5df3cd8f4ff60f65">view</a>]
-<li>dot.cpp: Fix DotGfxHierarchyTable first class node loop [<a href="http://github.com/doxygen/doxygen/commit/c7348b4483ace9b5608fbbe949eab02921eb0e70">view</a>]
-<li>fix spelling [<a href="http://github.com/doxygen/doxygen/commit/bca94d6ca30bde5f01dd17a83cfa63268c0ca664">view</a>]
-<li>fix test to support new programlisting attribute [<a href="http://github.com/doxygen/doxygen/commit/a9963fd94acd5839e818890b6a356d6b335c1f74">view</a>]
-<li>fix typo [<a href="http://github.com/doxygen/doxygen/commit/f88ebaf9f23c3151f312400d77150eeeeb8158c2">view</a>]
-<li>fixes vhdl literal bug [<a href="http://github.com/doxygen/doxygen/commit/6c387a6be9128ced0b89f6fc75946cd1a85096fb">view</a>]
-<li>line continuation characters inside comments embedded in a macro definition appeared in the output [<a href="http://github.com/doxygen/doxygen/commit/898b6044194d5967099adfadab454cd09a4f360e">view</a>]
-<li>make use of clang compilation database [<a href="http://github.com/doxygen/doxygen/commit/818aefcecf3cca986c971cd236bd7b77337db955">view</a>]
-<li>new addon doxyparse, a source parsing engine [<a href="http://github.com/doxygen/doxygen/commit/e6dcc3b6c6dd449800eeebc172c1d15367d61d74">view</a>]
-<li>sqlite3gen: add index on params [<a href="http://github.com/doxygen/doxygen/commit/3b3d1edeacde99719456b8f1616077707a5a2012">view</a>]
-<li>sqlite3gen: add missing protectedsettable column [<a href="http://github.com/doxygen/doxygen/commit/ba8e4323290da4cb6de59060c77fe02a4df694b4">view</a>]
-<li>sqlite3gen: add openDbConnection [<a href="http://github.com/doxygen/doxygen/commit/5596fcd158e7c53638324cea8ba3da31b2c32620">view</a>]
-<li>sqlite3gen: start checking operations status [<a href="http://github.com/doxygen/doxygen/commit/74cebdbbbc2c267c254ab2c337ee06250ab8424d">view</a>]
-<li>sqlite3gen: use sqlite3_exec for schema setup [<a href="http://github.com/doxygen/doxygen/commit/1ec8f0eb9169fc3f9ab82b60712a332bf60728bf">view</a>]
-<li>typos [<a href="http://github.com/doxygen/doxygen/commit/5711b54b4813a2f4ce3b858e496ac846cbda69e5">view</a>]
-<li>update compound.xsd to add language attribute [<a href="http://github.com/doxygen/doxygen/commit/0259d2a8bf9571e06873b80df96fd2ff29723dbc">view</a>]
-<li>using YAML in the output of &quot;doxyparse&quot; [<a href="http://github.com/doxygen/doxygen/commit/82dbb5fe863e13175eda130dcc728b102101ccda">view</a>]
+, [<a href="http://github.com/doxygen/doxygen/commit/b7fc8a384b091f5761159d263ec27e30c3160a50">view</a>]</li>
+<li>Update mathjax path [<a href="http://github.com/doxygen/doxygen/commit/57e69ba26eff5eac4b31b088cd7d3dfa7532f12c">view</a>]</li>
+<li>Updated translator_de.h to doxygen 1.8.13 [<a href="http://github.com/doxygen/doxygen/commit/a9e3d5378ffbef542045d04239482bd6fec33e15">view</a>]</li>
+<li>Use hidden symbol visibility by default [<a href="http://github.com/doxygen/doxygen/commit/dcb3b2d0b888902a062eefd8200ea194ed1c42d6">view</a>]</li>
+<li>Use language identifier instead of file extension for language attribute [<a href="http://github.com/doxygen/doxygen/commit/ed9acb6e1bb81a2eec334180f7b8c1bf0598b444">view</a>]</li>
+<li>Use language in stead of lang for language name attribute [<a href="http://github.com/doxygen/doxygen/commit/4e4741221f4290412ef4a6b6bbfe9799abafaf6c">view</a>]</li>
+<li>Update of the Brazillian translation [<a href="http://github.com/doxygen/doxygen/commit/d283dfcdcaa0837e84d7995676d436fa04e96d1f">view</a>]</li>
+<li>[preprocessing.doc] typo amended [<a href="http://github.com/doxygen/doxygen/commit/6b67a64bd0bd1c6759294c323433dbd7d37df6ac">view</a>]</li>
+<li>add decimal to base identifier [<a href="http://github.com/doxygen/doxygen/commit/9cbc1a04e584e83d91ff3f7501f38b0a825e1953">view</a>]</li>
+<li>add the number of conditionals path and bugfix [<a href="http://github.com/doxygen/doxygen/commit/20af63f43e583a31dfe93f78807aa868f9b9ff14">view</a>]</li>
+<li>build: fix the way lang_cfg.h is generated [<a href="http://github.com/doxygen/doxygen/commit/cc3a9e611c15f32ae4913a87306699db60758245">view</a> and <a href="http://github.com/doxygen/doxygen/commit/a4b6f59e0c99457ba8f4f71782e51d50b7a1057f">view</a>]</li>
+<li>bump version number for the development version/next release [<a href="http://github.com/doxygen/doxygen/commit/0a6d8bf6f5ef3a537de6ab517d0ae9c4f5d558d0">view</a>]</li>
+<li>const-ify [<a href="http://github.com/doxygen/doxygen/commit/5df4341210ec2374b8b7c09f5df3cd8f4ff60f65">view</a>]</li>
+<li>dot.cpp: Fix DotGfxHierarchyTable first class node loop [<a href="http://github.com/doxygen/doxygen/commit/c7348b4483ace9b5608fbbe949eab02921eb0e70">view</a>]</li>
+<li>fix spelling [<a href="http://github.com/doxygen/doxygen/commit/bca94d6ca30bde5f01dd17a83cfa63268c0ca664">view</a>]</li>
+<li>fix test to support new programlisting attribute [<a href="http://github.com/doxygen/doxygen/commit/a9963fd94acd5839e818890b6a356d6b335c1f74">view</a>]</li>
+<li>fix typo [<a href="http://github.com/doxygen/doxygen/commit/f88ebaf9f23c3151f312400d77150eeeeb8158c2">view</a>]</li>
+<li>fixes vhdl literal bug [<a href="http://github.com/doxygen/doxygen/commit/6c387a6be9128ced0b89f6fc75946cd1a85096fb">view</a>]</li>
+<li>line continuation characters inside comments embedded in a macro definition appeared in the output [<a href="http://github.com/doxygen/doxygen/commit/898b6044194d5967099adfadab454cd09a4f360e">view</a>]</li>
+<li>make use of clang compilation database [<a href="http://github.com/doxygen/doxygen/commit/818aefcecf3cca986c971cd236bd7b77337db955">view</a>]</li>
+<li>new addon doxyparse, a source parsing engine [<a href="http://github.com/doxygen/doxygen/commit/e6dcc3b6c6dd449800eeebc172c1d15367d61d74">view</a>]</li>
+<li>sqlite3gen: add index on params [<a href="http://github.com/doxygen/doxygen/commit/3b3d1edeacde99719456b8f1616077707a5a2012">view</a>]</li>
+<li>sqlite3gen: add missing protectedsettable column [<a href="http://github.com/doxygen/doxygen/commit/ba8e4323290da4cb6de59060c77fe02a4df694b4">view</a>]</li>
+<li>sqlite3gen: add openDbConnection [<a href="http://github.com/doxygen/doxygen/commit/5596fcd158e7c53638324cea8ba3da31b2c32620">view</a>]</li>
+<li>sqlite3gen: start checking operations status [<a href="http://github.com/doxygen/doxygen/commit/74cebdbbbc2c267c254ab2c337ee06250ab8424d">view</a>]</li>
+<li>sqlite3gen: use sqlite3_exec for schema setup [<a href="http://github.com/doxygen/doxygen/commit/1ec8f0eb9169fc3f9ab82b60712a332bf60728bf">view</a>]</li>
+<li>typos [<a href="http://github.com/doxygen/doxygen/commit/5711b54b4813a2f4ce3b858e496ac846cbda69e5">view</a>]</li>
+<li>update compound.xsd to add language attribute [<a href="http://github.com/doxygen/doxygen/commit/0259d2a8bf9571e06873b80df96fd2ff29723dbc">view</a>]</li>
+<li>using YAML in the output of &quot;doxyparse&quot; [<a href="http://github.com/doxygen/doxygen/commit/82dbb5fe863e13175eda130dcc728b102101ccda">view</a>]</li>
</ul>
<p>
\endhtmlonly
@@ -135,60 +135,60 @@
<a name="1.8.13"></a>
</p>
<ul>
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5279">5279</a> - C++/CLI indexed property not documented [<a href="http://github.com/doxygen/doxygen/commit/80656d68a0838483ea2988adf028e2d85292a109">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5280">5280</a> - Grouping of results fail when using built-in javascript search [<a href="http://github.com/doxygen/doxygen/commit/0615b1b023f7888dfdbeee7673d6d0bcc7b803df">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5400">5400</a> - &#39;static&#39; and &#39;throw&#39; C++ keywords not colored [<a href="http://github.com/doxygen/doxygen/commit/794ae9cbc40b73d00cce5f0096b53f18e1d3e325">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5476">5476</a> - wrong collaboration diagram when in template used scoped argument type [<a href="http://github.com/doxygen/doxygen/commit/adb44ae6ef1d102caea1338373be078bf4a5d640">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5882">5882</a> - Multiline //!&lt; behavior changed [<a href="http://github.com/doxygen/doxygen/commit/d4accb68ff6536dcf128236b7e1e8d0239d4ffc2">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5917">5917</a> - C++11 &quot;using&quot; type alias for function pointer with no arguments is formatted incorrectly [<a href="http://github.com/doxygen/doxygen/commit/d4c24c28ffcf7143bcdfecee1c8b55f704274d37">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5930">5930</a> - fails to build with an unreleased python version [<a href="http://github.com/doxygen/doxygen/commit/5c6f0fdf1ebbd4c28f524a0347fe556ff2421504">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6044">6044</a> - doxygen warning parsing C++11 &quot;using&quot; declaration [<a href="http://github.com/doxygen/doxygen/commit/5730198d20511d93c20aa7870fc2bd11f478db85">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6060">6060</a> - Tag file size double between each run [<a href="http://github.com/doxygen/doxygen/commit/155bd0110585d401d0f898baf9c69b2ec46833ff">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6062">6062</a> - C++11 ref-qualifiers do not appear in Member Function Documentation section [<a href="http://github.com/doxygen/doxygen/commit/9ef1bf94eef1af591c40102b930fef95250b8142">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6063">6063</a> - Web-page bug: Comment blocks in VHDL [<a href="http://github.com/doxygen/doxygen/commit/6c6b847bcd16cc818165b51e62dc11a947f7e084">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6067">6067</a> - French description for &quot;Namespace Members&quot; is wrong and causes fatal javascript error [<a href="http://github.com/doxygen/doxygen/commit/b5e1e195bc207c7bb93df4e51253f9f3a1026a3d">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6068">6068</a> - Class name &#39;internal&#39; breaks class hierarchy in C++ [<a href="http://github.com/doxygen/doxygen/commit/b93dbcdab6dfc5681ec49f1d567698b7c4dc6846">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6084">6084</a> - __xxx__ not interpreted as markdown when xxx begins with a non-word character (e.g. __-1__) [<a href="http://github.com/doxygen/doxygen/commit/a95c07ecc0a2f1205883d8420a8280c5701c901c">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6093">6093</a> - Underscores in type or member name cause unwanted hyphenation in PDF output Data Fields [<a href="http://github.com/doxygen/doxygen/commit/d571efb062fbe17d7257f3971e3db6c9cba833d0">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6094">6094</a> - &quot;name&quot; attribute of image map not urlencoded, not working in Chrome [<a href="http://github.com/doxygen/doxygen/commit/6300c03b6201ca7981388a6d3c01486f8a8adba0">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6105">6105</a> - Please add HTML classes to &quot;Definition at...&quot; &amp; &quot;Referenced by...&quot; for CSS [<a href="http://github.com/doxygen/doxygen/commit/d2593e56cd52ecee2424d844916f95e12fef27c8">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6109">6109</a> - INLINE_SIMPLE_STRUCTS with enums in classes does not work [<a href="http://github.com/doxygen/doxygen/commit/71d7a9399db016cba83ccd63c6ba7e0fac1cd44d">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6115">6115</a> - Modify in some pronunciation expression in Korean [<a href="http://github.com/doxygen/doxygen/commit/cd3e39d7db634d9e11afc8e46269eb509ae10e40">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6123">6123</a> - Unknown reference in manual [<a href="http://github.com/doxygen/doxygen/commit/dde15c9748053ecb68ba046ebd0fdfe625be0e2e">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6125">6125</a> - referencing Python files via tagfile broken [<a href="http://github.com/doxygen/doxygen/commit/dc02bb977ebc6c683012c106e16e0190ac72b454">view</a>]
-<li>Add NVARCHAR as a SQL type [<a href="http://github.com/doxygen/doxygen/commit/6a85240e65bb5e3d59d2cd161eb8cf241e27ed7d">view</a>]
-<li>Add mscgen images to index.qhp [<a href="http://github.com/doxygen/doxygen/commit/f50d9ed4cdc7d4e7884bb64fddb01b017b880778">view</a>]
-<li>Add sql syntax highlighting to code blocks [<a href="http://github.com/doxygen/doxygen/commit/adf4a90340921cf7a120ae918af776355cf8ca0f">view</a>]
-<li>Add support for more CSS formatting and column/row spanning in markdown tables [<a href="http://github.com/doxygen/doxygen/commit/7f35695022d3baa8fc8c8d1b9a9f3368a0963871">view</a>]
-<li>Added missing language value for SQL to XML output [<a href="http://github.com/doxygen/doxygen/commit/b196b1a28151d75d9546dcc407947fbf29789cc5">view</a>]
-<li>Adds plantuml support Qt compressed help file [<a href="http://github.com/doxygen/doxygen/commit/c7b740d96288f19e31bd35405306c49bb9fc20c4">view</a>]
-<li>Check for undocumented params warnings if members detailed documentation is not written [<a href="http://github.com/doxygen/doxygen/commit/bae3c91812f8a6f845337f8c32d55495c4aa3522">view</a>]
-<li>Cleanup: removed redundant =NULL from interfaces, or replaced by =0 where it was needed. [<a href="http://github.com/doxygen/doxygen/commit/3b8b2e1a4b846a5c1b87f4a8ddc837462709895a">view</a>]
-<li>Clear header/footer information in ConfigImpl for postProcess [<a href="http://github.com/doxygen/doxygen/commit/5881b1bb624ee6115dc635ba44366d259cc6a10f">view</a>]
-<li>Documentation small corrections [<a href="http://github.com/doxygen/doxygen/commit/ae033324fed6ff9b3febe12b5777f19c04e065d2">view</a>]
-<li>Doxygen error: Found &#39;;&#39; while parsing initializer list [<a href="http://github.com/doxygen/doxygen/commit/985faf287233badf65fa33d21bde17afa6970d60">view</a>]
-<li>Fix for PlantUML configuration [<a href="http://github.com/doxygen/doxygen/commit/701598719c7c4301f2614b38184dfb37cd1704bc">view</a>]
-<li>Fix plantuml generation issue [<a href="http://github.com/doxygen/doxygen/commit/6c87c75e197e673d74949839d59fe8b0842e86ff">view</a>]
-<li>Fix: Add missing jquery.js, dynsections.js &amp; optional svgpan.js to QCH file [<a href="http://github.com/doxygen/doxygen/commit/bf9415698e53d79b4b94bdf64a52be4347eb3150">view</a>]
-<li>Fix: replace deprecated {\bf with \textbf{ in LaTeX generator [<a href="http://github.com/doxygen/doxygen/commit/1d85e00dd1238f74babf0a1d7eeeaf3e2ba659f2">view</a>]
-<li>Fixed constexp.y bison issue [<a href="http://github.com/doxygen/doxygen/commit/e12ec76f044b07d4e4fe167c93103be2879abaca">view</a>]
-<li>Fixed cross referencing issue when using bitfields. [<a href="http://github.com/doxygen/doxygen/commit/2a5357a0fac644ffb1bf49569344b9bc57603a29">view</a>]
-<li>Fixed jump to anchor issue when navigating to source file [<a href="http://github.com/doxygen/doxygen/commit/94b726f4273df805846d7fdcd2e9d5bd7627f628">view</a>]
-<li>Fixed problem generating per letter namespace member index pages. [<a href="http://github.com/doxygen/doxygen/commit/2b722b57f20e044b061423109bfa7168a7a1b913">view</a>]
-<li>Fixed svgpan.js issue with Chrome causing empty SVG graphs [<a href="http://github.com/doxygen/doxygen/commit/5f01f783e2387a5d44ad70fbff5365aa0e5df938">view</a>]
-<li>Fixed typedef and define strings for Spanish translation [<a href="http://github.com/doxygen/doxygen/commit/f69eb5d79885788d6bfc6303f34f5f016b326f1c">view</a>]
-<li>Fixup man only output to use generator state push pop [<a href="http://github.com/doxygen/doxygen/commit/051fb8a536e1d52aa0a0422186975852dd139c06">view</a>]
-<li>For manpages remove trailing dash when no brief description [<a href="http://github.com/doxygen/doxygen/commit/98d3f8e7d581c589e7bd1a7faf98fc6736847cf1">view</a>]
-<li>Made the RTF output honor the PAPER_TYPE option. [<a href="http://github.com/doxygen/doxygen/commit/5e894a760a6584ade2f5417e2577b66c65b51fd9">view</a>]
-<li>New classes for generated HTML div elements. [<a href="http://github.com/doxygen/doxygen/commit/84017cac3bc9d08aa95a90cf0e44b913c492c939">view</a>]
-<li>Option for PlantUML configuration file [<a href="http://github.com/doxygen/doxygen/commit/d4b0b88e189027d514fa84de75100ff1fe6e681a">view</a>]
-<li>Removed x flag from util* source files [<a href="http://github.com/doxygen/doxygen/commit/16d57031188698c7e79dd64554efc56044e91c8f">view</a>]
-<li>Replaced section marker before members by diamond shaped bullet [<a href="http://github.com/doxygen/doxygen/commit/da21ad5b5147182c2117751d8c517b81dd57277f">view</a>]
-<li>Reverting pull request #537 until it will be fixed [<a href="http://github.com/doxygen/doxygen/commit/fd67ef1f66afb0b51a784866b806ba8f04e12dfb">view</a>]
-<li>Update Swedish translation [<a href="http://github.com/doxygen/doxygen/commit/78b43ec9b5469a9e757cd658d21907fa593ed1aa">view</a>]
-<li>Updated the Polish translation [<a href="http://github.com/doxygen/doxygen/commit/158b7bdb697d19736692105161af3e891ae7732e">view</a>]
-<li>bison: use %declarations instead of command line options. [<a href="http://github.com/doxygen/doxygen/commit/97c2c1d6f323d6d38dda4820c00ca8ca8f5b6940">view</a>]
-<li>flex: use %option instead of command line options. [<a href="http://github.com/doxygen/doxygen/commit/0bdb01d4b6ced07750d8e449fd4ffab5554d8a24">view</a>]
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5279">5279</a> - C++/CLI indexed property not documented [<a href="http://github.com/doxygen/doxygen/commit/80656d68a0838483ea2988adf028e2d85292a109">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5280">5280</a> - Grouping of results fail when using built-in javascript search [<a href="http://github.com/doxygen/doxygen/commit/0615b1b023f7888dfdbeee7673d6d0bcc7b803df">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5400">5400</a> - &#39;static&#39; and &#39;throw&#39; C++ keywords not colored [<a href="http://github.com/doxygen/doxygen/commit/794ae9cbc40b73d00cce5f0096b53f18e1d3e325">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5476">5476</a> - wrong collaboration diagram when in template used scoped argument type [<a href="http://github.com/doxygen/doxygen/commit/adb44ae6ef1d102caea1338373be078bf4a5d640">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5882">5882</a> - Multiline //!&lt; behavior changed [<a href="http://github.com/doxygen/doxygen/commit/d4accb68ff6536dcf128236b7e1e8d0239d4ffc2">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5917">5917</a> - C++11 &quot;using&quot; type alias for function pointer with no arguments is formatted incorrectly [<a href="http://github.com/doxygen/doxygen/commit/d4c24c28ffcf7143bcdfecee1c8b55f704274d37">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5930">5930</a> - fails to build with an unreleased python version [<a href="http://github.com/doxygen/doxygen/commit/5c6f0fdf1ebbd4c28f524a0347fe556ff2421504">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6044">6044</a> - doxygen warning parsing C++11 &quot;using&quot; declaration [<a href="http://github.com/doxygen/doxygen/commit/5730198d20511d93c20aa7870fc2bd11f478db85">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6060">6060</a> - Tag file size double between each run [<a href="http://github.com/doxygen/doxygen/commit/155bd0110585d401d0f898baf9c69b2ec46833ff">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6062">6062</a> - C++11 ref-qualifiers do not appear in Member Function Documentation section [<a href="http://github.com/doxygen/doxygen/commit/9ef1bf94eef1af591c40102b930fef95250b8142">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6063">6063</a> - Web-page bug: Comment blocks in VHDL [<a href="http://github.com/doxygen/doxygen/commit/6c6b847bcd16cc818165b51e62dc11a947f7e084">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6067">6067</a> - French description for &quot;Namespace Members&quot; is wrong and causes fatal javascript error [<a href="http://github.com/doxygen/doxygen/commit/b5e1e195bc207c7bb93df4e51253f9f3a1026a3d">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6068">6068</a> - Class name &#39;internal&#39; breaks class hierarchy in C++ [<a href="http://github.com/doxygen/doxygen/commit/b93dbcdab6dfc5681ec49f1d567698b7c4dc6846">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6084">6084</a> - __xxx__ not interpreted as markdown when xxx begins with a non-word character (e.g. __-1__) [<a href="http://github.com/doxygen/doxygen/commit/a95c07ecc0a2f1205883d8420a8280c5701c901c">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6093">6093</a> - Underscores in type or member name cause unwanted hyphenation in PDF output Data Fields [<a href="http://github.com/doxygen/doxygen/commit/d571efb062fbe17d7257f3971e3db6c9cba833d0">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6094">6094</a> - &quot;name&quot; attribute of image map not urlencoded, not working in Chrome [<a href="http://github.com/doxygen/doxygen/commit/6300c03b6201ca7981388a6d3c01486f8a8adba0">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6105">6105</a> - Please add HTML classes to &quot;Definition at...&quot; &amp; &quot;Referenced by...&quot; for CSS [<a href="http://github.com/doxygen/doxygen/commit/d2593e56cd52ecee2424d844916f95e12fef27c8">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6109">6109</a> - INLINE_SIMPLE_STRUCTS with enums in classes does not work [<a href="http://github.com/doxygen/doxygen/commit/71d7a9399db016cba83ccd63c6ba7e0fac1cd44d">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6115">6115</a> - Modify in some pronunciation expression in Korean [<a href="http://github.com/doxygen/doxygen/commit/cd3e39d7db634d9e11afc8e46269eb509ae10e40">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6123">6123</a> - Unknown reference in manual [<a href="http://github.com/doxygen/doxygen/commit/dde15c9748053ecb68ba046ebd0fdfe625be0e2e">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6125">6125</a> - referencing Python files via tagfile broken [<a href="http://github.com/doxygen/doxygen/commit/dc02bb977ebc6c683012c106e16e0190ac72b454">view</a>]</li>
+<li>Add NVARCHAR as a SQL type [<a href="http://github.com/doxygen/doxygen/commit/6a85240e65bb5e3d59d2cd161eb8cf241e27ed7d">view</a>]</li>
+<li>Add mscgen images to index.qhp [<a href="http://github.com/doxygen/doxygen/commit/f50d9ed4cdc7d4e7884bb64fddb01b017b880778">view</a>]</li>
+<li>Add sql syntax highlighting to code blocks [<a href="http://github.com/doxygen/doxygen/commit/adf4a90340921cf7a120ae918af776355cf8ca0f">view</a>]</li>
+<li>Add support for more CSS formatting and column/row spanning in markdown tables [<a href="http://github.com/doxygen/doxygen/commit/7f35695022d3baa8fc8c8d1b9a9f3368a0963871">view</a>]</li>
+<li>Added missing language value for SQL to XML output [<a href="http://github.com/doxygen/doxygen/commit/b196b1a28151d75d9546dcc407947fbf29789cc5">view</a>]</li>
+<li>Adds plantuml support Qt compressed help file [<a href="http://github.com/doxygen/doxygen/commit/c7b740d96288f19e31bd35405306c49bb9fc20c4">view</a>]</li>
+<li>Check for undocumented params warnings if members detailed documentation is not written [<a href="http://github.com/doxygen/doxygen/commit/bae3c91812f8a6f845337f8c32d55495c4aa3522">view</a>]</li>
+<li>Cleanup: removed redundant =NULL from interfaces, or replaced by =0 where it was needed. [<a href="http://github.com/doxygen/doxygen/commit/3b8b2e1a4b846a5c1b87f4a8ddc837462709895a">view</a>]</li>
+<li>Clear header/footer information in ConfigImpl for postProcess [<a href="http://github.com/doxygen/doxygen/commit/5881b1bb624ee6115dc635ba44366d259cc6a10f">view</a>]</li>
+<li>Documentation small corrections [<a href="http://github.com/doxygen/doxygen/commit/ae033324fed6ff9b3febe12b5777f19c04e065d2">view</a>]</li>
+<li>Doxygen error: Found &#39;;&#39; while parsing initializer list [<a href="http://github.com/doxygen/doxygen/commit/985faf287233badf65fa33d21bde17afa6970d60">view</a>]</li>
+<li>Fix for PlantUML configuration [<a href="http://github.com/doxygen/doxygen/commit/701598719c7c4301f2614b38184dfb37cd1704bc">view</a>]</li>
+<li>Fix plantuml generation issue [<a href="http://github.com/doxygen/doxygen/commit/6c87c75e197e673d74949839d59fe8b0842e86ff">view</a>]</li>
+<li>Fix: Add missing jquery.js, dynsections.js &amp; optional svgpan.js to QCH file [<a href="http://github.com/doxygen/doxygen/commit/bf9415698e53d79b4b94bdf64a52be4347eb3150">view</a>]</li>
+<li>Fix: replace deprecated {\bf with \textbf{ in LaTeX generator [<a href="http://github.com/doxygen/doxygen/commit/1d85e00dd1238f74babf0a1d7eeeaf3e2ba659f2">view</a>]</li>
+<li>Fixed constexp.y bison issue [<a href="http://github.com/doxygen/doxygen/commit/e12ec76f044b07d4e4fe167c93103be2879abaca">view</a>]</li>
+<li>Fixed cross referencing issue when using bitfields. [<a href="http://github.com/doxygen/doxygen/commit/2a5357a0fac644ffb1bf49569344b9bc57603a29">view</a>]</li>
+<li>Fixed jump to anchor issue when navigating to source file [<a href="http://github.com/doxygen/doxygen/commit/94b726f4273df805846d7fdcd2e9d5bd7627f628">view</a>]</li>
+<li>Fixed problem generating per letter namespace member index pages. [<a href="http://github.com/doxygen/doxygen/commit/2b722b57f20e044b061423109bfa7168a7a1b913">view</a>]</li>
+<li>Fixed svgpan.js issue with Chrome causing empty SVG graphs [<a href="http://github.com/doxygen/doxygen/commit/5f01f783e2387a5d44ad70fbff5365aa0e5df938">view</a>]</li>
+<li>Fixed typedef and define strings for Spanish translation [<a href="http://github.com/doxygen/doxygen/commit/f69eb5d79885788d6bfc6303f34f5f016b326f1c">view</a>]</li>
+<li>Fixup man only output to use generator state push pop [<a href="http://github.com/doxygen/doxygen/commit/051fb8a536e1d52aa0a0422186975852dd139c06">view</a>]</li>
+<li>For manpages remove trailing dash when no brief description [<a href="http://github.com/doxygen/doxygen/commit/98d3f8e7d581c589e7bd1a7faf98fc6736847cf1">view</a>]</li>
+<li>Made the RTF output honor the PAPER_TYPE option. [<a href="http://github.com/doxygen/doxygen/commit/5e894a760a6584ade2f5417e2577b66c65b51fd9">view</a>]</li>
+<li>New classes for generated HTML div elements. [<a href="http://github.com/doxygen/doxygen/commit/84017cac3bc9d08aa95a90cf0e44b913c492c939">view</a>]</li>
+<li>Option for PlantUML configuration file [<a href="http://github.com/doxygen/doxygen/commit/d4b0b88e189027d514fa84de75100ff1fe6e681a">view</a>]</li>
+<li>Removed x flag from util* source files [<a href="http://github.com/doxygen/doxygen/commit/16d57031188698c7e79dd64554efc56044e91c8f">view</a>]</li>
+<li>Replaced section marker before members by diamond shaped bullet [<a href="http://github.com/doxygen/doxygen/commit/da21ad5b5147182c2117751d8c517b81dd57277f">view</a>]</li>
+<li>Reverting pull request #537 until it will be fixed [<a href="http://github.com/doxygen/doxygen/commit/fd67ef1f66afb0b51a784866b806ba8f04e12dfb">view</a>]</li>
+<li>Update Swedish translation [<a href="http://github.com/doxygen/doxygen/commit/78b43ec9b5469a9e757cd658d21907fa593ed1aa">view</a>]</li>
+<li>Updated the Polish translation [<a href="http://github.com/doxygen/doxygen/commit/158b7bdb697d19736692105161af3e891ae7732e">view</a>]</li>
+<li>bison: use %declarations instead of command line options. [<a href="http://github.com/doxygen/doxygen/commit/97c2c1d6f323d6d38dda4820c00ca8ca8f5b6940">view</a>]</li>
+<li>flex: use %option instead of command line options. [<a href="http://github.com/doxygen/doxygen/commit/0bdb01d4b6ced07750d8e449fd4ffab5554d8a24">view</a>]</li>
</ul>
<p>
\endhtmlonly
@@ -199,156 +199,156 @@
<a name="1.8.12"></a>
</p>
<ul>
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/1662">1662</a> - Fix missing title in non-page docanchors from tag files [<a href="http://github.com/doxygen/doxygen/commit/616b392e9bc8984251d969577a5b63974efb1eef">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2763">2763</a> - FILTER_PATTERNS won&#39;t take command with arguments [<a href="http://github.com/doxygen/doxygen/commit/ce7a983c2849e4c8fa72189a896e594a8497dd4c">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4691">4691</a> - Uses &lt;img&gt; instead of &lt;object&gt; html tag for SVG images [<a href="http://github.com/doxygen/doxygen/commit/8ccd98643a3b88aaa3245b76202666900a2cd401">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5174">5174</a> - error state 21 with fortran code (fixed format) [<a href="http://github.com/doxygen/doxygen/commit/fdee5e9fade0ff5a578817048c6205f2a9acbced">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5323">5323</a> - Missing Page References in the Index Chapters of the LaTex/PDF output [<a href="http://github.com/doxygen/doxygen/commit/efd49dacfbae1ad55d7922a748e2c1d60068b014">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5411">5411</a> - Inherited member of template class issues warning and is not documented [<a href="http://github.com/doxygen/doxygen/commit/4dfc5887660284b345eb93b6c07dc1f91e780fac">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5711">5711</a> - Fortran: attributes after a blank line are ignored / Bug <a href="https://github.com/doxygen/doxygen/issues/3880">3880</a> - FORTRAN: comment in subroutine argument list [<a href="http://github.com/doxygen/doxygen/commit/e9ebf43585bffee80c31dd69538feae2a4525178">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5791">5791</a> - Doxygen handles comments in Objective-C code blocks incorrectly. [<a href="http://github.com/doxygen/doxygen/commit/c2e0ce14c65584f42e875f0abdbe5466d1414636">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5804">5804</a> - Representation of arrows [<a href="http://github.com/doxygen/doxygen/commit/ab96c077a8cd99308e6ae90c3c861ab1c0e911d7">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5811">5811</a> - Markdown: &gt; escaped within backticks [<a href="http://github.com/doxygen/doxygen/commit/5f9d80b2ce73a7e7fb0f4fc16f3ef5fee0cf8105">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5826">5826</a> - Use UTC timezone when displaying QDateTimes parsed from SOURCE_DATE_EPOCH [<a href="http://github.com/doxygen/doxygen/commit/5801460b3141871222569fb99e7964e9a2925d71">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5832">5832</a> - last entry missing in a @name group of typedefs [<a href="http://github.com/doxygen/doxygen/commit/ee2d6faecab57c1f929d6868ae6eb9bdaa53d654">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5843">5843</a> - Link of typedef within namespace on group pages missing [<a href="http://github.com/doxygen/doxygen/commit/0bd419e0a4fabf615fb72eb92bf561d3dfc96a11">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5891">5891</a> - __init__.py causes to ignore some inheritance [<a href="http://github.com/doxygen/doxygen/commit/607b8a302297169e4319280dba2a61dcbe042965">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5923">5923</a> - Figure title needs to be on separate line in order for it to work [<a href="http://github.com/doxygen/doxygen/commit/07521a7f050607609b9d04e8f3c58ed4754c47c3">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5933">5933</a> - Phantom variables/functions in XML, created from non-code files [<a href="http://github.com/doxygen/doxygen/commit/7dc9b378a107b1ccae2245b3f3f3d628db2bd008">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5937">5937</a> - CASE_SENSE_NAMES ignored [<a href="http://github.com/doxygen/doxygen/commit/fab854a10f358c15a69291a59388ea0c184bce20">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5938">5938</a> - Spaces between the closing bracket of the typename and the opening bracket of the parameter list cause detection issues. [<a href="http://github.com/doxygen/doxygen/commit/622d18637f9d633b184e43fd3594b661cf4e9375">view</a>]
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/1662">1662</a> - Fix missing title in non-page docanchors from tag files [<a href="http://github.com/doxygen/doxygen/commit/616b392e9bc8984251d969577a5b63974efb1eef">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/2763">2763</a> - FILTER_PATTERNS won&#39;t take command with arguments [<a href="http://github.com/doxygen/doxygen/commit/ce7a983c2849e4c8fa72189a896e594a8497dd4c">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/4691">4691</a> - Uses &lt;img&gt; instead of &lt;object&gt; html tag for SVG images [<a href="http://github.com/doxygen/doxygen/commit/8ccd98643a3b88aaa3245b76202666900a2cd401">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5174">5174</a> - error state 21 with fortran code (fixed format) [<a href="http://github.com/doxygen/doxygen/commit/fdee5e9fade0ff5a578817048c6205f2a9acbced">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5323">5323</a> - Missing Page References in the Index Chapters of the LaTex/PDF output [<a href="http://github.com/doxygen/doxygen/commit/efd49dacfbae1ad55d7922a748e2c1d60068b014">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5411">5411</a> - Inherited member of template class issues warning and is not documented [<a href="http://github.com/doxygen/doxygen/commit/4dfc5887660284b345eb93b6c07dc1f91e780fac">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5711">5711</a> - Fortran: attributes after a blank line are ignored / Bug <a href="https://github.com/doxygen/doxygen/issues/3880">3880</a> - FORTRAN: comment in subroutine argument list [<a href="http://github.com/doxygen/doxygen/commit/e9ebf43585bffee80c31dd69538feae2a4525178">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5791">5791</a> - Doxygen handles comments in Objective-C code blocks incorrectly. [<a href="http://github.com/doxygen/doxygen/commit/c2e0ce14c65584f42e875f0abdbe5466d1414636">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5804">5804</a> - Representation of arrows [<a href="http://github.com/doxygen/doxygen/commit/ab96c077a8cd99308e6ae90c3c861ab1c0e911d7">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5811">5811</a> - Markdown: &gt; escaped within backticks [<a href="http://github.com/doxygen/doxygen/commit/5f9d80b2ce73a7e7fb0f4fc16f3ef5fee0cf8105">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5826">5826</a> - Use UTC timezone when displaying QDateTimes parsed from SOURCE_DATE_EPOCH [<a href="http://github.com/doxygen/doxygen/commit/5801460b3141871222569fb99e7964e9a2925d71">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5832">5832</a> - last entry missing in a @name group of typedefs [<a href="http://github.com/doxygen/doxygen/commit/ee2d6faecab57c1f929d6868ae6eb9bdaa53d654">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5843">5843</a> - Link of typedef within namespace on group pages missing [<a href="http://github.com/doxygen/doxygen/commit/0bd419e0a4fabf615fb72eb92bf561d3dfc96a11">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5891">5891</a> - __init__.py causes to ignore some inheritance [<a href="http://github.com/doxygen/doxygen/commit/607b8a302297169e4319280dba2a61dcbe042965">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5923">5923</a> - Figure title needs to be on separate line in order for it to work [<a href="http://github.com/doxygen/doxygen/commit/07521a7f050607609b9d04e8f3c58ed4754c47c3">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5933">5933</a> - Phantom variables/functions in XML, created from non-code files [<a href="http://github.com/doxygen/doxygen/commit/7dc9b378a107b1ccae2245b3f3f3d628db2bd008">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5937">5937</a> - CASE_SENSE_NAMES ignored [<a href="http://github.com/doxygen/doxygen/commit/fab854a10f358c15a69291a59388ea0c184bce20">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5938">5938</a> - Spaces between the closing bracket of the typename and the opening bracket of the parameter list cause detection issues. [<a href="http://github.com/doxygen/doxygen/commit/622d18637f9d633b184e43fd3594b661cf4e9375">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5941">5941</a> - python unicode docstrings are ignored [<a href="http://github.com/doxygen/doxygen/commit/936f242956350825d870f7396ae5d6106fe3081d">view</a>]
-, [<a href="http://github.com/doxygen/doxygen/commit/be100f882604a23d94025fee6d059bdb5ec28d3e">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5945">5945</a> - Do not allow ligatures in log output [<a href="http://github.com/doxygen/doxygen/commit/894bdfdf268ba24a268fa72d7b33899a9f3a126b">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5958">5958</a> - References for one function can inherit References from subsequent non documented function [<a href="http://github.com/doxygen/doxygen/commit/9abcad810b8d41d338d501ff5b32524e1ced7f33">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5961">5961</a> - External search does not properly escape user supplied data, resulting in vulnerability [<a href="http://github.com/doxygen/doxygen/commit/1cc1adad2de03a0f013881b8960daf89aa155081">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5962">5962</a> - regression, Unescaped percent sign in doxygen output [<a href="http://github.com/doxygen/doxygen/commit/d4ab02c2da7df472bebbf2724419ba00f2de229c">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5964">5964</a> - hyperref link label drop underscores [<a href="http://github.com/doxygen/doxygen/commit/537a1c67f316c5a9d2d4542e94a4ace439a78b3a">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5965">5965</a> - Directory list is not generated in HTML output [<a href="http://github.com/doxygen/doxygen/commit/b6b87054121422009f2d5316a279869faaa33d16">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5967">5967</a> - imported section anchors are copied in project tagfile [<a href="http://github.com/doxygen/doxygen/commit/8542ec9c8647da15de486635de40c25f99fc8c63">view</a>]
+, [<a href="http://github.com/doxygen/doxygen/commit/be100f882604a23d94025fee6d059bdb5ec28d3e">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5945">5945</a> - Do not allow ligatures in log output [<a href="http://github.com/doxygen/doxygen/commit/894bdfdf268ba24a268fa72d7b33899a9f3a126b">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5958">5958</a> - References for one function can inherit References from subsequent non documented function [<a href="http://github.com/doxygen/doxygen/commit/9abcad810b8d41d338d501ff5b32524e1ced7f33">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5961">5961</a> - External search does not properly escape user supplied data, resulting in vulnerability [<a href="http://github.com/doxygen/doxygen/commit/1cc1adad2de03a0f013881b8960daf89aa155081">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5962">5962</a> - regression, Unescaped percent sign in doxygen output [<a href="http://github.com/doxygen/doxygen/commit/d4ab02c2da7df472bebbf2724419ba00f2de229c">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5964">5964</a> - hyperref link label drop underscores [<a href="http://github.com/doxygen/doxygen/commit/537a1c67f316c5a9d2d4542e94a4ace439a78b3a">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5965">5965</a> - Directory list is not generated in HTML output [<a href="http://github.com/doxygen/doxygen/commit/b6b87054121422009f2d5316a279869faaa33d16">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5967">5967</a> - imported section anchors are copied in project tagfile [<a href="http://github.com/doxygen/doxygen/commit/8542ec9c8647da15de486635de40c25f99fc8c63">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5970">5970</a> - Exclusion of a new line at the end of source code file causing nesting of HTML code for function documentation [<a href="http://github.com/doxygen/doxygen/commit/7228bca81e8d054413f85f8758fc13866ab4b85b">view</a>]
-, [<a href="http://github.com/doxygen/doxygen/commit/c2c9ed6bd2a94ad25f31a22f70489406c52e5e6f">view</a>]
+, [<a href="http://github.com/doxygen/doxygen/commit/c2c9ed6bd2a94ad25f31a22f70489406c52e5e6f">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5975">5975</a> - Recent File list allows only 2 entries [<a href="http://github.com/doxygen/doxygen/commit/0f53af1270a0032d4c24d93aeb7cce245427bf8d">view</a>]
-, [<a href="http://github.com/doxygen/doxygen/commit/48b1c6e240238f7dc3965735dfb00900d2c75383">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5978">5978</a> - doxygen crashes no resolved [<a href="http://github.com/doxygen/doxygen/commit/0e45c10d7db6dc82aa0828df7e30ec4c8c5a1f97">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5980">5980</a> - generated xml has errors [<a href="http://github.com/doxygen/doxygen/commit/d3078f4e2e0fcb6dd5f82781b54dab8647f7ccc4">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5981">5981</a> - quick link index in alphabetical class list in classes.html doesn&#39;t work [<a href="http://github.com/doxygen/doxygen/commit/ec1ef7b4971540bbe042b16d7ebd3f2a0e0e57f1">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5982">5982</a> - Bad character escaping scheme in HTML anchor generation. [<a href="http://github.com/doxygen/doxygen/commit/6136cf9e3ad70d58cac4d8022cce8c8729805119">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5983">5983</a> - `@addindex`entries fail to link to the exact location in Compiled HTML Help. [<a href="http://github.com/doxygen/doxygen/commit/8dea6e11faf3969c3b6b17b700533f43c9ca73f8">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5985">5985</a> - Java: final keyword on a parameter brakes docs inherinance [<a href="http://github.com/doxygen/doxygen/commit/dfd0336f1a97e189d49e29860db1c43915aced76">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5991">5991</a> - Using `@page` to add title to Markdown file generates surplus empty page. [<a href="http://github.com/doxygen/doxygen/commit/42c7d88ffc11651d1fb6b997fd23cc938bce4a39">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5998">5998</a> - DOT_PATH not expanded [<a href="http://github.com/doxygen/doxygen/commit/752523cd122d6ffdd72c89955005d77819740675">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5999">5999</a> - Files with incorrect extensions (.doc) are picked up by doxygen [<a href="http://github.com/doxygen/doxygen/commit/14b04be2af279e1093f17d6b933d1e9ab530e128">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6002">6002</a> - python: missing cross-links in sources (option SOURCE_BROWSER = YES) [<a href="http://github.com/doxygen/doxygen/commit/f3aeedf7b570c0c06af44a4f8bb66eba6b78c2f2">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6007">6007</a> - VHDL: missing last sign in html documentation of constant declaration [<a href="http://github.com/doxygen/doxygen/commit/b00761b30a1d399f95adfe823937c05a64476155">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6009">6009</a> - HTML Tables with 10+ columns are broken for LaTeX based output [<a href="http://github.com/doxygen/doxygen/commit/61919f5483c717370742f2d238dcac88695d1990">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6010">6010</a> - Enumerations heading present but none listed [<a href="http://github.com/doxygen/doxygen/commit/e7ac59b018cdf609cc7c6819f38a7de05c699058">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6020">6020</a> - ALIASES stop working after verbatim with formula and /** */ [<a href="http://github.com/doxygen/doxygen/commit/36731bc9b573cdee6d699d0f66b4b34ad5b8f9ac">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6031">6031</a> - Doxygen segfault (return code 134) when parsing a c++ enum class contained in a class [<a href="http://github.com/doxygen/doxygen/commit/f37c0e58c47c43e96417d4dcf1559e3f9d1b323b">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6032">6032</a> - Segmentation fault when processing md containing only header [<a href="http://github.com/doxygen/doxygen/commit/0d9fc8dc45de49a050b1d13f03ff9f4713f736fb">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6033">6033</a> - Invalid XHTML if the directives brief and exception are following immediately [<a href="http://github.com/doxygen/doxygen/commit/1c8d2ecc67997ee88dfabbeafdbc2e9805a10e3f">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6035">6035</a> - Can&#39;t scroll using finger documentation in Chrome browser on Android OS [<a href="http://github.com/doxygen/doxygen/commit/478c1475ba8cbe508c39589c639662e317b959db">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6048">6048</a> - doxygen generates incorrect documentation for C enum in latex [<a href="http://github.com/doxygen/doxygen/commit/5b2e30aa0847f622e053b6ac6aa9c727f7ea42b3">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6055">6055</a> - Code snippet always shows line numbers from 1 [<a href="http://github.com/doxygen/doxygen/commit/9ae1af9b8679a0f14cb568d1db3afcc6e3ba40a6">view</a>]
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6056">6056</a> - Broken links in HTML output with SHOW_FILES=NO [<a href="http://github.com/doxygen/doxygen/commit/d2eeb765ffcf808812e7ac1c846dee97b85ad4bf">view</a>]
-<li>Add caption in verbatim blocks. [<a href="http://github.com/doxygen/doxygen/commit/f075557bf207d67cf2638298cbdd843cc1a2f7d7">view</a>]
-<li>Add parameter in/out specifiers to output. [<a href="http://github.com/doxygen/doxygen/commit/5592c705d8ac98f579e2675c12777330c4c322c9">view</a>]
-<li>Add section title to output. [<a href="http://github.com/doxygen/doxygen/commit/989a0137df8f8e11df67de1a2ded73712b46a8fd">view</a>]
-<li>Added .codedocs file [<a href="http://github.com/doxygen/doxygen/commit/5dee6e8aab6f8c76203a3296ef374e035cf55d34">view</a>]
-<li>Added an option to add &quot;anonymous&quot; headings to the table of contents (currently Markdown only). [<a href="http://github.com/doxygen/doxygen/commit/7e564896fcc41c2b1a6bd5c86ebebab0de7ea5f9">view</a>]
-<li>Added generating template files and reading templates from disk if present [<a href="http://github.com/doxygen/doxygen/commit/d38d33cef2241cd8d29c99f519d21ae225453357">view</a>]
-<li>Added missing free [<a href="http://github.com/doxygen/doxygen/commit/4dc6c6c2f01b7b7bda82f5c3dbf4f78e489341bc">view</a>]
-<li>Added support for encoding tag to the template engine used for HTML help indices [<a href="http://github.com/doxygen/doxygen/commit/7b887cfbffd73ea12fe0171c149f49c4540aac40">view</a>]
-<li>Adding compilation options for flex/lex and bison/yacc [<a href="http://github.com/doxygen/doxygen/commit/c873fad0b4c2948551e53c082a3829243c4ccb9f">view</a>]
-<li>Adding partial htmlhelp support to template system [<a href="http://github.com/doxygen/doxygen/commit/d3f2fcd53000fc4a09cf56c90930f8c8e2ad02b4">view</a>]
-<li>Adjusted Doxygen to doxygen in running text in the manual [<a href="http://github.com/doxygen/doxygen/commit/4f80d144f98fc998de5118855eec73797a65bf2e">view</a>]
-<li>Allow verbatim code block to be placed on the output. [<a href="http://github.com/doxygen/doxygen/commit/4530978dba88a0d6ccc369e480e6b9a98d29fa1e">view</a>]
-<li>Also map .f95, .f03 and .f08 file types to Fortran [<a href="http://github.com/doxygen/doxygen/commit/dc6019413c4609c49322e80d1ec2b089e85486f3">view</a>]
-<li>Another possible fix [<a href="http://github.com/doxygen/doxygen/commit/445347566078a1cc64705f28932e1da5bf9f531f">view</a>]
-<li>Applied responsive design to menu bar using smartmenus [<a href="http://github.com/doxygen/doxygen/commit/8480d35beef57ed08139b58972bfb83a3b37422c">view</a>]
-<li>Assertion failure generation documentation [<a href="http://github.com/doxygen/doxygen/commit/fdefe70a955c8140f080974319bbf97364d3e610">view</a>]
-<li>Bug fix for rendering the VHDL Hierarchy (thanks to a patch by Martin Kreis) [<a href="http://github.com/doxygen/doxygen/commit/10256be351f8f00ba5986750a08df1108bf6a4f7">view</a>]
-<li>Building doxyapp fails after update of config methodology to improve performance [<a href="http://github.com/doxygen/doxygen/commit/cf1706776bd93367dd357f505d04a7b10553f65f">view</a>]
-<li>Bump version for GIT repo [<a href="http://github.com/doxygen/doxygen/commit/295a467a2ebee260d95c7bb3e3c616554b7782b1">view</a>]
-<li>CMAKE: Fix building on Windows with VS 2015 [<a href="http://github.com/doxygen/doxygen/commit/6b80cc4181dc73a061b049e3283e6e2d8a4e5346">view</a>]
-<li>Changed configuration mechanism to directly access options in order to improve performance [<a href="http://github.com/doxygen/doxygen/commit/a93ec7221d1a258f0268e0c081782478372efe0b">view</a>]
-<li>Code with &quot;extension&quot; unparsed shows line numbers [<a href="http://github.com/doxygen/doxygen/commit/2b229f69041023f5f473385ee587ef7743850f55">view</a>]
-<li>Color code word OPERATOR and ASSIGNMENT as keyword in FORTRAN code [<a href="http://github.com/doxygen/doxygen/commit/3f559575d63f2fd29888107afae85f4cc902b189">view</a>]
-<li>Color code word RESULT as keyword in FORTRAN code [<a href="http://github.com/doxygen/doxygen/commit/0f047eb1862193713889d10bccb4894df1f7c23d">view</a>]
-<li>Determination of end of parameter list [<a href="http://github.com/doxygen/doxygen/commit/80f08d11c9a21db86bbeb106194f4e76f67bd50e">view</a>]
-<li>Disable selecting line number [<a href="http://github.com/doxygen/doxygen/commit/7bda78adac5d72396526c503325020a11cc12464">view</a>]
-<li>Disabled debug prints [<a href="http://github.com/doxygen/doxygen/commit/3e03e42e2b10bf2ccba5ab35e52c665ac35cfa15">view</a>]
-<li>Documentation for extensions .f95, .f03 and .f08 [<a href="http://github.com/doxygen/doxygen/commit/4c2e91c10dc6d007c410cd282a00fc7a42d38a0d">view</a>]
-<li>Doxygen fails to copy logo image to LaTex output dir [<a href="http://github.com/doxygen/doxygen/commit/711c6c0bee87d47d70b3ffa9ca8b39b704e91723">view</a>]
-<li>FORTRAN determination string in preprocessing [<a href="http://github.com/doxygen/doxygen/commit/4a7673fed2f28a24e0c7e8bb94621b0e14ac9ed5">view</a>]
-<li>Feature: Translations for german language (changes since 1.8.4) [<a href="http://github.com/doxygen/doxygen/commit/261077497f2bcc3364e182e338d914c470a0a235">view</a>]
-<li>Fix STRIP_FROM_PATH when running from drive root [<a href="http://github.com/doxygen/doxygen/commit/fd808ae3c1e37a8d476d250cf6b4325624a9eccb">view</a>]
-<li>Fix Windows build instructions. [<a href="http://github.com/doxygen/doxygen/commit/eec8d0a31161746041fc94ccbba5a54aecd8cf93">view</a>]
-<li>Fix documentation typos [<a href="http://github.com/doxygen/doxygen/commit/770adb37b2072bbea5412f9cc2058d98d1de60e4">view</a>]
-<li>Fix for HTML output when using server side search and the new menu bar [<a href="http://github.com/doxygen/doxygen/commit/0faf45600c6c640bfaf11b017d43a4b9de193ebf">view</a>]
-<li>Fix for changed references due to different removeRedudantWhiteSpace() implementation [<a href="http://github.com/doxygen/doxygen/commit/f26cc41d0d3d436c809c293a56c66c1f5f953745">view</a>]
-<li>Fix for empty file name [<a href="http://github.com/doxygen/doxygen/commit/0fead5249b8ef2c3c5cbbbd712855bae877aa27b">view</a>]
-<li>Fix for error in travis.yml [<a href="http://github.com/doxygen/doxygen/commit/81cf39f249c58db66368d60d596ac164d886ae90">view</a>]
-<li>Fix issue escaping backslash inside markdown style code span [<a href="http://github.com/doxygen/doxygen/commit/402970f77f961b85b6371c8e53bd69981435c2d7">view</a>]
-<li>Fix linker flags for building with clang on Windows [<a href="http://github.com/doxygen/doxygen/commit/41846b467bea58b904e26ce139394f7371ea5870">view</a>]
-<li>Fix order of member initilaization [<a href="http://github.com/doxygen/doxygen/commit/6b1ebb6bcb345d8997054492c21276dc2dc36416">view</a>]
-<li>Fix return-type warnings with -DNDEBUG [<a href="http://github.com/doxygen/doxygen/commit/f4574baf118da6aa2051b865040a9948bb0d22c9">view</a>]
-<li>Fix search box rendering in HTML when menu bar is disabled [<a href="http://github.com/doxygen/doxygen/commit/ee9a0664c03c306d0aeb127295ced29f8078ae03">view</a>]
-<li>Fix uppercase letters B-Z being unnecessarily escaped in index HTML anchors. [<a href="http://github.com/doxygen/doxygen/commit/0f699ab17cb88beff0ae4aa9b10042c0ccaff937">view</a>]
-<li>Fixed for index.hhp output when using template engine [<a href="http://github.com/doxygen/doxygen/commit/e629fc64d42121e86bf2230a3b515d1d0d868dcd">view</a>]
-<li>Fixed issue escaping ndashes (\--) and mdashes (\---) [<a href="http://github.com/doxygen/doxygen/commit/ef56187f733d946e4df130d9783eadea41ec1c97">view</a>]
-<li>Fixed problem with -w command when no Doxyfile was present and specified [<a href="http://github.com/doxygen/doxygen/commit/7c3126407bbb46717a4e0a09b61ee001702af7bf">view</a>]
-<li>Fixed two regressions found during extensive testing [<a href="http://github.com/doxygen/doxygen/commit/d9166baf589f50e94597829b04d0cabee4573130">view</a>]
-<li>Fixed typos. [<a href="http://github.com/doxygen/doxygen/commit/a787b94d11e9f337570bfab1d36a36b37438ccea">view</a>]
-<li>Fixed wrong &lt;p&gt; nesting issue for call/caller graphs [<a href="http://github.com/doxygen/doxygen/commit/50c78a6f0d720617c5a82045b5b2cd18882a15a9">view</a>]
-<li>Fortran inline source code and crash on Linux [<a href="http://github.com/doxygen/doxygen/commit/661991e55f7ae18e8143733f364d9d7864ec66d9">view</a>]
-<li>Improve output on mobile devices [<a href="http://github.com/doxygen/doxygen/commit/e0dc837a14a466dd4fb58a0a1e6e72b5c400f563">view</a>]
-<li>Improved list of files in htmlhelp.hhp [<a href="http://github.com/doxygen/doxygen/commit/f7a05140593d854955151e4286205ef1f908e07b">view</a>]
-<li>Improved sorting performance for directories and files [<a href="http://github.com/doxygen/doxygen/commit/5475bf2e9a0f1517567186b47595b8dad2b6b3a3">view</a>]
-<li>Include command show line number (e.g. LaTeX) [<a href="http://github.com/doxygen/doxygen/commit/a4bde1e1e71a24d6c714377be4265e95deb1acf3">view</a>]
-<li>Initialization of python variables and type determination [<a href="http://github.com/doxygen/doxygen/commit/46ba7769c4a0600c47f3de6871815398bab7ca91">view</a>]
-<li>Introducing commands includedoc and snippetdoc [<a href="http://github.com/doxygen/doxygen/commit/ba848363081c44c9aa9e91b193054983f562e90c">view</a>]
-<li>Latex page numbering [<a href="http://github.com/doxygen/doxygen/commit/044f2c49882815f58c88b12a0086ad71dd97f071">view</a>]
-<li>Minor build fixes [<a href="http://github.com/doxygen/doxygen/commit/5a7a5477cd60ea7cc10b8132862a4928af788028">view</a>]
-<li>Minor correction for BUILD.txt [<a href="http://github.com/doxygen/doxygen/commit/89ef13dbb6c8ac81a9c118f4f031c45cdc66e3a3">view</a>]
-<li>Minor performance improvement sorting directories [<a href="http://github.com/doxygen/doxygen/commit/67827956351f78516a7c48df366dcf521c51c6eb">view</a>]
-<li>Minor update to the installation instructions [<a href="http://github.com/doxygen/doxygen/commit/840d3d18a172edaf92f7780340b1aee4198846fe">view</a>]
-<li>Missing semicolon in navtree.css [<a href="http://github.com/doxygen/doxygen/commit/360987c61462c185942e5055a345dd777920216a">view</a>]
-<li>Modified (readability) layout for member title in HTML and LaTex [<a href="http://github.com/doxygen/doxygen/commit/a2ae382198092537b6b5c85f9c7e5615046d3c78">view</a>]
-<li>Optimized use of convertNameToFile to improve performance [<a href="http://github.com/doxygen/doxygen/commit/d168f8bfef6aac5a71eccad36dced78d55765ae1">view</a>]
+, [<a href="http://github.com/doxygen/doxygen/commit/48b1c6e240238f7dc3965735dfb00900d2c75383">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5978">5978</a> - doxygen crashes no resolved [<a href="http://github.com/doxygen/doxygen/commit/0e45c10d7db6dc82aa0828df7e30ec4c8c5a1f97">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5980">5980</a> - generated xml has errors [<a href="http://github.com/doxygen/doxygen/commit/d3078f4e2e0fcb6dd5f82781b54dab8647f7ccc4">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5981">5981</a> - quick link index in alphabetical class list in classes.html doesn&#39;t work [<a href="http://github.com/doxygen/doxygen/commit/ec1ef7b4971540bbe042b16d7ebd3f2a0e0e57f1">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5982">5982</a> - Bad character escaping scheme in HTML anchor generation. [<a href="http://github.com/doxygen/doxygen/commit/6136cf9e3ad70d58cac4d8022cce8c8729805119">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5983">5983</a> - `@addindex`entries fail to link to the exact location in Compiled HTML Help. [<a href="http://github.com/doxygen/doxygen/commit/8dea6e11faf3969c3b6b17b700533f43c9ca73f8">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5985">5985</a> - Java: final keyword on a parameter brakes docs inherinance [<a href="http://github.com/doxygen/doxygen/commit/dfd0336f1a97e189d49e29860db1c43915aced76">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5991">5991</a> - Using `@page` to add title to Markdown file generates surplus empty page. [<a href="http://github.com/doxygen/doxygen/commit/42c7d88ffc11651d1fb6b997fd23cc938bce4a39">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5998">5998</a> - DOT_PATH not expanded [<a href="http://github.com/doxygen/doxygen/commit/752523cd122d6ffdd72c89955005d77819740675">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5999">5999</a> - Files with incorrect extensions (.doc) are picked up by doxygen [<a href="http://github.com/doxygen/doxygen/commit/14b04be2af279e1093f17d6b933d1e9ab530e128">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6002">6002</a> - python: missing cross-links in sources (option SOURCE_BROWSER = YES) [<a href="http://github.com/doxygen/doxygen/commit/f3aeedf7b570c0c06af44a4f8bb66eba6b78c2f2">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6007">6007</a> - VHDL: missing last sign in html documentation of constant declaration [<a href="http://github.com/doxygen/doxygen/commit/b00761b30a1d399f95adfe823937c05a64476155">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6009">6009</a> - HTML Tables with 10+ columns are broken for LaTeX based output [<a href="http://github.com/doxygen/doxygen/commit/61919f5483c717370742f2d238dcac88695d1990">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6010">6010</a> - Enumerations heading present but none listed [<a href="http://github.com/doxygen/doxygen/commit/e7ac59b018cdf609cc7c6819f38a7de05c699058">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6020">6020</a> - ALIASES stop working after verbatim with formula and /** */ [<a href="http://github.com/doxygen/doxygen/commit/36731bc9b573cdee6d699d0f66b4b34ad5b8f9ac">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6031">6031</a> - Doxygen segfault (return code 134) when parsing a c++ enum class contained in a class [<a href="http://github.com/doxygen/doxygen/commit/f37c0e58c47c43e96417d4dcf1559e3f9d1b323b">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6032">6032</a> - Segmentation fault when processing md containing only header [<a href="http://github.com/doxygen/doxygen/commit/0d9fc8dc45de49a050b1d13f03ff9f4713f736fb">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6033">6033</a> - Invalid XHTML if the directives brief and exception are following immediately [<a href="http://github.com/doxygen/doxygen/commit/1c8d2ecc67997ee88dfabbeafdbc2e9805a10e3f">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6035">6035</a> - Can&#39;t scroll using finger documentation in Chrome browser on Android OS [<a href="http://github.com/doxygen/doxygen/commit/478c1475ba8cbe508c39589c639662e317b959db">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6048">6048</a> - doxygen generates incorrect documentation for C enum in latex [<a href="http://github.com/doxygen/doxygen/commit/5b2e30aa0847f622e053b6ac6aa9c727f7ea42b3">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6055">6055</a> - Code snippet always shows line numbers from 1 [<a href="http://github.com/doxygen/doxygen/commit/9ae1af9b8679a0f14cb568d1db3afcc6e3ba40a6">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/6056">6056</a> - Broken links in HTML output with SHOW_FILES=NO [<a href="http://github.com/doxygen/doxygen/commit/d2eeb765ffcf808812e7ac1c846dee97b85ad4bf">view</a>]</li>
+<li>Add caption in verbatim blocks. [<a href="http://github.com/doxygen/doxygen/commit/f075557bf207d67cf2638298cbdd843cc1a2f7d7">view</a>]</li>
+<li>Add parameter in/out specifiers to output. [<a href="http://github.com/doxygen/doxygen/commit/5592c705d8ac98f579e2675c12777330c4c322c9">view</a>]</li>
+<li>Add section title to output. [<a href="http://github.com/doxygen/doxygen/commit/989a0137df8f8e11df67de1a2ded73712b46a8fd">view</a>]</li>
+<li>Added .codedocs file [<a href="http://github.com/doxygen/doxygen/commit/5dee6e8aab6f8c76203a3296ef374e035cf55d34">view</a>]</li>
+<li>Added an option to add &quot;anonymous&quot; headings to the table of contents (currently Markdown only). [<a href="http://github.com/doxygen/doxygen/commit/7e564896fcc41c2b1a6bd5c86ebebab0de7ea5f9">view</a>]</li>
+<li>Added generating template files and reading templates from disk if present [<a href="http://github.com/doxygen/doxygen/commit/d38d33cef2241cd8d29c99f519d21ae225453357">view</a>]</li>
+<li>Added missing free [<a href="http://github.com/doxygen/doxygen/commit/4dc6c6c2f01b7b7bda82f5c3dbf4f78e489341bc">view</a>]</li>
+<li>Added support for encoding tag to the template engine used for HTML help indices [<a href="http://github.com/doxygen/doxygen/commit/7b887cfbffd73ea12fe0171c149f49c4540aac40">view</a>]</li>
+<li>Adding compilation options for flex/lex and bison/yacc [<a href="http://github.com/doxygen/doxygen/commit/c873fad0b4c2948551e53c082a3829243c4ccb9f">view</a>]</li>
+<li>Adding partial htmlhelp support to template system [<a href="http://github.com/doxygen/doxygen/commit/d3f2fcd53000fc4a09cf56c90930f8c8e2ad02b4">view</a>]</li>
+<li>Adjusted Doxygen to doxygen in running text in the manual [<a href="http://github.com/doxygen/doxygen/commit/4f80d144f98fc998de5118855eec73797a65bf2e">view</a>]</li>
+<li>Allow verbatim code block to be placed on the output. [<a href="http://github.com/doxygen/doxygen/commit/4530978dba88a0d6ccc369e480e6b9a98d29fa1e">view</a>]</li>
+<li>Also map .f95, .f03 and .f08 file types to Fortran [<a href="http://github.com/doxygen/doxygen/commit/dc6019413c4609c49322e80d1ec2b089e85486f3">view</a>]</li>
+<li>Another possible fix [<a href="http://github.com/doxygen/doxygen/commit/445347566078a1cc64705f28932e1da5bf9f531f">view</a>]</li>
+<li>Applied responsive design to menu bar using smartmenus [<a href="http://github.com/doxygen/doxygen/commit/8480d35beef57ed08139b58972bfb83a3b37422c">view</a>]</li>
+<li>Assertion failure generation documentation [<a href="http://github.com/doxygen/doxygen/commit/fdefe70a955c8140f080974319bbf97364d3e610">view</a>]</li>
+<li>Bug fix for rendering the VHDL Hierarchy (thanks to a patch by Martin Kreis) [<a href="http://github.com/doxygen/doxygen/commit/10256be351f8f00ba5986750a08df1108bf6a4f7">view</a>]</li>
+<li>Building doxyapp fails after update of config methodology to improve performance [<a href="http://github.com/doxygen/doxygen/commit/cf1706776bd93367dd357f505d04a7b10553f65f">view</a>]</li>
+<li>Bump version for GIT repo [<a href="http://github.com/doxygen/doxygen/commit/295a467a2ebee260d95c7bb3e3c616554b7782b1">view</a>]</li>
+<li>CMAKE: Fix building on Windows with VS 2015 [<a href="http://github.com/doxygen/doxygen/commit/6b80cc4181dc73a061b049e3283e6e2d8a4e5346">view</a>]</li>
+<li>Changed configuration mechanism to directly access options in order to improve performance [<a href="http://github.com/doxygen/doxygen/commit/a93ec7221d1a258f0268e0c081782478372efe0b">view</a>]</li>
+<li>Code with &quot;extension&quot; unparsed shows line numbers [<a href="http://github.com/doxygen/doxygen/commit/2b229f69041023f5f473385ee587ef7743850f55">view</a>]</li>
+<li>Color code word OPERATOR and ASSIGNMENT as keyword in FORTRAN code [<a href="http://github.com/doxygen/doxygen/commit/3f559575d63f2fd29888107afae85f4cc902b189">view</a>]</li>
+<li>Color code word RESULT as keyword in FORTRAN code [<a href="http://github.com/doxygen/doxygen/commit/0f047eb1862193713889d10bccb4894df1f7c23d">view</a>]</li>
+<li>Determination of end of parameter list [<a href="http://github.com/doxygen/doxygen/commit/80f08d11c9a21db86bbeb106194f4e76f67bd50e">view</a>]</li>
+<li>Disable selecting line number [<a href="http://github.com/doxygen/doxygen/commit/7bda78adac5d72396526c503325020a11cc12464">view</a>]</li>
+<li>Disabled debug prints [<a href="http://github.com/doxygen/doxygen/commit/3e03e42e2b10bf2ccba5ab35e52c665ac35cfa15">view</a>]</li>
+<li>Documentation for extensions .f95, .f03 and .f08 [<a href="http://github.com/doxygen/doxygen/commit/4c2e91c10dc6d007c410cd282a00fc7a42d38a0d">view</a>]</li>
+<li>Doxygen fails to copy logo image to LaTex output dir [<a href="http://github.com/doxygen/doxygen/commit/711c6c0bee87d47d70b3ffa9ca8b39b704e91723">view</a>]</li>
+<li>FORTRAN determination string in preprocessing [<a href="http://github.com/doxygen/doxygen/commit/4a7673fed2f28a24e0c7e8bb94621b0e14ac9ed5">view</a>]</li>
+<li>Feature: Translations for german language (changes since 1.8.4) [<a href="http://github.com/doxygen/doxygen/commit/261077497f2bcc3364e182e338d914c470a0a235">view</a>]</li>
+<li>Fix STRIP_FROM_PATH when running from drive root [<a href="http://github.com/doxygen/doxygen/commit/fd808ae3c1e37a8d476d250cf6b4325624a9eccb">view</a>]</li>
+<li>Fix Windows build instructions. [<a href="http://github.com/doxygen/doxygen/commit/eec8d0a31161746041fc94ccbba5a54aecd8cf93">view</a>]</li>
+<li>Fix documentation typos [<a href="http://github.com/doxygen/doxygen/commit/770adb37b2072bbea5412f9cc2058d98d1de60e4">view</a>]</li>
+<li>Fix for HTML output when using server side search and the new menu bar [<a href="http://github.com/doxygen/doxygen/commit/0faf45600c6c640bfaf11b017d43a4b9de193ebf">view</a>]</li>
+<li>Fix for changed references due to different removeRedudantWhiteSpace() implementation [<a href="http://github.com/doxygen/doxygen/commit/f26cc41d0d3d436c809c293a56c66c1f5f953745">view</a>]</li>
+<li>Fix for empty file name [<a href="http://github.com/doxygen/doxygen/commit/0fead5249b8ef2c3c5cbbbd712855bae877aa27b">view</a>]</li>
+<li>Fix for error in travis.yml [<a href="http://github.com/doxygen/doxygen/commit/81cf39f249c58db66368d60d596ac164d886ae90">view</a>]</li>
+<li>Fix issue escaping backslash inside markdown style code span [<a href="http://github.com/doxygen/doxygen/commit/402970f77f961b85b6371c8e53bd69981435c2d7">view</a>]</li>
+<li>Fix linker flags for building with clang on Windows [<a href="http://github.com/doxygen/doxygen/commit/41846b467bea58b904e26ce139394f7371ea5870">view</a>]</li>
+<li>Fix order of member initilaization [<a href="http://github.com/doxygen/doxygen/commit/6b1ebb6bcb345d8997054492c21276dc2dc36416">view</a>]</li>
+<li>Fix return-type warnings with -DNDEBUG [<a href="http://github.com/doxygen/doxygen/commit/f4574baf118da6aa2051b865040a9948bb0d22c9">view</a>]</li>
+<li>Fix search box rendering in HTML when menu bar is disabled [<a href="http://github.com/doxygen/doxygen/commit/ee9a0664c03c306d0aeb127295ced29f8078ae03">view</a>]</li>
+<li>Fix uppercase letters B-Z being unnecessarily escaped in index HTML anchors. [<a href="http://github.com/doxygen/doxygen/commit/0f699ab17cb88beff0ae4aa9b10042c0ccaff937">view</a>]</li>
+<li>Fixed for index.hhp output when using template engine [<a href="http://github.com/doxygen/doxygen/commit/e629fc64d42121e86bf2230a3b515d1d0d868dcd">view</a>]</li>
+<li>Fixed issue escaping ndashes (\--) and mdashes (\---) [<a href="http://github.com/doxygen/doxygen/commit/ef56187f733d946e4df130d9783eadea41ec1c97">view</a>]</li>
+<li>Fixed problem with -w command when no Doxyfile was present and specified [<a href="http://github.com/doxygen/doxygen/commit/7c3126407bbb46717a4e0a09b61ee001702af7bf">view</a>]</li>
+<li>Fixed two regressions found during extensive testing [<a href="http://github.com/doxygen/doxygen/commit/d9166baf589f50e94597829b04d0cabee4573130">view</a>]</li>
+<li>Fixed typos. [<a href="http://github.com/doxygen/doxygen/commit/a787b94d11e9f337570bfab1d36a36b37438ccea">view</a>]</li>
+<li>Fixed wrong &lt;p&gt; nesting issue for call/caller graphs [<a href="http://github.com/doxygen/doxygen/commit/50c78a6f0d720617c5a82045b5b2cd18882a15a9">view</a>]</li>
+<li>Fortran inline source code and crash on Linux [<a href="http://github.com/doxygen/doxygen/commit/661991e55f7ae18e8143733f364d9d7864ec66d9">view</a>]</li>
+<li>Improve output on mobile devices [<a href="http://github.com/doxygen/doxygen/commit/e0dc837a14a466dd4fb58a0a1e6e72b5c400f563">view</a>]</li>
+<li>Improved list of files in htmlhelp.hhp [<a href="http://github.com/doxygen/doxygen/commit/f7a05140593d854955151e4286205ef1f908e07b">view</a>]</li>
+<li>Improved sorting performance for directories and files [<a href="http://github.com/doxygen/doxygen/commit/5475bf2e9a0f1517567186b47595b8dad2b6b3a3">view</a>]</li>
+<li>Include command show line number (e.g. LaTeX) [<a href="http://github.com/doxygen/doxygen/commit/a4bde1e1e71a24d6c714377be4265e95deb1acf3">view</a>]</li>
+<li>Initialization of python variables and type determination [<a href="http://github.com/doxygen/doxygen/commit/46ba7769c4a0600c47f3de6871815398bab7ca91">view</a>]</li>
+<li>Introducing commands includedoc and snippetdoc [<a href="http://github.com/doxygen/doxygen/commit/ba848363081c44c9aa9e91b193054983f562e90c">view</a>]</li>
+<li>Latex page numbering [<a href="http://github.com/doxygen/doxygen/commit/044f2c49882815f58c88b12a0086ad71dd97f071">view</a>]</li>
+<li>Minor build fixes [<a href="http://github.com/doxygen/doxygen/commit/5a7a5477cd60ea7cc10b8132862a4928af788028">view</a>]</li>
+<li>Minor correction for BUILD.txt [<a href="http://github.com/doxygen/doxygen/commit/89ef13dbb6c8ac81a9c118f4f031c45cdc66e3a3">view</a>]</li>
+<li>Minor performance improvement sorting directories [<a href="http://github.com/doxygen/doxygen/commit/67827956351f78516a7c48df366dcf521c51c6eb">view</a>]</li>
+<li>Minor update to the installation instructions [<a href="http://github.com/doxygen/doxygen/commit/840d3d18a172edaf92f7780340b1aee4198846fe">view</a>]</li>
+<li>Missing semicolon in navtree.css [<a href="http://github.com/doxygen/doxygen/commit/360987c61462c185942e5055a345dd777920216a">view</a>]</li>
+<li>Modified (readability) layout for member title in HTML and LaTex [<a href="http://github.com/doxygen/doxygen/commit/a2ae382198092537b6b5c85f9c7e5615046d3c78">view</a>]</li>
+<li>Optimized use of convertNameToFile to improve performance [<a href="http://github.com/doxygen/doxygen/commit/d168f8bfef6aac5a71eccad36dced78d55765ae1">view</a>]</li>
<li>PDF generation stops when image with caption is included in a table. [<a href="http://github.com/doxygen/doxygen/commit/1d77a4ed407aaa24eae53f501d1a5ce38b352504">view</a>]
-, [<a href="http://github.com/doxygen/doxygen/commit/7b0b7ef746ae15df3894847f5b43a29ae20c9599">view</a>]
-<li>Parse more than 1 size indiction in defaultHandleTitleAndSize [<a href="http://github.com/doxygen/doxygen/commit/2bcf196332084067c3d2409fa07992a6b833473d">view</a>]
-<li>Problem jumping to line number in source code due to wrong hypertarget name [<a href="http://github.com/doxygen/doxygen/commit/ed875603dc42d3a5ebbcfd89540b1f7ecf472ece">view</a>]
-<li>Python strip code comments [<a href="http://github.com/doxygen/doxygen/commit/a19feec4a7864dc17fcb570330ae2f7b9a5c6e45">view</a>]
-<li>Reimplemented node renumbering for dot graph to improve performance [<a href="http://github.com/doxygen/doxygen/commit/fb66cae35cd59d1026fe3c6de46ae3a2ed6f9f91">view</a>]
+, [<a href="http://github.com/doxygen/doxygen/commit/7b0b7ef746ae15df3894847f5b43a29ae20c9599">view</a>]</li>
+<li>Parse more than 1 size indiction in defaultHandleTitleAndSize [<a href="http://github.com/doxygen/doxygen/commit/2bcf196332084067c3d2409fa07992a6b833473d">view</a>]</li>
+<li>Problem jumping to line number in source code due to wrong hypertarget name [<a href="http://github.com/doxygen/doxygen/commit/ed875603dc42d3a5ebbcfd89540b1f7ecf472ece">view</a>]</li>
+<li>Python strip code comments [<a href="http://github.com/doxygen/doxygen/commit/a19feec4a7864dc17fcb570330ae2f7b9a5c6e45">view</a>]</li>
+<li>Reimplemented node renumbering for dot graph to improve performance [<a href="http://github.com/doxygen/doxygen/commit/fb66cae35cd59d1026fe3c6de46ae3a2ed6f9f91">view</a>]</li>
<li>Remove unused variables [<a href="http://github.com/doxygen/doxygen/commit/aa61a4b33e2dd5c0f4809dd23f4561bd225270f9">view</a>]
-, [<a href="http://github.com/doxygen/doxygen/commit/e698e53d2c04833143e5ab60f0983e3c683cf85d">view</a>]
-<li>Removed ambiguity in the XML schema definition [<a href="http://github.com/doxygen/doxygen/commit/13946338f9e5fcdb6dca7f8e4c2429ca000455fb">view</a>]
-<li>Revert #291 [<a href="http://github.com/doxygen/doxygen/commit/6ea76e0d89aff8399117e602a3eab1f7d93e466b">view</a>]
-<li>Simplified code of fix for Bug <a href="https://github.com/doxygen/doxygen/issues/5982">5982</a> [<a href="http://github.com/doxygen/doxygen/commit/e70b45fa4398450b588122f9d36b1ed514fc336a">view</a>]
-<li>Sorting in latex index and missing \@ in index [<a href="http://github.com/doxygen/doxygen/commit/558958dca5e5cb50bd33f3344cab151aba9ce076">view</a>]
-<li>Split apt-get install commands in travis config in an attempt to reduce timeouts [<a href="http://github.com/doxygen/doxygen/commit/2f6f48567cb48d21361237a7905e27744e0acf91">view</a>]
-<li>Style fixes and added numbering to overloaded members [<a href="http://github.com/doxygen/doxygen/commit/5af8d5e87657a2d3986783493c618df335b3771c">view</a>]
-<li>Table of contents breaks when documentation spans multiple comment blocks with same @page [<a href="http://github.com/doxygen/doxygen/commit/7f7f7273f816335d556668b86aa99d05f7f09992">view</a>]
-<li>Unified display of enum values across output formats and languages [<a href="http://github.com/doxygen/doxygen/commit/9c915b83bc06babe6f0127f6446143ea50d00b62">view</a>]
-<li>Unify handling of extra packages in formula.cpp and latexgen.cpp so formula.cpp handles package arguments correctly [<a href="http://github.com/doxygen/doxygen/commit/4d2e203a55a2af8f15a3933b86201e6e9b6901b3">view</a>]
-<li>Update LICENSE file to latest from FSF [<a href="http://github.com/doxygen/doxygen/commit/48eb44a00b4b805fda0da82620d7efb135116d23">view</a>]
-<li>Update copyright year in docs [<a href="http://github.com/doxygen/doxygen/commit/b721f6e1707f8cc446c0d7f9956e6d4aa9f17bc9">view</a>]
-<li>Updated README.md to include code docs [<a href="http://github.com/doxygen/doxygen/commit/3911ebdad44a91a6b825051a1ae0f7b280c84567">view</a>]
-<li>Updated stylesheet for the manual to fix layout issue in the navigation tree [<a href="http://github.com/doxygen/doxygen/commit/64597bbe46169c08b591a8714f48d314c5341cc2">view</a>]
-<li>Warnings from CLANG compiler [<a href="http://github.com/doxygen/doxygen/commit/fdfb027f346c30d6cd209b366e6cb879fb11cbcb">view</a>]
-<li>fix ninja build error [<a href="http://github.com/doxygen/doxygen/commit/c4cdfdf65073824d7badb38a1f535310b93d50a9">view</a>]
-<li>fixed rtf subsection [<a href="http://github.com/doxygen/doxygen/commit/17bd813313cf073a437001f2fa550f286458586e">view</a>]
-<li>mangen.h: remove italic in brief member descriptions [<a href="http://github.com/doxygen/doxygen/commit/5716f0aee08bfc9daf7ab7e22566e5acc51446d0">view</a>]
-<li>reimplemented removeRedundantWhiteSpace() to improve performance [<a href="http://github.com/doxygen/doxygen/commit/00ee930a1d73e11885197102c54fd4c8141127da">view</a>]
-<li>sqlite3gen: defnname -&gt; defname [<a href="http://github.com/doxygen/doxygen/commit/79a53cc464ef814adf6b64d45a15fee6676f15d6">view</a>]
-<li>sqlite3gen: export proper memberdef refid [<a href="http://github.com/doxygen/doxygen/commit/918cf6871359da9d14dd6d3e7c4d00d6ca9a496e">view</a>]
-<li>sqlite3gen: insert xrefs using integer refids [<a href="http://github.com/doxygen/doxygen/commit/bac76c1957de71e3e0bddc23ccd46b7b2537c8a1">view</a>]
-<li>sqlite3gen: stripFromPath on all calls to insertFile [<a href="http://github.com/doxygen/doxygen/commit/87222afcfe6089899c8ded60b23692fd40997856">view</a>]
-<li>sqlite3gen: stripWhitespace on bitfield&#39;s text [<a href="http://github.com/doxygen/doxygen/commit/6f4561608adaf8230c2fa015770dfeeab5ce3ba8">view</a>]
-<li>sqlite3gen: sync with xmlgen [<a href="http://github.com/doxygen/doxygen/commit/8208b2d5514a3c29659ae967da544adc21585212">view</a>]
-<li>sqlite3gen: use the refid stored in the refids table [<a href="http://github.com/doxygen/doxygen/commit/9b02db93e7e78aedc0a0ca7fd2701c81dc153487">view</a>]
+, [<a href="http://github.com/doxygen/doxygen/commit/e698e53d2c04833143e5ab60f0983e3c683cf85d">view</a>]</li>
+<li>Removed ambiguity in the XML schema definition [<a href="http://github.com/doxygen/doxygen/commit/13946338f9e5fcdb6dca7f8e4c2429ca000455fb">view</a>]</li>
+<li>Revert #291 [<a href="http://github.com/doxygen/doxygen/commit/6ea76e0d89aff8399117e602a3eab1f7d93e466b">view</a>]</li>
+<li>Simplified code of fix for Bug <a href="https://github.com/doxygen/doxygen/issues/5982">5982</a> [<a href="http://github.com/doxygen/doxygen/commit/e70b45fa4398450b588122f9d36b1ed514fc336a">view</a>]</li>
+<li>Sorting in latex index and missing \@ in index [<a href="http://github.com/doxygen/doxygen/commit/558958dca5e5cb50bd33f3344cab151aba9ce076">view</a>]</li>
+<li>Split apt-get install commands in travis config in an attempt to reduce timeouts [<a href="http://github.com/doxygen/doxygen/commit/2f6f48567cb48d21361237a7905e27744e0acf91">view</a>]</li>
+<li>Style fixes and added numbering to overloaded members [<a href="http://github.com/doxygen/doxygen/commit/5af8d5e87657a2d3986783493c618df335b3771c">view</a>]</li>
+<li>Table of contents breaks when documentation spans multiple comment blocks with same @page [<a href="http://github.com/doxygen/doxygen/commit/7f7f7273f816335d556668b86aa99d05f7f09992">view</a>]</li>
+<li>Unified display of enum values across output formats and languages [<a href="http://github.com/doxygen/doxygen/commit/9c915b83bc06babe6f0127f6446143ea50d00b62">view</a>]</li>
+<li>Unify handling of extra packages in formula.cpp and latexgen.cpp so formula.cpp handles package arguments correctly [<a href="http://github.com/doxygen/doxygen/commit/4d2e203a55a2af8f15a3933b86201e6e9b6901b3">view</a>]</li>
+<li>Update LICENSE file to latest from FSF [<a href="http://github.com/doxygen/doxygen/commit/48eb44a00b4b805fda0da82620d7efb135116d23">view</a>]</li>
+<li>Update copyright year in docs [<a href="http://github.com/doxygen/doxygen/commit/b721f6e1707f8cc446c0d7f9956e6d4aa9f17bc9">view</a>]</li>
+<li>Updated README.md to include code docs [<a href="http://github.com/doxygen/doxygen/commit/3911ebdad44a91a6b825051a1ae0f7b280c84567">view</a>]</li>
+<li>Updated stylesheet for the manual to fix layout issue in the navigation tree [<a href="http://github.com/doxygen/doxygen/commit/64597bbe46169c08b591a8714f48d314c5341cc2">view</a>]</li>
+<li>Warnings from CLANG compiler [<a href="http://github.com/doxygen/doxygen/commit/fdfb027f346c30d6cd209b366e6cb879fb11cbcb">view</a>]</li>
+<li>fix ninja build error [<a href="http://github.com/doxygen/doxygen/commit/c4cdfdf65073824d7badb38a1f535310b93d50a9">view</a>]</li>
+<li>fixed rtf subsection [<a href="http://github.com/doxygen/doxygen/commit/17bd813313cf073a437001f2fa550f286458586e">view</a>]</li>
+<li>mangen.h: remove italic in brief member descriptions [<a href="http://github.com/doxygen/doxygen/commit/5716f0aee08bfc9daf7ab7e22566e5acc51446d0">view</a>]</li>
+<li>reimplemented removeRedundantWhiteSpace() to improve performance [<a href="http://github.com/doxygen/doxygen/commit/00ee930a1d73e11885197102c54fd4c8141127da">view</a>]</li>
+<li>sqlite3gen: defnname -&gt; defname [<a href="http://github.com/doxygen/doxygen/commit/79a53cc464ef814adf6b64d45a15fee6676f15d6">view</a>]</li>
+<li>sqlite3gen: export proper memberdef refid [<a href="http://github.com/doxygen/doxygen/commit/918cf6871359da9d14dd6d3e7c4d00d6ca9a496e">view</a>]</li>
+<li>sqlite3gen: insert xrefs using integer refids [<a href="http://github.com/doxygen/doxygen/commit/bac76c1957de71e3e0bddc23ccd46b7b2537c8a1">view</a>]</li>
+<li>sqlite3gen: stripFromPath on all calls to insertFile [<a href="http://github.com/doxygen/doxygen/commit/87222afcfe6089899c8ded60b23692fd40997856">view</a>]</li>
+<li>sqlite3gen: stripWhitespace on bitfield&#39;s text [<a href="http://github.com/doxygen/doxygen/commit/6f4561608adaf8230c2fa015770dfeeab5ce3ba8">view</a>]</li>
+<li>sqlite3gen: sync with xmlgen [<a href="http://github.com/doxygen/doxygen/commit/8208b2d5514a3c29659ae967da544adc21585212">view</a>]</li>
+<li>sqlite3gen: use the refid stored in the refids table [<a href="http://github.com/doxygen/doxygen/commit/9b02db93e7e78aedc0a0ca7fd2701c81dc153487">view</a>]</li>
</ul>
<p>
\endhtmlonly
@@ -718,7 +718,7 @@
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5569">5569</a> - Fix a potential null pointer dereference in src/searchindex.cpp [<a href="http://github.com/doxygen/doxygen/commit/e21aaadb920775f431a27957542da80e39d0c947">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5570">5570</a> - Fix wrong pointer initialization in src/definition.cpp [<a href="http://github.com/doxygen/doxygen/commit/cb5d8e6198fe0d0852fb06d6fa18b8ae2682e2c0">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5571">5571</a> - Fix potential modulo by zero in src/template.cpp [<a href="http://github.com/doxygen/doxygen/commit/c4007c3abea9c8494bf32181a1352b5366bede69">view</a>]</li>
-<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5572">5572</a> - Reached end of file while still insided a (nested) comment in Markdown [<a href="http://github.com/doxygen/doxygen/commit/c7f7c954ec1356e7f361da0d655c72ca0012a0cf">view</a>]</li>
+<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5572">5572</a> - Reached end of file while still inside a (nested) comment in Markdown [<a href="http://github.com/doxygen/doxygen/commit/c7f7c954ec1356e7f361da0d655c72ca0012a0cf">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5573">5573</a> - Fix a terminating null character after fread in src/filedef.cpp [<a href="http://github.com/doxygen/doxygen/commit/a4003db44dfb624c03b7e0a518e368d3e4b8c1ca">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5574">5574</a> - Remove not needed variable initialization in src/classdef.cpp [<a href="http://github.com/doxygen/doxygen/commit/5f01852bbfd3c81320ee4aa8cd45875a80b50ee1">view</a>]</li>
<li>Bug <a href="https://github.com/doxygen/doxygen/issues/5575">5575</a> - Remove not needed pointer initialization in src/entry.cpp [<a href="http://github.com/doxygen/doxygen/commit/88832b15f1256846b1228ac411d270c6d092a50b">view</a>]</li>
@@ -2182,7 +2182,7 @@ make sure you add the following:
<h3>New features</h3>
<ul>
<li> Added support for
- <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+ <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
formatting.
This is enabled by default, but can be disabled by
setting MARKDOWN_SUPPORT to NO. When enabled the following is
@@ -2803,7 +2803,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3190">3190</a>: dropped support for a4wide paper format for LaTeX, since
it is on the LaTeX taboo list.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3261">3261</a>: Behaviour of CLASS_DIAGRAM=NO in combination with
- HAVE_DOT=YES, was not propely documented.</li>
+ HAVE_DOT=YES, was not properly documented.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3332">3332</a>: Python comments for next class or method could end up in
code of a method/class when enabling INLINE_SOURCES.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3688">3688</a>: Fixed problem handling nested classes in Python.</li>
diff --git a/doc/commands.doc b/doc/commands.doc
index a630aac..c569e6c 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -75,6 +75,7 @@ documentation:
\refitem cmdelse \\else
\refitem cmdelseif \\elseif
\refitem cmdem \\em
+\refitem cmdemoji \\emoji
\refitem cmdendcode \\endcode
\refitem cmdendcond \\endcond
\refitem cmdenddocbookonly \\enddocbookonly
@@ -106,6 +107,8 @@ documentation:
\refitem cmdheaderfile \\headerfile
\refitem cmdhidecallergraph \\hidecallergraph
\refitem cmdhidecallgraph \\hidecallgraph
+\refitem cmdhiderefby \\hiderefby
+\refitem cmdhiderefs \\hiderefs
\refitem cmdhideinitializer \\hideinitializer
\refitem cmdhtmlinclude \\htmlinclude
\refitem cmdhtmlonly \\htmlonly
@@ -174,6 +177,8 @@ documentation:
\refitem cmdsee \\see
\refitem cmdshort \\short
\refitem cmdshowinitializer \\showinitializer
+\refitem cmdshowrefby \\showrefby
+\refitem cmdshowrefs \\showrefs
\refitem cmdsince \\since
\refitem cmdskip \\skip
\refitem cmdskipline \\skipline
@@ -306,7 +311,7 @@ Structural indicators
When this command is put in a comment block of a function or method
and \ref cfg_have_dot "HAVE_DOT" is set to \c YES, then doxygen will
generate a caller graph for that function (provided the implementation of the
- function or method calls other documented functions). The caller graph will be
+ function or method is called by other documented functions). The caller graph will be
generated regardless of the value of \ref cfg_caller_graph "CALLER_GRAPH".
\note The completeness (and correctness) of the caller graph depends on the
doxygen code parser which is not perfect.
@@ -333,6 +338,74 @@ Structural indicators
option \ref cfg_caller_graph "CALLER_GRAPH"
<hr>
+\section cmdshowrefby \\showrefby
+
+ \addindex \\showrefby
+ When this command is put in a comment block of a function, method or variable,
+ then doxygen will generate an overview for that function, method, variable of
+ the, documented, funcions and methods that call / use it.
+ The overview will be generated regardless of the value of
+ \ref cfg_referenced_by_relation "REFERENCED_BY_RELATION".
+ \note The completeness (and correctness) of the overview depends on the
+ doxygen code parser which is not perfect.
+
+ \sa section \ref cmdshowrefs "\\showrefs",
+ section \ref cmdhiderefby "\\hiderefby",
+ section \ref cmdhiderefs "\\hiderefs" and
+ option \ref cfg_referenced_by_relation "REFERENCED_BY_RELATION"
+
+<hr>
+\section cmdhiderefby \\hiderefby
+
+ \addindex \\hiderefby
+ When this command is put in a comment block of a function, method or variable
+ then doxygen will not generate an overview for that function, method or
+ variable of the functions and methods that call / use it.
+ The overview will not be generated regardless of the value of
+ \ref cfg_referenced_by_relation "REFERENCED_BY_RELATION".
+ \note The completeness (and correctness) of the overview depends on the
+ doxygen code parser which is not perfect.
+
+ \sa section \ref cmdshowrefs "\\showrefs",
+ section \ref cmdshowrefby "\\showrefby",
+ section \ref cmdhiderefs "\\hiderefs" and
+ option \ref cfg_referenced_by_relation "REFERENCED_BY_RELATION"
+
+<hr>
+\section cmdshowrefs \\showrefs
+
+ \addindex \\showrefs
+ When this command is put in a comment block of a function or method,
+ then doxygen will generate an overview for that function or method of the
+ functions and methods that call it.
+ The overview will be generated regardless of the value of
+ \ref cfg_references_relation "REFERENCES_RELATION".
+ \note The completeness (and correctness) of the overview depends on the
+ doxygen code parser which is not perfect.
+
+ \sa section \ref cmdshowrefby "\\showrefby",
+ section \ref cmdhiderefby "\\hiderefby",
+ section \ref cmdhiderefs "\\hiderefs" and
+ option \ref cfg_references_relation "REFERENCES_RELATION"
+
+<hr>
+\section cmdhiderefs \\hiderefs
+
+ \addindex \\hiderefs
+ When this command is put in a comment block of a function or method
+ and then doxygen will not generate an overview for that function or method of
+ the functions and methods that call it.
+ The overview will not be generated regardless of the value of
+ \ref cfg_references_relation "REFERENCES_RELATION".
+ \note The completeness (and correctness) of the overview depends on the
+ doxygen code parser which is not perfect.
+
+ \sa section \ref cmdshowrefs "\\showrefs",
+ section \ref cmdshowrefby "\\showrefby",
+ section \ref cmdhiderefby "\\hiderefby" and
+ option \ref cfg_references_relation "REFERENCES_RELATION"
+
+<hr>
\section cmdcategory \\category <name> [<header-file>] [<header-name>]
\addindex \\category
@@ -501,7 +574,6 @@ Structural indicators
\htmlonly
Click <a href="examples/manual/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
- </p>
\endhtmlonly
\latexonly
See \hyperlink{extends_example}{Extends example}
@@ -653,7 +725,6 @@ Structural indicators
\htmlonly
Click <a href="examples/manual/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
- </p>
\endhtmlonly
\latexonly
See \hyperlink{extends_example}{Implements example}
@@ -1888,7 +1959,7 @@ Commands to create links
\section cmdaddindex \\addindex (text)
\addindex \\addindex
- This command adds (text) to the \LaTeX index.
+ This command adds (text) to the \LaTeX , DocBook and RTF index.
<hr>
\section cmdanchor \\anchor <word>
@@ -2034,12 +2105,12 @@ Make sure you have first read \ref intro "the introduction".
\addindex \\tableofcontents
Creates a table of contents at the top of a page, listing all
sections and subsections in the page. The `option` can be `HTML` or `LaTeX`
- or `XML`. When a `level` is specified this means the maximum nesting level
+ or `XML` or `DocBook`. When a `level` is specified this means the maximum nesting level
that is shown. The value of `level` should be in the range 1..5, values outside
this range are considered to be 5. In case no `level` is specified `level` is
set to 5 (show all)
In case no `option`. is specified \c \\tableofcontents acts as if just the
- `option` `HTML` was specified. In case of multiple \c \\tableofcontents
+ `option` `HTML` and `XML` was specified. In case of multiple \c \\tableofcontents
commands in a page the `option`(s) will be used additional to the already
specified `option`(s), but only the last `level` of an `option` is valid.
@@ -2384,7 +2455,7 @@ Commands for displaying examples
\ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
<hr>
-\section cmdhtmlinclude \\htmlinclude <file-name>
+\section cmdhtmlinclude \\htmlinclude ["[block]"] <file-name>
\addindex \\htmlinclude
This command includes the file \<file-name\> as is in the HTML documentation.
@@ -2392,9 +2463,17 @@ Commands for displaying examples
placing \ref cmdhtmlonly "\\htmlonly" and \ref cmdendhtmlonly "\\endhtmlonly"
commands around it.
+ Normally the contents of the file indicated by \ref cmdhtmlinclude "\\htmlinclude"
+ is inserted as-is. When you
+ want to insert a HTML fragment that has block scope like a table or list
+ which should appear outside \<p\>..\</p\>, this can lead to invalid HTML.
+ You can use \\htmlinclude[block] to make doxygen
+ end the current paragraph and restart after the file is included.
+
Files or directories that doxygen should look for can be specified using the
\ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
+ \sa section \ref cmdhtmlonly "\\htmlonly".
<hr>
\section cmdlatexinclude \\latexinclude <file-name>
@@ -2608,7 +2687,7 @@ only copy the detailed documentation, not the brief description.
\addindex \\docbookonly
Starts a block of text that will be verbatim included in the
- generated docbook documentation only. The block ends with a
+ generated DocBook documentation only. The block ends with a
\ref cmdenddocbookonly "\\enddocbookonly" command.
\sa section \ref cmdmanonly "\\manonly",
@@ -2664,6 +2743,22 @@ class C {};
\endcode
<hr>
+\section cmdemoji \\emoji "name"
+
+This command will produce an emoji character given its name.
+
+The supported names are the ones also supported by GitHub and listed here
+https://gist.github.com/rxaviers/7360908
+
+You can use the name with or without colons, i.e.
+`\emoji smile` is the same as writing `\emoji :smile:`.
+When an emoji is not supported the name with by places in the
+text with in between colons, i.e. `\emoji unsupported` will produce
+`:unsupported:` in the output. Doxygen will also give a warning message.
+
+See also the \ref emojisup "emoji support page" for details.
+
+<hr>
\section cmdmsc \\msc ["caption"] [<sizeindication>=<size>]
\addindex \\msc
@@ -3053,11 +3148,12 @@ class Receiver
\sa section \ref cmdmanonly "\\manonly",
\ref cmdlatexonly "\\latexonly",
\ref cmdrtfonly "\\rtfonly",
- \ref cmdxmlonly "\\xmlonly", and
- \ref cmddocbookonly "\\docbookonly".
+ \ref cmdxmlonly "\\xmlonly",
+ \ref cmddocbookonly "\\docbookonly", and
+ \ref cmdhtmlinclude "\\htmlinclude".
<hr>
-\section cmdimage \\image <format> <file> ["caption"] [<sizeindication>=<size>]
+\section cmdimage \\image['{'[option]'}'] <format> <file> ["caption"] [<sizeindication>=<size>]
\addindex \\image
Inserts an image into the documentation. This command is format
@@ -3082,13 +3178,17 @@ class Receiver
spaces. The quotes are stripped before the caption is displayed.
The fourth argument is also optional and can be used to specify the
- width or height of the image. This can be useful for \LaTeX or docbook output
+ width or height of the image. This can be useful for \LaTeX or DocBook output
(i.e. format=<code>latex</code> or format=<code>docbook</code>).
\anchor image_sizeindicator \par Size indication
The \c sizeindication can specify the width or height to be used (or a combination).
The size specifier in \LaTeX (for example `10cm` or
`4in` or a symbolic width like `\\textwidth`).
+ Currently only the option `inline` is supported. In case the option `inline` is
+ specified the image is placed "in the line", when a caption s present it is shown
+ in HTML as tooltip (ignored for the other formats).
+
Here is example of a comment block:
\verbatim
@@ -3280,7 +3380,7 @@ class Receiver
\addindex \\\@
This command writes an at-sign (\c \@) to the output.
The at-sign has to be escaped in some cases
- because doxygen uses it to detect JavaDoc commands.
+ because doxygen uses it to detect Javadoc commands.
<hr>
\section cmdtilde \\~[LanguageId]
@@ -3424,4 +3524,3 @@ Go to the <a href="htmlcmds.html">next</a> section or return to the
\endhtmlonly
*/
-
diff --git a/doc/custcmd.doc b/doc/custcmd.doc
index acc0224..02805da 100644
--- a/doc/custcmd.doc
+++ b/doc/custcmd.doc
@@ -44,6 +44,11 @@ Note that you can put `\n`'s in the value part of an alias to insert newlines
(in the resulting output). You can put `^^` in the value part of an alias to
insert a newline as if a physical newline was in the original file.
+Note when you need a literal `{` or `}` or `,` in the value part of an alias you have to
+escape them by means of a backslash (`\`), this can lead to conflicts with the
+commands \c \\{ and \c \\} for these it is advised to use the version \c @@{ and \c @@} or
+use a double escape (\c \\\\{ and \c \\\\})
+
Also note that you can redefine existing special commands if you wish.
Some commands, such as \ref cmdxrefitem "\\xrefitem" are designed to be used in
diff --git a/doc/diagrams.doc b/doc/diagrams.doc
index 49be5d6..a0b4285 100644
--- a/doc/diagrams.doc
+++ b/doc/diagrams.doc
@@ -138,7 +138,6 @@ that doxygen can generate:
\include diagrams_e.h
\htmlonly
-</p>
Click <a href="examples/diagrams/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen<br/>
(<code>EXTRACT_ALL</code> = <code>YES</code> is used here).
@@ -152,7 +151,6 @@ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
\endlatexonly
\htmlonly
-<br/><br/>
Go to the <a href="preprocessing.html">next</a> section or return to the
<a href="index.html">index</a>.
\endhtmlonly
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
index f02e55b..d4eab5d 100644
--- a/doc/docblocks.doc
+++ b/doc/docblocks.doc
@@ -55,7 +55,7 @@ used to provide tooltips at places where an item is referenced.
There are several ways to mark a comment block as a detailed description:
<ol>
-<li> You can use the JavaDoc style, which consist of a C-style comment
+<li> You can use the Javadoc style, which consist of a C-style comment
block starting with two *'s, like this:
\verbatim
@@ -143,7 +143,7 @@ Here is an example:
<li>If \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" is set to \c YES
in the configuration file,
- then using JavaDoc style comment
+ then using Javadoc style comment
blocks will automatically start a brief description which ends at the
first dot followed by a space or new line. Here is an example:
@@ -259,7 +259,6 @@ located in front of the block instead of after the block.
Here is an example of the use of these comment blocks:
\include afterdoc.h
\htmlonly
- </p>
Click <a href="examples/afterdoc/html/class_afterdoc___test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -280,7 +279,6 @@ Here is an example of the use of these comment blocks:
Here is an example of a documented piece of C++ code using the Qt style:
\include qtstyle.cpp
\htmlonly
- </p>
Click <a href="examples/qtstyle/html/class_q_tstyle___test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -299,8 +297,8 @@ sentence of the detailed descriptions
tag to \c NO). Both the brief and the detailed descriptions are optional
for the Qt style.
-By default a JavaDoc style documentation block behaves the same way as a
-Qt style documentation block. This is not according the JavaDoc specification
+By default a Javadoc style documentation block behaves the same way as a
+Qt style documentation block. This is not according the Javadoc specification
however, where the first sentence of the documentation block is automatically
treated as a brief description. To enable this behavior you should set
\ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" to YES in the configuration
@@ -312,10 +310,9 @@ Here is an example:
\endverbatim
Here is the same piece of code as shown above, this time documented using the
-JavaDoc style and \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" set to YES:
+Javadoc style and \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" set to YES:
\include jdstyle.cpp
\htmlonly
- </p>
Click <a href="examples/jdstyle/html/class_javadoc___test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -348,7 +345,7 @@ duplication of information. So in practice you should \e avoid the use of
structural commands \e unless other requirements force you to do so.
Structural commands (like \ref cmd_intro "all other commands") start with a backslash
-(<tt>\\</tt>), or an at-sign (<tt>\@</tt>) if you prefer JavaDoc style,
+(<tt>\\</tt>), or an at-sign (<tt>\@</tt>) if you prefer Javadoc style,
followed by a command name and one or more parameters.
For instance, if you want to document the class \c Test in the example
above, you could have also put the following documentation block somewhere
@@ -396,7 +393,6 @@ Here is an example of a C header named \c structcmd.h that is documented
using structural commands:
\include structcmd.h
\htmlonly
- </p>
Click <a href="examples/structcmd/html/structcmd_8h.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -441,7 +437,6 @@ and assume they have to be represented in a preformatted way.
\include docstring.py
\htmlonly
- </p>
Click <a href="examples/docstring/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -462,7 +457,6 @@ Here is the same example again but now using doxygen style comments:
\include pyexample.py
\htmlonly
- </p>
Click <a href="examples/pyexample/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -492,7 +486,6 @@ Here is an example VHDL file with doxygen comments:
\include mux.vhdl
\htmlonly
- </p>
Click <a href="examples/mux/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -557,7 +550,7 @@ All following comment lines and continuation lines will be added to this
block. The block ends with a line not starting with a \c # (hash sign).
A brief documentation can be added with \c ;#< (semicolon, hash and
-lower then sign). The brief documentation also ends at a line not starting
+less-than sign). The brief documentation also ends at a line not starting
with a \c # (hash sign).
Inside doxygen comment blocks all normal doxygen markings are supported.
@@ -606,7 +599,6 @@ Following is an example using doxygen style comments:
\include tclexample.tcl
\htmlonly
- </p>
Click <a href="examples/tclexample/html/index.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -632,7 +624,7 @@ and is ideal for a short description.
For longer descriptions you often will find the
need for some more structure, like a block of verbatim text, a list, or a
simple table. For this doxygen supports the
-<a href="http://daringfireball.net/projects/markdown/syntax">Markdown</a>
+<a href="https://daringfireball.net/projects/markdown/syntax">Markdown</a>
syntax, including parts of the
<a href="https://michelf.ca/projects/php-markdown/extra/">Markdown Extra</a>
extension.
@@ -648,8 +640,9 @@ forms of additional markup on top of Markdown formatting.
1. <a href="https://en.wikipedia.org/wiki/Javadoc">Javadoc</a> like markup.
See \ref commands for a complete overview of all commands supported by doxygen.
-2. <a href="https://en.wikipedia.org/wiki/C_Sharp_(programming_language)#XML_documentation_system">XML</a> markup
- as specified in the C# standard. See \ref xmlcmds for the XML commands supported by doxygen.
+2. <a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/xmldoc/recommended-tags-for-documentation-comments">XML</a> markup
+ as specified in the <a href="http://standards.iso.org/ittf/PubliclyAvailableStandards/c042926_ISO_IEC_23270_2006(E).zip">C# standard</a>.
+ See \ref xmlcmds for the XML commands supported by doxygen.
If this is still not enough doxygen also supports a \ref htmlcmds "subset" of
the <a href="https://en.wikipedia.org/wiki/HTML">HTML</a> markup language.
diff --git a/doc/doxygen.1 b/doc/doxygen.1
index 5ac287e..a9c6b38 100644
--- a/doc/doxygen.1
+++ b/doc/doxygen.1
@@ -41,6 +41,10 @@ LaTeX: doxygen \fB\-w\fR latex headerFile footerFile styleSheetFile [configFile]
.TP
RTF:
doxygen \fB\-e\fR rtf extensionsFile
+.TP
+7) Use doxygen to compare the used configuration file with the template configuration file
+.TP
+doxygen \fB\-x\fR [configFile]
.PP
If \fB\-s\fR is specified the comments in the config file will be omitted.
If configName is omitted `Doxyfile' will be used as a default.
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
index 95e1ed6..1a44574 100644
--- a/doc/doxygen_manual.tex
+++ b/doc/doxygen_manual.tex
@@ -72,6 +72,8 @@
\setlength{\parindent}{0pt}
\newcommand{\doxynormalparskip}{\setlength{\parskip}{0.2cm}}
\newcommand{\doxytocparskip}{\setlength{\parskip}{0.2cm}}
+\newcommand{\doxygenemoji}[2]{%
+\IfFileExists{../doc/#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{../doc/#2.png}}}{#1}}
\doxynormalparskip
\hbadness=750
\tolerance=750
@@ -96,21 +98,21 @@ Written by Dimitri van Heesch\\[2ex]
\part{User Manual}
\chapter{Introduction}\label{intro}\hypertarget{intro}{}\input{index}
\chapter{Installation}\label{install}\hypertarget{install}{}\input{install}
-\chapter{Getting Started}\label{starting}\hypertarget{starting}{}\input{starting}
+\chapter{Getting started}\label{starting}\hypertarget{starting}{}\input{starting}
\chapter{Documenting the code}\label{docblocks}\hypertarget{docblocks}{}\input{docblocks}
-\chapter{Markdown}\label{markdown}\hypertarget{markdown}{}\input{markdown}
+\chapter{Markdown support}\label{markdown}\hypertarget{markdown}{}\input{markdown}
\chapter{Lists}\label{lists}\hypertarget{lists}{}\input{lists}
\chapter{Grouping}\label{grouping}\hypertarget{grouping}{}\input{grouping}
-\chapter{Including Formulas}\label{formulas}\hypertarget{formulas}{}\input{formulas}
-\chapter{Including Tables}\label{tables}\hypertarget{tables}{}\input{tables}
+\chapter{Including formulas}\label{formulas}\hypertarget{formulas}{}\input{formulas}
+\chapter{Including tables}\label{tables}\hypertarget{tables}{}\input{tables}
\chapter{Graphs and diagrams}\label{diagrams}\hypertarget{diagrams}{}\input{diagrams}
\chapter{Preprocessing}\label{preprocessing}\hypertarget{preprocessing}{}\input{preprocessing}
\chapter{Automatic link generation}\label{autolink}\hypertarget{autolink}{}\input{autolink}
\chapter{Output Formats}\label{output}\hypertarget{output}{}\input{output}
\chapter{Searching}\label{searching}\hypertarget{searching}{}\input{searching}
-\chapter{Customizing the Output}\label{customize}\hypertarget{customize}{}\input{customize}
-\chapter{Custom Commands}\label{custcmd}\hypertarget{custcmd}{}\input{custcmd}
-\chapter{Link to external documentation}\label{external}\hypertarget{external}{}\input{external}
+\chapter{Customizing the output}\label{customize}\hypertarget{customize}{}\input{customize}
+\chapter{Custom commands}\label{custcmd}\hypertarget{custcmd}{}\input{custcmd}
+\chapter{Linking to external documentation}\label{external}\hypertarget{external}{}\input{external}
\chapter{Frequently Asked Questions}\label{faq}\hypertarget{faq}{}\input{faq}
\chapter{Troubleshooting}\label{trouble}\hypertarget{trouble}{}\input{trouble}
\part{Reference Manual}
@@ -119,12 +121,13 @@ Written by Dimitri van Heesch\\[2ex]
\chapter{Doxywizard usage}\label{doxywizard_usage}\hypertarget{doxywizard_usage}{}\input{doxywizard_usage}
\chapter{Configuration}\label{config}\hypertarget{config}{}\input{config}
\chapter{Special Commands}\label{commands}\hypertarget{commands}{}\input{commands}
-\chapter{HTML commands}\label{htmlcmds}\hypertarget{htmlcmds}{}\input{htmlcmds}
-\chapter{XML commands}\label{xmlcmds}\hypertarget{xmlcmds}{}\input{xmlcmds}
+\chapter{HTML Commands}\label{htmlcmds}\hypertarget{htmlcmds}{}\input{htmlcmds}
+\chapter{XML Commands}\label{xmlcmds}\hypertarget{xmlcmds}{}\input{xmlcmds}
+\chapter{Emoji support}\label{emojisup}\hypertarget{emojisup}{}\input{emojisup}
\part{Developers Manual}
-\chapter{Doxygen's internals}\label{arch}\hypertarget{arch}{}\input{arch}
-\chapter{Perl Module Output format}\label{perlmod}\hypertarget{perlmod}{}\input{perlmod}
\chapter{Internationalization}\label{langhowto}\hypertarget{langhowto}{}\input{langhowto}
+\chapter{Perl Module Output}\label{perlmod}\hypertarget{perlmod}{}\input{perlmod}
+\chapter{Doxygen's internals}\label{arch}\hypertarget{arch}{}\input{arch}
\renewcommand{\thepart}{}
\part{Appendices}
\appendix
diff --git a/doc/doxywizard_expert.png b/doc/doxywizard_expert.png
index 93fd4ee..5eb14d4 100644
--- a/doc/doxywizard_expert.png
+++ b/doc/doxywizard_expert.png
Binary files differ
diff --git a/doc/doxywizard_main.png b/doc/doxywizard_main.png
index e57c144..b170e15 100644
--- a/doc/doxywizard_main.png
+++ b/doc/doxywizard_main.png
Binary files differ
diff --git a/doc/doxywizard_menu.png b/doc/doxywizard_menu.png
index 37adc46..7f37192 100644
--- a/doc/doxywizard_menu.png
+++ b/doc/doxywizard_menu.png
Binary files differ
diff --git a/doc/doxywizard_page1.png b/doc/doxywizard_page1.png
index ee3181d..3e008d0 100644
--- a/doc/doxywizard_page1.png
+++ b/doc/doxywizard_page1.png
Binary files differ
diff --git a/doc/doxywizard_page2.png b/doc/doxywizard_page2.png
index dc9b5a8..8343902 100644
--- a/doc/doxywizard_page2.png
+++ b/doc/doxywizard_page2.png
Binary files differ
diff --git a/doc/doxywizard_page3.png b/doc/doxywizard_page3.png
index f75e63f..0201981 100644
--- a/doc/doxywizard_page3.png
+++ b/doc/doxywizard_page3.png
Binary files differ
diff --git a/doc/doxywizard_page4.png b/doc/doxywizard_page4.png
index e4f4361..1068e6c 100644
--- a/doc/doxywizard_page4.png
+++ b/doc/doxywizard_page4.png
Binary files differ
diff --git a/doc/emojisup.doc b/doc/emojisup.doc
new file mode 100644
index 0000000..aff4058
--- /dev/null
+++ b/doc/emojisup.doc
@@ -0,0 +1,120 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2018 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.
+ *
+ */
+/*! \page emojisup Emoji support
+
+The [Unicode consortium](http://www.unicode.org/) has defined a set of
+[emoji](https://en.wikipedia.org/wiki/Emoji) with the corresponding unicode
+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.
+
+\section emojirep Representation
+
+For the different doxygen output types there is an output defined:
+- Unicode code sequence, the actual representation is depending on the possibilities of the fonts loaded:
+ - HTML
+ - XML
+ - DocBook
+ - RTF, converted to UTF-16 representation.
+- Image
+ - \LaTeX, in case the image can be found (see \ref emojiimage "Emoji image retrieval") otherwise the plain emoji text (i.e. `:<text>:`) is displayed
+- plain emoji text (i.e. `:<text>:`)
+ - man
+ - perl
+
+\section emojiimage Emoji image retrieval
+
+In the list of images can be downloaded via the following Python script:
+\code{.py}
+# script to download the emoticons from GitHub and to produce a table for
+# inclusion in doxygen. Works with python 2.7+ and python 3.x
+import json
+import os
+import argparse
+import re
+try:
+ import urllib.request as urlrequest
+except ImportError:
+ import urllib as urlrequest
+
+unicode_re = re.compile(r'.*?/unicode/(.*?).png\?.*')
+
+def get_emojis():
+ response = urlrequest.urlopen('https://api.github.com/emojis')
+ raw_data = response.read()
+ return json.loads(raw_data)
+
+def download_images(dir_name):
+ json_data = get_emojis()
+ num_items = len(json_data)
+ cur_item=0
+ for image,url in sorted(json_data.items()):
+ image_name = image+'.png'
+ cur_item=cur_item+1
+ if url.find('/unicode/')==-1 or not os.path.isfile(dir_name+'/'+image_name):
+ with open(dir_name+'/'+image_name,'wb') as file:
+ print('%s/%s: fetching %s' % (cur_item,num_items,image_name))
+ file.write(urlrequest.urlopen(url).read())
+ else:
+ print('%s/%s: skipping %s' % (cur_item,num_items,image_name))
+
+def produce_table():
+ json_data = get_emojis()
+ lines = []
+ for image,url in sorted(json_data.items()):
+ match = unicode_re.match(url)
+ if match:
+ unicodes = match.group(1).split('-')
+ unicodes_html = ''.join(["&#x"+x+";" for x in unicodes])
+ image_str = "\":"+image+":\","
+ unicode_str = "\""+unicodes_html+"\""
+ lines.append(' { %-42s %-38s }' % (image_str,unicode_str))
+ out_str = ',\n'.join(lines)
+ print("{")
+ print(out_str)
+ print("};")
+
+if __name__=="__main__":
+ parser = argparse.ArgumentParser()
+ group = parser.add_mutually_exclusive_group()
+ group.add_argument('-d','--dir',help='directory to place images in')
+ group.add_argument('-t','--table',help='generate code fragment',action='store_true')
+ args = parser.parse_args()
+ if args.table:
+ produce_table()
+ else:
+ download_images(args.dir)
+
+\endcode
+When invoking it with the `-d image_dir` option the images will by downloaded in the `image_dir` directory.
+By means of the doxygen configuration parameter
+\ref cfg_latex_emoji_directory "LATEX_EMOJI_DIRECTORY" the requested directory can be selected.
+
+For convenience a zip with the result of running the script can also be downloaded from
+http://www.doxygen.nl/dl/github_emojis.zip
+
+For a overview of the supported emoji one can issue the comand:<br>
+`doxygen -f emoji <outputFileName>`
+
+\htmlonly
+Go to the <a href="langhowto.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
+
diff --git a/doc/extsearch_flow.png b/doc/extsearch_flow.png
index e99450c..b6dc26c 100644
--- a/doc/extsearch_flow.png
+++ b/doc/extsearch_flow.png
Binary files differ
diff --git a/doc/faq.doc b/doc/faq.doc
index e9c93d8..f48e109 100644
--- a/doc/faq.doc
+++ b/doc/faq.doc
@@ -216,7 +216,7 @@ If you don't mind spending some time on it, there are several options:
- If the grammar of X is somewhat different than you can write an input
filter that translates X into something similar enough to C/C++ for
doxygen to understand (this approach is taken for VB, Object Pascal, and
- Javascript, see http://www.stack.nl/~dimitri/doxygen/download.html#helpers).
+ Javascript, see http://www.doxygen.org/download.html#helpers).
- If the grammar is completely different one could write a parser for X and
write a backend that produces a similar syntax tree as is done by
\c src/scanner.l (and also by \c src/tagreader.cpp while reading tag files).
diff --git a/doc/features.doc b/doc/features.doc
index f6aa7c1..8b19898 100644
--- a/doc/features.doc
+++ b/doc/features.doc
@@ -33,7 +33,7 @@
<li>Supports documentation of files, namespaces, packages, classes,
structs, unions, templates, variables, functions, typedefs, enums and
defines.
-<li>JavaDoc (1.1), qdoc3 (partially), and ECMA-334 (C# spec.) compatible.
+<li>Javadoc (1.1), qdoc3 (partially), and ECMA-334 (C# spec.) compatible.
<li>Comes with a GUI frontend (Doxywizard) to ease editing the options and
run doxygen. The GUI is available on Windows, Linux, and MacOSX.
<li>Automatically generates class and collaboration diagrams in HTML (as clickable
@@ -100,7 +100,7 @@
Although doxygen can now be used in any project written in a language that is
supported by doxygen, initially it was specifically designed to be used for projects
that make use of Qt Software's
-<A HREF="http://qt-project.org/">Qt toolkit</A>. I have tried to
+<A HREF="https://www.qt.io/developers/">Qt toolkit</A>. I have tried to
make doxygen `Qt-compatible'. That is: Doxygen can read the documentation contained in
the Qt source code and create a class browser that looks quite similar to the
one that is generated by Qt Software. Doxygen understands the C++ extensions
diff --git a/doc/grouping.doc b/doc/grouping.doc
index 2c4ebe1..2a87704 100644
--- a/doc/grouping.doc
+++ b/doc/grouping.doc
@@ -138,7 +138,6 @@ in .c files without having to duplicate the hierarchy exactly.
\include group.cpp
\htmlonly
-</p>
Click <a href="examples/group/html/modules.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -196,7 +195,6 @@ documentation of the class.
\include memgrp.cpp
\htmlonly
-</p>
Click <a href="examples/memgrp/html/class_memgrp___test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
@@ -226,10 +224,8 @@ two groups GA and GB, where GB is part of GA, page A is put in group GA,
and page B is put in group GB.
\htmlonly
-</p>
Go to the <a href="formulas.html">next</a> section or return to the
<a href="index.html">index</a>.
-<p>
\endhtmlonly
*/
diff --git a/doc/index.doc b/doc/index.doc
index 5bb7b2b..9afe624 100644
--- a/doc/index.doc
+++ b/doc/index.doc
@@ -102,6 +102,8 @@ The second part forms a reference manual:
can be used within the documentation.
<li>Section \ref xmlcmds shows an overview of the C# style XML commands that
can be used within the documentation.
+<li>Section \ref emojisup shows an introduction how emoji can be used within
+ the documentation.
</ul>
The third part provides information for developers:
@@ -119,7 +121,7 @@ The third part provides information for developers:
\addindex GPL
Copyright &copy; 1997-2016 by
-<a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>.<p>
+<a href="mailto:doxygen@gmail.com">Dimitri van Heesch</a>.<p>
Permission to use, copy, modify, and distribute this software and its
documentation under the terms of the GNU General Public License is hereby
@@ -143,7 +145,7 @@ of real-life projects using doxygen.
These are part of a larger
<a href="http://www.doxygen.org/projects.html">list of projects</a>
that use doxygen.
-If you know other projects, let <a href="mailto:dimitri@stack.nl?subject=New%20project%20using%20Doxygen">me</a>
+If you know other projects, let <a href="mailto:doxygen@gmail.com?subject=New%20project%20using%20Doxygen">me</a>
know and I'll add them.
<h2>Future work</h2>
diff --git a/doc/infoflow.png b/doc/infoflow.png
index d975be1..f676724 100644
--- a/doc/infoflow.png
+++ b/doc/infoflow.png
Binary files differ
diff --git a/doc/install.doc b/doc/install.doc
index 497a0c0..d64b259 100644
--- a/doc/install.doc
+++ b/doc/install.doc
@@ -36,6 +36,7 @@ following to build the executable:
\addindex make
\addindex strip
\addindex python
+<li>You need \c python (version 2.6 or higher, see https://www.python.org).
<li>In order to generate a \c Makefile for your platform, you need
<a href="https://cmake.org/">cmake</a> version 2.8.12 or later.
\addindex cmake
@@ -46,9 +47,9 @@ tools should be installed.
<ul>
<li>Qt Software's GUI toolkit
- <a href="http://qt-project.org/">Qt</A>
+ <a href="https://www.qt.io/developers/">Qt</A>
\addindex Qt
- version 4.3 or higher (but currently, Qt 5.x is not yet supported).
+ version 4.3 or higher (including Qt 5).
This is needed to build the GUI front-end doxywizard.
<li>A \LaTeX distribution: for instance
<a href="http://www.tug.org/interest.html#free">TeX Live</a>
@@ -151,6 +152,7 @@ standard installation procedure that is required for these packages.
From version 1.8.10 onwards, build files need to be generated by cmake.
cmake can be downloaded from https://cmake.org/download/
+\addindex cmake
At the moment only the express version of Visual Studio 2013 is tested,
but other version might also work.
@@ -160,9 +162,12 @@ Alternatively, you can compile doxygen
<a href="https://en.wikipedia.org/wiki/Cygwin">Cygwin</a>
or <a href="http://www.mingw.org/">MinGW</a>.
+\addindex flex
+\addindex bison
The next step is to install modern versions of \c bison and \c flex
(see https://sourceforge.net/projects/winflexbison/. After installation and adding them to
your `path` rename `win_flex.exe` to `flex.exe` and `win_bison.exe` to `bison.exe`)
+\addindex python
Furthermore you have to install \c python (version 2.6 or higher, see https://www.python.org).
These packages are needed during the compilation process.
@@ -174,7 +179,7 @@ cd c:\tools
tar zxvf doxygen-x.y.z.src.tar.gz
\endverbatim
to unpack the sources (you can obtain \c tar from e.g. http://gnuwin32.sourceforge.net/packages.html).
-Alternatively you can use an unpack program, like 7-Zip (see http://www.7-zip.org)
+Alternatively you can use an unpack program, like 7-Zip (see https://www.7-zip.org/)
or use the build in unpack feature of modern Windows systems).
Now your environment is setup to generate the required project files for \c doxygen.
@@ -186,8 +191,8 @@ cd build
cmake -G "Visual Studio 12 2013" ..
\endverbatim
-Note that compiling Doxywizard currently requires Qt version 4
-(see http://qt-project.org/).
+Note that compiling Doxywizard requires Qt 4.3 or newer
+(see https://www.qt.io/developers/).
Also read the next section for additional tools you may need to install to run
doxygen with certain features enabled.
@@ -206,12 +211,12 @@ If you want to produce compressed HTML files (see \ref
cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the configuration file, then
you need the Microsoft HTML help workshop.
You can download it from
-<a href="http://www.microsoft.com/en-us/download/details.aspx?id=21138">Microsoft</a>.
+<a href="https://www.microsoft.com/en-us/download/details.aspx?id=21138">Microsoft</a>.
If you want to produce Qt Compressed Help files (see \ref
cfg_qhg_location "QHG_LOCATION") in the configuration file, then
you need qhelpgenerator which is part of Qt.
-You can download Qt from <a href="http://qt-project.org/downloads">Qt Software Downloads</a>.
+You can download Qt from <a href="https://www.qt.io/download">Qt Software Downloads</a>.
In order to generate PDF output or use scientific formulas you will also need to
install <a href="https://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and
@@ -219,7 +224,7 @@ install <a href="https://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and
For \LaTeX a number of distributions exists. Popular ones that should work with
doxygen are <a href="https://miktex.org/">MikTex</a>
-and <a href="http://www.tug.org/protext/">proTeXt</a>.
+and <a href="https://www.tug.org/protext/">proTeXt</a>.
Ghostscript can be <a href="https://sourceforge.net/projects/ghostscript/">downloaded</a>
from Sourceforge.
diff --git a/doc/maintainers.txt b/doc/maintainers.txt
index 3fa4fff..7ea40ac 100644
--- a/doc/maintainers.txt
+++ b/doc/maintainers.txt
@@ -50,10 +50,10 @@ Poul-Erik Hansen: pouhan at gnotometrics dot dk
Erik Søe Sørensen: eriksoe+doxygen at daimi dot au dot dk
TranslatorDutch
-Dimitri van Heesch: dimitri at stack dot nl
+Dimitri van Heesch: doxygen at gmail dot com
TranslatorEnglish
-Dimitri van Heesch: dimitri at stack dot nl
+Dimitri van Heesch: doxygen at gmail dot com
TranslatorEsperanto
Ander Martínez: ander dot basaundi at gmail dot com
diff --git a/doc/markdown.doc b/doc/markdown.doc
index 92612ca..5edbaf9 100644
--- a/doc/markdown.doc
+++ b/doc/markdown.doc
@@ -41,7 +41,7 @@ the extensions that doxygen supports.
Finally section \ref markdown_dox discusses some specifics for doxygen's
implementation of the Markdown standard.
-[markdown]: http://daringfireball.net/projects/markdown/
+[markdown]: https://daringfireball.net/projects/markdown/
[mdextra]: https://michelf.ca/projects/php-markdown/extra/
[github]: https://github.github.com/github-flavored-markdown/
@@ -173,7 +173,18 @@ Examples:
* __double underscores__
See section \ref mddox_emph_spans for more info how doxygen handles
-emphasis spans slightly different than standard Markdown.
+emphasis / strikethrough spans slightly different than standard / Markdown GitHub Flavored Markdown.
+
+\subsection md_strikethrough Strikethrough
+
+To strikethrough a text fragment you start and end the fragment with two tildes.
+
+Examples:
+
+* ~~double tilde~~
+
+See section \ref mddox_emph_spans for more info how doxygen handles
+emphasis / strikethrough spans slightly different than standard Markdown / GitHub Flavored Markdown.
\subsection md_codespan code spans
@@ -567,22 +578,22 @@ For Item1 the indentation is 4 (when treating the list marker as whitespace),
so the next paragraph "More text..." starts at the same indentation level
and is therefore not seen as a code block.
-\subsection mddox_emph_spans Emphasis limits
+\subsection mddox_emph_spans Emphasis and strikethrough limits
-Unlike standard Markdown, doxygen will not touch internal underscores or
-stars, so the following will appear as-is:
+Unlike standard Markdown and Github Flavored Markdown doxygen will not touch internal underscores or
+stars or tildes, so the following will appear as-is:
a_nice_identifier
-Furthermore, a `*` or `_` only starts an emphasis if
+Furthermore, a `*` or `_` only starts an emphasis and a `~` only starts a strikethrough if
- it is followed by an alphanumerical character, and
- it is preceded by a space, newline, or one the following characters `<{([,:;`
-An emphasis ends if
+An emphasis or a strikethrough ends if
- it is not followed by an alphanumerical character, and
- it is not preceded by a space, newline, or one the following characters `({[<=+-\@`
-Lastly, the span of the emphasis is limited to a single paragraph.
+Lastly, the span of the emphasis or strikethrough is limited to a single paragraph.
\subsection mddox_code_spans Code Spans Limits
diff --git a/doc/output.doc b/doc/output.doc
index 3a24a60..6d1a567 100644
--- a/doc/output.doc
+++ b/doc/output.doc
@@ -32,7 +32,7 @@ The following output formats are \e directly supported by doxygen:
Word. If you have success with other programs, please let me know.
<dt><b>XML</b>
<dd>Generated if \ref cfg_generate_xml "GENERATE_XML" is set to \c YES in the configuration file.<p>
-<dt><b>Docbook</b>
+<dt><b>DocBook</b>
<dd>Generated if \ref cfg_generate_docbook "GENERATE_DOCBOOOK" is set to \c YES in the configuration file.<p>
</dl>
diff --git a/doc/perlmod.doc b/doc/perlmod.doc
index 3d2e2c2..1ef4bbc 100644
--- a/doc/perlmod.doc
+++ b/doc/perlmod.doc
@@ -56,7 +56,7 @@ Perl and it's the main purpose of including the Perl Module backend in
doxygen. See \ref doxydocs_format "below" for details on how
to do this.
-<-- want to use \LaTeX but not possible in headings -->
+<!-- want to use \LaTeX but not possible in headings -->
\section perlmod_latex Using the LaTeX generator.
<p>The Perl Module-based \LaTeX generator is pretty experimental and
diff --git a/doc/searching.doc b/doc/searching.doc
index cb6b84a..9bc518a 100644
--- a/doc/searching.doc
+++ b/doc/searching.doc
@@ -126,7 +126,7 @@ has its own advantages and disadvantages:
options you may want to set. After doxygen has finished you will find
a Makefile in the HTML output directory. Running "make install" on this
Makefile will compile and install the doc set.
- See <a href="https://developer.apple.com/library/mac/#featuredarticles/DoxygenXcode/_index.html">this
+ See <a href="https://developer.apple.com/library/archive/featuredarticles/DoxygenXcode/_index.html">this
article</a> for more info.
Advantage of this method is that it nicely integrates with the Xcode
@@ -139,7 +139,7 @@ has its own advantages and disadvantages:
<h2>6. Qt Compressed Help</h2>
If you develop for or want to install the Qt application framework,
you will get an application
- called <a href="http://qt-project.org/doc/qt-4.8/assistant-manual.html">Qt assistant</a>.
+ called <a href="http://doc.qt.io/archives/qt-4.8/assistant-manual.html">Qt assistant</a>.
This is a help viewer for Qt Compressed Help files (<code>.qch</code>).
To enable this feature set \ref cfg_generate_qhp "GENERATE_QHP" to \c YES.
diff --git a/doc/smile.png b/doc/smile.png
new file mode 100644
index 0000000..a3abe00
--- /dev/null
+++ b/doc/smile.png
Binary files differ
diff --git a/doc/starting.doc b/doc/starting.doc
index 0765a3b..f9ae9a2 100644
--- a/doc/starting.doc
+++ b/doc/starting.doc
@@ -106,38 +106,32 @@ To omit all \c test directories from a source tree for instance, one could use:
Doxygen looks at the file's extension to determine how to parse a file,
using the following table:
-Extension | Language
----------:|---------
-.idl |IDL
-.ddl |IDL
-.odl |IDL
-.java |Java
-.cs |C#
-.d |D
-.php |PHP
-.php4 |PHP
-.php5 |PHP
-.inc |PHP
-.phtml |PHP
-.m |Objective-C
-.M |Objective-C
-.mm |Objective-C
-.py |Python
-.f |Fortran
-.for |Fortran
-.f90 |Fortran
-.f95 |Fortran
-.f03 |Fortran
-.f08 |Fortran
-.vhd |VHDL
-.vhdl |VHDL
-.tcl |TCL
-.ucf |VHDL
-.qsf |VHDL
-.md |Markdown
-.markdown |Markdown
-
-Any other extension is parsed as if it is a C/C++ file.
+Extension | Language | Extension | Language | Extension | Language
+---------:|--------- | ---------:|------------- | ---------:|---------
+.dox |C / C++ | .idl |IDL | .f |Fortran
+.doc |C / C++ | .ddl |IDL | .for |Fortran
+.c |C / C++ | .odl |IDL | .f90 |Fortran
+.cc |C / C++ | .java |Java | .f95 |Fortran
+.cxx |C / C++ | .cs |C# | .f03 |Fortran
+.cpp |C / C++ | .d |D | .f08 |Fortran
+.c++ |C / C++ | .php |PHP | .vhd |VHDL
+.ii |C / C++ | .php4 |PHP | .vhdl |VHDL
+.ixx |C / C++ | .php5 |PHP | .ucf |VHDL
+.ipp |C / C++ | .inc |PHP | .qsf |VHDL
+.i++ |C / C++ | .phtml |PHP | .tcl |TCL
+.inl |C / C++ | .m |Objective-C | .md |Markdown
+.h |C / C++ | .M |Objective-C | .markdown |Markdown
+.H |C / C++ | .py |Python | .ice |Slice
+.hh |C / C++ | .pyw |Python | | |
+.HH |C / C++ | | | | |
+.hxx |C / C++ | | | | |
+.hpp |C / C++ | | | | |
+.h++ |C / C++ | | | | |
+.mm |C / C++ | | | | |
+
+Any other extension is not parsed unless it is added to
+\ref cfg_file_patterns "FILE_PATTERNS" and the appropriate
+\ref cfg_extension_mapping "EXTENSION_MAPPING" is set.
\anchor extract_all
If you start using doxygen for an existing project (thus without any
@@ -263,7 +257,7 @@ capabilities of the man page format, so some information
\subsection docbook_out DocBook output
\addindex docbook
Doxygen can also generate output in the
-<a href="http://docbook.org/">DocBook</a> format. How to process the
+<a href="https://docbook.org/">DocBook</a> format. How to process the
DocBook output is beyond the scope of this manual.
\section step3 Step 3: Documenting the sources
diff --git a/doc/translator.py b/doc/translator.py
index 798774b..2246c08 100644
--- a/doc/translator.py
+++ b/doc/translator.py
@@ -1226,12 +1226,20 @@ class TrManager:
doxy_default = os.path.join(self.script_path, '..')
self.doxy_path = os.path.abspath(os.getenv('DOXYGEN', doxy_default))
- # Get the explicit arguments of the script.
- self.script_argLst = sys.argv[1:]
-
# Build the path names based on the Doxygen's root knowledge.
self.doc_path = os.path.join(self.doxy_path, 'doc')
self.src_path = os.path.join(self.doxy_path, 'src')
+ # Normally the original sources aren't in the current directory
+ # (as we are in the build directory) so we have to specify the
+ # original source directory.
+ self.org_src_path = self.src_path
+ if (len(sys.argv) > 1 and os.path.isdir(os.path.join(sys.argv[1], 'src'))):
+ self.org_src_path = os.path.join(sys.argv[1], 'src')
+ # Get the explicit arguments of the script.
+ self.script_argLst = sys.argv[2:]
+ else:
+ # Get the explicit arguments of the script.
+ self.script_argLst = sys.argv[1:]
# Create the empty dictionary for Transl object identified by the
# class identifier of the translator.
@@ -1413,15 +1421,15 @@ class TrManager:
are searched in doxygen/src directory.
"""
files = []
- for item in os.listdir(self.src_path):
+ for item in os.listdir(self.org_src_path):
# Split the bare name to get the extension.
name, ext = os.path.splitext(item)
ext = ext.lower()
# Include only .cpp and .h files (case independent) and exclude
# the files where the checked identifiers are defined.
- if ext == '.cpp' or (ext == '.h' and name.find('translator') == -1):
- fname = os.path.join(self.src_path, item)
+ if ext == '.cpp' or ext == '.l' or (ext == '.h' and name.find('translator') == -1):
+ fname = os.path.join(self.org_src_path, item)
assert os.path.isfile(fname) # assumes no directory with the ext
files.append(fname) # full name
return files
@@ -1444,12 +1452,14 @@ class TrManager:
assert os.path.isfile(fname)
f = xopen(fname)
cont = f.read()
+ cont = ''.join(cont.split('\n')) # otherwise the 'match' function won't work.
f.close()
# Remove the items for identifiers that were found in the file.
while lst_in:
item = lst_in.pop(0)
- if cont.find(item) != -1:
+ rexItem = re.compile('.*' + item + ' *\(')
+ if rexItem.match(cont):
del dic[item]
diff --git a/doc/trouble.doc b/doc/trouble.doc
index 6b05cd3..c490ae1 100644
--- a/doc/trouble.doc
+++ b/doc/trouble.doc
@@ -128,7 +128,7 @@ please use PATCH as a keyword in the bug entry form.
If you have ideas how to fix existing bugs and limitations please discuss them on
the <a href="http://sourceforge.net/mail/?group_id=5971">developers mailing list</a>
-(subscription required). Patches can also be sent directly to dimitri@stack.nl if
+(subscription required). Patches can also be sent directly to doxygen@gmail.com if
you prefer not to send them via the bug tracker or mailing list.
For patches please use
diff --git a/doc/xmlcmds.doc b/doc/xmlcmds.doc
index 848858d..b59095b 100644
--- a/doc/xmlcmds.doc
+++ b/doc/xmlcmds.doc
@@ -104,7 +104,7 @@ class Engine
\htmlonly
-Go to the <a href="langhowto.html">next</a> section or return to the
+Go to the <a href="emojisup.html">next</a> section or return to the
<a href="index.html">index</a>.
\endhtmlonly
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 601ed5a..0f34c6d 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -163,8 +163,9 @@ add_custom_command(
add_custom_command(
COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen tag.cfg
+ COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/tag/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/tag/latex/refman_doc.tex
DEPENDS doxygen tag.cpp tag.cfg ${PROJECT_BINARY_DIR}/html/examples/example/html/index.html ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/tag/html/index.html
+ OUTPUT ${PROJECT_BINARY_DIR}/html/examples/tag/html/index.html ${PROJECT_BINARY_DIR}/html/examples/tag/latex/refman_doc.tex
)
add_custom_command(
@@ -183,8 +184,9 @@ add_custom_command(
add_custom_command(
COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen templ.cfg
+ COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/template/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/template/latex/refman_doc.tex
DEPENDS doxygen templ.cpp templ.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/template/html/index.html
+ OUTPUT ${PROJECT_BINARY_DIR}/html/examples/template/html/index.html ${PROJECT_BINARY_DIR}/html/examples/template/latex/refman_doc.tex
)
add_custom_command(
diff --git a/examples/dbusxml.cfg b/examples/dbusxml.cfg
deleted file mode 100644
index d964ea2..0000000
--- a/examples/dbusxml.cfg
+++ /dev/null
@@ -1,14 +0,0 @@
-PROJECT_NAME = "DBusXMLDocs"
-OUTPUT_DIRECTORY = ../html/examples/dbusxml
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = dbusxml.xml
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-EXTRACT_ALL = YES
-SEARCHENGINE = NO
-EXTENSION_MAPPING = xml=dbusxml
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
diff --git a/examples/dbusxml.xml b/examples/dbusxml.xml
deleted file mode 100644
index 4ab7f78..0000000
--- a/examples/dbusxml.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" ?>
-<!-- Comment -->
-<!--*< File comment -->
-<node name="/SomeNode" xmlns:dx="http://psiamp.org/dtd/doxygen_dbusxml.dtd">
- <!--* test struct outside a namespace and interface -->
- <dx:struct name="StructOutsideNamespace">
- <!--* member 1 -->
- <dx:member name="member1" type="s"/>
- <!--* complex member 1 -->
- <dx:member name="complexMember1" type="(ssu)"/>
- </dx:struct>
-
- <!--* Test flag set -->
- <dx:flagset name="flagset">
- <!--* Flag 1 of flagset. -->
- <dx:value name="FLAG1"/>
- </dx:flagset>
-
- <!--* namespace comment -->
- <dx:namespace name="SomeNamespace">
- <!--* struct inside a namespace -->
- <dx:struct name="StructInNamespace">
- <!--* member 2 -->
- <dx:member name="member2" type="s"/>
- </dx:struct>
- </dx:namespace>
- <!--* Documentation on the interface -->
- <interface name="nl.stack.doxygen.test.interface">
- <!--* Test Enum documentation -->
- <dx:enum name="TestEnum">
- <!--* key 1 with value 13 -->
- <dx:value name="KEY1" value="13"/>
- <!--* key 2 without a value -->
- <dx:value name="KEY2"/>
- </dx:enum>
-
- <!--* struct inside a interface -->
- <dx:struct name="StructInInterface">
- <!--* member 3 -->
- <dx:member name="member3" type="s"/>
- <!--* Struct in a struct -->
- <dx:struct name="StructInAStruct">
- <!--* member4 -->
- <dx:member name="member4" type="s"/>
- </dx:struct>
- <!--* struct member -->
- <dx:member name="structMembor" type="(s)" named-type="StructInAStruct"/>
- </dx:struct>
- <!--* Document method
-
- Some extended documentation for the method.
-
- @param[in] input blah.
- @param[out] output blub
- -->
- <method name="method">
- <arg direction="in" name="input" type="(s(s))" named-type="::nl::stack::doxygen::test::interface::StructInInterface"/>
- <arg direction="out" type="v" name="output"/>
- </method>
-
- <signal name="signal">
- <!--*< Documentation for signal.
-
- @param parameter some parameter.
- -->
- <arg name="parameter" type="s"/>
- </signal>
-
- <!--* property documentation -->
- <property name="property" type="s" access="readwrite"/>
-
- <!--* property documentation read-only -->
- <property name="propertyRead" type="s" access="read"/>
- <!--* property documentation write-only -->
- <property name="propertyWrite" type="s" access="write"/>
- </interface>
-</node>
-<!-- vim:set sw=2 sts=2 et ft=xml: -->
diff --git a/examples/example.cfg b/examples/example.cfg
index c55c6b9..22266d4 100644
--- a/examples/example.cfg
+++ b/examples/example.cfg
@@ -1,6 +1,6 @@
PROJECT_NAME = "Example Command"
OUTPUT_DIRECTORY = ../html/examples/example
-#GENERATE_TAGFILE = example.tag
+GENERATE_TAGFILE = example.tag
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
diff --git a/examples/example.tag b/examples/example.tag
deleted file mode 100644
index 98b2efd..0000000
--- a/examples/example.tag
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
-<tagfile>
- <compound kind="class">
- <name>Test</name>
- <filename>class_test.html</filename>
- <member kind="function">
- <type>void</type>
- <name>example</name>
- <anchorfile>class_test.html</anchorfile>
- <anchor>a47b775f65718978f1ffcd96376f8ecfa</anchor>
- <arglist>()</arglist>
- </member>
- </compound>
-</tagfile>
diff --git a/examples/jdstyle.cfg b/examples/jdstyle.cfg
index 0ddc0d9..d94089d 100644
--- a/examples/jdstyle.cfg
+++ b/examples/jdstyle.cfg
@@ -1,4 +1,4 @@
-PROJECT_NAME = "JavaDoc Style"
+PROJECT_NAME = "Javadoc Style"
OUTPUT_DIRECTORY = ../html/examples/jdstyle
GENERATE_LATEX = YES
GENERATE_MAN = NO
diff --git a/examples/tag.cfg b/examples/tag.cfg
index 97d7d2f..823b5a7 100644
--- a/examples/tag.cfg
+++ b/examples/tag.cfg
@@ -1,6 +1,6 @@
PROJECT_NAME = "Tag Files"
OUTPUT_DIRECTORY = ../html/examples/tag
-GENERATE_LATEX = NO
+GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
@@ -10,3 +10,5 @@ PERL_PATH = perl
QUIET = YES
JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES = YES
diff --git a/examples/tag.cpp b/examples/tag.cpp
index 6497dd4..74435c1 100644
--- a/examples/tag.cpp
+++ b/examples/tag.cpp
@@ -1,7 +1,7 @@
/*! A class that is inherited from the external class Test.
*/
-class Tag : public Test
+class Tag : public Example_Test
{
public:
/*! an overloaded member. */
diff --git a/examples/templ.cfg b/examples/templ.cfg
index eb59559..9d42e79 100644
--- a/examples/templ.cfg
+++ b/examples/templ.cfg
@@ -1,6 +1,6 @@
PROJECT_NAME = "Template Test"
OUTPUT_DIRECTORY = ../html/examples/template
-GENERATE_LATEX = NO
+GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT = templ.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES = YES
diff --git a/jquery/README b/jquery/README
index b8b115a..0d316f9 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 1.7.1: http://jquery.com/download/
-- jquery.ui 1.8.18: https://code.google.com/p/jquery-ui/downloads/list
+- jquery 1.7.1: https://jquery.com/download/
+- jquery.ui 1.8.18: https://github.com/jquery/jquery-ui
modules required:
- jquery.ui.core
- jquery.ui.widget
@@ -9,8 +9,8 @@ packages:
- jquery.ui.resizable
- jquery.hashchange: 1.3: http://benalman.com/projects/jquery-hashchange-plugin/
- jquery.scrollTo: 1.4.2: https://github.com/flesler/jquery.scrollTo
-- jquery.powertip: 1.2.0: http://stevenbenner.github.io/jquery-powertip/
+- jquery.powertip: 1.2.0: https://stevenbenner.github.io/jquery-powertip/
- jquery.touchpunch: 0.2.3: http://touchpunch.furf.com/
-- jquery.smartmenus: 1.0.0: http://www.smartmenus.org/
+- jquery.smartmenus: 1.0.0: https://www.smartmenus.org/
The Makefile will built the jquery.js files used by doxygen.
diff --git a/libmd5/md5.c b/libmd5/md5.c
index 5210d92..d0627ff 100644
--- a/libmd5/md5.c
+++ b/libmd5/md5.c
@@ -189,7 +189,7 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx)
void
MD5Transform(UWORD32 buf[4], UWORD32 const in[16])
{
- register UWORD32 a, b, c, d;
+ UWORD32 a, b, c, d;
a = buf[0];
b = buf[1];
diff --git a/qtools/qcstring.cpp b/qtools/qcstring.cpp
index 35b9bb8..77461b2 100644
--- a/qtools/qcstring.cpp
+++ b/qtools/qcstring.cpp
@@ -41,7 +41,7 @@ QCString &QCString::sprintf( const char *format, ... )
int QCString::find( char c, int index, bool cs ) const
{
if (index<0 || index>=(int)length()) return -1; // index outside string
- register const char *pos;
+ const char *pos;
if (cs)
{
pos = strchr(data()+index,c);
@@ -62,7 +62,7 @@ int QCString::find( const char *str, int index, bool cs ) const
if (index<0 || index>=l) return -1; // index outside string
if (!str) return -1; // no string to search for
if (!*str) return index; // empty string matching at index
- register const char *pos;
+ const char *pos;
if (cs) // case sensitive
{
pos = strstr(data()+index,str);
@@ -132,7 +132,7 @@ int QCString::findRev( const char *str, int index, bool cs) const
else if (index>len) return -1; // bad index
else if (index+slen>len) index=len-slen; // str would be too long
if (index<0) return -1; // no match possible
- register const char *pos = data()+index;
+ const char *pos = data()+index;
if (cs) // case sensitive
{
for (int i=index; i>=0; i--) if (qstrncmp(pos--,str,slen)==0) return i;
@@ -253,7 +253,7 @@ QCString QCString::mid( uint index, uint len) const
}
else
{
- register const char *p = data()+index;
+ const char *p = data()+index;
QCString s(len+1);
qstrncpy( s.rawData(), p, len+1 );
return s;
@@ -264,7 +264,7 @@ QCString QCString::lower() const
{
if (length()==0) return QCString();
QCString s(data());
- register char *pos = s.rawData();
+ char *pos = s.rawData();
if (pos)
{
while (*pos)
@@ -280,7 +280,7 @@ QCString QCString::upper() const
{
if (length()==0) return QCString();
QCString s(data());
- register char *pos = s.rawData();
+ char *pos = s.rawData();
if (pos)
{
while (*pos)
@@ -297,13 +297,13 @@ QCString QCString::stripWhiteSpace() const
if ( isEmpty() ) // nothing to do
return *this;
- register const char *cs = data();
+ const char *cs = data();
int reslen = length();
if ( !isspace((uchar)cs[0]) && !isspace((uchar)cs[reslen-1]) )
return *this; // returns a copy
QCString result(cs);
- register char *s = result.rawData();
+ char *s = result.rawData();
int start = 0;
int end = reslen - 1;
while ( isspace((uchar) s[start]) ) // skip white space from start
@@ -489,7 +489,7 @@ QCString &QCString::setNum(uint n)
QCString &QCString::setNum(long n)
{
char buf[20];
- register char *p = &buf[19];
+ char *p = &buf[19];
bool neg;
if ( n < 0 )
{
@@ -514,7 +514,7 @@ QCString &QCString::setNum(long n)
QCString &QCString::setNum( ulong n)
{
char buf[20];
- register char *p = &buf[19];
+ char *p = &buf[19];
*p = '\0';
do
{
@@ -529,8 +529,8 @@ QCString &QCString::setNum( ulong n)
void *qmemmove( void *dst, const void *src, uint len )
{
- register char *d;
- register char *s;
+ char *d;
+ char *s;
if ( dst > src ) {
d = (char *)dst + len - 1;
s = (char *)src + len - 1;
@@ -566,8 +566,8 @@ char *qstrncpy( char *dst, const char *src, uint len )
int qstricmp( const char *str1, const char *str2 )
{
- register const uchar *s1 = (const uchar *)str1;
- register const uchar *s2 = (const uchar *)str2;
+ const uchar *s1 = (const uchar *)str1;
+ const uchar *s2 = (const uchar *)str2;
int res;
uchar c;
if ( !s1 || !s2 )
@@ -580,8 +580,8 @@ int qstricmp( const char *str1, const char *str2 )
int qstrnicmp( const char *str1, const char *str2, uint len )
{
- register const uchar *s1 = (const uchar *)str1;
- register const uchar *s2 = (const uchar *)str2;
+ const uchar *s1 = (const uchar *)str1;
+ const uchar *s2 = (const uchar *)str2;
int res;
uchar c;
if ( !s1 || !s2 )
diff --git a/qtools/qdatastream.cpp b/qtools/qdatastream.cpp
index 70bcab1..5190b53 100644
--- a/qtools/qdatastream.cpp
+++ b/qtools/qdatastream.cpp
@@ -403,7 +403,7 @@ void QDataStream::setByteOrder( int bo )
static Q_INT32 read_int_ascii( QDataStream *s )
{
- register int n = 0;
+ int n = 0;
char buf[40];
while ( TRUE ) {
buf[n] = s->device()->getch();
@@ -462,7 +462,7 @@ QDataStream &QDataStream::operator>>( Q_INT16 &i )
} else if ( noswap ) { // no conversion needed
dev->readBlock( (char *)&i, sizeof(Q_INT16) );
} else { // swap bytes
- register uchar *p = (uchar *)(&i);
+ uchar *p = (uchar *)(&i);
char b[2];
dev->readBlock( b, 2 );
*p++ = b[1];
@@ -491,7 +491,7 @@ QDataStream &QDataStream::operator>>( Q_INT32 &i )
} else if ( noswap ) { // no conversion needed
dev->readBlock( (char *)&i, sizeof(Q_INT32) );
} else { // swap bytes
- register uchar *p = (uchar *)(&i);
+ uchar *p = (uchar *)(&i);
char b[4];
dev->readBlock( b, 4 );
*p++ = b[3];
@@ -521,7 +521,7 @@ QDataStream &QDataStream::operator>>( Q_INT64 &i )
} else if ( noswap ) { // no conversion needed
dev->readBlock( (char *)&i, sizeof(Q_INT64) );
} else { // swap bytes
- register uchar *p = (uchar *)(&i);
+ uchar *p = (uchar *)(&i);
char b[sizeof(Q_INT64)];
dev->readBlock( b, sizeof(Q_INT64) );
if ( sizeof(Q_INT64) == 8 ) {
@@ -540,7 +540,7 @@ QDataStream &QDataStream::operator>>( Q_INT64 &i )
static double read_double_ascii( QDataStream *s )
{
- register int n = 0;
+ int n = 0;
char buf[80];
while ( TRUE ) {
buf[n] = s->device()->getch();
@@ -566,7 +566,7 @@ QDataStream &QDataStream::operator>>( float &f )
} else if ( noswap ) { // no conversion needed
dev->readBlock( (char *)&f, sizeof(float) );
} else { // swap bytes
- register uchar *p = (uchar *)(&f);
+ uchar *p = (uchar *)(&f);
char b[4];
dev->readBlock( b, 4 );
*p++ = b[3];
@@ -591,7 +591,7 @@ QDataStream &QDataStream::operator>>( double &f )
} else if ( noswap ) { // no conversion needed
dev->readBlock( (char *)&f, sizeof(double) );
} else { // swap bytes
- register uchar *p = (uchar *)(&f);
+ uchar *p = (uchar *)(&f);
char b[8];
dev->readBlock( b, 8 );
*p++ = b[7];
@@ -670,7 +670,7 @@ QDataStream &QDataStream::readRawBytes( char *s, uint len )
{
CHECK_STREAM_PRECOND
if ( printable ) { // printable data
- register Q_INT8 *p = (Q_INT8*)s;
+ Q_INT8 *p = (Q_INT8*)s;
while ( len-- )
*this >> *p++;
} else { // read data char array
@@ -734,7 +734,7 @@ QDataStream &QDataStream::operator<<( Q_INT16 i )
} else if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&i, sizeof(Q_INT16) );
} else { // swap bytes
- register uchar *p = (uchar *)(&i);
+ uchar *p = (uchar *)(&i);
char b[2];
b[1] = *p++;
b[0] = *p;
@@ -765,7 +765,7 @@ QDataStream &QDataStream::operator<<( Q_INT32 i )
} else if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&i, sizeof(Q_INT32) );
} else { // swap bytes
- register uchar *p = (uchar *)(&i);
+ uchar *p = (uchar *)(&i);
char b[4];
b[3] = *p++;
b[2] = *p++;
@@ -797,7 +797,7 @@ QDataStream &QDataStream::operator<<( Q_INT64 i )
} else if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&i, sizeof(Q_INT64) );
} else { // swap bytes
- register uchar *p = (uchar *)(&i);
+ uchar *p = (uchar *)(&i);
char b[sizeof(Q_INT64)];
if ( sizeof(Q_INT64) == 8 ) {
b[7] = *p++;
@@ -845,7 +845,7 @@ QDataStream &QDataStream::operator<<( float f )
if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&g, sizeof(float) );
} else { // swap bytes
- register uchar *p = (uchar *)(&g);
+ uchar *p = (uchar *)(&g);
char b[4];
b[3] = *p++;
b[2] = *p++;
@@ -873,7 +873,7 @@ QDataStream &QDataStream::operator<<( double f )
} else if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&f, sizeof(double) );
} else { // swap bytes
- register uchar *p = (uchar *)(&f);
+ uchar *p = (uchar *)(&f);
char b[8];
b[7] = *p++;
b[6] = *p++;
@@ -939,7 +939,7 @@ QDataStream &QDataStream::writeRawBytes( const char *s, uint len )
{
CHECK_STREAM_PRECOND
if ( printable ) { // write printable
- register char *p = (char *)s;
+ char *p = (char *)s;
while ( len-- )
*this << *p++;
} else { // write data char array
diff --git a/qtools/qgarray.cpp b/qtools/qgarray.cpp
index df31363..2607a26 100644
--- a/qtools/qgarray.cpp
+++ b/qtools/qgarray.cpp
@@ -255,17 +255,17 @@ bool QGArray::fill( const char *d, int len, uint sz )
if ( sz == 1 ) // 8 bit elements
memset( data(), *d, len );
else if ( sz == 4 ) { // 32 bit elements
- register Q_INT32 *x = (Q_INT32*)data();
+ Q_INT32 *x = (Q_INT32*)data();
Q_INT32 v = *((Q_INT32*)d);
while ( len-- )
*x++ = v;
} else if ( sz == 2 ) { // 16 bit elements
- register Q_INT16 *x = (Q_INT16*)data();
+ Q_INT16 *x = (Q_INT16*)data();
Q_INT16 v = *((Q_INT16*)d);
while ( len-- )
*x++ = v;
} else { // any other size elements
- register char *x = data();
+ char *x = data();
while ( len-- ) { // more complicated
memcpy( x, d, sz );
x += sz;
@@ -329,7 +329,7 @@ QGArray &QGArray::duplicate( const QGArray &a )
if ( a.shd == shd ) { // a.duplicate(a) !
if ( shd->count > 1 ) {
shd->count--;
- register array_data *n = newData();
+ array_data *n = newData();
CHECK_PTR( n );
if ( (n->len=shd->len) ) {
n->data = NEW(char,n->len);
@@ -528,11 +528,11 @@ int QGArray::find( const char *d, uint index, uint sz ) const
#endif
return -1;
}
- register uint i;
+ uint i;
uint ii;
switch ( sz ) {
case 1: { // 8 bit elements
- register char *x = data() + index;
+ char *x = data() + index;
char v = *d;
for ( i=index; i<shd->len; i++ ) {
if ( *x++ == v )
@@ -542,7 +542,7 @@ int QGArray::find( const char *d, uint index, uint sz ) const
}
break;
case 2: { // 16 bit elements
- register Q_INT16 *x = (Q_INT16*)(data() + index);
+ Q_INT16 *x = (Q_INT16*)(data() + index);
Q_INT16 v = *((Q_INT16*)d);
for ( i=index; i<shd->len; i+=2 ) {
if ( *x++ == v )
@@ -552,7 +552,7 @@ int QGArray::find( const char *d, uint index, uint sz ) const
}
break;
case 4: { // 32 bit elements
- register Q_INT32 *x = (Q_INT32*)(data() + index);
+ Q_INT32 *x = (Q_INT32*)(data() + index);
Q_INT32 v = *((Q_INT32*)d);
for ( i=index; i<shd->len; i+=4 ) {
if ( *x++ == v )
@@ -583,11 +583,11 @@ int QGArray::find( const char *d, uint index, uint sz ) const
int QGArray::contains( const char *d, uint sz ) const
{
- register uint i = shd->len;
+ uint i = shd->len;
int count = 0;
switch ( sz ) {
case 1: { // 8 bit elements
- register char *x = data();
+ char *x = data();
char v = *d;
while ( i-- ) {
if ( *x++ == v )
@@ -596,7 +596,7 @@ int QGArray::contains( const char *d, uint sz ) const
}
break;
case 2: { // 16 bit elements
- register Q_INT16 *x = (Q_INT16*)data();
+ Q_INT16 *x = (Q_INT16*)data();
Q_INT16 v = *((Q_INT16*)d);
i /= 2;
while ( i-- ) {
@@ -606,7 +606,7 @@ int QGArray::contains( const char *d, uint sz ) const
}
break;
case 4: { // 32 bit elements
- register Q_INT32 *x = (Q_INT32*)data();
+ Q_INT32 *x = (Q_INT32*)data();
Q_INT32 v = *((Q_INT32*)d);
i /= 4;
while ( i-- ) {
diff --git a/qtools/qgcache.cpp b/qtools/qgcache.cpp
index 683c2a7..03150fe 100644
--- a/qtools/qgcache.cpp
+++ b/qtools/qgcache.cpp
@@ -577,7 +577,7 @@ bool QGCache::makeRoomFor( int cost, int priority )
return FALSE; // than maximum cost
if ( priority == -1 )
priority = 32767;
- register QCacheItem *ci = lruList->last();
+ QCacheItem *ci = lruList->last();
int cntCost = 0;
int dumps = 0; // number of items to dump
while ( cntCost < cost && ci && ci->skipPriority <= priority ) {
diff --git a/qtools/qgdict.cpp b/qtools/qgdict.cpp
index c8d8fbd..ab3fea9 100644
--- a/qtools/qgdict.cpp
+++ b/qtools/qgdict.cpp
@@ -90,7 +90,7 @@ int QGDict::hashKeyString( const QString &key )
qWarning( "QGDict::hashStringKey: Invalid null key" );
#endif
int i;
- register uint h=0;
+ uint h=0;
uint g;
int len = key.length();
const QChar *p = key.unicode();
@@ -129,8 +129,8 @@ int QGDict::hashKeyAscii( const char *key )
return 0;
}
#endif
- register const char *k = key;
- register uint h=0;
+ const char *k = key;
+ uint h=0;
uint g;
if ( cases ) { // case sensitive
while ( *k ) {
@@ -1170,8 +1170,8 @@ QCollection::Item QGDictIterator::toFirst()
curNode = 0;
return 0;
}
- register uint i = 0;
- register QBaseBucket **v = dict->vec;
+ uint i = 0;
+ QBaseBucket **v = dict->vec;
while ( !(*v++) )
i++;
curNode = dict->vec[i];
@@ -1217,8 +1217,8 @@ QCollection::Item QGDictIterator::operator++()
return 0;
curNode = curNode->getNext();
if ( !curNode ) { // no next bucket
- register uint i = curIndex + 1; // look from next vec element
- register QBaseBucket **v = &dict->vec[i];
+ uint i = curIndex + 1; // look from next vec element
+ QBaseBucket **v = &dict->vec[i];
while ( i < dict->size() && !(*v++) )
i++;
if ( i == dict->size() ) { // nothing found
diff --git a/qtools/qglist.cpp b/qtools/qglist.cpp
index 731d9fd..8197db5 100644
--- a/qtools/qglist.cpp
+++ b/qtools/qglist.cpp
@@ -280,7 +280,7 @@ QLNode *QGList::locate( uint index )
curNode = firstNode;
curIndex = 0;
}
- register QLNode *node;
+ QLNode *node;
int distance = index - curIndex; // node distance to cur node
bool forward; // direction to traverse
@@ -327,7 +327,7 @@ QLNode *QGList::locate( uint index )
void QGList::inSort( QCollection::Item d )
{
int index = 0;
- register QLNode *n = firstNode;
+ QLNode *n = firstNode;
while ( n && compareItems(n->data,d) < 0 ){ // find position in list
n = n->next;
index++;
@@ -343,7 +343,7 @@ void QGList::inSort( QCollection::Item d )
void QGList::prepend( QCollection::Item d )
{
- register QLNode *n = new QLNode( newItem(d) );
+ QLNode *n = new QLNode( newItem(d) );
CHECK_PTR( n );
n->prev = 0;
if ( (n->next = firstNode) ) // list is not empty
@@ -363,7 +363,7 @@ void QGList::prepend( QCollection::Item d )
void QGList::append( QCollection::Item d )
{
- register QLNode *n = new QLNode( newItem(d) );
+ QLNode *n = new QLNode( newItem(d) );
CHECK_PTR( n );
n->next = 0;
if ( (n->prev = lastNode) ) // list is not empty
@@ -394,7 +394,7 @@ bool QGList::insertAt( uint index, QCollection::Item d )
if ( !nextNode ) // illegal position
return FALSE;
QLNode *prevNode = nextNode->prev;
- register QLNode *n = new QLNode( newItem(d) );
+ QLNode *n = new QLNode( newItem(d) );
CHECK_PTR( n );
nextNode->prev = n;
prevNode->next = n;
@@ -437,7 +437,7 @@ QLNode *QGList::unlink()
{
if ( curNode == 0 ) // null current node
return 0;
- register QLNode *n = curNode; // unlink this node
+ QLNode *n = curNode; // unlink this node
if ( n == firstNode ) { // removing first node ?
if ( (firstNode = n->next) ) {
firstNode->prev = 0;
@@ -651,7 +651,7 @@ QCollection::Item QGList::takeLast()
void QGList::clear()
{
- register QLNode *n = firstNode;
+ QLNode *n = firstNode;
firstNode = lastNode = curNode = 0; // initialize list
numNodes = 0;
@@ -682,7 +682,7 @@ void QGList::clear()
int QGList::findRef( QCollection::Item d, bool fromStart )
{
- register QLNode *n;
+ QLNode *n;
int index;
if ( fromStart ) { // start from first node
n = firstNode;
@@ -707,7 +707,7 @@ int QGList::findRef( QCollection::Item d, bool fromStart )
int QGList::find( QCollection::Item d, bool fromStart )
{
- register QLNode *n;
+ QLNode *n;
int index;
if ( fromStart ) { // start from first node
n = firstNode;
@@ -733,7 +733,7 @@ int QGList::find( QCollection::Item d, bool fromStart )
uint QGList::containsRef( QCollection::Item d ) const
{
- register QLNode *n = firstNode;
+ QLNode *n = firstNode;
uint count = 0;
while ( n ) { // for all nodes...
if ( n->data == d ) // count # exact matches
@@ -750,7 +750,7 @@ uint QGList::containsRef( QCollection::Item d ) const
uint QGList::contains( QCollection::Item d ) const
{
- register QLNode *n = firstNode;
+ QLNode *n = firstNode;
uint count = 0;
QGList *that = (QGList*)this; // mutable for compareItems()
while ( n ) { // for all nodes...
@@ -876,7 +876,7 @@ void QGList::toVector( QGVector *vector ) const
vector->clear();
if ( !vector->resize( count() ) )
return;
- register QLNode *n = firstNode;
+ QLNode *n = firstNode;
uint i = 0;
while ( n ) {
vector->insert( i, n->data );
diff --git a/qtools/qgvector.cpp b/qtools/qgvector.cpp
index 63cce64..2d08ede 100644
--- a/qtools/qgvector.cpp
+++ b/qtools/qgvector.cpp
@@ -411,8 +411,8 @@ void QGVector::sort() // sort vector
{
if ( count() == 0 ) // no elements
return;
- register Item *start = &vec[0];
- register Item *end = &vec[len-1];
+ Item *start = &vec[0];
+ Item *end = &vec[len-1];
Item tmp;
while ( TRUE ) { // put all zero elements behind
while ( start < end && *start != 0 )
diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp
index fe478bd..0e2b14a 100644
--- a/qtools/qstring.cpp
+++ b/qtools/qstring.cpp
@@ -12956,7 +12956,7 @@ int QString::find( QChar c, int index, bool cs ) const
index += length();
if ( (uint)index >= length() ) // index outside string
return -1;
- register const QChar *uc;
+ const QChar *uc;
uc = unicode()+index;
int n = length()-index;
if ( cs ) {
@@ -13325,7 +13325,7 @@ QString QString::mid( uint index, uint len ) const
len = slen - index;
if ( index == 0 && len == length() )
return *this;
- register const QChar *p = unicode()+index;
+ const QChar *p = unicode()+index;
QString s( len, TRUE );
memcpy( s.d->unicode, p, len*sizeof(QChar) );
s.d->len = len;
@@ -13429,7 +13429,7 @@ QString QString::lower() const
int l=length();
if ( l ) {
s.real_detach(); // could do this only when we find a change
- register QChar *p=s.d->unicode;
+ QChar *p=s.d->unicode;
if ( p ) {
while ( l-- ) {
*p = p->lower();
@@ -13458,7 +13458,7 @@ QString QString::upper() const
int l=length();
if ( l ) {
s.real_detach(); // could do this only when we find a change
- register QChar *p=s.d->unicode;
+ QChar *p=s.d->unicode;
if ( p ) {
while ( l-- ) {
*p = p->upper();
@@ -13493,7 +13493,7 @@ QString QString::stripWhiteSpace() const
if ( !at(0).isSpace() && !at(length()-1).isSpace() )
return *this;
- register const QChar *s = unicode();
+ const QChar *s = unicode();
QString result = fromLatin1("");
int start = 0;
diff --git a/qtools/qtextstream.cpp b/qtools/qtextstream.cpp
index 4ebf59e..ffbdeba 100644
--- a/qtools/qtextstream.cpp
+++ b/qtools/qtextstream.cpp
@@ -1596,7 +1596,7 @@ QTextStream &QTextStream::output_int( int format, ulong n, bool neg )
static char hexdigits_upper[] = "0123456789ABCDEF";
CHECK_STREAM_PRECOND
char buf[76];
- register char *p;
+ char *p;
int len;
char *hexdigits;
@@ -1784,7 +1784,7 @@ QTextStream &QTextStream::operator<<( double f )
f_char = (flags() & uppercase) ? 'E' : 'e';
else
f_char = (flags() & uppercase) ? 'G' : 'g';
- register char *fs = format; // generate format string
+ char *fs = format; // generate format string
*fs++ = '%'; // "%.<prec>l<f_char>"
*fs++ = '.';
int prec = precision();
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b57d360..4dc31fa 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -183,6 +183,7 @@ add_library(_doxygen STATIC
dot.cpp
doxygen.cpp
eclipsehelp.cpp
+ emoji.cpp
entry.cpp
filedef.cpp
filename.cpp
diff --git a/src/cite.cpp b/src/cite.cpp
index b17800f..4f88611 100644
--- a/src/cite.cpp
+++ b/src/cite.cpp
@@ -223,7 +223,6 @@ void CiteDict::generatePage() const
if (line.find("<!-- BEGIN BIBLIOGRAPHY")!=-1) insideBib=TRUE;
else if (line.find("<!-- END BIBLIOGRAPH")!=-1) insideBib=FALSE;
- else if (insideBib) doc+=line+"\n";
int i;
// determine text to use at the location of the @cite command
if (insideBib && (i=line.find("name=\"CITEREF_"))!=-1)
@@ -234,14 +233,17 @@ void CiteDict::generatePage() const
{
QCString label = line.mid(i+14,j-i-14);
QCString number = line.mid(j+2,k-j-1);
+ label = substitute(substitute(label,"&ndash;","--"),"&mdash;","---");
CiteInfo *ci = m_entries.find(label);
//printf("label='%s' number='%s' => %p\n",label.data(),number.data(),ci);
+ line = line.left(i+14) + label + line.right(line.length()-j);
if (ci)
{
ci->text = number;
}
}
}
+ if (insideBib) doc+=line+"\n";
}
//printf("doc=[%s]\n",doc.data());
diff --git a/src/clangparser.cpp b/src/clangparser.cpp
index 78b8faa..18dd404 100644
--- a/src/clangparser.cpp
+++ b/src/clangparser.cpp
@@ -964,6 +964,7 @@ void ClangParser::writeSources(CodeOutputInterface &,FileDef *)
ClangParser::ClangParser()
{
+ p = NULL;
}
ClangParser::~ClangParser()
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 1d72073..e9d39d5 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -17,6 +17,7 @@
#include <stdio.h>
#include <qfile.h>
+#include <qfileinfo.h>
#include <qregexp.h>
#include "classdef.h"
#include "classlist.h"
@@ -201,6 +202,8 @@ class ClassDefImpl
bool isAnonymous;
uint64 spec;
+
+ QCString metaData;
};
void ClassDefImpl::init(const char *defFileName, const char *name,
@@ -671,6 +674,10 @@ void ClassDef::internalInsertMember(MemberDef *md,
case MemberType_Variable:
addMemberToList(MemberListType_variableMembers,md,FALSE);
break;
+ case MemberType_Define:
+ warn(md->getDefFileName(),md->getDefLine()-1,"A define (%s) cannot be made a member of %s",
+ md->name().data(), this->name().data());
+ break;
default:
err("Unexpected member type %d found!\n",md->memberType());
}
@@ -1110,7 +1117,15 @@ void ClassDef::showUsedFiles(OutputList &ol)
ol.writeRuler();
- ol.parseText(generatedFromFiles());
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Docbook);
+ ol.startParagraph();
+ ol.parseText(generatedFromFiles());
+ ol.endParagraph();
+ ol.popGeneratorState();
+ ol.disable(OutputGenerator::Docbook);
+ ol.parseText(generatedFromFiles());
+ ol.enable(OutputGenerator::Docbook);
bool first=TRUE;
QListIterator<FileDef> li(m_impl->files);
@@ -1223,7 +1238,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol)
}
}
else if (Config_getBool(CLASS_DIAGRAMS) && count>0)
- // write class diagram using build-in generator
+ // write class diagram using built-in generator
{
ClassDiagram diagram(this); // create a diagram of this class.
ol.startClassDiagram();
@@ -1360,10 +1375,165 @@ QCString ClassDef::includeStatement() const
}
}
+void ClassDef::writeIncludeFilesForSlice(OutputList &ol)
+{
+ if (m_impl->incInfo)
+ {
+ QCString nm;
+ QStrList paths = Config_getList(STRIP_FROM_PATH);
+ if (!paths.isEmpty() && m_impl->incInfo->fileDef)
+ {
+ QCString abs = m_impl->incInfo->fileDef->absFilePath();
+ const char *s = paths.first();
+ QCString potential;
+ unsigned int length = 0;
+ while (s)
+ {
+ QFileInfo info(s);
+ if (info.exists())
+ {
+ QString prefix = info.absFilePath();
+ if (prefix.at(prefix.length() - 1) != '/')
+ {
+ prefix += '/';
+ }
+
+ if (prefix.length() > length &&
+ qstricmp(abs.left(prefix.length()).data(), prefix.data()) == 0) // case insensitive compare
+ {
+ length = prefix.length();
+ potential = abs.right(abs.length() - prefix.length());
+ }
+ s = paths.next();
+ }
+ }
+
+ if (length > 0)
+ {
+ nm = potential;
+ }
+ }
+
+ if (nm.isEmpty())
+ {
+ nm = m_impl->incInfo->includeName.data();
+ }
+
+ ol.startParagraph();
+ ol.docify(theTranslator->trDefinedIn()+" ");
+ ol.startTypewriter();
+ ol.docify("<");
+ if (m_impl->incInfo->fileDef)
+ {
+ ol.writeObjectLink(0,m_impl->incInfo->fileDef->includeName(),0,nm);
+ }
+ else
+ {
+ ol.docify(nm);
+ }
+ ol.docify(">");
+ ol.endTypewriter();
+ ol.endParagraph();
+ }
+
+ // Write a summary of the Slice definition including metadata.
+ ol.startParagraph();
+ ol.startTypewriter();
+ if (!m_impl->metaData.isEmpty())
+ {
+ ol.docify(m_impl->metaData);
+ ol.lineBreak();
+ }
+ if (m_impl->spec & Entry::Local)
+ {
+ ol.docify("local ");
+ }
+ if (m_impl->spec & Entry::Interface)
+ {
+ ol.docify("interface ");
+ }
+ else if (m_impl->spec & Entry::Struct)
+ {
+ ol.docify("struct ");
+ }
+ else if (m_impl->spec & Entry::Exception)
+ {
+ ol.docify("exception ");
+ }
+ else
+ {
+ ol.docify("class ");
+ }
+ ol.docify(stripScope(name()));
+ if (m_impl->inherits)
+ {
+ if (m_impl->spec & (Entry::Interface|Entry::Exception))
+ {
+ ol.docify(" extends ");
+ BaseClassListIterator it(*m_impl->inherits);
+ BaseClassDef *ibcd;
+ for (;(ibcd=it.current());++it)
+ {
+ ClassDef *icd = ibcd->classDef;
+ ol.docify(icd->name());
+ if (!it.atLast())
+ {
+ ol.docify(", ");
+ }
+ }
+ }
+ else
+ {
+ // Must be a class.
+ bool implements = false;
+ BaseClassListIterator it(*m_impl->inherits);
+ BaseClassDef *ibcd;
+ for (;(ibcd=it.current());++it)
+ {
+ ClassDef *icd = ibcd->classDef;
+ if (icd->m_impl->spec & Entry::Interface)
+ {
+ implements = true;
+ }
+ else
+ {
+ ol.docify(" extends ");
+ ol.docify(icd->name());
+ }
+ }
+ if (implements)
+ {
+ ol.docify(" implements ");
+ bool first = true;
+ for (ibcd=it.toFirst();(ibcd=it.current());++it)
+ {
+ ClassDef *icd = ibcd->classDef;
+ if (icd->m_impl->spec & Entry::Interface)
+ {
+ if (!first)
+ {
+ ol.docify(", ");
+ }
+ else
+ {
+ first = false;
+ }
+ ol.docify(icd->name());
+ }
+ }
+ }
+ }
+ }
+ ol.docify(" { ... }");
+ ol.endTypewriter();
+ ol.endParagraph();
+}
+
void ClassDef::writeIncludeFiles(OutputList &ol)
{
if (m_impl->incInfo /*&& Config_getBool(SHOW_INCLUDE_FILES)*/)
{
+ SrcLangExt lang = getLanguage();
QCString nm=m_impl->incInfo->includeName.isEmpty() ?
(m_impl->incInfo->fileDef ?
m_impl->incInfo->fileDef->docName().data() : ""
@@ -1374,7 +1544,6 @@ void ClassDef::writeIncludeFiles(OutputList &ol)
ol.startParagraph();
ol.startTypewriter();
ol.docify(includeStatement());
- SrcLangExt lang = getLanguage();
bool isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java;
if (m_impl->incInfo->local || isIDLorJava)
ol.docify("\"");
@@ -1568,7 +1737,7 @@ void ClassDef::writeSummaryLinks(OutputList &ol)
SDict<QCString>::Iterator li(m_impl->vhdlSummaryTitles);
for (li.toFirst();li.current();++li)
{
- ol.writeSummaryLink(0,li.current()->data(),li.current()->data(),first);
+ ol.writeSummaryLink(0,convertToId(li.current()->data()),li.current()->data(),first);
first=FALSE;
}
}
@@ -1839,6 +2008,7 @@ void ClassDef::writeMoreLink(OutputList &ol,const QCString &anchor)
// LaTeX + RTF
ol.disable(OutputGenerator::Html);
ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Docbook);
if (!(usePDFLatex && pdfHyperlinks))
{
ol.disable(OutputGenerator::Latex);
@@ -1874,12 +2044,35 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade
{
//static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
//static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
SrcLangExt lang = getLanguage();
if (visibleInParentsDeclList())
{
if (!found) // first class
{
- ol.startMemberHeader("nested-classes");
+ if (sliceOpt)
+ {
+ if (compoundType()==Interface)
+ {
+ ol.startMemberHeader("interfaces");
+ }
+ else if (compoundType()==Struct)
+ {
+ ol.startMemberHeader("structs");
+ }
+ else if (compoundType()==Exception)
+ {
+ ol.startMemberHeader("exceptions");
+ }
+ else // compoundType==Class
+ {
+ ol.startMemberHeader("nested-classes");
+ }
+ }
+ else // non-Slice optimization: single header for class/struct/..
+ {
+ ol.startMemberHeader("nested-classes");
+ }
if (header)
{
ol.parseText(header);
@@ -1905,6 +2098,10 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade
if (lang!=SrcLangExt_VHDL) // for VHDL we swap the name and the type
{
+ if (isSliceLocal())
+ {
+ ol.writeString("local ");
+ }
ol.writeString(ctype);
ol.writeString(" ");
ol.insertMemberAlign();
@@ -2008,7 +2205,14 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page
writeBriefDescription(ol,exampleFlag);
break;
case LayoutDocEntry::ClassIncludes:
- writeIncludeFiles(ol);
+ if (lang==SrcLangExt_Slice)
+ {
+ writeIncludeFilesForSlice(ol);
+ }
+ else
+ {
+ writeIncludeFiles(ol);
+ }
break;
case LayoutDocEntry::ClassInheritanceGraph:
writeInheritanceGraph(ol);
@@ -2070,8 +2274,14 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page
case LayoutDocEntry::NamespaceNestedNamespaces:
case LayoutDocEntry::NamespaceNestedConstantGroups:
case LayoutDocEntry::NamespaceClasses:
+ case LayoutDocEntry::NamespaceInterfaces:
+ case LayoutDocEntry::NamespaceStructs:
+ case LayoutDocEntry::NamespaceExceptions:
case LayoutDocEntry::NamespaceInlineClasses:
case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileInterfaces:
+ case LayoutDocEntry::FileStructs:
+ case LayoutDocEntry::FileExceptions:
case LayoutDocEntry::FileNamespaces:
case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
@@ -2110,6 +2320,12 @@ QCString ClassDef::title() const
m_impl->compType,
m_impl->tempArgs != 0);
}
+ else if (lang==SrcLangExt_Slice)
+ {
+ pageTitle = theTranslator->trCompoundReferenceSlice(displayName(),
+ m_impl->compType,
+ isSliceLocal());
+ }
else if (lang==SrcLangExt_VHDL)
{
pageTitle = theTranslator->trCustomReference(VhdlDocGen::getClassTitle(this));
@@ -2148,9 +2364,35 @@ void ClassDef::writeDocumentation(OutputList &ol)
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
//static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
//static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
QCString pageTitle = title();
- startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_ClassVisible,!generateTreeView);
+ HighlightedItem hli;
+ if (sliceOpt)
+ {
+ if (compoundType()==Interface)
+ {
+ hli = HLI_InterfaceVisible;
+ }
+ else if (compoundType()==Struct)
+ {
+ hli = HLI_StructVisible;
+ }
+ else if (compoundType()==Exception)
+ {
+ hli = HLI_ExceptionVisible;
+ }
+ else
+ {
+ hli = HLI_ClassVisible;
+ }
+ }
+ else
+ {
+ hli = HLI_ClassVisible;
+ }
+
+ startFile(ol,getOutputFileBase(),name(),pageTitle,hli,!generateTreeView);
if (!generateTreeView)
{
if (getOuterScope()!=Doxygen::globalScope)
@@ -2277,15 +2519,40 @@ void ClassDef::writeMemberList(OutputList &ol)
{
static bool cOpt = Config_getBool(OPTIMIZE_OUTPUT_FOR_C);
//static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
if (m_impl->allMemberNameInfoSDict==0 || cOpt) return;
// only for HTML
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
+ HighlightedItem hli;
+ if (sliceOpt)
+ {
+ if (compoundType()==Interface)
+ {
+ hli = HLI_InterfaceVisible;
+ }
+ else if (compoundType()==Struct)
+ {
+ hli = HLI_StructVisible;
+ }
+ else if (compoundType()==Exception)
+ {
+ hli = HLI_ExceptionVisible;
+ }
+ else
+ {
+ hli = HLI_ClassVisible;
+ }
+ }
+ else
+ {
+ hli = HLI_ClassVisible;
+ }
+
QCString memListFile = getMemberListFileName();
- startFile(ol,memListFile,memListFile,theTranslator->trMemberList(),
- HLI_ClassVisible,!generateTreeView,getOutputFileBase());
+ startFile(ol,memListFile,memListFile,theTranslator->trMemberList(),hli,!generateTreeView,getOutputFileBase());
if (!generateTreeView)
{
if (getOuterScope()!=Doxygen::globalScope)
@@ -2305,8 +2572,8 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.endParagraph();
//ol.startItemList();
- ol.writeString("<table class=\"directory\">\n");
+ bool first = true; // to prevent empty table
int idx=0;
//MemberNameInfo *mni=m_impl->allMemberNameInfoList->first();
MemberNameInfoSDict::Iterator mnii(*m_impl->allMemberNameInfoSDict);
@@ -2333,6 +2600,11 @@ void ClassDef::writeMemberList(OutputList &ol)
{
QCString name=mi->ambiguityResolutionScope+md->name();
//ol.writeListItem();
+ if (first)
+ {
+ ol.writeString("<table class=\"directory\">\n");
+ first = false;
+ }
ol.writeString(" <tr");
if ((idx&1)==0) ol.writeString(" class=\"even\"");
idx++;
@@ -2386,6 +2658,11 @@ void ClassDef::writeMemberList(OutputList &ol)
// generate link to the class instead.
{
//ol.writeListItem();
+ if (first)
+ {
+ ol.writeString("<table class=\"directory\">\n");
+ first = false;
+ }
ol.writeString(" <tr bgcolor=\"#f0f0f0\"");
if ((idx&1)==0) ol.writeString(" class=\"even\"");
idx++;
@@ -2515,7 +2792,7 @@ void ClassDef::writeMemberList(OutputList &ol)
}
//ol.endItemList();
- ol.writeString("</table>");
+ if (!first) ol.writeString("</table>");
endFile(ol);
ol.popGeneratorState();
@@ -4737,12 +5014,22 @@ bool ClassDef::subGrouping() const
return m_impl->subGrouping;
}
+bool ClassDef::isSliceLocal() const
+{
+ return m_impl->spec&Entry::Local;
+}
+
void ClassDef::setName(const char *name)
{
m_impl->isAnonymous = QCString(name).find('@')!=-1;
Definition::setName(name);
}
+void ClassDef::setMetaData(const char *md)
+{
+ m_impl->metaData = md;
+}
+
bool ClassDef::isAnonymous() const
{
return m_impl->isAnonymous;
diff --git a/src/classdef.h b/src/classdef.h
index 12fcd93..14f9fc8 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -336,6 +336,7 @@ class ClassDef : public Definition
QCString getMemberListFileName() const;
bool subGrouping() const;
+ bool isSliceLocal() const;
//-----------------------------------------------------------------------------------
// --- setters ----
@@ -376,6 +377,8 @@ class ClassDef : public Definition
void setTagLessReference(ClassDef *cd);
void setName(const char *name);
+ void setMetaData(const char *md);
+
//-----------------------------------------------------------------------------------
// --- actions ----
//-----------------------------------------------------------------------------------
@@ -429,6 +432,7 @@ class ClassDef : public Definition
void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag,
const QCString &title,const QCString &anchor=QCString());
void writeIncludeFiles(OutputList &ol);
+ void writeIncludeFilesForSlice(OutputList &ol);
//void writeAllMembersLink(OutputList &ol);
void writeInheritanceGraph(OutputList &ol);
void writeCollaborationGraph(OutputList &ol);
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
index 71da3f3..16ed0d7 100644
--- a/src/cmdmapper.cpp
+++ b/src/cmdmapper.cpp
@@ -147,6 +147,7 @@ CommandMap cmdMap[] =
{ "--", CMD_NDASH },
{ "---", CMD_MDASH },
{ "_setscope", CMD_SETSCOPE },
+ { "emoji", CMD_EMOJI },
{ 0, 0 },
};
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
index d06de63..a033a0f 100644
--- a/src/cmdmapper.h
+++ b/src/cmdmapper.h
@@ -136,7 +136,8 @@ enum CommandType
CMD_MINUS = 106,
CMD_INCLUDEDOC = 107,
CMD_SNIPPETDOC = 108,
- CMD_SNIPWITHLINES= 109
+ CMD_SNIPWITHLINES= 109,
+ CMD_EMOJI = 110
};
enum HtmlTagType
diff --git a/src/code.l b/src/code.l
index 2c9b0ae..558c439 100644
--- a/src/code.l
+++ b/src/code.l
@@ -122,6 +122,7 @@ static bool g_insideJava;
static bool g_insideCS;
static bool g_insidePHP;
static bool g_insideProtocolList;
+static bool g_insideSlice;
static bool g_lexInit = FALSE;
@@ -983,7 +984,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
}
}
NamespaceDef *nd = getResolvedNamespace(className);
- if (nd)
+ if (nd && nd->isLinkableInProject())
{
g_theCallContext.setScope(nd);
addToSearchIndex(className);
@@ -1324,7 +1325,9 @@ static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName)
//CodeClassDef *ccd=0;
ClassDef *ccd=0;
QCString locScope=g_classScope;
- QCString locFunc=removeRedundantWhiteSpace(funcName);
+ QString qq=removeRedundantWhiteSpace(funcName);
+ if (g_insidePHP && qq.startsWith("self::")) qq=qq.mid(4);
+ QCString locFunc(qq.data());
QCString funcScope;
QCString funcWithScope=locFunc;
QCString funcWithFullScope=locFunc;
@@ -1832,7 +1835,8 @@ KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@int
KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"set"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"null"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC})
FLOWKW ("break"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"return"|"switch"|"throw"|"throws"|"@catch"|"@finally")
FLOWCONDITION ("case"|"for"|"foreach"|"for each"|"goto"|"if"|"try"|"while"|"@try")
-TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr")
+TYPEKW ("bool"|"byte"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr")
+TYPEKWSL ("LocalObject"|"Object"|"Value")
CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++"
@@ -2170,8 +2174,12 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_code->codify(yytext);
endFontClass();
}
+<ClassName>{ID}("."{ID})* |
<ClassName>{ID}("::"{ID})* {
- g_curClassName=yytext;
+ if(g_insideCS)
+ g_curClassName=substitute(yytext,".","::");
+ else
+ g_curClassName=yytext;
addType();
if (g_curClassName=="alignas")
{
@@ -2235,7 +2243,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
unput(*yytext);
BEGIN( Body );
}
-<ClassVar>("extends"|"implements") { // Java
+<ClassVar>("extends"|"implements") { // Java, Slice
startFontClass("keyword");
codifyLines(yytext);
endFontClass();
@@ -2536,6 +2544,20 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
addType();
g_name+=yytext;
}
+<Body,TemplDecl,ObjCMethod>{TYPEKWSL}/{B}* {
+ if (!g_insideSlice)
+ {
+ REJECT;
+ }
+ else
+ {
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ addType();
+ g_name+=yytext;
+ }
+ }
<Body>"generic"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* {
startFontClass("keyword");
g_code->codify(yytext);
@@ -2596,7 +2618,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
generatePHPVariableLink(*g_code,yytext);
g_name+=yytext+7;
}
-<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"("::"{ID})*/{B}* { // A<T> *pt;
+<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>\(]*">"("::"{ID})*/{B}* { // A<T> *pt;
int i=QCString(yytext).find('<');
QCString kw = QCString(yytext).left(i).stripWhiteSpace();
if (kw.right(5)=="_cast" && YY_START==Body)
@@ -2627,6 +2649,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
addType();
g_name=varname;
}
+<Body>{SCOPETNAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"/{BN}*"(" |
<Body>{SCOPETNAME}/{BN}*"(" { // a() or c::a() or t<A,B>::a() or A\B\foo()
addType();
generateFunctionLink(*g_code,yytext);
@@ -3006,6 +3029,20 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_code->codify(yytext);
endFontClass();
}
+<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKWSL}/([^a-z_A-Z0-9]) {
+ if (!g_insideSlice)
+ {
+ REJECT;
+ }
+ else
+ {
+ addParmType();
+ g_parmName=yytext;
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+ }
<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) {
addParmType();
g_parmName=yytext;
@@ -3752,11 +3789,12 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
g_sourceFileDef = new FileDef("",(exName?exName:"generated"));
cleanupSourceDef = TRUE;
}
- g_insideObjC = lang==SrcLangExt_ObjC;
- g_insideJava = lang==SrcLangExt_Java;
- g_insideCS = lang==SrcLangExt_CSharp;
- g_insidePHP = lang==SrcLangExt_PHP;
- g_insideCpp = lang==SrcLangExt_Cpp;
+ g_insideObjC = lang==SrcLangExt_ObjC;
+ g_insideJava = lang==SrcLangExt_Java;
+ g_insideCS = lang==SrcLangExt_CSharp;
+ g_insidePHP = lang==SrcLangExt_PHP;
+ g_insideCpp = lang==SrcLangExt_Cpp;
+ g_insideSlice = lang==SrcLangExt_Slice;
if (g_sourceFileDef)
{
setCurrentDoc("l00001");
diff --git a/src/commentscan.h b/src/commentscan.h
index e202f0a..d324969 100644
--- a/src/commentscan.h
+++ b/src/commentscan.h
@@ -40,7 +40,7 @@ class ParserInterface;
* @param[in,out] lineNr The line number at which the comment block was found.
* When the function returns it will be set to the last line parsed.
* @param[in] isBrief TRUE iff this comment block represents a brief description.
- * @param[in] isJavaDocStyle TRUE iff this comment block is in "JavaDoc" style.
+ * @param[in] isJavadocStyle TRUE iff this comment block is in "Javadoc" style.
* This means that it starts as a brief description until the end of
* the sentences is found and then proceeds as a detailed description.
* @param[in] isInbody TRUE iff this comment block is located in the body of
@@ -65,7 +65,7 @@ bool parseCommentBlock(ParserInterface *parser,
const QCString &fileName,
int &lineNr,
bool isBrief,
- bool isJavaDocStyle,
+ bool isJavadocStyle,
bool isInbody,
Protection &prot,
int &position,
diff --git a/src/commentscan.l b/src/commentscan.l
index 39b0edc..c5349cf 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -107,6 +107,10 @@ static bool handleCallgraph(const QCString &, const QCStringList &);
static bool handleHideCallgraph(const QCString &, const QCStringList &);
static bool handleCallergraph(const QCString &, const QCStringList &);
static bool handleHideCallergraph(const QCString &, const QCStringList &);
+static bool handleReferencedByRelation(const QCString &, const QCStringList &);
+static bool handleHideReferencedByRelation(const QCString &, const QCStringList &);
+static bool handleReferencesRelation(const QCString &, const QCStringList &);
+static bool handleHideReferencesRelation(const QCString &, const QCStringList &);
static bool handleInternal(const QCString &, const QCStringList &);
static bool handleLineBr(const QCString &, const QCStringList &);
static bool handleStatic(const QCString &, const QCStringList &);
@@ -214,6 +218,10 @@ static DocCmdMap docCmdMap[] =
{ "hidecallgraph", &handleHideCallgraph, FALSE },
{ "callergraph", &handleCallergraph, FALSE },
{ "hidecallergraph", &handleHideCallergraph, FALSE },
+ { "showrefby", &handleReferencedByRelation, FALSE },
+ { "hiderefby", &handleHideReferencedByRelation, FALSE },
+ { "showrefs", &handleReferencesRelation, FALSE },
+ { "hiderefs", &handleHideReferencesRelation, FALSE },
{ "internal", &handleInternal, TRUE },
{ "_linebr", &handleLineBr, FALSE },
{ "static", &handleStatic, FALSE },
@@ -688,7 +696,13 @@ static void addSection()
static void addCite()
{
- Doxygen::citeDict->insert(yytext);
+ QCString name=yytext;
+ if (yytext[0] =='"')
+ {
+ name=yytext+1;
+ name=name.left(yyleng-2);
+ }
+ Doxygen::citeDict->insert(name.data());
}
//-----------------------------------------------------------------------------
@@ -920,7 +934,9 @@ HR [hH][rR]
PARA [pP][aA][rR][aA]
CODE [cC][oO][dD][eE]
CAPTION [cC][aA][pP][tT][iI][oO][nN]
-DETAILEDHTML {PRE}|{UL}|{TABLE}|{OL}|{DL}|{P}|[Hh][1-6]|{IMG}|{HR}|{PARA}
+CENTER [cC][eE][nN][tT][eE][rR]
+DIV [dD][iI][vV]
+DETAILEDHTML {CENTER}|{DIV}|{PRE}|{UL}|{TABLE}|{OL}|{DL}|{P}|[Hh][1-6]|{IMG}|{HR}|{PARA}
DETAILEDHTMLOPT {CODE}
BN [ \t\n\r]
BL [ \t\r]*"\n"
@@ -935,9 +951,9 @@ FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#]
FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"")
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
-CITESCHAR [a-z_A-Z0-9\x80-\xFF]
-CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]*
-CITEID {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*
+CITESCHAR [a-z_A-Z0-9\x80-\xFF\-\?]
+CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/\?]*
+CITEID {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*|"\""{CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*"\""
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*("::"|"."){BN}*)*)((~{BN}*)?{ID})
TMPLSPEC "<"{BN}*[^>]+{BN}*">"
@@ -1005,7 +1021,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
* words and whitespace and other characters (#,?!, etc).
* grouping commands (e.g. @{ and @})
* language switch (e.g. \~english or \~).
- * mail address (e.g. dimitri@stack.nl).
+ * mail address (e.g. doxygen@gmail.com).
* quoted text, such as "foo@bar"
* XML commands, <summary></summary><remarks></remarks>
*/
@@ -1589,8 +1605,12 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
<PageDocArg1>. { // ignore other stuff
}
<PageDocArg2>.*"\n" { // second argument; page title
- yyLineNr++;
- current->args = yytext;
+ yyLineNr++;
+ // bug 748927
+ QCString tmp = yytext;
+ tmp = substitute(substitute(tmp,"@<","&lt;"),"@>","&gt;");
+ tmp = substitute(substitute(tmp,"\\<","&lt;"),"\\>","&gt;");
+ current->args = tmp;
addOutput('\n');
BEGIN( Comment );
}
@@ -2831,6 +2851,30 @@ static bool handleHideCallergraph(const QCString &, const QCStringList &)
return FALSE;
}
+static bool handleReferencedByRelation(const QCString &, const QCStringList &)
+{
+ current->referencedByRelation = TRUE; // ON
+ return FALSE;
+}
+
+static bool handleHideReferencedByRelation(const QCString &, const QCStringList &)
+{
+ current->referencedByRelation = FALSE; // OFF
+ return FALSE;
+}
+
+static bool handleReferencesRelation(const QCString &, const QCStringList &)
+{
+ current->referencesRelation = TRUE; // ON
+ return FALSE;
+}
+
+static bool handleHideReferencesRelation(const QCString &, const QCStringList &)
+{
+ current->referencesRelation = FALSE; // OFF
+ return FALSE;
+}
+
static bool handleInternal(const QCString &, const QCStringList &)
{
if (!Config_getBool(INTERNAL_DOCS))
@@ -2949,6 +2993,10 @@ static bool handleToc(const QCString &, const QCStringList &optList)
{
current->localToc.enableXml(level);
}
+ else if (opt == "docbook")
+ {
+ current->localToc.enableDocbook(level);
+ }
else
{
warn(yyFileName,yyLineNr,"Unknown option specified with \\tableofcontents: `%s'", (*it).stripWhiteSpace().data());
@@ -2957,7 +3005,9 @@ static bool handleToc(const QCString &, const QCStringList &optList)
}
if (current->localToc.nothingEnabled())
{
- current->localToc.enableHtml(5); // for backward compatibility
+ // for backward compatibility
+ current->localToc.enableHtml(5);
+ current->localToc.enableXml(5);
}
}
return FALSE;
diff --git a/src/config.h b/src/config.h
index e86e950..102774e 100644
--- a/src/config.h
+++ b/src/config.h
@@ -51,6 +51,11 @@ namespace Config
*/
void writeTemplate(FTextStream &t,bool shortList,bool updateOnly=FALSE);
+ /*! Writes a the differences between the current configuration and the
+ * template configuration to stream \a t.
+ */
+ void compareDoxyfile(FTextStream &t);
+
/*! Parses a configuration file with name \a fn.
* \returns TRUE if successful, FALSE if the file could not be
* opened or read.
@@ -61,7 +66,7 @@ namespace Config
* and replaces environment variables.
* \param clearHeaderAndFooter set to TRUE when writing header and footer templates.
*/
- void postProcess(bool clearHeaderAndFooter);
+ void postProcess(bool clearHeaderAndFooter, bool compare = FALSE);
/*! Check the validity of the parsed options and correct or warn the user where needed. */
void checkAndCorrect();
diff --git a/src/config.xml b/src/config.xml
index 4af0a65..5b1123a 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -4,13 +4,13 @@
<![CDATA[
/*
*
- *
+ *
*
* 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.
*
@@ -41,28 +41,28 @@ Each statement consists of a \c TAG_NAME written in capitals,
followed by the equal sign (<code>=</code>) and one or more values. If the same tag
is assigned more than once, the last assignment overwrites any earlier
assignment. For tags that take a list as their argument,
-the <code>+=</code> operator can be used instead of <code>=</code> to append
-new values to the list. Values are sequences of non-blanks. If the value should
+the <code>+=</code> operator can be used instead of <code>=</code> to append
+new values to the list. Values are sequences of non-blanks. If the value should
contain one or more blanks it must be surrounded by quotes (<code>&quot;...&quot;</code>).
Multiple lines can be concatenated by inserting a backslash (\c \\)
-as the last character of a line. Environment variables can be expanded
+as the last character of a line. Environment variables can be expanded
using the pattern <code>\$(ENV_VARIABLE_NAME)</code>.
You can also include part of a configuration file from another configuration
file using a <code>\@INCLUDE</code> tag as follows:
\verbatim
@INCLUDE = config_file_name
-\endverbatim
-The include file is searched in the current working directory. You can
+\endverbatim
+The include file is searched in the current working directory. You can
also specify a list of directories that should be searched before looking
-in the current working directory. Do this by putting a <code>\@INCLUDE_PATH</code> tag
+in the current working directory. Do this by putting a <code>\@INCLUDE_PATH</code> tag
with these paths before the <code>\@INCLUDE</code> tag, e.g.:
\verbatim
@INCLUDE_PATH = my_config_dir
\endverbatim
The configuration options can be divided into several categories.
-Below is an alphabetical index of the tags that are recognized
+Below is an alphabetical index of the tags that are recognized
followed by the descriptions of the tags grouped by category.
]]>
</docs>
@@ -91,14 +91,14 @@ Values that contain spaces should be placed between quotes (\" \").
<![CDATA[
\section config_examples Examples
-Suppose you have a simple project consisting of two files: a source file
+Suppose you have a simple project consisting of two files: a source file
\c example.cc and a header file \c example.h.
Then a minimal configuration file is as simple as:
\verbatim
INPUT = example.cc example.h
\endverbatim
-Assuming the example makes use of Qt classes and \c perl is located
+Assuming the example makes use of Qt classes and \c perl is located
in <code>/usr/bin</code>, a more realistic configuration file would be:
\verbatim
PROJECT_NAME = Example
@@ -109,8 +109,8 @@ PERL_PATH = /usr/local/bin/perl
SEARCHENGINE = NO
\endverbatim
-To generate the documentation for the
-<a href="http://www.stack.nl/~dimitri/qdbttabular/index.html">QdbtTabular</a> package
+To generate the documentation for the
+<a href="https://sourceforge.net/projects/qdbttabular/">QdbtTabular</a> package
I have used the following configuration file:
\verbatim
PROJECT_NAME = QdbtTabular
@@ -160,7 +160,7 @@ INPUT = $(QTDIR)/doc \
$(QTDIR)/src/dialogs \
$(QTDIR)/src/tools
FILE_PATTERNS = *.cpp *.h q*.doc
-INCLUDE_PATH = $(QTDIR)/include
+INCLUDE_PATH = $(QTDIR)/include
RECURSIVE = YES
\endverbatim
@@ -212,7 +212,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='string' id='DOXYFILE_ENCODING' format='string' defval='UTF-8'>
<docs>
<![CDATA[
- This tag specifies the encoding used for all characters in the configuration file that
+ This tag specifies the encoding used for all characters in the configuration file that
follow. The default is UTF-8 which is also the encoding used for all text before
the first occurrence of this tag. Doxygen uses \c libiconv (or the iconv built into
\c libc) for the transcoding. See https://www.gnu.org/software/libiconv/ for the list of
@@ -224,8 +224,8 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
The \c PROJECT_NAME tag is a single word (or a sequence of words
- surrounded by double-quotes, unless you are using Doxywizard) that should identify the project for which the
- documentation is generated. This name is used in the title of most
+ surrounded by double-quotes, unless you are using Doxywizard) that should identify the project for which the
+ documentation is generated. This name is used in the title of most
generated pages and in a few other places.
]]>
</docs>
@@ -242,9 +242,9 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='string' id='PROJECT_BRIEF' format='string' defval=''>
<docs>
<![CDATA[
- Using the \c PROJECT_BRIEF tag one can provide an optional one line description
- for a project that appears at the top of each page and should give viewer
- a quick idea about the purpose of the project. Keep the description short.
+ Using the \c PROJECT_BRIEF tag one can provide an optional one line description
+ for a project that appears at the top of each page and should give viewer
+ a quick idea about the purpose of the project. Keep the description short.
]]>
</docs>
</option>
@@ -252,9 +252,9 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='string' id='PROJECT_LOGO' format='image' defval=''>
<docs>
<![CDATA[
- With the \c PROJECT_LOGO tag one can specify a logo or an icon that is
- included in the documentation. The maximum height of the logo should not
- exceed 55 pixels and the maximum width should not exceed 200 pixels.
+ With the \c PROJECT_LOGO tag one can specify a logo or an icon that is
+ included in the documentation. The maximum height of the logo should not
+ exceed 55 pixels and the maximum width should not exceed 200 pixels.
Doxygen will copy the logo to the output directory.
]]>
</docs>
@@ -262,9 +262,9 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='string' id='OUTPUT_DIRECTORY' format='dir' defval=''>
<docs>
<![CDATA[
- The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
- path into which the generated documentation will be written.
- If a relative path is entered, it will be relative to the location
+ The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+ path into which the generated documentation will be written.
+ If a relative path is entered, it will be relative to the location
where doxygen was started. If left blank the current directory will be used.
]]>
</docs>
@@ -273,11 +273,11 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
If the \c CREATE_SUBDIRS tag is set to \c YES then doxygen will create
- 4096 sub-directories (in 2 levels) under the output directory of each output
- format and will distribute the generated files over these directories.
+ 4096 sub-directories (in 2 levels) under the output directory of each output
+ format and will distribute the generated files over these directories.
Enabling this option can be useful when feeding doxygen a huge amount of source
files, where putting all generated files in the same directory would otherwise
- causes performance problems for the file system.
+ causes performance problems for the file system.
]]>
</docs>
</option>
@@ -285,8 +285,8 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
If the \c ALLOW_UNICODE_NAMES tag is set to \c YES,
- doxygen will allow non-ASCII characters to appear in the names of generated files.
- If set to \c NO, non-ASCII characters will be escaped, for example _xE3_x81_x84
+ doxygen will allow non-ASCII characters to appear in the names of generated files.
+ If set to \c NO, non-ASCII characters will be escaped, for example _xE3_x81_x84
will be used for Unicode U+3044.
]]>
</docs>
@@ -369,12 +369,12 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='REPEAT_BRIEF' defval='1'>
<docs>
<![CDATA[
- If the \c REPEAT_BRIEF tag is set to \c YES, doxygen will
- prepend the brief description of a member or function before the detailed
- description
- <br>Note:
+ If the \c REPEAT_BRIEF tag is set to \c YES, doxygen will
+ prepend the brief description of a member or function before the detailed
+ description
+ <br>Note:
If both \ref cfg_hide_undoc_members "HIDE_UNDOC_MEMBERS" and
- \ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" are set to \c NO, the
+ \ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" are set to \c NO, the
brief descriptions will be completely suppressed.
]]>
</docs>
@@ -388,7 +388,7 @@ Go to the <a href="commands.html">next</a> section or return to the
stripped from the text and the result, after processing the whole list, is used
as the annotated text. Otherwise, the brief description is used as-is. If left
blank, the following values are used (`$name` is automatically replaced with the
- name of the entity):
+ name of the entity):
]]>
</docs>
<value name='The $name class'/>
@@ -406,7 +406,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='ALWAYS_DETAILED_SEC' defval='0'>
<docs>
<![CDATA[
- If the \c ALWAYS_DETAILED_SEC and \ref cfg_repeat_brief "REPEAT_BRIEF" tags
+ If the \c ALWAYS_DETAILED_SEC and \ref cfg_repeat_brief "REPEAT_BRIEF" tags
are both set to \c YES then
doxygen will generate a detailed section even if there is only a brief
description.
@@ -437,12 +437,12 @@ Go to the <a href="commands.html">next</a> section or return to the
<![CDATA[
The \c STRIP_FROM_PATH tag
can be used to strip a user-defined part of the path. Stripping is
- only done if one of the specified strings matches the left-hand part of the
+ only done if one of the specified strings matches the left-hand part of the
path. The tag can be used to show relative paths in the file list.
If left blank the directory from which doxygen is run is used as the
path to strip.
- <br>Note that you can specify absolute paths here, but also
- relative paths, which will be relative from the directory where doxygen is
+ <br>Note that you can specify absolute paths here, but also
+ relative paths, which will be relative from the directory where doxygen is
started.
]]>
</docs>
@@ -451,11 +451,11 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='list' id='STRIP_FROM_INC_PATH' format='string'>
<docs>
<![CDATA[
- The \c STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+ The \c STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
the path mentioned in the documentation of a class, which tells
- the reader which header file to include in order to use a class.
+ the reader which header file to include in order to use a class.
If left blank only the name of the header file containing the class
- definition is used. Otherwise one should specify the list of include paths that
+ definition is used. Otherwise one should specify the list of include paths that
are normally passed to the compiler using the `-I` flag.
]]>
</docs>
@@ -474,7 +474,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<![CDATA[
If the \c JAVADOC_AUTOBRIEF tag is set to \c YES then doxygen
will interpret the first line (until the first dot) of a Javadoc-style
- comment as the brief description. If set to \c NO, the
+ comment as the brief description. If set to \c NO, the
Javadoc-style will behave just like regular Qt-style comments
(thus requiring an explicit \ref cmdbrief "\@brief" command for a brief description.)
]]>
@@ -534,30 +534,54 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
This tag can be used to specify a number of aliases that act
- as commands in the documentation. An alias has the form:
+ as commands in the documentation. An alias has the form:
\verbatim
name=value
\endverbatim
- For example adding
+ For example adding
\verbatim
- "sideeffect=@par Side Effects:\n"
+ "sideeffect=@par Side Effects:\n"
\endverbatim
will allow you to
- put the command \c \\sideeffect (or \c \@sideeffect) in the documentation, which
+ put the command \c \\sideeffect (or \c \@sideeffect) in the documentation, which
will result in a user-defined paragraph with heading "Side Effects:".
You can put \ref cmdn "\\n"'s in the value part of an alias to insert newlines
(in the resulting output).
- You can put `^^` in the value part of an alias to insert a newline as if
+ You can put `^^` in the value part of an alias to insert a newline as if
a physical newline was in the original file.
]]>
</docs>
+ <docs doxyfile='0' documentation='0'>
+<![CDATA[
+ When you need a literal `{` or `}` or `,` in the value part of an alias you have to
+ escape them by means of a backslash, this can lead to conflicts with the
+ commands \c \\{ and \c \\} for these it is advised to use the version \c @{ and \c @} or
+ use a double escape (\c \\\\{ and \c \\\\})
+]]>
+ </docs>
+ <docs doxywizard='0' documentation='0'>
+<![CDATA[
+ When you need a literal `{` or `}` or `,` in the value part of an alias you have to
+ escape them by means of a backslash (\c \\), this can lead to conflicts with the
+ commands \c \\{ and \c \\} for these it is advised to use the version \c @{ and \c @} or
+ use a double escape (\c \\\\{ and \c \\\\})
+]]>
+ </docs>
+ <docs doxyfile='0' doxywizard='0'>
+<![CDATA[
+ When you need a literal `{` or `}` or `,` in the value part of an alias you have to
+ escape them by means of a backslash (`\`), this can lead to conflicts with the
+ commands \c \\{ and \c \\} for these it is advised to use the version \c @@{ and \c @@} or
+ use a double escape (\c \\\\{ and \c \\\\})
+]]>
+ </docs>
</option>
<option type='list' id='TCL_SUBST' format='string'>
<docs>
<![CDATA[
- This tag can be used to specify a number of word-keyword mappings (TCL only).
- A mapping has the form <code>"name=value"</code>. For example adding
- <code>"class=itcl::class"</code> will allow you to use the command class in the
+ This tag can be used to specify a number of word-keyword mappings (TCL only).
+ A mapping has the form <code>"name=value"</code>. For example adding
+ <code>"class=itcl::class"</code> will allow you to use the command class in the
<code>itcl::class</code> meaning.
]]>
</docs>
@@ -565,10 +589,10 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='OPTIMIZE_OUTPUT_FOR_C' defval='0'>
<docs>
<![CDATA[
- Set the \c OPTIMIZE_OUTPUT_FOR_C tag to \c YES if your project consists
- of C sources only. Doxygen will then generate output that is more tailored
- for C. For instance, some of the names that are used will be different.
- The list of all members will be omitted, etc.
+ Set the \c OPTIMIZE_OUTPUT_FOR_C tag to \c YES if your project consists
+ of C sources only. Doxygen will then generate output that is more tailored
+ for C. For instance, some of the names that are used will be different.
+ The list of all members will be omitted, etc.
]]>
</docs>
</option>
@@ -576,16 +600,16 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
Set the \c OPTIMIZE_OUTPUT_JAVA tag to \c YES if your project consists of Java or
- Python sources only. Doxygen will then generate output that is more tailored
- for that language. For instance, namespaces will be presented as packages,
- qualified scopes will look different, etc.
+ Python sources only. Doxygen will then generate output that is more tailored
+ for that language. For instance, namespaces will be presented as packages,
+ qualified scopes will look different, etc.
]]>
</docs>
</option>
<option type='bool' id='OPTIMIZE_FOR_FORTRAN' defval='0'>
<docs>
<![CDATA[
- Set the \c OPTIMIZE_FOR_FORTRAN tag to \c YES if your project consists of Fortran
+ Set the \c OPTIMIZE_FOR_FORTRAN tag to \c YES if your project consists of Fortran
sources. Doxygen will then generate output that is tailored for Fortran.
]]>
</docs>
@@ -593,11 +617,21 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='OPTIMIZE_OUTPUT_VHDL' defval='0'>
<docs>
<![CDATA[
- Set the \c OPTIMIZE_OUTPUT_VHDL tag to \c YES if your project consists of VHDL
+ Set the \c OPTIMIZE_OUTPUT_VHDL tag to \c YES if your project consists of VHDL
sources. Doxygen will then generate output that is tailored for VHDL.
]]>
</docs>
</option>
+ <option type='bool' id='OPTIMIZE_OUTPUT_SLICE' defval='0'>
+ <docs>
+<![CDATA[
+ Set the \c OPTIMIZE_OUTPUT_SLICE tag to \c YES if your project consists of Slice
+ sources only. Doxygen will then generate output that is more tailored
+ for that language. For instance, namespaces will be presented as modules,
+ types will be separated into more groups, etc.
+]]>
+ </docs>
+ </option>
<option type='list' id='EXTENSION_MAPPING' format='string'>
<docs>
<![CDATA[
@@ -606,7 +640,7 @@ Go to the <a href="commands.html">next</a> section or return to the
Doxygen has a built-in mapping, but you can override or extend it using this tag.
The format is <code>ext=language</code>, where \c ext is a file extension, and language is one of
the parsers supported by doxygen: IDL, Java, Javascript, Csharp (C#), C, C++, D, PHP,
- md (Markdown), Objective-C, Python, Fortran (fixed format Fortran: FortranFixed,
+ md (Markdown), Objective-C, Python, Slice, Fortran (fixed format Fortran: FortranFixed,
free formatted Fortran: FortranFree, unknown formatted Fortran: Fortran. In
the later case the parser tries to guess whether the code is fixed or free
formatted code, this is the default for Fortran type files), VHDL, tcl.
@@ -616,7 +650,7 @@ Go to the <a href="commands.html">next</a> section or return to the
use: `inc=Fortran f=C`.
<br>Note: For files without extension you can use `no_extension` as a placeholder.
- <br>Note that for custom extensions you also need to set \ref cfg_file_patterns "FILE_PATTERNS" otherwise the
+ <br>Note that for custom extensions you also need to set \ref cfg_file_patterns "FILE_PATTERNS" otherwise the
files are not read by doxygen.
]]>
</docs>
@@ -624,12 +658,12 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='MARKDOWN_SUPPORT' defval='1'>
<docs>
<![CDATA[
- If the \c MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all
- comments according to the Markdown format, which allows for more readable
- documentation. See http://daringfireball.net/projects/markdown/ for details.
- The output of markdown processing is further processed by doxygen, so you
- can mix doxygen, HTML, and XML commands with Markdown formatting.
- Disable only in case of backward compatibilities issues.
+ If the \c MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all
+ comments according to the Markdown format, which allows for more readable
+ documentation. See https://daringfireball.net/projects/markdown/ for details.
+ The output of markdown processing is further processed by doxygen, so you
+ can mix doxygen, HTML, and XML commands with Markdown formatting.
+ Disable only in case of backward compatibilities issues.
]]>
</docs>
</option>
@@ -646,9 +680,9 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='AUTOLINK_SUPPORT' defval='1'>
<docs>
<![CDATA[
- When enabled doxygen tries to link words that correspond to documented classes,
- or namespaces to their corresponding documentation. Such a link can be
- prevented in individual cases by putting a \c % sign in front of the word or
+ When enabled doxygen tries to link words that correspond to documented classes,
+ or namespaces to their corresponding documentation. Such a link can be
+ prevented in individual cases by putting a \c % sign in front of the word or
globally by setting \c AUTOLINK_SUPPORT to \c NO.
]]>
</docs>
@@ -676,10 +710,10 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='SIP_SUPPORT' defval='0'>
<docs>
<![CDATA[
- Set the \c SIP_SUPPORT tag to \c YES if your project consists
- of <a href="https://www.riverbankcomputing.com/software/sip/intro">sip</a> sources only.
- Doxygen will parse them like normal C++ but will assume all classes use public
- instead of private inheritance when no explicit protection keyword is present.
+ Set the \c SIP_SUPPORT tag to \c YES if your project consists
+ of <a href="https://www.riverbankcomputing.com/software/sip/intro">sip</a> sources only.
+ Doxygen will parse them like normal C++ but will assume all classes use public
+ instead of private inheritance when no explicit protection keyword is present.
]]>
</docs>
</option>
@@ -689,8 +723,8 @@ Go to the <a href="commands.html">next</a> section or return to the
For Microsoft's IDL there are \c propget and \c propput attributes to indicate getter
and setter methods for a property. Setting this option to \c YES
will make doxygen to replace the get and set methods by a property in the
- documentation. This will only work if the methods are indeed getting or
- setting a simple type. If this is not the case, or you want to show the
+ documentation. This will only work if the methods are indeed getting or
+ setting a simple type. If this is not the case, or you want to show the
methods anyway, you should set this option to \c NO.
]]>
</docs>
@@ -721,16 +755,16 @@ Go to the <a href="commands.html">next</a> section or return to the
the same type (for instance a group of public functions) to be put as a
subgroup of that type (e.g. under the Public Functions section). Set it to
\c NO to prevent subgrouping. Alternatively, this can be done per class using
- the \ref cmdnosubgrouping "\\nosubgrouping" command.
+ the \ref cmdnosubgrouping "\\nosubgrouping" command.
]]>
</docs>
</option>
<option type='bool' id='INLINE_GROUPED_CLASSES' defval='0'>
<docs>
<![CDATA[
- When the \c INLINE_GROUPED_CLASSES tag is set to \c YES, classes, structs and
- unions are shown inside the group in which they are included
- (e.g. using \ref cmdingroup "\\ingroup") instead of on a separate page (for HTML and Man pages)
+ When the \c INLINE_GROUPED_CLASSES tag is set to \c YES, classes, structs and
+ unions are shown inside the group in which they are included
+ (e.g. using \ref cmdingroup "\\ingroup") instead of on a separate page (for HTML and Man pages)
or section (for \f$\mbox{\LaTeX}\f$ and RTF).
<br>Note that this feature does not work in
combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
@@ -740,11 +774,11 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='INLINE_SIMPLE_STRUCTS' defval='0'>
<docs>
<![CDATA[
- When the \c INLINE_SIMPLE_STRUCTS tag is set to \c YES, structs, classes, and
- unions with only public data fields or simple typedef fields will be shown
- inline in the documentation of the scope in which they are defined (i.e. file,
- namespace, or group documentation), provided this scope is documented. If set
- to \c NO, structs, classes, and unions are shown on a separate
+ When the \c INLINE_SIMPLE_STRUCTS tag is set to \c YES, structs, classes, and
+ unions with only public data fields or simple typedef fields will be shown
+ inline in the documentation of the scope in which they are defined (i.e. file,
+ namespace, or group documentation), provided this scope is documented. If set
+ to \c NO, structs, classes, and unions are shown on a separate
page (for HTML and Man pages) or section (for \f$\mbox{\LaTeX}\f$ and RTF).
]]>
</docs>
@@ -753,11 +787,11 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
When \c TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or enum
- is documented as struct, union, or enum with the name of the typedef. So
- <code>typedef struct TypeS {} TypeT</code>, will appear in the documentation as a struct
- with name \c TypeT. When disabled the typedef will appear as a member of a file,
- namespace, or class. And the struct will be named \c TypeS. This can typically
- be useful for C code in case the coding convention dictates that all compound
+ is documented as struct, union, or enum with the name of the typedef. So
+ <code>typedef struct TypeS {} TypeT</code>, will appear in the documentation as a struct
+ with name \c TypeT. When disabled the typedef will appear as a member of a file,
+ namespace, or class. And the struct will be named \c TypeS. This can typically
+ be useful for C code in case the coding convention dictates that all compound
types are typedef'ed and only the typedef is referenced, never the tag name.
]]>
</docs>
@@ -766,14 +800,14 @@ Go to the <a href="commands.html">next</a> section or return to the
<!-- be careful when changing these formulas as they are hard coded in the conversion script -->
<docs>
<![CDATA[
- The size of the symbol lookup cache can be
- set using \c LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
- their name and scope. Since this can be an expensive process and often the
- same symbol appears multiple times in the code, doxygen keeps a cache of
- pre-resolved symbols. If the cache is too small doxygen will become slower.
- If the cache is too large, memory is wasted. The cache size is given by this
- formula: \f$2^{(16+\mbox{LOOKUP\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0,
- corresponding to a cache size of \f$2^{16} = 65536\f$ symbols.
+ The size of the symbol lookup cache can be
+ set using \c LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
+ their name and scope. Since this can be an expensive process and often the
+ same symbol appears multiple times in the code, doxygen keeps a cache of
+ pre-resolved symbols. If the cache is too small doxygen will become slower.
+ If the cache is too large, memory is wasted. The cache size is given by this
+ formula: \f$2^{(16+\mbox{LOOKUP\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0,
+ corresponding to a cache size of \f$2^{16} = 65536\f$ symbols.
At the end of a run doxygen will report the cache usage and suggest the
optimal cache size from a speed point of view.
]]>
@@ -784,14 +818,14 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='EXTRACT_ALL' defval='0'>
<docs>
<![CDATA[
- If the \c EXTRACT_ALL tag is set to \c YES, doxygen will assume all
- entities in documentation are documented, even if no documentation was
- available. Private class members and static file members will be hidden
- unless the \ref cfg_extract_private "EXTRACT_PRIVATE" respectively
+ If the \c EXTRACT_ALL tag is set to \c YES, doxygen will assume all
+ entities in documentation are documented, even if no documentation was
+ available. Private class members and static file members will be hidden
+ unless the \ref cfg_extract_private "EXTRACT_PRIVATE" respectively
\ref cfg_extract_static "EXTRACT_STATIC" tags are set to \c YES.
- \note This will also disable the warnings about undocumented members
- that are normally produced when \ref cfg_warnings "WARNINGS" is
+ \note This will also disable the warnings about undocumented members
+ that are normally produced when \ref cfg_warnings "WARNINGS" is
set to \c YES.
]]>
</docs>
@@ -799,7 +833,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='EXTRACT_PRIVATE' defval='0'>
<docs>
<![CDATA[
- If the \c EXTRACT_PRIVATE tag is set to \c YES, all private members of a
+ If the \c EXTRACT_PRIVATE tag is set to \c YES, all private members of a
class will be included in the documentation.
]]>
</docs>
@@ -807,8 +841,8 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='EXTRACT_PACKAGE' defval='0'>
<docs>
<![CDATA[
- If the \c EXTRACT_PACKAGE tag is set to \c YES, all members with package
- or internal scope will be included in the documentation.
+ If the \c EXTRACT_PACKAGE tag is set to \c YES, all members with package
+ or internal scope will be included in the documentation.
]]>
</docs>
</option>
@@ -823,8 +857,8 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='EXTRACT_LOCAL_CLASSES' defval='1'>
<docs>
<![CDATA[
- If the \c EXTRACT_LOCAL_CLASSES tag is set to \c YES, classes (and structs)
- defined locally in source files will be included in the documentation.
+ If the \c EXTRACT_LOCAL_CLASSES tag is set to \c YES, classes (and structs)
+ defined locally in source files will be included in the documentation.
If set to \c NO, only classes defined in header files are included. Does not
have any effect for Java sources.
]]>
@@ -833,7 +867,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='EXTRACT_LOCAL_METHODS' defval='0'>
<docs>
<![CDATA[
- This flag is only useful for Objective-C code. If set to \c YES, local
+ This flag is only useful for Objective-C code. If set to \c YES, local
methods, which are defined in the implementation section but not in
the interface are included in the documentation.
If set to \c NO, only methods in the interface are included.
@@ -854,7 +888,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
If the \c HIDE_UNDOC_MEMBERS tag is set to \c YES, doxygen will hide all
- undocumented members inside documented classes or files.
+ undocumented members inside documented classes or files.
If set to \c NO these members will be included in the
various overviews, but no documentation section is generated.
This option has no effect if \ref cfg_extract_all "EXTRACT_ALL" is enabled.
@@ -865,7 +899,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
If the \c HIDE_UNDOC_CLASSES tag is set to \c YES, doxygen will hide all
- undocumented classes that are normally visible in the class hierarchy.
+ undocumented classes that are normally visible in the class hierarchy.
If set to \c NO, these classes will be included in the
various overviews.
This option has no effect if \ref cfg_extract_all "EXTRACT_ALL" is enabled.
@@ -885,9 +919,9 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='HIDE_IN_BODY_DOCS' defval='0'>
<docs>
<![CDATA[
- If the \c HIDE_IN_BODY_DOCS tag is set to \c YES, doxygen will hide any
+ If the \c HIDE_IN_BODY_DOCS tag is set to \c YES, doxygen will hide any
documentation blocks found inside the body of a function.
- If set to \c NO, these blocks will be appended to the
+ If set to \c NO, these blocks will be appended to the
function's detailed documentation block.
]]>
</docs>
@@ -917,9 +951,9 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='HIDE_SCOPE_NAMES' defval='0'>
<docs>
<![CDATA[
- If the \c HIDE_SCOPE_NAMES tag is set to \c NO then doxygen
+ If the \c HIDE_SCOPE_NAMES tag is set to \c NO then doxygen
will show members with their full class and namespace scopes in the
- documentation. If set to \c YES, the scope will be hidden.
+ documentation. If set to \c YES, the scope will be hidden.
]]>
</docs>
</option>
@@ -928,7 +962,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<![CDATA[
If the \c HIDE_COMPOUND_REFERENCE tag is set to \c NO (default) then
doxygen will append additional text to a page's title, such as Class Reference.
- If set to \c YES the compound reference will be hidden.
+ If set to \c YES the compound reference will be hidden.
]]>
</docs>
</option>
@@ -936,7 +970,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
If the \c SHOW_INCLUDE_FILES tag is set to \c YES then doxygen
- will put a list of the files that are included by a file in the documentation
+ will put a list of the files that are included by a file in the documentation
of that file.
]]>
</docs>
@@ -944,7 +978,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='SHOW_GROUPED_MEMB_INC' defval='0'>
<docs>
<![CDATA[
- If the SHOW_GROUPED_MEMB_INC tag is set to \c YES then Doxygen
+ If the SHOW_GROUPED_MEMB_INC tag is set to \c YES then Doxygen
will add for each grouped member an include statement to the documentation,
telling the reader which file to include in order to use the member.
]]>
@@ -953,8 +987,8 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='FORCE_LOCAL_INCLUDES' defval='0'>
<docs>
<![CDATA[
- If the \c FORCE_LOCAL_INCLUDES tag is set to \c YES then doxygen
- will list include files with double quotes in the documentation
+ If the \c FORCE_LOCAL_INCLUDES tag is set to \c YES then doxygen
+ will list include files with double quotes in the documentation
rather than with sharp brackets.
]]>
</docs>
@@ -1006,9 +1040,9 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='SORT_GROUP_NAMES' defval='0'>
<docs>
<![CDATA[
- If the \c SORT_GROUP_NAMES tag is set to \c YES then doxygen will sort the
+ If the \c SORT_GROUP_NAMES tag is set to \c YES then doxygen will sort the
hierarchy of group names into alphabetical order. If set to \c NO
- the group names will appear in their defined order.
+ the group names will appear in their defined order.
]]>
</docs>
</option>
@@ -1020,7 +1054,7 @@ Go to the <a href="commands.html">next</a> section or return to the
\c NO, the class list will be sorted only by class name,
not including the namespace part.
\note This option is not very useful if \ref cfg_hide_scope_names "HIDE_SCOPE_NAMES" is set to \c YES.
- \note This option applies only to the class list, not to the
+ \note This option applies only to the class list, not to the
alphabetical list.
]]>
</docs>
@@ -1029,10 +1063,10 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
If the \c STRICT_PROTO_MATCHING option is enabled and doxygen fails to
- do proper type resolution of all parameters of a function it will reject a
+ do proper type resolution of all parameters of a function it will reject a
match between the prototype and the implementation of a member function even
if there is only one candidate or it is obvious which candidate to choose
- by doing a simple string match. By disabling \c STRICT_PROTO_MATCHING doxygen
+ by doing a simple string match. By disabling \c STRICT_PROTO_MATCHING doxygen
will still accept a match between prototype and implementation in such cases.
]]>
</docs>
@@ -1041,7 +1075,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
The \c GENERATE_TODOLIST tag can be used to enable (\c YES) or
- disable (\c NO) the todo list. This list is created by
+ disable (\c NO) the todo list. This list is created by
putting \ref cmdtodo "\\todo" commands in the documentation.
]]>
</docs>
@@ -1050,7 +1084,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
The \c GENERATE_TESTLIST tag can be used to enable (\c YES) or
- disable (\c NO) the test list. This list is created by
+ disable (\c NO) the test list. This list is created by
putting \ref cmdtest "\\test" commands in the documentation.
]]>
</docs>
@@ -1059,7 +1093,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
The \c GENERATE_BUGLIST tag can be used to enable (\c YES) or
- disable (\c NO) the bug list. This list is created by
+ disable (\c NO) the bug list. This list is created by
putting \ref cmdbug "\\bug" commands in the documentation.
]]>
</docs>
@@ -1068,7 +1102,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
The \c GENERATE_DEPRECATEDLIST tag can be used to enable (\c YES) or
- disable (\c NO) the deprecated list. This list is created by
+ disable (\c NO) the deprecated list. This list is created by
putting \ref cmddeprecated "\\deprecated"
commands in the documentation.
]]>
@@ -1078,7 +1112,7 @@ Go to the <a href="commands.html">next</a> section or return to the
<docs>
<![CDATA[
The \c ENABLED_SECTIONS tag can be used to enable conditional
- documentation sections, marked by \ref cmdif "\\if" \<section_label\> ...
+ documentation sections, marked by \ref cmdif "\\if" \<section_label\> ...
\ref cmdendif "\\endif" and \ref cmdcond "\\cond" \<section_label\> ...
\ref cmdendcond "\\endcond" blocks.
]]>
@@ -1130,9 +1164,9 @@ Go to the <a href="commands.html">next</a> section or return to the
The \c FILE_VERSION_FILTER tag can be used to specify a program or script that
doxygen should invoke to get the current version for each file (typically from the
version control system). Doxygen will invoke the program by executing (via
- <code>popen()</code>) the command <code>command input-file</code>, where \c command is
- the value of the \c FILE_VERSION_FILTER tag, and \c input-file is the name
- of an input file provided by doxygen.
+ <code>popen()</code>) the command <code>command input-file</code>, where \c command is
+ the value of the \c FILE_VERSION_FILTER tag, and \c input-file is the name
+ of an input file provided by doxygen.
Whatever the program writes to standard output is used as the file version.
]]>
</docs>
@@ -1149,8 +1183,8 @@ Example shell script for CVS:
\verbatim
#!/bin/sh
cvs status $1 | sed -n 's/^[ \]*Working revision:[ \t]*\([0-9][0-9\.]*\).*/\1/p'
-\endverbatim
-<br>
+\endverbatim
+<br>
Example shell script for Subversion:
\verbatim
#!/bin/sh
@@ -1178,8 +1212,8 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
doxygen's defaults, run doxygen with the `-l` option. You can optionally specify a
file name after the option, if omitted \c DoxygenLayout.xml will be used as the name
of the layout file.
- <br>Note that if you run doxygen from a directory containing
- a file called \c DoxygenLayout.xml, doxygen will parse it automatically even if
+ <br>Note that if you run doxygen from a directory containing
+ a file called \c DoxygenLayout.xml, doxygen will parse it automatically even if
the \c LAYOUT_FILE tag is left empty.
]]>
</docs>
@@ -1187,11 +1221,11 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='list' id='CITE_BIB_FILES' format='file'>
<docs>
<![CDATA[
- The \c CITE_BIB_FILES tag can be used to specify one or more \c bib files
- containing the reference definitions. This must be a list of <code>.bib</code> files. The
- <code>.bib</code> extension is automatically appended if omitted. This requires the
+ The \c CITE_BIB_FILES tag can be used to specify one or more \c bib files
+ containing the reference definitions. This must be a list of <code>.bib</code> files. The
+ <code>.bib</code> extension is automatically appended if omitted. This requires the
\c bibtex tool to be installed. See also https://en.wikipedia.org/wiki/BibTeX for
- more info. For \f$\mbox{\LaTeX}\f$ the style of the bibliography can be controlled
+ more info. For \f$\mbox{\LaTeX}\f$ the style of the bibliography can be controlled
using \ref cfg_latex_bib_style "LATEX_BIB_STYLE".
To use this feature you need \c bibtex and \c perl available in the search path.
See also \ref cmdcite "\\cite" for info how to create references.
@@ -1212,7 +1246,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<docs>
<![CDATA[
The \c WARNINGS tag can be used to turn on/off the warning messages that are
- generated to standard error (\c stderr) by doxygen. If \c WARNINGS is set to
+ generated to standard error (\c stderr) by doxygen. If \c WARNINGS is set to
\c YES this implies that the warnings are on.
<br>
\b Tip: Turn warnings on while writing the documentation.
@@ -1234,14 +1268,14 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
If the \c WARN_IF_DOC_ERROR tag is set to \c YES, doxygen will generate warnings for
potential errors in the documentation, such as not documenting some
parameters in a documented function, or documenting parameters that
- don't exist or using markup commands wrongly.
+ don't exist or using markup commands wrongly.
]]>
</docs>
</option>
<option type='bool' id='WARN_NO_PARAMDOC' defval='0'>
<docs>
<![CDATA[
- This \c WARN_NO_PARAMDOC option can be enabled to get warnings for
+ This \c WARN_NO_PARAMDOC option can be enabled to get warnings for
functions that are documented, but have no documentation for their parameters
or return value. If set to \c NO, doxygen will only warn about
wrong or incomplete parameter documentation, but not about the absence of
@@ -1263,13 +1297,13 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<docs>
<![CDATA[
The \c WARN_FORMAT tag determines the format of the warning messages that
- doxygen can produce. The string should contain the <code>\$file</code>,
- <code>\$line</code>, and <code>\$text</code>
+ doxygen can produce. The string should contain the <code>\$file</code>,
+ <code>\$line</code>, and <code>\$text</code>
tags, which will be replaced by the file and line number from which the
warning originated and the warning text.
- Optionally the format may contain
- <code>$version</code>, which will be replaced by the version of the file (if it could
- be obtained via \ref cfg_file_version_filter "FILE_VERSION_FILTER")
+ Optionally the format may contain
+ <code>$version</code>, which will be replaced by the version of the file (if it could
+ be obtained via \ref cfg_file_version_filter "FILE_VERSION_FILTER")
]]>
</docs>
</option>
@@ -1277,7 +1311,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<docs>
<![CDATA[
The \c WARN_LOGFILE tag can be used to specify a file to which warning
- and error messages should be written. If left blank the output is written
+ and error messages should be written. If left blank the output is written
to standard error (`stderr`).
]]>
</docs>
@@ -1287,9 +1321,9 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='list' id='INPUT' format='filedir'>
<docs>
<![CDATA[
- The \c INPUT tag is used to specify the files and/or directories that contain
- documented source files. You may enter file names like
- \c myfile.cpp or directories like \c /usr/src/myproject.
+ The \c INPUT tag is used to specify the files and/or directories that contain
+ documented source files. You may enter file names like
+ \c myfile.cpp or directories like \c /usr/src/myproject.
Separate the files or directories with spaces. See also
\ref cfg_file_patterns "FILE_PATTERNS" and
\ref cfg_extension_mapping "EXTENSION_MAPPING"
@@ -1302,10 +1336,10 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='string' id='INPUT_ENCODING' format='string' defval='UTF-8'>
<docs>
<![CDATA[
- This tag can be used to specify the character encoding of the source files that
+ This tag can be used to specify the character encoding of the source files that
doxygen parses. Internally doxygen uses the UTF-8 encoding.
- 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
+ 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.
]]>
</docs>
@@ -1313,9 +1347,9 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='list' id='FILE_PATTERNS' format='string'>
<docs>
<![CDATA[
- If the value of the \ref cfg_input "INPUT" tag contains directories, you can use the
- \c FILE_PATTERNS tag to specify one or more wildcard patterns
- (like `*.cpp` and `*.h`) to filter out the source-files
+ If the value of the \ref cfg_input "INPUT" tag contains directories, you can use the
+ \c FILE_PATTERNS tag to specify one or more wildcard patterns
+ (like `*.cpp` and `*.h`) to filter out the source-files
in the directories.<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
@@ -1367,6 +1401,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<value name='*.vhdl'/>
<value name='*.ucf'/>
<value name='*.qsf'/>
+ <value name='*.ice'/>
</option>
<option type='bool' id='RECURSIVE' defval='0'>
<docs>
@@ -1389,7 +1424,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='bool' id='EXCLUDE_SYMLINKS' defval='0'>
<docs>
<![CDATA[
- The \c EXCLUDE_SYMLINKS tag can be used to select whether or not files or directories
+ The \c EXCLUDE_SYMLINKS tag can be used to select whether or not files or directories
that are symbolic links (a Unix file system feature) are excluded from the input.
]]>
</docs>
@@ -1400,8 +1435,8 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
If the value of the \ref cfg_input "INPUT" tag contains directories, you can use the
\c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
certain files from those directories.
- <br>Note that the wildcards are matched
- against the file with absolute path, so to exclude all test directories
+ <br>Note that the wildcards are matched
+ against the file with absolute path, so to exclude all test directories
for example use the pattern `*``/test/``*`
]]>
</docs>
@@ -1409,13 +1444,13 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='list' id='EXCLUDE_SYMBOLS' format='string'>
<docs>
<![CDATA[
- The \c EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
- (namespaces, classes, functions, etc.) that should be excluded from the
- output. The symbol name can be a fully qualified name, a word, or if the
- wildcard `*` is used, a substring. Examples: `ANamespace`, `AClass`,
- `AClass::ANamespace`, `ANamespace::*Test`
- <br>Note that the wildcards are matched against the file with absolute path,
- so to exclude all test directories use the pattern
+ The \c EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+ (namespaces, classes, functions, etc.) that should be excluded from the
+ output. The symbol name can be a fully qualified name, a word, or if the
+ wildcard `*` is used, a substring. Examples: `ANamespace`, `AClass`,
+ `AClass::ANamespace`, `ANamespace::*Test`
+ <br>Note that the wildcards are matched against the file with absolute path,
+ so to exclude all test directories use the pattern
`*``/test/``*`
]]>
</docs>
@@ -1432,7 +1467,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='list' id='EXAMPLE_PATTERNS' format='string'>
<docs>
<![CDATA[
- If the value of the \ref cfg_example_path "EXAMPLE_PATH" tag contains directories,
+ If the value of the \ref cfg_example_path "EXAMPLE_PATH" tag contains directories,
you can use the
\c EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like `*.cpp`
and `*.h`) to filter out the source-files in the directories. If left
@@ -1446,8 +1481,8 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<![CDATA[
If the \c EXAMPLE_RECURSIVE tag is set to \c YES then subdirectories will be
searched for input files to be used with the \ref cmdinclude "\\include" or
- \ref cmddontinclude "\\dontinclude"
- commands irrespective of the value of the \ref cfg_recursive "RECURSIVE" tag.
+ \ref cmddontinclude "\\dontinclude"
+ commands irrespective of the value of the \ref cfg_recursive "RECURSIVE" tag.
]]>
</docs>
</option>
@@ -1455,7 +1490,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<docs>
<![CDATA[
The \c IMAGE_PATH tag can be used to specify one or more files or
- directories that contain images that are to be included in the
+ directories that contain images that are to be included in the
documentation (see the \ref cmdimage "\\image" command).
]]>
</docs>
@@ -1472,9 +1507,9 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
where <code>\<filter\></code>
is the value of the \c INPUT_FILTER tag, and <code>\<input-file\></code> is the name of an
input file. Doxygen will then use the output that the filter program writes
- to standard output. If \ref cfg_filter_patterns "FILTER_PATTERNS" is specified, this tag will be ignored.
- <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
+ to standard output. If \ref cfg_filter_patterns "FILTER_PATTERNS" is specified, this tag will be ignored.
+ <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 for custom extensions or not directly supported extensions you also
need to set \ref cfg_extension_mapping "EXTENSION_MAPPING" for the extension
@@ -1491,7 +1526,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
filter if there is a match. The filters are a list of the form:
pattern=filter (like `*.cpp=my_cpp_filter`). See \ref cfg_input_filter "INPUT_FILTER" for further
information on how filters are used. If the \c FILTER_PATTERNS tag is empty or if
- none of the patterns match the file name, \ref cfg_input_filter "INPUT_FILTER" is
+ none of the patterns match the file name, \ref cfg_input_filter "INPUT_FILTER" is
applied.
<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
@@ -1504,7 +1539,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<![CDATA[
If the \c FILTER_SOURCE_FILES tag is set to \c YES, the input filter (if set using
\ref cfg_input_filter "INPUT_FILTER") will also be used to filter the input
- files that are used for producing the source files to browse
+ files that are used for producing the source files to browse
(i.e. when \ref cfg_source_browser "SOURCE_BROWSER" is set to \c YES).
]]>
</docs>
@@ -1512,10 +1547,10 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='list' id='FILTER_SOURCE_PATTERNS' format='string' depends='FILTER_SOURCE_FILES'>
<docs>
<![CDATA[
- The \c FILTER_SOURCE_PATTERNS tag can be used to specify source filters per
- file pattern. A pattern will override the setting
- for \ref cfg_filter_patterns "FILTER_PATTERN" (if any)
- and it is also possible to disable source filtering for a specific pattern
+ The \c FILTER_SOURCE_PATTERNS tag can be used to specify source filters per
+ file pattern. A pattern will override the setting
+ for \ref cfg_filter_patterns "FILTER_PATTERN" (if any)
+ and it is also possible to disable source filtering for a specific pattern
using `*.ext=` (so without naming a filter).
]]>
</docs>
@@ -1523,9 +1558,9 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='string' id='USE_MDFILE_AS_MAINPAGE' format='string' defval=''>
<docs>
<![CDATA[
- If the \c USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
- is part of the input, its contents will be placed on the main page (`index.html`).
- This can be useful if you have a project on for instance GitHub and want to reuse
+ If the \c USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+ is part of the input, its contents will be placed on the main page (`index.html`).
+ This can be useful if you have a project on for instance GitHub and want to reuse
the introduction page also for the doxygen output.
]]>
</docs>
@@ -1564,7 +1599,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<![CDATA[
If the \c REFERENCED_BY_RELATION tag is set to \c YES
then for each documented entity all documented
- functions referencing it will be listed.
+ functions referencing it will be listed.
]]>
</docs>
</option>
@@ -1573,7 +1608,7 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<![CDATA[
If the \c REFERENCES_RELATION tag is set to \c YES
then for each documented function all documented entities
- called/used by that function will be listed.
+ called/used by that function will be listed.
]]>
</docs>
</option>
@@ -1581,9 +1616,9 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<docs>
<![CDATA[
If the \c REFERENCES_LINK_SOURCE tag is set to \c YES
- and \ref cfg_source_browser "SOURCE_BROWSER" tag is set to \c YES then the hyperlinks from
+ and \ref cfg_source_browser "SOURCE_BROWSER" tag is set to \c YES then the hyperlinks from
functions in \ref cfg_references_relation "REFERENCES_RELATION" and
- \ref cfg_referenced_by_relation "REFERENCED_BY_RELATION" lists will
+ \ref cfg_referenced_by_relation "REFERENCED_BY_RELATION" lists will
link to the source code. Otherwise they will link to the documentation.
]]>
</docs>
@@ -1591,11 +1626,11 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<option type='bool' id='SOURCE_TOOLTIPS' defval='1' depends='SOURCE_BROWSER'>
<docs>
<![CDATA[
-If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
-source code will show a tooltip with additional information such as prototype,
-brief description and links to the definition and documentation. Since this will
-make the HTML file larger and loading of large files a bit slower, you can opt
-to disable this feature.
+If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+source code will show a tooltip with additional information such as prototype,
+brief description and links to the definition and documentation. Since this will
+make the HTML file larger and loading of large files a bit slower, you can opt
+to disable this feature.
]]>
</docs>
</option>
@@ -1605,8 +1640,8 @@ to disable this feature.
If the \c USE_HTAGS tag is set to \c YES then the references to source code
will point to the HTML generated by the \c htags(1) tool instead of doxygen
built-in source browser. The \c htags tool is part of GNU's global source
- tagging system (see https://www.gnu.org/software/global/global.html). You
- will need version 4.8.6 or higher.
+ tagging system (see https://www.gnu.org/software/global/global.html). You
+ will need version 4.8.6 or higher.
<br>
To use it do the following:
-# Install the latest version of \c global
@@ -1636,10 +1671,10 @@ to disable this feature.
<option type='bool' id='CLANG_ASSISTED_PARSING' setting='USE_LIBCLANG' defval='0'>
<docs>
<![CDATA[
- If the \c CLANG_ASSISTED_PARSING tag is set to \c YES then doxygen will use the
- <a href="http://clang.llvm.org/">clang parser</a> for more accurate parsing
- at the cost of reduced performance. This can be particularly helpful with
- template rich C++ code for which doxygen's built-in parser lacks the
+ If the \c CLANG_ASSISTED_PARSING tag is set to \c YES then doxygen will use the
+ <a href="http://clang.llvm.org/">clang parser</a> for more accurate parsing
+ at the cost of reduced performance. This can be particularly helpful with
+ template rich C++ code for which doxygen's built-in parser lacks the
necessary type information.
@note The availability of this option depends on whether or not doxygen
@@ -1650,9 +1685,9 @@ to disable this feature.
<option type='list' id='CLANG_OPTIONS' format='string' setting='USE_LIBCLANG' depends='CLANG_ASSISTED_PARSING'>
<docs>
<![CDATA[
- If clang assisted parsing is enabled you can provide the compiler with command
- line options that you would normally use when invoking the compiler. Note that
- the include paths will already be set by doxygen for the files and directories
+ If clang assisted parsing is enabled you can provide the compiler with command
+ line options that you would normally use when invoking the compiler. Note that
+ the include paths will already be set by doxygen for the files and directories
specified with \ref cfg_input "INPUT" and \ref cfg_include_path "INCLUDE_PATH".
]]>
</docs>
@@ -1677,7 +1712,7 @@ to disable this feature.
<docs>
<![CDATA[
If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
- of all compounds will be generated. Enable this if the project contains
+ of all compounds will be generated. Enable this if the project contains
a lot of classes, structs, unions or interfaces.
]]>
</docs>
@@ -1685,7 +1720,7 @@ to disable this feature.
<option type='int' id='COLS_IN_ALPHA_INDEX' minval='1' maxval='20' defval='5' depends='ALPHABETICAL_INDEX'>
<docs>
<![CDATA[
- The \c COLS_IN_ALPHA_INDEX tag can be
+ The \c COLS_IN_ALPHA_INDEX tag can be
used to specify the number of columns in which the alphabetical index list will be split.
]]>
</docs>
@@ -1693,9 +1728,9 @@ to disable this feature.
<option type='list' id='IGNORE_PREFIX' format='string' depends='ALPHABETICAL_INDEX'>
<docs>
<![CDATA[
- In case all classes in a project start with a common prefix, all classes will
+ In case all classes in a project start with a common prefix, all classes will
be put under the same header in the alphabetical index.
- The \c IGNORE_PREFIX tag can be used to specify a prefix
+ The \c IGNORE_PREFIX tag can be used to specify a prefix
(or a list of prefixes) that should be ignored while generating the index headers.
]]>
</docs>
@@ -1722,7 +1757,7 @@ to disable this feature.
<option type='string' id='HTML_FILE_EXTENSION' format='string' defval='.html' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_FILE_EXTENSION tag can be used to specify the file extension for
+ The \c HTML_FILE_EXTENSION tag can be used to specify the file extension for
each generated HTML page (for example: <code>.htm, .php, .asp</code>).
]]>
</docs>
@@ -1730,10 +1765,10 @@ to disable this feature.
<option type='string' id='HTML_HEADER' format='file' defval='' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_HEADER tag can be used to specify a user-defined HTML
- header file for each generated HTML page.
- If the tag is left blank doxygen will generate a
- standard header.
+ The \c HTML_HEADER tag can be used to specify a user-defined HTML
+ header file for each generated HTML page.
+ If the tag is left blank doxygen will generate a
+ standard header.
<br>
To get valid HTML the header file that
includes any scripts and style sheets that doxygen
@@ -1749,7 +1784,7 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
the default header that doxygen normally uses.
@note The header is subject to change so you typically
- have to regenerate the default header when upgrading to a newer version of
+ have to regenerate the default header when upgrading to a newer version of
doxygen.
]]>
</docs>
@@ -1762,7 +1797,7 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
<dt><code>\$date</code><dd>will be replaced with the current date.
<dt><code>\$year</code><dd>will be replaces with the current year.
<dt><code>\$doxygenversion</code><dd>will be replaced with the version of doxygen
- <dt><code>\$projectname</code><dd>will be replaced with the name of
+ <dt><code>\$projectname</code><dd>will be replaced with the name of
the project (see \ref cfg_project_name "PROJECT_NAME")
<dt><code>\$projectnumber</code><dd>will be replaced with the project number
(see \ref cfg_project_number "PROJECT_NUMBER")
@@ -1770,25 +1805,25 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
description (see \ref cfg_project_brief "PROJECT_BRIEF")
<dt><code>\$projectlogo</code><dd>will be replaced with the project logo
(see \ref cfg_project_logo "PROJECT_LOGO")
- <dt><code>\$treeview</code><dd>will be replaced with links to
- the javascript and style sheets needed for the navigation tree
- (or an empty string when \ref cfg_generate_treeview "GENERATE_TREEVIEW"
+ <dt><code>\$treeview</code><dd>will be replaced with links to
+ the javascript and style sheets needed for the navigation tree
+ (or an empty string when \ref cfg_generate_treeview "GENERATE_TREEVIEW"
is disabled).
- <dt><code>\$search</code><dd>will be replaced with a links to
- the javascript and style sheets needed for the search engine
- (or an empty string when \ref cfg_searchengine "SEARCHENGINE"
+ <dt><code>\$search</code><dd>will be replaced with a links to
+ the javascript and style sheets needed for the search engine
+ (or an empty string when \ref cfg_searchengine "SEARCHENGINE"
is disabled).
- <dt><code>\$mathjax</code><dd>will be replaced with a links to
- the javascript and style sheets needed for the MathJax feature
+ <dt><code>\$mathjax</code><dd>will be replaced with a links to
+ the javascript and style sheets needed for the MathJax feature
(or an empty string when \ref cfg_use_mathjax "USE_MATHJAX" is disabled).
<dt><code>\$relpath^</code><dd>
- If \ref cfg_create_subdirs "CREATE_SUBDIRS" is enabled, the command <code>\$relpath^</code> can be
+ If \ref cfg_create_subdirs "CREATE_SUBDIRS" is enabled, the command <code>\$relpath^</code> can be
used to produce a relative path to the root of the HTML output directory,
e.g. use <code>\$relpath^doxygen.css</code>, to refer to the standard style sheet.
</dl>
- To cope with differences in the layout of the header and footer that depend on
- configuration settings, the header can also contain special blocks that
+ To cope with differences in the layout of the header and footer that depend on
+ configuration settings, the header can also contain special blocks that
will be copied to the output or skipped depending on the configuration.
Such blocks have the following form:
\verbatim
@@ -1817,9 +1852,9 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
when the \ref cfg_project_logo "PROJECT_LOGO" option is not empty.
<dt><code>TITLEAREA</code><dd>Content within this block is copied to the output
when a title is visible at the top of each page. This is the case
- if either \ref cfg_project_name "PROJECT_NAME",
- \ref cfg_project_brief "PROJECT_BRIEF", \ref cfg_project_logo "PROJECT_LOGO"
- is filled in or if both \ref cfg_disable_index "DISABLE_INDEX" and
+ if either \ref cfg_project_name "PROJECT_NAME",
+ \ref cfg_project_brief "PROJECT_BRIEF", \ref cfg_project_logo "PROJECT_LOGO"
+ is filled in or if both \ref cfg_disable_index "DISABLE_INDEX" and
\ref cfg_searchengine "SEARCHENGINE" are enabled.
</dl>
]]>
@@ -1834,12 +1869,12 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
<option type='string' id='HTML_FOOTER' format='file' defval='' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_FOOTER tag can be used to specify a user-defined HTML footer for
- each generated HTML page.
+ The \c HTML_FOOTER tag can be used to specify a user-defined HTML footer for
+ each generated HTML page.
If the tag is left blank doxygen will generate a standard footer.
- See \ref cfg_html_header "HTML_HEADER" for more information on
- how to generate a default footer and what special commands can be
+ See \ref cfg_html_header "HTML_HEADER" for more information on
+ how to generate a default footer and what special commands can be
used inside the footer.
See also section \ref doxygen_usage for information on how to generate
@@ -1850,17 +1885,17 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
<option type='string' id='HTML_STYLESHEET' format='file' defval='' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_STYLESHEET tag can be used to specify a user-defined cascading
- style sheet that is used by each HTML page. It can be used to
- fine-tune the look of the HTML output. If left blank doxygen
- will generate a default style sheet.
-
+ The \c HTML_STYLESHEET tag can be used to specify a user-defined cascading
+ style sheet that is used by each HTML page. It can be used to
+ fine-tune the look of the HTML output. If left blank doxygen
+ will generate a default style sheet.
+
See also section \ref doxygen_usage for information on how to generate
the style sheet that doxygen normally uses.
- \note It is recommended to use
+ \note It is recommended to use
\ref cfg_html_extra_stylesheet "HTML_EXTRA_STYLESHEET" instead of this tag,
- as it is more robust and
+ as it is more robust and
this tag (<code>HTML_STYLESHEET</code>) will in the future become obsolete.
]]>
</docs>
@@ -1868,12 +1903,12 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil
<option type='list' id='HTML_EXTRA_STYLESHEET' format='file' defval='' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_EXTRA_STYLESHEET tag can be used to specify additional
- user-defined cascading style sheets that are included after the standard
- style sheets created by doxygen. Using this option one can overrule
- certain style aspects. This is preferred over using \ref cfg_html_stylesheet "HTML_STYLESHEET"
- since it does not replace the standard style sheet and is therefore more
- robust against future updates. Doxygen will copy the style sheet files to
+ The \c HTML_EXTRA_STYLESHEET tag can be used to specify additional
+ user-defined cascading style sheets that are included after the standard
+ style sheets created by doxygen. Using this option one can overrule
+ certain style aspects. This is preferred over using \ref cfg_html_stylesheet "HTML_STYLESHEET"
+ since it does not replace the standard style sheet and is therefore more
+ robust against future updates. Doxygen will copy the style sheet files to
the output directory.
\note The order of the extra style sheet files is of importance (e.g. the last
style sheet in the list overrules the setting of the previous ones in the list).
@@ -1922,12 +1957,12 @@ hr.footer {
<option type='list' id='HTML_EXTRA_FILES' format='file' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_EXTRA_FILES tag can be used to specify one or more extra images or
- other source files which should be copied to the HTML output directory. Note
- that these files will be copied to the base HTML output directory. Use the
+ The \c HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+ other source files which should be copied to the HTML output directory. Note
+ that these files will be copied to the base HTML output directory. Use the
<code>$relpath^</code> marker in the \ref cfg_html_header "HTML_HEADER" and/or
- \ref cfg_html_footer "HTML_FOOTER" files to load these
- files. In the \ref cfg_html_stylesheet "HTML_STYLESHEET" file, use the file name only. Also note that
+ \ref cfg_html_footer "HTML_FOOTER" files to load these
+ files. In the \ref cfg_html_stylesheet "HTML_STYLESHEET" file, use the file name only. Also note that
the files will be copied as-is; there are no commands or markers available.
]]>
</docs>
@@ -1935,32 +1970,32 @@ hr.footer {
<option type='int' id='HTML_COLORSTYLE_HUE' minval='0' maxval='359' defval='220' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
- Doxygen will adjust the colors in the style sheet and background images
- according to this color. Hue is specified as an angle on a colorwheel,
- see https://en.wikipedia.org/wiki/Hue for more information.
- For instance the value 0 represents red, 60 is yellow, 120 is green,
- 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+ The \c HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+ Doxygen will adjust the colors in the style sheet and background images
+ according to this color. Hue is specified as an angle on a colorwheel,
+ see https://en.wikipedia.org/wiki/Hue for more information.
+ For instance the value 0 represents red, 60 is yellow, 120 is green,
+ 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
]]>
</docs>
</option>
<option type='int' id='HTML_COLORSTYLE_SAT' minval='0' maxval='255' defval='100' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
- the colors in the HTML output. For a value of 0 the output will use
- grayscales only. A value of 255 will produce the most vivid colors.
+ The \c HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+ the colors in the HTML output. For a value of 0 the output will use
+ grayscales only. A value of 255 will produce the most vivid colors.
]]>
</docs>
</option>
<option type='int' id='HTML_COLORSTYLE_GAMMA' minval='40' maxval='240' defval='80' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- The \c HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
- the luminance component of the colors in the HTML output. Values below
- 100 gradually make the output lighter, whereas values above 100 make
- the output darker. The value divided by 100 is the actual gamma applied,
- so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+ The \c HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+ the luminance component of the colors in the HTML output. Values below
+ 100 gradually make the output lighter, whereas values above 100 make
+ the output darker. The value divided by 100 is the actual gamma applied,
+ so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
and 100 does not change the gamma.
]]>
</docs>
@@ -1968,9 +2003,9 @@ hr.footer {
<option type='bool' id='HTML_TIMESTAMP' defval='0' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- If the \c HTML_TIMESTAMP tag is set to \c YES then the footer of
- each generated HTML page will contain the date and time when the page
- was generated. Setting this to \c YES can help to show when doxygen was last run
+ If the \c HTML_TIMESTAMP tag is set to \c YES then the footer of
+ each generated HTML page will contain the date and time when the page
+ was generated. Setting this to \c YES can help to show when doxygen was last run
and thus if the documentation is up to date.
]]>
</docs>
@@ -1978,11 +2013,11 @@ hr.footer {
<option type='bool' id='HTML_DYNAMIC_MENUS' defval='1' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- If the \c HTML_DYNAMIC_MENUS tag is set to \c YES then the generated HTML
- documentation will contain a main index with vertical navigation menus that
- are dynamically created via Javascript. If disabled, the navigation index will consists of
- multiple levels of tabs that are statically embedded in every HTML page.
- Disable this option to support browsers that do not have Javascript, like
+ If the \c HTML_DYNAMIC_MENUS tag is set to \c YES then the generated HTML
+ documentation will contain a main index with vertical navigation menus that
+ are dynamically created via Javascript. If disabled, the navigation index will consists of
+ multiple levels of tabs that are statically embedded in every HTML page.
+ Disable this option to support browsers that do not have Javascript, like
the Qt help browser.
]]>
</docs>
@@ -1992,20 +2027,20 @@ hr.footer {
<![CDATA[
If the \c HTML_DYNAMIC_SECTIONS tag is set to \c YES then the generated HTML
documentation will contain sections that can be hidden and shown after the
- page has loaded.
+ page has loaded.
]]>
</docs>
</option>
<option type='int' id='HTML_INDEX_NUM_ENTRIES' minval='0' maxval='9999' defval='100' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- With \c HTML_INDEX_NUM_ENTRIES one can control the preferred number of
- entries shown in the various tree structured indices initially; the user
- can expand and collapse entries dynamically later on. Doxygen will expand
- the tree to such a level that at most the specified number of entries are
- visible (unless a fully collapsed tree already exceeds this amount).
- So setting the number of entries 1 will produce a full collapsed tree by
- default. 0 is a special value representing an infinite number of entries
+ With \c HTML_INDEX_NUM_ENTRIES one can control the preferred number of
+ entries shown in the various tree structured indices initially; the user
+ can expand and collapse entries dynamically later on. Doxygen will expand
+ the tree to such a level that at most the specified number of entries are
+ visible (unless a fully collapsed tree already exceeds this amount).
+ So setting the number of entries 1 will produce a full collapsed tree by
+ default. 0 is a special value representing an infinite number of entries
and will result in a full expanded tree by default.
]]>
</docs>
@@ -2014,16 +2049,16 @@ hr.footer {
<docs>
<![CDATA[
If the \c GENERATE_DOCSET tag is set to \c YES, additional index files
- will be generated that can be used as input for
- <a href="https://developer.apple.com/tools/xcode/">Apple's Xcode 3
+ will be generated that can be used as input for
+ <a href="https://developer.apple.com/xcode/">Apple's Xcode 3
integrated development environment</a>, introduced with OSX 10.5 (Leopard).
To create a documentation set, doxygen will generate a Makefile in the
HTML output directory. Running \c make will produce the docset in that
- directory and running <code>make install</code> will install the docset in
- <code>~/Library/Developer/Shared/Documentation/DocSets</code>
+ directory and running <code>make install</code> will install the docset in
+ <code>~/Library/Developer/Shared/Documentation/DocSets</code>
so that Xcode will find it at startup. See
- https://developer.apple.com/tools/creatingdocsetswithdoxygen.html for
- more information.
+ https://developer.apple.com/library/archive/featuredarticles/DoxygenXcode/_index.html
+ for more information.
]]>
</docs>
</option>
@@ -2032,7 +2067,7 @@ hr.footer {
<![CDATA[
This tag determines the name of the docset
feed. A documentation feed provides an umbrella under which multiple
- documentation sets from a single provider (such as a company or product suite)
+ documentation sets from a single provider (such as a company or product suite)
can be grouped.
]]>
</docs>
@@ -2042,7 +2077,7 @@ hr.footer {
<![CDATA[
This tag specifies a string that
should uniquely identify the documentation set bundle. This should be a
- reverse domain-name style string, e.g. <code>com.mycompany.MyDocSet</code>.
+ reverse domain-name style string, e.g. <code>com.mycompany.MyDocSet</code>.
Doxygen will append <code>.docset</code> to the name.
]]>
</docs>
@@ -2051,8 +2086,8 @@ hr.footer {
<docs>
<![CDATA[
The \c DOCSET_PUBLISHER_ID
-tag specifies a string that should uniquely identify
-the documentation publisher. This should be a reverse domain-name style
+tag specifies a string that should uniquely identify
+the documentation publisher. This should be a reverse domain-name style
string, e.g. <code>com.mycompany.MyDocSet.documentation</code>.
]]>
</docs>
@@ -2068,14 +2103,14 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<docs>
<![CDATA[
If the \c GENERATE_HTMLHELP tag is set to \c YES then
- doxygen generates three additional HTML index files:
- \c index.hhp, \c index.hhc, and \c index.hhk. The \c index.hhp is a
- project file that can be read by
- <a href="http://www.microsoft.com/en-us/download/details.aspx?id=21138">
+ doxygen generates three additional HTML index files:
+ \c index.hhp, \c index.hhc, and \c index.hhk. The \c index.hhp is a
+ project file that can be read by
+ <a href="https://www.microsoft.com/en-us/download/details.aspx?id=21138">
Microsoft's HTML Help Workshop</a>
on Windows.
<br>
- The HTML Help Workshop contains a compiler that can convert all HTML output
+ The HTML Help Workshop contains a compiler that can convert all HTML output
generated by doxygen into a single compiled HTML file (`.chm`). Compiled
HTML files are now used as the Windows 98 help format, and will replace
the old Windows help format (`.hlp`) on all Windows platforms in the future.
@@ -2099,7 +2134,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<docs>
<![CDATA[
The \c HHC_LOCATION tag can
- be used to specify the location (absolute path including file name) of
+ be used to specify the location (absolute path including file name) of
the HTML help compiler (\c hhc.exe). If non-empty, doxygen will try to run
the HTML help compiler on the generated \c index.hhp.
]]>
@@ -2117,9 +2152,9 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='string' id='CHM_INDEX_ENCODING' format='string' defval='' depends='GENERATE_HTMLHELP'>
<docs>
<![CDATA[
- The \c CHM_INDEX_ENCODING
- is used to encode HtmlHelp index (\c hhk), content (\c hhc) and project file
- content.
+ The \c CHM_INDEX_ENCODING
+ is used to encode HtmlHelp index (\c hhk), content (\c hhc) and project file
+ content.
]]>
</docs>
</option>
@@ -2136,8 +2171,8 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='bool' id='TOC_EXPAND' defval='0' depends='GENERATE_HTMLHELP'>
<docs>
<![CDATA[
- The \c TOC_EXPAND flag can be set to \c YES to add extra items for
- group members to the table of contents of the HTML help documentation
+ The \c TOC_EXPAND flag can be set to \c YES to add extra items for
+ group members to the table of contents of the HTML help documentation
and to the tree view.
]]>
</docs>
@@ -2167,7 +2202,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<![CDATA[
The \c QHP_NAMESPACE tag specifies the namespace to use when generating
Qt Help Project output. For more information please see
- <a href="http://doc.qt.io/qt-4.8/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
+ <a href="http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
]]>
</docs>
</option>
@@ -2176,7 +2211,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<![CDATA[
The \c QHP_VIRTUAL_FOLDER tag specifies the namespace to use when
generating Qt Help Project output. For more information please see
- <a href="http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
+ <a href="http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
]]>
</docs>
</option>
@@ -2184,7 +2219,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<docs>
<![CDATA[
If the \c QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom filter to add. For more information please see
- <a href="http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+ <a href="http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
]]>
</docs>
</option>
@@ -2193,7 +2228,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<![CDATA[
The \c QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the custom filter to add.
For more information please see
- <a href="http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+ <a href="http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
]]>
</docs>
</option>
@@ -2201,7 +2236,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<docs>
<![CDATA[
The \c QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's filter section matches.
- <a href="http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+ <a href="http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
]]>
</docs>
</option>
@@ -2216,15 +2251,15 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='bool' id='GENERATE_ECLIPSEHELP' defval='0' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- If the \c GENERATE_ECLIPSEHELP tag is set to \c YES, additional index files
- will be generated, together with the HTML files, they form an `Eclipse` help
- plugin.
+ If the \c GENERATE_ECLIPSEHELP tag is set to \c YES, additional index files
+ will be generated, together with the HTML files, they form an `Eclipse` help
+ plugin.
- To install this plugin and make it available under the help contents
- menu in `Eclipse`, the contents of the directory containing the HTML and XML
- files needs to be copied into the plugins directory of eclipse. The name of
- the directory within the plugins directory should be the same as
- the \ref cfg_eclipse_doc_id "ECLIPSE_DOC_ID" value.
+ To install this plugin and make it available under the help contents
+ menu in `Eclipse`, the contents of the directory containing the HTML and XML
+ files needs to be copied into the plugins directory of eclipse. The name of
+ the directory within the plugins directory should be the same as
+ the \ref cfg_eclipse_doc_id "ECLIPSE_DOC_ID" value.
After copying `Eclipse` needs to be restarted before the help appears.
]]>
@@ -2233,8 +2268,8 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='string' id='ECLIPSE_DOC_ID' format='string' defval='org.doxygen.Project' depends='GENERATE_ECLIPSEHELP'>
<docs>
<![CDATA[
- A unique identifier for the `Eclipse` help plugin. When installing the plugin
- the directory name containing the HTML and XML files should also have
+ A unique identifier for the `Eclipse` help plugin. When installing the plugin
+ the directory name containing the HTML and XML files should also have
this name. Each documentation set should have its own identifier.
]]>
</docs>
@@ -2246,8 +2281,8 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
might be necessary to disable the index and replace it with your own.
The \c DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at
top of each HTML page. A value of \c NO enables the index and the
- value \c YES disables it. Since the tabs in the index contain the same
- information as the navigation tree, you can set this option to \c YES if
+ value \c YES disables it. Since the tabs in the index contain the same
+ information as the navigation tree, you can set this option to \c YES if
you also set \ref cfg_generate_treeview "GENERATE_TREEVIEW" to \c YES.
]]>
</docs>
@@ -2270,7 +2305,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
the \ref cfg_project_name "PROJECT_NAME".
Since the tree basically has the same information as the tab index, you could
- consider setting \ref cfg_disable_index "DISABLE_INDEX" to \c YES when
+ consider setting \ref cfg_disable_index "DISABLE_INDEX" to \c YES when
enabling this option.
]]>
</docs>
@@ -2280,7 +2315,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<docs>
<![CDATA[
The \c ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
- that doxygen will group on one line in the generated HTML documentation.
+ that doxygen will group on one line in the generated HTML documentation.
<br>Note that a value of 0 will completely suppress the enum values from
appearing in the overview section.
]]>
@@ -2298,8 +2333,8 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='bool' id='EXT_LINKS_IN_WINDOW' defval='0' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- If the \c EXT_LINKS_IN_WINDOW option is set to \c YES, doxygen will open
- links to external symbols imported via tag files in a separate window.
+ If the \c EXT_LINKS_IN_WINDOW option is set to \c YES, doxygen will open
+ links to external symbols imported via tag files in a separate window.
]]>
</docs>
</option>
@@ -2309,7 +2344,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
Use this tag to change the font size of \f$\mbox{\LaTeX}\f$ formulas included
as images in the HTML documentation.
When you change the font size after a successful doxygen run you need
- to manually remove any `form_*.png` images from the HTML
+ to manually remove any `form_*.png` images from the HTML
output directory to force them to be regenerated.
]]>
</docs>
@@ -2317,23 +2352,23 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<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.
+ 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='bool' id='USE_MATHJAX' defval='0' depends='GENERATE_HTML'>
<docs>
<![CDATA[
- Enable the \c USE_MATHJAX option to render \f$\mbox{\LaTeX}\f$ formulas using MathJax
- (see https://www.mathjax.org) which uses client side Javascript for the
- rendering instead of using pre-rendered bitmaps. Use this if you do not
- have \f$\mbox{\LaTeX}\f$ installed or if you want to formulas look prettier in the HTML
- output. When enabled you may also need to install MathJax separately and
- configure the path to it using the \ref cfg_mathjax_relpath "MATHJAX_RELPATH"
+ Enable the \c USE_MATHJAX option to render \f$\mbox{\LaTeX}\f$ formulas using MathJax
+ (see https://www.mathjax.org) which uses client side Javascript for the
+ rendering instead of using pre-rendered bitmaps. Use this if you do not
+ have \f$\mbox{\LaTeX}\f$ installed or if you want to formulas look prettier in the HTML
+ output. When enabled you may also need to install MathJax separately and
+ configure the path to it using the \ref cfg_mathjax_relpath "MATHJAX_RELPATH"
option.
]]>
</docs>
@@ -2341,7 +2376,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='enum' id='MATHJAX_FORMAT' defval='HTML-CSS' depends='USE_MATHJAX'>
<docs>
<![CDATA[
- When MathJax is enabled you can set the default output format to be used for
+ When MathJax is enabled you can set the default output format to be used for
the MathJax output.
See <a href="http://docs.mathjax.org/en/latest/output.html">the MathJax site</a>
for more details.
@@ -2351,16 +2386,16 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<value name="NativeMML" desc="(i.e. MathML)"/>
<value name="SVG"/>
</option>
- <option type='string' id='MATHJAX_RELPATH' format='string' defval='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/' depends='USE_MATHJAX'>
+ <option type='string' id='MATHJAX_RELPATH' format='string' defval='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/' depends='USE_MATHJAX'>
<docs>
<![CDATA[
- When MathJax is enabled you need to specify the location relative to the
- HTML output directory using the \c MATHJAX_RELPATH option. The destination
- directory should contain the `MathJax.js` script. For instance, if the \c mathjax
- directory is located at the same level as the HTML output directory, then
- \c MATHJAX_RELPATH should be <code>../mathjax</code>. The default value points to
- the MathJax Content Delivery Network so you can quickly see the result without
- installing MathJax. However, it is strongly recommended to install a local
+ When MathJax is enabled you need to specify the location relative to the
+ HTML output directory using the \c MATHJAX_RELPATH option. The destination
+ directory should contain the `MathJax.js` script. For instance, if the \c mathjax
+ directory is located at the same level as the HTML output directory, then
+ \c MATHJAX_RELPATH should be <code>../mathjax</code>. The default value points to
+ the MathJax Content Delivery Network so you can quickly see the result without
+ installing MathJax. However, it is strongly recommended to install a local
copy of MathJax from https://www.mathjax.org before deployment.
]]>
</docs>
@@ -2368,7 +2403,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='list' id='MATHJAX_EXTENSIONS' format='string' depends='USE_MATHJAX'>
<docs>
<![CDATA[
- The \c MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax extension
+ The \c MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax extension
names that should be enabled during MathJax rendering. For example
\verbatim
MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
@@ -2379,9 +2414,9 @@ MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
<option type='string' id='MATHJAX_CODEFILE' format='string' depends='USE_MATHJAX'>
<docs>
<![CDATA[
- The \c MATHJAX_CODEFILE tag can be used to specify a file with javascript
- pieces of code that will be used on startup of the MathJax code.
- See
+ The \c MATHJAX_CODEFILE tag can be used to specify a file with javascript
+ pieces of code that will be used on startup of the MathJax code.
+ See
<a href="http://docs.mathjax.org/en/latest/output.html">the MathJax site</a>
for more details.
]]>
@@ -2398,7 +2433,7 @@ MATHJAX_CODEFILE = disableRenderer.js
MathJax.Hub.Config({
menuSettings: {
showRenderer: false,
- }
+ }
});
\endverbatim
]]>
@@ -2413,24 +2448,24 @@ MATHJAX_CODEFILE = disableRenderer.js
<docs>
<![CDATA[
When the \c SEARCHENGINE tag is enabled doxygen will generate a search box
- for the HTML output. The underlying search engine uses javascript
+ for the HTML output. The underlying search engine uses javascript
and DHTML and should work on any modern browser. Note that when using
- HTML help (\ref cfg_generate_htmlhelp "GENERATE_HTMLHELP"),
+ HTML help (\ref cfg_generate_htmlhelp "GENERATE_HTMLHELP"),
Qt help (\ref cfg_generate_qhp "GENERATE_QHP"), or docsets
- (\ref cfg_generate_docset "GENERATE_DOCSET") there is already a search
- function so this one should typically be disabled. For large projects
- the javascript based search engine can be slow, then enabling
- \ref cfg_server_based_search "SERVER_BASED_SEARCH" may provide a
- better solution.
+ (\ref cfg_generate_docset "GENERATE_DOCSET") there is already a search
+ function so this one should typically be disabled. For large projects
+ the javascript based search engine can be slow, then enabling
+ \ref cfg_server_based_search "SERVER_BASED_SEARCH" may provide a
+ better solution.
It is possible to search using the keyboard;
to jump to the search box use <code>\<access key\> + S</code> (what the <code>\<access key\></code> is
depends on the OS and browser, but it is typically <code>\<CTRL\></code>, <code>\<ALT\></code>/<code>\<option\></code>, or both).
- Inside the search box use the <code>\<cursor down key\></code> to jump into the search
+ Inside the search box use the <code>\<cursor down key\></code> to jump into the search
results window, the results can be navigated using the <code>\<cursor keys\></code>.
Press <code>\<Enter\></code> to select an item or <code>\<escape\></code> to cancel the search. The
filter options can be selected when the cursor is inside the search box
- by pressing <code>\<Shift\>+\<cursor down\></code>. Also here use the <code>\<cursor keys\></code> to
+ by pressing <code>\<Shift\>+\<cursor down\></code>. Also here use the <code>\<cursor keys\></code> to
select a filter and <code>\<Enter\></code> or <code>\<escape\></code> to activate or cancel the filter option.
]]>
</docs>
@@ -2438,14 +2473,14 @@ MATHJAX_CODEFILE = disableRenderer.js
<option type='bool' id='SERVER_BASED_SEARCH' defval='0' depends='SEARCHENGINE'>
<docs>
<![CDATA[
-When the \c SERVER_BASED_SEARCH tag is enabled the search engine will be
-implemented using a web server instead of a web client using Javascript.
+When the \c SERVER_BASED_SEARCH tag is enabled the search engine will be
+implemented using a web server instead of a web client using Javascript.
-There are two flavors of web server based searching depending on the
-\ref cfg_external_search "EXTERNAL_SEARCH" setting. When disabled,
-doxygen will generate a PHP script for searching and an index file used
-by the script. When \ref cfg_external_search "EXTERNAL_SEARCH" is
-enabled the indexing and searching needs to be provided by external tools.
+There are two flavors of web server based searching depending on the
+\ref cfg_external_search "EXTERNAL_SEARCH" setting. When disabled,
+doxygen will generate a PHP script for searching and an index file used
+by the script. When \ref cfg_external_search "EXTERNAL_SEARCH" is
+enabled the indexing and searching needs to be provided by external tools.
See the section \ref extsearch for details.
]]>
</docs>
@@ -2453,14 +2488,14 @@ See the section \ref extsearch for details.
<option type='bool' id='EXTERNAL_SEARCH' defval='0' depends='SEARCHENGINE'>
<docs>
<![CDATA[
- When \c EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
- script for searching. Instead the search results are written to an XML file
- which needs to be processed by an external indexer. Doxygen will invoke an
- external search engine pointed to by the
- \ref cfg_searchengine_url "SEARCHENGINE_URL" option to obtain
+ When \c EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+ script for searching. Instead the search results are written to an XML file
+ which needs to be processed by an external indexer. Doxygen will invoke an
+ external search engine pointed to by the
+ \ref cfg_searchengine_url "SEARCHENGINE_URL" option to obtain
the search results.
- <br>Doxygen ships with an example indexer (\c doxyindexer) and
- search engine (<code>doxysearch.cgi</code>) which are based on the open source search
+ <br>Doxygen ships with an example indexer (\c doxyindexer) and
+ search engine (<code>doxysearch.cgi</code>) which are based on the open source search
engine library <a href="https://xapian.org/">Xapian</a>.
<br>See the section \ref extsearch for details.
]]>
@@ -2469,11 +2504,11 @@ See the section \ref extsearch for details.
<option type='string' id='SEARCHENGINE_URL' format='string' defval='' depends='SEARCHENGINE'>
<docs>
<![CDATA[
- The \c SEARCHENGINE_URL should point to a search engine hosted by a web server
- which will return the search results when \ref cfg_external_search "EXTERNAL_SEARCH"
+ The \c SEARCHENGINE_URL should point to a search engine hosted by a web server
+ which will return the search results when \ref cfg_external_search "EXTERNAL_SEARCH"
is enabled.
- <br>Doxygen ships with an example indexer (\c doxyindexer) and
- search engine (<code>doxysearch.cgi</code>) which are based on the open source search
+ <br>Doxygen ships with an example indexer (\c doxyindexer) and
+ search engine (<code>doxysearch.cgi</code>) which are based on the open source search
engine library <a href="https://xapian.org/">Xapian</a>.
See the section \ref extsearch for details.
]]>
@@ -2482,9 +2517,9 @@ See the section \ref extsearch for details.
<option type='string' id='SEARCHDATA_FILE' format='file' defval='searchdata.xml' depends='SEARCHENGINE'>
<docs>
<![CDATA[
-When \ref cfg_server_based_search "SERVER_BASED_SEARCH" and
-\ref cfg_external_search "EXTERNAL_SEARCH" are both enabled the unindexed
-search data is written to a file for indexing by an external tool. With the
+When \ref cfg_server_based_search "SERVER_BASED_SEARCH" and
+\ref cfg_external_search "EXTERNAL_SEARCH" are both enabled the unindexed
+search data is written to a file for indexing by an external tool. With the
\c SEARCHDATA_FILE tag the name of this file can be specified.
]]>
</docs>
@@ -2492,10 +2527,10 @@ search data is written to a file for indexing by an external tool. With the
<option type='string' id='EXTERNAL_SEARCH_ID' format='string' defval='' depends='SEARCHENGINE'>
<docs>
<![CDATA[
-When \ref cfg_server_based_search "SERVER_BASED_SEARCH" and
-\ref cfg_external_search "EXTERNAL_SEARCH" are both enabled the
-\c EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
-useful in combination with \ref cfg_extra_search_mappings "EXTRA_SEARCH_MAPPINGS"
+When \ref cfg_server_based_search "SERVER_BASED_SEARCH" and
+\ref cfg_external_search "EXTERNAL_SEARCH" are both enabled the
+\c EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+useful in combination with \ref cfg_extra_search_mappings "EXTRA_SEARCH_MAPPINGS"
to search through multiple projects and redirect the results back to the right project.
]]>
</docs>
@@ -2503,16 +2538,16 @@ to search through multiple projects and redirect the results back to the right p
<option type='list' id='EXTRA_SEARCH_MAPPINGS' format='string' depends='SEARCHENGINE'>
<docs>
<![CDATA[
- The \c EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
- projects other than the one defined by this configuration file, but that are
- all added to the same external search index. Each project needs to have a
- unique id set via \ref cfg_external_search_id "EXTERNAL_SEARCH_ID".
- The search mapping then maps the id of to a relative location where the
- documentation can be found.
+ The \c EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+ projects other than the one defined by this configuration file, but that are
+ all added to the same external search index. Each project needs to have a
+ unique id set via \ref cfg_external_search_id "EXTERNAL_SEARCH_ID".
+ The search mapping then maps the id of to a relative location where the
+ documentation can be found.
- The format is:
+ The format is:
\verbatim
-EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
\endverbatim
]]>
</docs>
@@ -2530,7 +2565,7 @@ EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
<option type='string' id='LATEX_OUTPUT' format='dir' defval='latex' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$
+ The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$
docs will be put.
If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
put in front of it.
@@ -2540,7 +2575,7 @@ EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
<option type='string' id='LATEX_CMD_NAME' format='file' defval='' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c LATEX_CMD_NAME tag can be used to specify the \f$\mbox{\LaTeX}\f$ command name to be invoked.
+ The \c LATEX_CMD_NAME tag can be used to specify the \f$\mbox{\LaTeX}\f$ command name to be invoked.
<br>Note that when not enabling \ref cfg_use_pdflatex "USE_PDFLATEX" the default is \c latex when
enabling \ref cfg_use_pdflatex "USE_PDFLATEX" the default is \c pdflatex and when in the later case
\c latex is chosen this is overwritten by \c pdflatex. For specific output languages the default can
@@ -2551,7 +2586,7 @@ EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
<option type='string' id='MAKEINDEX_CMD_NAME' format='file' defval='makeindex' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+ The \c MAKEINDEX_CMD_NAME tag can be used to specify the command name to
generate index for \f$\mbox{\LaTeX}\f$.
@note This tag is used in the `Makefile` / `make.bat`.
@@ -2562,7 +2597,7 @@ EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
<option type='string' id='LATEX_MAKEINDEX_CMD' defval='\makeindex' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+ The \c LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
generate index for \f$\mbox{\LaTeX}\f$.
@note This tag is used in the generated output file (`.tex`).
@@ -2594,7 +2629,7 @@ EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
<option type='list' id='EXTRA_PACKAGES' format='string' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$
+ The \c EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$
package names that should be included in the \f$\mbox{\LaTeX}\f$ output. The package
can be specified just by its name or with the correct syntax as to be used with the
\f$\mbox{\LaTeX}\f$ `\usepackage` command.
@@ -2602,7 +2637,7 @@ EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
To get the `times` font for instance you can specify :
\verbatim
EXTRA_PACKAGES=times
-or
+or
EXTRA_PACKAGES={times}
\endverbatim
To use the option `intlimits` with the `amsmath` package you can specify:
@@ -2616,21 +2651,21 @@ or
<option type='string' id='LATEX_HEADER' format='file' defval='' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c LATEX_HEADER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$
- header for the generated \f$\mbox{\LaTeX}\f$ document.
- The header should contain everything until the first chapter.
+ The \c LATEX_HEADER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$
+ header for the generated \f$\mbox{\LaTeX}\f$ document.
+ The header should contain everything until the first chapter.
- If it is left blank doxygen will generate a
- standard header. See section \ref doxygen_usage for information on how to
+ If it is left blank doxygen will generate a
+ standard header. See section \ref doxygen_usage for information on how to
let doxygen write the default header to a separate file.
-
+
<br>Note: Only use a user-defined header if you know what you are doing!
The following commands have a special meaning inside the header:
<code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
- <code>\$doxygenversion</code>, <code>\$projectname</code>,
- <code>\$projectnumber</code>, <code>\$projectbrief</code>,
- <code>\$projectlogo</code>.
+ <code>\$doxygenversion</code>, <code>\$projectname</code>,
+ <code>\$projectnumber</code>, <code>\$projectbrief</code>,
+ <code>\$projectlogo</code>.
Doxygen will replace <code>\$title</code> with the empty string, for the replacement values of the
other commands the user is referred to \ref cfg_html_header "HTML_HEADER".
]]>
@@ -2639,14 +2674,14 @@ or
<option type='string' id='LATEX_FOOTER' format='file' defval='' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c LATEX_FOOTER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$ footer for
- the generated \f$\mbox{\LaTeX}\f$ document. The footer should contain everything after
- the last chapter. If it is left blank doxygen will generate a
+ The \c LATEX_FOOTER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$ footer for
+ the generated \f$\mbox{\LaTeX}\f$ document. The footer should contain everything after
+ the last chapter. If it is left blank doxygen will generate a
standard footer.
- See \ref cfg_latex_header "LATEX_HEADER" for more information on
- how to generate a default footer and what special commands can be
+ See \ref cfg_latex_header "LATEX_HEADER" for more information on
+ how to generate a default footer and what special commands can be
used inside the footer.
-
+
<br>Note: Only use a user-defined footer if you know what you are doing!
]]>
</docs>
@@ -2654,10 +2689,10 @@ or
<option type='list' id='LATEX_EXTRA_STYLESHEET' format='file' defval='' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c LATEX_EXTRA_STYLESHEET tag can be used to specify additional
- user-defined \f$\mbox{\LaTeX}\f$ style sheets that are included after the standard
- style sheets created by doxygen. Using this option one can overrule
- certain style aspects. Doxygen will copy the style sheet files to
+ The \c LATEX_EXTRA_STYLESHEET tag can be used to specify additional
+ user-defined \f$\mbox{\LaTeX}\f$ style sheets that are included after the standard
+ style sheets created by doxygen. Using this option one can overrule
+ certain style aspects. Doxygen will copy the style sheet files to
the output directory.
\note The order of the extra style sheet files is of importance (e.g. the last
style sheet in the list overrules the setting of the previous ones in the list).
@@ -2678,8 +2713,8 @@ or
<option type='bool' id='PDF_HYPERLINKS' defval='1' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- If the \c PDF_HYPERLINKS tag is set to \c YES, the \f$\mbox{\LaTeX}\f$ that
- is generated is prepared for conversion to PDF (using \c ps2pdf or \c pdflatex).
+ If the \c PDF_HYPERLINKS tag is set to \c YES, the \f$\mbox{\LaTeX}\f$ that
+ is generated is prepared for conversion to PDF (using \c ps2pdf or \c pdflatex).
The PDF file will
contain links (just like the HTML output) instead of page references.
This makes the output suitable for online browsing using a PDF viewer.
@@ -2691,7 +2726,7 @@ or
<![CDATA[
If the \c USE_PDFLATEX tag is set to \c YES, doxygen will use
\c pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
- files. Set this option to \c YES, to get a higher quality PDF documentation.
+ files. Set this option to \c YES, to get a higher quality PDF documentation.
]]>
</docs>
</option>
@@ -2699,9 +2734,9 @@ or
<docs>
<![CDATA[
If the \c LATEX_BATCHMODE tag is set to \c YES, doxygen will add the \c \\batchmode
- command to the generated \f$\mbox{\LaTeX}\f$ files. This will
- instruct \f$\mbox{\LaTeX}\f$ to keep running if errors occur, instead of
- asking the user for help. This option is also used when generating formulas
+ command to the generated \f$\mbox{\LaTeX}\f$ files. This will
+ instruct \f$\mbox{\LaTeX}\f$ to keep running if errors occur, instead of
+ asking the user for help. This option is also used when generating formulas
in HTML.
]]>
</docs>
@@ -2710,17 +2745,17 @@ or
<docs>
<![CDATA[
If the \c LATEX_HIDE_INDICES tag is set to \c YES then doxygen will not
- include the index chapters (such as File Index, Compound Index, etc.)
- in the output.
+ include the index chapters (such as File Index, Compound Index, etc.)
+ in the output.
]]>
</docs>
</option>
<option type='bool' id='LATEX_SOURCE_CODE' defval='0' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- If the \c LATEX_SOURCE_CODE tag is set to \c YES then doxygen will include
- source code with syntax highlighting in the \f$\mbox{\LaTeX}\f$ output.
- <br>Note that which sources are shown also depends on other settings
+ If the \c LATEX_SOURCE_CODE tag is set to \c YES then doxygen will include
+ source code with syntax highlighting in the \f$\mbox{\LaTeX}\f$ output.
+ <br>Note that which sources are shown also depends on other settings
such as \ref cfg_source_browser "SOURCE_BROWSER".
]]>
</docs>
@@ -2728,8 +2763,8 @@ or
<option type='string' id='LATEX_BIB_STYLE' format='string' defval='plain' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c LATEX_BIB_STYLE tag can be used to specify the style to use for the
- bibliography, e.g. \c plainnat, or \c ieeetr.
+ The \c LATEX_BIB_STYLE tag can be used to specify the style to use for the
+ bibliography, e.g. \c plainnat, or \c ieeetr.
See https://en.wikipedia.org/wiki/BibTeX and \ref cmdcite "\\cite"
for more info.
]]>
@@ -2745,6 +2780,16 @@ or
]]>
</docs>
</option>
+ <option type='string' id='LATEX_EMOJI_DIRECTORY' format='dir' defval='' depends='GENERATE_LATEX'>
+ <docs>
+<![CDATA[
+ The \c LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+ path from which the emoji images will be read.
+ If a relative path is entered, it will be relative to the \ref cfg_latex_output "LATEX_OUTPUT"
+ directory. If left blank the \ref cfg_latex_output "LATEX_OUTPUT" directory will be used.
+]]>
+ </docs>
+ </option>
</group>
<group name='RTF' docs='Configuration options related to the RTF output'>
<option type='bool' id='GENERATE_RTF' defval='0'>
@@ -2804,8 +2849,8 @@ or
<docs>
<![CDATA[
Set optional variables used in the generation of an RTF document.
- Syntax is similar to doxygen's configuration file.
- A template extensions file can be generated using
+ Syntax is similar to doxygen's configuration file.
+ A template extensions file can be generated using
<code>doxygen -e rtf extensionFile</code>.
]]>
</docs>
@@ -2835,8 +2880,8 @@ or
<![CDATA[
The \c MAN_OUTPUT tag is used to specify where the man pages will be put.
If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
- put in front of it.
- A directory \c man3 will be created inside the directory specified by
+ put in front of it.
+ A directory \c man3 will be created inside the directory specified by
\c MAN_OUTPUT.
]]>
</docs>
@@ -2863,10 +2908,10 @@ or
<option type='bool' id='MAN_LINKS' defval='0' depends='GENERATE_MAN'>
<docs>
<![CDATA[
- If the \c MAN_LINKS tag is set to \c YES and doxygen generates man output,
- then it will generate one additional man file for each entity documented in
- the real man page(s). These additional files only source the real man page,
- but without them the \c man command would be unable to find the correct page.
+ If the \c MAN_LINKS tag is set to \c YES and doxygen generates man output,
+ then it will generate one additional man file for each entity documented in
+ the real man page(s). These additional files only source the real man page,
+ but without them the \c man command would be unable to find the correct page.
]]>
</docs>
</option>
@@ -2877,15 +2922,15 @@ or
<![CDATA[
If the \c GENERATE_XML tag is set to \c YES, doxygen will
generate an XML file that captures the structure of
- the code including all documentation.
+ the code including all documentation.
]]>
</docs>
</option>
<option type='string' id='XML_OUTPUT' format='dir' defval='xml' depends='GENERATE_XML'>
<docs>
<![CDATA[
- The \c XML_OUTPUT tag is used to specify where the XML pages will be put.
- If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
+ The \c XML_OUTPUT tag is used to specify where the XML pages will be put.
+ If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
put in front of it.
]]>
</docs>
@@ -2905,7 +2950,7 @@ or
<option type='bool' id='GENERATE_DOCBOOK' defval='0'>
<docs>
<![CDATA[
-If the \c GENERATE_DOCBOOK tag is set to \c YES, doxygen will generate Docbook files
+If the \c GENERATE_DOCBOOK tag is set to \c YES, doxygen will generate Docbook files
that can be used to generate PDF.
]]>
</docs>
@@ -2913,8 +2958,8 @@ that can be used to generate PDF.
<option type='string' id='DOCBOOK_OUTPUT' format='dir' defval='docbook' depends='GENERATE_DOCBOOK'>
<docs>
<![CDATA[
-The \c DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
-If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be put in
+The \c DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be put in
front of it.
]]>
</docs>
@@ -2937,8 +2982,8 @@ front of it.
If the \c GENERATE_AUTOGEN_DEF tag is set to \c YES, doxygen will
generate an AutoGen Definitions (see http://autogen.sourceforge.net/) file
that captures the structure of the code including all
- documentation. Note that this feature is still experimental
- and incomplete at the moment.
+ documentation. Note that this feature is still experimental
+ and incomplete at the moment.
]]>
</docs>
</option>
@@ -2956,8 +3001,8 @@ If the \c GENERATE_SQLITE3 tag is set to \c YES doxygen will generate a
<option type='string' id='SQLITE3_OUTPUT' format='dir' defval='sqlite3' depends='GENERATE_SQLITE3'>
<docs>
<![CDATA[
-The \c SQLITE3_OUTPUT tag is used to specify where the \c Sqlite3 database will be put.
-If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
+The \c SQLITE3_OUTPUT tag is used to specify where the \c Sqlite3 database will be put.
+If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
put in front of it.
]]>
</docs>
@@ -2972,7 +3017,7 @@ put in front of it.
If the \c GENERATE_PERLMOD tag is set to \c YES, doxygen will
generate a Perl module file that captures the structure of
the code including all documentation.
- <br>Note that this
+ <br>Note that this
feature is still experimental and incomplete at the
moment.
]]>
@@ -2981,28 +3026,28 @@ put in front of it.
<option type='bool' id='PERLMOD_LATEX' defval='0' depends='GENERATE_PERLMOD'>
<docs>
<![CDATA[
- If the \c PERLMOD_LATEX tag is set to \c YES, doxygen will generate
- the necessary \c Makefile rules, \c Perl scripts and \f$\mbox{\LaTeX}\f$ code to be able
- to generate PDF and DVI output from the Perl module output.
+ If the \c PERLMOD_LATEX tag is set to \c YES, doxygen will generate
+ the necessary \c Makefile rules, \c Perl scripts and \f$\mbox{\LaTeX}\f$ code to be able
+ to generate PDF and DVI output from the Perl module output.
]]>
</docs>
</option>
<option type='bool' id='PERLMOD_PRETTY' defval='1' depends='GENERATE_PERLMOD'>
<docs>
<![CDATA[
- If the \c PERLMOD_PRETTY tag is set to \c YES, the Perl module output will be
- nicely formatted so it can be parsed by a human reader. This is useful
+ If the \c PERLMOD_PRETTY tag is set to \c YES, the Perl module output will be
+ nicely formatted so it can be parsed by a human reader. This is useful
if you want to understand what is going on. On the other hand, if this
tag is set to \c NO, the size of the Perl module output will be much smaller
- and Perl will parse it just the same.
+ and Perl will parse it just the same.
]]>
</docs>
</option>
<option type='string' id='PERLMOD_MAKEVAR_PREFIX' format='string' defval='' depends='GENERATE_PERLMOD'>
<docs>
<![CDATA[
- The names of the make variables in the generated `doxyrules.make` file
- are prefixed with the string contained in \c PERLMOD_MAKEVAR_PREFIX.
+ The names of the make variables in the generated `doxyrules.make` file
+ are prefixed with the string contained in \c PERLMOD_MAKEVAR_PREFIX.
This is useful so different `doxyrules.make` files included by the same
`Makefile` don't overwrite each other's variables.
]]>
@@ -3015,7 +3060,7 @@ put in front of it.
<![CDATA[
If the \c ENABLE_PREPROCESSING tag is set to \c YES, doxygen will
evaluate all C-preprocessor directives found in the sources and include
- files.
+ files.
]]>
</docs>
</option>
@@ -3023,7 +3068,7 @@ put in front of it.
<docs>
<![CDATA[
If the \c MACRO_EXPANSION tag is set to \c YES, doxygen will expand all macro
- names in the source code. If set to \c NO, only conditional
+ names in the source code. If set to \c NO, only conditional
compilation will be performed. Macro expansion can be done in a controlled
way by setting \ref cfg_expand_only_predef "EXPAND_ONLY_PREDEF" to \c YES.
]]>
@@ -3058,10 +3103,10 @@ put in front of it.
<option type='list' id='INCLUDE_FILE_PATTERNS' format='string' depends='ENABLE_PREPROCESSING'>
<docs>
<![CDATA[
- You can use the \c INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
- patterns (like `*.h` and `*.hpp`) to filter out the header-files in the
- directories. If left blank, the patterns specified with \ref cfg_file_patterns "FILE_PATTERNS" will
- be used.
+ You can use the \c INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+ patterns (like `*.h` and `*.hpp`) to filter out the header-files in the
+ directories. If left blank, the patterns specified with \ref cfg_file_patterns "FILE_PATTERNS" will
+ be used.
]]>
</docs>
</option>
@@ -3071,7 +3116,7 @@ put in front of it.
The \c PREDEFINED tag can be used to specify one or more macro names that
are defined before the preprocessor is started (similar to the `-D` option of
e.g. \c gcc). The argument of the tag is a list of macros of the form:
- <code>name</code> or <code>name=definition</code> (no spaces).
+ <code>name</code> or <code>name=definition</code> (no spaces).
If the definition and the \c "=" are omitted, \c "=1" is assumed. To prevent
a macro definition from being undefined via \c \#undef or recursively expanded
use the <code>:=</code> operator instead of the \c = operator.
@@ -3086,18 +3131,18 @@ put in front of it.
this tag can be used to specify a list of macro names that should be expanded.
The macro definition that is found in the sources will be used.
Use the \ref cfg_predefined "PREDEFINED" tag if you want to use a different macro definition that
- overrules the definition found in the source code.
+ overrules the definition found in the source code.
]]>
</docs>
</option>
<option type='bool' id='SKIP_FUNCTION_MACROS' defval='1' depends='ENABLE_PREPROCESSING'>
<docs>
<![CDATA[
- If the \c SKIP_FUNCTION_MACROS tag is set to \c YES then
- doxygen's preprocessor will remove all references to function-like macros that are alone
- on a line, have an all uppercase name, and do not end with a semicolon.
- Such function macros are typically
- used for boiler-plate code, and will confuse the parser if not removed.
+ If the \c SKIP_FUNCTION_MACROS tag is set to \c YES then
+ doxygen's preprocessor will remove all references to function-like macros that are alone
+ on a line, have an all uppercase name, and do not end with a semicolon.
+ Such function macros are typically
+ used for boiler-plate code, and will confuse the parser if not removed.
]]>
</docs>
</option>
@@ -3106,25 +3151,25 @@ put in front of it.
<option type='list' id='TAGFILES' format='file'>
<docs>
<![CDATA[
- The \c TAGFILES tag can be used to specify one or more tag files.
+ The \c TAGFILES tag can be used to specify one or more tag files.
-For each
-tag file the location of the external documentation should be added. The
-format of a tag file without this location is as follows:
+For each
+tag file the location of the external documentation should be added. The
+format of a tag file without this location is as follows:
\verbatim
- TAGFILES = file1 file2 ...
+ TAGFILES = file1 file2 ...
\endverbatim
-Adding location for the tag files is done as follows:
+Adding location for the tag files is done as follows:
\verbatim
- TAGFILES = file1=loc1 "file2 = loc2" ...
+ TAGFILES = file1=loc1 "file2 = loc2" ...
\endverbatim
where `loc1` and `loc2` can be relative or absolute paths or URLs.
See the section \ref external for more information about the use of tag files.
\note
- Each tag file must have a unique name
+ Each tag file must have a unique name
(where the name does \e NOT include the path).
- If a tag file is not located in the directory in which doxygen
+ If a tag file is not located in the directory in which doxygen
is run, you must also specify the path to the tagfile here.
]]>
</docs>
@@ -3134,7 +3179,7 @@ where `loc1` and `loc2` can be relative or absolute paths or URLs.
<![CDATA[
When a file name is specified after \c GENERATE_TAGFILE, doxygen will create
a tag file that is based on the input files it reads.
- See section \ref external for more information about the usage of
+ See section \ref external for more information about the usage of
tag files.
]]>
</docs>
@@ -3160,9 +3205,9 @@ where `loc1` and `loc2` can be relative or absolute paths or URLs.
<option type='bool' id='EXTERNAL_PAGES' defval='1'>
<docs>
<![CDATA[
- If the \c EXTERNAL_PAGES tag is set to \c YES, all external pages will be listed
- in the related pages index. If set to \c NO, only the current project's
- pages will be listed.
+ If the \c EXTERNAL_PAGES tag is set to \c YES, all external pages will be listed
+ in the related pages index. If set to \c NO, only the current project's
+ pages will be listed.
]]>
</docs>
</option>
@@ -3181,19 +3226,19 @@ where `loc1` and `loc2` can be relative or absolute paths or URLs.
<![CDATA[
If the \c CLASS_DIAGRAMS tag is set to \c YES, doxygen will
generate a class diagram (in HTML and \f$\mbox{\LaTeX}\f$) for classes with base or
- super classes. Setting the tag to \c NO turns the diagrams off. Note that
- this option also works with \ref cfg_have_dot "HAVE_DOT" disabled, but it is recommended to
- install and use \c dot, since it yields more powerful graphs.
+ super classes. Setting the tag to \c NO turns the diagrams off. Note that
+ this option also works with \ref cfg_have_dot "HAVE_DOT" disabled, but it is recommended to
+ install and use \c dot, since it yields more powerful graphs.
]]>
</docs>
</option>
<option type='string' id='MSCGEN_PATH' format='dir' defval=''>
<docs>
<![CDATA[
- You can define message sequence charts within doxygen comments using the \ref cmdmsc "\\msc"
- command. Doxygen will then run the <a href="http://www.mcternan.me.uk/mscgen/">mscgen tool</a>) to
- produce the chart and insert it in the documentation. The <code>MSCGEN_PATH</code> tag allows you to
- specify the directory where the \c mscgen tool resides. If left empty the tool is assumed to
+ You can define message sequence charts within doxygen comments using the \ref cmdmsc "\\msc"
+ command. Doxygen will then run the <a href="http://www.mcternan.me.uk/mscgen/">mscgen tool</a>) to
+ produce the chart and insert it in the documentation. The <code>MSCGEN_PATH</code> tag allows you to
+ specify the directory where the \c mscgen tool resides. If left empty the tool is assumed to
be found in the default search path.
]]>
</docs>
@@ -3201,9 +3246,9 @@ where `loc1` and `loc2` can be relative or absolute paths or URLs.
<option type='string' id='DIA_PATH' format='dir' defval=''>
<docs>
<![CDATA[
-You can include diagrams made with dia in doxygen documentation. Doxygen will then run
-dia to produce the diagram and insert it in the documentation. The DIA_PATH tag allows
-you to specify the directory where the dia binary resides. If left empty dia is assumed
+You can include diagrams made with dia in doxygen documentation. Doxygen will then run
+dia to produce the diagram and insert it in the documentation. The DIA_PATH tag allows
+you to specify the directory where the dia binary resides. If left empty dia is assumed
to be found in the default search path.
]]>
</docs>
@@ -3221,9 +3266,9 @@ to be found in the default search path.
<docs>
<![CDATA[
If you set the \c HAVE_DOT tag to \c YES then doxygen will assume the \c dot tool is
- available from the \c path. This tool is part of
- <a href="http://www.graphviz.org/">Graphviz</a>, a graph
- visualization toolkit from AT\&T and Lucent Bell Labs. The other options in
+ available from the \c path. This tool is part of
+ <a href="http://www.graphviz.org/">Graphviz</a>, a graph
+ visualization toolkit from AT\&T and Lucent Bell Labs. The other options in
this section have no effect if this option is set to \c NO
]]>
</docs>
@@ -3231,11 +3276,11 @@ to be found in the default search path.
<option type='int' id='DOT_NUM_THREADS' defval='0' minval='0' maxval='32' depends='HAVE_DOT'>
<docs>
<![CDATA[
- The \c DOT_NUM_THREADS specifies the number of \c dot invocations doxygen is
- allowed to run in parallel. When set to \c 0 doxygen will
- base this on the number of processors available in the system. You can set it
- explicitly to a value larger than 0 to get control over the balance
- between CPU load and processing speed.
+ The \c DOT_NUM_THREADS specifies the number of \c dot invocations doxygen is
+ allowed to run in parallel. When set to \c 0 doxygen will
+ base this on the number of processors available in the system. You can set it
+ explicitly to a value larger than 0 to get control over the balance
+ between CPU load and processing speed.
]]>
</docs>
</option>
@@ -3243,11 +3288,11 @@ to be found in the default search path.
<docs>
<![CDATA[
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
- directory containing the font.
+ 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
+ directory containing the font.
]]>
</docs>
</option>
@@ -3262,8 +3307,8 @@ to be found in the default search path.
<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
+ 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.
]]>
</docs>
@@ -3273,7 +3318,7 @@ to be found in the default search path.
<![CDATA[
If the \c CLASS_GRAPH tag is set to \c YES then doxygen
will generate a graph for each documented class showing the direct and
- indirect inheritance relations. Setting this tag to \c YES will force
+ indirect inheritance relations. Setting this tag to \c YES will force
the \ref cfg_class_diagrams "CLASS_DIAGRAMS" tag to \c NO.
]]>
</docs>
@@ -3308,10 +3353,10 @@ to be found in the default search path.
<option type='int' id='UML_LIMIT_NUM_FIELDS' defval='10' minval='0' maxval='100' depends='HAVE_DOT'>
<docs>
<![CDATA[
- If the \ref cfg_uml_look "UML_LOOK" tag is enabled, the fields and methods are shown inside
- the class node. If there are many fields or methods and many nodes the
- graph may become too big to be useful. The \c UML_LIMIT_NUM_FIELDS
- threshold limits the number of items for each type to make the size more
+ If the \ref cfg_uml_look "UML_LOOK" tag is enabled, the fields and methods are shown inside
+ the class node. If there are many fields or methods and many nodes the
+ graph may become too big to be useful. The \c UML_LIMIT_NUM_FIELDS
+ threshold limits the number of items for each type to make the size more
manageable. Set this to 0 for no limit. Note that the threshold may be
exceeded by 50% before the limit is enforced. So when you set the threshold
to 10, up to 15 fields may appear, but if the number exceeds 15, the
@@ -3322,7 +3367,7 @@ to be found in the default search path.
<option type='bool' id='TEMPLATE_RELATIONS' defval='0' depends='HAVE_DOT'>
<docs>
<![CDATA[
- If the \c TEMPLATE_RELATIONS tag is set to \c YES then
+ If the \c TEMPLATE_RELATIONS tag is set to \c YES then
the inheritance and collaboration graphs will show the relations between templates and their instances.
]]>
</docs>
@@ -3331,7 +3376,7 @@ to be found in the default search path.
<docs>
<![CDATA[
If the \c INCLUDE_GRAPH, \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" and
- \ref cfg_search_includes "SEARCH_INCLUDES"
+ \ref cfg_search_includes "SEARCH_INCLUDES"
tags are set to \c YES then doxygen will generate a graph for each documented file
showing the direct and indirect include dependencies of the file with other
documented files.
@@ -3352,12 +3397,12 @@ to be found in the default search path.
<option type='bool' id='CALL_GRAPH' defval='0' depends='HAVE_DOT'>
<docs>
<![CDATA[
- If the \c CALL_GRAPH tag is set to \c YES then doxygen will
- generate a call dependency graph for every global function or class method.
+ If the \c CALL_GRAPH tag is set to \c YES then doxygen will
+ generate a call dependency graph for every global function or class method.
<br>Note that enabling this option will significantly increase the time of a run.
- So in most cases it will be better to enable call graphs for selected
- functions only using the \ref cmdcallgraph "\\callgraph" command.
- Disabling a call graph can be accomplished by means of the command
+ So in most cases it will be better to enable call graphs for selected
+ functions only using the \ref cmdcallgraph "\\callgraph" command.
+ Disabling a call graph can be accomplished by means of the command
\ref cmdhidecallgraph "\\hidecallgraph".
]]>
</docs>
@@ -3365,12 +3410,12 @@ to be found in the default search path.
<option type='bool' id='CALLER_GRAPH' defval='0' depends='HAVE_DOT'>
<docs>
<![CDATA[
- If the \c CALLER_GRAPH tag is set to \c YES then doxygen will
- generate a caller dependency graph for every global function or class method.
+ If the \c CALLER_GRAPH tag is set to \c YES then doxygen will
+ generate a caller dependency graph for every global function or class method.
<br>Note that enabling this option will significantly increase the time of a run.
- So in most cases it will be better to enable caller graphs for selected
- functions only using the \ref cmdcallergraph "\\callergraph" command.
- Disabling a caller graph can be accomplished by means of the command
+ So in most cases it will be better to enable caller graphs for selected
+ functions only using the \ref cmdcallergraph "\\callergraph" command.
+ Disabling a caller graph can be accomplished by means of the command
\ref cmdhidecallergraph "\\hidecallergraph".
]]>
</docs>
@@ -3378,7 +3423,7 @@ to be found in the default search path.
<option type='bool' id='GRAPHICAL_HIERARCHY' defval='1' depends='HAVE_DOT'>
<docs>
<![CDATA[
- If the \c GRAPHICAL_HIERARCHY tag is set to \c YES then
+ If the \c GRAPHICAL_HIERARCHY tag is set to \c YES then
doxygen will graphical hierarchy of all classes instead of a textual one.
]]>
</docs>
@@ -3386,7 +3431,7 @@ to be found in the default search path.
<option type='bool' id='DIRECTORY_GRAPH' defval='1' depends='HAVE_DOT'>
<docs>
<![CDATA[
- If the \c DIRECTORY_GRAPH tag is set
+ If the \c DIRECTORY_GRAPH tag is set
to \c YES then doxygen will show the dependencies a directory has on other directories
in a graphical way. The dependency relations are determined by the \c \#include
relations between the files in the directories.
@@ -3400,7 +3445,7 @@ to be found in the default search path.
generated by \c dot. For an explanation of the image formats see the section output formats
in the documentation of the \c dot tool
(<a href="http://www.graphviz.org/">Graphviz</a>).
- \note If you choose \c svg you need to set
+ \note If you choose \c svg you need to set
\ref cfg_html_file_extension "HTML_FILE_EXTENSION" to \c xhtml in order to make the SVG files
visible in IE 9+ (other browsers do not have this requirement).
]]>
@@ -3422,10 +3467,10 @@ to be found in the default search path.
<docs>
<![CDATA[
If \ref cfg_dot_image_format "DOT_IMAGE_FORMAT" is set to \c svg, then this option can be set to \c YES to
- enable generation of interactive SVG images that allow zooming and panning.
- <br>Note that this requires a modern browser other than Internet Explorer.
+ enable generation of interactive SVG images that allow zooming and panning.
+ <br>Note that this requires a modern browser other than Internet Explorer.
Tested and working are Firefox, Chrome, Safari, and Opera.
- \note For IE 9+ you need to set \ref cfg_html_file_extension "HTML_FILE_EXTENSION" to \c xhtml in order
+ \note For IE 9+ you need to set \ref cfg_html_file_extension "HTML_FILE_EXTENSION" to \c xhtml in order
to make the SVG files visible. Older versions of IE do not have SVG support.
]]>
</docs>
@@ -3433,15 +3478,15 @@ to be found in the default search path.
<option type='string' id='DOT_PATH' format='dir' defval='' depends='HAVE_DOT'>
<docs>
<![CDATA[
- The \c DOT_PATH tag can be used to specify the path where the \c dot tool can be found.
- If left blank, it is assumed the \c dot tool can be found in the \c path.
+ The \c DOT_PATH tag can be used to specify the path where the \c dot tool can be found.
+ If left blank, it is assumed the \c dot tool can be found in the \c path.
]]>
</docs>
</option>
<option type='list' id='DOTFILE_DIRS' format='dir' depends='HAVE_DOT'>
<docs>
<![CDATA[
- The \c DOTFILE_DIRS tag can be used to specify one or more directories that
+ The \c DOTFILE_DIRS tag can be used to specify one or more directories that
contain dot files that are included in the documentation (see the
\ref cmddotfile "\\dotfile" command).
]]>
@@ -3450,7 +3495,7 @@ to be found in the default search path.
<option type='list' id='MSCFILE_DIRS' format='dir'>
<docs>
<![CDATA[
- The \c MSCFILE_DIRS tag can be used to specify one or more directories that
+ The \c MSCFILE_DIRS tag can be used to specify one or more directories that
contain msc files that are included in the documentation (see the
\ref cmdmscfile "\\mscfile" command).
]]>
@@ -3459,7 +3504,7 @@ to be found in the default search path.
<option type='list' id='DIAFILE_DIRS' format='dir'>
<docs>
<![CDATA[
- The \c DIAFILE_DIRS tag can be used to specify one or more directories that
+ The \c DIAFILE_DIRS tag can be used to specify one or more directories that
contain dia files that are included in the documentation (see the
\ref cmddiafile "\\diafile" command).
]]>
@@ -3468,9 +3513,9 @@ to be found in the default search path.
<option type='string' id='PLANTUML_JAR_PATH' format='dir' defval=''>
<docs>
<![CDATA[
- When using plantuml, the \c PLANTUML_JAR_PATH tag should be used to specify the path where
- java can find the \c plantuml.jar file. If left blank, it is assumed PlantUML is not used or
- called during a preprocessing step. Doxygen will generate a warning when it encounters a
+ When using plantuml, the \c PLANTUML_JAR_PATH tag should be used to specify the path where
+ java can find the \c plantuml.jar file. If left blank, it is assumed PlantUML is not used or
+ called during a preprocessing step. Doxygen will generate a warning when it encounters a
\ref cmdstartuml "\\startuml" command in this case and will not generate output for the diagram.
]]>
</docs>
@@ -3478,7 +3523,7 @@ to be found in the default search path.
<option type='string' id='PLANTUML_CFG_FILE' format='file' defval=''>
<docs>
<![CDATA[
- When using plantuml, the \c PLANTUML_CFG_FILE tag can be used to specify a configuration
+ When using plantuml, the \c PLANTUML_CFG_FILE tag can be used to specify a configuration
file for plantuml.
]]>
</docs>
@@ -3487,7 +3532,7 @@ to be found in the default search path.
<docs>
<![CDATA[
When using plantuml, the specified paths are searched for files specified by the \c !include
- statement in a plantuml block.
+ statement in a plantuml block.
]]>
</docs>
</option>
@@ -3502,9 +3547,9 @@ This will run once at the end of process like dot graphics processing.
<option type='int' id='DOT_GRAPH_MAX_NODES' minval='0' maxval='10000' defval='50' depends='HAVE_DOT'>
<docs>
<![CDATA[
- The \c DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+ The \c DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
nodes that will be shown in the graph. If the number of nodes in a graph
- becomes larger than this value, doxygen will truncate the graph, which is
+ becomes larger than this value, doxygen will truncate the graph, which is
visualized by representing a node as a red box. Note that doxygen if the number
of direct children of the root node in a graph is already larger than
\c DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
@@ -3515,7 +3560,7 @@ This will run once at the end of process like dot graphics processing.
<option type='int' id='MAX_DOT_GRAPH_DEPTH' minval='0' maxval='1000' defval='0' depends='HAVE_DOT'>
<docs>
<![CDATA[
- The \c MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+ The \c MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
graphs generated by \c dot. A depth value of 3 means that only nodes reachable
from the root by following a path via at most 3 edges will be shown. Nodes
that lay further from the root node will be omitted. Note that setting this
@@ -3529,12 +3574,12 @@ This will run once at the end of process like dot graphics processing.
<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
+ 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).
+ 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>
diff --git a/src/configimpl.h b/src/configimpl.h
index c901198..1594d47 100644
--- a/src/configimpl.h
+++ b/src/configimpl.h
@@ -73,7 +73,9 @@ class ConfigOption
protected:
virtual void writeTemplate(FTextStream &t,bool sl,bool upd) = 0;
+ virtual void compareDoxyfile(FTextStream &t) = 0;
virtual void convertStrToVal() {}
+ virtual void emptyValueToDefault() {}
virtual void substEnvVars() = 0;
virtual void init() {}
@@ -103,6 +105,7 @@ class ConfigInfo : public ConfigOption
m_doc = doc;
}
void writeTemplate(FTextStream &t, bool sl,bool);
+ void compareDoxyfile(FTextStream &){};
void substEnvVars() {}
};
@@ -124,6 +127,7 @@ class ConfigList : public ConfigOption
WidgetType widgetType() const { return m_widgetType; }
QStrList *valueRef() { return &m_value; }
void writeTemplate(FTextStream &t,bool sl,bool);
+ void compareDoxyfile(FTextStream &t);
void substEnvVars();
void init() { m_value = m_defaultValue; }
private:
@@ -153,6 +157,7 @@ class ConfigEnum : public ConfigOption
QCString *valueRef() { return &m_value; }
void substEnvVars();
void writeTemplate(FTextStream &t,bool sl,bool);
+ void compareDoxyfile(FTextStream &t);
void init() { m_value = m_defValue.copy(); }
private:
@@ -182,8 +187,10 @@ class ConfigString : public ConfigOption
void setDefaultValue(const char *v) { m_defValue = v; }
QCString *valueRef() { return &m_value; }
void writeTemplate(FTextStream &t,bool sl,bool);
+ void compareDoxyfile(FTextStream &t);
void substEnvVars();
void init() { m_value = m_defValue.copy(); }
+ void emptyValueToDefault() { if(m_value.isEmpty()) m_value=m_defValue; };
private:
QCString m_value;
@@ -213,6 +220,7 @@ class ConfigInt : public ConfigOption
void convertStrToVal();
void substEnvVars();
void writeTemplate(FTextStream &t,bool sl,bool upd);
+ void compareDoxyfile(FTextStream &t);
void init() { m_value = m_defValue; }
private:
int m_value;
@@ -241,6 +249,7 @@ class ConfigBool : public ConfigOption
void substEnvVars();
void setValueString(const QCString &v) { m_valueString = v; }
void writeTemplate(FTextStream &t,bool sl,bool upd);
+ void compareDoxyfile(FTextStream &t);
void init() { m_value = m_defValue; }
private:
bool m_value;
@@ -256,6 +265,7 @@ class ConfigObsolete : public ConfigOption
ConfigObsolete(const char *name) : ConfigOption(O_Obsolete)
{ m_name = name; }
void writeTemplate(FTextStream &,bool,bool);
+ void compareDoxyfile(FTextStream &) {}
void substEnvVars() {}
};
@@ -267,6 +277,7 @@ class ConfigDisabled : public ConfigOption
ConfigDisabled(const char *name) : ConfigOption(O_Disabled)
{ m_name = name; }
void writeTemplate(FTextStream &,bool,bool);
+ void compareDoxyfile(FTextStream &) {}
void substEnvVars() {}
};
@@ -466,6 +477,11 @@ class ConfigImpl
*/
void writeTemplate(FTextStream &t,bool shortIndex,bool updateOnly);
+ /*! Writes a the differences between the current configuration and the
+ * template configuration to stream \a t.
+ */
+ void compareDoxyfile(FTextStream &t);
+
void setHeader(const char *header) { m_header = header; }
/////////////////////////////
@@ -477,6 +493,10 @@ class ConfigImpl
*/
void convertStrToVal();
+ /*! Sets default value in case value is empty
+ */
+ void emptyValueToDefault();
+
/*! Replaces references to environment variable by the actual value
* of the environment variable.
*/
diff --git a/src/configimpl.l b/src/configimpl.l
index df032a6..b533910 100644
--- a/src/configimpl.l
+++ b/src/configimpl.l
@@ -315,6 +315,77 @@ void ConfigList::writeTemplate(FTextStream &t,bool sl,bool)
t << "\n";
}
+void ConfigList::compareDoxyfile(FTextStream &t)
+{
+ const char *p = m_value.first();
+ const char *q = m_defaultValue.first();
+ int defCnt = 0;
+ int valCnt = 0;
+
+ // count non empty elements
+ while (p)
+ {
+ QCString s=p;
+ if (!s.stripWhiteSpace().isEmpty()) valCnt += 1;
+ p = m_value.next();
+ }
+
+ while (q)
+ {
+ QCString s=q;
+ if (!s.stripWhiteSpace().isEmpty()) defCnt += 1;
+ q = m_defaultValue.next();
+ }
+ if ( valCnt != defCnt)
+ {
+ writeTemplate(t,TRUE,TRUE);
+ return;
+ }
+
+ // get first non empry element
+ q = m_defaultValue.first();
+ p = m_value.first();
+ QCString sp = p;
+ while (p && sp.stripWhiteSpace().isEmpty())
+ {
+ p = m_value.next();
+ sp = p;
+ }
+ QCString sq = q;
+ while (q && sq.stripWhiteSpace().isEmpty())
+ {
+ q = m_value.next();
+ sq = q;
+ }
+ while (p)
+ {
+ // skip empty elements
+ sp = p;
+ while (p && sp.stripWhiteSpace().isEmpty())
+ {
+ p = m_value.next();
+ sp = p;
+ }
+ sq = q;
+ while (q && sq.stripWhiteSpace().isEmpty())
+ {
+ q = m_value.next();
+ sq = q;
+ }
+ // be sure we have still an element (p and q have same number of 'filled' elements)
+ if (p)
+ {
+ if (sp.stripWhiteSpace() != sq.stripWhiteSpace())
+ {
+ writeTemplate(t,TRUE,TRUE);
+ return;
+ }
+ p = m_value.next();
+ q = m_defaultValue.next();
+ }
+ }
+}
+
void ConfigEnum::writeTemplate(FTextStream &t,bool sl,bool)
{
if (!sl)
@@ -332,6 +403,11 @@ void ConfigEnum::writeTemplate(FTextStream &t,bool sl,bool)
t << "\n";
}
+void ConfigEnum::compareDoxyfile(FTextStream &t)
+{
+ if (m_value != m_defValue) writeTemplate(t,TRUE,TRUE);
+}
+
void ConfigString::writeTemplate(FTextStream &t,bool sl,bool)
{
if (!sl)
@@ -349,6 +425,11 @@ void ConfigString::writeTemplate(FTextStream &t,bool sl,bool)
t << "\n";
}
+void ConfigString::compareDoxyfile(FTextStream &t)
+{
+ if (m_value.stripWhiteSpace() != m_defValue.stripWhiteSpace()) writeTemplate(t,TRUE,TRUE);
+}
+
void ConfigInt::writeTemplate(FTextStream &t,bool sl,bool upd)
{
if (!sl)
@@ -373,6 +454,11 @@ void ConfigInt::writeTemplate(FTextStream &t,bool sl,bool upd)
t << "\n";
}
+void ConfigInt::compareDoxyfile(FTextStream &t)
+{
+ if (m_value != m_defValue) writeTemplate(t,TRUE,TRUE);
+}
+
void ConfigBool::writeTemplate(FTextStream &t,bool sl,bool upd)
{
if (!sl)
@@ -397,6 +483,11 @@ void ConfigBool::writeTemplate(FTextStream &t,bool sl,bool upd)
t << "\n";
}
+void ConfigBool::compareDoxyfile(FTextStream &t)
+{
+ if (m_value != m_defValue) writeTemplate(t,TRUE,TRUE);
+}
+
void ConfigObsolete::writeTemplate(FTextStream &,bool,bool) {}
void ConfigDisabled::writeTemplate(FTextStream &,bool,bool) {}
@@ -777,7 +868,7 @@ static void readIncludeFile(const char *incName)
}
BEGIN(Start);
}
-<GetStrList>[ \t]+ {
+<GetStrList>[ \t,]+ {
if (!elemStr.isEmpty())
{
//printf("elemStr2=`%s'\n",elemStr.data());
@@ -831,7 +922,7 @@ static void readIncludeFile(const char *incName)
bs.data(),yyLineNr,yyFileName.data());
}
}
-<GetStrList>[^ \#\"\t\r\n]+ {
+<GetStrList>[^ \#\"\t\r\n,]+ {
elemStr+=configStringRecode(yytext,encoding,"UTF-8");
}
<SkipComment>\n { yyLineNr++; BEGIN(Start); }
@@ -871,6 +962,18 @@ void ConfigImpl::writeTemplate(FTextStream &t,bool sl,bool upd)
}
}
+void ConfigImpl::compareDoxyfile(FTextStream &t)
+{
+ t << "# Difference with default Doxyfile " << versionString << endl;
+ QListIterator<ConfigOption> it = iterator();
+ ConfigOption *option;
+ for (;(option=it.current());++it)
+ {
+ option->m_userComment = "";
+ option->compareDoxyfile(t);
+ }
+}
+
void ConfigImpl::convertStrToVal()
{
QListIterator<ConfigOption> it = iterator();
@@ -880,6 +983,15 @@ void ConfigImpl::convertStrToVal()
option->convertStrToVal();
}
}
+void ConfigImpl::emptyValueToDefault()
+{
+ QListIterator<ConfigOption> it = iterator();
+ ConfigOption *option;
+ for (;(option=it.current());++it)
+ {
+ option->emptyValueToDefault();
+ }
+}
static void substEnvVarsInString(QCString &s)
{
@@ -1151,7 +1263,7 @@ static void cleanUpPaths(QStrList &str)
char *sfp = str.first();
while (sfp)
{
- register char *p = sfp;
+ char *p = sfp;
if (p)
{
char c;
@@ -1749,14 +1861,21 @@ void Config::writeTemplate(FTextStream &t,bool shortList,bool update)
ConfigImpl::instance()->writeTemplate(t,shortList,update);
}
+void Config::compareDoxyfile(FTextStream &t)
+{
+ postProcess(FALSE, TRUE);
+ ConfigImpl::instance()->compareDoxyfile(t);
+}
+
bool Config::parse(const char *fileName,bool update)
{
return ConfigImpl::instance()->parse(fileName,update);
}
-void Config::postProcess(bool clearHeaderAndFooter)
+void Config::postProcess(bool clearHeaderAndFooter, bool compare)
{
ConfigImpl::instance()->substituteEnvironmentVars();
+ if (!compare)ConfigImpl::instance()->emptyValueToDefault();
ConfigImpl::instance()->convertStrToVal();
// avoid bootstrapping issues when the config file already
diff --git a/src/context.cpp b/src/context.cpp
index c9a6bb3..6b5d2ac 100644
--- a/src/context.cpp
+++ b/src/context.cpp
@@ -658,7 +658,7 @@ class TranslateContext::Private
{
return theTranslator->trPackages();
}
- else if (m_fortranOpt)
+ else if (m_fortranOpt || m_sliceOpt)
{
return theTranslator->trModules();
}
@@ -689,7 +689,7 @@ class TranslateContext::Private
{
return theTranslator->trPackages();
}
- else if (m_fortranOpt)
+ else if (m_fortranOpt || m_sliceOpt)
{
return theTranslator->trModulesList();
}
@@ -704,7 +704,7 @@ class TranslateContext::Private
{
return theTranslator->trPackageMembers();
}
- else if (m_fortranOpt)
+ else if (m_fortranOpt || m_sliceOpt)
{
return theTranslator->trModulesMembers();
}
@@ -856,6 +856,14 @@ class TranslateContext::Private
{
return theTranslator->trCallerGraph();
}
+ TemplateVariant referencedByRelation() const
+ {
+ return theTranslator->trReferencedBy();
+ }
+ TemplateVariant referencesRelation() const
+ {
+ return theTranslator->trReferences();
+ }
TemplateVariant inheritedFrom() const
{
return theTranslator->trInheritedFrom("@0","@1");
@@ -933,7 +941,8 @@ class TranslateContext::Private
}
TemplateVariant variables() const
{
- return theTranslator->trVariables();
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+ return sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables();
}
TemplateVariant typedefs() const
{
@@ -1112,6 +1121,10 @@ class TranslateContext::Private
s_inst.addProperty("callGraph", &Private::callGraph);
//%% string callerGraph
s_inst.addProperty("callerGraph", &Private::callerGraph);
+ //%% string referencedByRelation
+ s_inst.addProperty("referencedByRelation", &Private::referencedByRelation);
+ //%% string referencesRelation
+ s_inst.addProperty("referencesRelation", &Private::referencesRelation);
//%% markerstring inheritedFrom
s_inst.addProperty("inheritedFrom", &Private::inheritedFrom);
//%% string addtionalInheritedMembers
@@ -1209,6 +1222,7 @@ class TranslateContext::Private
m_javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
m_fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
m_vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ m_sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
}
TemplateVariant get(const char *n) const
{
@@ -1218,6 +1232,7 @@ class TranslateContext::Private
bool m_javaOpt;
bool m_fortranOpt;
bool m_vhdlOpt;
+ bool m_sliceOpt;
static PropertyMapper<TranslateContext::Private> s_inst;
};
//%% }
@@ -1525,6 +1540,7 @@ class DefinitionContext
case SrcLangExt_SQL: result="sql"; break;
case SrcLangExt_Tcl: result="tcl"; break;
case SrcLangExt_Markdown: result="markdown"; break;
+ case SrcLangExt_Slice: result="slice"; break;
}
return result;
}
@@ -1985,16 +2001,32 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
case ContextOutputFormat_Html:
{
+ QGString result;
+ FTextStream tt(&result);
+
QCString name = convertToHtml(m_classDef->displayName());
- t << "<div class=\"center\">" << endl;
- t << "<img src=\"";
- t << relPathAsString() << m_classDef->getOutputFileBase();
- t << ".png\" usemap=\"#" << convertToId(name) << "_map\" alt=\"\"/>" << endl;
- t << "<map id=\"" << convertToId(name) << "_map\" name=\"" << convertToId(name) << "_map\">" << endl;
- d.writeImage(t,g_globals.outputDir,
+ d.writeImage(tt,g_globals.outputDir,
relPathAsString(),
m_classDef->getOutputFileBase());
- t << "</div>";
+ if (!result.isEmpty())
+ {
+ t << "<div class=\"center\">" << endl;
+ t << " <img src=\"";
+ t << relPathAsString() << m_classDef->getOutputFileBase();
+ t << ".png\" usemap=\"#" << convertToId(name) << "_map\" alt=\"\"/>" << endl;
+ t << " <map id=\"" << convertToId(name) << "_map\" name=\"" << convertToId(name) << "_map\">" << endl;
+ t << result;
+ t << " </map>" << endl;
+ t << "</div>";
+ }
+ else
+ {
+ t << "<div class=\"center\">" << endl;
+ t << " <img src=\"";
+ t << relPathAsString() << m_classDef->getOutputFileBase();
+ t << ".png\" alt=\"\"/>" << endl;
+ t << "</div>";
+ }
}
break;
case ContextOutputFormat_Latex:
@@ -2670,24 +2702,29 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
if (!init)
{
addBaseProperties(s_inst);
- s_inst.addProperty("title", &Private::title);
- s_inst.addProperty("highlight", &Private::highlight);
- s_inst.addProperty("subhighlight", &Private::subHighlight);
- s_inst.addProperty("compoundType", &Private::compoundType);
- s_inst.addProperty("hasDetails", &Private::hasDetails);
- s_inst.addProperty("classes", &Private::classes);
- s_inst.addProperty("namespaces", &Private::namespaces);
- s_inst.addProperty("constantgroups", &Private::constantgroups);
- s_inst.addProperty("typedefs", &Private::typedefs);
- s_inst.addProperty("enums", &Private::enums);
- s_inst.addProperty("functions", &Private::functions);
- s_inst.addProperty("variables", &Private::variables);
- s_inst.addProperty("memberGroups", &Private::memberGroups);
- s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
- s_inst.addProperty("detailedEnums", &Private::detailedEnums);
- s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
- s_inst.addProperty("detailedVariables", &Private::detailedVariables);
- s_inst.addProperty("inlineClasses", &Private::inlineClasses);
+ s_inst.addProperty("title", &Private::title);
+ s_inst.addProperty("highlight", &Private::highlight);
+ s_inst.addProperty("subhighlight", &Private::subHighlight);
+ s_inst.addProperty("compoundType", &Private::compoundType);
+ s_inst.addProperty("hasDetails", &Private::hasDetails);
+ s_inst.addProperty("classes", &Private::classes);
+ //s_inst.addProperty("interfaces", &Private::interfaces);
+ s_inst.addProperty("namespaces", &Private::namespaces);
+ s_inst.addProperty("constantgroups", &Private::constantgroups);
+ s_inst.addProperty("typedefs", &Private::typedefs);
+ s_inst.addProperty("sequences", &Private::sequences);
+ s_inst.addProperty("dictionaries", &Private::dictionaries);
+ s_inst.addProperty("enums", &Private::enums);
+ s_inst.addProperty("functions", &Private::functions);
+ s_inst.addProperty("variables", &Private::variables);
+ s_inst.addProperty("memberGroups", &Private::memberGroups);
+ s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
+ s_inst.addProperty("detailedSequences", &Private::detailedSequences);
+ s_inst.addProperty("detailedDictionaries", &Private::detailedDictionaries);
+ s_inst.addProperty("detailedEnums", &Private::detailedEnums);
+ s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
+ s_inst.addProperty("detailedVariables", &Private::detailedVariables);
+ s_inst.addProperty("inlineClasses", &Private::inlineClasses);
init=TRUE;
}
if (!nd->cookie()) { nd->setCookie(new NamespaceContext::Private::Cachable(nd)); }
@@ -2722,6 +2759,7 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
Cachable &cache = getCache();
if (!cache.classes)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
TemplateList *classList = TemplateList::alloc();
if (m_namespaceDef->getClassSDict())
{
@@ -2729,6 +2767,12 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
ClassDef *cd;
for (sdi.toFirst();(cd=sdi.current());++sdi)
{
+ if (sliceOpt && (cd->compoundType()==ClassDef::Struct ||
+ cd->compoundType()==ClassDef::Interface ||
+ cd->compoundType()==ClassDef::Exception))
+ {
+ continue; // These types appear in their own sections.
+ }
if (cd->visibleInParentsDeclList())
{
classList->append(ClassContext::alloc(cd));
@@ -2807,6 +2851,14 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
{
return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
}
+ TemplateVariant sequences() const
+ {
+ return getMemberList(getCache().sequences,MemberListType_decSequenceMembers,theTranslator->trSequences());
+ }
+ TemplateVariant dictionaries() const
+ {
+ return getMemberList(getCache().dictionaries,MemberListType_decDictionaryMembers,theTranslator->trDictionaries());
+ }
TemplateVariant enums() const
{
return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
@@ -2821,7 +2873,9 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
}
TemplateVariant variables() const
{
- return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+ return getMemberList(getCache().variables,MemberListType_decVarMembers,
+ sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables());
}
TemplateVariant memberGroups() const
{
@@ -2843,6 +2897,14 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
{
return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
}
+ TemplateVariant detailedSequences() const
+ {
+ return getMemberList(getCache().detailedSequences,MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation());
+ }
+ TemplateVariant detailedDictionaries() const
+ {
+ return getMemberList(getCache().detailedDictionaries,MemberListType_docDictionaryMembers,theTranslator->trDictionaryDocumentation());
+ }
TemplateVariant detailedEnums() const
{
return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
@@ -2856,7 +2918,10 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
}
TemplateVariant detailedVariables() const
{
- return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+ return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,
+ sliceOpt ? theTranslator->trConstantDocumentation() :
+ theTranslator->trVariableDocumentation());
}
TemplateVariant inlineClasses() const
{
@@ -2889,14 +2954,19 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
{
Cachable(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>::Cachable(nd) {}
SharedPtr<TemplateList> classes;
+ SharedPtr<TemplateList> interfaces;
SharedPtr<TemplateList> namespaces;
SharedPtr<TemplateList> constantgroups;
SharedPtr<MemberListInfoContext> typedefs;
+ SharedPtr<MemberListInfoContext> sequences;
+ SharedPtr<MemberListInfoContext> dictionaries;
SharedPtr<MemberListInfoContext> enums;
SharedPtr<MemberListInfoContext> functions;
SharedPtr<MemberListInfoContext> variables;
SharedPtr<MemberGroupListContext> memberGroups;
SharedPtr<MemberListInfoContext> detailedTypedefs;
+ SharedPtr<MemberListInfoContext> detailedSequences;
+ SharedPtr<MemberListInfoContext> detailedDictionaries;
SharedPtr<MemberListInfoContext> detailedEnums;
SharedPtr<MemberListInfoContext> detailedFunctions;
SharedPtr<MemberListInfoContext> detailedVariables;
@@ -2961,12 +3031,16 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
s_inst.addProperty("constantgroups", &Private::constantgroups);
s_inst.addProperty("macros", &Private::macros);
s_inst.addProperty("typedefs", &Private::typedefs);
+ s_inst.addProperty("sequences", &Private::sequences);
+ s_inst.addProperty("dictionaries", &Private::dictionaries);
s_inst.addProperty("enums", &Private::enums);
s_inst.addProperty("functions", &Private::functions);
s_inst.addProperty("variables", &Private::variables);
s_inst.addProperty("memberGroups", &Private::memberGroups);
s_inst.addProperty("detailedMacros", &Private::detailedMacros);
s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
+ s_inst.addProperty("detailedSequences", &Private::detailedSequences);
+ s_inst.addProperty("detailedDictionaries", &Private::detailedDictionaries);
s_inst.addProperty("detailedEnums", &Private::detailedEnums);
s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
s_inst.addProperty("detailedVariables", &Private::detailedVariables);
@@ -3240,6 +3314,14 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
{
return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
}
+ TemplateVariant sequences() const
+ {
+ return getMemberList(getCache().sequences,MemberListType_decSequenceMembers,theTranslator->trSequences());
+ }
+ TemplateVariant dictionaries() const
+ {
+ return getMemberList(getCache().dictionaries,MemberListType_decDictionaryMembers,theTranslator->trDictionaries());
+ }
TemplateVariant enums() const
{
return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
@@ -3254,7 +3336,9 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
}
TemplateVariant variables() const
{
- return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+ return getMemberList(getCache().variables,MemberListType_decVarMembers,
+ sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables());
}
TemplateVariant memberGroups() const
{
@@ -3280,6 +3364,14 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
{
return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
}
+ TemplateVariant detailedSequences() const
+ {
+ return getMemberList(getCache().detailedSequences,MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation());
+ }
+ TemplateVariant detailedDictionaries() const
+ {
+ return getMemberList(getCache().detailedDictionaries,MemberListType_docDictionaryMembers,theTranslator->trDictionaryDocumentation());
+ }
TemplateVariant detailedEnums() const
{
return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
@@ -3339,12 +3431,16 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
SharedPtr<TemplateList> constantgroups;
SharedPtr<MemberListInfoContext> macros;
SharedPtr<MemberListInfoContext> typedefs;
+ SharedPtr<MemberListInfoContext> sequences;
+ SharedPtr<MemberListInfoContext> dictionaries;
SharedPtr<MemberListInfoContext> enums;
SharedPtr<MemberListInfoContext> functions;
SharedPtr<MemberListInfoContext> variables;
SharedPtr<MemberGroupListContext> memberGroups;
SharedPtr<MemberListInfoContext> detailedMacros;
SharedPtr<MemberListInfoContext> detailedTypedefs;
+ SharedPtr<MemberListInfoContext> detailedSequences;
+ SharedPtr<MemberListInfoContext> detailedDictionaries;
SharedPtr<MemberListInfoContext> detailedEnums;
SharedPtr<MemberListInfoContext> detailedFunctions;
SharedPtr<MemberListInfoContext> detailedVariables;
@@ -3994,6 +4090,10 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
s_inst.addProperty("callGraph", &Private::callGraph);
s_inst.addProperty("hasCallerGraph", &Private::hasCallerGraph);
s_inst.addProperty("callerGraph", &Private::callerGraph);
+ s_inst.addProperty("hasReferencedByRelation", &Private::hasReferencedByRelation);
+ s_inst.addProperty("referencedByRelation", &Private::referencedByRelation);
+ s_inst.addProperty("hasReferencesRelation", &Private::hasReferencesRelation);
+ s_inst.addProperty("referencesRelation", &Private::referencesRelation);
s_inst.addProperty("fieldType", &Private::fieldType);
s_inst.addProperty("type", &Private::type);
s_inst.addProperty("detailsVisibleFor", &Private::detailsVisibleFor);
@@ -4918,6 +5018,10 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
}
return TemplateVariant(FALSE);
}
+ TemplateVariant hasReferencedByRelation() const
+ {
+ return TemplateVariant(m_memberDef->hasReferencedByRelation());
+ }
TemplateVariant callGraph() const
{
if (hasCallGraph().toBool())
@@ -4958,6 +5062,14 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
return TemplateVariant("");
}
}
+ TemplateVariant referencedByRelation() const
+ {
+ if (hasReferencedByRelation().toBool())
+ {
+ err("context.cpp: output format not yet supported");
+ }
+ return TemplateVariant("");
+ }
DotCallGraph *getCallerGraph() const
{
Cachable &cache = getCache();
@@ -4978,6 +5090,10 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
}
return TemplateVariant(FALSE);
}
+ TemplateVariant hasReferencesRelation() const
+ {
+ return TemplateVariant(m_memberDef->hasReferencesRelation());
+ }
TemplateVariant callerGraph() const
{
if (hasCallerGraph().toBool())
@@ -5018,6 +5134,14 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
return TemplateVariant("");
}
}
+ TemplateVariant referencesRelation() const
+ {
+ if (hasReferencesRelation().toBool())
+ {
+ err("context.cpp: output format not yet supported");
+ }
+ return TemplateVariant("");
+ }
TemplateVariant type() const
{
return m_memberDef->typeString();
@@ -5494,7 +5618,9 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
}
TemplateVariant variables() const
{
- return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+ return getMemberList(getCache().variables,MemberListType_decVarMembers,
+ sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables());
}
TemplateVariant signals() const
{
@@ -6428,7 +6554,7 @@ class NestingContext::Private : public GenericNodeListContext
if (nd->localName().find('@')==-1 &&
(!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
{
- bool hasChildren = namespaceHasVisibleChild(nd,addClasses);
+ bool hasChildren = namespaceHasVisibleChild(nd,addClasses,false,ClassDef::Class);
bool isLinkable = nd->isLinkableInProject();
if (isLinkable || hasChildren)
{
@@ -6943,11 +7069,12 @@ class NamespaceTreeContext::Private
static bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
if (javaOpt || vhdlOpt)
{
return theTranslator->trPackages();
}
- else if (fortranOpt)
+ else if (fortranOpt || sliceOpt)
{
return theTranslator->trModulesList();
}
@@ -6978,7 +7105,8 @@ class NamespaceTreeContext::Private
SharedPtr<NestingContext> m_namespaceTree;
struct Cachable
{
- Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+ Cachable() : maxDepth(0), maxDepthComputed(FALSE),
+ preferredDepth(0), preferredDepthComputed(FALSE) {}
int maxDepth;
bool maxDepthComputed;
int preferredDepth;
@@ -7352,7 +7480,8 @@ class PageTreeContext::Private
SharedPtr<NestingContext> m_pageTree;
struct Cachable
{
- Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+ Cachable() : maxDepth(0), maxDepthComputed(FALSE),
+ preferredDepth(0), preferredDepthComputed(FALSE) {}
int maxDepth;
bool maxDepthComputed;
int preferredDepth;
@@ -7604,7 +7733,8 @@ class ModuleTreeContext::Private
SharedPtr<NestingContext> m_moduleTree;
struct Cachable
{
- Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+ Cachable() : maxDepth(0), maxDepthComputed(FALSE),
+ preferredDepth(0), preferredDepthComputed(FALSE) {}
int maxDepth;
bool maxDepthComputed;
int preferredDepth;
@@ -7807,7 +7937,8 @@ class ExampleTreeContext::Private
SharedPtr<NestingContext> m_exampleTree;
struct Cachable
{
- Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+ Cachable() : maxDepth(0), maxDepthComputed(FALSE),
+ preferredDepth(0), preferredDepthComputed(FALSE) {}
int maxDepth;
bool maxDepthComputed;
int preferredDepth;
diff --git a/src/defargs.l b/src/defargs.l
index 7f1e1bb..52052fa 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -52,6 +52,7 @@
#include <assert.h>
#include <ctype.h>
#include <qregexp.h>
+#include <qcstringlist.h>
#include "defargs.h"
#include "entry.h"
@@ -102,6 +103,19 @@ static int yyread(char *buf,int max_size)
return c;
}
+/* bug_520975 */
+static bool checkSpecialType(QCString &typ, QCString &nam)
+{
+ if (nam == "unsigned" || nam == "signed" ||
+ nam == "volatile" || nam == "const") return TRUE;
+ QCStringList qsl=QCStringList::split(' ',typ);
+ for (uint j=0;j<qsl.count();j++)
+ {
+ if (!(qsl[j] == "unsigned" || qsl[j] == "signed" ||
+ qsl[j] == "volatile" || qsl[j] == "const")) return FALSE;
+ }
+ return TRUE;
+}
%}
B [ \t]
@@ -384,8 +398,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
a->type.mid(sv)=="union" ||
a->type.mid(sv)=="class" ||
a->type.mid(sv)=="typename" ||
- a->type=="const" ||
- a->type=="volatile"
+ checkSpecialType(a->type, a->name)
)
{
a->type = a->type + " " + a->name;
diff --git a/src/defgen.cpp b/src/defgen.cpp
index cd69ab2..a8f89c5 100644
--- a/src/defgen.cpp
+++ b/src/defgen.cpp
@@ -89,20 +89,22 @@ void generateDEFForMember(MemberDef *md,
bool isFunc=FALSE;
switch (md->memberType())
{
- case MemberType_Define: memType="define"; break;
- case MemberType_EnumValue: ASSERT(0); break;
- case MemberType_Property: memType="property"; break;
- case MemberType_Event: memType="event"; break;
- case MemberType_Variable: memType="variable"; break;
- case MemberType_Typedef: memType="typedef"; break;
- case MemberType_Enumeration: memType="enum"; break;
- case MemberType_Interface: memType="interface"; break;
- case MemberType_Service: memType="service"; break;
- case MemberType_Function: memType="function"; isFunc=TRUE; break;
- case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
- case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
- case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
- case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
+ case MemberType_Define: memType="define"; break;
+ case MemberType_EnumValue: ASSERT(0); break;
+ case MemberType_Property: memType="property"; break;
+ case MemberType_Event: memType="event"; break;
+ case MemberType_Variable: memType="variable"; break;
+ case MemberType_Typedef: memType="typedef"; break;
+ case MemberType_Enumeration: memType="enum"; break;
+ case MemberType_Interface: memType="interface"; break;
+ case MemberType_Service: memType="service"; break;
+ case MemberType_Sequence: memType="sequence"; break;
+ case MemberType_Dictionary: memType="dictionary"; break;
+ case MemberType_Function: memType="function"; isFunc=TRUE; break;
+ case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
+ case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
+ case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
+ case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
}
t << memPrefix << "kind = '" << memType << "';" << endl;
@@ -146,7 +148,7 @@ void generateDEFForMember(MemberDef *md,
stringToArgumentList(md->argsString(),declAl);
QCString fcnPrefix = " " + memPrefix + "param-";
- if (declAl->count()>0)
+ if (defAl && declAl->count()>0)
{
ArgumentListIterator declAli(*declAl);
ArgumentListIterator defAli(*defAl);
@@ -511,6 +513,8 @@ void generateDEFForNamespace(NamespaceDef *nd,FTextStream &t)
generateDEFSection(nd,t,nd->getMemberList(MemberListType_decDefineMembers),"define");
generateDEFSection(nd,t,nd->getMemberList(MemberListType_decProtoMembers),"prototype");
generateDEFSection(nd,t,nd->getMemberList(MemberListType_decTypedefMembers),"typedef");
+ generateDEFSection(nd,t,nd->getMemberList(MemberListType_decSequenceMembers),"sequence");
+ generateDEFSection(nd,t,nd->getMemberList(MemberListType_decDictionaryMembers),"dictionary");
generateDEFSection(nd,t,nd->getMemberList(MemberListType_decEnumMembers),"enum");
generateDEFSection(nd,t,nd->getMemberList(MemberListType_decFuncMembers),"func");
generateDEFSection(nd,t,nd->getMemberList(MemberListType_decVarMembers),"var");
@@ -538,6 +542,8 @@ void generateDEFForFile(FileDef *fd,FTextStream &t)
generateDEFSection(fd,t,fd->getMemberList(MemberListType_decDefineMembers),"define");
generateDEFSection(fd,t,fd->getMemberList(MemberListType_decProtoMembers),"prototype");
generateDEFSection(fd,t,fd->getMemberList(MemberListType_decTypedefMembers),"typedef");
+ generateDEFSection(fd,t,fd->getMemberList(MemberListType_decSequenceMembers),"sequence");
+ generateDEFSection(fd,t,fd->getMemberList(MemberListType_decDictionaryMembers),"dictionary");
generateDEFSection(fd,t,fd->getMemberList(MemberListType_decEnumMembers),"enum");
generateDEFSection(fd,t,fd->getMemberList(MemberListType_decFuncMembers),"func");
generateDEFSection(fd,t,fd->getMemberList(MemberListType_decVarMembers),"var");
diff --git a/src/definition.cpp b/src/definition.cpp
index cbfad94..0a1c7c7 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -42,6 +42,7 @@
#include "filedef.h"
#include "dirdef.h"
#include "pagedef.h"
+#include "bufstr.h"
#define START_MARKER 0x4445465B // DEF[
#define END_MARKER 0x4445465D // DEF]
@@ -304,6 +305,7 @@ Definition::Definition(const Definition &d) : DefinitionIntf(), m_cookie(0)
{
m_name = d.m_name;
m_defLine = d.m_defLine;
+ m_defColumn = d.m_defColumn;
m_impl = new DefinitionImpl;
*m_impl = *d.m_impl;
m_impl->sectionDict = 0;
@@ -715,6 +717,139 @@ void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int
_setInbodyDocumentation(d,inbodyFile,inbodyLine);
}
+//---------------------------------------
+
+struct FilterCacheItem
+{
+ portable_off_t filePos;
+ uint fileSize;
+};
+
+/*! Cache for storing the result of filtering a file */
+class FilterCache
+{
+ public:
+ FilterCache() : m_endPos(0) { m_cache.setAutoDelete(TRUE); }
+ bool getFileContents(const QCString &fileName,BufStr &str)
+ {
+ static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
+ QCString filter = getFileFilter(fileName,TRUE);
+ bool usePipe = !filter.isEmpty() && filterSourceFiles;
+ FILE *f=0;
+ const int blockSize = 4096;
+ char buf[blockSize];
+ FilterCacheItem *item=0;
+ if (usePipe && (item = m_cache.find(fileName))) // cache hit: reuse stored result
+ {
+ //printf("getFileContents(%s): cache hit\n",qPrint(fileName));
+ // file already processed, get the results after filtering from the tmp file
+ Debug::print(Debug::FilterOutput,0,"Reusing filter result for %s from %s at offset=%d size=%d\n",
+ qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item->filePos,(int)item->fileSize);
+ f = portable_fopen(Doxygen::filterDBFileName,"rb");
+ if (f)
+ {
+ bool success=TRUE;
+ str.resize(item->fileSize+1);
+ if (portable_fseek(f,item->filePos,SEEK_SET)==-1)
+ {
+ err("Failed to seek to position %d in filter database file %s\n",(int)item->filePos,qPrint(Doxygen::filterDBFileName));
+ success=FALSE;
+ }
+ if (success)
+ {
+ int numBytes = fread(str.data(),1,item->fileSize,f);
+ if (numBytes!=item->fileSize)
+ {
+ err("Failed to read %d bytes from position %d in filter database file %s: got %d bytes\n",
+ (int)item->fileSize,(int)item->filePos,qPrint(Doxygen::filterDBFileName),numBytes);
+ success=FALSE;
+ }
+ }
+ str.addChar('\0');
+ fclose(f);
+ return success;
+ }
+ else
+ {
+ err("Failed to open filter database file %s\n",qPrint(Doxygen::filterDBFileName));
+ return FALSE;
+ }
+ }
+ else if (usePipe) // cache miss: filter active but file not previously processed
+ {
+ //printf("getFileContents(%s): cache miss\n",qPrint(fileName));
+ // filter file
+ QCString cmd=filter+" \""+fileName+"\"";
+ Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd));
+ f = portable_popen(cmd,"r");
+ FILE *bf = portable_fopen(Doxygen::filterDBFileName,"a+b");
+ FilterCacheItem *item = new FilterCacheItem;
+ item->filePos = m_endPos;
+ if (bf==0)
+ {
+ // handle error
+ err("Error opening filter database file %s\n",qPrint(Doxygen::filterDBFileName));
+ str.addChar('\0');
+ delete item;
+ portable_pclose(f);
+ return FALSE;
+ }
+ // append the filtered output to the database file
+ int size=0;
+ while (!feof(f))
+ {
+ int bytesRead = fread(buf,1,blockSize,f);
+ int bytesWritten = fwrite(buf,1,bytesRead,bf);
+ if (bytesRead!=bytesWritten)
+ {
+ // handle error
+ err("Failed to write to filter database %s. Wrote %d out of %d bytes\n",
+ qPrint(Doxygen::filterDBFileName),bytesWritten,bytesRead);
+ str.addChar('\0');
+ delete item;
+ portable_pclose(f);
+ fclose(bf);
+ return FALSE;
+ }
+ size+=bytesWritten;
+ str.addArray(buf,bytesWritten);
+ }
+ str.addChar('\0');
+ item->fileSize = size;
+ // add location entry to the dictionary
+ m_cache.append(fileName,item);
+ Debug::print(Debug::FilterOutput,0,"Storing new filter result for %s in %s at offset=%d size=%d\n",
+ qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item->filePos,(int)item->fileSize);
+ // update end of file position
+ m_endPos += size;
+ portable_pclose(f);
+ fclose(bf);
+ }
+ else // no filtering
+ {
+ // normal file
+ //printf("getFileContents(%s): no filter\n",qPrint(fileName));
+ f = portable_fopen(fileName,"r");
+ while (!feof(f))
+ {
+ int bytesRead = fread(buf,1,blockSize,f);
+ str.addArray(buf,bytesRead);
+ }
+ str.addChar('\0');
+ fclose(f);
+ }
+ return TRUE;
+ }
+ private:
+ SDict<FilterCacheItem> m_cache;
+ portable_off_t m_endPos;
+};
+
+static FilterCache g_filterCache;
+
+//-----------------------------------------
+
+
/*! Reads a fragment of code from file \a fileName starting at
* line \a startLine and ending at line \a endLine (inclusive). The fragment is
* stored in \a result. If FALSE is returned the code fragment could not be
@@ -729,67 +864,60 @@ void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int
bool readCodeFragment(const char *fileName,
int &startLine,int &endLine,QCString &result)
{
+ //printf("readCodeFragment(%s,startLine=%d,endLine=%d)\n",fileName,startLine,endLine);
static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
- static int tabSize = Config_getInt(TAB_SIZE);
- //printf("readCodeFragment(%s,%d,%d)\n",fileName,startLine,endLine);
- if (fileName==0 || fileName[0]==0) return FALSE; // not a valid file name
QCString filter = getFileFilter(fileName,TRUE);
- FILE *f=0;
bool usePipe = !filter.isEmpty() && filterSourceFiles;
+ int tabSize = Config_getInt(TAB_SIZE);
SrcLangExt lang = getLanguageFromFileName(fileName);
- if (!usePipe) // no filter given or wanted
- {
- f = portable_fopen(fileName,"r");
- }
- else // use filter
- {
- QCString cmd=filter+" \""+fileName+"\"";
- Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd));
- f = portable_popen(cmd,"r");
- }
- bool found = lang==SrcLangExt_VHDL ||
- lang==SrcLangExt_Tcl ||
- lang==SrcLangExt_Python ||
- lang==SrcLangExt_Fortran;
+ const int blockSize = 4096;
+ BufStr str(blockSize);
+ g_filterCache.getFileContents(fileName,str);
+
+ bool found = lang==SrcLangExt_VHDL ||
+ lang==SrcLangExt_Tcl ||
+ lang==SrcLangExt_Python ||
+ lang==SrcLangExt_Fortran;
// for VHDL, TCL, Python, and Fortran no bracket search is possible
- if (f)
+ char *p=str.data();
+ if (p)
{
int c=0;
int col=0;
int lineNr=1;
// skip until the startLine has reached
- while (lineNr<startLine && !feof(f))
+ while (lineNr<startLine && *p)
{
- while ((c=fgetc(f))!='\n' && c!=EOF) /* skip */;
- lineNr++;
+ while ((c=*p++)!='\n' && c!=0) /* skip */;
+ lineNr++;
if (found && c == '\n') c = '\0';
}
- if (!feof(f))
+ if (*p)
{
// skip until the opening bracket or lonely : is found
char cn=0;
- while (lineNr<=endLine && !feof(f) && !found)
+ while (lineNr<=endLine && *p && !found)
{
int pc=0;
- while ((c=fgetc(f))!='{' && c!=':' && c!=EOF) // } so vi matching brackets has no problem
+ while ((c=*p++)!='{' && c!=':' && c!=0)
{
//printf("parsing char `%c'\n",c);
- if (c=='\n')
+ if (c=='\n')
{
- lineNr++,col=0;
+ lineNr++,col=0;
}
- else if (c=='\t')
+ else if (c=='\t')
{
col+=tabSize - (col%tabSize);
}
else if (pc=='/' && c=='/') // skip single line comment
{
- while ((c=fgetc(f))!='\n' && c!=EOF) pc=c;
+ while ((c=*p++)!='\n' && c!=0) pc=c;
if (c=='\n') lineNr++,col=0;
}
else if (pc=='/' && c=='*') // skip C style comment
{
- while (((c=fgetc(f))!='/' || pc!='*') && c!=EOF)
+ while (((c=*p++)!='/' || pc!='*') && c!=0)
{
if (c=='\n') lineNr++,col=0;
pc=c;
@@ -803,16 +931,16 @@ bool readCodeFragment(const char *fileName,
}
if (c==':')
{
- cn=fgetc(f);
+ cn=*p++;
if (cn!=':') found=TRUE;
}
- else if (c=='{') // } so vi matching brackets has no problem
+ else if (c=='{')
{
found=TRUE;
}
}
//printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr);
- if (found)
+ if (found)
{
// For code with more than one line,
// fill the line with spaces until we are at the right column
@@ -826,57 +954,47 @@ bool readCodeFragment(const char *fileName,
// copy until end of line
if (c) result+=c;
startLine=lineNr;
- if (c==':')
+ if (c==':')
{
result+=cn;
if (cn=='\n') lineNr++;
}
- const int maxLineLength=4096;
- char lineStr[maxLineLength];
- do
+ char lineStr[blockSize];
+ do
{
//printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine);
int size_read;
- do
+ do
{
// read up to maxLineLength-1 bytes, the last byte being zero
- char *p = fgets(lineStr, maxLineLength,f);
- //printf(" read %s",p);
- if (p)
+ int i=0;
+ while ((c=*p++) && i<blockSize-1)
{
- size_read=qstrlen(p);
+ lineStr[i++]=c;
+ if (c=='\n') break; // stop at end of the line
}
- else // nothing read
- {
- size_read=-1;
- lineStr[0]='\0';
- }
- result+=lineStr;
- } while (size_read == (maxLineLength-1));
-
- lineNr++;
- } while (lineNr<=endLine && !feof(f));
+ lineStr[i]=0;
+ size_read=i;
+ result+=lineStr; // append line to the output
+ } while (size_read == (blockSize-1)); // append more if line does not fit in buffer
+ lineNr++;
+ } while (lineNr<=endLine && *p);
// strip stuff after closing bracket
int newLineIndex = result.findRev('\n');
int braceIndex = result.findRev('}');
- if (braceIndex > newLineIndex)
+ if (braceIndex > newLineIndex)
{
result.truncate(braceIndex+1);
}
endLine=lineNr-1;
}
}
- if (usePipe)
+ if (usePipe)
{
- portable_pclose(f);
Debug::print(Debug::FilterOutput, 0, "Filter output\n");
Debug::print(Debug::FilterOutput,0,"-------------\n%s\n-------------\n",qPrint(result));
}
- else
- {
- fclose(f);
- }
}
result = transcodeCharacterStringToUTF8(result);
if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n";
@@ -921,6 +1039,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
+ static bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
ol.pushGeneratorState();
//printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef);
QCString fn = getSourceFileBase();
@@ -945,11 +1064,15 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
ol.disable(OutputGenerator::Latex);
}
+ if (!docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (!rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
}
- // write line link (HTML, LaTeX optionally, RTF optionally)
+ // write line link (HTML and optionally LaTeX, Docbook, RTF)
ol.writeObjectLink(0,fn,anchorStr,lineStr);
ol.enableAll();
ol.disable(OutputGenerator::Html);
@@ -957,6 +1080,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
ol.disable(OutputGenerator::Latex);
}
+ if (docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -975,6 +1102,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
ol.disable(OutputGenerator::Latex);
}
+ if (!docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (!rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -987,6 +1118,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
ol.disable(OutputGenerator::Latex);
}
+ if (docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -1009,6 +1144,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
ol.disable(OutputGenerator::Latex);
}
+ if (!docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (!rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -1021,6 +1160,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
ol.disable(OutputGenerator::Latex);
}
+ if (docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -1040,6 +1183,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
ol.enable(OutputGenerator::Latex);
}
+ if (docbookSourceCode)
+ {
+ ol.enable(OutputGenerator::Docbook);
+ }
if (rtfSourceCode)
{
ol.enable(OutputGenerator::RTF);
@@ -1052,6 +1199,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
ol.disable(OutputGenerator::Latex);
}
+ if (docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -1145,6 +1296,7 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
const QCString &text,MemberSDict *members,bool /*funcOnly*/)
{
static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
+ static bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
static bool refLinkSource = Config_getBool(REFERENCES_LINK_SOURCE);
@@ -1203,6 +1355,10 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
{
ol.disable(OutputGenerator::Latex);
}
+ if (!docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (!rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -1221,6 +1377,10 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
{
ol.disable(OutputGenerator::Latex);
}
+ if (docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -1238,6 +1398,10 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
{
ol.disable(OutputGenerator::Latex);
}
+ if (!docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (!rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -1255,6 +1419,10 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
{
ol.disable(OutputGenerator::Latex);
}
+ if (docbookSourceCode)
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (rtfSourceCode)
{
ol.disable(OutputGenerator::RTF);
@@ -1278,18 +1446,12 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
{
- if (Config_getBool(REFERENCED_BY_RELATION))
- {
- _writeSourceRefList(ol,scopeName,theTranslator->trReferencedBy(),m_impl->sourceRefByDict,FALSE);
- }
+ _writeSourceRefList(ol,scopeName,theTranslator->trReferencedBy(),m_impl->sourceRefByDict,FALSE);
}
void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
{
- if (Config_getBool(REFERENCES_RELATION))
- {
- _writeSourceRefList(ol,scopeName,theTranslator->trReferences(),m_impl->sourceRefsDict,TRUE);
- }
+ _writeSourceRefList(ol,scopeName,theTranslator->trReferences(),m_impl->sourceRefsDict,TRUE);
}
bool Definition::hasDocumentation() const
@@ -1476,13 +1638,21 @@ void Definition::mergeRefItems(Definition *d)
m_impl->xrefListItems->setAutoDelete(TRUE);
}
QListIterator<ListItemInfo> slii(*xrefList);
+ QListIterator<ListItemInfo> mlii(*m_impl->xrefListItems);
ListItemInfo *lii;
+ ListItemInfo *mii;
for (slii.toFirst();(lii=slii.current());++slii)
{
- if (_getXRefListId(lii->type)==-1)
+ bool found = false;
+ for (mlii.toFirst();(mii=mlii.current());++mlii)
{
- m_impl->xrefListItems->append(new ListItemInfo(*lii));
+ if ((qstrcmp(lii->type,mii->type)==0) && (lii->itemId == mii->itemId))
+ {
+ found = true;
+ break;
+ }
}
+ if (!found) m_impl->xrefListItems->append(new ListItemInfo(*lii));
}
}
}
@@ -1633,7 +1803,7 @@ void Definition::writeToc(OutputList &ol, const LocalToc &localToc)
int level=1,l;
char cs[2];
cs[1]='\0';
- bool inLi[5]={ FALSE, FALSE, FALSE, FALSE };
+ bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE };
for (li.toFirst();(si=li.current());++li)
{
if (si->type==SectionInfo::Section ||
@@ -1667,6 +1837,7 @@ void Definition::writeToc(OutputList &ol, const LocalToc &localToc)
level = nextLevel;
}
}
+ if (level > maxLevel) level = maxLevel;
while (level>1 && level <= maxLevel)
{
if (inLi[level]) ol.writeString("</li>\n");
@@ -1681,6 +1852,63 @@ void Definition::writeToc(OutputList &ol, const LocalToc &localToc)
ol.popGeneratorState();
}
+ if (localToc.isDocbookEnabled())
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Docbook);
+ ol.writeString(" <toc>\n");
+ ol.writeString(" <title>" + theTranslator->trRTFTableOfContents() + "</title>\n");
+ SectionDict *sectionDict = getSectionDict();
+ SDict<SectionInfo>::Iterator li(*sectionDict);
+ SectionInfo *si;
+ int level=1,l;
+ bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE };
+ int maxLevel = localToc.docbookLevel();
+ for (li.toFirst();(si=li.current());++li)
+ {
+ if (si->type==SectionInfo::Section ||
+ si->type==SectionInfo::Subsection ||
+ si->type==SectionInfo::Subsubsection ||
+ si->type==SectionInfo::Paragraph)
+ {
+ //printf(" level=%d title=%s\n",level,si->title.data());
+ int nextLevel = (int)si->type;
+ if (nextLevel>level)
+ {
+ for (l=level;l<nextLevel;l++)
+ {
+ if (l < maxLevel) ol.writeString(" <tocdiv>\n");
+ }
+ }
+ else if (nextLevel<level)
+ {
+ for (l=level;l>nextLevel;l--)
+ {
+ inLi[l]=FALSE;
+ if (l <= maxLevel) ol.writeString(" </tocdiv>\n");
+ }
+ }
+ if (nextLevel <= maxLevel)
+ {
+ QCString titleDoc = convertToDocBook(si->title);
+ ol.writeString(" <tocentry>" + (si->title.isEmpty()?si->label:titleDoc) + "</tocentry>\n");
+ }
+ inLi[nextLevel]=TRUE;
+ level = nextLevel;
+ }
+ }
+ if (level > maxLevel) level = maxLevel;
+ while (level>1 && level <= maxLevel)
+ {
+ inLi[level]=FALSE;
+ ol.writeString("</tocdiv>\n");
+ level--;
+ }
+ inLi[level]=FALSE;
+ ol.writeString(" </toc>\n");
+ ol.popGeneratorState();
+ }
+
if (localToc.isLatexEnabled())
{
ol.pushGeneratorState();
diff --git a/src/diagram.cpp b/src/diagram.cpp
index 667aa85..83e42b3 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -1380,7 +1380,5 @@ void ClassDiagram::writeImage(FTextStream &t,const char *path,
#define IMAGE_EXT ".png"
image.save((QCString)path+"/"+fileName+IMAGE_EXT);
Doxygen::indexList->addImageFile(QCString(fileName)+IMAGE_EXT);
-
- if (generateMap) t << "</map>" << endl;
}
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index 6631ed7..7294e4f 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -485,8 +485,14 @@ void DirDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::NamespaceNestedNamespaces:
case LayoutDocEntry::NamespaceNestedConstantGroups:
case LayoutDocEntry::NamespaceClasses:
+ case LayoutDocEntry::NamespaceInterfaces:
+ case LayoutDocEntry::NamespaceStructs:
+ case LayoutDocEntry::NamespaceExceptions:
case LayoutDocEntry::NamespaceInlineClasses:
case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileInterfaces:
+ case LayoutDocEntry::FileStructs:
+ case LayoutDocEntry::FileExceptions:
case LayoutDocEntry::FileNamespaces:
case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp
index 345629e..97c602d 100644
--- a/src/docbookgen.cpp
+++ b/src/docbookgen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
-*
+*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
@@ -21,11 +21,14 @@
#include <qfile.h>
#include <qtextstream.h>
#include <qintdict.h>
+#include <qregexp.h>
#include "docbookgen.h"
#include "doxygen.h"
#include "message.h"
#include "config.h"
#include "classlist.h"
+#include "classdef.h"
+#include "diagram.h"
#include "util.h"
#include "defargs.h"
#include "outputgen.h"
@@ -54,57 +57,22 @@
// debug inside output
//#define Docbook_DB(x) QCString __t;__t.sprintf x;m_t << __t
+#if 0
+#define DB_GEN_C DB_GEN_C1(t)
+#define DB_GEN_C1(x) x << "<!-- DB_GEN_C " << __LINE__ << " -->\n";
+#define DB_GEN_C2(y) DB_GEN_C2a(t,y)
+#define DB_GEN_C2a(x,y) x << "<!-- DB_GEN_C " << __LINE__ << " " << y << " -->\n";
+#else
+#define DB_GEN_C
+#define DB_GEN_C1(x)
+#define DB_GEN_C2(y)
+#define DB_GEN_C2a(x,y)
+#endif
//------------------
-class DocbookSectionMapper : public QIntDict<char>
-{
- public:
- DocbookSectionMapper() : QIntDict<char>(47)
- {
- insert(MemberListType_pubTypes,"public-type");
- insert(MemberListType_pubMethods,"public-func");
- insert(MemberListType_pubAttribs,"public-attrib");
- insert(MemberListType_pubSlots,"public-slot");
- insert(MemberListType_signals,"signal");
- insert(MemberListType_dcopMethods,"dcop-func");
- insert(MemberListType_properties,"property");
- insert(MemberListType_events,"event");
- insert(MemberListType_pubStaticMethods,"public-static-func");
- insert(MemberListType_pubStaticAttribs,"public-static-attrib");
- insert(MemberListType_proTypes,"protected-type");
- insert(MemberListType_proMethods,"protected-func");
- insert(MemberListType_proAttribs,"protected-attrib");
- insert(MemberListType_proSlots,"protected-slot");
- insert(MemberListType_proStaticMethods,"protected-static-func");
- insert(MemberListType_proStaticAttribs,"protected-static-attrib");
- insert(MemberListType_pacTypes,"package-type");
- insert(MemberListType_pacMethods,"package-func");
- insert(MemberListType_pacAttribs,"package-attrib");
- insert(MemberListType_pacStaticMethods,"package-static-func");
- insert(MemberListType_pacStaticAttribs,"package-static-attrib");
- insert(MemberListType_priTypes,"private-type");
- insert(MemberListType_priMethods,"private-func");
- insert(MemberListType_priAttribs,"private-attrib");
- insert(MemberListType_priSlots,"private-slot");
- insert(MemberListType_priStaticMethods,"private-static-func");
- insert(MemberListType_priStaticAttribs,"private-static-attrib");
- insert(MemberListType_friends,"friend");
- insert(MemberListType_related,"related");
- insert(MemberListType_decDefineMembers,"define");
- insert(MemberListType_decProtoMembers,"prototype");
- insert(MemberListType_decTypedefMembers,"typedef");
- insert(MemberListType_decEnumMembers,"enum");
- insert(MemberListType_decFuncMembers,"func");
- insert(MemberListType_decVarMembers,"var");
- }
-};
-
-static DocbookSectionMapper g_docbookSectionMapper;
-
-
inline void writeDocbookString(FTextStream &t,const char *s)
{
- t << convertToXML(s);
+ t << convertToDocBook(s);
}
inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col)
@@ -128,27 +96,30 @@ inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col)
case '&': t << "&amp;"; col++; break;
case '\'': t << "&apos;"; col++; break;
case '"': t << "&quot;"; col++; break;
+ case '\007': t << "^G"; col++; break; // bell
+ case '\014': t << "^L"; col++; break; // form feed
default: t << c; col++; break;
}
}
}
-static void writeDocbookHeaderMainpage(FTextStream &t)
+static void addIndexTerm(FTextStream &t, QCString prim, QCString sec = "")
{
- t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
- t << "<chapter xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
-}
-
-static void writeDocbookHeader_ID(FTextStream &t, QCString id)
-{
- t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
- t << "<section xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:id=\"" << id << "\">" << endl;
+ t << "<indexterm><primary>";
+ t << convertToDocBook(prim);
+ t << "</primary>";
+ if (!sec.isEmpty())
+ {
+ t << "<secondary>";
+ t << convertToDocBook(sec);
+ t << "</secondary>";
+ }
+ t << "</indexterm>" << endl;
}
-
void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoundId,
const char *anchorId,const char * text,const char * /*tooltip*/)
{
- t << "<link linkend=\"" << compoundId;
+ t << "<link linkend=\"_" << stripPath(compoundId);
if (anchorId) t << "_1" << anchorId;
t << "\"";
t << ">";
@@ -156,1856 +127,1060 @@ void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoun
t << "</link>";
}
-class TextGeneratorDocbookImpl : public TextGeneratorIntf
+DocbookCodeGenerator::DocbookCodeGenerator(FTextStream &t) : m_lineNumber(-1), m_col(0),
+ m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE)
{
- public:
- TextGeneratorDocbookImpl(FTextStream &t): m_t(t) {}
- void writeString(const char *s,bool /*keepSpaces*/) const
- {
- writeDocbookString(m_t,s);
- }
- void writeBreak(int) const {}
- void writeLink(const char *extRef,const char *file,
- const char *anchor,const char *text
- ) const
- {
- writeDocbookLink(m_t,extRef,file,anchor,text,0);
- }
- private:
- FTextStream &m_t;
-};
+ m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING);
+ setTextStream(t);
+}
-class DocbookCodeGenerator : public CodeOutputInterface
+DocbookCodeGenerator::DocbookCodeGenerator() : m_lineNumber(-1), m_col(0),
+ m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE), m_streamSet(FALSE)
{
- public:
- DocbookCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1), m_col(0),
- m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE) {}
- virtual ~DocbookCodeGenerator() {}
+ m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING);
+}
- void codify(const char *text)
- {
- Docbook_DB(("(codify \"%s\")\n",text));
- writeDocbookCodeString(m_t,text,m_col);
- }
- void writeCodeLink(const char *ref,const char *file,
- const char *anchor,const char *name,
- const char *tooltip)
- {
- Docbook_DB(("(writeCodeLink)\n"));
- writeDocbookLink(m_t,ref,file,anchor,name,tooltip);
- m_col+=strlen(name);
- }
- void writeTooltip(const char *, const DocLinkInfo &, const char *,
- const char *, const SourceLinkInfo &, const SourceLinkInfo &
- )
- {
- Docbook_DB(("(writeToolTip)\n"));
- }
- void startCodeLine(bool)
- {
- Docbook_DB(("(startCodeLine)\n"));
- if (m_lineNumber!=-1)
- {
- if (!m_refId.isEmpty())
- {
- m_t << "<link linkend=\"" << m_refId << "\">";
- }
- m_t << m_lineNumber << " ";
- if (!m_refId.isEmpty())
- {
- m_t << "</link>";
- }
- }
- m_insideCodeLine=TRUE;
- m_col=0;
- }
- void endCodeLine()
- {
- m_t << endl;
- Docbook_DB(("(endCodeLine)\n"));
- m_lineNumber = -1;
- m_refId.resize(0);
- m_external.resize(0);
- m_insideCodeLine=FALSE;
- }
- void startFontClass(const char *colorClass)
- {
- Docbook_DB(("(startFontClass)\n"));
- m_t << "<emphasis class=\"" << colorClass << "\">";
- m_insideSpecialHL=TRUE;
- }
- void endFontClass()
- {
- Docbook_DB(("(endFontClass)\n"));
- m_t << "</emphasis>"; // non DocBook
- m_insideSpecialHL=FALSE;
- }
- void writeCodeAnchor(const char *)
- {
- Docbook_DB(("(writeCodeAnchor)\n"));
- }
- void writeLineNumber(const char *extRef,const char *compId,
- const char *anchorId,int l)
- {
- Docbook_DB(("(writeLineNumber)\n"));
- // we remember the information provided here to use it
- // at the <codeline> start tag.
- m_lineNumber = l;
- if (compId)
- {
- m_refId=compId;
- if (anchorId) m_refId+=(QCString)"_1"+anchorId;
- if (extRef) m_external=extRef;
- }
- }
- void setCurrentDoc(Definition *,const char *,bool)
- {
- }
- void addWord(const char *,bool)
+DocbookCodeGenerator::~DocbookCodeGenerator() {}
+
+void DocbookCodeGenerator::codify(const char *text)
+{
+ Docbook_DB(("(codify \"%s\")\n",text));
+ writeDocbookCodeString(m_t,text,m_col);
+}
+void DocbookCodeGenerator::writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip)
+{
+ Docbook_DB(("(writeCodeLink)\n"));
+ writeDocbookLink(m_t,ref,file,anchor,name,tooltip);
+ m_col+=strlen(name);
+}
+void DocbookCodeGenerator::writeCodeLinkLine(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip)
+{
+ Docbook_DB(("(writeCodeLinkLine)\n"));
+ m_t << "<anchor xml:id=\"_" << stripExtensionGeneral(stripPath(file),".xml");
+ m_t << "_1l";
+ writeDocbookString(m_t,name);
+ m_t << "\"/>";
+ m_col+=strlen(name);
+}
+void DocbookCodeGenerator::writeTooltip(const char *, const DocLinkInfo &, const char *,
+ const char *, const SourceLinkInfo &, const SourceLinkInfo &
+ )
+{
+ Docbook_DB(("(writeToolTip)\n"));
+}
+void DocbookCodeGenerator::startCodeLine(bool)
+{
+ Docbook_DB(("(startCodeLine)\n"));
+ m_insideCodeLine=TRUE;
+ m_col=0;
+}
+void DocbookCodeGenerator::endCodeLine()
+{
+ m_t << endl;
+ Docbook_DB(("(endCodeLine)\n"));
+ m_lineNumber = -1;
+ m_refId.resize(0);
+ m_external.resize(0);
+ m_insideCodeLine=FALSE;
+}
+void DocbookCodeGenerator::startFontClass(const char *colorClass)
+{
+ Docbook_DB(("(startFontClass)\n"));
+ m_t << "<emphasis role=\"" << colorClass << "\">";
+ m_insideSpecialHL=TRUE;
+}
+void DocbookCodeGenerator::endFontClass()
+{
+ Docbook_DB(("(endFontClass)\n"));
+ m_t << "</emphasis>"; // non DocBook
+ m_insideSpecialHL=FALSE;
+}
+void DocbookCodeGenerator::writeCodeAnchor(const char *)
+{
+ Docbook_DB(("(writeCodeAnchor)\n"));
+}
+void DocbookCodeGenerator::writeLineNumber(const char *ref,const char *fileName,
+ const char *anchor,int l)
+{
+ Docbook_DB(("(writeLineNumber)\n"));
+ m_insideCodeLine = TRUE;
+ if (m_prettyCode)
+ {
+ QCString lineNumber;
+ lineNumber.sprintf("%05d",l);
+
+ if (fileName && !m_sourceFileName.isEmpty())
{
+ writeCodeLinkLine(ref,m_sourceFileName,anchor,lineNumber,0);
+ writeCodeLink(ref,fileName,anchor,lineNumber,0);
}
- void finish()
+ else
{
- if (m_insideCodeLine) endCodeLine();
+ codify(lineNumber);
}
-
- private:
- FTextStream &m_t;
- QCString m_refId;
- QCString m_external;
- int m_lineNumber;
- int m_col;
- bool m_insideCodeLine;
- bool m_insideSpecialHL;
-};
-
-
-static void writeTemplateArgumentList(ArgumentList *al,
- FTextStream &t,
- Definition *scope,
- FileDef *fileScope,
- int indent)
-{
- QCString indentStr;
- indentStr.fill(' ',indent);
- if (al)
+ m_t << " ";
+ }
+ else
{
- t << indentStr << "<templateparamlist>" << endl;
- ArgumentListIterator ali(*al);
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- t << indentStr << " <param>" << endl;
- if (!a->type.isEmpty())
- {
- t << indentStr << " <type>";
- linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->type);
- t << "</type>" << endl;
- }
- if (!a->name.isEmpty())
- {
- t << indentStr << " <declname>" << a->name << "</declname>" << endl;
- t << indentStr << " <defname>" << a->name << "</defname>" << endl;
- }
- if (!a->defval.isEmpty())
- {
- t << indentStr << " <defval>";
- linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->defval);
- t << "</defval>" << endl;
- }
- t << indentStr << " </param>" << endl;
- }
- t << indentStr << "</templateparamlist>" << endl;
+ m_t << l << " ";
}
-}
-static void writeTemplateList(ClassDef *cd,FTextStream &t)
+}
+void DocbookCodeGenerator::setCurrentDoc(Definition *,const char *,bool)
{
- writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
}
-
-static void writeDocbookDocBlock(FTextStream &t,
- const QCString &fileName,
- int lineNr,
- Definition *scope,
- MemberDef * md,
- const QCString &text)
-{
- QCString stext = text.stripWhiteSpace();
- if (stext.isEmpty()) return;
- // convert the documentation string into an abstract syntax tree
- DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
- // create a code generator
- DocbookCodeGenerator *docbookCodeGen = new DocbookCodeGenerator(t);
- // create a parse tree visitor for Docbook
- DocbookDocVisitor *visitor = new DocbookDocVisitor(t,*docbookCodeGen);
- // visit all nodes
- root->accept(visitor);
- // clean up
- delete visitor;
- delete docbookCodeGen;
- delete root;
+void DocbookCodeGenerator::addWord(const char *,bool)
+{
}
-
-void writeDocbookCodeBlock(FTextStream &t,FileDef *fd)
-{
- ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
- SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension());
- pIntf->resetCodeParserState();
- DocbookCodeGenerator *docbookGen = new DocbookCodeGenerator(t);
- pIntf->parseCode(*docbookGen, // codeOutIntf
- 0, // scopeName
- fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)),
- langExt, // lang
- FALSE, // isExampleBlock
- 0, // exampleName
- fd, // fileDef
- -1, // startLine
- -1, // endLine
- FALSE, // inlineFragement
- 0, // memberDef
- TRUE // showLineNumbers
- );
- docbookGen->finish();
- delete docbookGen;
+void DocbookCodeGenerator::finish()
+{
+ if (m_insideCodeLine) endCodeLine();
}
-
-static QCString classOutputFileBase(ClassDef *cd)
+void DocbookCodeGenerator::startCodeFragment()
+{
+ m_t << "<literallayout><computeroutput>" << endl;
+}
+void DocbookCodeGenerator::endCodeFragment()
{
- //static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
- //if (inlineGroupedClasses && cd->partOfGroups()!=0)
- return cd->getOutputFileBase();
- //else
- // return cd->getOutputFileBase();
+ m_t << "</computeroutput></literallayout>" << endl;
}
-static QCString memberOutputFileBase(MemberDef *md)
+DocbookGenerator::DocbookGenerator() : OutputGenerator()
{
- //static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
- //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
- // return md->getClassDef()->getDocbookOutputFileBase();
- //else
- // return md->getOutputFileBase();
- return md->getOutputFileBase();
+DB_GEN_C
+ dir=Config_getString(DOCBOOK_OUTPUT);
+ //insideTabbing=FALSE;
+ //firstDescItem=TRUE;
+ //disableLinks=FALSE;
+ //m_indent=0;
+ //templateMemberItem = FALSE;
+ m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING);
+ m_denseText = FALSE;
+ m_inGroup = FALSE;
+ m_inDetail = FALSE;
+ m_levelListItem = 0;
+ m_descTable = FALSE;
+ m_inLevel = -1;
+ m_firstMember = FALSE;
+ for (int i = 0 ; i < sizeof(m_inListItem) / sizeof(*m_inListItem) ; i++) m_inListItem[i] = FALSE;
+ for (int i = 0 ; i < sizeof(m_inSimpleSect) / sizeof(*m_inSimpleSect) ; i++) m_inSimpleSect[i] = FALSE;
}
+DocbookGenerator::~DocbookGenerator()
+{
+DB_GEN_C
+}
-static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *def, bool detailed=0)
+void DocbookGenerator::init()
{
+ QCString dir=Config_getString(DOCBOOK_OUTPUT);
+ QDir d(dir);
+ if (!d.exists() && !d.mkdir(dir))
+ {
+ err("Could not create output directory %s\n",dir.data());
+ exit(1);
+ }
- // + declaration/definition arg lists
- // + reimplements
- // + reimplementedBy
- // + exceptions
- // + const/volatile specifiers
- // - examples
- // + source definition
- // + source references
- // + source referenced by
- // - body code
- // + template arguments
- // (templateArguments(), definitionTemplateParameterLists())
- // - call graph
+ createSubDirs(d);
+}
- // enum values are written as part of the enum
- if (md->memberType()==MemberType_EnumValue) return;
- if (md->isHidden()) return;
- //if (md->name().at(0)=='@') return; // anonymous member
+void DocbookGenerator::startFile(const char *name,const char *,const char *)
+{
+DB_GEN_C
+ QCString fileName=name;
+ QCString pageName;
+ QCString fileType="section";
+ if (fileName == "refman")
+ {
+ fileName="index";
+ fileType="book";
+ }
+ else if (fileName == "index")
+ {
+ fileName="mainpage";
+ fileType="chapter";
+ }
+ pageName = fileName;
+ relPath = relativePathToRoot(fileName);
+ if (fileName.right(4)!=".xml") fileName+=".xml";
+ startPlainFile(fileName);
+ m_codeGen.setTextStream(t);
+ m_codeGen.setRelativePath(relPath);
+ m_codeGen.setSourceFileName(stripPath(fileName));
+
+ t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+ t << "<" << fileType << " xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
+ if (!pageName.isEmpty()) t << " xml:id=\"_" << stripPath(pageName) << "\"";
+ t << ">" << endl;
+}
- // group members are only visible in their group
- //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
- QCString memType;
- switch (md->memberType())
+void DocbookGenerator::endFile()
+{
+DB_GEN_C
+ if (m_inDetail) t << "</section>" << endl;
+ m_inDetail = FALSE;
+ while (m_inLevel != -1)
{
- case MemberType_Define: memType="define"; break;
- case MemberType_Function: memType="function"; break;
- case MemberType_Variable: memType="variable"; break;
- case MemberType_Typedef: memType="typedef"; break;
- case MemberType_Enumeration: memType="enum"; break;
- case MemberType_EnumValue: ASSERT(0); break;
- case MemberType_Signal: memType="signal"; break;
- case MemberType_Slot: memType="slot"; break;
- case MemberType_Friend: memType="friend"; break;
- case MemberType_DCOP: memType="dcop"; break;
- case MemberType_Property: memType="property"; break;
- case MemberType_Event: memType="event"; break;
- case MemberType_Interface: memType="interface"; break;
- case MemberType_Service: memType="service"; break;
+ t << "</section>" << endl;
+ m_inLevel--;
}
- QCString scopeName;
- if (md->getClassDef())
+ if (m_inGroup) t << "</section>" << endl;
+ m_inGroup = FALSE;
+
+ QCString fileType="section";
+ QCString fileName= m_codeGen.sourceFileName();
+ if (fileName == "index.xml")
{
- scopeName=md->getClassDef()->name();
+ fileType="book";
}
- else if (md->getNamespaceDef())
+ else if (fileName == "mainpage.xml")
{
- scopeName=md->getNamespaceDef()->name();
+ fileType="chapter";
}
- if (detailed==0)
+ t << "</" << fileType << ">" << endl;
+ endPlainFile();
+ m_codeGen.setSourceFileName("");
+}
+
+void DocbookGenerator::startIndexSection(IndexSections is)
+{
+DB_GEN_C2("IndexSections " << is)
+ switch (is)
{
- t << " <para>" << endl;
- t << " <itemizedlist>" << endl;
- t << " <listitem>" << endl;
- //enum
- bool closePara=TRUE;
- if (md->memberType()==MemberType_Enumeration)
- {
- MemberList *enumFields = md->enumFieldList();
- t << " <para><literallayout>" << memType << " <link linkend=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ case isTitlePageStart:
{
- t << md->getGroupDef()->getOutputFileBase();
+ QCString dbk_projectName = Config_getString(PROJECT_NAME);
+ t << " <info>" << endl;
+ t << " <title>" << convertToDocBook(dbk_projectName) << "</title>" << endl;
+ t << " </info>" << endl;
}
- else
- {
- t << memberOutputFileBase(md);
- }
- t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
- if (enumFields!=0)
+ break;
+ case isTitlePageAuthor:
+ break;
+ case isMainPage:
+ t << "<chapter>" << endl;
+ t << " <title>";
+ break;
+ case isModuleIndex:
+ //Module Index}\n"
+ break;
+ case isDirIndex:
+ //Directory Index}\n"
+ break;
+ case isNamespaceIndex:
+ //Namespace Index}\n"
+ break;
+ case isClassHierarchyIndex:
+ //Hierarchical Index}\n"
+ break;
+ case isCompoundIndex:
+ //t << "{"; //Class Index}\n"
+ break;
+ case isFileIndex:
+ //Annotated File Index}\n"
+ break;
+ case isPageIndex:
+ //Annotated Page Index}\n"
+ break;
+ case isModuleDocumentation:
+ t << "<chapter>\n";
+ t << " <title>";
+ break;
+ case isDirDocumentation:
+ t << "<chapter>\n";
+ t << " <title>";
+ break;
+ case isNamespaceDocumentation:
+ t << "<chapter>\n";
+ t << " <title>";
+ break;
+ case isClassDocumentation:
+ t << "<chapter>\n";
+ t << " <title>";
+ break;
+ case isFileDocumentation:
+ t << "<chapter>\n";
+ t << " <title>";
+ break;
+ case isExampleDocumentation:
+ t << "<chapter>\n";
+ t << " <title>";
+ break;
+ case isPageDocumentation:
+ break;
+ case isPageDocumentation2:
+ break;
+ case isEndIndex:
+ break;
+ }
+}
+
+void DocbookGenerator::endIndexSection(IndexSections is)
+{
+DB_GEN_C2("IndexSections " << is)
+ static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
+ switch (is)
+ {
+ case isTitlePageStart:
+ break;
+ case isTitlePageAuthor:
+ break;
+ case isMainPage:
+ t << "</title>" << endl;
+ t << " <xi:include href=\"mainpage.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ t << "</chapter>" << endl;
+ break;
+ case isModuleIndex:
+ //t << "</chapter>" << endl;
+ break;
+ case isDirIndex:
+ //t << "<xi:include href=\"dirs.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>";
+ //t << "</chapter>" << endl;
+ break;
+ case isNamespaceIndex:
+ //t << "<xi:include href=\"namespaces.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>";
+ //t << "</chapter>" << endl;
+ break;
+ case isClassHierarchyIndex:
+ //t << "<xi:include href=\"hierarchy.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>";
+ //t << "</chapter>" << endl;
+ break;
+ case isCompoundIndex:
+ //t << "</chapter>" << endl;
+ break;
+ case isFileIndex:
+ //t << "<xi:include href=\"files.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>";
+ //t << "</chapter>" << endl;
+ break;
+ case isPageIndex:
+ //t << "<xi:include href=\"pages.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>";
+ //t << "</chapter>" << endl;
+ break;
+ case isModuleDocumentation:
{
- MemberListIterator emli(*enumFields);
- MemberDef *emd;
- t << " {" << endl;
- int cnt=0;
- for (emli.toFirst();(emd=emli.current());++emli)
+ t << "</title>" << endl;
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ bool found=FALSE;
+ for (gli.toFirst();(gd=gli.current()) && !found;++gli)
{
- if (cnt!=0)
- {
- t << "," << endl;
- }
- t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">";
- writeDocbookString(t,emd->name());
- t << "</link>";
- if (!emd->initializer().isEmpty())
+ if (!gd->isReference())
{
- writeDocbookString(t,emd->initializer());
+ t << " <xi:include href=\"" << gd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ found=TRUE;
}
- cnt++;
- }
- t << endl << "}";
- }
- t << "</literallayout>" << endl;
- if (md->briefDescription())
- {
- t << "<para><emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis></para>" << endl;
- }
- }
- else if (md->memberType()==MemberType_Define)
- {
- t << " <para>" << "#" << memType << " <link linkend=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
- }
- else
- {
- t << memberOutputFileBase(md);
- }
- t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
- if (!md->initializer().isEmpty() && md->initializer().length()<2000)
- {
- t << " ";
- linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->initializer());
- }
- if (md->briefDescription())
- {
- t << "<para><emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis></para>" << endl;
- }
- }
- else if (md->memberType()==MemberType_Variable)
- {
- if (md->getClassDef())
- {
- t << " <para>" << convertToXML(md->declaration());
- if (md->briefDescription())
- {
- t << "<para><emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis></para>";
- }
- }
- else
- {
- t << " <para>";
- linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
- t << " <link linkend=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
}
- else
+ for (;(gd=gli.current());++gli)
{
- t << memberOutputFileBase(md);
- }
- t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
- if (md->briefDescription())
- {
- t << "<para><emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis></para>" << endl;
+ if (!gd->isReference())
+ {
+ t << " <xi:include href=\"" << gd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ }
}
}
- }
- else if (md->memberType()==MemberType_Typedef)
- {
- t << " <para>" << memType;
- t << " ";
- linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
- t << " ";
- t << " <link linkend=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
- }
- else
+ t << "</chapter>\n";
+ break;
+ case isDirDocumentation:
{
- t << memberOutputFileBase(md);
- }
- t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
- if (md->briefDescription())
- {
- t << "<para><emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis></para>" << endl;
- }
- }
- else if (md->memberType()==MemberType_Function)
- {
- t << " <para>";
- linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
- t << " <link linkend=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
- }
- else
- {
- t << memberOutputFileBase(md);
- }
- t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
- t << " (" << endl;
- ArgumentList *declAl = md->declArgumentList();
- if (declAl && declAl->count()>0)
- {
- ArgumentListIterator declAli(*declAl);
- Argument *a;
- int cnt=0;
- for (declAli.toFirst();(a=declAli.current());++declAli)
+ t << "</title>" << endl;
+ SDict<DirDef>::Iterator dli(*Doxygen::directories);
+ DirDef *dd;
+ bool found=FALSE;
+ for (dli.toFirst();(dd=dli.current()) && !found;++dli)
{
- if (cnt!=0)
- {
- t << ", ";
- }
- if (!a->type.isEmpty())
+ if (dd->isLinkableInProject())
{
- linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,a->type);
+ t << "< xi:include href=\"" << dd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ found=TRUE;
}
- t << " ";
- if (!a->name.isEmpty())
+ }
+ for (;(dd=dli.current());++dli)
+ {
+ if (dd->isLinkableInProject())
{
- writeDocbookString(t,a->name);
+ t << " <xi:include href=\"" << dd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
}
- cnt++;
}
}
- t << ")";
- if (md->briefDescription())
- {
- t << "<para><emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis></para>" << endl;
- }
- }
- else
- {
- closePara = FALSE;
- }
- if (closePara) t << "</para>" << endl;
- t << " </listitem>" << endl;
- t << " </itemizedlist>" << endl;
- t << " </para>" << endl;
- }
- else
- {
- if (md->memberType()==MemberType_Enumeration)
- {
- MemberList *enumFields = md->enumFieldList();
- t << " <section xml:id=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
- }
- else
+ t << "</chapter>\n";
+ break;
+ case isNamespaceDocumentation:
{
- t << memberOutputFileBase(md);
- }
- t << "_1" << md->anchor() << "\">" << endl;
- t << " <title>" << memType << " " << convertToXML(md->name()) << " " << "</title>" << endl;
- t << " ";
- writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
- t << endl;
- if (enumFields!=0)
- {
- MemberListIterator emli(*enumFields);
- MemberDef *emd;
- t << " <formalpara>" << endl;
- t << " <title>" << theTranslator->trEnumerationValues() << ":</title>" << endl;
- t << " <variablelist>" << endl;
- for (emli.toFirst();(emd=emli.current());++emli)
+ t << "</title>" << endl;
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ bool found=FALSE;
+ for (nli.toFirst();(nd=nli.current()) && !found;++nli)
{
- t << " <varlistentry xml:id=\"";
- t << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">" << endl;
- t << " <term>";
- writeDocbookString(t,emd->name());
- t << "</term>" << endl;
- t << " <listitem>" << endl;
- if(Config_getBool(REPEAT_BRIEF))
+ if (nd->isLinkableInProject())
{
- t << " <para>";
- writeDocbookString(t,emd->briefDescription());
- t << "</para>" << endl;
+ t << "<xi:include href=\"" << nd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ found=TRUE;
}
- t << " </listitem>" << endl;
- t << " </varlistentry>" << endl;
}
- t << " </variablelist>" << endl;
- t << " </formalpara>" << endl;
- t << " <para>";
- t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl;
- t << " <computeroutput><literallayout>" << endl;
- t << "{" << endl;
- for (emli.toFirst();(emd=emli.current());++emli)
+ while ((nd=nli.current()))
{
- writeDocbookString(t,emd->name());
- if (!emd->initializer().isEmpty())
+ if (nd->isLinkableInProject())
{
- writeDocbookString(t,emd->initializer());
+ t << "<xi:include href=\"" << nd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
}
- t << ", " << endl;
+ ++nli;
}
- t << "}" << convertToXML(md->name()) << ";" << endl;
- t << " </literallayout></computeroutput>" << endl;
- t << " </para>" << endl;
- t << " </section>" << endl;
- }
- }
- else if (md->memberType()==MemberType_Typedef)
- {
- t << " <section xml:id=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
- }
- else
- {
- t << memberOutputFileBase(md);
- }
- t << "_1" << md->anchor() << "\">" << endl;
- t << " <title>" << convertToXML(md->definition()) << "</title>";
- if(Config_getBool(REPEAT_BRIEF))
- {
- t << " <emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis>" << endl;
- }
- t << " ";
- writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
- t << endl;
- t << " </section>" << endl;
- }
- else if (md->memberType()==MemberType_Function)
- {
- t << " <section xml:id=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
- }
- else
- {
- t << memberOutputFileBase(md);
- }
- t << "_1" << md->anchor() << "\">" << endl;
- t << " <title>" << convertToXML(md->definition()) << " " << convertToXML(md->argsString()) << "</title>";
- if(Config_getBool(REPEAT_BRIEF))
- {
- t << " <emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis>" << endl;
}
- t << " ";
- writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
- t << endl;
- t << " </section>" << endl;
- }
- else if (md->memberType()==MemberType_Define)
- {
- if (md->documentation())
+ t << "</chapter>\n";
+ break;
+ case isClassDocumentation:
{
- t << " <section xml:id=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ t << "</title>" << endl;
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ bool found=FALSE;
+ for (cli.toFirst();(cd=cli.current()) && !found;++cli)
{
- t << md->getGroupDef()->getOutputFileBase();
+ if (cd->isLinkableInProject() &&
+ cd->templateMaster()==0 &&
+ !cd->isEmbeddedInOuterScope()
+ )
+ {
+ t << " <xi:include href=\"" << cd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ found=TRUE;
+ }
}
- else
+ for (;(cd=cli.current());++cli)
{
- t << memberOutputFileBase(md);
+ if (cd->isLinkableInProject() &&
+ cd->templateMaster()==0 &&
+ !cd->isEmbeddedInOuterScope()
+ )
+ {
+ t << " <xi:include href=\"" << cd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ }
}
- t << "_1" << md->anchor() << "\">" << endl;
- t << " <title>" << convertToXML(md->definition()) << "</title>";
- t << " ";
- writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
- t << endl;
- t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
- t << " <para>The Documentation for this define was generated from the following file: </para>" << endl;
- t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
- t << " </section>" << endl;
}
- }
- else if (md->memberType()==MemberType_Variable)
- {
- if (md->getClassDef())
+ t << "</chapter>\n";
+ break;
+ case isFileDocumentation:
{
- if (md->documentation())
+ t << "</title>" << endl;
+ bool isFirst=TRUE;
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- t << " <simplesect>" << endl;
- t << " <title>" << convertToXML(md->definition()) << "</title>";
- t << " ";
- writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
- t << endl;
- t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
- t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
- t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
- t << " </simplesect>" << endl;
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ if (fd->isLinkableInProject())
+ {
+ if (isFirst)
+ {
+ t << " <xi:include href=\"" << fd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
+ {
+ t << " <xi:include href=\"" << fd->getSourceFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ }
+ isFirst=FALSE;
+ }
+ else
+ {
+ t << " <xi:include href=\"" << fd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
+ {
+ t << " <xi:include href=\"" << fd->getSourceFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ }
+ }
+ }
+ }
}
}
- else
+ t << "</chapter>\n";
+ break;
+ case isExampleDocumentation:
{
- t << " <section xml:id=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
- }
- else
+ t << "</title>" << endl;
+ PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+ PageDef *pd=pdi.toFirst();
+ if (pd)
{
- t << memberOutputFileBase(md);
+ t << " <xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
}
- t << "_1" << md->anchor() << "\">" << endl;
- t << " <title>" << convertToXML(md->definition()) << "</title>";
- if(Config_getBool(REPEAT_BRIEF))
+ for (++pdi;(pd=pdi.current());++pdi)
{
- t << " <emphasis>";
- writeDocbookString(t,md->briefDescription());
- t << "</emphasis>" << endl;
+ t << " <xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
}
- t << " ";
- writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
- t << endl;
- t << " </section>" << endl;
}
- }
+ t << "</chapter>\n";
+ break;
+ case isPageDocumentation:
+ break;
+ case isPageDocumentation2:
+ break;
+ case isEndIndex:
+ t << "<index/>" << endl;
+ break;
}
}
-
-static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,const char *,
- bool detailed=0, const char *header=0,const char *documentation=0)
-{
- if (ml==0) return;
- MemberListIterator mli(*ml);
- MemberDef *md;
- int count=0;
- int doc_count=0;
- QCString title, desctitle;
-
- for (mli.toFirst();(md=mli.current());++mli)
- {
- // namespace members are also inserted in the file scope, but
- // to prevent this duplication in the Docbook output, we filter those here.
- if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
- {
- count++;
- }
- }
-
- if (count==0) return; // empty list
-
- switch (ml->listType())
- {
- case MemberListType_decDefineMembers: title=theTranslator->trDefines(); desctitle=theTranslator->trDefineDocumentation(); break;
- case MemberListType_decTypedefMembers: title=theTranslator->trTypedefs(); desctitle=theTranslator->trTypedefDocumentation(); break;
- case MemberListType_decEnumMembers: title=theTranslator->trEnumerations(); desctitle=theTranslator->trEnumerationTypeDocumentation(); break;
- case MemberListType_decFuncMembers: title=theTranslator->trFunctions(); desctitle=theTranslator->trFunctionDocumentation(); break;
- case MemberListType_decVarMembers: title=theTranslator->trVariables(); desctitle=theTranslator->trVariableDocumentation(); break;
- case MemberListType_pubAttribs: title=theTranslator->trPublicAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break;
- case MemberListType_priAttribs: title=theTranslator->trPrivateAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break;
- case MemberListType_proAttribs: title=theTranslator->trProtectedAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break;
- default: title=""; desctitle=""; break;
- }
-
- if (detailed)
- {
- for (mli.toFirst();(md=mli.current());++mli)
- {
- if (md->documentation().isEmpty() && !Config_getBool(REPEAT_BRIEF))
- {
- continue;
- }
- doc_count = 1;
- break;
- }
-
- if(doc_count == 0)
- {
- return;
- }
-
- if (desctitle)
- {
- t << " <section>" << endl;
- t << " <title>" << desctitle << "</title>" << endl;
- }
- } else
- {
- t << " <section>" << endl;
- if (header)
- {
- t << " <title>" << convertToXML(header) << "</title>" << endl;
- }
- else
- {
- t << " <title>" << title << "</title>" << endl;
- }
- }
-
- if (documentation)
- {
- t << " <description>";
- writeDocbookDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
- t << "</description>" << endl;
- }
- for (mli.toFirst();(md=mli.current());++mli)
- {
- // namespace members are also inserted in the file scope, but
- // to prevent this duplication in the Docbook output, we filter those here.
- if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
- {
- if (detailed && md->documentation().isEmpty() && !Config_getBool(REPEAT_BRIEF))
- {
- continue;
- }
-
- generateDocbookForMember(md,t,d,detailed);
- }
- }
- if (detailed)
- {
- if (desctitle)
- {
- t << " </section>" << endl;
- }
- }
- else
- {
- t << " </section>" << endl;
- }
-}
-
-static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
+void DocbookGenerator::writePageLink(const char *name, bool /*first*/)
{
- if (cl)
+DB_GEN_C
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd = pdi.toFirst();
+ for (pd = pdi.toFirst();(pd=pdi.current());++pdi)
{
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- QCString title = theTranslator->trClasses();
-
- if (cli.toFirst())
+ if (!pd->getGroupDef() && !pd->isReference() && pd->name() == stripPath(name))
{
- t << " <section>" << endl;
- t << " <title> " << title << " </title>" << endl;
- }
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- if (!cd->isHidden() && cd->name().find('@')==-1)
+ t << "<chapter>\n";
+ if (!pd->title().isEmpty())
{
- t << " <para>" << endl;
- t << " <itemizedlist>" << endl;
- t << " <listitem>" << endl;
- t << " <para>" << "struct <link linkend=\"" << classOutputFileBase(cd) << "\">" << convertToXML(cd->name()) << "</link>";
- t << "</para>" << endl;
- if (cd->briefDescription())
- {
- t << "<para><emphasis>";
- writeDocbookString(t,cd->briefDescription());
- t << "</emphasis></para>" << endl;
- }
- t << " </listitem>" << endl;
- t << " </itemizedlist>" << endl;
- t << " </para>" << endl;
+ t << " <title>" << convertToDocBook(pd->title()) << "</title>" << endl;
}
- }
- if (cli.toFirst())
- {
- t << " </section>" << endl;
- }
- }
-}
-
-static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
-{
- if (nl)
- {
- NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *nd;
- QCString title = theTranslator->trNamespaces();
-
- if (nli.toFirst())
- {
- t << " <simplesect>" << endl;
- t << " <title> " << title << " </title>" << endl;
- }
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
+ else
{
- t << " <para>" << endl;
- t << " <itemizedlist>" << endl;
- t << " <listitem>" << endl;
- t << " <para>" << "struct <link linkend=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</link>";
- t << "</para>" << endl;
- t << " </listitem>" << endl;
- t << " </itemizedlist>" << endl;
- t << " </para>" << endl;
+ t << " <title>" << convertToDocBook(pd->name()) << "</title>" << endl;
}
- }
- if (nli.toFirst())
- {
- t << " </simplesect>" << endl;
+ t << " <xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ t << "</chapter>\n";
}
}
}
-
-static void writeInnerFiles(const FileList *fl,FTextStream &t)
+void DocbookGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *)
{
- if (fl)
- {
- QListIterator<FileDef> fli(*fl);
- FileDef *fd;
- QCString title = theTranslator->trFile(TRUE,TRUE);
-
- if (fli.toFirst())
- {
- t << " <simplesect>" << endl;
- t << " <title> " << title << " </title>" << endl;
- }
- for (fli.toFirst();(fd=fli.current());++fli)
- {
- t << " <para>" << endl;
- t << " <itemizedlist>" << endl;
- t << " <listitem>" << endl;
- t << " <para>" << "file <link linkend=\"" << fd->getOutputFileBase() << "\">" << convertToXML(fd->name()) << "</link>";
- t << "</para>" << endl;
- t << " </listitem>" << endl;
- t << " </itemizedlist>" << endl;
- t << " </para>" << endl;
- }
- if (fli.toFirst())
- {
- t << " </simplesect>" << endl;
- }
- }
+DB_GEN_C
+ DocbookDocVisitor *visitor =
+ new DocbookDocVisitor(t,*this);
+ n->accept(visitor);
+ delete visitor;
}
-static void writeInnerPages(const PageSDict *pl,FTextStream &t)
+void DocbookGenerator::startParagraph(const char *)
{
- if (pl)
- {
- PageSDict::Iterator pli(*pl);
- PageDef *pd;
-
- for (pli.toFirst();(pd=pli.current());++pli)
- {
- t << "<xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- }
- }
+DB_GEN_C
+ t << "<para>" << endl;
}
-static void writeInnerGroups(const GroupList *gl,FTextStream &t)
+void DocbookGenerator::endParagraph()
{
- if (gl)
- {
- GroupListIterator gli(*gl);
- GroupDef *sgd;
-
- //Docbook header tags for inner groups
- if (gli.toFirst())
- {
- t << " <simplesect>" << endl;
- t << " <title>" << theTranslator->trModules() << "</title>" << endl;
- t << " </simplesect>" << endl;
- t << " <para>" << endl;
- t << " <itemizedlist>" << endl;
- }
-
- for (gli.toFirst();(sgd=gli.current());++gli)
- {
- t << " <listitem><para><link linkend=\"" << sgd->getOutputFileBase() << "\">" << convertToXML(sgd->groupTitle()) << "</link></para></listitem>" << endl;
- }
-
- //Docbook footer tags for inner groups
- if (gli.toFirst())
- {
- t << " </itemizedlist>" << endl;
- t << " </para>" << endl;
- }
-
- }
+DB_GEN_C
+ t << "</para>" << endl;
}
-
-static void writeInnerDirs(const DirList *dl,FTextStream &t)
+void DocbookGenerator::writeString(const char *text)
{
- if (dl)
- {
- QListIterator<DirDef> subdirs(*dl);
- DirDef *subdir;
- QCString title = theTranslator->trDirectories();
- if (subdirs.toFirst())
- {
- t << " <simplesect>" << endl;
- t << " <title> " << title << " </title>" << endl;
- }
- for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
- {
- t << " <para>" << endl;
- t << " <itemizedlist>" << endl;
- t << " <listitem>" << endl;
- t << " <para>" << "dir <link linkend=\"" << subdir->getOutputFileBase() << "\">" << convertToXML(subdir->displayName()) << "</link>";
- t << "</para>" << endl;
- t << " </listitem>" << endl;
- t << " </itemizedlist>" << endl;
- t << " </para>" << endl;
- }
- if (subdirs.toFirst())
- {
- t << " </simplesect>" << endl;
- }
- }
+DB_GEN_C
+ t << text;
}
-
-static void writeInnerGroupFiles(const GroupList *gl,FTextStream &t)
+void DocbookGenerator::startMemberHeader(const char *name,int)
{
- if (gl)
- {
- GroupListIterator gli(*gl);
- GroupDef *sgd;
-
- for (gli.toFirst();(sgd=gli.current());++gli)
- {
- t << "<xi:include href=\"" << sgd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- }
- }
+DB_GEN_C
+ t << "<simplesect>" << endl;
+ m_inSimpleSect[m_levelListItem] = TRUE;
+ t << " <title>";
}
-static void generateDocbookForClass(ClassDef *cd,FTextStream &ti)
-{
- // + brief description
- // + detailed description
- // + template argument list(s)
- // - include file
- // + member groups
- // + inheritance diagram
- // + list of direct super classes
- // + list of direct sub classes
- // + list of inner classes
- // + collaboration diagram
- // + list of all members
- // + user defined member sections
- // + standard member sections
- // + detailed member documentation
- // - examples using the class
-
- if (cd->isReference()) return; // skip external references.
- if (cd->isHidden()) return; // skip hidden classes.
- if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
- if (cd->templateMaster()!=0) return; // skip generated template instances.
-
- msg("Generating Docbook output for class %s\n",cd->name().data());
-
- QCString fileDocbook=cd->getOutputFileBase()+".xml";
- //Add the file Documentation info to index file
- ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
-
- QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
- QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
- QCString relPath = relativePathToRoot(fileName);
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- FTextStream t(&f);
- //t.setEncoding(FTextStream::UnicodeUTF8);
-
- writeDocbookHeader_ID(t, classOutputFileBase(cd));
+void DocbookGenerator::endMemberHeader()
+{
+DB_GEN_C
+ t << " </title>" << endl;
+}
+void DocbookGenerator::docify(const char *str)
+{
+DB_GEN_C
+ t << convertToDocBook(str);
+}
+void DocbookGenerator::writeObjectLink(const char *ref, const char *f,
+ const char *anchor, const char *text)
+{
+DB_GEN_C
+ if (anchor)
+ if (f) t << "<link linkend=\"_" << stripPath(f) << "_1" << anchor << "\">";
+ else t << "<link linkend=\"_" << anchor << "\">";
+ else
+ t << "<link linkend=\"_" << stripPath(f) << "\">";
+ docify(text);
+ t << "</link>";
+}
+void DocbookGenerator::startMemberList()
+{
+DB_GEN_C
+ t << " <itemizedlist>" << endl;
+ m_levelListItem++;
+}
+void DocbookGenerator::endMemberList()
+{
+DB_GEN_C
+ if (m_inListItem[m_levelListItem]) t << "</listitem>" << endl;
+ m_inListItem[m_levelListItem] = FALSE;
+ t << " </itemizedlist>" << endl;
+ m_levelListItem = (m_levelListItem> 0 ? m_levelListItem - 1 : 0);
+ if (m_inSimpleSect[m_levelListItem]) t << "</simplesect>" << endl;
+ m_inSimpleSect[m_levelListItem] = FALSE;
+}
+void DocbookGenerator::startMemberItem(const char *,int,const char *)
+{
+DB_GEN_C
+ if (m_inListItem[m_levelListItem]) t << "</listitem>" << endl;
+ t << " <listitem><para>";
+ m_inListItem[m_levelListItem] = TRUE;
+}
+void DocbookGenerator::endMemberItem()
+{
+DB_GEN_C
+ t << "</para>" << endl;
+}
+void DocbookGenerator::startBold(void)
+{
+DB_GEN_C
+ t << "<emphasis role=\"strong\">";
+}
+void DocbookGenerator::endBold(void)
+{
+DB_GEN_C
+ t << "</emphasis>";
+}
+void DocbookGenerator::startGroupHeader(int extraIndentLevel)
+{
+DB_GEN_C2("m_inLevel " << m_inLevel)
+DB_GEN_C2("extraIndentLevel " << extraIndentLevel)
+ m_firstMember = TRUE;
+ if (m_inSimpleSect[m_levelListItem]) t << "</simplesect>" << endl;
+ m_inSimpleSect[m_levelListItem] = FALSE;
+ if (m_inLevel != -1) m_inGroup = TRUE;
+ if (m_inLevel == extraIndentLevel) t << "</section>" << endl;
+ m_inLevel = extraIndentLevel;
+ t << "<section>" << endl;
t << "<title>";
- writeDocbookString(t,cd->name());
- t << " " << cd->compoundTypeString() << " Reference";
- t << "</title>" << endl;
-
- IncludeInfo *ii=cd->includeInfo();
- if (ii)
- {
- QCString nm = ii->includeName;
- if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
- if (!nm.isEmpty())
- {
- t << "<para>" << endl;
- t << " <programlisting>#include ";
- if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
- {
- t << "<link linkend=\"" << ii->fileDef->getOutputFileBase() << "\">";
- }
- if (ii->local)
- {
- t << "&quot;";
- }
- else
- {
- t << "&lt;";
- }
- t << convertToXML(nm);
- if (ii->local)
- {
- t << "&quot;";
- }
- else
- {
- t << "&gt;";
- }
- if (ii->fileDef && !ii->fileDef->isReference())
- {
- t << "</link>";
- }
- t << "</programlisting>" << endl;
- t << "</para>" << endl;
- }
- }
-
- if (Config_getBool(HAVE_DOT) && (Config_getBool(CLASS_DIAGRAMS) || Config_getBool(CLASS_GRAPH)))
- {
- t << "<para>Inheritance diagram for " << convertToXML(cd->name()) << "</para>" << endl;
- DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
- inheritanceGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE);
- }
-
- if (Config_getBool(HAVE_DOT) && Config_getBool(COLLABORATION_GRAPH))
- {
- t << "<para>Collaboration diagram for " << convertToXML(cd->name()) << "</para>" << endl;
- DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
- collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE);
- }
+}
+void DocbookGenerator::writeRuler(void)
+{
+DB_GEN_C2("m_inLevel " << m_inLevel)
+DB_GEN_C2("m_inGroup " << m_inGroup)
+ if (m_inGroup) t << "</section>" << endl;
+ m_inGroup = FALSE;
+}
- writeInnerClasses(cd->getClassSDict(),t);
+void DocbookGenerator::endGroupHeader(int)
+{
+DB_GEN_C
+ t << "</title>" << endl;
+}
- writeTemplateList(cd,t);
- if (cd->getMemberGroupSDict())
+void DocbookGenerator::startParameterList(bool openBracket)
+{
+DB_GEN_C
+ if (openBracket) t << "(";
+}
+void DocbookGenerator::endParameterList()
+{
+DB_GEN_C
+}
+void DocbookGenerator::writeNonBreakableSpace(int n)
+{
+DB_GEN_C
+ for (int i=0;i<n;i++) t << " ";
+}
+void DocbookGenerator::lineBreak(const char *)
+{
+DB_GEN_C
+ t << endl;
+}
+void DocbookGenerator::startTypewriter()
+{
+DB_GEN_C
+ if (!m_denseText) t << "<computeroutput>";
+}
+void DocbookGenerator::endTypewriter()
+{
+DB_GEN_C
+ if (!m_denseText) t << "</computeroutput>" << endl;
+}
+void DocbookGenerator::startTextBlock(bool dense)
+{
+DB_GEN_C
+ if (dense)
{
- MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateDocbookSection(cd,t,mg->members(),"user-defined",0,mg->header(),
- mg->documentation());
- }
+ m_denseText = TRUE;
+ t << "<programlisting>";
}
-
-
- QListIterator<MemberList> mli(cd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
- {
- if ((ml->listType()&MemberListType_detailedLists)==0)
- {
- generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()));
- }
- }
-
- if(Config_getBool(REPEAT_BRIEF))
+}
+void DocbookGenerator::endTextBlock(bool dense)
+{
+DB_GEN_C
+ if (m_denseText)
{
- if (cd->briefDescription())
- {
- t << " <simplesect>" << endl;
- // A title as 'Brief Description' may not be necessary.
- //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
- writeDocbookDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
- t << " </simplesect>" << endl;
- }
+ m_denseText = FALSE;
+ t << "</programlisting>";
}
-
- if (cd->documentation())
+}
+void DocbookGenerator::startMemberDoc(const char *clname, const char *memname, const char *anchor, const char *title,
+ int memCount, int memTotal, bool showInline)
+{
+DB_GEN_C2("m_inLevel " << m_inLevel)
+ t << " <section>" << endl;
+ t << " <title>" << convertToDocBook(title);
+ if (memTotal>1)
{
- t << " <simplesect>" << endl;
- t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
- writeDocbookDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
- t << " <para>Definition at line " << cd->getDefLine() << " of file " << stripPath(cd->getDefFileName()) << "</para>" << endl;
- t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
- t << " <para><itemizedlist><listitem><para>" << stripPath(cd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
- t << " </simplesect>" << endl;
+ t << "<computeroutput>[" << memCount << "/" << memTotal << "]</computeroutput>";
}
- for (mli.toFirst();(ml=mli.current());++mli)
+ t << "</title>" << endl;
+ if (memname && memname[0]!='@')
{
- if ((ml->listType()&MemberListType_detailedLists)==0)
- {
- generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
- }
+ addIndexTerm(t,memname,clname);
+ addIndexTerm(t,clname,memname);
}
-
- /*// TODO: Handling of Inheritance and Colloboration graph for Docbook to be implemented
- DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
- if (!inheritanceGraph.isTrivial())
- {
- t << " <inheritancegraph>" << endl;
- inheritanceGraph.writeDocbook(t);
- t << " </inheritancegraph>" << endl;
- }
- DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
- if (!collaborationGraph.isTrivial())
- {
- t << " <collaborationgraph>" << endl;
- collaborationGraph.writeDocbook(t);
- t << " </collaborationgraph>" << endl;
- }
- t << " <location file=\""
- << cd->getDefFileName() << "\" line=\""
- << cd->getDefLine() << "\"";
- if (cd->getStartBodyLine()!=-1)
- {
- FileDef *bodyDef = cd->getBodyDef();
- if (bodyDef)
- {
- t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
- }
- t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
- << cd->getEndBodyLine() << "\"";
- }
- t << "/>" << endl;
- writeListOfAllMembers(cd,t);
- */
-
- t << "</section>" << endl;
-
}
-
-static void generateDocbookForNamespace(NamespaceDef *nd,FTextStream &ti)
-{
- // + contained class definitions
- // + contained namespace definitions
- // + member groups
- // + normal members
- // + brief desc
- // + detailed desc
- // + location
- // - files containing (parts of) the namespace definition
-
- if (nd->isReference() || nd->isHidden()) return; // skip external references
-
- QCString fileDocbook=nd->getOutputFileBase()+".xml";
- //Add the file Documentation info to index file
- ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
-
- QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
- QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- FTextStream t(&f);
- //t.setEncoding(FTextStream::UnicodeUTF8);
-
- writeDocbookHeader_ID(t, nd->getOutputFileBase());
+void DocbookGenerator::endMemberDoc(bool)
+{
+DB_GEN_C
+ t << "</computeroutput></para>";
+}
+void DocbookGenerator::startTitleHead(const char *)
+{
+DB_GEN_C
t << "<title>";
- writeDocbookString(t,nd->name());
+}
+void DocbookGenerator::endTitleHead(const char *fileName,const char *name)
+{
+DB_GEN_C
t << "</title>" << endl;
-
- writeInnerClasses(nd->getClassSDict(),t);
- writeInnerNamespaces(nd->getNamespaceSDict(),t);
-
- if (nd->getMemberGroupSDict())
- {
- MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateDocbookSection(nd,t,mg->members(),"user-defined",0,mg->header(),
- mg->documentation());
- }
- }
-
- QListIterator<MemberList> mli(nd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ if (name) addIndexTerm(t, name);
+}
+void DocbookGenerator::startDoxyAnchor(const char *fName,const char *manName,
+ const char *anchor,const char *name,
+ const char *args)
+{
+DB_GEN_C
+ if (!m_inListItem[m_levelListItem] && !m_descTable)
{
- if ((ml->listType()&MemberListType_declarationLists)!=0)
- {
- generateDocbookSection(nd,t,ml,g_docbookSectionMapper.find(ml->listType()));
- }
+ if (!m_firstMember) t << " </section>";
+ m_firstMember = FALSE;
}
-
- if(Config_getBool(REPEAT_BRIEF))
+ if (anchor)
{
- if (nd->briefDescription())
- {
- t << " <simplesect>" << endl;
- //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
- writeDocbookDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
- t << " </simplesect>" << endl;
- }
+ t << "<anchor xml:id=\"_" << stripPath(fName) << "_1" << anchor << "\"/>";
}
-
- if (nd->documentation())
- {
- t << " <simplesect>" << endl;
- t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
- writeDocbookDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
- t << " <para>Definition at line " << nd->getDefLine() << " of file " << stripPath(nd->getDefFileName()) << "</para>" << endl;
- t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
- t << " <para><itemizedlist><listitem><para>" << stripPath(nd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
- t << " </simplesect>" << endl;
- }
- t << "</section>" << endl;
}
-
-static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
-{
- // + includes files
- // + includedby files
- // + include graph
- // + included by graph
- // + contained class definitions
- // + contained namespace definitions
- // + member groups
- // + normal members
- // + brief desc
- // + detailed desc
- // + source code
- // + location
- // - number of lines
-
- if (fd->isReference()) return; // skip external references
-
- QCString fileDocbook=fd->getOutputFileBase()+".xml";
- //Add the file Documentation info to index file
- ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
-
- QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
- QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
- QCString relPath = relativePathToRoot(fileName);
-
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- FTextStream t(&f);
- //t.setEncoding(FTextStream::UnicodeUTF8);
- writeDocbookHeader_ID(t, fd->getOutputFileBase());
-
- t << " <title>";
- writeDocbookString(t,fd->name());
- t << " File Reference";
+void DocbookGenerator::endDoxyAnchor(const char *fileName,const char *anchor)
+{
+DB_GEN_C
+}
+void DocbookGenerator::startMemberDocName(bool)
+{
+DB_GEN_C
+ t << "<para><computeroutput>";
+}
+void DocbookGenerator::endMemberDocName()
+{
+DB_GEN_C
+}
+void DocbookGenerator::startMemberGroupHeader(bool hasHeader)
+{
+DB_GEN_C
+ t << "<simplesect><title>";
+}
+void DocbookGenerator::endMemberGroupHeader()
+{
+DB_GEN_C
t << "</title>" << endl;
-
- IncludeInfo *inc;
-
- if (fd->includeFileList())
- {
- QListIterator<IncludeInfo> ili1(*fd->includeFileList());
- for (ili1.toFirst();(inc=ili1.current());++ili1)
- {
- t << " <programlisting>#include ";
- if (inc->local)
- {
- t << "&quot;";
- }
- else
- {
- t << "&lt;";
- }
- t << convertToXML(inc->includeName);
- if (inc->local)
- {
- t << "&quot;";
- }
- else
- {
- t << "&gt;";
- }
- t << "</programlisting>" << endl;
- }
- }
- if (Config_getBool(HAVE_DOT))
- {
- if (Config_getBool(INCLUDE_GRAPH))
- {
- t << "<para>Include dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl;
- DotInclDepGraph idepGraph(fd, FALSE);
- idepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
- }
- if (Config_getBool(INCLUDED_BY_GRAPH))
- {
- t << "<para>Included by dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl;
- DotInclDepGraph ibdepGraph(fd, TRUE);
- ibdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
- }
- }
-
- if (fd->getClassSDict())
- {
- writeInnerClasses(fd->getClassSDict(),t);
- }
- if (fd->getNamespaceSDict())
- {
- writeInnerNamespaces(fd->getNamespaceSDict(),t);
- }
-
- if (fd->getMemberGroupSDict())
- {
- MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateDocbookSection(fd,t,mg->members(),"user-defined",0,mg->header(),
- mg->documentation());
- }
- }
-
- QListIterator<MemberList> mli(fd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
- {
- if ((ml->listType()&MemberListType_declarationLists)!=0)
- {
- generateDocbookSection(fd,t,ml,g_docbookSectionMapper.find(ml->listType()));
- }
- }
-
- t << " <simplesect>" << endl;
- t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
- writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
- writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
- if (Config_getBool(FULL_PATH_NAMES))
- {
- t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl;
- }
- else
- {
- t << " <para>Definition in file " << stripPath(fd->getDefFileName()) << "</para>" << endl;
- }
- t << " </simplesect>" << endl;
-
- if (Config_getBool(DOCBOOK_PROGRAMLISTING))
- {
- t << " <literallayout><computeroutput>" << endl;
- writeDocbookCodeBlock(t,fd);
- t << " </computeroutput></literallayout>" << endl;
- }
-
- t << "</section>" << endl;
+}
+void DocbookGenerator::startMemberGroup()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endMemberGroup(bool)
+{
+DB_GEN_C
+ t << "</simplesect>" << endl;
+}
+void DocbookGenerator::startClassDiagram()
+{
+DB_GEN_C
+ t << "<para>";
}
-static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
-{
- // + members
- // + member groups
- // + files
- // + classes
- // + namespaces
- // - packages
- // + pages
- // + child groups
- // - examples
- // + brief description
- // + detailed description
-
- if (gd->isReference()) return; // skip external references
-
- if (!gd->isASubGroup())
- {
- QCString fileDocbook=gd->getOutputFileBase()+".xml";
- //Add the file Documentation info to index file
- ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- }
-
- QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
- QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
- QCString relPath = relativePathToRoot(fileName);
-
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
-
- FTextStream t(&f);
- //t.setEncoding(FTextStream::UnicodeUTF8);
- writeDocbookHeader_ID(t, gd->getOutputFileBase());
-
- t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
+void DocbookGenerator::endClassDiagram(const ClassDiagram &d, const char *fileName,const char *)
+{
+DB_GEN_C
+ t << " <informalfigure>" << endl;
+ t << " <mediaobject>" << endl;
+ t << " <imageobject>" << endl;
+ t << " <imagedata width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\""
+ << relPath << fileName << ".png\">" << "</imagedata>" << endl;
+ t << " </imageobject>" << endl;
+ d.writeImage(t,dir,relPath,fileName,FALSE);
+ t << " </mediaobject>" << endl;
+ t << " </informalfigure>" << endl;
+ t << "</para>" << endl;
+}
+void DocbookGenerator::startLabels()
+{
+DB_GEN_C
+}
- if (Config_getBool(GROUP_GRAPHS) && Config_getBool(HAVE_DOT))
- {
- t << "<para>Collaboration diagram for " << convertToXML(gd->groupTitle()) << "</para>" << endl;
- DotGroupCollaboration collaborationGraph(gd);
- collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
- }
+void DocbookGenerator::writeLabel(const char *l,bool isLast)
+{
+DB_GEN_C
+ t << "<computeroutput>[" << l << "]</computeroutput>";
+ if (!isLast) t << ", ";
+}
- if (gd->briefDescription())
- {
- //t << " <section>" << endl;
- //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
- writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
- //t << " </section>" << endl;
- }
+void DocbookGenerator::endLabels()
+{
+DB_GEN_C
+}
+void DocbookGenerator::startExamples()
+{
+DB_GEN_C
+ t << "<simplesect><title>";
+ docify(theTranslator->trExamples());
+ t << "</title>";
+}
- if (gd->documentation())
+void DocbookGenerator::endExamples()
+{
+DB_GEN_C
+ t << "</simplesect>" << endl;
+}
+void DocbookGenerator::startSubsubsection(void)
+{
+DB_GEN_C
+ t << "<simplesect><title>";
+}
+void DocbookGenerator::endSubsubsection(void)
+{
+DB_GEN_C
+ t << "</title></simplesect>" << endl;
+}
+void DocbookGenerator::writeChar(char c)
+{
+DB_GEN_C
+ char cs[2];
+ cs[0]=c;
+ cs[1]=0;
+ docify(cs);
+}
+void DocbookGenerator::startMemberDocPrefixItem()
+{
+DB_GEN_C
+ t << "<computeroutput>";
+}
+void DocbookGenerator::endMemberDocPrefixItem()
+{
+DB_GEN_C
+ t << "</computeroutput>";
+}
+void DocbookGenerator::exceptionEntry(const char* prefix,bool closeBracket)
+{
+DB_GEN_C
+ if (prefix)
+ t << " " << prefix << "(";
+ else if (closeBracket)
+ t << ")";
+ t << " ";
+}
+void DocbookGenerator::startParameterName(bool)
+{
+DB_GEN_C
+ t << " ";
+}
+void DocbookGenerator::endParameterName(bool last,bool /*emptyList*/,bool closeBracket)
+{
+DB_GEN_C
+ if (last)
{
- t << " <section>" << endl;
- t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
- writeDocbookDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
- t << " </section>" << endl;
+ if (closeBracket) t << ")";
}
+}
+void DocbookGenerator::startCodeFragment()
+{
+DB_GEN_C
+ t << "<programlisting>";
+}
+void DocbookGenerator::endCodeFragment()
+{
+DB_GEN_C
+ t << "</programlisting>";
+}
+void DocbookGenerator::startMemberTemplateParams()
+{
+DB_GEN_C
+}
- writeInnerFiles(gd->getFiles(),t);
- writeInnerClasses(gd->getClasses(),t);
- writeInnerNamespaces(gd->getNamespaces(),t);
- writeInnerPages(gd->getPages(),t);
- writeInnerGroups(gd->getSubGroups(),t);
-
- if (gd->getMemberGroupSDict())
- {
- MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateDocbookSection(gd,t,mg->members(),"user-defined",0,mg->header(),
- mg->documentation());
- }
- }
+void DocbookGenerator::endMemberTemplateParams(const char *,const char *)
+{
+DB_GEN_C
+ t << "</para>";
+ t << "<para>";
+}
+void DocbookGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
+{
+DB_GEN_C
+ t << " <section xml:id=\"_" << stripPath(lab) << "\">";
+ t << "<title>";
+}
+void DocbookGenerator::endSection(const char *lab,SectionInfo::SectionType)
+{
+DB_GEN_C
+ t << "</title>";
+ t << " </section>";
+}
+void DocbookGenerator::addIndexItem(const char *prim,const char *sec)
+{
+DB_GEN_C
+ addIndexTerm(t, prim, sec);
+}
- QListIterator<MemberList> mli(gd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
- {
- if ((ml->listType()&MemberListType_declarationLists)!=0)
- {
- generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()));
- }
- }
- for (mli.toFirst();(ml=mli.current());++mli)
+void DocbookGenerator::startDescTable(const char *title)
+{
+DB_GEN_C
+ int ncols = 2;
+ t << "<informaltable frame=\"all\">" << endl;
+ if (title)t << "<title>" << convertToDocBook(title) << "</title>" << endl;
+ t << " <tgroup cols=\"" << ncols << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+ for (int i = 0; i < ncols; i++)
{
- if ((ml->listType()&MemberListType_declarationLists)!=0)
- {
- generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
- }
+ t << " <colspec colname='c" << i+1 << "'/>\n";
}
+ t << "<tbody>\n";
+ m_descTable = TRUE;
+}
- writeInnerGroupFiles(gd->getSubGroups(),t);
-
- t << "</section>" << endl;
-
+void DocbookGenerator::endDescTable()
+{
+DB_GEN_C
+ t << " </tbody>" << endl;
+ t << " </tgroup>" << endl;
+ t << "</informaltable>" << endl;
+ m_descTable = FALSE;
}
-static void generateDocbookForDir(DirDef *dd,FTextStream &ti)
+void DocbookGenerator::startDescTableRow()
{
- if (dd->isReference()) return; // skip external references
+DB_GEN_C
+ t << "<row>";
+ t << "<entry>";
+}
- QCString fileDocbook=dd->getOutputFileBase()+".xml";
- //Add the file Documentation info to index file
- ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+void DocbookGenerator::endDescTableRow()
+{
+DB_GEN_C
+ t << "</row>";
+}
- QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
- QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
- QFile f(fileName);
- QCString relPath = relativePathToRoot(fileName);
+void DocbookGenerator::startDescTableTitle()
+{
+DB_GEN_C
+}
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
+void DocbookGenerator::endDescTableTitle()
+{
+DB_GEN_C
+}
- FTextStream t(&f);
- //t.setEncoding(FTextStream::UnicodeUTF8);
- writeDocbookHeader_ID(t, dd->getOutputFileBase());
+void DocbookGenerator::startDescTableData()
+{
+DB_GEN_C
+ t << "</entry><entry>";
+}
- t << " <title>";
- t << theTranslator->trDirReference(dd->displayName());
+void DocbookGenerator::endDescTableData()
+{
+DB_GEN_C
+ t << "</entry>";
+}
+void DocbookGenerator::startGroupCollaboration()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
+{
+DB_GEN_C
+ g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
+}
+void DocbookGenerator::startDotGraph()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endDotGraph(const DotClassGraph &g)
+{
+DB_GEN_C
+ g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE);
+}
+void DocbookGenerator::startInclDepGraph()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endInclDepGraph(const DotInclDepGraph &g)
+{
+DB_GEN_C
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), fileName,relPath,FALSE);
+}
+void DocbookGenerator::startCallGraph()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endCallGraph(const DotCallGraph &g)
+{
+DB_GEN_C
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), fileName,relPath,FALSE);
+}
+void DocbookGenerator::startDirDepGraph()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endDirDepGraph(const DotDirDeps &g)
+{
+DB_GEN_C
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), fileName,relPath,FALSE);
+}
+void DocbookGenerator::startMemberDocList()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endMemberDocList()
+{
+DB_GEN_C
+ m_inGroup = TRUE;
+}
+void DocbookGenerator::startConstraintList(const char *header)
+{
+DB_GEN_C
+ t << "<simplesect><title>";
+ docify(header);
t << "</title>" << endl;
- if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT))
- {
- t << "<para>Directory dependency diagram for " << convertToXML(dd->displayName()) << "</para>" << endl;
- DotDirDeps dirdepGraph(dd);
- dirdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
- }
-
- writeInnerDirs(&dd->subDirs(),t);
- writeInnerFiles(dd->getFiles(),t);
-
- t << " <simplesect>" << endl;
- t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
- writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
- writeDocbookDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
- t << " <para>Directory location is " << dd->name() << "</para>" << endl;
- t << " </simplesect>" << endl;
-
- t << "</section>" << endl;
}
-
-static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
+void DocbookGenerator::startConstraintParam()
{
- // + name
- // + title
- // + documentation
-
- if (pd->isReference()) return;
-
- QCString pageName = pd->getOutputFileBase();
- if (pd->getGroupDef())
- {
- pageName+=(QCString)"_"+pd->name();
- }
- if (pageName=="index")
- {
- pageName="mainpage"; // to prevent overwriting the generated index page.
- }
-
- QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
- QCString fileName=outputDirectory+"/"+pageName+".xml";
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
-
- FTextStream t(&f);
- //t.setEncoding(FTextStream::UnicodeUTF8);
-
- if(isExample)
- {
- QCString fileDocbook=pageName+".xml";
- ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- }
-
- if (!pd->hasParentPage() && !isExample)
- {
- QCString fileDocbook=pageName+".xml";
- //Add the file Documentation info to index file
- ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- writeDocbookHeaderMainpage(t);
- }
- else
- {
- QCString pid;
- if(isExample)
- {
- pid = pageName;
- }
- else
- {
- pid = pageName+"_1"+pageName;
- }
- writeDocbookHeader_ID(t, pid);
- }
-
- SectionInfo *si = Doxygen::sectionDict->find(pd->name());
- if (si)
- {
- t << " <title>" << convertToXML(si->title) << "</title>" << endl;
- }
- else
- {
- t << " <title>" << convertToXML(pd->name()) << "</title>" << endl;
- }
-
- if (isExample)
- {
- writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
- pd->documentation()+"\n\\include "+pd->name());
- }
- else
- {
- writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
- pd->documentation());
- }
- writeInnerPages(pd->getSubPages(),t);
-
- if (!pd->hasParentPage() && !isExample)
- {
- t << endl << "</chapter>" << endl;
- }
- else
- {
- t << endl << "</section>" << endl;
- }
+DB_GEN_C
+ t << "<para><emphasis role=\"strong\">";
}
-
-void generateDocbook()
+void DocbookGenerator::endConstraintParam()
{
-
- // + classes
- // + namespaces
- // + files
- // + groups
- // + related pages
- // - examples
-
- QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
- if (outputDirectory.isEmpty())
- {
- outputDirectory=QDir::currentDirPath().utf8();
- }
- else
- {
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("tag DOCBOOK_OUTPUT: Output directory `%s' does not "
- "exist and cannot be created\n",outputDirectory.data());
- exit(1);
- }
- else
- {
- msg("Notice: Output directory `%s' does not exist. "
- "I have created it for you.\n", outputDirectory.data());
- }
- dir.cd(outputDirectory);
- }
- outputDirectory=dir.absPath().utf8();
- }
-
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Cannot create directory %s\n",outputDirectory.data());
- return;
- }
- }
- QDir docbookDir(outputDirectory);
- createSubDirs(docbookDir);
-
- QCString fileName=outputDirectory+"/index.xml";
- QCString dbk_projectName = Config_getString(PROJECT_NAME);
- QFile f(fileName);
-
- f.setName(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- FTextStream t(&f);
- //t.setEncoding(FTextStream::UnicodeUTF8);
-
- // write index header for Docbook which calls the structure file
- t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
- t << "<book xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
- t << " <info>" << endl;
- t << " <title>" << dbk_projectName << "</title>" << endl;
- t << " </info>" << endl;
-
- // NAMESPACE DOCUMENTATION
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
-
- //Namespace Documentation index header
- if (nli.toFirst())
- {
- t << " <chapter>" << endl;
- t << " <title>Namespace Documentation</title>" << endl;
- }
-
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- msg("Generating Docbook output for namespace %s\n",nd->name().data());
- generateDocbookForNamespace(nd,t);
- }
-
- //Namespace Documentation index footer
- if (nli.toFirst())
- {
- t << " </chapter>" << endl;
- }
-
- /** MAINPAGE DOCUMENTATION **/
-
- if (Doxygen::mainPage)
- {
- msg("Generating Docbook output for the main page\n");
- generateDocbookForPage(Doxygen::mainPage,t,FALSE);
- }
-
- // PAGE DOCUMENTATION
- {
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
-
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- msg("Generating Docbook output for page %s\n",pd->name().data());
- generateDocbookForPage(pd,t,FALSE);
- }
- }
-
- /** MODULE GROUP DOCUMENTATION **/
-
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
-
- //Module group Documentation index header
- if (gli.toFirst())
- {
- t << " <chapter>" << endl;
- t << " <title>" << theTranslator->trModuleDocumentation() << "</title>" << endl;
- }
-
- for (;(gd=gli.current());++gli)
- {
- msg("Generating Docbook output for group %s\n",gd->name().data());
- generateDocbookForGroup(gd,t);
- }
-
- //Module group Documentation index footer
- if (gli.toFirst())
- {
- t << " </chapter>" << endl;
- }
-
- //CLASS DOCUMENTATION
-
- {
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
-
- //Class Documentation index header
- if (cli.toFirst())
- {
- t << " <chapter>" << endl;
- t << " <title>" << theTranslator->trClassDocumentation() << "</title>" << endl;
- }
-
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- generateDocbookForClass(cd,t);
- }
-
- //Class Documentation index footer
- if (cli.toFirst())
- {
- t << " </chapter>" << endl;
- }
- }
-
- // FILE DOCUMENTATION
-
- static bool showFiles = Config_getBool(SHOW_FILES);
- if (showFiles)
- {
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
-
- //File Documentation index header
- if (fnli.toFirst())
- {
- t << " <chapter>" << endl;
- t << " <title>" << theTranslator->trFileDocumentation() << "</title>" << endl;
- }
-
- for (;(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- msg("Generating Docbook output for file %s\n",fd->name().data());
- generateDocbookForFile(fd,t);
- }
- }
-
- //File Documentation index footer
- if (fnli.toFirst())
- {
- t << " </chapter>" << endl;
- }
- }
-
- // DIRECTORY DOCUMENTATION
- if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT))
- {
- DirDef *dir;
- DirSDict::Iterator sdi(*Doxygen::directories);
-
- //Directory Documentation index header
- if (sdi.toFirst())
- {
- t << " <chapter>" << endl;
- t << " <title>" << theTranslator->trDirDocumentation() << "</title>" << endl;
- }
-
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- msg("Generate Docbook output for dir %s\n",dir->name().data());
- generateDocbookForDir(dir,t);
- }
-
- //Module group Documentation index footer
- if (sdi.toFirst())
- {
- t << " </chapter>" << endl;
- }
- }
-
- // EXAMPLE PAGE DOCUMENTATION
-
- {
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=0;
-
- //Example Page Documentation index header
- if (pdi.toFirst())
- {
- t << " <chapter>" << endl;
- t << " <title>" << theTranslator->trExampleDocumentation() << "</title>" << endl;
- }
-
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- msg("Generating Docbook output for example %s\n",pd->name().data());
- generateDocbookForPage(pd,t,TRUE);
- }
-
- //Example Page Documentation index footer
- if (pdi.toFirst())
- {
- t << " </chapter>" << endl;
- }
- }
-
- t << "</book>" << endl;
-
+DB_GEN_C
+}
+void DocbookGenerator::startConstraintType()
+{
+DB_GEN_C
+ t << ":";
+}
+void DocbookGenerator::endConstraintType()
+{
+DB_GEN_C
+ t << "</emphasis></para>" << endl;
+}
+void DocbookGenerator::startConstraintDocs()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endConstraintDocs()
+{
+DB_GEN_C
+}
+void DocbookGenerator::endConstraintList()
+{
+DB_GEN_C
+ t << "</simplesect>" << endl;
}
-
-
diff --git a/src/docbookgen.h b/src/docbookgen.h
index 866d056..08255a1 100644
--- a/src/docbookgen.h
+++ b/src/docbookgen.h
@@ -15,6 +15,349 @@
#ifndef DOCBOOKGEN_H
#define DOCBOOKGEN_H
-void generateDocbook();
+#include "outputgen.h"
+
+class DocbookCodeGenerator : public CodeOutputInterface
+{
+ public:
+ DocbookCodeGenerator(FTextStream &t);
+ DocbookCodeGenerator();
+ virtual ~DocbookCodeGenerator();
+ void setTextStream(FTextStream &t)
+ {
+ m_streamSet = t.device()!=0;
+ m_t.setDevice(t.device());
+ }
+ void setRelativePath(const QCString &path) { m_relPath = path; }
+ void setSourceFileName(const QCString &sourceFileName) { m_sourceFileName = sourceFileName; }
+ QCString sourceFileName() { return m_sourceFileName; }
+
+ void codify(const char *text);
+ void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip);
+ void writeCodeLinkLine(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip);
+ void writeTooltip(const char *, const DocLinkInfo &, const char *,
+ const char *, const SourceLinkInfo &, const SourceLinkInfo &
+ );
+ void startCodeLine(bool);
+ void endCodeLine();
+ void startFontClass(const char *colorClass);
+ void endFontClass();
+ void writeCodeAnchor(const char *);
+ void writeLineNumber(const char *extRef,const char *compId,
+ const char *anchorId,int l);
+ void setCurrentDoc(Definition *,const char *,bool);
+ void addWord(const char *,bool);
+ void finish();
+ void startCodeFragment();
+ void endCodeFragment();
+
+ private:
+ FTextStream m_t;
+ bool m_streamSet;
+ QCString m_refId;
+ QCString m_external;
+ int m_lineNumber;
+ int m_col;
+ bool m_insideCodeLine;
+ bool m_insideSpecialHL;
+ QCString m_relPath;
+ QCString m_sourceFileName;
+ bool m_prettyCode;
+};
+
+
+#if 0
+// define for cases that have been implemented with an empty body
+#define DB_GEN_EMPTY t << "<!-- DBG_GEN_head_check " << __LINE__ << " -->\n";
+#else
+#define DB_GEN_EMPTY
+#endif
+
+#if 0
+// Generic debug statements
+#define DB_GEN_H DB_GEN_H1(t)
+#define DB_GEN_H1(x) x << "<!-- DBG_GEN_head " << __LINE__ << " -->\n";
+#define DB_GEN_H2(y) DB_GEN_H2a(t,y)
+#define DB_GEN_H2a(x,y) x << "<!-- DBG_GEN_head " << __LINE__ << " " << y << " -->\n";
+// define for cases that have NOT yet been implemented / considered
+#define DB_GEN_NEW fprintf(stderr,"DBG_GEN_head %d\n",__LINE__); DB_GEN_H
+#else
+#define DB_GEN_H
+#define DB_GEN_H1(x)
+#define DB_GEN_H2(y)
+#define DB_GEN_H2a(x,y)
+#define DB_GEN_NEW
+#endif
+
+class DocbookGenerator : public OutputGenerator
+{
+ public:
+ DocbookGenerator();
+ ~DocbookGenerator();
+ static void init();
+
+ ///////////////////////////////////////////////////////////////
+ // generic generator methods
+ ///////////////////////////////////////////////////////////////
+ void enable()
+ { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
+ void disable() { active=FALSE; }
+ void enableIf(OutputType o) { if (o==Docbook) enable(); }
+ void disableIf(OutputType o) { if (o==Docbook) disable(); }
+ void disableIfNot(OutputType o) { if (o!=Docbook) disable(); }
+ bool isEnabled(OutputType o) { return (o==Docbook && active); }
+ OutputGenerator *get(OutputType o) { return (o==Docbook) ? this : 0; }
+
+ // --- CodeOutputInterface
+ void codify(const char *text)
+ { m_codeGen.codify(text); }
+ void writeCodeLink(const char *ref, const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip)
+ { m_codeGen.writeCodeLink(ref,file,anchor,name,tooltip); }
+ void writeLineNumber(const char *ref,const char *file,const char *anchor,int lineNumber)
+ { m_codeGen.writeLineNumber(ref,file,anchor,lineNumber); }
+ void writeTooltip(const char *id, const DocLinkInfo &docInfo, const char *decl,
+ const char *desc, const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo
+ )
+ { m_codeGen.writeTooltip(id,docInfo,decl,desc,defInfo,declInfo); }
+ void startCodeLine(bool hasLineNumbers)
+ { m_codeGen.startCodeLine(hasLineNumbers); }
+ void endCodeLine()
+ { m_codeGen.endCodeLine(); }
+ void startFontClass(const char *s)
+ { m_codeGen.startFontClass(s); }
+ void endFontClass()
+ { m_codeGen.endFontClass(); }
+ void writeCodeAnchor(const char *anchor)
+ { m_codeGen.writeCodeAnchor(anchor); }
+ // ---------------------------
+
+ void writeDoc(DocNode *,Definition *ctx,MemberDef *md);
+
+ ///////////////////////////////////////////////////////////////
+ // structural output interface
+ ///////////////////////////////////////////////////////////////
+ void startFile(const char *name,const char *manName,
+ const char *title);
+ void writeSearchInfo(){DB_GEN_EMPTY};
+ void writeFooter(const char *navPath){DB_GEN_NEW};
+ void endFile();
+ void startIndexSection(IndexSections);
+ void endIndexSection(IndexSections);
+ void writePageLink(const char *,bool);
+ void startProjectNumber(){DB_GEN_NEW};
+ void endProjectNumber(){DB_GEN_NEW};
+ void writeStyleInfo(int part){DB_GEN_EMPTY};
+ void startTitleHead(const char *);
+ void endTitleHead(const char *fileName,const char *name);
+ void startIndexListItem(){DB_GEN_NEW};
+ void endIndexListItem(){DB_GEN_NEW};
+ void startIndexList(){DB_GEN_NEW};
+ void endIndexList(){DB_GEN_NEW};
+ void startIndexKey(){DB_GEN_NEW};
+ void endIndexKey(){DB_GEN_NEW};
+ void startIndexValue(bool){DB_GEN_NEW};
+ void endIndexValue(const char *,bool){DB_GEN_NEW};
+ void startItemList() {DB_GEN_EMPTY};
+ void endItemList() {DB_GEN_EMPTY};
+
+ void startIndexItem(const char *ref,const char *file){DB_GEN_NEW};
+ void endIndexItem(const char *ref,const char *file){DB_GEN_NEW};
+ void startItemListItem() {DB_GEN_EMPTY};
+ void endItemListItem() {DB_GEN_EMPTY};
+ void docify(const char *text);
+ void writeChar(char);
+ void writeString(const char *);
+ void startParagraph(const char *);
+ void endParagraph(void);
+ void writeObjectLink(const char *,const char *,const char *,const char *);
+ void startHtmlLink(const char *){DB_GEN_NEW};
+ void endHtmlLink(void){DB_GEN_NEW};
+ void startBold(void);
+ void endBold(void);
+ void startTypewriter(void);
+ void endTypewriter(void);
+ void startEmphasis(void){DB_GEN_NEW};
+ void endEmphasis(void){DB_GEN_NEW};
+ void startCodeFragment(void);
+ void endCodeFragment(void);
+ void writeRuler(void);
+ void startDescription(void){DB_GEN_NEW};
+ void endDescription(void){DB_GEN_NEW};
+ void startDescItem(void){DB_GEN_NEW};
+ void startDescForItem(void){DB_GEN_EMPTY};
+ void endDescForItem(void){DB_GEN_EMPTY};
+ void endDescItem(void){DB_GEN_NEW};
+ void startCenter(void){DB_GEN_NEW};
+ void endCenter(void){DB_GEN_NEW};
+ void startSmall(void){DB_GEN_NEW};
+ void endSmall(void){DB_GEN_NEW};
+ void startExamples(void);
+ void endExamples(void);
+ void startParamList(BaseOutputDocInterface::ParamListTypes,const char *){DB_GEN_NEW};
+ void endParamList(void){DB_GEN_NEW};
+ void startTitle(void){DB_GEN_NEW};
+ void endTitle(void){DB_GEN_NEW};
+ void writeAnchor(const char *,const char *){DB_GEN_EMPTY};
+ void startSection(const char *,const char *,SectionInfo::SectionType);
+ void endSection(const char *,SectionInfo::SectionType);
+ void lineBreak(const char *);
+ void addIndexItem(const char *,const char *);
+ void writeNonBreakableSpace(int);
+ void startDescTable(const char *);
+ void endDescTable(void);
+ void startDescTableRow(void);
+ void endDescTableRow(void);
+ void startDescTableTitle(void);
+ void endDescTableTitle(void);
+ void startDescTableData(void);
+ void endDescTableData(void);
+ void startTextLink(const char *,const char *){DB_GEN_NEW};
+ void endTextLink(void){DB_GEN_NEW};
+ void startPageRef(void){DB_GEN_NEW};
+ void endPageRef(const char *,const char *){DB_GEN_NEW};
+ void startSubsection(void){DB_GEN_NEW};
+ void endSubsection(void){DB_GEN_NEW};
+ void startSubsubsection(void);
+ void endSubsubsection(void);
+
+
+ void startGroupHeader(int);
+ void endGroupHeader(int);
+ void startMemberSections(){DB_GEN_EMPTY};
+ void endMemberSections(){DB_GEN_EMPTY};
+ void startHeaderSection(){DB_GEN_EMPTY};
+ void endHeaderSection(){DB_GEN_EMPTY};
+ void startMemberHeader(const char *anchor, int typ);
+ void endMemberHeader();
+ void startMemberSubtitle(){DB_GEN_EMPTY};
+ void endMemberSubtitle(){DB_GEN_EMPTY};
+ void startMemberDocList();
+ void endMemberDocList();
+ void startMemberList();
+ void endMemberList();
+ void startInlineHeader(){DB_GEN_NEW};
+ void endInlineHeader(){DB_GEN_NEW};
+ void startAnonTypeScope(int){DB_GEN_EMPTY};
+ void endAnonTypeScope(int){DB_GEN_EMPTY};
+ void startMemberItem(const char *,int,const char *);
+ void endMemberItem();
+ void startMemberTemplateParams();
+ void endMemberTemplateParams(const char *,const char *);
+ void startMemberGroupHeader(bool);
+ void endMemberGroupHeader();
+ void startMemberGroupDocs(){DB_GEN_EMPTY};
+ void endMemberGroupDocs(){DB_GEN_EMPTY};
+ void startMemberGroup();
+ void endMemberGroup(bool);
+ void insertMemberAlign(bool){DB_GEN_EMPTY};
+ void insertMemberAlignLeft(int,bool){DB_GEN_EMPTY};
+ void startMemberDoc(const char *,const char *,
+ const char *,const char *,int,int,bool);
+ void endMemberDoc(bool);
+ void startDoxyAnchor(const char *fName,const char *manName,
+ const char *anchor,const char *name,
+ const char *args);
+ void endDoxyAnchor(const char *fileName,const char *anchor);
+ void writeLatexSpacing(){DB_GEN_EMPTY}
+ void writeStartAnnoItem(const char *type,const char *file,
+ const char *path,const char *name){DB_GEN_NEW};
+ void writeEndAnnoItem(const char *name){DB_GEN_NEW};
+ void startMemberDescription(const char *anchor,const char *inheritId, bool typ){DB_GEN_EMPTY};
+ void endMemberDescription(){DB_GEN_EMPTY};
+ void startMemberDeclaration(){DB_GEN_EMPTY};
+ void endMemberDeclaration(const char *anchor,const char *inheritId){DB_GEN_EMPTY};
+ void writeInheritedSectionTitle(const char *id,const char *ref,
+ const char *file,const char *anchor,
+ const char *title,const char *name){DB_GEN_NEW};
+ void startIndent(){DB_GEN_EMPTY};
+ void endIndent(){DB_GEN_EMPTY};
+ void writeSynopsis(){DB_GEN_EMPTY};
+ void startClassDiagram();
+ void endClassDiagram(const ClassDiagram &,const char *,const char *);
+ void startDotGraph();
+ void endDotGraph(const DotClassGraph &g);
+ void startInclDepGraph();
+ void endInclDepGraph(const DotInclDepGraph &g);
+ void startGroupCollaboration();
+ void endGroupCollaboration(const DotGroupCollaboration &g);
+ void startCallGraph();
+ void endCallGraph(const DotCallGraph &g);
+ void startDirDepGraph();
+ void endDirDepGraph(const DotDirDeps &g);
+ void writeGraphicalHierarchy(const DotGfxHierarchyTable &g){DB_GEN_NEW};
+ void startQuickIndices(){DB_GEN_EMPTY};
+ void endQuickIndices(){DB_GEN_EMPTY};
+ void writeSplitBar(const char *){DB_GEN_EMPTY};
+ void writeNavigationPath(const char *){DB_GEN_NEW};
+ void writeLogo(){DB_GEN_NEW};
+ void writeQuickLinks(bool compact,HighlightedItem hli,const char *file){DB_GEN_EMPTY};
+ void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first){DB_GEN_EMPTY};
+ void startContents(){DB_GEN_EMPTY};
+ void endContents(){DB_GEN_EMPTY};
+ void startPageDoc(const char *pageTitle){DB_GEN_EMPTY}
+ void endPageDoc() {DB_GEN_EMPTY}
+ void startTextBlock(bool);
+ void endTextBlock(bool);
+ void lastIndexPage(){DB_GEN_EMPTY};
+ void startMemberDocPrefixItem();
+ void endMemberDocPrefixItem();
+ void startMemberDocName(bool);
+ void endMemberDocName();
+ void startParameterType(bool,const char *key){DB_GEN_EMPTY};
+ void endParameterType(){DB_GEN_EMPTY};
+ void startParameterName(bool);
+ void endParameterName(bool,bool,bool);
+ void startParameterList(bool);
+ void endParameterList();
+ void exceptionEntry(const char*,bool);
+
+ void startConstraintList(const char *);
+ void startConstraintParam();
+ void endConstraintParam();
+ void startConstraintType();
+ void endConstraintType();
+ void startConstraintDocs();
+ void endConstraintDocs();
+ void endConstraintList();
+
+ void startMemberDocSimple(bool){DB_GEN_NEW};
+ void endMemberDocSimple(bool){DB_GEN_NEW};
+ void startInlineMemberType(){DB_GEN_NEW};
+ void endInlineMemberType(){DB_GEN_NEW};
+ void startInlineMemberName(){DB_GEN_NEW};
+ void endInlineMemberName(){DB_GEN_NEW};
+ void startInlineMemberDoc(){DB_GEN_NEW};
+ void endInlineMemberDoc(){DB_GEN_NEW};
+
+ void startLabels();
+ void writeLabel(const char *,bool);
+ void endLabels();
+
+ void setCurrentDoc(Definition *,const char *,bool) {DB_GEN_EMPTY}
+ void addWord(const char *,bool) {DB_GEN_EMPTY}
+
+private:
+ DocbookGenerator(const DocbookGenerator &o);
+ DocbookGenerator &operator=(const DocbookGenerator &o);
+
+ QCString relPath;
+ DocbookCodeGenerator m_codeGen;
+ bool m_prettyCode;
+ bool m_denseText;
+ bool m_inGroup;
+ bool m_inDetail;
+ int m_levelListItem;
+ bool m_inListItem[20];
+ bool m_inSimpleSect[20];
+ bool m_descTable;
+ int m_inLevel;
+ bool m_firstMember;
+};
#endif
diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp
index d3af3ac..d35e6ad 100644
--- a/src/docbookvisitor.cpp
+++ b/src/docbookvisitor.cpp
@@ -34,58 +34,99 @@
#include "msc.h"
#include "dia.h"
#include "htmlentity.h"
+#include "emoji.h"
#include "plantuml.h"
-static void visitPreStart(FTextStream &t, const bool hasCaption, QCString name, QCString width, QCString height)
+#if 0
+#define DB_VIS_C DB_VIS_C1(m_t)
+#define DB_VIS_C1(x) x << "<!-- DB_VIS_C " << __LINE__ << " -->\n";
+#define DB_VIS_C2(y) DB_VIS_C2a(m_t,y)
+#define DB_VIS_C2a(x,y) x << "<!-- DB_VIS_C " << __LINE__ << " " << y << " -->\n";
+#else
+#define DB_VIS_C
+#define DB_VIS_C1(x)
+#define DB_VIS_C2(y)
+#define DB_VIS_C2a(x,y)
+#endif
+
+void DocbookDocVisitor::visitCaption(const QList<DocNode> &children)
+{
+ QListIterator<DocNode> cli(children);
+ DocNode *n;
+ for (cli.toFirst();(n=cli.current());++cli) n->accept(this);
+}
+
+void DocbookDocVisitor::visitPreStart(FTextStream &t,
+ const QList<DocNode> &children,
+ bool hasCaption,
+ const QCString &name,
+ const QCString &width,
+ const QCString &height,
+ bool inlineImage)
{
- QCString tmpStr;
- t << " <figure>" << endl;
- t << " <title></title>" << endl;
+ if (hasCaption && !inlineImage)
+ {
+ t << " <figure>" << endl;
+ t << " <title>" << endl;
+ visitCaption(children);
+ t << " </title>" << endl;
+ }
+ else
+ {
+ t << " <informalfigure>" << endl;
+ }
t << " <mediaobject>" << endl;
t << " <imageobject>" << endl;
t << " <imagedata";
if (!width.isEmpty())
{
- t << " width=\"" << convertToXML(width) << "\"";
+ t << " width=\"" << convertToDocBook(width) << "\"";
}
else
{
- t << " width=\"50%\"";
+ if (!height.isEmpty() && !inlineImage) t << " width=\"50%\"";
}
if (!height.isEmpty())
{
- t << " depth=\"" << convertToXML(tmpStr) << "\"";
+ t << " depth=\"" << convertToDocBook(height) << "\"";
}
- t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << name << "\">";
+ t << " align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << name << "\">";
t << "</imagedata>" << endl;
t << " </imageobject>" << endl;
- if (hasCaption)
+ if (hasCaption && !inlineImage)
{
- t << " <caption>" << endl;
+ t << " <!--" << endl; // Needed for general formatting with title for other formats
}
}
-static void visitPostEnd(FTextStream &t, const bool hasCaption)
+void DocbookDocVisitor::visitPostEnd(FTextStream &t, bool hasCaption, bool inlineImage)
{
t << endl;
- if (hasCaption)
+ if (hasCaption && !inlineImage)
{
- t << " </caption>" << endl;
+ t << " -->" << endl; // Needed for general formatting with title for other formats
}
t << " </mediaobject>" << endl;
- t << " </figure>" << endl;
-}
-
-static void visitCaption(DocbookDocVisitor *parent, QList<DocNode> children)
-{
- QListIterator<DocNode> cli(children);
- DocNode *n;
- for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
+ if (hasCaption && !inlineImage)
+ {
+ t << " </figure>" << endl;
+ }
+ else
+ {
+ t << " </informalfigure>" << endl;
+ }
}
DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci)
: DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
{
+DB_VIS_C
+ // m_t << "<section>" << endl;
+}
+DocbookDocVisitor::~DocbookDocVisitor()
+{
+DB_VIS_C
+ // m_t << "</section>" << endl;
}
//--------------------------------------
@@ -94,12 +135,14 @@ DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci)
void DocbookDocVisitor::visit(DocWord *w)
{
+DB_VIS_C
if (m_hide) return;
filter(w->word());
}
void DocbookDocVisitor::visit(DocLinkedWord *w)
{
+DB_VIS_C
if (m_hide) return;
startLink(w->file(),w->anchor());
filter(w->word());
@@ -108,6 +151,7 @@ void DocbookDocVisitor::visit(DocLinkedWord *w)
void DocbookDocVisitor::visit(DocWhiteSpace *w)
{
+DB_VIS_C
if (m_hide) return;
if (m_insidePre)
{
@@ -121,6 +165,7 @@ void DocbookDocVisitor::visit(DocWhiteSpace *w)
void DocbookDocVisitor::visit(DocSymbol *s)
{
+DB_VIS_C
if (m_hide) return;
const char *res = HtmlEntityMapper::instance()->docbook(s->symbol());
if (res)
@@ -133,8 +178,24 @@ void DocbookDocVisitor::visit(DocSymbol *s)
}
}
+void DocbookDocVisitor::visit(DocEmoji *s)
+{
+DB_VIS_C
+ if (m_hide) return;
+ const char *res = EmojiEntityMapper::instance()->unicode(s->index());
+ if (res)
+ {
+ m_t << res;
+ }
+ else
+ {
+ m_t << s->name();
+ }
+}
+
void DocbookDocVisitor::visit(DocURL *u)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<link xlink:href=\"";
if (u->isEmail()) m_t << "mailto:";
@@ -146,12 +207,16 @@ void DocbookDocVisitor::visit(DocURL *u)
void DocbookDocVisitor::visit(DocLineBreak *)
{
+DB_VIS_C
if (m_hide) return;
- m_t << endl << "<literallayout>\n</literallayout>" << endl;
+ m_t << endl << "<literallayout>&#160;&#xa;</literallayout>" << endl;
+ // gives nicer results but gives problems as it is not allowed in <pare> and also problems with dblatex
+ // m_t << endl << "<sbr/>" << endl;
}
void DocbookDocVisitor::visit(DocHorRuler *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<informaltable frame='bottom'><tgroup cols='1'><colspec align='center'/><tbody><row><entry align='center'>\n";
m_t << "</entry></row></tbody></tgroup></informaltable>\n";
@@ -159,6 +224,7 @@ void DocbookDocVisitor::visit(DocHorRuler *)
void DocbookDocVisitor::visit(DocStyleChange *s)
{
+DB_VIS_C
if (m_hide) return;
switch (s->style())
{
@@ -205,6 +271,7 @@ void DocbookDocVisitor::visit(DocStyleChange *s)
void DocbookDocVisitor::visit(DocVerbatim *s)
{
+DB_VIS_C
if (m_hide) return;
SrcLangExt langExt = getLanguageFromFileName(m_langExt);
switch(s->type())
@@ -217,9 +284,9 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
m_t << "</computeroutput></literallayout>";
break;
case DocVerbatim::Verbatim:
- m_t << "<literallayout>";
+ m_t << "<literallayout><computeroutput>";
filter(s->text());
- m_t << "</literallayout>";
+ m_t << "</computeroutput></literallayout>";
break;
case DocVerbatim::HtmlOnly:
break;
@@ -232,7 +299,6 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::XmlOnly:
break;
case DocVerbatim::DocbookOnly:
- break;
m_t << s->text();
break;
case DocVerbatim::Dot:
@@ -304,12 +370,14 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
void DocbookDocVisitor::visit(DocAnchor *anc)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<anchor id=\"" << anc->file() << "_1" << anc->anchor() << "\"/>";
+ m_t << "<anchor xml:id=\"_" << stripPath(anc->file()) << "_1" << anc->anchor() << "\"/>";
}
void DocbookDocVisitor::visit(DocInclude *inc)
{
+DB_VIS_C
if (m_hide) return;
SrcLangExt langExt = getLanguageFromFileName(inc->extension());
switch(inc->type())
@@ -345,9 +413,9 @@ void DocbookDocVisitor::visit(DocInclude *inc)
case DocInclude::LatexInclude:
break;
case DocInclude::VerbInclude:
- m_t << "<verbatim>";
+ m_t << "<literallayout>";
filter(inc->text());
- m_t << "</verbatim>";
+ m_t << "</literallayout>";
break;
case DocInclude::Snippet:
m_t << "<literallayout><computeroutput>";
@@ -393,6 +461,7 @@ void DocbookDocVisitor::visit(DocInclude *inc)
void DocbookDocVisitor::visit(DocIncOperator *op)
{
+DB_VIS_C
if (op->isFirst())
{
if (!m_hide)
@@ -429,27 +498,37 @@ void DocbookDocVisitor::visit(DocIncOperator *op)
void DocbookDocVisitor::visit(DocFormula *f)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<equation><title>" << f->name() << "</title>";
- filter(f->text());
- m_t << "</equation>";
+
+ if (f->isInline()) m_t << "<inlinemediaobject>" << endl;
+ else m_t << " <mediaobject>" << endl;
+ m_t << " <imageobject>" << endl;
+ m_t << " <imagedata ";
+ m_t << "align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << f->relPath() << f->name() << ".png\"/>" << endl;
+ m_t << " </imageobject>" << endl;
+ if (f->isInline()) m_t << "</inlinemediaobject>" << endl;
+ else m_t << " </mediaobject>" << endl;
}
void DocbookDocVisitor::visit(DocIndexEntry *ie)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<indexentry><primaryie>" << endl;
+ m_t << "<indexterm><primary>";
filter(ie->entry());
- m_t << "</primaryie><secondaryie></secondaryie></indexentry>" << endl;
+ m_t << "</primary></indexterm>" << endl;
}
void DocbookDocVisitor::visit(DocSimpleSectSep *)
{
- m_t << "<simplesect/>";
+DB_VIS_C
+ // m_t << "<simplesect/>";
}
void DocbookDocVisitor::visit(DocCite *cite)
{
+DB_VIS_C
if (m_hide) return;
if (!cite->file().isEmpty()) startLink(cite->file(),cite->anchor());
filter(cite->text());
@@ -462,6 +541,7 @@ void DocbookDocVisitor::visit(DocCite *cite)
void DocbookDocVisitor::visitPre(DocAutoList *l)
{
+DB_VIS_C
if (m_hide) return;
if (l->isEnumList())
{
@@ -475,6 +555,7 @@ void DocbookDocVisitor::visitPre(DocAutoList *l)
void DocbookDocVisitor::visitPost(DocAutoList *l)
{
+DB_VIS_C
if (m_hide) return;
if (l->isEnumList())
{
@@ -488,18 +569,21 @@ void DocbookDocVisitor::visitPost(DocAutoList *l)
void DocbookDocVisitor::visitPre(DocAutoListItem *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<listitem>";
}
void DocbookDocVisitor::visitPost(DocAutoListItem *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</listitem>";
}
void DocbookDocVisitor::visitPre(DocPara *)
{
+DB_VIS_C
if (m_hide) return;
m_t << endl;
m_t << "<para>";
@@ -507,6 +591,7 @@ void DocbookDocVisitor::visitPre(DocPara *)
void DocbookDocVisitor::visitPost(DocPara *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</para>";
m_t << endl;
@@ -514,16 +599,19 @@ void DocbookDocVisitor::visitPost(DocPara *)
void DocbookDocVisitor::visitPre(DocRoot *)
{
+DB_VIS_C
//m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n";
}
void DocbookDocVisitor::visitPost(DocRoot *)
{
+DB_VIS_C
//m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n";
}
void DocbookDocVisitor::visitPre(DocSimpleSect *s)
{
+DB_VIS_C
if (m_hide) return;
switch(s->type())
{
@@ -534,7 +622,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trSeeAlso()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trSeeAlso()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Return:
@@ -544,7 +632,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trReturns()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trReturns()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Author:
@@ -554,7 +642,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trAuthor(TRUE, TRUE)) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trAuthor(TRUE, TRUE)) << ": </title>" << endl;
}
break;
case DocSimpleSect::Authors:
@@ -564,7 +652,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trAuthor(TRUE, FALSE)) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trAuthor(TRUE, FALSE)) << ": </title>" << endl;
}
break;
case DocSimpleSect::Version:
@@ -574,7 +662,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trVersion()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trVersion()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Since:
@@ -584,7 +672,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trSince()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trSince()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Date:
@@ -594,27 +682,27 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trDate()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trDate()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Note:
if (m_insidePre)
{
- m_t << "<formalpara><title>" << theTranslator->trNote() << ": </title>" << endl;
+ m_t << "<note><title>" << theTranslator->trNote() << ": </title>" << endl;
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trNote()) << ": </title>" << endl;
+ m_t << "<note><title>" << convertToDocBook(theTranslator->trNote()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Warning:
if (m_insidePre)
{
- m_t << "<formalpara><title>" << theTranslator->trWarning() << ": </title>" << endl;
+ m_t << "<warning><title>" << theTranslator->trWarning() << ": </title>" << endl;
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trWarning()) << ": </title>" << endl;
+ m_t << "<warning><title>" << convertToDocBook(theTranslator->trWarning()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Pre:
@@ -624,7 +712,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trPrecondition()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trPrecondition()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Post:
@@ -634,7 +722,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trPostcondition()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trPostcondition()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Copyright:
@@ -644,7 +732,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trCopyright()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trCopyright()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Invar:
@@ -654,85 +742,121 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s)
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trInvariant()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trInvariant()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Remark:
+ // <remark> is miising the <title> possibility
if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trRemarks() << ": </title>" << endl;
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trRemarks()) << ": </title>" << endl;
+ m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trRemarks()) << ": </title>" << endl;
}
break;
case DocSimpleSect::Attention:
if (m_insidePre)
{
- m_t << "<formalpara><title>" << theTranslator->trAttention() << ": </title>" << endl;
+ m_t << "<caution><title>" << theTranslator->trAttention() << ": </title>" << endl;
}
else
{
- m_t << "<formalpara><title>" << convertToXML(theTranslator->trAttention()) << ": </title>" << endl;
+ m_t << "<caution><title>" << convertToDocBook(theTranslator->trAttention()) << ": </title>" << endl;
}
break;
case DocSimpleSect::User:
- m_t << "<formalpara><title></title>" << endl;
+ if (s->hasTitle())
+ m_t << "<formalpara>" << endl;
+ else
+ m_t << "<para>" << endl;
break;
case DocSimpleSect::Rcs:
- m_t << "<formalpara><title></title>" << endl;
+ case DocSimpleSect::Unknown:
+ m_t << "<para>" << endl;
break;
- case DocSimpleSect::Unknown: m_t << "<formalpara><title></title>" << endl; break;
}
}
-void DocbookDocVisitor::visitPost(DocSimpleSect *)
+void DocbookDocVisitor::visitPost(DocSimpleSect *s)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "</formalpara>" << endl;
+ switch(s->type())
+ {
+ case DocSimpleSect::Rcs:
+ case DocSimpleSect::Unknown:
+ m_t << "</para>" << endl;
+ break;
+ case DocSimpleSect::User:
+ if (s->hasTitle())
+ m_t << "</formalpara>" << endl;
+ else
+ m_t << "</para>" << endl;
+ break;
+ case DocSimpleSect::Note:
+ m_t << "</note>" << endl;
+ break;
+ case DocSimpleSect::Attention:
+ m_t << "</caution>" << endl;
+ break;
+ case DocSimpleSect::Warning:
+ m_t << "</warning>" << endl;
+ break;
+ default:
+ m_t << "</formalpara>" << endl;
+ break;
+ }
}
-void DocbookDocVisitor::visitPre(DocTitle *)
+void DocbookDocVisitor::visitPre(DocTitle *t)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<title>";
+ if (t->hasTitle()) m_t << "<title>";
}
-void DocbookDocVisitor::visitPost(DocTitle *)
+void DocbookDocVisitor::visitPost(DocTitle *t)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "</title>";
+ if (t->hasTitle()) m_t << "</title>";
}
void DocbookDocVisitor::visitPre(DocSimpleList *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<itemizedlist>\n";
}
void DocbookDocVisitor::visitPost(DocSimpleList *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</itemizedlist>\n";
}
void DocbookDocVisitor::visitPre(DocSimpleListItem *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<listitem>";
}
void DocbookDocVisitor::visitPost(DocSimpleListItem *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</listitem>\n";
}
void DocbookDocVisitor::visitPre(DocSection *s)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<section xml:id=\"" << s->file();
+ m_t << "<section xml:id=\"_" << stripPath(s->file());
if (!s->anchor().isEmpty()) m_t << "_1" << s->anchor();
m_t << "\">" << endl;
m_t << "<title>";
@@ -742,11 +866,13 @@ void DocbookDocVisitor::visitPre(DocSection *s)
void DocbookDocVisitor::visitPost(DocSection *)
{
+DB_VIS_C
m_t << "</section>\n";
}
void DocbookDocVisitor::visitPre(DocHtmlList *s)
{
+DB_VIS_C
if (m_hide) return;
if (s->type()==DocHtmlList::Ordered)
m_t << "<orderedlist>\n";
@@ -756,6 +882,7 @@ void DocbookDocVisitor::visitPre(DocHtmlList *s)
void DocbookDocVisitor::visitPost(DocHtmlList *s)
{
+DB_VIS_C
if (m_hide) return;
if (s->type()==DocHtmlList::Ordered)
m_t << "</orderedlist>\n";
@@ -765,143 +892,277 @@ void DocbookDocVisitor::visitPost(DocHtmlList *s)
void DocbookDocVisitor::visitPre(DocHtmlListItem *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<listitem>\n";
}
void DocbookDocVisitor::visitPost(DocHtmlListItem *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</listitem>\n";
}
void DocbookDocVisitor::visitPre(DocHtmlDescList *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<variablelist>\n";
}
void DocbookDocVisitor::visitPost(DocHtmlDescList *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</variablelist>\n";
}
void DocbookDocVisitor::visitPre(DocHtmlDescTitle *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<varlistentry><term>";
}
void DocbookDocVisitor::visitPost(DocHtmlDescTitle *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</term>\n";
}
void DocbookDocVisitor::visitPre(DocHtmlDescData *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<listitem>";
}
void DocbookDocVisitor::visitPost(DocHtmlDescData *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</listitem></varlistentry>\n";
}
+static int colCnt = 0;
+static bool bodySet = FALSE; // it is possible to have tables without a header
void DocbookDocVisitor::visitPre(DocHtmlTable *t)
{
+DB_VIS_C
+ bodySet = FALSE;
if (m_hide) return;
- m_t << "<table frame=\"all\">" << endl;
- m_t << " <title></title>" << endl;
+ m_t << "<informaltable frame=\"all\">" << endl;
m_t << " <tgroup cols=\"" << t->numColumns() << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
- m_t << " <tbody>" << endl;
+ for (int i = 0; i <t->numColumns(); i++)
+ {
+ // do something with colwidth based of cell width specification (be aware of possible colspan in the header)?
+ m_t << " <colspec colname='c" << i+1 << "'/>\n";
+ }
}
void DocbookDocVisitor::visitPost(DocHtmlTable *)
{
+DB_VIS_C
if (m_hide) return;
- m_t << " </tbody>" << endl;
+ if (bodySet) m_t << " </tbody>" << endl;
+ bodySet = FALSE;
m_t << " </tgroup>" << endl;
- m_t << "</table>" << endl;
+ m_t << "</informaltable>" << endl;
}
-void DocbookDocVisitor::visitPre(DocHtmlRow *)
+void DocbookDocVisitor::visitPre(DocHtmlRow *tr)
{
+DB_VIS_C
+ colCnt = 0;
if (m_hide) return;
- m_t << "<row>\n";
+
+ if (tr->isHeading()) m_t << "<thead>\n";
+ else if (!bodySet)
+ {
+ bodySet = TRUE;
+ m_t << "<tbody>\n";
+ }
+
+ m_t << " <row ";
+
+ HtmlAttribListIterator li(tr->attribs());
+ HtmlAttrib *opt;
+ for (li.toFirst();(opt=li.current());++li)
+ {
+ if (opt->name=="class")
+ {
+ // just skip it
+ }
+ else if (opt->name=="style")
+ {
+ // just skip it
+ }
+ else if (opt->name=="height")
+ {
+ // just skip it
+ }
+ else if (opt->name=="filter")
+ {
+ // just skip it
+ }
+ else
+ {
+ m_t << " " << opt->name << "='" << opt->value << "'";
+ }
+ }
+ m_t << ">\n";
}
-void DocbookDocVisitor::visitPost(DocHtmlRow *)
+void DocbookDocVisitor::visitPost(DocHtmlRow *tr)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</row>\n";
+ if (tr->isHeading())
+ {
+ bodySet = TRUE;
+ m_t << "</thead><tbody>\n";
+ }
}
-void DocbookDocVisitor::visitPre(DocHtmlCell *)
+void DocbookDocVisitor::visitPre(DocHtmlCell *c)
{
+DB_VIS_C
+ colCnt++;
if (m_hide) return;
- m_t << "<entry>";
+ m_t << "<entry";
+
+ HtmlAttribListIterator li(c->attribs());
+ HtmlAttrib *opt;
+ for (li.toFirst();(opt=li.current());++li)
+ {
+ if (opt->name=="colspan")
+ {
+ m_t << " namest='c" << colCnt << "'";
+ int cols = opt->value.toInt();
+ colCnt += (cols - 1);
+ m_t << " nameend='c" << colCnt << "'";
+ }
+ else if (opt->name=="rowspan")
+ {
+ int extraRows = opt->value.toInt() - 1;
+ m_t << " morerows='" << extraRows << "'";
+ }
+ else if (opt->name=="class")
+ {
+ if (opt->value == "markdownTableBodyRight")
+ {
+ m_t << " align='right'";
+ }
+ else if (opt->value == "markdownTableBodyLeftt")
+ {
+ m_t << " align='left'";
+ }
+ else if (opt->value == "markdownTableBodyCenter")
+ {
+ m_t << " align='center'";
+ }
+ else if (opt->value == "markdownTableHeadRight")
+ {
+ m_t << " align='right'";
+ }
+ else if (opt->value == "markdownTableHeadLeftt")
+ {
+ m_t << " align='left'";
+ }
+ else if (opt->value == "markdownTableHeadCenter")
+ {
+ m_t << " align='center'";
+ }
+ }
+ else if (opt->name=="style")
+ {
+ // just skip it
+ }
+ else if (opt->name=="width")
+ {
+ // just skip it
+ }
+ else if (opt->name=="height")
+ {
+ // just skip it
+ }
+ else
+ {
+ m_t << " " << opt->name << "='" << opt->value << "'";
+ }
+ }
+ m_t << ">";
}
-void DocbookDocVisitor::visitPost(DocHtmlCell *)
+void DocbookDocVisitor::visitPost(DocHtmlCell *c)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</entry>";
}
-void DocbookDocVisitor::visitPre(DocHtmlCaption *)
+void DocbookDocVisitor::visitPre(DocHtmlCaption *c)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<caption>";
+ m_t << "<caption>";
}
void DocbookDocVisitor::visitPost(DocHtmlCaption *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</caption>\n";
}
void DocbookDocVisitor::visitPre(DocInternal *)
{
+DB_VIS_C
if (m_hide) return;
// TODO: to be implemented
}
void DocbookDocVisitor::visitPost(DocInternal *)
{
+DB_VIS_C
if (m_hide) return;
// TODO: to be implemented
}
void DocbookDocVisitor::visitPre(DocHRef *href)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<link xlink:href=\"" << href->url() << "\">";
+ m_t << "<link xlink:href=\"" << convertToDocBook(href->url()) << "\">";
}
void DocbookDocVisitor::visitPost(DocHRef *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</link>";
}
void DocbookDocVisitor::visitPre(DocHtmlHeader *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<formalpara><title>";
}
void DocbookDocVisitor::visitPost(DocHtmlHeader *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</title></formalpara>\n";
}
void DocbookDocVisitor::visitPre(DocImage *img)
{
+DB_VIS_C
if (img->type()==DocImage::DocBook)
{
if (m_hide) return;
@@ -912,7 +1173,7 @@ void DocbookDocVisitor::visitPre(DocImage *img)
{
baseName=baseName.right(baseName.length()-i-1);
}
- visitPreStart(m_t, img -> hasCaption(), baseName, img -> width(), img -> height());
+ visitPreStart(m_t, img->children(), img->hasCaption(), img->relPath() + baseName, img->width(), img->height(), img->isInlineImage());
}
else
{
@@ -923,10 +1184,11 @@ void DocbookDocVisitor::visitPre(DocImage *img)
void DocbookDocVisitor::visitPost(DocImage *img)
{
+DB_VIS_C
if (img->type()==DocImage::DocBook)
{
if (m_hide) return;
- visitPostEnd(m_t, img -> hasCaption());
+ visitPostEnd(m_t, img -> hasCaption(),img -> isInlineImage());
// copy the image to the output dir
QCString baseName=img->name();
int i;
@@ -963,96 +1225,118 @@ void DocbookDocVisitor::visitPost(DocImage *img)
void DocbookDocVisitor::visitPre(DocDotFile *df)
{
+DB_VIS_C
if (m_hide) return;
- startDotFile(df->file(),df->width(),df->height(),df->hasCaption());
+ startDotFile(df->file(),df->width(),df->height(),df->hasCaption(),df->children());
}
void DocbookDocVisitor::visitPost(DocDotFile *df)
{
+DB_VIS_C
if (m_hide) return;
endDotFile(df->hasCaption());
}
void DocbookDocVisitor::visitPre(DocMscFile *df)
{
+DB_VIS_C
if (m_hide) return;
- startMscFile(df->file(),df->width(),df->height(),df->hasCaption());
+ startMscFile(df->file(),df->width(),df->height(),df->hasCaption(),df->children());
}
void DocbookDocVisitor::visitPost(DocMscFile *df)
{
+DB_VIS_C
if (m_hide) return;
endMscFile(df->hasCaption());
}
void DocbookDocVisitor::visitPre(DocDiaFile *df)
{
+DB_VIS_C
if (m_hide) return;
- startDiaFile(df->file(),df->width(),df->height(),df->hasCaption());
+ startDiaFile(df->file(),df->width(),df->height(),df->hasCaption(),df->children());
}
void DocbookDocVisitor::visitPost(DocDiaFile *df)
{
+DB_VIS_C
if (m_hide) return;
endDiaFile(df->hasCaption());
}
void DocbookDocVisitor::visitPre(DocLink *lnk)
{
+DB_VIS_C
if (m_hide) return;
startLink(lnk->file(),lnk->anchor());
}
void DocbookDocVisitor::visitPost(DocLink *)
{
+DB_VIS_C
if (m_hide) return;
endLink();
}
void DocbookDocVisitor::visitPre(DocRef *ref)
{
+DB_VIS_C
if (m_hide) return;
- if (!ref->file().isEmpty()) startLink(ref->file(),ref->anchor());
+ if (ref->isSubPage())
+ {
+ startLink(0,ref->anchor());
+ }
+ else
+ {
+ if (!ref->file().isEmpty()) startLink(ref->file(),ref->anchor());
+ }
+
if (!ref->hasLinkText()) filter(ref->targetTitle());
}
void DocbookDocVisitor::visitPost(DocRef *ref)
{
+DB_VIS_C
if (m_hide) return;
if (!ref->file().isEmpty()) endLink();
}
void DocbookDocVisitor::visitPre(DocSecRefItem *ref)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<tocitem id=\"" << ref->file() << "_1" << ref->anchor() << "\">";
+ //m_t << "<tocentry xml:idref=\"_" << stripPath(ref->file()) << "_1" << ref->anchor() << "\">";
+ m_t << "<tocentry>";
}
void DocbookDocVisitor::visitPost(DocSecRefItem *)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "</tocitem>" << endl;
+ m_t << "</tocentry>" << endl;
}
void DocbookDocVisitor::visitPre(DocSecRefList *)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "<toclist>" << endl;
+ m_t << "<toc>" << endl;
}
void DocbookDocVisitor::visitPost(DocSecRefList *)
{
+DB_VIS_C
if (m_hide) return;
- m_t << "</toclist>" << endl;
+ m_t << "</toc>" << endl;
}
void DocbookDocVisitor::visitPre(DocParamSect *s)
{
+DB_VIS_C
if (m_hide) return;
m_t << endl;
m_t << " <formalpara>" << endl;
- m_t << " <title/>" << endl;
- m_t << " <table frame=\"all\">" << endl;
- m_t << " <title>";
+ m_t << " <title>" << endl;
switch(s->type())
{
case DocParamSect::Param: m_t << theTranslator->trParameters(); break;
@@ -1062,29 +1346,96 @@ void DocbookDocVisitor::visitPre(DocParamSect *s)
default:
ASSERT(0);
}
- m_t << " </title>" << endl;
- m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
- m_t << " <colspec colwidth=\"1*\"/>" << endl;
- m_t << " <colspec colwidth=\"4*\"/>" << endl;
+ m_t << " </title>" << endl;
+ m_t << " <para>" << endl;
+ m_t << " <table frame=\"all\">" << endl;
+ int ncols = 2;
+ if (s->type() == DocParamSect::Param)
+ {
+ bool hasInOutSpecs = s->hasInOutSpecifier();
+ bool hasTypeSpecs = s->hasTypeSpecifier();
+ if (hasInOutSpecs && hasTypeSpecs) ncols += 2;
+ else if (hasInOutSpecs || hasTypeSpecs) ncols += 1;
+ }
+ m_t << " <tgroup cols=\"" << ncols << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+ for (int i = 1; i <= ncols; i++)
+ {
+ if (i == ncols) m_t << " <colspec colwidth=\"4*\"/>" << endl;
+ else m_t << " <colspec colwidth=\"1*\"/>" << endl;
+ }
m_t << " <tbody>" << endl;
}
void DocbookDocVisitor::visitPost(DocParamSect *)
{
+DB_VIS_C
if (m_hide) return;
m_t << " </tbody>" << endl;
m_t << " </tgroup>" << endl;
m_t << " </table>" << endl;
+ m_t << " </para>" << endl;
m_t << " </formalpara>" << endl;
m_t << " ";
}
void DocbookDocVisitor::visitPre(DocParamList *pl)
{
+DB_VIS_C
if (m_hide) return;
+ m_t << " <row>" << endl;
+
+ DocParamSect::Type parentType = DocParamSect::Unknown;
+ DocParamSect *sect = 0;
+ if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect)
+ {
+ parentType = ((DocParamSect*)pl->parent())->type();
+ sect=(DocParamSect*)pl->parent();
+ }
+
+ if (sect && sect->hasInOutSpecifier())
+ {
+ m_t << " <entry>";
+ if (pl->direction()!=DocParamSect::Unspecified)
+ {
+ if (pl->direction()==DocParamSect::In)
+ {
+ m_t << "in";
+ }
+ else if (pl->direction()==DocParamSect::Out)
+ {
+ m_t << "out";
+ }
+ else if (pl->direction()==DocParamSect::InOut)
+ {
+ m_t << "in,out";
+ }
+ }
+ m_t << " </entry>";
+ }
+
+ if (sect && sect->hasTypeSpecifier())
+ {
+ QListIterator<DocNode> li(pl->paramTypes());
+ DocNode *type;
+ bool first=TRUE;
+ m_t << " <entry>";
+ for (li.toFirst();(type=li.current());++li)
+ {
+ if (!first) m_t << " | "; else first=FALSE;
+ if (type->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)type);
+ }
+ else if (type->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)type);
+ }
+ }
+ m_t << " </entry>";
+ }
+
QListIterator<DocNode> li(pl->parameters());
DocNode *param;
- m_t << " <row>" << endl;
if (!li.toFirst())
{
m_t << " <entry></entry>" << endl;
@@ -1116,6 +1467,7 @@ void DocbookDocVisitor::visitPre(DocParamList *pl)
void DocbookDocVisitor::visitPost(DocParamList *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</entry>" << endl;
m_t << " </row>" << endl;
@@ -1123,10 +1475,11 @@ void DocbookDocVisitor::visitPost(DocParamList *)
void DocbookDocVisitor::visitPre(DocXRefItem *x)
{
+DB_VIS_C
if (m_hide) return;
if (x->title().isEmpty()) return;
- m_t << "<para><link linkend=\"";
- m_t << x->file() << "_1" << x->anchor();
+ m_t << "<para><link linkend=\"_";
+ m_t << stripPath(x->file()) << "_1" << x->anchor();
m_t << "\">";
filter(x->title());
m_t << "</link>";
@@ -1135,6 +1488,7 @@ void DocbookDocVisitor::visitPre(DocXRefItem *x)
void DocbookDocVisitor::visitPost(DocXRefItem *x)
{
+DB_VIS_C
if (m_hide) return;
if (x->title().isEmpty()) return;
m_t << "</para>";
@@ -1142,12 +1496,14 @@ void DocbookDocVisitor::visitPost(DocXRefItem *x)
void DocbookDocVisitor::visitPre(DocInternalRef *ref)
{
+DB_VIS_C
if (m_hide) return;
startLink(ref->file(),ref->anchor());
}
void DocbookDocVisitor::visitPost(DocInternalRef *)
{
+DB_VIS_C
if (m_hide) return;
endLink();
m_t << " ";
@@ -1155,6 +1511,7 @@ void DocbookDocVisitor::visitPost(DocInternalRef *)
void DocbookDocVisitor::visitPre(DocCopy *)
{
+DB_VIS_C
if (m_hide) return;
// TODO: to be implemented
}
@@ -1162,6 +1519,7 @@ void DocbookDocVisitor::visitPre(DocCopy *)
void DocbookDocVisitor::visitPost(DocCopy *)
{
+DB_VIS_C
if (m_hide) return;
// TODO: to be implemented
}
@@ -1169,72 +1527,89 @@ void DocbookDocVisitor::visitPost(DocCopy *)
void DocbookDocVisitor::visitPre(DocText *)
{
+DB_VIS_C
// TODO: to be implemented
}
void DocbookDocVisitor::visitPost(DocText *)
{
+DB_VIS_C
// TODO: to be implemented
}
void DocbookDocVisitor::visitPre(DocHtmlBlockQuote *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "<blockquote>";
}
void DocbookDocVisitor::visitPost(DocHtmlBlockQuote *)
{
+DB_VIS_C
if (m_hide) return;
m_t << "</blockquote>";
}
void DocbookDocVisitor::visitPre(DocVhdlFlow *)
{
+DB_VIS_C
// TODO: to be implemented
}
void DocbookDocVisitor::visitPost(DocVhdlFlow *)
{
+DB_VIS_C
// TODO: to be implemented
}
void DocbookDocVisitor::visitPre(DocParBlock *)
{
+DB_VIS_C
}
void DocbookDocVisitor::visitPost(DocParBlock *)
{
+DB_VIS_C
}
void DocbookDocVisitor::filter(const char *str)
{
- m_t << convertToXML(str);
+DB_VIS_C
+ m_t << convertToDocBook(str);
}
void DocbookDocVisitor::startLink(const QCString &file,const QCString &anchor)
{
- m_t << "<link linkend=\"" << file;
- if (!anchor.isEmpty()) m_t << "_1" << anchor;
+DB_VIS_C
+ m_t << "<link linkend=\"_" << stripPath(file);
+ if (!anchor.isEmpty())
+ {
+ if (file) m_t << "_1";
+ m_t << anchor;
+ }
m_t << "\">";
}
void DocbookDocVisitor::endLink()
{
+DB_VIS_C
m_t << "</link>";
}
void DocbookDocVisitor::pushEnabled()
{
+DB_VIS_C
m_enabled.push(new bool(m_hide));
}
void DocbookDocVisitor::popEnabled()
{
+DB_VIS_C
bool *v=m_enabled.pop();
ASSERT(v!=0);
m_hide = *v;
@@ -1243,6 +1618,7 @@ void DocbookDocVisitor::popEnabled()
void DocbookDocVisitor::writeMscFile(const QCString &baseName, DocVerbatim *s)
{
+DB_VIS_C
QCString shortName = baseName;
int i;
if ((i=shortName.findRev('/'))!=-1)
@@ -1251,13 +1627,14 @@ void DocbookDocVisitor::writeMscFile(const QCString &baseName, DocVerbatim *s)
}
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP);
- visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height());
- visitCaption(this, s->children());
+ visitPreStart(m_t, s->children(), s->hasCaption(), s->relPath() + shortName + ".png", s->width(), s->height());
+ visitCaption(s->children());
visitPostEnd(m_t, s->hasCaption());
}
void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName, DocVerbatim *s)
{
+DB_VIS_C
QCString shortName = baseName;
int i;
if ((i=shortName.findRev('/'))!=-1)
@@ -1266,17 +1643,19 @@ void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName, DocVerbatim
}
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
generatePlantUMLOutput(baseName,outDir,PUML_BITMAP);
- visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height());
- visitCaption(this, s->children());
+ visitPreStart(m_t, s->children(), s->hasCaption(), s->relPath() + shortName + ".png", s->width(),s->height());
+ visitCaption(s->children());
visitPostEnd(m_t, s->hasCaption());
}
void DocbookDocVisitor::startMscFile(const QCString &fileName,
const QCString &width,
const QCString &height,
- bool hasCaption
+ bool hasCaption,
+ const QList<DocNode> &children
)
{
+DB_VIS_C
QCString baseName=fileName;
int i;
if ((i=baseName.findRev('/'))!=-1)
@@ -1291,11 +1670,12 @@ void DocbookDocVisitor::startMscFile(const QCString &fileName,
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
m_t << "<para>" << endl;
- visitPreStart(m_t, hasCaption, baseName + ".png", width, height);
+ visitPreStart(m_t, children, hasCaption, baseName + ".png", width, height);
}
void DocbookDocVisitor::endMscFile(bool hasCaption)
{
+DB_VIS_C
if (m_hide) return;
visitPostEnd(m_t, hasCaption);
m_t << "</para>" << endl;
@@ -1303,6 +1683,7 @@ void DocbookDocVisitor::endMscFile(bool hasCaption)
void DocbookDocVisitor::writeDiaFile(const QCString &baseName, DocVerbatim *s)
{
+DB_VIS_C
QCString shortName = baseName;
int i;
if ((i=shortName.findRev('/'))!=-1)
@@ -1311,17 +1692,19 @@ void DocbookDocVisitor::writeDiaFile(const QCString &baseName, DocVerbatim *s)
}
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
writeDiaGraphFromFile(baseName+".dia",outDir,shortName,DIA_BITMAP);
- visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height());
- visitCaption(this, s->children());
+ visitPreStart(m_t, s->children(), s->hasCaption(), shortName, s->width(),s->height());
+ visitCaption(s->children());
visitPostEnd(m_t, s->hasCaption());
}
void DocbookDocVisitor::startDiaFile(const QCString &fileName,
const QCString &width,
const QCString &height,
- bool hasCaption
+ bool hasCaption,
+ const QList<DocNode> &children
)
{
+DB_VIS_C
QCString baseName=fileName;
int i;
if ((i=baseName.findRev('/'))!=-1)
@@ -1336,11 +1719,12 @@ void DocbookDocVisitor::startDiaFile(const QCString &fileName,
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP);
m_t << "<para>" << endl;
- visitPreStart(m_t, hasCaption, baseName + ".png", width, height);
+ visitPreStart(m_t, children, hasCaption, baseName + ".png", width, height);
}
void DocbookDocVisitor::endDiaFile(bool hasCaption)
{
+DB_VIS_C
if (m_hide) return;
visitPostEnd(m_t, hasCaption);
m_t << "</para>" << endl;
@@ -1348,6 +1732,7 @@ void DocbookDocVisitor::endDiaFile(bool hasCaption)
void DocbookDocVisitor::writeDotFile(const QCString &baseName, DocVerbatim *s)
{
+DB_VIS_C
QCString shortName = baseName;
int i;
if ((i=shortName.findRev('/'))!=-1)
@@ -1356,17 +1741,19 @@ void DocbookDocVisitor::writeDotFile(const QCString &baseName, DocVerbatim *s)
}
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
writeDotGraphFromFile(baseName+".dot",outDir,shortName,GOF_BITMAP);
- visitPreStart(m_t, s->hasCaption(), baseName + ".dot", s->width(),s->height());
- visitCaption(this, s->children());
+ visitPreStart(m_t, s->children(), s->hasCaption(), s->relPath() + shortName + "." + getDotImageExtension(), s->width(),s->height());
+ visitCaption(s->children());
visitPostEnd(m_t, s->hasCaption());
}
void DocbookDocVisitor::startDotFile(const QCString &fileName,
const QCString &width,
const QCString &height,
- bool hasCaption
+ bool hasCaption,
+ const QList<DocNode> &children
)
{
+DB_VIS_C
QCString baseName=fileName;
int i;
if ((i=baseName.findRev('/'))!=-1)
@@ -1382,11 +1769,12 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName,
QCString imgExt = getDotImageExtension();
writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP);
m_t << "<para>" << endl;
- visitPreStart(m_t, hasCaption, baseName + "." + imgExt, width, height);
+ visitPreStart(m_t, children, hasCaption, baseName + "." + imgExt, width, height);
}
void DocbookDocVisitor::endDotFile(bool hasCaption)
{
+DB_VIS_C
if (m_hide) return;
m_t << endl;
visitPostEnd(m_t, hasCaption);
diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h
index 6c7976c..24b1fbb 100644
--- a/src/docbookvisitor.h
+++ b/src/docbookvisitor.h
@@ -20,7 +20,9 @@
#include "docvisitor.h"
#include <qstack.h>
+#include <qlist.h>
#include <qcstring.h>
+#include <docparser.h>
class FTextStream;
class CodeOutputInterface;
@@ -31,6 +33,7 @@ class DocbookDocVisitor : public DocVisitor
{
public:
DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci);
+ ~DocbookDocVisitor();
//--------------------------------------
// visitor functions for leaf nodes
//--------------------------------------
@@ -38,6 +41,7 @@ class DocbookDocVisitor : public DocVisitor
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
void visit(DocSymbol *);
+ void visit(DocEmoji *);
void visit(DocURL *);
void visit(DocLineBreak *);
void visit(DocHorRuler *);
@@ -145,18 +149,27 @@ class DocbookDocVisitor : public DocVisitor
void pushEnabled();
void popEnabled();
void startMscFile(const QCString &fileName,const QCString &width,
- const QCString &height, bool hasCaption);
+ const QCString &height, bool hasCaption,const QList<DocNode> &children);
void endMscFile(bool hasCaption);
void writeMscFile(const QCString &fileName, DocVerbatim *s);
void startDiaFile(const QCString &fileName,const QCString &width,
- const QCString &height, bool hasCaption);
+ const QCString &height, bool hasCaption,const QList<DocNode> &children);
void endDiaFile(bool hasCaption);
void writeDiaFile(const QCString &fileName, DocVerbatim *s);
void startDotFile(const QCString &fileName,const QCString &width,
- const QCString &height, bool hasCaption);
+ const QCString &height, bool hasCaption,const QList<DocNode> &children);
void endDotFile(bool hasCaption);
void writeDotFile(const QCString &fileName, DocVerbatim *s);
void writePlantUMLFile(const QCString &fileName, DocVerbatim *s);
+ void visitPreStart(FTextStream &t,
+ const QList<DocNode> &children,
+ bool hasCaption,
+ const QCString &name,
+ const QCString &width,
+ const QCString &height,
+ bool inlineImage = FALSE);
+ void visitPostEnd(FTextStream &t, bool hasCaption, bool inlineImage = FALSE);
+ void visitCaption(const QList<DocNode> &children);
//--------------------------------------
// state variables
//--------------------------------------
diff --git a/src/docparser.cpp b/src/docparser.cpp
index b39b80e..7fb467f 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -55,6 +55,9 @@
#include "growbuf.h"
#include "markdown.h"
#include "htmlentity.h"
+#include "emoji.h"
+
+#define TK_COMMAND_CHAR(token) ((token)==TK_COMMAND_AT ? '@' : '\\')
// debug off
#define DBG(x) do {} while(0)
@@ -266,7 +269,7 @@ static void unescapeCRef(QCString &s)
* copies the image to the output directory (which depends on the \a type
* parameter).
*/
-static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
+static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool dowarn = true)
{
QCString result;
bool ambig;
@@ -334,7 +337,8 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
}
else
{
- printf("Source & Destination are the same!\n");
+ warn(g_fileName,doctokenizerYYlineno,
+ "Prevented to copy file %s onto itself!\n",qPrint(inputFile));
}
}
else
@@ -362,7 +366,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
return baseName;
}
}
- else if (ambig)
+ else if (ambig && dowarn)
{
QCString text;
text.sprintf("image file name %s is ambiguous.\n",qPrint(fileName));
@@ -373,7 +377,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
else
{
result=fileName;
- if (result.left(5)!="http:" && result.left(6)!="https:")
+ if (result.left(5)!="http:" && result.left(6)!="https:" && dowarn)
{
warn_doc_error(g_fileName,doctokenizerYYlineno,
"image file %s is not found in IMAGE_PATH: "
@@ -866,7 +870,31 @@ static bool findDocsForMemberOrCompound(const char *commandName,
return FALSE;
}
//---------------------------------------------------------------------------
+inline void errorHandleDefaultToken(DocNode *parent,int tok,
+ QList<DocNode> &children,const char *txt)
+{
+ switch (tok)
+ {
+ case TK_COMMAND_AT:
+ // fall through
+ case TK_COMMAND_BS:
+ children.append(new DocWord(parent,TK_COMMAND_CHAR(tok) + g_token->name));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a %s",
+ qPrint(TK_COMMAND_CHAR(tok) + g_token->name), txt);
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found found as part of a %s",
+ qPrint(g_token->name), txt);
+ break;
+ default:
+ children.append(new DocWord(parent,g_token->name));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s found as part of a %s",
+ tokToString(tok), txt);
+ break;
+ }
+}
+//---------------------------------------------------------------------------
// forward declaration
static bool defaultHandleToken(DocNode *parent,int tok,
QList<DocNode> &children,bool
@@ -876,6 +904,7 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
const QCString &cmdName)
{
DBG(("handleStyleArgument(%s)\n",qPrint(cmdName)));
+ QCString saveCmdName = cmdName;
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
@@ -901,14 +930,6 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
{
switch (tok)
{
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command \\%s as the argument of a \\%s command",
- qPrint(g_token->name),qPrint(cmdName));
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found while handling command %s",
- qPrint(g_token->name),qPrint(cmdName));
- break;
case TK_HTMLTAG:
if (insideLI(parent) && Mappers::htmlTagMapper->map(g_token->name) && g_token->endTag)
{ // ignore </li> as the end of a style command
@@ -917,8 +938,7 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
return tok;
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s while handling command %s",
- tokToString(tok),qPrint(cmdName));
+ errorHandleDefaultToken(parent,tok,children,"\\" + saveCmdName + " command");
break;
}
break;
@@ -1297,21 +1317,7 @@ static void defaultHandleTitleAndSize(const int cmd, DocNode *parent, QList<DocN
}
if (!defaultHandleToken(parent,tok,children))
{
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\%s",
- qPrint(g_token->name), Mappers::cmdMapper->find(cmd).data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok));
- break;
- }
+ errorHandleDefaultToken(parent,tok,children,Mappers::cmdMapper->find(cmd).data());
}
}
// parse size attributes
@@ -1369,8 +1375,8 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children
handleWord)
{
DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno));
- if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
- tok==TK_COMMAND || tok==TK_HTMLTAG
+ if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
+ tok==TK_COMMAND_AT || tok==TK_COMMAND_BS || tok==TK_HTMLTAG
)
{
DBG((" name=%s",qPrint(g_token->name)));
@@ -1380,7 +1386,9 @@ reparsetoken:
QCString tokenName = g_token->name;
switch (tok)
{
- case TK_COMMAND:
+ case TK_COMMAND_AT:
+ // fall through
+ case TK_COMMAND_BS:
switch (Mappers::cmdMapper->map(tokenName))
{
case CMD_BSLASH:
@@ -1564,6 +1572,9 @@ reparsetoken:
doctokenizerYYsetStatePara();
}
break;
+ case CMD_IMAGE:
+ ((DocPara *)parent) -> handleImage("image");
+ break;
default:
return FALSE;
}
@@ -1750,7 +1761,8 @@ static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribL
// and remove the src attribute
bool result = attrList.remove(index);
ASSERT(result);
- DocImage *img = new DocImage(parent,attrList,opt->value,DocImage::Html,opt->value);
+ DocImage::Type t = DocImage::Html;
+ DocImage *img = new DocImage(parent,attrList,findAndCopyImage(opt->value,t,false),t,opt->value);
children.append(img);
found = TRUE;
}
@@ -1771,6 +1783,27 @@ DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName)
//---------------------------------------------------------------------------
+DocEmoji::DocEmoji(DocNode *parent,const QCString &symName) :
+ m_symName(symName), m_index(-1)
+{
+ m_parent = parent;
+ QCString locSymName = symName;
+ int len=locSymName.length();
+ if (len>0)
+ {
+ if (locSymName.at(0)!=':') locSymName.prepend(":");
+ if (locSymName.at(len-1)!=':') locSymName.append(":");
+ }
+ m_symName = locSymName;
+ m_index = EmojiEntityMapper::instance()->symbol2index(m_symName);
+ if (m_index==-1)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Found unsupported emoji symbol '%s'\n",qPrint(m_symName));
+ }
+}
+
+//---------------------------------------------------------------------------
+
static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
const QCString &doc)
{
@@ -1900,11 +1933,8 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Empty anchor label");
}
- if (newAnchor) // found <a name="label">
- {
- m_anchor = id;
- }
- else if (id.left(CiteConsts::anchorPrefix.length()) == CiteConsts::anchorPrefix)
+
+ if (id.left(CiteConsts::anchorPrefix.length()) == CiteConsts::anchorPrefix)
{
CiteInfo *cite = Doxygen::citeDict->find(id.mid(CiteConsts::anchorPrefix.length()));
if (cite)
@@ -1919,6 +1949,10 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
m_file = "invalid";
}
}
+ else if (newAnchor) // found <a name="label">
+ {
+ m_anchor = id;
+ }
else // found \anchor label
{
SectionInfo *sec = Doxygen::sectionDict->find(id);
@@ -2330,21 +2364,7 @@ void DocSecRefItem::parse()
{
if (!defaultHandleToken(this,tok,m_children))
{
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\refitem",
- qPrint(g_token->name));
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok));
- break;
- }
+ errorHandleDefaultToken(this,tok,m_children,"\\refitem");
}
}
doctokenizerYYsetStatePara();
@@ -2392,7 +2412,7 @@ void DocSecRefList::parse()
// handle items
while (tok)
{
- if (tok==TK_COMMAND)
+ if (tok==TK_COMMAND_AT || tok == TK_COMMAND_BS)
{
switch (Mappers::cmdMapper->map(g_token->name))
{
@@ -2472,21 +2492,7 @@ void DocInternalRef::parse()
{
if (!defaultHandleToken(this,tok,m_children))
{
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\ref",
- qPrint(g_token->name));
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok));
- break;
- }
+ errorHandleDefaultToken(this,tok,m_children,"\\ref");
}
}
@@ -2630,19 +2636,10 @@ void DocRef::parse()
{
switch (tok)
{
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\ref",
- qPrint(g_token->name));
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
case TK_HTMLTAG:
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok));
+ errorHandleDefaultToken(this,tok,m_children,"\\ref");
break;
}
}
@@ -2753,7 +2750,9 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
{
switch (tok)
{
- case TK_COMMAND:
+ case TK_COMMAND_AT:
+ // fall through
+ case TK_COMMAND_BS:
switch (Mappers::cmdMapper->map(g_token->name))
{
case CMD_ENDLINK:
@@ -2769,13 +2768,13 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
}
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found as part of a \\link",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
if (g_token->name!="see" || !isXmlLink)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected xml/html command %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected xml/html command %s found as part of a \\link",
qPrint(g_token->name));
}
goto endlink;
@@ -2953,21 +2952,7 @@ void DocVhdlFlow::parse()
{
if (!defaultHandleToken(this,tok,m_children))
{
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\vhdlflow",
- qPrint(g_token->name));
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok));
- break;
- }
+ errorHandleDefaultToken(this,tok,m_children,"\\vhdlflow");
}
}
tok=doctokenizerYYlex();
@@ -2985,10 +2970,10 @@ void DocVhdlFlow::parse()
//---------------------------------------------------------------------------
DocImage::DocImage(DocNode *parent,const HtmlAttribList &attribs,const QCString &name,
- Type t,const QCString &url) :
- m_attribs(attribs), m_name(name),
+ Type t,const QCString &url, bool inlineImage) :
+ m_attribs(attribs), m_name(name),
m_type(t), m_relPath(g_relPath),
- m_url(url)
+ m_url(url), m_inlineImage(inlineImage)
{
m_parent = parent;
}
@@ -3014,10 +2999,6 @@ int DocHtmlHeader::parse()
{
switch (tok)
{
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <h%d> tag",
- qPrint(g_token->name),m_level);
- break;
case TK_HTMLTAG:
{
int tagId=Mappers::htmlTagMapper->map(g_token->name);
@@ -3092,17 +3073,12 @@ int DocHtmlHeader::parse()
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <h%d> context",
g_token->endTag?"/":"",qPrint(g_token->name),m_level);
}
-
}
break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok));
- break;
+ char tmp[20];
+ sprintf(tmp,"<h%d>tag",m_level);
+ errorHandleDefaultToken(this,tok,m_children,tmp);
}
}
}
@@ -3134,16 +3110,7 @@ int DocHRef::parse()
{
switch (tok)
{
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <a>..</a> block",
- qPrint(g_token->name));
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
case TK_HTMLTAG:
-
{
int tagId=Mappers::htmlTagMapper->map(g_token->name);
if (tagId==HTML_A && g_token->endTag) // found </a> tag
@@ -3158,8 +3125,7 @@ int DocHRef::parse()
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok),doctokenizerYYlineno);
+ errorHandleDefaultToken(this,tok,m_children,"<a>..</a> block");
break;
}
}
@@ -3292,29 +3258,31 @@ int DocIndexEntry::parse()
}
}
break;
- case TK_COMMAND:
- switch (Mappers::cmdMapper->map(g_token->name))
- {
- case CMD_BSLASH: m_entry+='\\'; break;
- case CMD_AT: m_entry+='@'; break;
- case CMD_LESS: m_entry+='<'; break;
- case CMD_GREATER: m_entry+='>'; break;
- case CMD_AMP: m_entry+='&'; break;
- case CMD_DOLLAR: m_entry+='$'; break;
- case CMD_HASH: m_entry+='#'; break;
- case CMD_DCOLON: m_entry+="::"; break;
- case CMD_PERCENT: m_entry+='%'; break;
- case CMD_NDASH: m_entry+="--"; break;
- case CMD_MDASH: m_entry+="---"; break;
- case CMD_QUOTE: m_entry+='"'; break;
- case CMD_PUNT: m_entry+='.'; break;
- case CMD_PLUS: m_entry+='+'; break;
- case CMD_MINUS: m_entry+='-'; break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command %s found as argument of \\addindex",
- qPrint(g_token->name));
- break;
- }
+ case TK_COMMAND_AT:
+ // fall through
+ case TK_COMMAND_BS:
+ switch (Mappers::cmdMapper->map(g_token->name))
+ {
+ case CMD_BSLASH: m_entry+='\\'; break;
+ case CMD_AT: m_entry+='@'; break;
+ case CMD_LESS: m_entry+='<'; break;
+ case CMD_GREATER: m_entry+='>'; break;
+ case CMD_AMP: m_entry+='&'; break;
+ case CMD_DOLLAR: m_entry+='$'; break;
+ case CMD_HASH: m_entry+='#'; break;
+ case CMD_DCOLON: m_entry+="::"; break;
+ case CMD_PERCENT: m_entry+='%'; break;
+ case CMD_NDASH: m_entry+="--"; break;
+ case CMD_MDASH: m_entry+="---"; break;
+ case CMD_QUOTE: m_entry+='"'; break;
+ case CMD_PUNT: m_entry+='.'; break;
+ case CMD_PLUS: m_entry+='+'; break;
+ case CMD_MINUS: m_entry+='-'; break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command %s found as argument of \\addindex",
+ qPrint(g_token->name));
+ break;
+ }
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
@@ -3380,14 +3348,6 @@ int DocHtmlCaption::parse()
{
switch (tok)
{
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <caption> tag",
- qPrint(g_token->name));
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
case TK_HTMLTAG:
{
int tagId=Mappers::htmlTagMapper->map(g_token->name);
@@ -3404,8 +3364,7 @@ int DocHtmlCaption::parse()
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok));
+ errorHandleDefaultToken(this,tok,m_children,"<caption> tag");
break;
}
}
@@ -3919,7 +3878,9 @@ int DocHtmlDescTitle::parse()
{
switch (tok)
{
- case TK_COMMAND:
+ case TK_COMMAND_AT:
+ // fall through
+ case TK_COMMAND_BS:
{
QCString cmdName=g_token->name;
bool isJavaLink=FALSE;
@@ -3930,7 +3891,7 @@ int DocHtmlDescTitle::parse()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
qPrint(g_token->name));
}
else
@@ -3939,7 +3900,7 @@ int DocHtmlDescTitle::parse()
tok=doctokenizerYYlex(); // get the reference id
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of \\%s command",
tokToString(tok),qPrint(cmdName));
}
else
@@ -3960,7 +3921,7 @@ int DocHtmlDescTitle::parse()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
qPrint(cmdName));
}
else
@@ -3969,7 +3930,7 @@ int DocHtmlDescTitle::parse()
tok=doctokenizerYYlex();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of \\%s command",
tokToString(tok),qPrint(cmdName));
}
else
@@ -3988,13 +3949,13 @@ int DocHtmlDescTitle::parse()
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <dt> tag",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command \\%s found as part of a <dt> tag",
qPrint(g_token->name));
}
}
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol \\%s found as part of a <dt> tag",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
@@ -4035,7 +3996,7 @@ int DocHtmlDescTitle::parse()
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s found as part of a <dt> tag",
tokToString(tok));
break;
}
@@ -4540,21 +4501,7 @@ void DocTitle::parse()
{
if (!defaultHandleToken(this,tok,m_children))
{
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a title section",
- qPrint(g_token->name));
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
- qPrint(g_token->name));
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
- tokToString(tok));
- break;
- }
+ errorHandleDefaultToken(this,tok,m_children,"title section");
}
}
doctokenizerYYsetStatePara();
@@ -5010,6 +4957,35 @@ void DocPara::handleCite()
doctokenizerYYsetStatePara();
}
+void DocPara::handleEmoji()
+{
+ // get the argument of the emoji command.
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
+ qPrint("emoji"));
+ return;
+ }
+ doctokenizerYYsetStateEmoji();
+ tok=doctokenizerYYlex();
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ "argument of command %s\n", qPrint("emoji"));
+ return;
+ }
+ else if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint("emoji"));
+ return;
+ }
+ DocEmoji *emoji = new DocEmoji(this,g_token->name);
+ m_children.append(emoji);
+ doctokenizerYYsetStatePara();
+}
+
int DocPara::handleXRefItem()
{
int retval=doctokenizerYYlex();
@@ -5088,13 +5064,50 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
void DocPara::handleImage(const QCString &cmdName)
{
QCString saveCmdName = cmdName;
+ bool inlineImage = FALSE;
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
+ if (tok==TK_WORD)
+ {
+ if (g_token->name == "{")
+ {
+ while ((tok=doctokenizerYYlex())==TK_WHITESPACE);
+ if (g_token->name != "}") // non-empty option string
+ {
+ if (g_token->name.lower() != "inline")
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"currently only 'inline' suported as option of %s command",
+ qPrint(saveCmdName));
+ }
+ else
+ {
+ inlineImage = TRUE;
+ }
+ while ((tok=doctokenizerYYlex())==TK_WHITESPACE);
+ }
+ if (!((tok==TK_WORD) && (g_token->name == "}")))
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected closing '}' at option of %s command",
+ qPrint(saveCmdName));
+ return;
+ }
+ tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command with option",
+ qPrint(saveCmdName));
+ return;
+ }
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(saveCmdName));
- return;
+ return;
+ }
}
tok=doctokenizerYYlex();
if (tok!=TK_WORD && tok!=TK_LNKWORD)
@@ -5133,7 +5146,7 @@ void DocPara::handleImage(const QCString &cmdName)
return;
}
HtmlAttribList attrList;
- DocImage *img = new DocImage(this,attrList,findAndCopyImage(g_token->name,t),t);
+ DocImage *img = new DocImage(this,attrList,findAndCopyImage(g_token->name,t),t,"",inlineImage);
m_children.append(img);
img->parse();
}
@@ -5227,6 +5240,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
{
DBG(("handleInclude(%s)\n",qPrint(cmdName)));
int tok=doctokenizerYYlex();
+ bool isBlock = false;
if (tok==TK_WORD && g_token->name=="{")
{
doctokenizerYYsetStateOptions();
@@ -5251,6 +5265,14 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
}
tok=doctokenizerYYlex();
}
+ else if (tok==TK_WORD && g_token->name=="[")
+ {
+ doctokenizerYYsetStateBlock();
+ tok=doctokenizerYYlex();
+ isBlock = (g_token->name.stripWhiteSpace() == "block");
+ doctokenizerYYsetStatePara();
+ tok=doctokenizerYYlex();
+ }
else if (tok!=TK_WHITESPACE)
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
@@ -5309,7 +5331,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
}
else
{
- DocInclude *inc = new DocInclude(this,fileName,g_context,t,g_isExample,g_exampleName,blockId);
+ DocInclude *inc = new DocInclude(this,fileName,g_context,t,g_isExample,g_exampleName,blockId,isBlock);
m_children.append(inc);
inc->parse();
}
@@ -5415,7 +5437,7 @@ void DocPara::handleInheritDoc()
}
-int DocPara::handleCommand(const QCString &cmdName)
+int DocPara::handleCommand(const QCString &cmdName, const int tok)
{
DBG(("handleCommand(%s)\n",qPrint(cmdName)));
int retval = RetVal_OK;
@@ -5423,6 +5445,7 @@ int DocPara::handleCommand(const QCString &cmdName)
switch (cmdId)
{
case CMD_UNKNOWN:
+ m_children.append(new DocWord(this,TK_COMMAND_CHAR(tok) + cmdName));
warn_doc_error(g_fileName,doctokenizerYYlineno,"Found unknown command `\\%s'",qPrint(cmdName));
break;
case CMD_EMPHASIS:
@@ -5847,6 +5870,9 @@ int DocPara::handleCommand(const QCString &cmdName)
case CMD_CITE:
handleCite();
break;
+ case CMD_EMOJI:
+ handleEmoji();
+ break;
case CMD_REF: // fall through
case CMD_SUBPAGE:
handleRef(cmdName);
@@ -6524,8 +6550,8 @@ int DocPara::parse()
{
reparsetoken:
DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno));
- if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
- tok==TK_COMMAND || tok==TK_HTMLTAG
+ if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
+ tok==TK_COMMAND_AT || tok == TK_COMMAND_BS || tok==TK_HTMLTAG
)
{
DBG((" name=%s",qPrint(g_token->name)));
@@ -6623,7 +6649,7 @@ reparsetoken:
}
else // other section
{
- tok = TK_COMMAND;
+ tok = TK_COMMAND_BS;
}
DBG(("reparsing command %s\n",qPrint(g_token->name)));
goto reparsetoken;
@@ -6668,7 +6694,9 @@ reparsetoken:
"list items");
}
break;
- case TK_COMMAND:
+ case TK_COMMAND_AT:
+ // fall through
+ case TK_COMMAND_BS:
{
// see if we have to start a simple section
int cmd = Mappers::cmdMapper->map(g_token->name);
@@ -6704,7 +6732,7 @@ reparsetoken:
}
// handle the command
- retval=handleCommand(g_token->name);
+ retval=handleCommand(g_token->name,tok);
DBG(("handleCommand returns %x\n",retval));
// check the return value
@@ -6722,7 +6750,7 @@ reparsetoken:
}
else // other section
{
- tok = TK_COMMAND;
+ tok = TK_COMMAND_BS;
}
DBG(("reparsing command %s\n",qPrint(g_token->name)));
goto reparsetoken;
@@ -6994,7 +7022,9 @@ void DocText::parse()
}
}
break;
- case TK_COMMAND:
+ case TK_COMMAND_AT:
+ // fall through
+ case TK_COMMAND_BS:
switch (Mappers::cmdMapper->map(g_token->name))
{
case CMD_BSLASH:
@@ -7413,7 +7443,7 @@ QString::Direction getTextDirByConfig(const DocPara *para, int nodeIndex)
return QString::DirNeutral;
}
-QCString getDirHtmlClassOfNode(QString::Direction textDir, const char *initValue)
+QCString getDirHtmlClassOfNode(QString::Direction textDir, const QCString &initValue)
{
QCString classFromDir;
if (textDir == QString::DirLTR)
@@ -7423,9 +7453,9 @@ QCString getDirHtmlClassOfNode(QString::Direction textDir, const char *initValue
else
classFromDir = "";
- if (initValue != NULL && !classFromDir.isEmpty())
+ if (initValue && !classFromDir.isEmpty())
return QCString(" class=\"") + initValue + " " + classFromDir + "\"";
- if (initValue != NULL)
+ if (initValue)
return QCString(" class=\"") + initValue + "\"";
if (!classFromDir.isEmpty())
return QCString(" class=\"") + classFromDir + "\"";
diff --git a/src/docparser.h b/src/docparser.h
index 6b75426..a465f20 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -37,7 +37,7 @@ class SectionDict;
QString::Direction getTextDirByConfig(const QString &text);
QString::Direction getTextDirByConfig(const DocNode *node);
QString::Direction getTextDirByConfig(const DocPara *para, int nodeIndex);
-QCString getDirHtmlClassOfNode(QString::Direction textDir, const char *initValue = NULL);
+QCString getDirHtmlClassOfNode(QString::Direction textDir, const QCString &initValue="");
QCString getDirHtmlClassOfPage(QCString pageTitle);
QCString getHtmlDirEmbedingChar(QString::Direction textDir);
QCString getJsDirEmbedingChar(QString::Direction textDir);
@@ -140,7 +140,8 @@ class DocNode
Kind_HtmlBlockQuote = 49,
Kind_VhdlFlow = 50,
Kind_ParBlock = 51,
- Kind_DiaFile = 52
+ Kind_DiaFile = 52,
+ Kind_Emoji = 53
};
/*! Creates a new node */
DocNode() : m_parent(0), m_insidePre(FALSE) {}
@@ -454,7 +455,7 @@ class DocSymbol : public DocNode
/* doxygen commands mapped */
Sym_BSlash, Sym_At, Sym_Less, Sym_Greater, Sym_Amp,
Sym_Dollar, Sym_Hash, Sym_DoubleColon, Sym_Percent, Sym_Pipe,
- Sym_Quot, Sym_Minus, Sym_Plus, Sym_Dot
+ Sym_Quot, Sym_Minus, Sym_Plus, Sym_Dot, Sym_Colon
};
enum PerlType { Perl_unknown = 0, Perl_string, Perl_char, Perl_symbol, Perl_umlaut,
Perl_acute, Perl_grave, Perl_circ, Perl_slash, Perl_tilde,
@@ -475,6 +476,21 @@ class DocSymbol : public DocNode
SymType m_symbol;
};
+/** Node representing a n emoji */
+class DocEmoji : public DocNode
+{
+ public:
+ DocEmoji(DocNode *parent,const QCString &symName);
+ QCString name() const { return m_symName; }
+ int index() const { return m_index; }
+ Kind kind() const { return Kind_Emoji; }
+ void accept(DocVisitor *v) { v->visit(this); }
+
+ private:
+ QCString m_symName;
+ int m_index;
+};
+
/** Node representing some amount of white space */
class DocWhiteSpace : public DocNode
{
@@ -482,7 +498,7 @@ class DocWhiteSpace : public DocNode
DocWhiteSpace(DocNode *parent,const QCString &chars) :
m_chars(chars) { m_parent = parent; }
Kind kind() const { return Kind_WhiteSpace; }
- QCString chars() const { return m_chars; }
+ QCString chars() const { return m_chars; }
void accept(DocVisitor *v) { v->visit(this); }
private:
QCString m_chars;
@@ -539,10 +555,10 @@ class DocInclude : public DocNode
DocInclude(DocNode *parent,const QCString &file,
const QCString context, Type t,
bool isExample,const QCString exampleFile,
- const QCString blockId) :
+ const QCString blockId, bool isBlock) :
m_file(file), m_context(context), m_type(t),
m_isExample(isExample), m_exampleFile(exampleFile),
- m_blockId(blockId) { m_parent = parent; }
+ m_blockId(blockId), m_isBlock(isBlock) { m_parent = parent; }
Kind kind() const { return Kind_Include; }
QCString file() const { return m_file; }
QCString extension() const { int i=m_file.findRev('.');
@@ -557,6 +573,7 @@ class DocInclude : public DocNode
QCString blockId() const { return m_blockId; }
bool isExample() const { return m_isExample; }
QCString exampleFile() const { return m_exampleFile; }
+ bool isBlock() const { return m_isBlock; }
void accept(DocVisitor *v) { v->visit(this); }
void parse();
@@ -566,6 +583,7 @@ class DocInclude : public DocNode
QCString m_text;
Type m_type;
bool m_isExample;
+ bool m_isBlock;
QCString m_exampleFile;
QCString m_blockId;
};
@@ -707,6 +725,7 @@ class DocTitle : public CompAccept<DocTitle>
void parse();
void parseFromString(const QCString &title);
Kind kind() const { return Kind_Title; }
+ bool hasTitle() const { return !m_children.isEmpty(); }
private:
};
@@ -739,7 +758,7 @@ class DocImage : public CompAccept<DocImage>
public:
enum Type { Html, Latex, Rtf, DocBook };
DocImage(DocNode *parent,const HtmlAttribList &attribs,
- const QCString &name,Type t,const QCString &url=QCString());
+ const QCString &name,Type t,const QCString &url=QCString(), bool inlineImage = TRUE);
Kind kind() const { return Kind_Image; }
Type type() const { return m_type; }
QCString name() const { return m_name; }
@@ -748,6 +767,7 @@ class DocImage : public CompAccept<DocImage>
QCString height() const { return m_height; }
QCString relPath() const { return m_relPath; }
QCString url() const { return m_url; }
+ bool isInlineImage() const { return m_inlineImage; }
const HtmlAttribList &attribs() const { return m_attribs; }
void parse();
@@ -759,6 +779,7 @@ class DocImage : public CompAccept<DocImage>
QCString m_height;
QCString m_relPath;
QCString m_url;
+ bool m_inlineImage;
};
/** Node representing a dot file */
@@ -1092,6 +1113,7 @@ class DocSimpleSect : public CompAccept<DocSimpleSect>
int parseRcs();
int parseXml();
void appendLinkWord(const QCString &word);
+ bool hasTitle() const { return m_title->hasTitle(); }
private:
Type m_type;
@@ -1153,7 +1175,7 @@ class DocPara : public CompAccept<DocPara>
bool isFirst() const { return m_isFirst; }
bool isLast() const { return m_isLast; }
- int handleCommand(const QCString &cmdName);
+ int handleCommand(const QCString &cmdName,const int tok);
int handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &tagHtmlAttribs);
int handleHtmlEndTag(const QCString &tagName);
int handleSimpleSection(DocSimpleSect::Type t,bool xmlContext=FALSE);
@@ -1167,6 +1189,7 @@ class DocPara : public CompAccept<DocPara>
void handleInclude(const QCString &cmdName,DocInclude::Type t);
void handleLink(const QCString &cmdName,bool isJavaLink);
void handleCite();
+ void handleEmoji();
void handleRef(const QCString &cmdName);
void handleSection(const QCString &cmdName);
void handleInheritDoc();
@@ -1370,7 +1393,7 @@ class DocHtmlTable : public CompAccept<DocHtmlTable>
{
public:
DocHtmlTable(DocNode *parent,const HtmlAttribList &attribs)
- : m_attribs(attribs) { m_caption=0; m_parent = parent; }
+ : m_attribs(attribs) { m_caption=0; m_numCols=0; m_parent = parent; }
~DocHtmlTable() { delete m_caption; }
Kind kind() const { return Kind_HtmlTable; }
uint numRows() const { return m_children.count(); }
diff --git a/src/docsets.cpp b/src/docsets.cpp
index 29b7616..1327d80 100644
--- a/src/docsets.cpp
+++ b/src/docsets.cpp
@@ -334,6 +334,7 @@ void DocSets::addIndexItem(Definition *context,MemberDef *md,
case SrcLangExt_SQL: lang="sql"; break; // Sql
case SrcLangExt_Tcl: lang="tcl"; break; // Tcl
case SrcLangExt_Markdown:lang="markdown"; break; // Markdown
+ case SrcLangExt_Slice: lang="slice"; break; // Slice
case SrcLangExt_Unknown: lang="unknown"; break; // should not happen!
}
@@ -401,6 +402,10 @@ void DocSets::addIndexItem(Definition *context,MemberDef *md,
type="ifc"; break;
case MemberType_Service:
type="svc"; break;
+ case MemberType_Sequence:
+ type="sequence"; break;
+ case MemberType_Dictionary:
+ type="dictionary"; break;
}
cd = md->getClassDef();
nd = md->getNamespaceDef();
diff --git a/src/doctokenizer.h b/src/doctokenizer.h
index b3b9fa5..8b8ca97 100644
--- a/src/doctokenizer.h
+++ b/src/doctokenizer.h
@@ -34,12 +34,13 @@ enum Tokens
TK_WHITESPACE = 3,
TK_LISTITEM = 4,
TK_ENDLIST = 5,
- TK_COMMAND = 6,
+ TK_COMMAND_AT = 6, //! Command starting with `@`
TK_HTMLTAG = 7,
TK_SYMBOL = 8,
TK_NEWPARA = 9,
TK_RCSTAG = 10,
TK_URL = 11,
+ TK_COMMAND_BS = 12, //! Command starting with `\`
RetVal_OK = 0x10000,
RetVal_SimpleSec = 0x10001,
@@ -164,5 +165,7 @@ void doctokenizerYYsetStatePlantUML();
void doctokenizerYYsetStateSetScope();
void doctokenizerYYsetStatePlantUMLOpt();
void doctokenizerYYsetStateOptions();
+void doctokenizerYYsetStateBlock();
+void doctokenizerYYsetStateEmoji();
#endif
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index f5e074c..bd1242d 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -38,9 +38,12 @@
#include "definition.h"
#include "doxygen.h"
#include "portable.h"
+#include "cite.h"
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+
+#define TK_COMMAND_SEL() (yytext[0] == '@' ? TK_COMMAND_AT : TK_COMMAND_BS)
//--------------------------------------------------------------------------
@@ -116,12 +119,13 @@ const char *tokToString(int token)
case TK_WHITESPACE: return "TK_WHITESPACE";
case TK_LISTITEM: return "TK_LISTITEM";
case TK_ENDLIST: return "TK_ENDLIST";
- case TK_COMMAND: return "TK_COMMAND";
+ case TK_COMMAND_AT: return "TK_COMMAND_AT";
case TK_HTMLTAG: return "TK_HTMLTAG";
case TK_SYMBOL: return "TK_SYMBOL";
case TK_NEWPARA: return "TK_NEWPARA";
case TK_RCSTAG: return "TK_RCSTAG";
case TK_URL: return "TK_URL";
+ case TK_COMMAND_BS: return "TK_COMMAND_BS";
}
return "ERROR";
}
@@ -257,6 +261,12 @@ static void handleHtmlTag()
if (i<(int)yyleng) c=tagText.at(++i);
}
opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
+ if (opt.name == "align") opt.value = opt.value.lower();
+ else if (opt.name == "valign")
+ {
+ opt.value = opt.value.lower();
+ if (opt.value == "center") opt.value="middle";
+ }
}
else // start next option
{
@@ -335,9 +345,9 @@ BLANK [ \t\r]
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
PHPTYPE [\\:a-z_A-Z0-9\x80-\xFF\-]+
-CITESCHAR [a-z_A-Z0-9\x80-\xFF]
-CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]*
-CITEID {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*
+CITESCHAR [a-z_A-Z0-9\x80-\xFF\-\?]
+CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/\?]
+CITEID {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*|"\""{CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*"\""
MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
OPTSTARS ("//"{BLANK}*)?"*"*{BLANK}*
LISTITEM {BLANK}*[-]("#")?{WS}
@@ -350,7 +360,7 @@ URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=]
URLMASK ({URLCHAR}+([({]{URLCHAR}*[)}])?)+
FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+@&#]
FILEECHAR [a-z_A-Z0-9\-\+@&#]
-HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)*
+HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)+
FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
VERBATIM "verbatim"{BLANK}*
@@ -358,6 +368,7 @@ SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---")
SPCMD2 {CMD}[\\@<>&$#%~".+|-]
SPCMD3 {CMD}form#[0-9]+
SPCMD4 {CMD}"::"
+SPCMD5 {CMD}":"
INOUT "inout"|"in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]"
VARARGS "..."
@@ -388,10 +399,10 @@ LNKWORD3 ([0-9a-z_A-Z\-]+("/"|"\\"))*[0-9a-z_A-Z\-]+("."[0-9a-z_A-Z]+)+
CHARWORDQ [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,."=']
ESCWORD ("%"{ID}(("::"|"."){ID})*)|("%'")
CHARWORDQ1 [^ \-+0-9\t\n\r\\@<>()\[\]:;\?{}&%$#,."=']
-WORD1 {ESCWORD}|{CHARWORDQ1}+|"{"|"}"|"'\"'"|("\""[^"\n]*\n?[^"\n]*"\"")
-WORD2 "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="|"'"
+WORD1 {ESCWORD}|{CHARWORDQ1}{CHARWORDQ}*|"{"|"}"|"'\"'"|("\""[^"\n]*\n?[^"\n]*"\"")
+WORD2 "."|","|"("|")"|"["|"]"|"::"|":"|";"|"\?"|"="|"'"
WORD1NQ {ESCWORD}|{CHARWORDQ}+|"{"|"}"
-WORD2NQ "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="|"'"
+WORD2NQ "."|","|"("|")"|"["|"]"|"::"|":"|";"|"\?"|"="|"'"
CAPTION [cC][aA][pP][tT][iI][oO][nN]
HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">"
HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"|"strike"|"u"
@@ -403,8 +414,8 @@ REFWORD2_NOCV {REFWORD2_PRE}("("{FUNCPART}")")?
REFWORD3 ({ID}":")*{ID}":"?
REFWORD4_NOCV (({SCOPEPRE}*"operator"{OPMASKOP2})|(("::"|"#"){SCOPEPRE}*"operator"{OPMASKOP2}))
REFWORD4 {REFWORD4_NOCV}{CVSPEC}?
-REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
-REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
+REFWORD {FILEMASK}|{LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
+REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
%option noyywrap
%option yylineno
@@ -448,6 +459,8 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
%x St_SetScope
%x St_SetScopeEnd
%x St_Options
+%x St_Block
+%x St_Emoji
%x St_Sections
%s St_SecLabel1
@@ -558,11 +571,11 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
}
<St_Para>"{"{BLANK}*"@link"/{BLANK}+ {
g_token->name = "javalink";
- return TK_COMMAND;
+ return TK_COMMAND_AT;
}
<St_Para>"{"{BLANK}*"@inheritDoc"{BLANK}*"}" {
g_token->name = "inheritdoc";
- return TK_COMMAND;
+ return TK_COMMAND_AT;
}
<St_Para>"@_fakenl" { // artificial new line
yylineno++;
@@ -572,22 +585,23 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
bool ok;
g_token->id = QCString(yytext).right((int)yyleng-6).toInt(&ok);
ASSERT(ok);
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<St_Para>{CMD}"n"\n { /* \n followed by real newline */
yylineno++;
g_token->name = yytext+1;
g_token->name = g_token->name.stripWhiteSpace();
g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<St_Para>{SPCMD1} |
<St_Para>{SPCMD2} |
+<St_Para>{SPCMD5} |
<St_Para>{SPCMD4} { /* special command */
g_token->name = yytext+1;
g_token->name = g_token->name.stripWhiteSpace();
g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<St_Para>{PARAMIO} { /* param [in,out] command */
g_token->name = "param";
@@ -613,7 +627,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
{
g_token->paramDir=TokenInfo::Unspecified;
}
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<St_Para>("http:"|"https:"|"ftp:"|"file:"|"news:"){URLMASK}/\. { // URL.
g_token->name=yytext;
@@ -659,7 +673,8 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
g_token->text = tagName.mid(text_begin,text_end-text_begin);
return TK_RCSTAG;
}
-<St_Para,St_HtmlOnly>"$("{ID}")" { /* environment variable */
+<St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}")" | /* environment variable */
+<St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}"("{ID}"))" { /* environment variable */
QCString name = &yytext[2];
name = name.left(name.length()-1);
QCString value = portable_getenv(name);
@@ -732,7 +747,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
}
<St_Text>[\\@<>&$#%~] {
g_token->name = yytext;
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<St_Para>({BLANK}*\n)+{BLANK}*\n/{LISTITEM} { /* skip trailing paragraph followed by new list item */
if (g_insidePre || g_autoListLevel==0)
@@ -925,7 +940,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_TitleN>{SPCMD2} { /* special command */
g_token->name = yytext+1;
g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<St_TitleN>{ID}"=" { /* attribute */
if (yytext[0]=='%') // strip % if present
@@ -959,7 +974,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_TitleQ>{SPCMD2} { /* special command */
g_token->name = yytext+1;
g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<St_TitleQ>{WORD1NQ} |
<St_TitleQ>{WORD2NQ} { /* word */
@@ -1005,7 +1020,15 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return 0;
}
<St_Cite>{CITEID} { // label to cite
- g_token->name=yytext;
+ if (yytext[0] =='"')
+ {
+ g_token->name=yytext+1;
+ g_token->name=g_token->name.left(yyleng-2);
+ }
+ else
+ {
+ g_token->name=yytext;
+ }
return TK_WORD;
}
<St_Cite>{BLANK} { // white space
@@ -1054,7 +1077,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_IntRef>{BLANK}+"\"" {
BEGIN(St_Ref2);
}
-<St_SetScope>({SCOPEMASK}|{ANONNS}){BLANK} {
+<St_SetScope>({SCOPEMASK}|{ANONNS}){BLANK}|{FILEMASK} {
g_token->name = yytext;
g_token->name = g_token->name.stripWhiteSpace();
return TK_WORD;
@@ -1090,7 +1113,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_Ref2>{SPCMD2} { /* special command */
g_token->name = yytext+1;
g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<St_Ref2>{WORD1NQ} |
<St_Ref2>{WORD2NQ} {
@@ -1158,6 +1181,19 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_Options>"}" {
return TK_WORD;
}
+<St_Block>{ID} {
+ g_token->name+=yytext;
+ }
+<St_Block>"]" {
+ return TK_WORD;
+ }
+<St_Emoji>[:0-9_a-z+-]+ {
+ g_token->name=yytext;
+ return TK_WORD;
+ }
+<St_Emoji>. {
+ return 0;
+ }
<St_File>{FILEMASK} {
g_token->name = yytext;
return TK_WORD;
@@ -1322,7 +1358,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<*>[\\@<>&$#%~"=] { /* unescaped special character */
//warn(g_fileName,yylineno,"Unexpected character `%s', assuming command \\%s was meant.",yytext,yytext);
g_token->name = yytext;
- return TK_COMMAND;
+ return TK_COMMAND_SEL();
}
<*>. {
warn(g_fileName,yylineno,"Unexpected character `%s'",yytext);
@@ -1526,6 +1562,18 @@ void doctokenizerYYsetStateOptions()
BEGIN(St_Options);
}
+void doctokenizerYYsetStateBlock()
+{
+ g_token->name="";
+ BEGIN(St_Block);
+}
+
+void doctokenizerYYsetStateEmoji()
+{
+ g_token->name="";
+ BEGIN(St_Emoji);
+}
+
void doctokenizerYYcleanup()
{
yy_delete_buffer( YY_CURRENT_BUFFER );
diff --git a/src/docvisitor.h b/src/docvisitor.h
index 18fb743..d2318c9 100644
--- a/src/docvisitor.h
+++ b/src/docvisitor.h
@@ -37,6 +37,7 @@ class DocAutoListItem;
class DocPara;
class DocRoot;
class DocSymbol;
+class DocEmoji;
class DocURL;
class DocStyleChange;
class DocSimpleSect;
@@ -101,6 +102,7 @@ class DocVisitor
virtual void visit(DocWord *) = 0;
virtual void visit(DocWhiteSpace *) = 0;
virtual void visit(DocSymbol *) = 0;
+ virtual void visit(DocEmoji *) = 0;
virtual void visit(DocURL *) = 0;
virtual void visit(DocStyleChange *) = 0;
virtual void visit(DocVerbatim *) = 0;
diff --git a/src/dot.cpp b/src/dot.cpp
index 7b29569..0944a02 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -24,6 +24,7 @@
#include <qthread.h>
#include <qmutex.h>
#include <qwaitcondition.h>
+#include <qregexp.h>
#include "dot.h"
#include "doxygen.h"
@@ -139,7 +140,7 @@ static const char svgZoomFooter[] =
" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
" </g>\n"
" </g>\n"
-// link to orginial SVG
+// link to original SVG
" <svg viewBox=\"0 0 15 15\" width=\"100%\" height=\"30px\" preserveAspectRatio=\"xMaxYMin meet\">\n"
" <g id=\"arrow_out\" transform=\"scale(0.3 0.3)\">\n"
" <a xlink:href=\"$orgname\" target=\"_base\">\n"
@@ -376,6 +377,7 @@ static bool convertMapFile(FTextStream &t,const char *mapName,
const QCString &context=QCString())
{
QFile f(mapName);
+ static QRegExp re("id=\"node[0-9]*\"");
if (!f.open(IO_ReadOnly))
{
err("problems opening map file %s for inclusion in the docs!\n"
@@ -394,7 +396,7 @@ static bool convertMapFile(FTextStream &t,const char *mapName,
if (buf.left(5)=="<area")
{
- t << replaceRef(buf,relPath,urlOnly,context);
+ t << replaceRef(buf,relPath,urlOnly,context).replace(re,"");
}
}
}
@@ -1108,12 +1110,18 @@ bool DotFilePatcher::run()
int n = sscanf(line.data()+i,"<!-- MAP %d",&mapId);
if (n==1 && mapId>=0 && mapId<(int)m_maps.count())
{
+ QGString result;
+ FTextStream tt(&result);
Map *map = m_maps.at(mapId);
//printf("patching MAP %d in file %s with contents of %s\n",
// mapId,m_patchFile.data(),map->mapFile.data());
- t << "<map name=\"" << map->label << "\" id=\"" << map->label << "\">" << endl;
- convertMapFile(t,map->mapFile,map->relPath,map->urlOnly,map->context);
- t << "</map>" << endl;
+ convertMapFile(tt,map->mapFile,map->relPath,map->urlOnly,map->context);
+ if (!result.isEmpty())
+ {
+ t << "<map name=\"" << map->label << "\" id=\"" << map->label << "\">" << endl;
+ t << result;
+ t << "</map>" << endl;
+ }
}
else // error invalid map id!
{
@@ -1383,6 +1391,11 @@ bool DotManager::run()
setDotFontPath(Config_getString(RTF_OUTPUT));
setPath=TRUE;
}
+ else if (Config_getBool(GENERATE_DOCBOOK))
+ {
+ setDotFontPath(Config_getString(DOCBOOK_OUTPUT));
+ setPath=TRUE;
+ }
portable_sysTimerStart();
// fill work queue with dot operations
DotRunner *dr;
@@ -1502,6 +1515,7 @@ DotNode::DotNode(int n,const char *lab,const char *tip, const char *url,
, m_visible(FALSE)
, m_truncated(Unknown)
, m_distance(1000)
+ , m_renumbered(false)
{
}
@@ -2274,7 +2288,11 @@ void DotNode::renumberNodes(int &number)
DotNode *cn;
for (dnlic.toFirst();(cn=dnlic.current());++dnlic)
{
- cn->renumberNodes(number);
+ if (!cn->m_renumbered)
+ {
+ cn->m_renumbered = true;
+ cn->renumberNodes(number);
+ }
}
}
}
@@ -2323,7 +2341,10 @@ void DotGfxHierarchyTable::createGraph(DotNode *n,FTextStream &out,
QCString baseName;
QCString imgExt = getDotImageExtension();
QCString imgFmt = Config_getEnum(DOT_IMAGE_FORMAT);
- baseName.sprintf("inherit_graph_%d",id);
+ if (m_prefix.isEmpty())
+ baseName.sprintf("inherit_graph_%d",id);
+ else
+ baseName.sprintf("%sinherit_graph_%d",m_prefix.data(),id);
QCString imgName = baseName+"."+ imgExt;
QCString mapName = baseName+".map";
QCString absImgName = QCString(d.absPath().data())+"/"+imgName;
@@ -2515,6 +2536,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
ClassSDict::Iterator cli(*cl);
ClassDef *cd;
for (cli.toLast();(cd=cli.current());--cli)
@@ -2526,6 +2548,10 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
{
continue;
}
+ if (sliceOpt && cd->compoundType() != m_classType)
+ {
+ continue;
+ }
if (!hasVisibleRoot(cd->baseClasses()) &&
cd->isVisibleInHierarchy()
) // root node in the forest
@@ -2558,7 +2584,10 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
}
}
-DotGfxHierarchyTable::DotGfxHierarchyTable() : m_curNodeNumber(1)
+DotGfxHierarchyTable::DotGfxHierarchyTable(const char *prefix,ClassDef::CompoundType ct)
+ : m_prefix(prefix)
+ , m_classType(ct)
+ , m_curNodeNumber(1)
{
m_rootNodes = new QList<DotNode>;
m_usedNodes = new QDict<DotNode>(1009);
@@ -3242,29 +3271,15 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
{
out << "<para>" << endl;
- out << " <figure>" << endl;
- out << " <title>";
- switch (m_graphType)
- {
- case DotNode::Collaboration:
- out << "Collaboration graph";
- break;
- case DotNode::Inheritance:
- out << "Inheritance graph";
- break;
- default:
- ASSERT(0);
- break;
- }
- out << "</title>" << endl;
+ out << " <informalfigure>" << endl;
out << " <mediaobject>" << endl;
out << " <imageobject>" << endl;
out << " <imagedata";
- out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
out << "</imagedata>" << endl;
out << " </imageobject>" << endl;
out << " </mediaobject>" << endl;
- out << " </figure>" << endl;
+ out << " </informalfigure>" << endl;
out << "</para>" << endl;
}
else if (graphFormat==GOF_BITMAP && generateImageMap) // produce HTML to include the image
@@ -3601,17 +3616,15 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
{
out << "<para>" << endl;
- out << " <figure>" << endl;
- out << " <title>Dependency diagram";
- out << "</title>" << endl;
+ out << " <informalfigure>" << endl;
out << " <mediaobject>" << endl;
out << " <imageobject>" << endl;
out << " <imagedata";
- out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
out << "</imagedata>" << endl;
out << " </imageobject>" << endl;
out << " </mediaobject>" << endl;
- out << " </figure>" << endl;
+ out << " </informalfigure>" << endl;
out << "</para>" << endl;
}
else if (graphFormat==GOF_BITMAP && generateImageMap)
@@ -3922,17 +3935,15 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat graphForma
if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
{
out << "<para>" << endl;
- out << " <figure>" << endl;
- out << " <title>Call diagram";
- out << "</title>" << endl;
+ out << " <informalfigure>" << endl;
out << " <mediaobject>" << endl;
out << " <imageobject>" << endl;
out << " <imagedata";
- out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
out << "</imagedata>" << endl;
out << " </imageobject>" << endl;
out << " </mediaobject>" << endl;
- out << " </figure>" << endl;
+ out << " </informalfigure>" << endl;
out << "</para>" << endl;
}
else if (graphFormat==GOF_BITMAP && generateImageMap)
@@ -4087,17 +4098,15 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
{
out << "<para>" << endl;
- out << " <figure>" << endl;
- out << " <title>Directory Dependency diagram";
- out << "</title>" << endl;
+ out << " <informalfigure>" << endl;
out << " <mediaobject>" << endl;
out << " <imageobject>" << endl;
out << " <imagedata";
- out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
out << "</imagedata>" << endl;
out << " </imageobject>" << endl;
out << " </mediaobject>" << endl;
- out << " </figure>" << endl;
+ out << " </informalfigure>" << endl;
out << "</para>" << endl;
}
else if (graphFormat==GOF_BITMAP && generateImageMap)
@@ -4319,13 +4328,18 @@ void writeDotImageMapFromFile(FTextStream &t,
}
else // bitmap graphics
{
- t << "<img src=\"" << relPath << imgName << "\" alt=\""
- << imgName << "\" border=\"0\" usemap=\"#" << mapName << "\"/>" << endl
- << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">";
-
- convertMapFile(t, absOutFile, relPath ,TRUE, context);
+ QGString result;
+ FTextStream tt(&result);
- t << "</map>" << endl;
+ t << "<img src=\"" << relPath << imgName << "\" alt=\""
+ << imgName << "\" border=\"0\" usemap=\"#" << mapName << "\"/>" << endl;
+ convertMapFile(tt, absOutFile, relPath ,TRUE, context);
+ if (!result.isEmpty())
+ {
+ t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">";
+ t << result;
+ t << "</map>" << endl;
+ }
}
d.remove(absOutFile);
}
@@ -4650,17 +4664,15 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t,
if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
{
t << "<para>" << endl;
- t << " <figure>" << endl;
- t << " <title>Group Collaboration diagram";
- t << "</title>" << endl;
+ t << " <informalfigure>" << endl;
t << " <mediaobject>" << endl;
t << " <imageobject>" << endl;
t << " <imagedata";
- t << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ t << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
t << "</imagedata>" << endl;
t << " </imageobject>" << endl;
t << " </mediaobject>" << endl;
- t << " </figure>" << endl;
+ t << " </informalfigure>" << endl;
t << "</para>" << endl;
}
else if (graphFormat==GOF_BITMAP && writeImageMap)
diff --git a/src/dot.h b/src/dot.h
index 3a70d8b..dc77789 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -26,8 +26,8 @@
#include <qqueue.h>
#include <qthread.h>
#include "sortdict.h"
+#include "classdef.h"
-class ClassDef;
class FileDef;
class FTextStream;
class DotNodeList;
@@ -122,6 +122,7 @@ class DotNode
bool m_visible; //!< is the node visible in the output
TruncState m_truncated; //!< does the node have non-visible children/parents
int m_distance; //!< shortest path to the root node
+ bool m_renumbered;//!< indicates if the node has been renumbered (to prevent endless loops)
friend class DotGfxHierarchyTable;
friend class DotClassGraph;
@@ -156,7 +157,7 @@ class DotNodeList : public QList<DotNode>
class DotGfxHierarchyTable
{
public:
- DotGfxHierarchyTable();
+ DotGfxHierarchyTable(const char *prefix="",ClassDef::CompoundType ct=ClassDef::Class);
~DotGfxHierarchyTable();
void writeGraph(FTextStream &t,const char *path, const char *fileName) const;
void createGraph(DotNode *rootNode,FTextStream &t,const char *path,const char *fileName,int id) const;
@@ -166,10 +167,12 @@ class DotGfxHierarchyTable
void addHierarchy(DotNode *n,ClassDef *cd,bool hide);
void addClassList(ClassSDict *cl);
- QList<DotNode> *m_rootNodes;
- QDict<DotNode> *m_usedNodes;
- int m_curNodeNumber;
- DotNodeList *m_rootSubgraphs;
+ QCString m_prefix;
+ ClassDef::CompoundType m_classType;
+ QList<DotNode> *m_rootNodes;
+ QDict<DotNode> *m_usedNodes;
+ int m_curNodeNumber;
+ DotNodeList *m_rootSubgraphs;
};
/** Representation of a class inheritance or dependency graph */
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index b33ae49..a6a2b07 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -103,7 +103,7 @@
#include "settings.h"
#include "context.h"
#include "fileparser.h"
-#include "plantuml.h"
+#include "emoji.h"
// provided by the generated file resources.cpp
extern void initResources();
@@ -168,6 +168,7 @@ bool Doxygen::suppressDocWarnings = FALSE;
Store *Doxygen::symbolStorage;
QCString Doxygen::objDBFileName;
QCString Doxygen::entryDBFileName;
+QCString Doxygen::filterDBFileName;
bool Doxygen::gatherDefines = TRUE;
IndexList *Doxygen::indexList;
int Doxygen::subpageNestingLevel = 0;
@@ -347,6 +348,7 @@ static STLInfo g_stlinfo[] =
{ "auto_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // deprecated
{ "smart_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
{ "unique_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
+ { "shared_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++14
{ "weak_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
{ "ios_base", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
{ "error_code", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
@@ -520,7 +522,7 @@ static void addSTLClasses(EntryNav *rootNav)
{
addSTLMember(classEntryNav,info->templType2,info->templName2);
}
- if (fullName=="std::auto_ptr" || fullName=="std::smart_ptr" ||
+ if (fullName=="std::auto_ptr" || fullName=="std::smart_ptr" || fullName=="std::shared_ptr" ||
fullName=="std::unique_ptr" || fullName=="std::weak_ptr")
{
Entry *memEntry = new Entry;
@@ -1303,6 +1305,8 @@ static void addClassToContext(EntryNav *rootNav)
}
cd->setCompoundType(convertToCompoundType(root->section,root->spec));
+
+ cd->setMetaData(root->metaData);
}
else // new class
{
@@ -1367,6 +1371,8 @@ static void addClassToContext(EntryNav *rootNav)
cd->setBodySegment(root->bodyLine,root->endBodyLine);
cd->setBodyDef(fd);
+ cd->setMetaData(root->metaData);
+
// see if the class is found inside a namespace
//bool found=addNamespace(root,cd);
@@ -1586,7 +1592,7 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
md->typeString(),md->name(),md->argsString(),md->excpString(),
md->protection(),md->virtualness(),md->isStatic(),Member,
md->memberType(),
- 0,0);
+ 0,0,"");
imd->setMemberClass(cd);
imd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
imd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
@@ -1758,6 +1764,7 @@ static void buildNamespaceList(EntryNav *rootNav)
nd->setReference("");
nd->setFileName(fullName);
}
+ nd->setMetaData(root->metaData);
// file definition containing the namespace nd
FileDef *fd=rootNav->fileDef();
@@ -1787,6 +1794,7 @@ static void buildNamespaceList(EntryNav *rootNav)
nd->setArtificial(root->artificial);
nd->setLanguage(root->lang);
nd->setId(root->id);
+ nd->setMetaData(root->metaData);
//printf("Adding namespace to group\n");
addNamespaceToGroups(root,nd);
@@ -1962,6 +1970,7 @@ static void findUsingDirectives(EntryNav *rootNav)
nd->setArtificial(TRUE);
nd->setLanguage(root->lang);
nd->setId(root->id);
+ nd->setMetaData(root->metaData);
QListIterator<Grouping> gli(*root->groups);
Grouping *g;
@@ -2167,7 +2176,7 @@ static void findUsingDeclImports(EntryNav *rootNav)
md->typeString(),memName,md->argsString(),
md->excpString(),root->protection,root->virt,
md->isStatic(),Member,md->memberType(),
- templAl,al
+ templAl,al,root->metaData
);
}
newMd->setMemberClass(cd);
@@ -2187,6 +2196,8 @@ static void findUsingDeclImports(EntryNav *rootNav)
newMd->setDefinition(md->definition());
newMd->enableCallGraph(root->callGraph);
newMd->enableCallerGraph(root->callerGraph);
+ newMd->enableReferencedByRelation(root->referencedByRelation);
+ newMd->enableReferencesRelation(root->referencesRelation);
newMd->setBitfields(md->bitfieldString());
newMd->addSectionsToDefinition(root->anchors);
newMd->setBodySegment(md->getStartBodyLine(),md->getEndBodyLine());
@@ -2360,7 +2371,7 @@ static MemberDef *addVariableToClass(
fileName,root->startLine,root->startColumn,
root->type,name,root->args,root->exception,
prot,Normal,root->stat,related,
- mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0);
+ mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0, root->metaData);
md->setTagInfo(rootNav->tagInfo());
md->setMemberClass(cd); // also sets outer scope (i.e. getOuterScope())
//md->setDefFile(root->fileName);
@@ -2383,6 +2394,8 @@ static MemberDef *addVariableToClass(
md->setWriteAccessor(root->write);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
md->setHidden(root->hidden);
md->setArtificial(root->artificial);
md->setLanguage(root->lang);
@@ -2603,7 +2616,7 @@ static MemberDef *addVariableToFile(
fileName,root->startLine,root->startColumn,
root->type,name,root->args,0,
root->protection, Normal,root->stat,Member,
- mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0);
+ mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0, root->metaData);
md->setTagInfo(rootNav->tagInfo());
md->setMemberSpecifiers(root->spec);
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -2620,6 +2633,8 @@ static MemberDef *addVariableToFile(
md->setId(root->id);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
md->setExplicitExternal(root->explicitExternal);
//md->setOuterScope(fd);
if (!root->explicitExternal)
@@ -2821,6 +2836,8 @@ done:
static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+
rootNav->loadEntry(g_storage);
Entry *root = rootNav->entry();
@@ -2940,6 +2957,10 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
mtype=MemberType_Property;
else if (root->mtype==Event)
mtype=MemberType_Event;
+ else if (type.find("sequence<") != -1)
+ mtype=sliceOpt ? MemberType_Sequence : MemberType_Typedef;
+ else if (type.find("dictionary<") != -1)
+ mtype=sliceOpt ? MemberType_Dictionary : MemberType_Typedef;
else
mtype=MemberType_Variable;
@@ -3054,6 +3075,58 @@ static void buildTypedefList(EntryNav *rootNav)
}
//----------------------------------------------------------------------
+// Searches the Entry tree for sequence documentation sections.
+// If found they are stored in the global list.
+static void buildSequenceList(EntryNav *rootNav)
+{
+ if (!rootNav->name().isEmpty() &&
+ rootNav->section()==Entry::VARIABLE_SEC &&
+ rootNav->type().find("sequence<")!=-1 // it's a sequence
+ )
+ {
+ addVariable(rootNav);
+ }
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ if (e->section()!=Entry::ENUM_SEC)
+ {
+ buildSequenceList(e);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+// Searches the Entry tree for dictionary documentation sections.
+// If found they are stored in the global list.
+static void buildDictionaryList(EntryNav *rootNav)
+{
+ if (!rootNav->name().isEmpty() &&
+ rootNav->section()==Entry::VARIABLE_SEC &&
+ rootNav->type().find("dictionary<")!=-1 // it's a dictionary
+ )
+ {
+ addVariable(rootNav);
+ }
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ if (e->section()!=Entry::ENUM_SEC)
+ {
+ buildDictionaryList(e);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
// Searches the Entry tree for Variable documentation sections.
// If found they are stored in their class or in the global list.
@@ -3114,7 +3187,7 @@ static void addInterfaceOrServiceToServiceOrSingleton(
MemberDef *const md = new MemberDef(
fileName, root->startLine, root->startColumn, root->type, rname,
"", "", root->protection, root->virt, root->stat, Member,
- type, 0, root->argList);
+ type, 0, root->argList, root->metaData);
md->setTagInfo(rootNav->tagInfo());
md->setMemberClass(cd);
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -3133,6 +3206,8 @@ static void addInterfaceOrServiceToServiceOrSingleton(
md->setDefinition(def);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
Debug::print(Debug::Functions,0,
" Interface Member:\n"
@@ -3301,7 +3376,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
root->stat && root->relatesType != MemberOf,
root->relates.isEmpty() ? Member :
root->relatesType == MemberOf ? Foreign : Related,
- mtype,root->tArgLists ? root->tArgLists->getLast() : 0,root->argList);
+ mtype,root->tArgLists ? root->tArgLists->getLast() : 0,root->argList, root->metaData);
md->setTagInfo(rootNav->tagInfo());
md->setMemberClass(cd);
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -3385,6 +3460,8 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
md->setDefinition(def);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
Debug::print(Debug::Functions,0,
" Func Member:\n"
@@ -3652,6 +3729,8 @@ static void buildFunctionList(EntryNav *rootNav)
md->enableCallGraph(md->hasCallGraph() || root->callGraph);
md->enableCallerGraph(md->hasCallerGraph() || root->callerGraph);
+ md->enableReferencedByRelation(md->hasReferencedByRelation() || root->referencedByRelation);
+ md->enableReferencesRelation(md->hasReferencesRelation() || root->referencesRelation);
// merge ingroup specifiers
if (md->getGroupDef()==0 && root->groups->getFirst()!=0)
@@ -3691,7 +3770,7 @@ static void buildFunctionList(EntryNav *rootNav)
root->fileName,root->startLine,root->startColumn,
root->type,name,root->args,root->exception,
root->protection,root->virt,root->stat,Member,
- MemberType_Function,tArgList,root->argList);
+ MemberType_Function,tArgList,root->argList,root->metaData);
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
@@ -3771,6 +3850,8 @@ static void buildFunctionList(EntryNav *rootNav)
md->setDefinition(def);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
//if (root->mGrpId!=-1)
//{
// md->setMemberGroup(memberGroupDict[root->mGrpId]);
@@ -3922,8 +4003,13 @@ static void findFriends()
mmd->enableCallGraph(mmd->hasCallGraph() || fmd->hasCallGraph());
mmd->enableCallerGraph(mmd->hasCallerGraph() || fmd->hasCallerGraph());
+ mmd->enableReferencedByRelation(mmd->hasReferencedByRelation() || fmd->hasReferencedByRelation());
+ mmd->enableReferencesRelation(mmd->hasReferencesRelation() || fmd->hasReferencesRelation());
+
fmd->enableCallGraph(mmd->hasCallGraph() || fmd->hasCallGraph());
fmd->enableCallerGraph(mmd->hasCallerGraph() || fmd->hasCallerGraph());
+ fmd->enableReferencedByRelation(mmd->hasReferencedByRelation() || fmd->hasReferencedByRelation());
+ fmd->enableReferencesRelation(mmd->hasReferencesRelation() || fmd->hasReferencesRelation());
}
}
}
@@ -5323,6 +5409,8 @@ static void addMemberDocs(EntryNav *rootNav,
md->setDefinition(fDecl);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
ClassDef *cd=md->getClassDef();
NamespaceDef *nd=md->getNamespaceDef();
QCString fullName;
@@ -5415,6 +5503,8 @@ static void addMemberDocs(EntryNav *rootNav,
md->enableCallGraph(md->hasCallGraph() || root->callGraph);
md->enableCallerGraph(md->hasCallerGraph() || root->callerGraph);
+ md->enableReferencedByRelation(md->hasReferencedByRelation() || root->referencedByRelation);
+ md->enableReferencesRelation(md->hasReferencesRelation() || root->referencesRelation);
md->mergeMemberSpecifiers(root->spec);
md->addSectionsToDefinition(root->anchors);
@@ -6436,7 +6526,7 @@ static void findMember(EntryNav *rootNav,
funcType,funcName,funcArgs,exceptions,
declMd ? declMd->protection() : root->protection,
root->virt,root->stat,Member,
- mtype,tArgList,root->argList);
+ mtype,tArgList,root->argList,root->metaData);
//printf("new specialized member %s args=`%s'\n",md->name().data(),funcArgs.data());
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
@@ -6447,6 +6537,8 @@ static void findMember(EntryNav *rootNav,
md->setDefinition(funcDecl);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
@@ -6503,7 +6595,7 @@ static void findMember(EntryNav *rootNav,
root->fileName,root->startLine,root->startColumn,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,root->stat,Related,
- mtype,tArgList,root->argList);
+ mtype,tArgList,root->argList,root->metaData);
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
md->setId(root->id);
@@ -6512,6 +6604,8 @@ static void findMember(EntryNav *rootNav,
md->setDefinition(funcDecl);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
QCString doc=getOverloadDocs();
doc+="<p>";
doc+=root->doc;
@@ -6641,7 +6735,7 @@ static void findMember(EntryNav *rootNav,
isMemberOf ? Foreign : Related,
mtype,
(root->tArgLists ? root->tArgLists->getLast() : 0),
- funcArgs.isEmpty() ? 0 : root->argList);
+ funcArgs.isEmpty() ? 0 : root->argList,root->metaData);
if (isDefine && mdDefine)
{
@@ -6716,6 +6810,8 @@ static void findMember(EntryNav *rootNav,
md->setDefinition(funcDecl);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
md->setDocsForDefinition(!root->proto);
@@ -6779,7 +6875,7 @@ localObjCMethod:
root->fileName,root->startLine,root->startColumn,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,root->stat,Member,
- MemberType_Function,0,root->argList);
+ MemberType_Function,0,root->argList,root->metaData);
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
md->setId(root->id);
@@ -6788,6 +6884,8 @@ localObjCMethod:
md->setDefinition(funcDecl);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
@@ -7115,7 +7213,7 @@ static void findEnums(EntryNav *rootNav)
root->protection,Normal,FALSE,
isMemberOf ? Foreign : isRelated ? Related : Member,
MemberType_Enumeration,
- 0,0);
+ 0,0,root->metaData);
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
md->setId(root->id);
@@ -7130,6 +7228,8 @@ static void findEnums(EntryNav *rootNav)
md->setMemberGroupId(root->mGrpId);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
//printf("%s::setRefItems(%d)\n",md->name().data(),root->sli?root->sli->count():-1);
md->setRefItems(root->sli);
//printf("found enum %s nd=%p\n",md->name().data(),nd);
@@ -7337,7 +7437,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
fileName,root->startLine,root->startColumn,
root->type,root->name,root->args,0,
root->protection, Normal,root->stat,Member,
- MemberType_EnumValue,0,0);
+ MemberType_EnumValue,0,0,root->metaData);
if (md->getClassDef()) fmd->setMemberClass(md->getClassDef());
else if (md->getNamespaceDef()) fmd->setNamespace(md->getNamespaceDef());
else if (md->getFileDef()) fmd->setFileDef(md->getFileDef());
@@ -7697,7 +7797,7 @@ static void computeMemberRelations()
// bmcd->name().data(),bmd->name().data(),bmd
// );
if (md!=bmd && bmcd && mcd && bmcd!=mcd &&
- (bmd->virtualness()!=Normal ||
+ (bmd->virtualness()!=Normal || bmd->getLanguage()==SrcLangExt_Python ||
bmcd->compoundType()==ClassDef::Interface ||
bmcd->compoundType()==ClassDef::Protocol
) &&
@@ -8467,7 +8567,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
{
MemberDef *md=new MemberDef(rootNav->tagInfo()->tagName,1,1,
"#define",root->name,root->args,0,
- Public,Normal,FALSE,Member,MemberType_Define,0,0);
+ Public,Normal,FALSE,Member,MemberType_Define,0,0,"");
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
//printf("Searching for `%s' fd=%p\n",filePathName.data(),fd);
@@ -9052,8 +9152,33 @@ static void generateGroupDocs()
//----------------------------------------------------------------------------
// generate module pages
+static void generateNamespaceClassDocs(ClassSDict *d)
+{
+ // for each class in the namespace...
+ ClassSDict::Iterator cli(*d);
+ ClassDef *cd;
+ for ( ; (cd=cli.current()) ; ++cli )
+ {
+ if ( ( cd->isLinkableInProject() &&
+ cd->templateMaster()==0
+ ) // skip external references, anonymous compounds and
+ // template instances and nested classes
+ && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
+ )
+ {
+ msg("Generating docs for compound %s...\n",cd->name().data());
+
+ cd->writeDocumentation(*g_outputList);
+ cd->writeMemberList(*g_outputList);
+ }
+ cd->writeDocumentationForInnerClasses(*g_outputList);
+ }
+}
+
static void generateNamespaceDocs()
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+
//writeNamespaceIndex(*g_outputList);
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
@@ -9068,24 +9193,12 @@ static void generateNamespaceDocs()
nd->writeDocumentation(*g_outputList);
}
- // for each class in the namespace...
- ClassSDict::Iterator cli(*nd->getClassSDict());
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ generateNamespaceClassDocs(nd->getClassSDict());
+ if (sliceOpt)
{
- if ( ( cd->isLinkableInProject() &&
- cd->templateMaster()==0
- ) // skip external references, anonymous compounds and
- // template instances and nested classes
- && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
- )
- {
- msg("Generating docs for compound %s...\n",cd->name().data());
-
- cd->writeDocumentation(*g_outputList);
- cd->writeMemberList(*g_outputList);
- }
- cd->writeDocumentationForInnerClasses(*g_outputList);
+ generateNamespaceClassDocs(nd->getInterfaceSDict());
+ generateNamespaceClassDocs(nd->getStructSDict());
+ generateNamespaceClassDocs(nd->getExceptionSDict());
}
}
}
@@ -9152,7 +9265,24 @@ static void generateConfigFile(const char *configFile,bool shortList,
exit(1);
}
}
-
+static void compareDoxyfile()
+{
+ QFile f;
+ char configFile[2];
+ configFile[0] = '-';
+ configFile[1] = '\0';
+ bool fileOpened=openOutputFile(configFile,f);
+ if (fileOpened)
+ {
+ FTextStream t(&f);
+ Config::compareDoxyfile(t);
+ }
+ else
+ {
+ err("Cannot open file %s for writing\n",configFile);
+ exit(1);
+ }
+}
//----------------------------------------------------------------------------
// read and parse a tag file
@@ -9634,7 +9764,7 @@ int readDir(QFileInfo *fi,
{
fn = new FileName(cfi->absFilePath().utf8(),name);
fn->append(fd);
- if (fnList) fnList->inSort(fn);
+ if (fnList) fnList->append(fn);
fnDict->insert(name,fn);
}
}
@@ -9733,7 +9863,7 @@ int readFileOrDirectory(const char *s,
{
fn = new FileName(filePath,name);
fn->append(fd);
- if (fnList) fnList->inSort(fn);
+ if (fnList) fnList->append(fn);
fnDict->insert(name,fn);
}
}
@@ -9872,7 +10002,7 @@ static void escapeAliases()
while ((in=value.find("^^",p))!=-1)
{
newValue+=value.mid(p,in-p);
- newValue+="\n";
+ newValue+="@_linebr";
p=in+2;
}
newValue+=value.mid(p,value.length()-p);
@@ -10010,6 +10140,11 @@ static void usage(const char *name)
msg(" LaTeX: %s -w latex headerFile footerFile styleSheetFile [configFile]\n\n",name);
msg("6) Use doxygen to generate a rtf extensions file\n");
msg(" RTF: %s -e rtf extensionsFile\n\n",name);
+ msg("7) Use doxygen to compare the used configuration file with the template configuration file\n");
+ msg(" %s -x [configFile]\n\n",name);
+ msg("8) Use doxygen to show a list of build in emoji.\n");
+ msg(" %s -f emoji outputFileName\n\n",name);
+ msg(" If - is used for outputFileName doxygen will write to standard output.\n\n");
msg("If -s is specified the comments of the configuration items in the config file will be omitted.\n");
msg("If configName is omitted `Doxyfile' will be used as a default.\n\n");
msg("-v print version string\n");
@@ -10210,8 +10345,10 @@ void readConfiguration(int argc, char **argv)
const char *layoutName=0;
const char *debugLabel;
const char *formatName;
+ const char *listName;
bool genConfig=FALSE;
bool shortList=FALSE;
+ bool diffList=FALSE;
bool updateConfig=FALSE;
int retVal;
while (optind<argc && argv[optind][0]=='-' &&
@@ -10249,6 +10386,9 @@ void readConfiguration(int argc, char **argv)
exit(1);
}
break;
+ case 'x':
+ diffList=TRUE;
+ break;
case 's':
shortList=TRUE;
break;
@@ -10283,6 +10423,34 @@ void readConfiguration(int argc, char **argv)
cleanUpDoxygen();
exit(1);
break;
+ case 'f':
+ listName=getArg(argc,argv,optind);
+ if (!listName)
+ {
+ err("option \"-f\" is missing list specifier.\n");
+ cleanUpDoxygen();
+ exit(1);
+ }
+ if (qstricmp(listName,"emoji")==0)
+ {
+ if (optind+1>=argc)
+ {
+ err("option \"-f emoji\" is missing an output file name\n");
+ cleanUpDoxygen();
+ exit(1);
+ }
+ QFile f;
+ if (openOutputFile(argv[optind+1],f))
+ {
+ EmojiEntityMapper::instance()->writeEmojiFile(f);
+ }
+ cleanUpDoxygen();
+ exit(0);
+ }
+ err("option \"-f\" has invalid list specifier.\n");
+ cleanUpDoxygen();
+ exit(1);
+ break;
case 'w':
formatName=getArg(argc,argv,optind);
if (!formatName)
@@ -10499,6 +10667,7 @@ void readConfiguration(int argc, char **argv)
exit(1);
}
}
+
if (genConfig && g_useOutputTemplate)
{
generateTemplateFiles("templates");
@@ -10520,6 +10689,13 @@ void readConfiguration(int argc, char **argv)
exit(1);
}
+ if (diffList)
+ {
+ compareDoxyfile();
+ cleanUpDoxygen();
+ exit(0);
+ }
+
if (updateConfig)
{
generateConfigFile(configName,shortList,TRUE);
@@ -10649,6 +10825,10 @@ static void stopDoxygen(int)
{
thisDir.remove(Doxygen::objDBFileName);
}
+ if (!Doxygen::filterDBFileName.isEmpty())
+ {
+ thisDir.remove(Doxygen::filterDBFileName);
+ }
killpg(0,SIGINT);
exit(1);
}
@@ -10749,6 +10929,10 @@ static void exitDoxygen()
{
thisDir.remove(Doxygen::objDBFileName);
}
+ if (!Doxygen::filterDBFileName.isEmpty())
+ {
+ thisDir.remove(Doxygen::filterDBFileName);
+ }
}
}
@@ -10924,6 +11108,7 @@ void searchInputFiles()
}
s=inputList.next();
}
+ Doxygen::inputNameList->sort();
delete killDict;
g_s.end();
}
@@ -10988,6 +11173,8 @@ void parseInput()
Doxygen::objDBFileName.prepend(outputDirectory+"/");
Doxygen::entryDBFileName.sprintf("doxygen_entrydb_%d.tmp",pid);
Doxygen::entryDBFileName.prepend(outputDirectory+"/");
+ Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
+ Doxygen::filterDBFileName.prepend(outputDirectory+"/");
if (Doxygen::symbolStorage->open(Doxygen::objDBFileName)==-1)
{
@@ -11101,14 +11288,20 @@ void parseInput()
// Notice: the order of the function calls below is very important!
- if (Config_getBool(GENERATE_HTML))
+ if (Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX))
{
readFormulaRepository(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
- readFormulaRepository(Config_getString(RTF_OUTPUT),Config_getBool(GENERATE_HTML));
+ readFormulaRepository(Config_getString(RTF_OUTPUT),Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX));
+ }
+ if (Config_getBool(GENERATE_DOCBOOK))
+ {
+ // in case GENERRATE_HTML is set we just have to compare, both repositories should be identical
+ readFormulaRepository(Config_getString(DOCBOOK_OUTPUT),
+ (Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX)) || Config_getBool(GENERATE_RTF));
}
/**************************************************************************
@@ -11228,6 +11421,17 @@ void parseInput()
buildTypedefList(rootNav);
g_s.end();
+ if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ g_s.begin("Searching for documented sequences...\n");
+ buildSequenceList(rootNav);
+ g_s.end();
+
+ g_s.begin("Searching for documented dictionaries...\n");
+ buildDictionaryList(rootNav);
+ g_s.end();
+ }
+
g_s.begin("Searching for members imported via using declarations...\n");
// this should be after buildTypedefList in order to properly import
// used typedefs
@@ -11457,6 +11661,7 @@ void generateOutput()
bool generateLatex = Config_getBool(GENERATE_LATEX);
bool generateMan = Config_getBool(GENERATE_MAN);
bool generateRtf = Config_getBool(GENERATE_RTF);
+ bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
g_outputList = new OutputList(TRUE);
@@ -11484,6 +11689,11 @@ void generateOutput()
g_outputList->add(new LatexGenerator);
LatexGenerator::init();
}
+ if (generateDocbook)
+ {
+ g_outputList->add(new DocbookGenerator);
+ DocbookGenerator::init();
+ }
if (generateMan)
{
g_outputList->add(new ManGenerator);
@@ -11510,6 +11720,7 @@ void generateOutput()
if (generateHtml) writeDoxFont(Config_getString(HTML_OUTPUT));
if (generateLatex) writeDoxFont(Config_getString(LATEX_OUTPUT));
+ if (generateDocbook) writeDoxFont(Config_getString(DOCBOOK_OUTPUT));
if (generateRtf) writeDoxFont(Config_getString(RTF_OUTPUT));
g_s.begin("Generating style sheet...\n");
@@ -11603,6 +11814,13 @@ void generateOutput()
g_s.end();
}
+ if (Doxygen::formulaList->count()>0 && generateDocbook)
+ {
+ g_s.begin("Generating bitmaps for formulas in Docbook...\n");
+ Doxygen::formulaList->generateBitmaps(Config_getString(DOCBOOK_OUTPUT));
+ g_s.end();
+ }
+
if (Config_getBool(SORT_GROUP_NAMES))
{
Doxygen::groupSDict->sort();
@@ -11635,6 +11853,8 @@ void generateOutput()
removeDoxFont(Config_getString(RTF_OUTPUT));
if (generateLatex)
removeDoxFont(Config_getString(LATEX_OUTPUT));
+ if (generateDocbook)
+ removeDoxFont(Config_getString(DOCBOOK_OUTPUT));
}
if (Config_getBool(GENERATE_XML))
@@ -11652,13 +11872,6 @@ void generateOutput()
g_s.end();
}
- if (Config_getBool(GENERATE_DOCBOOK))
- {
- g_s.begin("Generating Docbook output...\n");
- generateDocbook();
- g_s.end();
- }
-
if (Config_getBool(GENERATE_AUTOGEN_DEF))
{
g_s.begin("Generating AutoGen DEF output...\n");
@@ -11736,6 +11949,10 @@ void generateOutput()
copyLogo(Config_getString(LATEX_OUTPUT));
copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT));
}
+ if (generateDocbook)
+ {
+ copyLogo(Config_getString(DOCBOOK_OUTPUT));
+ }
if (generateRtf)
{
copyLogo(Config_getString(RTF_OUTPUT));
@@ -11814,6 +12031,7 @@ void generateOutput()
Doxygen::symbolStorage->close();
QDir thisDir;
thisDir.remove(Doxygen::objDBFileName);
+ thisDir.remove(Doxygen::filterDBFileName);
Config::deinit();
QTextCodec::deleteAllCodecs();
delete Doxygen::symbolMap;
diff --git a/src/doxygen.h b/src/doxygen.h
index 7bd05a4..4ff8a56 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -140,6 +140,7 @@ class Doxygen
static Store *symbolStorage;
static QCString objDBFileName;
static QCString entryDBFileName;
+ static QCString filterDBFileName;
static CiteDict *citeDict;
static bool gatherDefines;
static bool userComments;
diff --git a/src/emoji.cpp b/src/emoji.cpp
new file mode 100644
index 0000000..c332083
--- /dev/null
+++ b/src/emoji.cpp
@@ -0,0 +1,1599 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2018 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 "emoji.h"
+#include "message.h"
+#include "ftextstream.h"
+#include "util.h"
+
+static struct emojiEntityInfo
+{
+ const char *name;
+ const char *unicode;
+} g_emojiEntities[] =
+/* generated using the download_github_emojis.py script */
+{
+ { ":+1:", "&#x1f44d;" },
+ { ":-1:", "&#x1f44e;" },
+ { ":100:", "&#x1f4af;" },
+ { ":1234:", "&#x1f522;" },
+ { ":1st_place_medal:", "&#x1f947;" },
+ { ":2nd_place_medal:", "&#x1f948;" },
+ { ":3rd_place_medal:", "&#x1f949;" },
+ { ":8ball:", "&#x1f3b1;" },
+ { ":a:", "&#x1f170;" },
+ { ":ab:", "&#x1f18e;" },
+ { ":abc:", "&#x1f524;" },
+ { ":abcd:", "&#x1f521;" },
+ { ":accept:", "&#x1f251;" },
+ { ":aerial_tramway:", "&#x1f6a1;" },
+ { ":afghanistan:", "&#x1f1e6;&#x1f1eb;" },
+ { ":airplane:", "&#x2708;" },
+ { ":aland_islands:", "&#x1f1e6;&#x1f1fd;" },
+ { ":alarm_clock:", "&#x23f0;" },
+ { ":albania:", "&#x1f1e6;&#x1f1f1;" },
+ { ":alembic:", "&#x2697;" },
+ { ":algeria:", "&#x1f1e9;&#x1f1ff;" },
+ { ":alien:", "&#x1f47d;" },
+ { ":ambulance:", "&#x1f691;" },
+ { ":american_samoa:", "&#x1f1e6;&#x1f1f8;" },
+ { ":amphora:", "&#x1f3fa;" },
+ { ":anchor:", "&#x2693;" },
+ { ":andorra:", "&#x1f1e6;&#x1f1e9;" },
+ { ":angel:", "&#x1f47c;" },
+ { ":anger:", "&#x1f4a2;" },
+ { ":angola:", "&#x1f1e6;&#x1f1f4;" },
+ { ":angry:", "&#x1f620;" },
+ { ":anguilla:", "&#x1f1e6;&#x1f1ee;" },
+ { ":anguished:", "&#x1f627;" },
+ { ":ant:", "&#x1f41c;" },
+ { ":antarctica:", "&#x1f1e6;&#x1f1f6;" },
+ { ":antigua_barbuda:", "&#x1f1e6;&#x1f1ec;" },
+ { ":apple:", "&#x1f34e;" },
+ { ":aquarius:", "&#x2652;" },
+ { ":argentina:", "&#x1f1e6;&#x1f1f7;" },
+ { ":aries:", "&#x2648;" },
+ { ":armenia:", "&#x1f1e6;&#x1f1f2;" },
+ { ":arrow_backward:", "&#x25c0;" },
+ { ":arrow_double_down:", "&#x23ec;" },
+ { ":arrow_double_up:", "&#x23eb;" },
+ { ":arrow_down:", "&#x2b07;" },
+ { ":arrow_down_small:", "&#x1f53d;" },
+ { ":arrow_forward:", "&#x25b6;" },
+ { ":arrow_heading_down:", "&#x2935;" },
+ { ":arrow_heading_up:", "&#x2934;" },
+ { ":arrow_left:", "&#x2b05;" },
+ { ":arrow_lower_left:", "&#x2199;" },
+ { ":arrow_lower_right:", "&#x2198;" },
+ { ":arrow_right:", "&#x27a1;" },
+ { ":arrow_right_hook:", "&#x21aa;" },
+ { ":arrow_up:", "&#x2b06;" },
+ { ":arrow_up_down:", "&#x2195;" },
+ { ":arrow_up_small:", "&#x1f53c;" },
+ { ":arrow_upper_left:", "&#x2196;" },
+ { ":arrow_upper_right:", "&#x2197;" },
+ { ":arrows_clockwise:", "&#x1f503;" },
+ { ":arrows_counterclockwise:", "&#x1f504;" },
+ { ":art:", "&#x1f3a8;" },
+ { ":articulated_lorry:", "&#x1f69b;" },
+ { ":artificial_satellite:", "&#x1f6f0;" },
+ { ":aruba:", "&#x1f1e6;&#x1f1fc;" },
+ { ":asterisk:", "&#x002a;&#x20e3;" },
+ { ":astonished:", "&#x1f632;" },
+ { ":athletic_shoe:", "&#x1f45f;" },
+ { ":atm:", "&#x1f3e7;" },
+ { ":atom_symbol:", "&#x269b;" },
+ { ":australia:", "&#x1f1e6;&#x1f1fa;" },
+ { ":austria:", "&#x1f1e6;&#x1f1f9;" },
+ { ":avocado:", "&#x1f951;" },
+ { ":azerbaijan:", "&#x1f1e6;&#x1f1ff;" },
+ { ":b:", "&#x1f171;" },
+ { ":baby:", "&#x1f476;" },
+ { ":baby_bottle:", "&#x1f37c;" },
+ { ":baby_chick:", "&#x1f424;" },
+ { ":baby_symbol:", "&#x1f6bc;" },
+ { ":back:", "&#x1f519;" },
+ { ":bacon:", "&#x1f953;" },
+ { ":badminton:", "&#x1f3f8;" },
+ { ":baggage_claim:", "&#x1f6c4;" },
+ { ":baguette_bread:", "&#x1f956;" },
+ { ":bahamas:", "&#x1f1e7;&#x1f1f8;" },
+ { ":bahrain:", "&#x1f1e7;&#x1f1ed;" },
+ { ":balance_scale:", "&#x2696;" },
+ { ":balloon:", "&#x1f388;" },
+ { ":ballot_box:", "&#x1f5f3;" },
+ { ":ballot_box_with_check:", "&#x2611;" },
+ { ":bamboo:", "&#x1f38d;" },
+ { ":banana:", "&#x1f34c;" },
+ { ":bangbang:", "&#x203c;" },
+ { ":bangladesh:", "&#x1f1e7;&#x1f1e9;" },
+ { ":bank:", "&#x1f3e6;" },
+ { ":bar_chart:", "&#x1f4ca;" },
+ { ":barbados:", "&#x1f1e7;&#x1f1e7;" },
+ { ":barber:", "&#x1f488;" },
+ { ":baseball:", "&#x26be;" },
+ { ":basketball:", "&#x1f3c0;" },
+ { ":basketball_man:", "&#x26f9;" },
+ { ":basketball_woman:", "&#x26f9;&#x2640;" },
+ { ":bat:", "&#x1f987;" },
+ { ":bath:", "&#x1f6c0;" },
+ { ":bathtub:", "&#x1f6c1;" },
+ { ":battery:", "&#x1f50b;" },
+ { ":beach_umbrella:", "&#x1f3d6;" },
+ { ":bear:", "&#x1f43b;" },
+ { ":bed:", "&#x1f6cf;" },
+ { ":bee:", "&#x1f41d;" },
+ { ":beer:", "&#x1f37a;" },
+ { ":beers:", "&#x1f37b;" },
+ { ":beetle:", "&#x1f41e;" },
+ { ":beginner:", "&#x1f530;" },
+ { ":belarus:", "&#x1f1e7;&#x1f1fe;" },
+ { ":belgium:", "&#x1f1e7;&#x1f1ea;" },
+ { ":belize:", "&#x1f1e7;&#x1f1ff;" },
+ { ":bell:", "&#x1f514;" },
+ { ":bellhop_bell:", "&#x1f6ce;" },
+ { ":benin:", "&#x1f1e7;&#x1f1ef;" },
+ { ":bento:", "&#x1f371;" },
+ { ":bermuda:", "&#x1f1e7;&#x1f1f2;" },
+ { ":bhutan:", "&#x1f1e7;&#x1f1f9;" },
+ { ":bicyclist:", "&#x1f6b4;" },
+ { ":bike:", "&#x1f6b2;" },
+ { ":biking_man:", "&#x1f6b4;" },
+ { ":biking_woman:", "&#x1f6b4;&#x2640;" },
+ { ":bikini:", "&#x1f459;" },
+ { ":biohazard:", "&#x2623;" },
+ { ":bird:", "&#x1f426;" },
+ { ":birthday:", "&#x1f382;" },
+ { ":black_circle:", "&#x26ab;" },
+ { ":black_flag:", "&#x1f3f4;" },
+ { ":black_heart:", "&#x1f5a4;" },
+ { ":black_joker:", "&#x1f0cf;" },
+ { ":black_large_square:", "&#x2b1b;" },
+ { ":black_medium_small_square:", "&#x25fe;" },
+ { ":black_medium_square:", "&#x25fc;" },
+ { ":black_nib:", "&#x2712;" },
+ { ":black_small_square:", "&#x25aa;" },
+ { ":black_square_button:", "&#x1f532;" },
+ { ":blonde_man:", "&#x1f471;" },
+ { ":blonde_woman:", "&#x1f471;&#x2640;" },
+ { ":blossom:", "&#x1f33c;" },
+ { ":blowfish:", "&#x1f421;" },
+ { ":blue_book:", "&#x1f4d8;" },
+ { ":blue_car:", "&#x1f699;" },
+ { ":blue_heart:", "&#x1f499;" },
+ { ":blush:", "&#x1f60a;" },
+ { ":boar:", "&#x1f417;" },
+ { ":boat:", "&#x26f5;" },
+ { ":bolivia:", "&#x1f1e7;&#x1f1f4;" },
+ { ":bomb:", "&#x1f4a3;" },
+ { ":book:", "&#x1f4d6;" },
+ { ":bookmark:", "&#x1f516;" },
+ { ":bookmark_tabs:", "&#x1f4d1;" },
+ { ":books:", "&#x1f4da;" },
+ { ":boom:", "&#x1f4a5;" },
+ { ":boot:", "&#x1f462;" },
+ { ":bosnia_herzegovina:", "&#x1f1e7;&#x1f1e6;" },
+ { ":botswana:", "&#x1f1e7;&#x1f1fc;" },
+ { ":bouquet:", "&#x1f490;" },
+ { ":bow:", "&#x1f647;" },
+ { ":bow_and_arrow:", "&#x1f3f9;" },
+ { ":bowing_man:", "&#x1f647;" },
+ { ":bowing_woman:", "&#x1f647;&#x2640;" },
+ { ":bowling:", "&#x1f3b3;" },
+ { ":boxing_glove:", "&#x1f94a;" },
+ { ":boy:", "&#x1f466;" },
+ { ":brazil:", "&#x1f1e7;&#x1f1f7;" },
+ { ":bread:", "&#x1f35e;" },
+ { ":bride_with_veil:", "&#x1f470;" },
+ { ":bridge_at_night:", "&#x1f309;" },
+ { ":briefcase:", "&#x1f4bc;" },
+ { ":british_indian_ocean_territory:", "&#x1f1ee;&#x1f1f4;" },
+ { ":british_virgin_islands:", "&#x1f1fb;&#x1f1ec;" },
+ { ":broken_heart:", "&#x1f494;" },
+ { ":brunei:", "&#x1f1e7;&#x1f1f3;" },
+ { ":bug:", "&#x1f41b;" },
+ { ":building_construction:", "&#x1f3d7;" },
+ { ":bulb:", "&#x1f4a1;" },
+ { ":bulgaria:", "&#x1f1e7;&#x1f1ec;" },
+ { ":bullettrain_front:", "&#x1f685;" },
+ { ":bullettrain_side:", "&#x1f684;" },
+ { ":burkina_faso:", "&#x1f1e7;&#x1f1eb;" },
+ { ":burrito:", "&#x1f32f;" },
+ { ":burundi:", "&#x1f1e7;&#x1f1ee;" },
+ { ":bus:", "&#x1f68c;" },
+ { ":business_suit_levitating:", "&#x1f574;" },
+ { ":busstop:", "&#x1f68f;" },
+ { ":bust_in_silhouette:", "&#x1f464;" },
+ { ":busts_in_silhouette:", "&#x1f465;" },
+ { ":butterfly:", "&#x1f98b;" },
+ { ":cactus:", "&#x1f335;" },
+ { ":cake:", "&#x1f370;" },
+ { ":calendar:", "&#x1f4c6;" },
+ { ":call_me_hand:", "&#x1f919;" },
+ { ":calling:", "&#x1f4f2;" },
+ { ":cambodia:", "&#x1f1f0;&#x1f1ed;" },
+ { ":camel:", "&#x1f42b;" },
+ { ":camera:", "&#x1f4f7;" },
+ { ":camera_flash:", "&#x1f4f8;" },
+ { ":cameroon:", "&#x1f1e8;&#x1f1f2;" },
+ { ":camping:", "&#x1f3d5;" },
+ { ":canada:", "&#x1f1e8;&#x1f1e6;" },
+ { ":canary_islands:", "&#x1f1ee;&#x1f1e8;" },
+ { ":cancer:", "&#x264b;" },
+ { ":candle:", "&#x1f56f;" },
+ { ":candy:", "&#x1f36c;" },
+ { ":canoe:", "&#x1f6f6;" },
+ { ":cape_verde:", "&#x1f1e8;&#x1f1fb;" },
+ { ":capital_abcd:", "&#x1f520;" },
+ { ":capricorn:", "&#x2651;" },
+ { ":car:", "&#x1f697;" },
+ { ":card_file_box:", "&#x1f5c3;" },
+ { ":card_index:", "&#x1f4c7;" },
+ { ":card_index_dividers:", "&#x1f5c2;" },
+ { ":caribbean_netherlands:", "&#x1f1e7;&#x1f1f6;" },
+ { ":carousel_horse:", "&#x1f3a0;" },
+ { ":carrot:", "&#x1f955;" },
+ { ":cat:", "&#x1f431;" },
+ { ":cat2:", "&#x1f408;" },
+ { ":cayman_islands:", "&#x1f1f0;&#x1f1fe;" },
+ { ":cd:", "&#x1f4bf;" },
+ { ":central_african_republic:", "&#x1f1e8;&#x1f1eb;" },
+ { ":chad:", "&#x1f1f9;&#x1f1e9;" },
+ { ":chains:", "&#x26d3;" },
+ { ":champagne:", "&#x1f37e;" },
+ { ":chart:", "&#x1f4b9;" },
+ { ":chart_with_downwards_trend:", "&#x1f4c9;" },
+ { ":chart_with_upwards_trend:", "&#x1f4c8;" },
+ { ":checkered_flag:", "&#x1f3c1;" },
+ { ":cheese:", "&#x1f9c0;" },
+ { ":cherries:", "&#x1f352;" },
+ { ":cherry_blossom:", "&#x1f338;" },
+ { ":chestnut:", "&#x1f330;" },
+ { ":chicken:", "&#x1f414;" },
+ { ":children_crossing:", "&#x1f6b8;" },
+ { ":chile:", "&#x1f1e8;&#x1f1f1;" },
+ { ":chipmunk:", "&#x1f43f;" },
+ { ":chocolate_bar:", "&#x1f36b;" },
+ { ":christmas_island:", "&#x1f1e8;&#x1f1fd;" },
+ { ":christmas_tree:", "&#x1f384;" },
+ { ":church:", "&#x26ea;" },
+ { ":cinema:", "&#x1f3a6;" },
+ { ":circus_tent:", "&#x1f3aa;" },
+ { ":city_sunrise:", "&#x1f307;" },
+ { ":city_sunset:", "&#x1f306;" },
+ { ":cityscape:", "&#x1f3d9;" },
+ { ":cl:", "&#x1f191;" },
+ { ":clamp:", "&#x1f5dc;" },
+ { ":clap:", "&#x1f44f;" },
+ { ":clapper:", "&#x1f3ac;" },
+ { ":classical_building:", "&#x1f3db;" },
+ { ":clinking_glasses:", "&#x1f942;" },
+ { ":clipboard:", "&#x1f4cb;" },
+ { ":clock1:", "&#x1f550;" },
+ { ":clock10:", "&#x1f559;" },
+ { ":clock1030:", "&#x1f565;" },
+ { ":clock11:", "&#x1f55a;" },
+ { ":clock1130:", "&#x1f566;" },
+ { ":clock12:", "&#x1f55b;" },
+ { ":clock1230:", "&#x1f567;" },
+ { ":clock130:", "&#x1f55c;" },
+ { ":clock2:", "&#x1f551;" },
+ { ":clock230:", "&#x1f55d;" },
+ { ":clock3:", "&#x1f552;" },
+ { ":clock330:", "&#x1f55e;" },
+ { ":clock4:", "&#x1f553;" },
+ { ":clock430:", "&#x1f55f;" },
+ { ":clock5:", "&#x1f554;" },
+ { ":clock530:", "&#x1f560;" },
+ { ":clock6:", "&#x1f555;" },
+ { ":clock630:", "&#x1f561;" },
+ { ":clock7:", "&#x1f556;" },
+ { ":clock730:", "&#x1f562;" },
+ { ":clock8:", "&#x1f557;" },
+ { ":clock830:", "&#x1f563;" },
+ { ":clock9:", "&#x1f558;" },
+ { ":clock930:", "&#x1f564;" },
+ { ":closed_book:", "&#x1f4d5;" },
+ { ":closed_lock_with_key:", "&#x1f510;" },
+ { ":closed_umbrella:", "&#x1f302;" },
+ { ":cloud:", "&#x2601;" },
+ { ":cloud_with_lightning:", "&#x1f329;" },
+ { ":cloud_with_lightning_and_rain:", "&#x26c8;" },
+ { ":cloud_with_rain:", "&#x1f327;" },
+ { ":cloud_with_snow:", "&#x1f328;" },
+ { ":clown_face:", "&#x1f921;" },
+ { ":clubs:", "&#x2663;" },
+ { ":cn:", "&#x1f1e8;&#x1f1f3;" },
+ { ":cocktail:", "&#x1f378;" },
+ { ":cocos_islands:", "&#x1f1e8;&#x1f1e8;" },
+ { ":coffee:", "&#x2615;" },
+ { ":coffin:", "&#x26b0;" },
+ { ":cold_sweat:", "&#x1f630;" },
+ { ":collision:", "&#x1f4a5;" },
+ { ":colombia:", "&#x1f1e8;&#x1f1f4;" },
+ { ":comet:", "&#x2604;" },
+ { ":comoros:", "&#x1f1f0;&#x1f1f2;" },
+ { ":computer:", "&#x1f4bb;" },
+ { ":computer_mouse:", "&#x1f5b1;" },
+ { ":confetti_ball:", "&#x1f38a;" },
+ { ":confounded:", "&#x1f616;" },
+ { ":confused:", "&#x1f615;" },
+ { ":congo_brazzaville:", "&#x1f1e8;&#x1f1ec;" },
+ { ":congo_kinshasa:", "&#x1f1e8;&#x1f1e9;" },
+ { ":congratulations:", "&#x3297;" },
+ { ":construction:", "&#x1f6a7;" },
+ { ":construction_worker:", "&#x1f477;" },
+ { ":construction_worker_man:", "&#x1f477;" },
+ { ":construction_worker_woman:", "&#x1f477;&#x2640;" },
+ { ":control_knobs:", "&#x1f39b;" },
+ { ":convenience_store:", "&#x1f3ea;" },
+ { ":cook_islands:", "&#x1f1e8;&#x1f1f0;" },
+ { ":cookie:", "&#x1f36a;" },
+ { ":cool:", "&#x1f192;" },
+ { ":cop:", "&#x1f46e;" },
+ { ":copyright:", "&#x00a9;" },
+ { ":corn:", "&#x1f33d;" },
+ { ":costa_rica:", "&#x1f1e8;&#x1f1f7;" },
+ { ":cote_divoire:", "&#x1f1e8;&#x1f1ee;" },
+ { ":couch_and_lamp:", "&#x1f6cb;" },
+ { ":couple:", "&#x1f46b;" },
+ { ":couple_with_heart:", "&#x1f491;" },
+ { ":couple_with_heart_man_man:", "&#x1f468;&#x2764;&#x1f468;" },
+ { ":couple_with_heart_woman_man:", "&#x1f491;" },
+ { ":couple_with_heart_woman_woman:", "&#x1f469;&#x2764;&#x1f469;" },
+ { ":couplekiss_man_man:", "&#x1f468;&#x2764;&#x1f48b;&#x1f468;" },
+ { ":couplekiss_man_woman:", "&#x1f48f;" },
+ { ":couplekiss_woman_woman:", "&#x1f469;&#x2764;&#x1f48b;&#x1f469;" },
+ { ":cow:", "&#x1f42e;" },
+ { ":cow2:", "&#x1f404;" },
+ { ":cowboy_hat_face:", "&#x1f920;" },
+ { ":crab:", "&#x1f980;" },
+ { ":crayon:", "&#x1f58d;" },
+ { ":credit_card:", "&#x1f4b3;" },
+ { ":crescent_moon:", "&#x1f319;" },
+ { ":cricket:", "&#x1f3cf;" },
+ { ":croatia:", "&#x1f1ed;&#x1f1f7;" },
+ { ":crocodile:", "&#x1f40a;" },
+ { ":croissant:", "&#x1f950;" },
+ { ":crossed_fingers:", "&#x1f91e;" },
+ { ":crossed_flags:", "&#x1f38c;" },
+ { ":crossed_swords:", "&#x2694;" },
+ { ":crown:", "&#x1f451;" },
+ { ":cry:", "&#x1f622;" },
+ { ":crying_cat_face:", "&#x1f63f;" },
+ { ":crystal_ball:", "&#x1f52e;" },
+ { ":cuba:", "&#x1f1e8;&#x1f1fa;" },
+ { ":cucumber:", "&#x1f952;" },
+ { ":cupid:", "&#x1f498;" },
+ { ":curacao:", "&#x1f1e8;&#x1f1fc;" },
+ { ":curly_loop:", "&#x27b0;" },
+ { ":currency_exchange:", "&#x1f4b1;" },
+ { ":curry:", "&#x1f35b;" },
+ { ":custard:", "&#x1f36e;" },
+ { ":customs:", "&#x1f6c3;" },
+ { ":cyclone:", "&#x1f300;" },
+ { ":cyprus:", "&#x1f1e8;&#x1f1fe;" },
+ { ":czech_republic:", "&#x1f1e8;&#x1f1ff;" },
+ { ":dagger:", "&#x1f5e1;" },
+ { ":dancer:", "&#x1f483;" },
+ { ":dancers:", "&#x1f46f;" },
+ { ":dancing_men:", "&#x1f46f;&#x2642;" },
+ { ":dancing_women:", "&#x1f46f;" },
+ { ":dango:", "&#x1f361;" },
+ { ":dark_sunglasses:", "&#x1f576;" },
+ { ":dart:", "&#x1f3af;" },
+ { ":dash:", "&#x1f4a8;" },
+ { ":date:", "&#x1f4c5;" },
+ { ":de:", "&#x1f1e9;&#x1f1ea;" },
+ { ":deciduous_tree:", "&#x1f333;" },
+ { ":deer:", "&#x1f98c;" },
+ { ":denmark:", "&#x1f1e9;&#x1f1f0;" },
+ { ":department_store:", "&#x1f3ec;" },
+ { ":derelict_house:", "&#x1f3da;" },
+ { ":desert:", "&#x1f3dc;" },
+ { ":desert_island:", "&#x1f3dd;" },
+ { ":desktop_computer:", "&#x1f5a5;" },
+ { ":detective:", "&#x1f575;" },
+ { ":diamond_shape_with_a_dot_inside:", "&#x1f4a0;" },
+ { ":diamonds:", "&#x2666;" },
+ { ":disappointed:", "&#x1f61e;" },
+ { ":disappointed_relieved:", "&#x1f625;" },
+ { ":dizzy:", "&#x1f4ab;" },
+ { ":dizzy_face:", "&#x1f635;" },
+ { ":djibouti:", "&#x1f1e9;&#x1f1ef;" },
+ { ":do_not_litter:", "&#x1f6af;" },
+ { ":dog:", "&#x1f436;" },
+ { ":dog2:", "&#x1f415;" },
+ { ":dollar:", "&#x1f4b5;" },
+ { ":dolls:", "&#x1f38e;" },
+ { ":dolphin:", "&#x1f42c;" },
+ { ":dominica:", "&#x1f1e9;&#x1f1f2;" },
+ { ":dominican_republic:", "&#x1f1e9;&#x1f1f4;" },
+ { ":door:", "&#x1f6aa;" },
+ { ":doughnut:", "&#x1f369;" },
+ { ":dove:", "&#x1f54a;" },
+ { ":dragon:", "&#x1f409;" },
+ { ":dragon_face:", "&#x1f432;" },
+ { ":dress:", "&#x1f457;" },
+ { ":dromedary_camel:", "&#x1f42a;" },
+ { ":drooling_face:", "&#x1f924;" },
+ { ":droplet:", "&#x1f4a7;" },
+ { ":drum:", "&#x1f941;" },
+ { ":duck:", "&#x1f986;" },
+ { ":dvd:", "&#x1f4c0;" },
+ { ":e-mail:", "&#x1f4e7;" },
+ { ":eagle:", "&#x1f985;" },
+ { ":ear:", "&#x1f442;" },
+ { ":ear_of_rice:", "&#x1f33e;" },
+ { ":earth_africa:", "&#x1f30d;" },
+ { ":earth_americas:", "&#x1f30e;" },
+ { ":earth_asia:", "&#x1f30f;" },
+ { ":ecuador:", "&#x1f1ea;&#x1f1e8;" },
+ { ":egg:", "&#x1f95a;" },
+ { ":eggplant:", "&#x1f346;" },
+ { ":egypt:", "&#x1f1ea;&#x1f1ec;" },
+ { ":eight:", "&#x0038;&#x20e3;" },
+ { ":eight_pointed_black_star:", "&#x2734;" },
+ { ":eight_spoked_asterisk:", "&#x2733;" },
+ { ":el_salvador:", "&#x1f1f8;&#x1f1fb;" },
+ { ":electric_plug:", "&#x1f50c;" },
+ { ":elephant:", "&#x1f418;" },
+ { ":email:", "&#x2709;" },
+ { ":end:", "&#x1f51a;" },
+ { ":envelope:", "&#x2709;" },
+ { ":envelope_with_arrow:", "&#x1f4e9;" },
+ { ":equatorial_guinea:", "&#x1f1ec;&#x1f1f6;" },
+ { ":eritrea:", "&#x1f1ea;&#x1f1f7;" },
+ { ":es:", "&#x1f1ea;&#x1f1f8;" },
+ { ":estonia:", "&#x1f1ea;&#x1f1ea;" },
+ { ":ethiopia:", "&#x1f1ea;&#x1f1f9;" },
+ { ":eu:", "&#x1f1ea;&#x1f1fa;" },
+ { ":euro:", "&#x1f4b6;" },
+ { ":european_castle:", "&#x1f3f0;" },
+ { ":european_post_office:", "&#x1f3e4;" },
+ { ":european_union:", "&#x1f1ea;&#x1f1fa;" },
+ { ":evergreen_tree:", "&#x1f332;" },
+ { ":exclamation:", "&#x2757;" },
+ { ":expressionless:", "&#x1f611;" },
+ { ":eye:", "&#x1f441;" },
+ { ":eye_speech_bubble:", "&#x1f441;&#x1f5e8;" },
+ { ":eyeglasses:", "&#x1f453;" },
+ { ":eyes:", "&#x1f440;" },
+ { ":face_with_head_bandage:", "&#x1f915;" },
+ { ":face_with_thermometer:", "&#x1f912;" },
+ { ":facepunch:", "&#x1f44a;" },
+ { ":factory:", "&#x1f3ed;" },
+ { ":falkland_islands:", "&#x1f1eb;&#x1f1f0;" },
+ { ":fallen_leaf:", "&#x1f342;" },
+ { ":family:", "&#x1f46a;" },
+ { ":family_man_boy:", "&#x1f468;&#x1f466;" },
+ { ":family_man_boy_boy:", "&#x1f468;&#x1f466;&#x1f466;" },
+ { ":family_man_girl:", "&#x1f468;&#x1f467;" },
+ { ":family_man_girl_boy:", "&#x1f468;&#x1f467;&#x1f466;" },
+ { ":family_man_girl_girl:", "&#x1f468;&#x1f467;&#x1f467;" },
+ { ":family_man_man_boy:", "&#x1f468;&#x1f468;&#x1f466;" },
+ { ":family_man_man_boy_boy:", "&#x1f468;&#x1f468;&#x1f466;&#x1f466;" },
+ { ":family_man_man_girl:", "&#x1f468;&#x1f468;&#x1f467;" },
+ { ":family_man_man_girl_boy:", "&#x1f468;&#x1f468;&#x1f467;&#x1f466;" },
+ { ":family_man_man_girl_girl:", "&#x1f468;&#x1f468;&#x1f467;&#x1f467;" },
+ { ":family_man_woman_boy:", "&#x1f46a;" },
+ { ":family_man_woman_boy_boy:", "&#x1f468;&#x1f469;&#x1f466;&#x1f466;" },
+ { ":family_man_woman_girl:", "&#x1f468;&#x1f469;&#x1f467;" },
+ { ":family_man_woman_girl_boy:", "&#x1f468;&#x1f469;&#x1f467;&#x1f466;" },
+ { ":family_man_woman_girl_girl:", "&#x1f468;&#x1f469;&#x1f467;&#x1f467;" },
+ { ":family_woman_boy:", "&#x1f469;&#x1f466;" },
+ { ":family_woman_boy_boy:", "&#x1f469;&#x1f466;&#x1f466;" },
+ { ":family_woman_girl:", "&#x1f469;&#x1f467;" },
+ { ":family_woman_girl_boy:", "&#x1f469;&#x1f467;&#x1f466;" },
+ { ":family_woman_girl_girl:", "&#x1f469;&#x1f467;&#x1f467;" },
+ { ":family_woman_woman_boy:", "&#x1f469;&#x1f469;&#x1f466;" },
+ { ":family_woman_woman_boy_boy:", "&#x1f469;&#x1f469;&#x1f466;&#x1f466;" },
+ { ":family_woman_woman_girl:", "&#x1f469;&#x1f469;&#x1f467;" },
+ { ":family_woman_woman_girl_boy:", "&#x1f469;&#x1f469;&#x1f467;&#x1f466;" },
+ { ":family_woman_woman_girl_girl:", "&#x1f469;&#x1f469;&#x1f467;&#x1f467;" },
+ { ":faroe_islands:", "&#x1f1eb;&#x1f1f4;" },
+ { ":fast_forward:", "&#x23e9;" },
+ { ":fax:", "&#x1f4e0;" },
+ { ":fearful:", "&#x1f628;" },
+ { ":feet:", "&#x1f43e;" },
+ { ":female_detective:", "&#x1f575;&#x2640;" },
+ { ":ferris_wheel:", "&#x1f3a1;" },
+ { ":ferry:", "&#x26f4;" },
+ { ":field_hockey:", "&#x1f3d1;" },
+ { ":fiji:", "&#x1f1eb;&#x1f1ef;" },
+ { ":file_cabinet:", "&#x1f5c4;" },
+ { ":file_folder:", "&#x1f4c1;" },
+ { ":film_projector:", "&#x1f4fd;" },
+ { ":film_strip:", "&#x1f39e;" },
+ { ":finland:", "&#x1f1eb;&#x1f1ee;" },
+ { ":fire:", "&#x1f525;" },
+ { ":fire_engine:", "&#x1f692;" },
+ { ":fireworks:", "&#x1f386;" },
+ { ":first_quarter_moon:", "&#x1f313;" },
+ { ":first_quarter_moon_with_face:", "&#x1f31b;" },
+ { ":fish:", "&#x1f41f;" },
+ { ":fish_cake:", "&#x1f365;" },
+ { ":fishing_pole_and_fish:", "&#x1f3a3;" },
+ { ":fist:", "&#x270a;" },
+ { ":fist_left:", "&#x1f91b;" },
+ { ":fist_oncoming:", "&#x1f44a;" },
+ { ":fist_raised:", "&#x270a;" },
+ { ":fist_right:", "&#x1f91c;" },
+ { ":five:", "&#x0035;&#x20e3;" },
+ { ":flags:", "&#x1f38f;" },
+ { ":flashlight:", "&#x1f526;" },
+ { ":fleur_de_lis:", "&#x269c;" },
+ { ":flight_arrival:", "&#x1f6ec;" },
+ { ":flight_departure:", "&#x1f6eb;" },
+ { ":flipper:", "&#x1f42c;" },
+ { ":floppy_disk:", "&#x1f4be;" },
+ { ":flower_playing_cards:", "&#x1f3b4;" },
+ { ":flushed:", "&#x1f633;" },
+ { ":fog:", "&#x1f32b;" },
+ { ":foggy:", "&#x1f301;" },
+ { ":football:", "&#x1f3c8;" },
+ { ":footprints:", "&#x1f463;" },
+ { ":fork_and_knife:", "&#x1f374;" },
+ { ":fountain:", "&#x26f2;" },
+ { ":fountain_pen:", "&#x1f58b;" },
+ { ":four:", "&#x0034;&#x20e3;" },
+ { ":four_leaf_clover:", "&#x1f340;" },
+ { ":fox_face:", "&#x1f98a;" },
+ { ":fr:", "&#x1f1eb;&#x1f1f7;" },
+ { ":framed_picture:", "&#x1f5bc;" },
+ { ":free:", "&#x1f193;" },
+ { ":french_guiana:", "&#x1f1ec;&#x1f1eb;" },
+ { ":french_polynesia:", "&#x1f1f5;&#x1f1eb;" },
+ { ":french_southern_territories:", "&#x1f1f9;&#x1f1eb;" },
+ { ":fried_egg:", "&#x1f373;" },
+ { ":fried_shrimp:", "&#x1f364;" },
+ { ":fries:", "&#x1f35f;" },
+ { ":frog:", "&#x1f438;" },
+ { ":frowning:", "&#x1f626;" },
+ { ":frowning_face:", "&#x2639;" },
+ { ":frowning_man:", "&#x1f64d;&#x2642;" },
+ { ":frowning_woman:", "&#x1f64d;" },
+ { ":fu:", "&#x1f595;" },
+ { ":fuelpump:", "&#x26fd;" },
+ { ":full_moon:", "&#x1f315;" },
+ { ":full_moon_with_face:", "&#x1f31d;" },
+ { ":funeral_urn:", "&#x26b1;" },
+ { ":gabon:", "&#x1f1ec;&#x1f1e6;" },
+ { ":gambia:", "&#x1f1ec;&#x1f1f2;" },
+ { ":game_die:", "&#x1f3b2;" },
+ { ":gb:", "&#x1f1ec;&#x1f1e7;" },
+ { ":gear:", "&#x2699;" },
+ { ":gem:", "&#x1f48e;" },
+ { ":gemini:", "&#x264a;" },
+ { ":georgia:", "&#x1f1ec;&#x1f1ea;" },
+ { ":ghana:", "&#x1f1ec;&#x1f1ed;" },
+ { ":ghost:", "&#x1f47b;" },
+ { ":gibraltar:", "&#x1f1ec;&#x1f1ee;" },
+ { ":gift:", "&#x1f381;" },
+ { ":gift_heart:", "&#x1f49d;" },
+ { ":girl:", "&#x1f467;" },
+ { ":globe_with_meridians:", "&#x1f310;" },
+ { ":goal_net:", "&#x1f945;" },
+ { ":goat:", "&#x1f410;" },
+ { ":golf:", "&#x26f3;" },
+ { ":golfing_man:", "&#x1f3cc;" },
+ { ":golfing_woman:", "&#x1f3cc;&#x2640;" },
+ { ":gorilla:", "&#x1f98d;" },
+ { ":grapes:", "&#x1f347;" },
+ { ":greece:", "&#x1f1ec;&#x1f1f7;" },
+ { ":green_apple:", "&#x1f34f;" },
+ { ":green_book:", "&#x1f4d7;" },
+ { ":green_heart:", "&#x1f49a;" },
+ { ":green_salad:", "&#x1f957;" },
+ { ":greenland:", "&#x1f1ec;&#x1f1f1;" },
+ { ":grenada:", "&#x1f1ec;&#x1f1e9;" },
+ { ":grey_exclamation:", "&#x2755;" },
+ { ":grey_question:", "&#x2754;" },
+ { ":grimacing:", "&#x1f62c;" },
+ { ":grin:", "&#x1f601;" },
+ { ":grinning:", "&#x1f600;" },
+ { ":guadeloupe:", "&#x1f1ec;&#x1f1f5;" },
+ { ":guam:", "&#x1f1ec;&#x1f1fa;" },
+ { ":guardsman:", "&#x1f482;" },
+ { ":guardswoman:", "&#x1f482;&#x2640;" },
+ { ":guatemala:", "&#x1f1ec;&#x1f1f9;" },
+ { ":guernsey:", "&#x1f1ec;&#x1f1ec;" },
+ { ":guinea:", "&#x1f1ec;&#x1f1f3;" },
+ { ":guinea_bissau:", "&#x1f1ec;&#x1f1fc;" },
+ { ":guitar:", "&#x1f3b8;" },
+ { ":gun:", "&#x1f52b;" },
+ { ":guyana:", "&#x1f1ec;&#x1f1fe;" },
+ { ":haircut:", "&#x1f487;" },
+ { ":haircut_man:", "&#x1f487;&#x2642;" },
+ { ":haircut_woman:", "&#x1f487;" },
+ { ":haiti:", "&#x1f1ed;&#x1f1f9;" },
+ { ":hamburger:", "&#x1f354;" },
+ { ":hammer:", "&#x1f528;" },
+ { ":hammer_and_pick:", "&#x2692;" },
+ { ":hammer_and_wrench:", "&#x1f6e0;" },
+ { ":hamster:", "&#x1f439;" },
+ { ":hand:", "&#x270b;" },
+ { ":handbag:", "&#x1f45c;" },
+ { ":handshake:", "&#x1f91d;" },
+ { ":hankey:", "&#x1f4a9;" },
+ { ":hash:", "&#x0023;&#x20e3;" },
+ { ":hatched_chick:", "&#x1f425;" },
+ { ":hatching_chick:", "&#x1f423;" },
+ { ":headphones:", "&#x1f3a7;" },
+ { ":hear_no_evil:", "&#x1f649;" },
+ { ":heart:", "&#x2764;" },
+ { ":heart_decoration:", "&#x1f49f;" },
+ { ":heart_eyes:", "&#x1f60d;" },
+ { ":heart_eyes_cat:", "&#x1f63b;" },
+ { ":heartbeat:", "&#x1f493;" },
+ { ":heartpulse:", "&#x1f497;" },
+ { ":hearts:", "&#x2665;" },
+ { ":heavy_check_mark:", "&#x2714;" },
+ { ":heavy_division_sign:", "&#x2797;" },
+ { ":heavy_dollar_sign:", "&#x1f4b2;" },
+ { ":heavy_exclamation_mark:", "&#x2757;" },
+ { ":heavy_heart_exclamation:", "&#x2763;" },
+ { ":heavy_minus_sign:", "&#x2796;" },
+ { ":heavy_multiplication_x:", "&#x2716;" },
+ { ":heavy_plus_sign:", "&#x2795;" },
+ { ":helicopter:", "&#x1f681;" },
+ { ":herb:", "&#x1f33f;" },
+ { ":hibiscus:", "&#x1f33a;" },
+ { ":high_brightness:", "&#x1f506;" },
+ { ":high_heel:", "&#x1f460;" },
+ { ":hocho:", "&#x1f52a;" },
+ { ":hole:", "&#x1f573;" },
+ { ":honduras:", "&#x1f1ed;&#x1f1f3;" },
+ { ":honey_pot:", "&#x1f36f;" },
+ { ":honeybee:", "&#x1f41d;" },
+ { ":hong_kong:", "&#x1f1ed;&#x1f1f0;" },
+ { ":horse:", "&#x1f434;" },
+ { ":horse_racing:", "&#x1f3c7;" },
+ { ":hospital:", "&#x1f3e5;" },
+ { ":hot_pepper:", "&#x1f336;" },
+ { ":hotdog:", "&#x1f32d;" },
+ { ":hotel:", "&#x1f3e8;" },
+ { ":hotsprings:", "&#x2668;" },
+ { ":hourglass:", "&#x231b;" },
+ { ":hourglass_flowing_sand:", "&#x23f3;" },
+ { ":house:", "&#x1f3e0;" },
+ { ":house_with_garden:", "&#x1f3e1;" },
+ { ":houses:", "&#x1f3d8;" },
+ { ":hugs:", "&#x1f917;" },
+ { ":hungary:", "&#x1f1ed;&#x1f1fa;" },
+ { ":hushed:", "&#x1f62f;" },
+ { ":ice_cream:", "&#x1f368;" },
+ { ":ice_hockey:", "&#x1f3d2;" },
+ { ":ice_skate:", "&#x26f8;" },
+ { ":icecream:", "&#x1f366;" },
+ { ":iceland:", "&#x1f1ee;&#x1f1f8;" },
+ { ":id:", "&#x1f194;" },
+ { ":ideograph_advantage:", "&#x1f250;" },
+ { ":imp:", "&#x1f47f;" },
+ { ":inbox_tray:", "&#x1f4e5;" },
+ { ":incoming_envelope:", "&#x1f4e8;" },
+ { ":india:", "&#x1f1ee;&#x1f1f3;" },
+ { ":indonesia:", "&#x1f1ee;&#x1f1e9;" },
+ { ":information_desk_person:", "&#x1f481;" },
+ { ":information_source:", "&#x2139;" },
+ { ":innocent:", "&#x1f607;" },
+ { ":interrobang:", "&#x2049;" },
+ { ":iphone:", "&#x1f4f1;" },
+ { ":iran:", "&#x1f1ee;&#x1f1f7;" },
+ { ":iraq:", "&#x1f1ee;&#x1f1f6;" },
+ { ":ireland:", "&#x1f1ee;&#x1f1ea;" },
+ { ":isle_of_man:", "&#x1f1ee;&#x1f1f2;" },
+ { ":israel:", "&#x1f1ee;&#x1f1f1;" },
+ { ":it:", "&#x1f1ee;&#x1f1f9;" },
+ { ":izakaya_lantern:", "&#x1f3ee;" },
+ { ":jack_o_lantern:", "&#x1f383;" },
+ { ":jamaica:", "&#x1f1ef;&#x1f1f2;" },
+ { ":japan:", "&#x1f5fe;" },
+ { ":japanese_castle:", "&#x1f3ef;" },
+ { ":japanese_goblin:", "&#x1f47a;" },
+ { ":japanese_ogre:", "&#x1f479;" },
+ { ":jeans:", "&#x1f456;" },
+ { ":jersey:", "&#x1f1ef;&#x1f1ea;" },
+ { ":jordan:", "&#x1f1ef;&#x1f1f4;" },
+ { ":joy:", "&#x1f602;" },
+ { ":joy_cat:", "&#x1f639;" },
+ { ":joystick:", "&#x1f579;" },
+ { ":jp:", "&#x1f1ef;&#x1f1f5;" },
+ { ":kaaba:", "&#x1f54b;" },
+ { ":kazakhstan:", "&#x1f1f0;&#x1f1ff;" },
+ { ":kenya:", "&#x1f1f0;&#x1f1ea;" },
+ { ":key:", "&#x1f511;" },
+ { ":keyboard:", "&#x2328;" },
+ { ":keycap_ten:", "&#x1f51f;" },
+ { ":kick_scooter:", "&#x1f6f4;" },
+ { ":kimono:", "&#x1f458;" },
+ { ":kiribati:", "&#x1f1f0;&#x1f1ee;" },
+ { ":kiss:", "&#x1f48b;" },
+ { ":kissing:", "&#x1f617;" },
+ { ":kissing_cat:", "&#x1f63d;" },
+ { ":kissing_closed_eyes:", "&#x1f61a;" },
+ { ":kissing_heart:", "&#x1f618;" },
+ { ":kissing_smiling_eyes:", "&#x1f619;" },
+ { ":kiwi_fruit:", "&#x1f95d;" },
+ { ":knife:", "&#x1f52a;" },
+ { ":koala:", "&#x1f428;" },
+ { ":koko:", "&#x1f201;" },
+ { ":kosovo:", "&#x1f1fd;&#x1f1f0;" },
+ { ":kr:", "&#x1f1f0;&#x1f1f7;" },
+ { ":kuwait:", "&#x1f1f0;&#x1f1fc;" },
+ { ":kyrgyzstan:", "&#x1f1f0;&#x1f1ec;" },
+ { ":label:", "&#x1f3f7;" },
+ { ":lantern:", "&#x1f3ee;" },
+ { ":laos:", "&#x1f1f1;&#x1f1e6;" },
+ { ":large_blue_circle:", "&#x1f535;" },
+ { ":large_blue_diamond:", "&#x1f537;" },
+ { ":large_orange_diamond:", "&#x1f536;" },
+ { ":last_quarter_moon:", "&#x1f317;" },
+ { ":last_quarter_moon_with_face:", "&#x1f31c;" },
+ { ":latin_cross:", "&#x271d;" },
+ { ":latvia:", "&#x1f1f1;&#x1f1fb;" },
+ { ":laughing:", "&#x1f606;" },
+ { ":leaves:", "&#x1f343;" },
+ { ":lebanon:", "&#x1f1f1;&#x1f1e7;" },
+ { ":ledger:", "&#x1f4d2;" },
+ { ":left_luggage:", "&#x1f6c5;" },
+ { ":left_right_arrow:", "&#x2194;" },
+ { ":leftwards_arrow_with_hook:", "&#x21a9;" },
+ { ":lemon:", "&#x1f34b;" },
+ { ":leo:", "&#x264c;" },
+ { ":leopard:", "&#x1f406;" },
+ { ":lesotho:", "&#x1f1f1;&#x1f1f8;" },
+ { ":level_slider:", "&#x1f39a;" },
+ { ":liberia:", "&#x1f1f1;&#x1f1f7;" },
+ { ":libra:", "&#x264e;" },
+ { ":libya:", "&#x1f1f1;&#x1f1fe;" },
+ { ":liechtenstein:", "&#x1f1f1;&#x1f1ee;" },
+ { ":light_rail:", "&#x1f688;" },
+ { ":link:", "&#x1f517;" },
+ { ":lion:", "&#x1f981;" },
+ { ":lips:", "&#x1f444;" },
+ { ":lipstick:", "&#x1f484;" },
+ { ":lithuania:", "&#x1f1f1;&#x1f1f9;" },
+ { ":lizard:", "&#x1f98e;" },
+ { ":lock:", "&#x1f512;" },
+ { ":lock_with_ink_pen:", "&#x1f50f;" },
+ { ":lollipop:", "&#x1f36d;" },
+ { ":loop:", "&#x27bf;" },
+ { ":loud_sound:", "&#x1f50a;" },
+ { ":loudspeaker:", "&#x1f4e2;" },
+ { ":love_hotel:", "&#x1f3e9;" },
+ { ":love_letter:", "&#x1f48c;" },
+ { ":low_brightness:", "&#x1f505;" },
+ { ":luxembourg:", "&#x1f1f1;&#x1f1fa;" },
+ { ":lying_face:", "&#x1f925;" },
+ { ":m:", "&#x24c2;" },
+ { ":macau:", "&#x1f1f2;&#x1f1f4;" },
+ { ":macedonia:", "&#x1f1f2;&#x1f1f0;" },
+ { ":madagascar:", "&#x1f1f2;&#x1f1ec;" },
+ { ":mag:", "&#x1f50d;" },
+ { ":mag_right:", "&#x1f50e;" },
+ { ":mahjong:", "&#x1f004;" },
+ { ":mailbox:", "&#x1f4eb;" },
+ { ":mailbox_closed:", "&#x1f4ea;" },
+ { ":mailbox_with_mail:", "&#x1f4ec;" },
+ { ":mailbox_with_no_mail:", "&#x1f4ed;" },
+ { ":malawi:", "&#x1f1f2;&#x1f1fc;" },
+ { ":malaysia:", "&#x1f1f2;&#x1f1fe;" },
+ { ":maldives:", "&#x1f1f2;&#x1f1fb;" },
+ { ":male_detective:", "&#x1f575;" },
+ { ":mali:", "&#x1f1f2;&#x1f1f1;" },
+ { ":malta:", "&#x1f1f2;&#x1f1f9;" },
+ { ":man:", "&#x1f468;" },
+ { ":man_artist:", "&#x1f468;&#x1f3a8;" },
+ { ":man_astronaut:", "&#x1f468;&#x1f680;" },
+ { ":man_cartwheeling:", "&#x1f938;&#x2642;" },
+ { ":man_cook:", "&#x1f468;&#x1f373;" },
+ { ":man_dancing:", "&#x1f57a;" },
+ { ":man_facepalming:", "&#x1f926;&#x2642;" },
+ { ":man_factory_worker:", "&#x1f468;&#x1f3ed;" },
+ { ":man_farmer:", "&#x1f468;&#x1f33e;" },
+ { ":man_firefighter:", "&#x1f468;&#x1f692;" },
+ { ":man_health_worker:", "&#x1f468;&#x2695;" },
+ { ":man_in_tuxedo:", "&#x1f935;" },
+ { ":man_judge:", "&#x1f468;&#x2696;" },
+ { ":man_juggling:", "&#x1f939;&#x2642;" },
+ { ":man_mechanic:", "&#x1f468;&#x1f527;" },
+ { ":man_office_worker:", "&#x1f468;&#x1f4bc;" },
+ { ":man_pilot:", "&#x1f468;&#x2708;" },
+ { ":man_playing_handball:", "&#x1f93e;&#x2642;" },
+ { ":man_playing_water_polo:", "&#x1f93d;&#x2642;" },
+ { ":man_scientist:", "&#x1f468;&#x1f52c;" },
+ { ":man_shrugging:", "&#x1f937;&#x2642;" },
+ { ":man_singer:", "&#x1f468;&#x1f3a4;" },
+ { ":man_student:", "&#x1f468;&#x1f393;" },
+ { ":man_teacher:", "&#x1f468;&#x1f3eb;" },
+ { ":man_technologist:", "&#x1f468;&#x1f4bb;" },
+ { ":man_with_gua_pi_mao:", "&#x1f472;" },
+ { ":man_with_turban:", "&#x1f473;" },
+ { ":mandarin:", "&#x1f34a;" },
+ { ":mans_shoe:", "&#x1f45e;" },
+ { ":mantelpiece_clock:", "&#x1f570;" },
+ { ":maple_leaf:", "&#x1f341;" },
+ { ":marshall_islands:", "&#x1f1f2;&#x1f1ed;" },
+ { ":martial_arts_uniform:", "&#x1f94b;" },
+ { ":martinique:", "&#x1f1f2;&#x1f1f6;" },
+ { ":mask:", "&#x1f637;" },
+ { ":massage:", "&#x1f486;" },
+ { ":massage_man:", "&#x1f486;&#x2642;" },
+ { ":massage_woman:", "&#x1f486;" },
+ { ":mauritania:", "&#x1f1f2;&#x1f1f7;" },
+ { ":mauritius:", "&#x1f1f2;&#x1f1fa;" },
+ { ":mayotte:", "&#x1f1fe;&#x1f1f9;" },
+ { ":meat_on_bone:", "&#x1f356;" },
+ { ":medal_military:", "&#x1f396;" },
+ { ":medal_sports:", "&#x1f3c5;" },
+ { ":mega:", "&#x1f4e3;" },
+ { ":melon:", "&#x1f348;" },
+ { ":memo:", "&#x1f4dd;" },
+ { ":men_wrestling:", "&#x1f93c;&#x2642;" },
+ { ":menorah:", "&#x1f54e;" },
+ { ":mens:", "&#x1f6b9;" },
+ { ":metal:", "&#x1f918;" },
+ { ":metro:", "&#x1f687;" },
+ { ":mexico:", "&#x1f1f2;&#x1f1fd;" },
+ { ":micronesia:", "&#x1f1eb;&#x1f1f2;" },
+ { ":microphone:", "&#x1f3a4;" },
+ { ":microscope:", "&#x1f52c;" },
+ { ":middle_finger:", "&#x1f595;" },
+ { ":milk_glass:", "&#x1f95b;" },
+ { ":milky_way:", "&#x1f30c;" },
+ { ":minibus:", "&#x1f690;" },
+ { ":minidisc:", "&#x1f4bd;" },
+ { ":mobile_phone_off:", "&#x1f4f4;" },
+ { ":moldova:", "&#x1f1f2;&#x1f1e9;" },
+ { ":monaco:", "&#x1f1f2;&#x1f1e8;" },
+ { ":money_mouth_face:", "&#x1f911;" },
+ { ":money_with_wings:", "&#x1f4b8;" },
+ { ":moneybag:", "&#x1f4b0;" },
+ { ":mongolia:", "&#x1f1f2;&#x1f1f3;" },
+ { ":monkey:", "&#x1f412;" },
+ { ":monkey_face:", "&#x1f435;" },
+ { ":monorail:", "&#x1f69d;" },
+ { ":montenegro:", "&#x1f1f2;&#x1f1ea;" },
+ { ":montserrat:", "&#x1f1f2;&#x1f1f8;" },
+ { ":moon:", "&#x1f314;" },
+ { ":morocco:", "&#x1f1f2;&#x1f1e6;" },
+ { ":mortar_board:", "&#x1f393;" },
+ { ":mosque:", "&#x1f54c;" },
+ { ":motor_boat:", "&#x1f6e5;" },
+ { ":motor_scooter:", "&#x1f6f5;" },
+ { ":motorcycle:", "&#x1f3cd;" },
+ { ":motorway:", "&#x1f6e3;" },
+ { ":mount_fuji:", "&#x1f5fb;" },
+ { ":mountain:", "&#x26f0;" },
+ { ":mountain_bicyclist:", "&#x1f6b5;" },
+ { ":mountain_biking_man:", "&#x1f6b5;" },
+ { ":mountain_biking_woman:", "&#x1f6b5;&#x2640;" },
+ { ":mountain_cableway:", "&#x1f6a0;" },
+ { ":mountain_railway:", "&#x1f69e;" },
+ { ":mountain_snow:", "&#x1f3d4;" },
+ { ":mouse:", "&#x1f42d;" },
+ { ":mouse2:", "&#x1f401;" },
+ { ":movie_camera:", "&#x1f3a5;" },
+ { ":moyai:", "&#x1f5ff;" },
+ { ":mozambique:", "&#x1f1f2;&#x1f1ff;" },
+ { ":mrs_claus:", "&#x1f936;" },
+ { ":muscle:", "&#x1f4aa;" },
+ { ":mushroom:", "&#x1f344;" },
+ { ":musical_keyboard:", "&#x1f3b9;" },
+ { ":musical_note:", "&#x1f3b5;" },
+ { ":musical_score:", "&#x1f3bc;" },
+ { ":mute:", "&#x1f507;" },
+ { ":myanmar:", "&#x1f1f2;&#x1f1f2;" },
+ { ":nail_care:", "&#x1f485;" },
+ { ":name_badge:", "&#x1f4db;" },
+ { ":namibia:", "&#x1f1f3;&#x1f1e6;" },
+ { ":national_park:", "&#x1f3de;" },
+ { ":nauru:", "&#x1f1f3;&#x1f1f7;" },
+ { ":nauseated_face:", "&#x1f922;" },
+ { ":necktie:", "&#x1f454;" },
+ { ":negative_squared_cross_mark:", "&#x274e;" },
+ { ":nepal:", "&#x1f1f3;&#x1f1f5;" },
+ { ":nerd_face:", "&#x1f913;" },
+ { ":netherlands:", "&#x1f1f3;&#x1f1f1;" },
+ { ":neutral_face:", "&#x1f610;" },
+ { ":new:", "&#x1f195;" },
+ { ":new_caledonia:", "&#x1f1f3;&#x1f1e8;" },
+ { ":new_moon:", "&#x1f311;" },
+ { ":new_moon_with_face:", "&#x1f31a;" },
+ { ":new_zealand:", "&#x1f1f3;&#x1f1ff;" },
+ { ":newspaper:", "&#x1f4f0;" },
+ { ":newspaper_roll:", "&#x1f5de;" },
+ { ":next_track_button:", "&#x23ed;" },
+ { ":ng:", "&#x1f196;" },
+ { ":ng_man:", "&#x1f645;&#x2642;" },
+ { ":ng_woman:", "&#x1f645;" },
+ { ":nicaragua:", "&#x1f1f3;&#x1f1ee;" },
+ { ":niger:", "&#x1f1f3;&#x1f1ea;" },
+ { ":nigeria:", "&#x1f1f3;&#x1f1ec;" },
+ { ":night_with_stars:", "&#x1f303;" },
+ { ":nine:", "&#x0039;&#x20e3;" },
+ { ":niue:", "&#x1f1f3;&#x1f1fa;" },
+ { ":no_bell:", "&#x1f515;" },
+ { ":no_bicycles:", "&#x1f6b3;" },
+ { ":no_entry:", "&#x26d4;" },
+ { ":no_entry_sign:", "&#x1f6ab;" },
+ { ":no_good:", "&#x1f645;" },
+ { ":no_good_man:", "&#x1f645;&#x2642;" },
+ { ":no_good_woman:", "&#x1f645;" },
+ { ":no_mobile_phones:", "&#x1f4f5;" },
+ { ":no_mouth:", "&#x1f636;" },
+ { ":no_pedestrians:", "&#x1f6b7;" },
+ { ":no_smoking:", "&#x1f6ad;" },
+ { ":non-potable_water:", "&#x1f6b1;" },
+ { ":norfolk_island:", "&#x1f1f3;&#x1f1eb;" },
+ { ":north_korea:", "&#x1f1f0;&#x1f1f5;" },
+ { ":northern_mariana_islands:", "&#x1f1f2;&#x1f1f5;" },
+ { ":norway:", "&#x1f1f3;&#x1f1f4;" },
+ { ":nose:", "&#x1f443;" },
+ { ":notebook:", "&#x1f4d3;" },
+ { ":notebook_with_decorative_cover:", "&#x1f4d4;" },
+ { ":notes:", "&#x1f3b6;" },
+ { ":nut_and_bolt:", "&#x1f529;" },
+ { ":o:", "&#x2b55;" },
+ { ":o2:", "&#x1f17e;" },
+ { ":ocean:", "&#x1f30a;" },
+ { ":octopus:", "&#x1f419;" },
+ { ":oden:", "&#x1f362;" },
+ { ":office:", "&#x1f3e2;" },
+ { ":oil_drum:", "&#x1f6e2;" },
+ { ":ok:", "&#x1f197;" },
+ { ":ok_hand:", "&#x1f44c;" },
+ { ":ok_man:", "&#x1f646;&#x2642;" },
+ { ":ok_woman:", "&#x1f646;" },
+ { ":old_key:", "&#x1f5dd;" },
+ { ":older_man:", "&#x1f474;" },
+ { ":older_woman:", "&#x1f475;" },
+ { ":om:", "&#x1f549;" },
+ { ":oman:", "&#x1f1f4;&#x1f1f2;" },
+ { ":on:", "&#x1f51b;" },
+ { ":oncoming_automobile:", "&#x1f698;" },
+ { ":oncoming_bus:", "&#x1f68d;" },
+ { ":oncoming_police_car:", "&#x1f694;" },
+ { ":oncoming_taxi:", "&#x1f696;" },
+ { ":one:", "&#x0031;&#x20e3;" },
+ { ":open_book:", "&#x1f4d6;" },
+ { ":open_file_folder:", "&#x1f4c2;" },
+ { ":open_hands:", "&#x1f450;" },
+ { ":open_mouth:", "&#x1f62e;" },
+ { ":open_umbrella:", "&#x2602;" },
+ { ":ophiuchus:", "&#x26ce;" },
+ { ":orange:", "&#x1f34a;" },
+ { ":orange_book:", "&#x1f4d9;" },
+ { ":orthodox_cross:", "&#x2626;" },
+ { ":outbox_tray:", "&#x1f4e4;" },
+ { ":owl:", "&#x1f989;" },
+ { ":ox:", "&#x1f402;" },
+ { ":package:", "&#x1f4e6;" },
+ { ":page_facing_up:", "&#x1f4c4;" },
+ { ":page_with_curl:", "&#x1f4c3;" },
+ { ":pager:", "&#x1f4df;" },
+ { ":paintbrush:", "&#x1f58c;" },
+ { ":pakistan:", "&#x1f1f5;&#x1f1f0;" },
+ { ":palau:", "&#x1f1f5;&#x1f1fc;" },
+ { ":palestinian_territories:", "&#x1f1f5;&#x1f1f8;" },
+ { ":palm_tree:", "&#x1f334;" },
+ { ":panama:", "&#x1f1f5;&#x1f1e6;" },
+ { ":pancakes:", "&#x1f95e;" },
+ { ":panda_face:", "&#x1f43c;" },
+ { ":paperclip:", "&#x1f4ce;" },
+ { ":paperclips:", "&#x1f587;" },
+ { ":papua_new_guinea:", "&#x1f1f5;&#x1f1ec;" },
+ { ":paraguay:", "&#x1f1f5;&#x1f1fe;" },
+ { ":parasol_on_ground:", "&#x26f1;" },
+ { ":parking:", "&#x1f17f;" },
+ { ":part_alternation_mark:", "&#x303d;" },
+ { ":partly_sunny:", "&#x26c5;" },
+ { ":passenger_ship:", "&#x1f6f3;" },
+ { ":passport_control:", "&#x1f6c2;" },
+ { ":pause_button:", "&#x23f8;" },
+ { ":paw_prints:", "&#x1f43e;" },
+ { ":peace_symbol:", "&#x262e;" },
+ { ":peach:", "&#x1f351;" },
+ { ":peanuts:", "&#x1f95c;" },
+ { ":pear:", "&#x1f350;" },
+ { ":pen:", "&#x1f58a;" },
+ { ":pencil:", "&#x1f4dd;" },
+ { ":pencil2:", "&#x270f;" },
+ { ":penguin:", "&#x1f427;" },
+ { ":pensive:", "&#x1f614;" },
+ { ":performing_arts:", "&#x1f3ad;" },
+ { ":persevere:", "&#x1f623;" },
+ { ":person_fencing:", "&#x1f93a;" },
+ { ":person_frowning:", "&#x1f64d;" },
+ { ":person_with_blond_hair:", "&#x1f471;" },
+ { ":person_with_pouting_face:", "&#x1f64e;" },
+ { ":peru:", "&#x1f1f5;&#x1f1ea;" },
+ { ":philippines:", "&#x1f1f5;&#x1f1ed;" },
+ { ":phone:", "&#x260e;" },
+ { ":pick:", "&#x26cf;" },
+ { ":pig:", "&#x1f437;" },
+ { ":pig2:", "&#x1f416;" },
+ { ":pig_nose:", "&#x1f43d;" },
+ { ":pill:", "&#x1f48a;" },
+ { ":pineapple:", "&#x1f34d;" },
+ { ":ping_pong:", "&#x1f3d3;" },
+ { ":pisces:", "&#x2653;" },
+ { ":pitcairn_islands:", "&#x1f1f5;&#x1f1f3;" },
+ { ":pizza:", "&#x1f355;" },
+ { ":place_of_worship:", "&#x1f6d0;" },
+ { ":plate_with_cutlery:", "&#x1f37d;" },
+ { ":play_or_pause_button:", "&#x23ef;" },
+ { ":point_down:", "&#x1f447;" },
+ { ":point_left:", "&#x1f448;" },
+ { ":point_right:", "&#x1f449;" },
+ { ":point_up:", "&#x261d;" },
+ { ":point_up_2:", "&#x1f446;" },
+ { ":poland:", "&#x1f1f5;&#x1f1f1;" },
+ { ":police_car:", "&#x1f693;" },
+ { ":policeman:", "&#x1f46e;" },
+ { ":policewoman:", "&#x1f46e;&#x2640;" },
+ { ":poodle:", "&#x1f429;" },
+ { ":poop:", "&#x1f4a9;" },
+ { ":popcorn:", "&#x1f37f;" },
+ { ":portugal:", "&#x1f1f5;&#x1f1f9;" },
+ { ":post_office:", "&#x1f3e3;" },
+ { ":postal_horn:", "&#x1f4ef;" },
+ { ":postbox:", "&#x1f4ee;" },
+ { ":potable_water:", "&#x1f6b0;" },
+ { ":potato:", "&#x1f954;" },
+ { ":pouch:", "&#x1f45d;" },
+ { ":poultry_leg:", "&#x1f357;" },
+ { ":pound:", "&#x1f4b7;" },
+ { ":pout:", "&#x1f621;" },
+ { ":pouting_cat:", "&#x1f63e;" },
+ { ":pouting_man:", "&#x1f64e;&#x2642;" },
+ { ":pouting_woman:", "&#x1f64e;" },
+ { ":pray:", "&#x1f64f;" },
+ { ":prayer_beads:", "&#x1f4ff;" },
+ { ":pregnant_woman:", "&#x1f930;" },
+ { ":previous_track_button:", "&#x23ee;" },
+ { ":prince:", "&#x1f934;" },
+ { ":princess:", "&#x1f478;" },
+ { ":printer:", "&#x1f5a8;" },
+ { ":puerto_rico:", "&#x1f1f5;&#x1f1f7;" },
+ { ":punch:", "&#x1f44a;" },
+ { ":purple_heart:", "&#x1f49c;" },
+ { ":purse:", "&#x1f45b;" },
+ { ":pushpin:", "&#x1f4cc;" },
+ { ":put_litter_in_its_place:", "&#x1f6ae;" },
+ { ":qatar:", "&#x1f1f6;&#x1f1e6;" },
+ { ":question:", "&#x2753;" },
+ { ":rabbit:", "&#x1f430;" },
+ { ":rabbit2:", "&#x1f407;" },
+ { ":racehorse:", "&#x1f40e;" },
+ { ":racing_car:", "&#x1f3ce;" },
+ { ":radio:", "&#x1f4fb;" },
+ { ":radio_button:", "&#x1f518;" },
+ { ":radioactive:", "&#x2622;" },
+ { ":rage:", "&#x1f621;" },
+ { ":railway_car:", "&#x1f683;" },
+ { ":railway_track:", "&#x1f6e4;" },
+ { ":rainbow:", "&#x1f308;" },
+ { ":rainbow_flag:", "&#x1f3f3;&#x1f308;" },
+ { ":raised_back_of_hand:", "&#x1f91a;" },
+ { ":raised_hand:", "&#x270b;" },
+ { ":raised_hand_with_fingers_splayed:", "&#x1f590;" },
+ { ":raised_hands:", "&#x1f64c;" },
+ { ":raising_hand:", "&#x1f64b;" },
+ { ":raising_hand_man:", "&#x1f64b;&#x2642;" },
+ { ":raising_hand_woman:", "&#x1f64b;" },
+ { ":ram:", "&#x1f40f;" },
+ { ":ramen:", "&#x1f35c;" },
+ { ":rat:", "&#x1f400;" },
+ { ":record_button:", "&#x23fa;" },
+ { ":recycle:", "&#x267b;" },
+ { ":red_car:", "&#x1f697;" },
+ { ":red_circle:", "&#x1f534;" },
+ { ":registered:", "&#x00ae;" },
+ { ":relaxed:", "&#x263a;" },
+ { ":relieved:", "&#x1f60c;" },
+ { ":reminder_ribbon:", "&#x1f397;" },
+ { ":repeat:", "&#x1f501;" },
+ { ":repeat_one:", "&#x1f502;" },
+ { ":rescue_worker_helmet:", "&#x26d1;" },
+ { ":restroom:", "&#x1f6bb;" },
+ { ":reunion:", "&#x1f1f7;&#x1f1ea;" },
+ { ":revolving_hearts:", "&#x1f49e;" },
+ { ":rewind:", "&#x23ea;" },
+ { ":rhinoceros:", "&#x1f98f;" },
+ { ":ribbon:", "&#x1f380;" },
+ { ":rice:", "&#x1f35a;" },
+ { ":rice_ball:", "&#x1f359;" },
+ { ":rice_cracker:", "&#x1f358;" },
+ { ":rice_scene:", "&#x1f391;" },
+ { ":right_anger_bubble:", "&#x1f5ef;" },
+ { ":ring:", "&#x1f48d;" },
+ { ":robot:", "&#x1f916;" },
+ { ":rocket:", "&#x1f680;" },
+ { ":rofl:", "&#x1f923;" },
+ { ":roll_eyes:", "&#x1f644;" },
+ { ":roller_coaster:", "&#x1f3a2;" },
+ { ":romania:", "&#x1f1f7;&#x1f1f4;" },
+ { ":rooster:", "&#x1f413;" },
+ { ":rose:", "&#x1f339;" },
+ { ":rosette:", "&#x1f3f5;" },
+ { ":rotating_light:", "&#x1f6a8;" },
+ { ":round_pushpin:", "&#x1f4cd;" },
+ { ":rowboat:", "&#x1f6a3;" },
+ { ":rowing_man:", "&#x1f6a3;" },
+ { ":rowing_woman:", "&#x1f6a3;&#x2640;" },
+ { ":ru:", "&#x1f1f7;&#x1f1fa;" },
+ { ":rugby_football:", "&#x1f3c9;" },
+ { ":runner:", "&#x1f3c3;" },
+ { ":running:", "&#x1f3c3;" },
+ { ":running_man:", "&#x1f3c3;" },
+ { ":running_shirt_with_sash:", "&#x1f3bd;" },
+ { ":running_woman:", "&#x1f3c3;&#x2640;" },
+ { ":rwanda:", "&#x1f1f7;&#x1f1fc;" },
+ { ":sa:", "&#x1f202;" },
+ { ":sagittarius:", "&#x2650;" },
+ { ":sailboat:", "&#x26f5;" },
+ { ":sake:", "&#x1f376;" },
+ { ":samoa:", "&#x1f1fc;&#x1f1f8;" },
+ { ":san_marino:", "&#x1f1f8;&#x1f1f2;" },
+ { ":sandal:", "&#x1f461;" },
+ { ":santa:", "&#x1f385;" },
+ { ":sao_tome_principe:", "&#x1f1f8;&#x1f1f9;" },
+ { ":satellite:", "&#x1f4e1;" },
+ { ":satisfied:", "&#x1f606;" },
+ { ":saudi_arabia:", "&#x1f1f8;&#x1f1e6;" },
+ { ":saxophone:", "&#x1f3b7;" },
+ { ":school:", "&#x1f3eb;" },
+ { ":school_satchel:", "&#x1f392;" },
+ { ":scissors:", "&#x2702;" },
+ { ":scorpion:", "&#x1f982;" },
+ { ":scorpius:", "&#x264f;" },
+ { ":scream:", "&#x1f631;" },
+ { ":scream_cat:", "&#x1f640;" },
+ { ":scroll:", "&#x1f4dc;" },
+ { ":seat:", "&#x1f4ba;" },
+ { ":secret:", "&#x3299;" },
+ { ":see_no_evil:", "&#x1f648;" },
+ { ":seedling:", "&#x1f331;" },
+ { ":selfie:", "&#x1f933;" },
+ { ":senegal:", "&#x1f1f8;&#x1f1f3;" },
+ { ":serbia:", "&#x1f1f7;&#x1f1f8;" },
+ { ":seven:", "&#x0037;&#x20e3;" },
+ { ":seychelles:", "&#x1f1f8;&#x1f1e8;" },
+ { ":shallow_pan_of_food:", "&#x1f958;" },
+ { ":shamrock:", "&#x2618;" },
+ { ":shark:", "&#x1f988;" },
+ { ":shaved_ice:", "&#x1f367;" },
+ { ":sheep:", "&#x1f411;" },
+ { ":shell:", "&#x1f41a;" },
+ { ":shield:", "&#x1f6e1;" },
+ { ":shinto_shrine:", "&#x26e9;" },
+ { ":ship:", "&#x1f6a2;" },
+ { ":shirt:", "&#x1f455;" },
+ { ":shit:", "&#x1f4a9;" },
+ { ":shoe:", "&#x1f45e;" },
+ { ":shopping:", "&#x1f6cd;" },
+ { ":shopping_cart:", "&#x1f6d2;" },
+ { ":shower:", "&#x1f6bf;" },
+ { ":shrimp:", "&#x1f990;" },
+ { ":sierra_leone:", "&#x1f1f8;&#x1f1f1;" },
+ { ":signal_strength:", "&#x1f4f6;" },
+ { ":singapore:", "&#x1f1f8;&#x1f1ec;" },
+ { ":sint_maarten:", "&#x1f1f8;&#x1f1fd;" },
+ { ":six:", "&#x0036;&#x20e3;" },
+ { ":six_pointed_star:", "&#x1f52f;" },
+ { ":ski:", "&#x1f3bf;" },
+ { ":skier:", "&#x26f7;" },
+ { ":skull:", "&#x1f480;" },
+ { ":skull_and_crossbones:", "&#x2620;" },
+ { ":sleeping:", "&#x1f634;" },
+ { ":sleeping_bed:", "&#x1f6cc;" },
+ { ":sleepy:", "&#x1f62a;" },
+ { ":slightly_frowning_face:", "&#x1f641;" },
+ { ":slightly_smiling_face:", "&#x1f642;" },
+ { ":slot_machine:", "&#x1f3b0;" },
+ { ":slovakia:", "&#x1f1f8;&#x1f1f0;" },
+ { ":slovenia:", "&#x1f1f8;&#x1f1ee;" },
+ { ":small_airplane:", "&#x1f6e9;" },
+ { ":small_blue_diamond:", "&#x1f539;" },
+ { ":small_orange_diamond:", "&#x1f538;" },
+ { ":small_red_triangle:", "&#x1f53a;" },
+ { ":small_red_triangle_down:", "&#x1f53b;" },
+ { ":smile:", "&#x1f604;" },
+ { ":smile_cat:", "&#x1f638;" },
+ { ":smiley:", "&#x1f603;" },
+ { ":smiley_cat:", "&#x1f63a;" },
+ { ":smiling_imp:", "&#x1f608;" },
+ { ":smirk:", "&#x1f60f;" },
+ { ":smirk_cat:", "&#x1f63c;" },
+ { ":smoking:", "&#x1f6ac;" },
+ { ":snail:", "&#x1f40c;" },
+ { ":snake:", "&#x1f40d;" },
+ { ":sneezing_face:", "&#x1f927;" },
+ { ":snowboarder:", "&#x1f3c2;" },
+ { ":snowflake:", "&#x2744;" },
+ { ":snowman:", "&#x26c4;" },
+ { ":snowman_with_snow:", "&#x2603;" },
+ { ":sob:", "&#x1f62d;" },
+ { ":soccer:", "&#x26bd;" },
+ { ":solomon_islands:", "&#x1f1f8;&#x1f1e7;" },
+ { ":somalia:", "&#x1f1f8;&#x1f1f4;" },
+ { ":soon:", "&#x1f51c;" },
+ { ":sos:", "&#x1f198;" },
+ { ":sound:", "&#x1f509;" },
+ { ":south_africa:", "&#x1f1ff;&#x1f1e6;" },
+ { ":south_georgia_south_sandwich_islands:", "&#x1f1ec;&#x1f1f8;" },
+ { ":south_sudan:", "&#x1f1f8;&#x1f1f8;" },
+ { ":space_invader:", "&#x1f47e;" },
+ { ":spades:", "&#x2660;" },
+ { ":spaghetti:", "&#x1f35d;" },
+ { ":sparkle:", "&#x2747;" },
+ { ":sparkler:", "&#x1f387;" },
+ { ":sparkles:", "&#x2728;" },
+ { ":sparkling_heart:", "&#x1f496;" },
+ { ":speak_no_evil:", "&#x1f64a;" },
+ { ":speaker:", "&#x1f508;" },
+ { ":speaking_head:", "&#x1f5e3;" },
+ { ":speech_balloon:", "&#x1f4ac;" },
+ { ":speedboat:", "&#x1f6a4;" },
+ { ":spider:", "&#x1f577;" },
+ { ":spider_web:", "&#x1f578;" },
+ { ":spiral_calendar:", "&#x1f5d3;" },
+ { ":spiral_notepad:", "&#x1f5d2;" },
+ { ":spoon:", "&#x1f944;" },
+ { ":squid:", "&#x1f991;" },
+ { ":sri_lanka:", "&#x1f1f1;&#x1f1f0;" },
+ { ":st_barthelemy:", "&#x1f1e7;&#x1f1f1;" },
+ { ":st_helena:", "&#x1f1f8;&#x1f1ed;" },
+ { ":st_kitts_nevis:", "&#x1f1f0;&#x1f1f3;" },
+ { ":st_lucia:", "&#x1f1f1;&#x1f1e8;" },
+ { ":st_pierre_miquelon:", "&#x1f1f5;&#x1f1f2;" },
+ { ":st_vincent_grenadines:", "&#x1f1fb;&#x1f1e8;" },
+ { ":stadium:", "&#x1f3df;" },
+ { ":star:", "&#x2b50;" },
+ { ":star2:", "&#x1f31f;" },
+ { ":star_and_crescent:", "&#x262a;" },
+ { ":star_of_david:", "&#x2721;" },
+ { ":stars:", "&#x1f320;" },
+ { ":station:", "&#x1f689;" },
+ { ":statue_of_liberty:", "&#x1f5fd;" },
+ { ":steam_locomotive:", "&#x1f682;" },
+ { ":stew:", "&#x1f372;" },
+ { ":stop_button:", "&#x23f9;" },
+ { ":stop_sign:", "&#x1f6d1;" },
+ { ":stopwatch:", "&#x23f1;" },
+ { ":straight_ruler:", "&#x1f4cf;" },
+ { ":strawberry:", "&#x1f353;" },
+ { ":stuck_out_tongue:", "&#x1f61b;" },
+ { ":stuck_out_tongue_closed_eyes:", "&#x1f61d;" },
+ { ":stuck_out_tongue_winking_eye:", "&#x1f61c;" },
+ { ":studio_microphone:", "&#x1f399;" },
+ { ":stuffed_flatbread:", "&#x1f959;" },
+ { ":sudan:", "&#x1f1f8;&#x1f1e9;" },
+ { ":sun_behind_large_cloud:", "&#x1f325;" },
+ { ":sun_behind_rain_cloud:", "&#x1f326;" },
+ { ":sun_behind_small_cloud:", "&#x1f324;" },
+ { ":sun_with_face:", "&#x1f31e;" },
+ { ":sunflower:", "&#x1f33b;" },
+ { ":sunglasses:", "&#x1f60e;" },
+ { ":sunny:", "&#x2600;" },
+ { ":sunrise:", "&#x1f305;" },
+ { ":sunrise_over_mountains:", "&#x1f304;" },
+ { ":surfer:", "&#x1f3c4;" },
+ { ":surfing_man:", "&#x1f3c4;" },
+ { ":surfing_woman:", "&#x1f3c4;&#x2640;" },
+ { ":suriname:", "&#x1f1f8;&#x1f1f7;" },
+ { ":sushi:", "&#x1f363;" },
+ { ":suspension_railway:", "&#x1f69f;" },
+ { ":swaziland:", "&#x1f1f8;&#x1f1ff;" },
+ { ":sweat:", "&#x1f613;" },
+ { ":sweat_drops:", "&#x1f4a6;" },
+ { ":sweat_smile:", "&#x1f605;" },
+ { ":sweden:", "&#x1f1f8;&#x1f1ea;" },
+ { ":sweet_potato:", "&#x1f360;" },
+ { ":swimmer:", "&#x1f3ca;" },
+ { ":swimming_man:", "&#x1f3ca;" },
+ { ":swimming_woman:", "&#x1f3ca;&#x2640;" },
+ { ":switzerland:", "&#x1f1e8;&#x1f1ed;" },
+ { ":symbols:", "&#x1f523;" },
+ { ":synagogue:", "&#x1f54d;" },
+ { ":syria:", "&#x1f1f8;&#x1f1fe;" },
+ { ":syringe:", "&#x1f489;" },
+ { ":taco:", "&#x1f32e;" },
+ { ":tada:", "&#x1f389;" },
+ { ":taiwan:", "&#x1f1f9;&#x1f1fc;" },
+ { ":tajikistan:", "&#x1f1f9;&#x1f1ef;" },
+ { ":tanabata_tree:", "&#x1f38b;" },
+ { ":tangerine:", "&#x1f34a;" },
+ { ":tanzania:", "&#x1f1f9;&#x1f1ff;" },
+ { ":taurus:", "&#x2649;" },
+ { ":taxi:", "&#x1f695;" },
+ { ":tea:", "&#x1f375;" },
+ { ":telephone:", "&#x260e;" },
+ { ":telephone_receiver:", "&#x1f4de;" },
+ { ":telescope:", "&#x1f52d;" },
+ { ":tennis:", "&#x1f3be;" },
+ { ":tent:", "&#x26fa;" },
+ { ":thailand:", "&#x1f1f9;&#x1f1ed;" },
+ { ":thermometer:", "&#x1f321;" },
+ { ":thinking:", "&#x1f914;" },
+ { ":thought_balloon:", "&#x1f4ad;" },
+ { ":three:", "&#x0033;&#x20e3;" },
+ { ":thumbsdown:", "&#x1f44e;" },
+ { ":thumbsup:", "&#x1f44d;" },
+ { ":ticket:", "&#x1f3ab;" },
+ { ":tickets:", "&#x1f39f;" },
+ { ":tiger:", "&#x1f42f;" },
+ { ":tiger2:", "&#x1f405;" },
+ { ":timer_clock:", "&#x23f2;" },
+ { ":timor_leste:", "&#x1f1f9;&#x1f1f1;" },
+ { ":tipping_hand_man:", "&#x1f481;&#x2642;" },
+ { ":tipping_hand_woman:", "&#x1f481;" },
+ { ":tired_face:", "&#x1f62b;" },
+ { ":tm:", "&#x2122;" },
+ { ":togo:", "&#x1f1f9;&#x1f1ec;" },
+ { ":toilet:", "&#x1f6bd;" },
+ { ":tokelau:", "&#x1f1f9;&#x1f1f0;" },
+ { ":tokyo_tower:", "&#x1f5fc;" },
+ { ":tomato:", "&#x1f345;" },
+ { ":tonga:", "&#x1f1f9;&#x1f1f4;" },
+ { ":tongue:", "&#x1f445;" },
+ { ":top:", "&#x1f51d;" },
+ { ":tophat:", "&#x1f3a9;" },
+ { ":tornado:", "&#x1f32a;" },
+ { ":tr:", "&#x1f1f9;&#x1f1f7;" },
+ { ":trackball:", "&#x1f5b2;" },
+ { ":tractor:", "&#x1f69c;" },
+ { ":traffic_light:", "&#x1f6a5;" },
+ { ":train:", "&#x1f68b;" },
+ { ":train2:", "&#x1f686;" },
+ { ":tram:", "&#x1f68a;" },
+ { ":triangular_flag_on_post:", "&#x1f6a9;" },
+ { ":triangular_ruler:", "&#x1f4d0;" },
+ { ":trident:", "&#x1f531;" },
+ { ":trinidad_tobago:", "&#x1f1f9;&#x1f1f9;" },
+ { ":triumph:", "&#x1f624;" },
+ { ":trolleybus:", "&#x1f68e;" },
+ { ":trophy:", "&#x1f3c6;" },
+ { ":tropical_drink:", "&#x1f379;" },
+ { ":tropical_fish:", "&#x1f420;" },
+ { ":truck:", "&#x1f69a;" },
+ { ":trumpet:", "&#x1f3ba;" },
+ { ":tshirt:", "&#x1f455;" },
+ { ":tulip:", "&#x1f337;" },
+ { ":tumbler_glass:", "&#x1f943;" },
+ { ":tunisia:", "&#x1f1f9;&#x1f1f3;" },
+ { ":turkey:", "&#x1f983;" },
+ { ":turkmenistan:", "&#x1f1f9;&#x1f1f2;" },
+ { ":turks_caicos_islands:", "&#x1f1f9;&#x1f1e8;" },
+ { ":turtle:", "&#x1f422;" },
+ { ":tuvalu:", "&#x1f1f9;&#x1f1fb;" },
+ { ":tv:", "&#x1f4fa;" },
+ { ":twisted_rightwards_arrows:", "&#x1f500;" },
+ { ":two:", "&#x0032;&#x20e3;" },
+ { ":two_hearts:", "&#x1f495;" },
+ { ":two_men_holding_hands:", "&#x1f46c;" },
+ { ":two_women_holding_hands:", "&#x1f46d;" },
+ { ":u5272:", "&#x1f239;" },
+ { ":u5408:", "&#x1f234;" },
+ { ":u55b6:", "&#x1f23a;" },
+ { ":u6307:", "&#x1f22f;" },
+ { ":u6708:", "&#x1f237;" },
+ { ":u6709:", "&#x1f236;" },
+ { ":u6e80:", "&#x1f235;" },
+ { ":u7121:", "&#x1f21a;" },
+ { ":u7533:", "&#x1f238;" },
+ { ":u7981:", "&#x1f232;" },
+ { ":u7a7a:", "&#x1f233;" },
+ { ":uganda:", "&#x1f1fa;&#x1f1ec;" },
+ { ":uk:", "&#x1f1ec;&#x1f1e7;" },
+ { ":ukraine:", "&#x1f1fa;&#x1f1e6;" },
+ { ":umbrella:", "&#x2614;" },
+ { ":unamused:", "&#x1f612;" },
+ { ":underage:", "&#x1f51e;" },
+ { ":unicorn:", "&#x1f984;" },
+ { ":united_arab_emirates:", "&#x1f1e6;&#x1f1ea;" },
+ { ":unlock:", "&#x1f513;" },
+ { ":up:", "&#x1f199;" },
+ { ":upside_down_face:", "&#x1f643;" },
+ { ":uruguay:", "&#x1f1fa;&#x1f1fe;" },
+ { ":us:", "&#x1f1fa;&#x1f1f8;" },
+ { ":us_virgin_islands:", "&#x1f1fb;&#x1f1ee;" },
+ { ":uzbekistan:", "&#x1f1fa;&#x1f1ff;" },
+ { ":v:", "&#x270c;" },
+ { ":vanuatu:", "&#x1f1fb;&#x1f1fa;" },
+ { ":vatican_city:", "&#x1f1fb;&#x1f1e6;" },
+ { ":venezuela:", "&#x1f1fb;&#x1f1ea;" },
+ { ":vertical_traffic_light:", "&#x1f6a6;" },
+ { ":vhs:", "&#x1f4fc;" },
+ { ":vibration_mode:", "&#x1f4f3;" },
+ { ":video_camera:", "&#x1f4f9;" },
+ { ":video_game:", "&#x1f3ae;" },
+ { ":vietnam:", "&#x1f1fb;&#x1f1f3;" },
+ { ":violin:", "&#x1f3bb;" },
+ { ":virgo:", "&#x264d;" },
+ { ":volcano:", "&#x1f30b;" },
+ { ":volleyball:", "&#x1f3d0;" },
+ { ":vs:", "&#x1f19a;" },
+ { ":vulcan_salute:", "&#x1f596;" },
+ { ":walking:", "&#x1f6b6;" },
+ { ":walking_man:", "&#x1f6b6;" },
+ { ":walking_woman:", "&#x1f6b6;&#x2640;" },
+ { ":wallis_futuna:", "&#x1f1fc;&#x1f1eb;" },
+ { ":waning_crescent_moon:", "&#x1f318;" },
+ { ":waning_gibbous_moon:", "&#x1f316;" },
+ { ":warning:", "&#x26a0;" },
+ { ":wastebasket:", "&#x1f5d1;" },
+ { ":watch:", "&#x231a;" },
+ { ":water_buffalo:", "&#x1f403;" },
+ { ":watermelon:", "&#x1f349;" },
+ { ":wave:", "&#x1f44b;" },
+ { ":wavy_dash:", "&#x3030;" },
+ { ":waxing_crescent_moon:", "&#x1f312;" },
+ { ":waxing_gibbous_moon:", "&#x1f314;" },
+ { ":wc:", "&#x1f6be;" },
+ { ":weary:", "&#x1f629;" },
+ { ":wedding:", "&#x1f492;" },
+ { ":weight_lifting_man:", "&#x1f3cb;" },
+ { ":weight_lifting_woman:", "&#x1f3cb;&#x2640;" },
+ { ":western_sahara:", "&#x1f1ea;&#x1f1ed;" },
+ { ":whale:", "&#x1f433;" },
+ { ":whale2:", "&#x1f40b;" },
+ { ":wheel_of_dharma:", "&#x2638;" },
+ { ":wheelchair:", "&#x267f;" },
+ { ":white_check_mark:", "&#x2705;" },
+ { ":white_circle:", "&#x26aa;" },
+ { ":white_flag:", "&#x1f3f3;" },
+ { ":white_flower:", "&#x1f4ae;" },
+ { ":white_large_square:", "&#x2b1c;" },
+ { ":white_medium_small_square:", "&#x25fd;" },
+ { ":white_medium_square:", "&#x25fb;" },
+ { ":white_small_square:", "&#x25ab;" },
+ { ":white_square_button:", "&#x1f533;" },
+ { ":wilted_flower:", "&#x1f940;" },
+ { ":wind_chime:", "&#x1f390;" },
+ { ":wind_face:", "&#x1f32c;" },
+ { ":wine_glass:", "&#x1f377;" },
+ { ":wink:", "&#x1f609;" },
+ { ":wolf:", "&#x1f43a;" },
+ { ":woman:", "&#x1f469;" },
+ { ":woman_artist:", "&#x1f469;&#x1f3a8;" },
+ { ":woman_astronaut:", "&#x1f469;&#x1f680;" },
+ { ":woman_cartwheeling:", "&#x1f938;&#x2640;" },
+ { ":woman_cook:", "&#x1f469;&#x1f373;" },
+ { ":woman_facepalming:", "&#x1f926;&#x2640;" },
+ { ":woman_factory_worker:", "&#x1f469;&#x1f3ed;" },
+ { ":woman_farmer:", "&#x1f469;&#x1f33e;" },
+ { ":woman_firefighter:", "&#x1f469;&#x1f692;" },
+ { ":woman_health_worker:", "&#x1f469;&#x2695;" },
+ { ":woman_judge:", "&#x1f469;&#x2696;" },
+ { ":woman_juggling:", "&#x1f939;&#x2640;" },
+ { ":woman_mechanic:", "&#x1f469;&#x1f527;" },
+ { ":woman_office_worker:", "&#x1f469;&#x1f4bc;" },
+ { ":woman_pilot:", "&#x1f469;&#x2708;" },
+ { ":woman_playing_handball:", "&#x1f93e;&#x2640;" },
+ { ":woman_playing_water_polo:", "&#x1f93d;&#x2640;" },
+ { ":woman_scientist:", "&#x1f469;&#x1f52c;" },
+ { ":woman_shrugging:", "&#x1f937;&#x2640;" },
+ { ":woman_singer:", "&#x1f469;&#x1f3a4;" },
+ { ":woman_student:", "&#x1f469;&#x1f393;" },
+ { ":woman_teacher:", "&#x1f469;&#x1f3eb;" },
+ { ":woman_technologist:", "&#x1f469;&#x1f4bb;" },
+ { ":woman_with_turban:", "&#x1f473;&#x2640;" },
+ { ":womans_clothes:", "&#x1f45a;" },
+ { ":womans_hat:", "&#x1f452;" },
+ { ":women_wrestling:", "&#x1f93c;&#x2640;" },
+ { ":womens:", "&#x1f6ba;" },
+ { ":world_map:", "&#x1f5fa;" },
+ { ":worried:", "&#x1f61f;" },
+ { ":wrench:", "&#x1f527;" },
+ { ":writing_hand:", "&#x270d;" },
+ { ":x:", "&#x274c;" },
+ { ":yellow_heart:", "&#x1f49b;" },
+ { ":yemen:", "&#x1f1fe;&#x1f1ea;" },
+ { ":yen:", "&#x1f4b4;" },
+ { ":yin_yang:", "&#x262f;" },
+ { ":yum:", "&#x1f60b;" },
+ { ":zambia:", "&#x1f1ff;&#x1f1f2;" },
+ { ":zap:", "&#x26a1;" },
+ { ":zero:", "&#x0030;&#x20e3;" },
+ { ":zimbabwe:", "&#x1f1ff;&#x1f1fc;" },
+ { ":zipper_mouth_face:", "&#x1f910;" },
+ { ":zzz:", "&#x1f4a4;" }
+};
+
+static const int g_numEmojiEntities = (int)(sizeof(g_emojiEntities)/sizeof(*g_emojiEntities));
+
+EmojiEntityMapper *EmojiEntityMapper::s_instance = 0;
+
+EmojiEntityMapper::EmojiEntityMapper()
+{
+ m_name2symGh = new QDict<int>(1009);
+ m_name2symGh->setAutoDelete(TRUE);
+ // 2 loops to be able to give precedence to the unicodeName (CLDR)
+ for (int i = 0; i < g_numEmojiEntities; i++)
+ {
+ m_name2symGh->insert(g_emojiEntities[i].name, new int(i));
+ }
+}
+
+EmojiEntityMapper::~EmojiEntityMapper()
+{
+ delete m_name2symGh;
+}
+
+/** Returns the one and only instance of the Emoji entity mapper */
+EmojiEntityMapper *EmojiEntityMapper::instance()
+{
+ if (s_instance==0)
+ {
+ s_instance = new EmojiEntityMapper;
+ }
+ return s_instance;
+}
+
+/** Deletes the one and only instance of the Emoji entity mapper */
+void EmojiEntityMapper::deleteInstance()
+{
+ delete s_instance;
+ s_instance=0;
+}
+
+/*!
+ * @brief Returns a code for the requested Emoji entity name
+ * @param symName Emoji entity name
+ * @return the code for the requested Emoji entity name,
+ * in case the requested Emoji item does not exist `-1` is returned.
+ */
+int EmojiEntityMapper::symbol2index(const QCString &symName) const
+{
+ int *val = m_name2symGh->find(symName);
+ return val ? *val : -1;
+}
+
+/*!
+ * @brief Writes the list of supported emojis to the given file.
+ */
+void EmojiEntityMapper::writeEmojiFile(QFile &file)
+{
+ FTextStream t(&file);
+ for (int i = 0; i < g_numEmojiEntities; i++)
+ {
+ t << g_emojiEntities[i].name << endl;
+ }
+}
+
+/*! @brief Access routine to the unicode sequence for the Emoji entity
+ *
+ * @param symb code of the requested Emoji entity returned by symbol2index()
+ * @return the unicode sequence of the Emoji entity,
+ */
+const char *EmojiEntityMapper::unicode(int index) const
+{
+ return index>=0 && index<g_numEmojiEntities ? g_emojiEntities[index].unicode : 0;
+}
+
+/*! @brief Access routine to the name of the Emoji entity
+ *
+ * @param symb code of the requested Emoji entity returned by symbol2index()
+ * @return the name of the Emoji entity in GitHub format (i.e. :smile:)
+ */
+const char *EmojiEntityMapper::name(int index) const
+{
+ return index>=0 && index<g_numEmojiEntities ? g_emojiEntities[index].name : 0;
+}
+
+
diff --git a/src/emoji.h b/src/emoji.h
new file mode 100644
index 0000000..f24a2c0
--- /dev/null
+++ b/src/emoji.h
@@ -0,0 +1,41 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2018 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 EMOJIENTITY_H
+#define EMOJIENTITY_H
+
+#include <qdict.h>
+#include <qfile.h>
+
+class FTextStream;
+
+/** @brief Singleton helper class to map emoji entities to other formats */
+class EmojiEntityMapper
+{
+ public:
+ static EmojiEntityMapper *instance();
+ static void deleteInstance();
+ const char *name(int index) const;
+ const char *unicode(int index) const;
+ void writeEmojiFile(QFile &file);
+ int symbol2index(const QCString &symName) const;
+
+ private:
+ EmojiEntityMapper();
+ ~EmojiEntityMapper();
+ static EmojiEntityMapper *s_instance;
+ QDict<int> *m_name2symGh;
+};
+
+#endif
diff --git a/src/entry.cpp b/src/entry.cpp
index a0460da..15c6fec 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -79,6 +79,8 @@ Entry::Entry(const Entry &e)
subGrouping = e.subGrouping;
callGraph = e.callGraph;
callerGraph = e.callerGraph;
+ referencedByRelation = e.referencedByRelation;
+ referencesRelation = e.referencesRelation;
virt = e.virt;
args = e.args;
bitfields = e.bitfields;
@@ -219,6 +221,8 @@ void Entry::reset()
{
static bool entryCallGraph = Config_getBool(CALL_GRAPH);
static bool entryCallerGraph = Config_getBool(CALLER_GRAPH);
+ static bool entryReferencedByRelation = Config_getBool(REFERENCED_BY_RELATION);
+ static bool entryReferencesRelation = Config_getBool(REFERENCES_RELATION);
//printf("Entry::reset()\n");
name.resize(0);
type.resize(0);
@@ -250,6 +254,8 @@ void Entry::reset()
mGrpId = -1;
callGraph = entryCallGraph;
callerGraph = entryCallerGraph;
+ referencedByRelation = entryReferencedByRelation;
+ referencesRelation = entryReferencesRelation;
section = EMPTY_SEC;
mtype = Method;
virt = Normal;
@@ -264,6 +270,7 @@ void Entry::reset()
protection = Public;
groupDocType = GROUPDOC_NORMAL;
id.resize(0);
+ metaData.resize(0);
m_sublist->clear();
extends->clear();
groups->clear();
diff --git a/src/entry.h b/src/entry.h
index 739b128..44e47da 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -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.
*
@@ -33,21 +33,21 @@ class ArgumentList;
struct ListItemInfo;
/** This class stores information about an inheritance relation
- */
-struct BaseInfo
+ */
+struct BaseInfo
{
/*! Creates an object representing an inheritance relation */
- BaseInfo(const char *n,Protection p,Specifier v) :
+ BaseInfo(const char *n,Protection p,Specifier v) :
name(n),prot(p),virt(v) {}
QCString name; //!< the name of the base class
Protection prot; //!< inheritance type
Specifier virt; //!< virtualness
};
-/** This struct is used to capture the tag file information
- * for an Entry.
+/** This struct is used to capture the tag file information
+ * for an Entry.
*/
-struct TagInfo
+struct TagInfo
{
QCString tagName;
QCString fileName;
@@ -55,7 +55,7 @@ struct TagInfo
};
/** Represents an unstructured piece of information, about an
- * entity found in the sources.
+ * entity found in the sources.
*
* parseMain() in scanner.l will generate a tree of these
* entries.
@@ -65,13 +65,13 @@ class Entry
public:
/*! Kind of entries that are supported */
- enum Sections {
- CLASS_SEC = 0x00000001,
+ enum Sections {
+ CLASS_SEC = 0x00000001,
NAMESPACE_SEC = 0x00000010,
COMPOUND_MASK = CLASS_SEC,
SCOPE_MASK = COMPOUND_MASK | NAMESPACE_SEC,
-
- CLASSDOC_SEC = 0x00000800,
+
+ CLASSDOC_SEC = 0x00000800,
STRUCTDOC_SEC = 0x00001000,
UNIONDOC_SEC = 0x00002000,
EXCEPTIONDOC_SEC = 0x00004000,
@@ -81,7 +81,7 @@ class Entry
CATEGORYDOC_SEC = 0x00040000,
SERVICEDOC_SEC = 0x00080000,
SINGLETONDOC_SEC = 0x00100000,
- COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC |
+ COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC |
INTERFACEDOC_SEC | EXCEPTIONDOC_SEC | PROTOCOLDOC_SEC |
CATEGORYDOC_SEC | SERVICEDOC_SEC | SINGLETONDOC_SEC,
@@ -134,7 +134,8 @@ class Entry
static const uint64 Enum = (1ULL<<12); // for Java-style enums
static const uint64 Service = (1ULL<<13); // UNO IDL
static const uint64 Singleton = (1ULL<<14); // UNO IDL
- static const uint64 ForwardDecl = (1ULL<<15); // forward declarad template classes
+ static const uint64 ForwardDecl = (1ULL<<15); // forward declared template classes
+ static const uint64 Local = (1ULL<<16); // for Slice types
// member specifiers (add new items to the beginning)
static const uint64 PrivateGettable = (1ULL<<20); // C# private getter
@@ -205,7 +206,7 @@ class Entry
/*! Returns the parent for this Entry or 0 if this entry has no parent. */
Entry *parent() const { return m_parent; }
- /*! Returns the list of children for this Entry
+ /*! Returns the list of children for this Entry
* @see addSubEntry() and removeSubEntry()
*/
const QList<Entry> *children() const { return m_sublist; }
@@ -213,14 +214,14 @@ class Entry
/*! Adds entry \a e as a child to this entry */
void addSubEntry (Entry* e) ;
- /*! Removes entry \a e from the list of children.
- * Returns a pointer to the entry or 0 if the entry was not a child.
+ /*! Removes entry \a e from the list of children.
+ * Returns a pointer to the entry or 0 if the entry was not a child.
* Note the entry will not be deleted.
- */
+ */
Entry *removeSubEntry(Entry *e);
/*! Restore the state of this Entry to the default value it has
- * at construction time.
+ * at construction time.
*/
void reset();
@@ -234,7 +235,7 @@ class Entry
// identification
int section; //!< entry type (see Sections);
- QCString type; //!< member type
+ QCString type; //!< member type
QCString name; //!< member name
TagInfo *tagInfo; //!< tag file info
@@ -242,14 +243,16 @@ class Entry
Protection protection; //!< class protection
MethodTypes mtype; //!< signal, slot, (dcop) method, or property?
uint64 spec; //!< class/member specifiers
- int initLines; //!< define/variable initializer lines to show
+ int initLines; //!< define/variable initializer lines to show
bool stat; //!< static ?
bool explicitExternal; //!< explicitly defined as external?
bool proto; //!< prototype ?
bool subGrouping; //!< automatically group class members?
bool callGraph; //!< do we need to draw the call graph?
bool callerGraph; //!< do we need to draw the caller graph?
- Specifier virt; //!< virtualness of the entry
+ bool referencedByRelation;//!< do we need to show the referenced by relation?
+ bool referencesRelation; //!< do we need to show the references relation?
+ Specifier virt; //!< virtualness of the entry
QCString args; //!< member argument string
QCString bitfields; //!< member's bit fields
ArgumentList *argList; //!< member arguments as a list
@@ -277,7 +280,7 @@ class Entry
int bodyLine; //!< line number of the definition in the source
int endBodyLine; //!< line number where the definition ends
int mGrpId; //!< member group id
- QList<BaseInfo> *extends; //!< list of base classes
+ QList<BaseInfo> *extends; //!< list of base classes
QList<Grouping> *groups; //!< list of groups this entry belongs to
QList<SectionInfo> *anchors; //!< list of anchors defined in this entry
QCString fileName; //!< file this entry was extracted from
@@ -290,6 +293,7 @@ class Entry
GroupDocType groupDocType;
QCString id; //!< libclang id
LocalToc localToc;
+ QCString metaData; //!< Slice metadata
static int num; //!< counts the total number of entries
@@ -297,7 +301,7 @@ class Entry
/// return the command name used to define GROUPDOC_SEC
const char *groupDocCmd() const
{
- switch( groupDocType )
+ switch( groupDocType )
{
case GROUPDOC_NORMAL: return "\\defgroup";
case GROUPDOC_ADD: return "\\addgroup";
@@ -307,11 +311,11 @@ class Entry
}
Grouping::GroupPri_t groupingPri() const
{
- if( section != GROUPDOC_SEC )
+ if( section != GROUPDOC_SEC )
{
return Grouping::GROUPING_LOWEST;
}
- switch( groupDocType )
+ switch( groupDocType )
{
case GROUPDOC_NORMAL: return Grouping::GROUPING_AUTO_DEF;
case GROUPDOC_ADD: return Grouping::GROUPING_AUTO_ADD;
@@ -320,11 +324,11 @@ class Entry
}
}
- private:
+ private:
void createSubtreeIndex(EntryNav *nav,FileStorage *storage,FileDef *fd);
Entry *m_parent; //!< parent node in the tree
QList<Entry> *m_sublist; //!< entries that are children of this one
- Entry &operator=(const Entry &);
+ Entry &operator=(const Entry &);
};
/** Wrapper for a node in the Entry tree.
@@ -357,13 +361,13 @@ class EntryNav
private:
- // navigation
+ // navigation
EntryNav *m_parent; //!< parent node in the tree
QList<EntryNav> *m_subList; //!< entries that are children of this one
// identification
int m_section; //!< entry type (see Sections);
- QCString m_type; //!< member type
+ QCString m_type; //!< member type
QCString m_name; //!< member name
TagInfo *m_tagInfo; //!< tag file info
FileDef *m_fileDef;
diff --git a/src/filedef.cpp b/src/filedef.cpp
index e2df9be..f9f68d1 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -85,6 +85,9 @@ FileDef::FileDef(const char *p,const char *nm,
setReference(lref);
setDiskName(dn?dn:nm);
m_classSDict = 0;
+ m_interfaceSDict = 0;
+ m_structSDict = 0;
+ m_exceptionSDict = 0;
m_includeList = 0;
m_includeDict = 0;
m_includedByList = 0;
@@ -112,6 +115,9 @@ FileDef::FileDef(const char *p,const char *nm,
FileDef::~FileDef()
{
delete m_classSDict;
+ delete m_interfaceSDict;
+ delete m_structSDict;
+ delete m_exceptionSDict;
delete m_includeDict;
delete m_includeList;
delete m_includedByDict;
@@ -239,18 +245,25 @@ void FileDef::writeTagFile(FTextStream &tagFile)
case LayoutDocEntry::FileClasses:
{
if (m_classSDict)
- {
- SDict<ClassDef>::Iterator ci(*m_classSDict);
- ClassDef *cd;
- for (ci.toFirst();(cd=ci.current());++ci)
- {
- if (cd->isLinkableInProject())
- {
- tagFile << " <class kind=\"" << cd->compoundTypeString() <<
- "\">" << convertToXML(cd->name()) << "</class>" << endl;
- }
- }
- }
+ writeClassesToTagFile(tagFile, m_classSDict);
+ }
+ break;
+ case LayoutDocEntry::FileInterfaces:
+ {
+ if (m_interfaceSDict)
+ writeClassesToTagFile(tagFile, m_interfaceSDict);
+ }
+ break;
+ case LayoutDocEntry::FileStructs:
+ {
+ if (m_structSDict)
+ writeClassesToTagFile(tagFile, m_structSDict);
+ }
+ break;
+ case LayoutDocEntry::FileExceptions:
+ {
+ if (m_exceptionSDict)
+ writeClassesToTagFile(tagFile, m_exceptionSDict);
}
break;
case LayoutDocEntry::FileNamespaces:
@@ -348,6 +361,10 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
{
ol.disable(OutputGenerator::Latex);
}
+ if (ol.isEnabled(OutputGenerator::Docbook) && !Config_getBool(DOCBOOK_PROGRAMLISTING))
+ {
+ ol.disable(OutputGenerator::Docbook);
+ }
if (ol.isEnabled(OutputGenerator::RTF) && !Config_getBool(RTF_SOURCE_CODE))
{
ol.disable(OutputGenerator::RTF);
@@ -413,6 +430,20 @@ void FileDef::writeBriefDescription(OutputList &ol)
ol.writeSynopsis();
}
+void FileDef::writeClassesToTagFile(FTextStream &tagFile, ClassSDict *d)
+{
+ SDict<ClassDef>::Iterator ci(*d);
+ ClassDef *cd;
+ for (ci.toFirst();(cd=ci.current());++ci)
+ {
+ if (cd->isLinkableInProject())
+ {
+ tagFile << " <class kind=\"" << cd->compoundTypeString() <<
+ "\">" << convertToXML(cd->name()) << "</class>" << endl;
+ }
+ }
+}
+
void FileDef::writeIncludeFiles(OutputList &ol)
{
if (m_includeList && m_includeList->count()>0)
@@ -553,10 +584,10 @@ void FileDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title,
if (m_namespaceSDict) m_namespaceSDict->writeDeclaration(ol,title,isConstantGroup);
}
-void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title)
+void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d)
{
// write list of classes
- if (m_classSDict) m_classSDict->writeDeclaration(ol,0,title,FALSE);
+ if (d) d->writeDeclaration(ol,0,title,FALSE);
}
void FileDef::writeInlineClasses(OutputList &ol)
@@ -642,14 +673,38 @@ void FileDef::writeSummaryLinks(OutputList &ol)
SrcLangExt lang=getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if ((lde->kind()==LayoutDocEntry::FileClasses &&
- m_classSDict && m_classSDict->declVisible()) ||
- (lde->kind()==LayoutDocEntry::FileNamespaces &&
- m_namespaceSDict && m_namespaceSDict->declVisible())
- )
+ if (lde->kind()==LayoutDocEntry::FileClasses && m_classSDict && m_classSDict->declVisible())
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = "nested-classes";
+ ol.writeSummaryLink(0,label,ls->title(lang),first);
+ first=FALSE;
+ }
+ else if (lde->kind()==LayoutDocEntry::FileInterfaces && m_interfaceSDict && m_interfaceSDict->declVisible())
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = "interfaces";
+ ol.writeSummaryLink(0,label,ls->title(lang),first);
+ first=FALSE;
+ }
+ else if (lde->kind()==LayoutDocEntry::FileStructs && m_structSDict && m_structSDict->declVisible())
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = "structs";
+ ol.writeSummaryLink(0,label,ls->title(lang),first);
+ first=FALSE;
+ }
+ else if (lde->kind()==LayoutDocEntry::FileExceptions && m_exceptionSDict && m_exceptionSDict->declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- QCString label = lde->kind()==LayoutDocEntry::FileClasses ? "nested-classes" : "namespaces";
+ QCString label = "exceptions";
+ ol.writeSummaryLink(0,label,ls->title(lang),first);
+ first=FALSE;
+ }
+ else if (lde->kind()==LayoutDocEntry::FileNamespaces && m_namespaceSDict && m_namespaceSDict->declVisible())
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = "namespaces";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
@@ -777,9 +832,27 @@ void FileDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::FileClasses:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang));
+ writeClassDeclarations(ol,ls->title(lang),m_classSDict);
}
- break;
+ break;
+ case LayoutDocEntry::FileInterfaces:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClassDeclarations(ol,ls->title(lang),m_interfaceSDict);
+ }
+ break;
+ case LayoutDocEntry::FileStructs:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClassDeclarations(ol,ls->title(lang),m_structSDict);
+ }
+ break;
+ case LayoutDocEntry::FileExceptions:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClassDeclarations(ol,ls->title(lang),m_exceptionSDict);
+ }
+ break;
case LayoutDocEntry::FileNamespaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
@@ -838,6 +911,9 @@ void FileDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::NamespaceNestedNamespaces:
case LayoutDocEntry::NamespaceNestedConstantGroups:
case LayoutDocEntry::NamespaceClasses:
+ case LayoutDocEntry::NamespaceInterfaces:
+ case LayoutDocEntry::NamespaceStructs:
+ case LayoutDocEntry::NamespaceExceptions:
case LayoutDocEntry::NamespaceInlineClasses:
case LayoutDocEntry::GroupClasses:
case LayoutDocEntry::GroupInlineClasses:
@@ -937,6 +1013,7 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu)
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
+ static bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
DevNullCodeDocInterface devNullIntf;
QCString title = m_docname;
@@ -947,6 +1024,7 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu)
QCString pageTitle = theTranslator->trSourceFile(title);
ol.disable(OutputGenerator::Man);
if (!latexSourceCode) ol.disable(OutputGenerator::Latex);
+ if (!docbookSourceCode) ol.disable(OutputGenerator::Docbook);
if (!rtfSourceCode) ol.disable(OutputGenerator::RTF);
bool isDocFile = isDocumentationFile();
@@ -978,13 +1056,14 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu)
if (isLinkable())
{
+ ol.pushGeneratorState();
if (latexSourceCode) ol.disable(OutputGenerator::Latex);
if (rtfSourceCode) ol.disable(OutputGenerator::RTF);
+ if (docbookSourceCode) ol.disable(OutputGenerator::Docbook);
ol.startTextLink(getOutputFileBase(),0);
ol.parseText(theTranslator->trGotoDocumentation());
ol.endTextLink();
- if (latexSourceCode) ol.enable(OutputGenerator::Latex);
- if (rtfSourceCode) ol.enable(OutputGenerator::RTF);
+ ol.popGeneratorState();
}
(void)sameTu;
@@ -1153,6 +1232,14 @@ void FileDef::insertMember(MemberDef *md)
addMemberToList(MemberListType_decTypedefMembers,md);
addMemberToList(MemberListType_docTypedefMembers,md);
break;
+ case MemberType_Sequence:
+ addMemberToList(MemberListType_decSequenceMembers,md);
+ addMemberToList(MemberListType_docSequenceMembers,md);
+ break;
+ case MemberType_Dictionary:
+ addMemberToList(MemberListType_decDictionaryMembers,md);
+ addMemberToList(MemberListType_docDictionaryMembers,md);
+ break;
case MemberType_Enumeration:
addMemberToList(MemberListType_decEnumMembers,md);
addMemberToList(MemberListType_docEnumMembers,md);
@@ -1177,17 +1264,36 @@ void FileDef::insertMember(MemberDef *md)
void FileDef::insertClass(ClassDef *cd)
{
if (cd->isHidden()) return;
- if (m_classSDict==0)
+
+ ClassSDict *d=0;
+ ClassSDict **dd=&m_classSDict;
+
+ if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
{
- m_classSDict = new ClassSDict(17);
+ if (cd->compoundType()==ClassDef::Interface)
+ {
+ dd = &m_interfaceSDict;
+ }
+ else if (cd->compoundType()==ClassDef::Struct)
+ {
+ dd = &m_structSDict;
+ }
+ else if (cd->compoundType()==ClassDef::Exception)
+ {
+ dd = &m_exceptionSDict;
+ }
}
+
+ if (*dd==0) *dd = new ClassSDict(17);
+ d = *dd;
+
if (Config_getBool(SORT_BRIEF_DOCS))
{
- m_classSDict->inSort(cd->name(),cd);
+ d->inSort(cd->name(),cd);
}
else
{
- m_classSDict->append(cd->name(),cd);
+ d->append(cd->name(),cd);
}
}
diff --git a/src/filedef.h b/src/filedef.h
index 9167249..fe3c81d 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -201,7 +201,7 @@ class FileDef : public Definition
void writeSourceLink(OutputList &ol);
void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
bool isConstantGroup);
- void writeClassDeclarations(OutputList &ol,const QCString &title);
+ void writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d);
void writeInlineClasses(OutputList &ol);
void startMemberDeclarations(OutputList &ol);
void endMemberDeclarations(OutputList &ol);
@@ -209,6 +209,7 @@ class FileDef : public Definition
void endMemberDocumentation(OutputList &ol);
void writeDetailedDescription(OutputList &ol,const QCString &title);
void writeBriefDescription(OutputList &ol);
+ void writeClassesToTagFile(FTextStream &t,ClassSDict *d);
QDict<IncludeInfo> *m_includeDict;
QList<IncludeInfo> *m_includeList;
@@ -233,6 +234,9 @@ class FileDef : public Definition
MemberGroupSDict *m_memberGroupSDict;
NamespaceSDict *m_namespaceSDict;
ClassSDict *m_classSDict;
+ ClassSDict *m_interfaceSDict;
+ ClassSDict *m_structSDict;
+ ClassSDict *m_exceptionSDict;
bool m_subGrouping;
};
diff --git a/src/fortrancode.l b/src/fortrancode.l
index 3014dc3..0e610fd 100644
--- a/src/fortrancode.l
+++ b/src/fortrancode.l
@@ -107,8 +107,9 @@ class Scope
public:
QCStringList useNames; //!< contains names of used modules
QDict<void> localVars; //!< contains names of local variables
+ QDict<void> externalVars; //!< contains names of external entities
- Scope() : localVars(7, FALSE /*caseSensitive*/) {}
+ Scope() : localVars(7, FALSE /*caseSensitive*/), externalVars(7, FALSE /*caseSensitive*/) {}
};
/*===================================================================*/
@@ -122,6 +123,7 @@ static QCString currentClass=0; //!< name of the current enclosing
static UseSDict *useMembers= new UseSDict; //!< info about used modules
static UseEntry *useEntry = 0; //!< current use statement info
static QList<Scope> scopeStack;
+static bool g_isExternal = false;
// static QCStringList *currentUseNames= new QCStringList; //! contains names of used modules of current program unit
static QCString str=""; //!> contents of fortran string
@@ -434,7 +436,7 @@ static bool getFortranDefs(const QCString &memberName, const QCString &moduleNam
Scope *scope;
for (it.toLast();(scope=it.current());--it)
{
- if (scope->localVars.find(memberName))
+ if (scope->localVars.find(memberName) && (!scope->externalVars.find(memberName)))
return FALSE;
}
@@ -648,7 +650,10 @@ static void addUse(const QCString &moduleName)
static void addLocalVar(const QCString &varName)
{
if (!scopeStack.isEmpty())
+ {
scopeStack.getLast()->localVars.insert(varName, (void*)1);
+ if (g_isExternal) scopeStack.getLast()->externalVars.insert(varName, (void*)1);
+ }
}
//----------------------------------------------------------------------------
@@ -969,11 +974,18 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
endFontClass();
}
<Start>{ATTR_SPEC} {
+ if (QCString(yytext) == "external")
+ {
+ yy_push_state(YY_START);
+ BEGIN(Declaration);
+ g_isExternal = true;
+ }
startFontClass("keywordtype");
g_code->codify(yytext);
endFontClass();
}
<Declaration>({TYPE_SPEC}|{ATTR_SPEC})/[,:( ] { //| variable declaration
+ if (QCString(yytext) == "external") g_isExternal = true;
startFontClass("keywordtype");
g_code->codify(yytext);
endFontClass();
@@ -1046,6 +1058,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")
g_contLineNr++;
if (!(g_hasContLine && g_hasContLine[g_contLineNr - 1]))
{
+ g_isExternal = false;
yy_pop_state();
}
YY_FTN_RESET
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index 884c86e..5f10669 100644
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -231,6 +231,8 @@ static void updateVariablePrepassComment(int from, int to);
static void newLine();
static void initEntry();
+static const char *stateToString(int state);
+
//-----------------------------------------------------------------------------
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
@@ -1638,7 +1640,7 @@ const char* prepassFixedForm(const char* contents, int *hasContLine)
}
// fallthrough
default:
- if ((column < 6) && ((c - '0') >= 0) && ((c - '0') <= 9)) { // remove numbers, i.e. labels from first 5 positions.
+ if (!commented && (column < 6) && ((c - '0') >= 0) && ((c - '0') <= 9)) { // remove numbers, i.e. labels from first 5 positions.
newContents[j]=' ';
}
else if(column==6 && emptyLabel) { // continuation
@@ -2759,7 +2761,7 @@ void FortranLanguageScanner::parsePrototype(const char *text)
static void scanner_abort()
{
fprintf(stderr,"********************************************************************\n");
- fprintf(stderr,"Error in file %s line: %d, state: %d\n",yyFileName.data(),yyLineNr,YY_START);
+ fprintf(stderr,"Error in file %s line: %d, state: %d(%s)\n",yyFileName.data(),yyLineNr,YY_START,stateToString(YY_START));
fprintf(stderr,"********************************************************************\n");
EntryListIterator eli(*global_root->children());
@@ -2788,3 +2790,47 @@ extern "C" { // some bogus code to keep the compiler happy
}
#endif
+#define scanStateToString(x) case x: resultString = #x; break;
+static const char *stateToString(int state)
+{
+ const char *resultString;
+ switch(state)
+ {
+ scanStateToString(INITIAL)
+ scanStateToString(Subprog)
+ scanStateToString(SubprogPrefix)
+ scanStateToString(Parameterlist)
+ scanStateToString(SubprogBody)
+ scanStateToString(SubprogBodyContains)
+ scanStateToString(Start)
+ scanStateToString(Comment)
+ scanStateToString(Module)
+ scanStateToString(Program)
+ scanStateToString(ModuleBody)
+ scanStateToString(ModuleBodyContains)
+ scanStateToString(AttributeList)
+ scanStateToString(Variable)
+ scanStateToString(Initialization)
+ scanStateToString(ArrayInitializer)
+ scanStateToString(Enum)
+ scanStateToString(Typedef)
+ scanStateToString(TypedefBody)
+ scanStateToString(TypedefBodyContains)
+ scanStateToString(InterfaceBody)
+ scanStateToString(StrIgnore)
+ scanStateToString(String)
+ scanStateToString(Use)
+ scanStateToString(UseOnly)
+ scanStateToString(ModuleProcedure)
+ scanStateToString(Prepass)
+ scanStateToString(DocBlock)
+ scanStateToString(DocBackLine)
+ scanStateToString(EndDoc)
+ scanStateToString(BlockData)
+ scanStateToString(Prototype)
+ scanStateToString(PrototypeSubprog)
+ scanStateToString(PrototypeArgs)
+ default: resultString = "Unknown"; break;
+ }
+ return resultString;
+}
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
index cee39f2..ea57eb7 100644
--- a/src/ftvhelp.cpp
+++ b/src/ftvhelp.cpp
@@ -35,6 +35,7 @@
#include "docparser.h"
#include "htmldocvisitor.h"
#include "filedef.h"
+#include "classdef.h"
#include "util.h"
#include "resourcemgr.h"
@@ -171,11 +172,10 @@ void FTVHelp::decContentsDepth()
/*! Add a list item to the contents file.
* \param isDir TRUE if the item is a directory, FALSE if it is a text
- * \param name The name of the item.
+ * \param name the name of the item.
* \param ref the URL of to the item.
* \param file the file containing the definition of the item
* \param anchor the anchor within the file.
- * \param name the name of the item.
* \param separateIndex put the entries in a separate index file
* \param addToNavIndex add this entry to the quick navigation index
* \param def Definition corresponding to this entry
@@ -332,6 +332,27 @@ static void generateBriefDoc(FTextStream &t,Definition *def)
}
}
+static char compoundIcon(ClassDef *cd)
+{
+ char icon='C';
+ if (cd->getLanguage() == SrcLangExt_Slice)
+ {
+ if (cd->compoundType()==ClassDef::Interface)
+ {
+ icon='I';
+ }
+ else if (cd->compoundType()==ClassDef::Struct)
+ {
+ icon='S';
+ }
+ else if (cd->compoundType()==ClassDef::Exception)
+ {
+ icon='E';
+ }
+ }
+ return icon;
+}
+
void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,int maxLevel,int &index)
{
QListIterator<FTVNode> nli(nl);
@@ -360,11 +381,19 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
}
else if (n->def && n->def->definitionType()==Definition::TypeNamespace)
{
- t << "<span class=\"icona\"><span class=\"icon\">N</span></span>";
+ if (n->def->getLanguage() == SrcLangExt_Slice)
+ {
+ t << "<span class=\"icona\"><span class=\"icon\">M</span></span>";
+ }
+ else
+ {
+ t << "<span class=\"icona\"><span class=\"icon\">N</span></span>";
+ }
}
else if (n->def && n->def->definitionType()==Definition::TypeClass)
{
- t << "<span class=\"icona\"><span class=\"icon\">C</span></span>";
+ char icon=compoundIcon(dynamic_cast<ClassDef*>(n->def));
+ t << "<span class=\"icona\"><span class=\"icon\">" << icon << "</span></span>";
}
else
{
@@ -408,11 +437,19 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
}
else if (n->def && n->def->definitionType()==Definition::TypeNamespace)
{
- t << "<span class=\"icona\"><span class=\"icon\">N</span></span>";
+ if (n->def->getLanguage() == SrcLangExt_Slice)
+ {
+ t << "<span class=\"icona\"><span class=\"icon\">M</span></span>";
+ }
+ else
+ {
+ t << "<span class=\"icona\"><span class=\"icon\">N</span></span>";
+ }
}
else if (n->def && n->def->definitionType()==Definition::TypeClass)
{
- t << "<span class=\"icona\"><span class=\"icon\">C</span></span>";
+ char icon=compoundIcon(dynamic_cast<ClassDef*>(n->def));
+ t << "<span class=\"icona\"><span class=\"icon\">" << icon << "</span></span>";
}
else
{
@@ -791,10 +828,13 @@ void FTVHelp::generateTreeViewInline(FTextStream &t)
}
//printf("preferred depth=%d\n",preferredDepth);
- t << "<table class=\"directory\">\n";
- int index=0;
- generateTree(t,m_indentNodes[0],0,preferredDepth,index);
- t << "</table>\n";
+ if (m_indentNodes[0].count())
+ {
+ t << "<table class=\"directory\">\n";
+ int index=0;
+ generateTree(t,m_indentNodes[0],0,preferredDepth,index);
+ t << "</table>\n";
+ }
t << "</div><!-- directory -->\n";
}
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index ccfa0df..e543d16 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -165,7 +165,7 @@ bool GroupDef::addClass(const ClassDef *cd)
if (i==-1) i=qn.find('.');
bool found=FALSE;
//printf("i=%d\n",i);
- if (i!=-1)
+ if (i>0)
{
// add nested classes (e.g. A::B, A::C) after their parent (A) in
// order of insertion
@@ -1220,8 +1220,14 @@ void GroupDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::NamespaceNestedNamespaces:
case LayoutDocEntry::NamespaceNestedConstantGroups:
case LayoutDocEntry::NamespaceClasses:
+ case LayoutDocEntry::NamespaceInterfaces:
+ case LayoutDocEntry::NamespaceStructs:
+ case LayoutDocEntry::NamespaceExceptions:
case LayoutDocEntry::NamespaceInlineClasses:
case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileInterfaces:
+ case LayoutDocEntry::FileStructs:
+ case LayoutDocEntry::FileExceptions:
case LayoutDocEntry::FileNamespaces:
case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 48f3b91..ea37cea 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -34,10 +34,36 @@
#include "filedef.h"
#include "memberdef.h"
#include "htmlentity.h"
+#include "emoji.h"
#include "plantuml.h"
static const int NUM_HTML_LIST_TYPES = 4;
static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
+enum contexts_t
+{
+ NONE, // 0
+ STARTLI, // 1
+ STARTDD, // 2
+ ENDLI, // 3
+ ENDDD, // 4
+ STARTTD, // 5
+ ENDTD, // 6
+ INTERLI, // 7
+ INTERDD, // 8
+ INTERTD // 9
+};
+static const char *contexts[10] =
+{ "", // 0
+ "startli", // 1
+ "startdd", // 2
+ "endli", // 3
+ "enddd", // 4
+ "starttd", // 5
+ "endtd", // 6
+ "interli", // 7
+ "interdd", // 8
+ "intertd" // 9
+};
static QCString convertIndexWordToAnchor(const QString &word)
{
@@ -108,6 +134,7 @@ static bool mustBeOutsideParagraph(DocNode *n)
case DocNode::Kind_HtmlBlockQuote:
/* \parblock */
case DocNode::Kind_ParBlock:
+ case DocNode::Kind_IncOperator:
return TRUE;
case DocNode::Kind_Verbatim:
{
@@ -126,7 +153,59 @@ static bool mustBeOutsideParagraph(DocNode *n)
return FALSE;
}
-static QString htmlAttribsToString(const HtmlAttribList &attribs, const bool img_tag = FALSE)
+static bool isDocVerbatimVisible(DocVerbatim *s)
+{
+ switch(s->type())
+ {
+ case DocVerbatim::ManOnly:
+ case DocVerbatim::LatexOnly:
+ case DocVerbatim::XmlOnly:
+ case DocVerbatim::RtfOnly:
+ case DocVerbatim::DocbookOnly:
+ return FALSE;
+ default:
+ return TRUE;
+ }
+}
+
+static bool isDocIncludeVisible(DocInclude *s)
+{
+ switch (s->type())
+ {
+ case DocInclude::DontInclude:
+ case DocInclude::LatexInclude:
+ return FALSE;
+ default:
+ return TRUE;
+ }
+}
+
+static bool isDocIncOperatorVisible(DocIncOperator *s)
+{
+ switch (s->type())
+ {
+ case DocIncOperator::Skip:
+ return FALSE;
+ default:
+ return TRUE;
+ }
+}
+
+static bool isInvisibleNode(DocNode *node)
+{
+ return (node->kind()==DocNode::Kind_WhiteSpace)
+ || // skip over image nodes that are not for HTML output
+ (node->kind()==DocNode::Kind_Image && ((DocImage*)node)->type()!=DocImage::Html)
+ || // skip over verbatim nodes that are not visible in the HTML output
+ (node->kind()==DocNode::Kind_Verbatim && !isDocVerbatimVisible((DocVerbatim*)node))
+ || // skip over include nodes that are not visible in the HTML output
+ (node->kind()==DocNode::Kind_Include && !isDocIncludeVisible((DocInclude*)node))
+ || // skip over include operator nodes that are not visible in the HTML output
+ (node->kind()==DocNode::Kind_IncOperator && !isDocIncOperatorVisible((DocIncOperator*)node))
+ ;
+}
+
+static QString htmlAttribsToString(const HtmlAttribList &attribs, bool img_tag = FALSE)
{
QString result;
HtmlAttribListIterator li(attribs);
@@ -209,6 +288,20 @@ void HtmlDocVisitor::visit(DocSymbol *s)
}
}
+void HtmlDocVisitor::visit(DocEmoji *s)
+{
+ if (m_hide) return;
+ const char *res = EmojiEntityMapper::instance()->unicode(s->index());
+ if (res)
+ {
+ m_t << res;
+ }
+ else
+ {
+ m_t << s->name();
+ }
+}
+
void HtmlDocVisitor::writeObfuscatedMailAddress(const QCString &url)
{
m_t << "<a href=\"#\" onclick=\"location.href='mai'+'lto:'";
@@ -363,7 +456,6 @@ static void visitCaption(HtmlDocVisitor *parent, QList<DocNode> children)
for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
}
-
void HtmlDocVisitor::visit(DocVerbatim *s)
{
if (m_hide) return;
@@ -403,10 +495,12 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
m_t << "</pre>" /*<< PREFRAG_END*/;
forceStartParagraph(s);
break;
- case DocVerbatim::HtmlOnly:
- if (s->isBlock()) forceEndParagraph(s);
- m_t << s->text();
- if (s->isBlock()) forceStartParagraph(s);
+ case DocVerbatim::HtmlOnly:
+ {
+ if (s->isBlock()) forceEndParagraph(s);
+ m_t << s->text();
+ if (s->isBlock()) forceStartParagraph(s);
+ }
break;
case DocVerbatim::ManOnly:
case DocVerbatim::LatexOnly:
@@ -567,8 +661,12 @@ void HtmlDocVisitor::visit(DocInclude *inc)
break;
case DocInclude::DontInclude:
break;
- case DocInclude::HtmlInclude:
- m_t << inc->text();
+ case DocInclude::HtmlInclude:
+ {
+ if (inc->isBlock()) forceEndParagraph(inc);
+ m_t << inc->text();
+ if (inc->isBlock()) forceStartParagraph(inc);
+ }
break;
case DocInclude::LatexInclude:
break;
@@ -641,7 +739,7 @@ void HtmlDocVisitor::visit(DocIncOperator *op)
// op->type(),op->isFirst(),op->isLast(),op->text().data());
if (op->isFirst())
{
- forceStartParagraph(op);
+ forceEndParagraph(op);
if (!m_hide) m_t << PREFRAG_START;
pushEnabled();
m_hide=TRUE;
@@ -896,24 +994,24 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
}
isFirst=isFirstChildNode((DocParBlock*)p->parent(),p);
isLast =isLastChildNode ((DocParBlock*)p->parent(),p);
- t=0;
+ t=NONE;
if (isFirst)
{
if (kind==DocNode::Kind_HtmlListItem ||
kind==DocNode::Kind_SecRefItem)
{
- t=1;
+ t=STARTLI;
}
else if (kind==DocNode::Kind_HtmlDescData ||
kind==DocNode::Kind_XRefItem ||
kind==DocNode::Kind_SimpleSect)
{
- t=2;
+ t=STARTDD;
}
else if (kind==DocNode::Kind_HtmlCell ||
kind==DocNode::Kind_ParamList)
{
- t=5;
+ t=STARTTD;
}
}
if (isLast)
@@ -921,18 +1019,37 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
if (kind==DocNode::Kind_HtmlListItem ||
kind==DocNode::Kind_SecRefItem)
{
- t=3;
+ t=ENDLI;
+ }
+ else if (kind==DocNode::Kind_HtmlDescData ||
+ kind==DocNode::Kind_XRefItem ||
+ kind==DocNode::Kind_SimpleSect)
+ {
+ t=ENDDD;
+ }
+ else if (kind==DocNode::Kind_HtmlCell ||
+ kind==DocNode::Kind_ParamList)
+ {
+ t=ENDTD;
+ }
+ }
+ if (!isFirst && !isLast)
+ {
+ if (kind==DocNode::Kind_HtmlListItem ||
+ kind==DocNode::Kind_SecRefItem)
+ {
+ t=INTERLI;
}
else if (kind==DocNode::Kind_HtmlDescData ||
kind==DocNode::Kind_XRefItem ||
kind==DocNode::Kind_SimpleSect)
{
- t=4;
+ t=INTERDD;
}
else if (kind==DocNode::Kind_HtmlCell ||
kind==DocNode::Kind_ParamList)
{
- t=6;
+ t=INTERTD;
}
}
break;
@@ -940,47 +1057,51 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
case DocNode::Kind_AutoListItem:
isFirst=isFirstChildNode((DocAutoListItem*)p->parent(),p);
isLast =isLastChildNode ((DocAutoListItem*)p->parent(),p);
- t=1; // not used
+ t=STARTLI; // not used
break;
case DocNode::Kind_SimpleListItem:
isFirst=TRUE;
isLast =TRUE;
- t=1; // not used
+ t=STARTLI; // not used
break;
case DocNode::Kind_ParamList:
isFirst=TRUE;
isLast =TRUE;
- t=1; // not used
+ t=STARTLI; // not used
break;
case DocNode::Kind_HtmlListItem:
isFirst=isFirstChildNode((DocHtmlListItem*)p->parent(),p);
isLast =isLastChildNode ((DocHtmlListItem*)p->parent(),p);
- if (isFirst) t=1;
- if (isLast) t=3;
+ if (isFirst) t=STARTLI;
+ if (isLast) t=ENDLI;
+ if (!isFirst && !isLast) t = INTERLI;
break;
case DocNode::Kind_SecRefItem:
isFirst=isFirstChildNode((DocSecRefItem*)p->parent(),p);
isLast =isLastChildNode ((DocSecRefItem*)p->parent(),p);
- if (isFirst) t=1;
- if (isLast) t=3;
+ if (isFirst) t=STARTLI;
+ if (isLast) t=ENDLI;
+ if (!isFirst && !isLast) t = INTERLI;
break;
case DocNode::Kind_HtmlDescData:
isFirst=isFirstChildNode((DocHtmlDescData*)p->parent(),p);
isLast =isLastChildNode ((DocHtmlDescData*)p->parent(),p);
- if (isFirst) t=2;
- if (isLast) t=4;
+ if (isFirst) t=STARTDD;
+ if (isLast) t=ENDDD;
+ if (!isFirst && !isLast) t = INTERDD;
break;
case DocNode::Kind_XRefItem:
isFirst=isFirstChildNode((DocXRefItem*)p->parent(),p);
isLast =isLastChildNode ((DocXRefItem*)p->parent(),p);
- if (isFirst) t=2;
- if (isLast) t=4;
+ if (isFirst) t=STARTDD;
+ if (isLast) t=ENDDD;
+ if (!isFirst && !isLast) t = INTERDD;
break;
case DocNode::Kind_SimpleSect:
isFirst=isFirstChildNode((DocSimpleSect*)p->parent(),p);
isLast =isLastChildNode ((DocSimpleSect*)p->parent(),p);
- if (isFirst) t=2;
- if (isLast) t=4;
+ if (isFirst) t=STARTDD;
+ if (isLast) t=ENDDD;
if (isSeparatedParagraph((DocSimpleSect*)p->parent(),p))
// if the paragraph is enclosed with separators it will
// be included in <dd>..</dd> so avoid addition paragraph
@@ -988,12 +1109,14 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
{
isFirst=isLast=TRUE;
}
+ if (!isFirst && !isLast) t = INTERDD;
break;
case DocNode::Kind_HtmlCell:
isFirst=isFirstChildNode((DocHtmlCell*)p->parent(),p);
isLast =isLastChildNode ((DocHtmlCell*)p->parent(),p);
- if (isFirst) t=5;
- if (isLast) t=6;
+ if (isFirst) t=STARTTD;
+ if (isLast) t=ENDTD;
+ if (!isFirst && !isLast) t = INTERTD;
break;
default:
break;
@@ -1045,8 +1168,7 @@ void HtmlDocVisitor::visitPre(DocPara *p)
uint nodeIndex = 0;
if (p && nodeIndex<p->children().count())
{
- while (nodeIndex<p->children().count() &&
- p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
+ while (nodeIndex<p->children().count() && isInvisibleNode(p->children().at(nodeIndex)))
{
nodeIndex++;
}
@@ -1061,19 +1183,10 @@ void HtmlDocVisitor::visitPre(DocPara *p)
}
}
- // check if this paragraph is the first or last child of a <li> or <dd>.
+ // check if this paragraph is the first or last or intermediate child of a <li> or <dd>.
// this allows us to mark the tag with a special class so we can
// fix the otherwise ugly spacing.
int t;
- static const char *contexts[7] =
- { "", // 0
- "startli", // 1
- "startdd", // 2
- "endli", // 3
- "enddd", // 4
- "starttd", // 5
- "endtd" // 6
- };
bool isFirst;
bool isLast;
t = getParagraphContext(p,isFirst,isLast);
@@ -1123,7 +1236,7 @@ void HtmlDocVisitor::visitPost(DocPara *p)
int nodeIndex = p->children().count()-1;
if (nodeIndex>=0)
{
- while (nodeIndex>=0 && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
+ while (nodeIndex>=0 && isInvisibleNode(p->children().at(nodeIndex)))
{
nodeIndex--;
}
@@ -1494,7 +1607,22 @@ void HtmlDocVisitor::visitPre(DocImage *img)
{
if (img->type()==DocImage::Html)
{
- forceEndParagraph(img);
+ bool inlineImage = img->isInlineImage();
+ bool typeSVG = FALSE;
+
+ QCString url = img->url();
+ if (url.isEmpty())
+ {
+ typeSVG = (img->name().right(4)==".svg");
+ }
+ else
+ {
+ typeSVG = (url.right(4)==".svg");
+ }
+ if (!inlineImage)
+ {
+ forceEndParagraph(img);
+ }
if (m_hide) return;
QString baseName=img->name();
int i;
@@ -1502,20 +1630,19 @@ void HtmlDocVisitor::visitPre(DocImage *img)
{
baseName=baseName.right(baseName.length()-i-1);
}
- m_t << "<div class=\"image\">" << endl;
- QCString url = img->url();
+ if (!inlineImage) m_t << "<div class=\"image\">" << endl;
QCString sizeAttribs;
if (!img->width().isEmpty())
{
sizeAttribs+=" width=\""+img->width()+"\"";
}
- if (!img->height().isEmpty())
+ if (!img->height().isEmpty()) // link to local file
{
sizeAttribs+=" height=\""+img->height()+"\"";
}
if (url.isEmpty())
{
- if (img->name().right(4)==".svg")
+ if (typeSVG)
{
m_t << "<object type=\"image/svg+xml\" data=\"" << img->relPath() << img->name()
<< "\"" << sizeAttribs << htmlAttribsToString(img->attribs()) << ">" << baseName
@@ -1525,27 +1652,39 @@ void HtmlDocVisitor::visitPre(DocImage *img)
{
m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\""
<< baseName << "\"" << sizeAttribs << htmlAttribsToString(img->attribs())
- << "/>" << endl;
+ << (inlineImage ? " class=\"inline\"" : "/>\n");
}
}
- else
+ else // link to URL
{
- if (url.right(4)==".svg")
+ if (typeSVG)
{
m_t << "<object type=\"image/svg+xml\" data=\"" << correctURL(url,img->relPath())
- << "\"" << sizeAttribs << htmlAttribsToString(img->attribs()) << "></object>" << endl;
+ << "\"" << sizeAttribs << htmlAttribsToString(img->attribs())
+ << "></object>" << endl;
}
else
{
m_t << "<img src=\"" << correctURL(url,img->relPath()) << "\""
<< sizeAttribs << htmlAttribsToString(img->attribs(), TRUE)
- << "/>" << endl;
+ << (inlineImage ? " class=\"inline\"" : "/>\n");
}
}
if (img->hasCaption())
{
- m_t << "<div class=\"caption\">" << endl;
- m_t << getHtmlDirEmbedingChar(getTextDirByConfig(img));
+ if (inlineImage)
+ {
+ m_t << " title=\"";
+ }
+ else
+ {
+ m_t << "<div class=\"caption\">" << endl;
+ m_t << getHtmlDirEmbedingChar(getTextDirByConfig(img));
+ }
+ }
+ else if (inlineImage)
+ {
+ m_t << "/>" << endl;
}
}
else // other format -> skip
@@ -1555,17 +1694,24 @@ void HtmlDocVisitor::visitPre(DocImage *img)
}
}
-void HtmlDocVisitor::visitPost(DocImage *img)
+void HtmlDocVisitor::visitPost(DocImage *img)
{
if (img->type()==DocImage::Html)
{
if (m_hide) return;
+ bool inlineImage = img->isInlineImage();
if (img->hasCaption())
{
- m_t << "</div>";
+ if (inlineImage)
+ m_t << "\"/>\n ";
+ else
+ m_t << "</div>";
+ }
+ if (!inlineImage)
+ {
+ m_t << "</div>" << endl;
+ forceStartParagraph(img);
}
- m_t << "</div>" << endl;
- forceStartParagraph(img);
}
else // other format
{
@@ -2193,16 +2339,13 @@ void HtmlDocVisitor::forceEndParagraph(DocNode *n)
int nodeIndex = para->children().findRef(n);
nodeIndex--;
if (nodeIndex<0) return; // first node
- while (nodeIndex>=0 &&
- para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
- )
+ while (nodeIndex>=0 && isInvisibleNode(para->children().at(nodeIndex)))
{
- nodeIndex--;
+ nodeIndex--;
}
if (nodeIndex>=0)
{
DocNode *n = para->children().at(nodeIndex);
- //printf("n=%p kind=%d outside=%d\n",n,n->kind(),mustBeOutsideParagraph(n));
if (mustBeOutsideParagraph(n)) return;
}
nodeIndex--;
@@ -2234,16 +2377,14 @@ void HtmlDocVisitor::forceStartParagraph(DocNode *n)
if (styleOutsideParagraph) return;
nodeIndex++;
if (nodeIndex==numNodes) return; // last node
- while (nodeIndex<numNodes &&
- para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
- )
+ while (nodeIndex<numNodes && isInvisibleNode(para->children().at(nodeIndex)))
{
nodeIndex++;
}
if (nodeIndex<numNodes)
{
DocNode *n = para->children().at(nodeIndex);
- if (mustBeOutsideParagraph(n)) return;
+ if (mustBeOutsideParagraph(n)) return; // next element also outside paragraph
}
else
{
@@ -2254,8 +2395,8 @@ void HtmlDocVisitor::forceStartParagraph(DocNode *n)
bool isFirst;
bool isLast;
getParagraphContext(para,isFirst,isLast);
- //printf("forceStart first=%d last=%d\n",isFirst,isLast);
if (isFirst && isLast) needsTag = FALSE;
+ //printf("forceStart first=%d last=%d needsTag=%d\n",isFirst,isLast,needsTag);
if (needsTag)
m_t << "<p" << getDirHtmlClassOfNode(getTextDirByConfig(para, nodeIndex)) << ">";
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h
index 2ff9f75..7184f0f 100644
--- a/src/htmldocvisitor.h
+++ b/src/htmldocvisitor.h
@@ -43,6 +43,7 @@ class HtmlDocVisitor : public DocVisitor
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
void visit(DocSymbol *);
+ void visit(DocEmoji *);
void visit(DocURL *);
void visit(DocLineBreak *);
void visit(DocHorRuler *);
diff --git a/src/htmlentity.cpp b/src/htmlentity.cpp
index 3d95705..e95b817 100644
--- a/src/htmlentity.cpp
+++ b/src/htmlentity.cpp
@@ -314,7 +314,8 @@ static struct htmlEntityInfo
{ SYM(Quot), "\"", "\"", "\"", "&quot;", "\"", "\"", "\"", { "\"", DocSymbol::Perl_char }},
{ SYM(Minus), "-", "-", "-", "-", "-\\/", "-", "-", { "-", DocSymbol::Perl_char }},
{ SYM(Plus), "+", "+", "+", "+", "+", "+", "+", { "+", DocSymbol::Perl_char }},
- { SYM(Dot), ".", ".", ".", ".", ".", ".", ".", { ".", DocSymbol::Perl_char }}
+ { SYM(Dot), ".", ".", ".", ".", ".", ".", ".", { ".", DocSymbol::Perl_char }},
+ { SYM(Colon), ":", ":", ":", ":", ":", ":", ":", { ":", DocSymbol::Perl_char }}
};
static const int g_numHtmlEntities = (int)(sizeof(g_htmlEntities)/ sizeof(*g_htmlEntities));
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index ee23fb8..efd2108 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -17,6 +17,7 @@
#include <stdlib.h>
+#include <assert.h>
#include <qdir.h>
#include <qregexp.h>
#include "message.h"
@@ -690,6 +691,7 @@ HtmlGenerator::HtmlGenerator() : OutputGenerator()
{
dir=Config_getString(HTML_OUTPUT);
m_emptySection=FALSE;
+ m_sectionCount=0;
}
HtmlGenerator::~HtmlGenerator()
@@ -1382,20 +1384,34 @@ void HtmlGenerator::startClassDiagram()
void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
const char *fileName,const char *name)
{
+ QGString result;
+ FTextStream tt(&result);
+
endSectionHeader(t);
startSectionSummary(t,m_sectionCount);
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- t << " <div class=\"center\">" << endl;
- t << " <img src=\"";
- t << relPath << fileName << ".png\" usemap=\"#" << convertToId(name);
- t << "_map\" alt=\"\"/>" << endl;
- t << " <map id=\"" << convertToId(name);
- t << "_map\" name=\"" << convertToId(name);
- t << "_map\">" << endl;
-
- d.writeImage(t,dir,relPath,fileName);
- t << " </div>";
+ d.writeImage(tt,dir,relPath,fileName);
+ if (!result.isEmpty())
+ {
+ t << " <div class=\"center\">" << endl;
+ t << " <img src=\"";
+ t << relPath << fileName << ".png\" usemap=\"#" << convertToId(name);
+ t << "_map\" alt=\"\"/>" << endl;
+ t << " <map id=\"" << convertToId(name);
+ t << "_map\" name=\"" << convertToId(name);
+ t << "_map\">" << endl;
+ t << result;
+ t << " </map>" << endl;
+ t << "</div>";
+ }
+ else
+ {
+ t << " <div class=\"center\">" << endl;
+ t << " <img src=\"";
+ t << relPath << fileName << ".png\" alt=\"\"/>" << endl;
+ t << " </div>";
+ }
endSectionContent(t);
m_sectionCount++;
}
@@ -2037,24 +2053,37 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind)
static bool showNamespaces = Config_getBool(SHOW_NAMESPACES);
switch (kind)
{
- case LayoutNavEntry::MainPage: return TRUE;
- case LayoutNavEntry::User: return TRUE;
- case LayoutNavEntry::UserGroup: return TRUE;
- case LayoutNavEntry::Pages: return indexedPages>0;
- case LayoutNavEntry::Modules: return documentedGroups>0;
- case LayoutNavEntry::Namespaces: return documentedNamespaces>0 && showNamespaces;
- case LayoutNavEntry::NamespaceList: return documentedNamespaces>0 && showNamespaces;
- case LayoutNavEntry::NamespaceMembers: return documentedNamespaceMembers[NMHL_All]>0;
- case LayoutNavEntry::Classes: return annotatedClasses>0;
- case LayoutNavEntry::ClassList: return annotatedClasses>0;
- case LayoutNavEntry::ClassIndex: return annotatedClasses>0;
- case LayoutNavEntry::ClassHierarchy: return hierarchyClasses>0;
- case LayoutNavEntry::ClassMembers: return documentedClassMembers[CMHL_All]>0;
- case LayoutNavEntry::Files: return documentedHtmlFiles>0 && showFiles;
- case LayoutNavEntry::FileList: return documentedHtmlFiles>0 && showFiles;
- case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
- //case LayoutNavEntry::Dirs: return documentedDirs>0;
- case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0;
+ case LayoutNavEntry::MainPage: return TRUE;
+ case LayoutNavEntry::User: return TRUE;
+ case LayoutNavEntry::UserGroup: return TRUE;
+ case LayoutNavEntry::Pages: return indexedPages>0;
+ case LayoutNavEntry::Modules: return documentedGroups>0;
+ case LayoutNavEntry::Namespaces: return documentedNamespaces>0 && showNamespaces;
+ case LayoutNavEntry::NamespaceList: return documentedNamespaces>0 && showNamespaces;
+ case LayoutNavEntry::NamespaceMembers: return documentedNamespaceMembers[NMHL_All]>0;
+ case LayoutNavEntry::Classes: return annotatedClasses>0;
+ case LayoutNavEntry::ClassList: return annotatedClasses>0;
+ case LayoutNavEntry::ClassIndex: return annotatedClasses>0;
+ case LayoutNavEntry::ClassHierarchy: return hierarchyClasses>0;
+ case LayoutNavEntry::ClassMembers: return documentedClassMembers[CMHL_All]>0;
+ case LayoutNavEntry::Files: return documentedHtmlFiles>0 && showFiles;
+ case LayoutNavEntry::FileList: return documentedHtmlFiles>0 && showFiles;
+ case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
+ case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0;
+ case LayoutNavEntry::Interfaces: return annotatedInterfaces>0;
+ case LayoutNavEntry::InterfaceList: return annotatedInterfaces>0;
+ case LayoutNavEntry::InterfaceIndex: return annotatedInterfaces>0;
+ case LayoutNavEntry::InterfaceHierarchy: return hierarchyInterfaces>0;
+ case LayoutNavEntry::Structs: return annotatedStructs>0;
+ case LayoutNavEntry::StructList: return annotatedStructs>0;
+ case LayoutNavEntry::StructIndex: return annotatedStructs>0;
+ case LayoutNavEntry::Exceptions: return annotatedExceptions>0;
+ case LayoutNavEntry::ExceptionList: return annotatedExceptions>0;
+ case LayoutNavEntry::ExceptionIndex: return annotatedExceptions>0;
+ case LayoutNavEntry::ExceptionHierarchy: return hierarchyExceptions>0;
+ case LayoutNavEntry::None: // should never happen, means not properly initialized
+ assert(kind != LayoutNavEntry::None);
+ return FALSE;
}
return FALSE;
}
@@ -2180,9 +2209,17 @@ static void writeDefaultQuickLinks(FTextStream &t,bool compact,
case HLI_Modules: kind = LayoutNavEntry::Modules; break;
//case HLI_Directories: kind = LayoutNavEntry::Dirs; break;
case HLI_Namespaces: kind = LayoutNavEntry::NamespaceList; altKind = LayoutNavEntry::Namespaces; break;
- case HLI_Hierarchy: kind = LayoutNavEntry::ClassHierarchy; break;
+ case HLI_ClassHierarchy: kind = LayoutNavEntry::ClassHierarchy; break;
+ case HLI_InterfaceHierarchy: kind = LayoutNavEntry::InterfaceHierarchy; break;
+ case HLI_ExceptionHierarchy: kind = LayoutNavEntry::ExceptionHierarchy; break;
case HLI_Classes: kind = LayoutNavEntry::ClassIndex; altKind = LayoutNavEntry::Classes; break;
- case HLI_Annotated: kind = LayoutNavEntry::ClassList; altKind = LayoutNavEntry::Classes; break;
+ case HLI_Interfaces: kind = LayoutNavEntry::InterfaceIndex; altKind = LayoutNavEntry::Interfaces; break;
+ case HLI_Structs: kind = LayoutNavEntry::StructIndex; altKind = LayoutNavEntry::Structs; break;
+ case HLI_Exceptions: kind = LayoutNavEntry::ExceptionIndex; altKind = LayoutNavEntry::Exceptions; break;
+ case HLI_AnnotatedClasses: kind = LayoutNavEntry::ClassList; altKind = LayoutNavEntry::Classes; break;
+ case HLI_AnnotatedInterfaces: kind = LayoutNavEntry::InterfaceList; altKind = LayoutNavEntry::Interfaces; break;
+ case HLI_AnnotatedStructs: kind = LayoutNavEntry::StructList; altKind = LayoutNavEntry::Structs; break;
+ case HLI_AnnotatedExceptions: kind = LayoutNavEntry::ExceptionList; altKind = LayoutNavEntry::Exceptions; break;
case HLI_Files: kind = LayoutNavEntry::FileList; altKind = LayoutNavEntry::Files; break;
case HLI_NamespaceMembers: kind = LayoutNavEntry::NamespaceMembers; break;
case HLI_Functions: kind = LayoutNavEntry::ClassMembers; break;
@@ -2192,6 +2229,12 @@ static void writeDefaultQuickLinks(FTextStream &t,bool compact,
case HLI_UserGroup: kind = LayoutNavEntry::UserGroup; break;
case HLI_ClassVisible: kind = LayoutNavEntry::ClassList; altKind = LayoutNavEntry::Classes;
highlightParent = TRUE; break;
+ case HLI_InterfaceVisible: kind = LayoutNavEntry::InterfaceList; altKind = LayoutNavEntry::Interfaces;
+ highlightParent = TRUE; break;
+ case HLI_StructVisible: kind = LayoutNavEntry::StructList; altKind = LayoutNavEntry::Structs;
+ highlightParent = TRUE; break;
+ case HLI_ExceptionVisible: kind = LayoutNavEntry::ExceptionList; altKind = LayoutNavEntry::Exceptions;
+ highlightParent = TRUE; break;
case HLI_NamespaceVisible: kind = LayoutNavEntry::NamespaceList; altKind = LayoutNavEntry::Namespaces;
highlightParent = TRUE; break;
case HLI_FileVisible: kind = LayoutNavEntry::FileList; altKind = LayoutNavEntry::Files;
diff --git a/src/index.cpp b/src/index.cpp
index 8e5f266..7bb9574 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -21,6 +21,7 @@
#include <stdlib.h>
+#include <assert.h>
#include <qtextstream.h>
#include <qdatetime.h>
#include <qdir.h>
@@ -55,6 +56,14 @@
int annotatedClasses;
int annotatedClassesPrinted;
int hierarchyClasses;
+int annotatedInterfaces;
+int annotatedInterfacesPrinted;
+int hierarchyInterfaces;
+int annotatedStructs;
+int annotatedStructsPrinted;
+int annotatedExceptions;
+int annotatedExceptionsPrinted;
+int hierarchyExceptions;
int documentedFiles;
int documentedGroups;
int documentedNamespaces;
@@ -66,23 +75,34 @@ int documentedHtmlFiles;
int documentedPages;
int documentedDirs;
-static int countClassHierarchy();
+static int countClassHierarchy(ClassDef::CompoundType ct);
static void countFiles(int &htmlFiles,int &files);
static int countGroups();
static int countDirs();
static int countNamespaces();
-static int countAnnotatedClasses(int *cp);
+static int countAnnotatedClasses(int *cp,ClassDef::CompoundType ct);
static void countRelatedPages(int &docPages,int &indexPages);
void countDataStructures()
{
- annotatedClasses = countAnnotatedClasses(&annotatedClassesPrinted); // "classes" + "annotated"
- hierarchyClasses = countClassHierarchy(); // "hierarchy"
- countFiles(documentedHtmlFiles,documentedFiles); // "files"
- countRelatedPages(documentedPages,indexedPages); // "pages"
- documentedGroups = countGroups(); // "modules"
- documentedNamespaces = countNamespaces(); // "namespaces"
- documentedDirs = countDirs(); // "dirs"
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+ annotatedClasses = countAnnotatedClasses(&annotatedClassesPrinted, ClassDef::Class); // "classes" + "annotated"
+ hierarchyClasses = countClassHierarchy(ClassDef::Class); // "hierarchy"
+ // "interfaces" + "annotated"
+ annotatedInterfaces = sliceOpt ? countAnnotatedClasses(&annotatedInterfacesPrinted, ClassDef::Interface) : 0;
+ // "interfacehierarchy"
+ hierarchyInterfaces = sliceOpt ? countClassHierarchy(ClassDef::Interface) : 0;
+ // "structs" + "annotated"
+ annotatedStructs = sliceOpt ? countAnnotatedClasses(&annotatedStructsPrinted, ClassDef::Struct) : 0;
+ // "exceptions" + "annotated"
+ annotatedExceptions = sliceOpt ? countAnnotatedClasses(&annotatedExceptionsPrinted, ClassDef::Exception) : 0;
+ // "exceptionhierarchy"
+ hierarchyExceptions = sliceOpt ? countClassHierarchy(ClassDef::Exception) : 0;
+ countFiles(documentedHtmlFiles,documentedFiles); // "files"
+ countRelatedPages(documentedPages,indexedPages); // "pages"
+ documentedGroups = countGroups(); // "modules"
+ documentedNamespaces = countNamespaces(); // "namespaces"
+ documentedDirs = countDirs(); // "dirs"
// "globals"
// "namespacemembers"
// "functions"
@@ -94,9 +114,12 @@ static void startIndexHierarchy(OutputList &ol,int level)
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Html);
if (level<6) ol.startIndexList();
- ol.enableAll();
+ ol.popGeneratorState();
+
+ ol.pushGeneratorState();
ol.disable(OutputGenerator::Latex);
ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Docbook);
ol.startItemList();
ol.popGeneratorState();
}
@@ -107,8 +130,11 @@ static void endIndexHierarchy(OutputList &ol,int level)
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Html);
if (level<6) ol.endIndexList();
- ol.enableAll();
+ ol.popGeneratorState();
+
+ ol.pushGeneratorState();
ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Docbook);
ol.disable(OutputGenerator::RTF);
ol.endItemList();
ol.popGeneratorState();
@@ -798,8 +824,10 @@ static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
//----------------------------------------------------------------------------
-static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv,bool addToIndex)
+static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv,bool addToIndex,
+ ClassDef::CompoundType ct)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
ClassSDict::Iterator cli(*cl);
ClassDef *cd;
for (;(cd=cli.current());++cli)
@@ -818,6 +846,10 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
}
b=!hasVisibleRoot(cd->subClasses());
}
+ else if (sliceOpt && cd->compoundType() != ct)
+ {
+ continue;
+ }
else
{
b=!hasVisibleRoot(cd->baseClasses());
@@ -892,7 +924,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
}
}
-static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
+static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex,ClassDef::CompoundType ct)
{
initClassHierarchy(Doxygen::classSDict);
initClassHierarchy(Doxygen::hiddenClasses);
@@ -902,8 +934,8 @@ static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
ol.disable(OutputGenerator::Html);
}
bool started=FALSE;
- writeClassTreeForList(ol,Doxygen::classSDict,started,ftv,addToIndex);
- writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv,addToIndex);
+ writeClassTreeForList(ol,Doxygen::classSDict,started,ftv,addToIndex,ct);
+ writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv,addToIndex,ct);
if (started)
{
endIndexHierarchy(ol,0);
@@ -920,13 +952,18 @@ static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
//----------------------------------------------------------------------------
-static int countClassesInTreeList(const ClassSDict &cl)
+static int countClassesInTreeList(const ClassSDict &cl, ClassDef::CompoundType ct)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
int count=0;
ClassSDict::Iterator cli(cl);
ClassDef *cd;
for (;(cd=cli.current());++cli)
{
+ if (sliceOpt && cd->compoundType() != ct)
+ {
+ continue;
+ }
if (!hasVisibleRoot(cd->baseClasses())) // filter on root classes
{
if (cd->isVisibleInHierarchy()) // should it be visible
@@ -941,13 +978,13 @@ static int countClassesInTreeList(const ClassSDict &cl)
return count;
}
-static int countClassHierarchy()
+static int countClassHierarchy(ClassDef::CompoundType ct)
{
int count=0;
initClassHierarchy(Doxygen::classSDict);
initClassHierarchy(Doxygen::hiddenClasses);
- count+=countClassesInTreeList(*Doxygen::classSDict);
- count+=countClassesInTreeList(*Doxygen::hiddenClasses);
+ count+=countClassesInTreeList(*Doxygen::classSDict, ct);
+ count+=countClassesInTreeList(*Doxygen::hiddenClasses, ct);
return count;
}
@@ -959,12 +996,13 @@ static void writeHierarchicalIndex(OutputList &ol)
ol.pushGeneratorState();
//1.{
ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Docbook);
LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassHierarchy);
QCString title = lne ? lne->title() : theTranslator->trClassHierarchy();
bool addToIndex = lne==0 || lne->visible();
- startFile(ol,"hierarchy",0, title, HLI_Hierarchy);
+ startFile(ol,"hierarchy",0, title, HLI_ClassHierarchy);
startTitle(ol,0);
ol.parseText(title);
endTitle(ol,0,0);
@@ -973,15 +1011,16 @@ static void writeHierarchicalIndex(OutputList &ol)
if (Config_getBool(HAVE_DOT) && Config_getBool(GRAPHICAL_HIERARCHY))
{
+ ol.pushGeneratorState();
ol.disable(OutputGenerator::Latex);
ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Docbook);
ol.startParagraph();
ol.startTextLink("inherits",0);
ol.parseText(theTranslator->trGotoGraphicalHierarchy());
ol.endTextLink();
ol.endParagraph();
- ol.enable(OutputGenerator::Latex);
- ol.enable(OutputGenerator::RTF);
+ ol.popGeneratorState();
}
ol.parseText(lne ? lne->intro() : theTranslator->trClassHierarchyDescription());
ol.endTextBlock();
@@ -994,7 +1033,7 @@ static void writeHierarchicalIndex(OutputList &ol)
ol.disable(OutputGenerator::Html);
Doxygen::indexList->disable();
- writeClassHierarchy(ol,0,addToIndex);
+ writeClassHierarchy(ol,0,addToIndex,ClassDef::Class);
Doxygen::indexList->enable();
ol.popGeneratorState();
@@ -1013,7 +1052,7 @@ static void writeHierarchicalIndex(OutputList &ol)
Doxygen::indexList->addContentsItem(TRUE,title,0,"hierarchy",0,TRUE,TRUE);
}
FTVHelp* ftv = new FTVHelp(FALSE);
- writeClassHierarchy(ol,ftv,addToIndex);
+ writeClassHierarchy(ol,ftv,addToIndex,ClassDef::Class);
QGString outStr;
FTextStream t(&outStr);
ftv->generateTreeViewInline(t);
@@ -1040,7 +1079,7 @@ static void writeGraphicalClassHierarchy(OutputList &ol)
ol.disableAllBut(OutputGenerator::Html);
LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassHierarchy);
QCString title = lne ? lne->title() : theTranslator->trClassHierarchy();
- startFile(ol,"inherits",0,title,HLI_Hierarchy,FALSE,"hierarchy");
+ startFile(ol,"inherits",0,title,HLI_ClassHierarchy,FALSE,"hierarchy");
startTitle(ol,0);
ol.parseText(title);
endTitle(ol,0,0);
@@ -1060,6 +1099,220 @@ static void writeGraphicalClassHierarchy(OutputList &ol)
//----------------------------------------------------------------------------
+static void writeHierarchicalInterfaceIndex(OutputList &ol)
+{
+ if (hierarchyInterfaces==0) return;
+ ol.pushGeneratorState();
+ //1.{
+ ol.disable(OutputGenerator::Man);
+
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::InterfaceHierarchy);
+ QCString title = lne ? lne->title() : theTranslator->trInterfaceHierarchy();
+ bool addToIndex = lne==0 || lne->visible();
+
+ startFile(ol,"interfacehierarchy",0, title, HLI_InterfaceHierarchy);
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+
+ if (Config_getBool(HAVE_DOT) && Config_getBool(GRAPHICAL_HIERARCHY))
+ {
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ ol.startParagraph();
+ ol.startTextLink("interfaceinherits",0);
+ ol.parseText(theTranslator->trGotoGraphicalHierarchy());
+ ol.endTextLink();
+ ol.endParagraph();
+ ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::RTF);
+ }
+ ol.parseText(lne ? lne->intro() : theTranslator->trInterfaceHierarchyDescription());
+ ol.endTextBlock();
+
+ // ---------------
+ // Static interface hierarchy for Latex/RTF
+ // ---------------
+ ol.pushGeneratorState();
+ //2.{
+ ol.disable(OutputGenerator::Html);
+ Doxygen::indexList->disable();
+
+ writeClassHierarchy(ol,0,addToIndex,ClassDef::Interface);
+
+ Doxygen::indexList->enable();
+ ol.popGeneratorState();
+ //2.}
+
+ // ---------------
+ // Dynamic interface hierarchical index for HTML
+ // ---------------
+ ol.pushGeneratorState();
+ //2.{
+ ol.disableAllBut(OutputGenerator::Html);
+
+ {
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(TRUE,title,0,"interfacehierarchy",0,TRUE,TRUE);
+ }
+ FTVHelp* ftv = new FTVHelp(FALSE);
+ writeClassHierarchy(ol,ftv,addToIndex,ClassDef::Interface);
+ QGString outStr;
+ FTextStream t(&outStr);
+ ftv->generateTreeViewInline(t);
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeString(outStr);
+ ol.popGeneratorState();
+ delete ftv;
+ }
+ ol.popGeneratorState();
+ //2.}
+ // ------
+
+ endFile(ol);
+ ol.popGeneratorState();
+ //1.}
+}
+
+//----------------------------------------------------------------------------
+
+static void writeGraphicalInterfaceHierarchy(OutputList &ol)
+{
+ if (hierarchyInterfaces==0) return;
+ ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::InterfaceHierarchy);
+ QCString title = lne ? lne->title() : theTranslator->trInterfaceHierarchy();
+ startFile(ol,"interfaceinherits",0,title,HLI_InterfaceHierarchy,FALSE,"interfacehierarchy");
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ ol.startParagraph();
+ ol.startTextLink("interfacehierarchy",0);
+ ol.parseText(theTranslator->trGotoTextualHierarchy());
+ ol.endTextLink();
+ ol.endParagraph();
+ ol.endTextBlock();
+ DotGfxHierarchyTable g("interface_",ClassDef::Interface);
+ ol.writeGraphicalHierarchy(g);
+ endFile(ol);
+ ol.enableAll();
+}
+
+//----------------------------------------------------------------------------
+
+static void writeHierarchicalExceptionIndex(OutputList &ol)
+{
+ if (hierarchyExceptions==0) return;
+ ol.pushGeneratorState();
+ //1.{
+ ol.disable(OutputGenerator::Man);
+
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ExceptionHierarchy);
+ QCString title = lne ? lne->title() : theTranslator->trExceptionHierarchy();
+ bool addToIndex = lne==0 || lne->visible();
+
+ startFile(ol,"exceptionhierarchy",0, title, HLI_ExceptionHierarchy);
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+
+ if (Config_getBool(HAVE_DOT) && Config_getBool(GRAPHICAL_HIERARCHY))
+ {
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ ol.startParagraph();
+ ol.startTextLink("exceptioninherits",0);
+ ol.parseText(theTranslator->trGotoGraphicalHierarchy());
+ ol.endTextLink();
+ ol.endParagraph();
+ ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::RTF);
+ }
+ ol.parseText(lne ? lne->intro() : theTranslator->trExceptionHierarchyDescription());
+ ol.endTextBlock();
+
+ // ---------------
+ // Static exception hierarchy for Latex/RTF
+ // ---------------
+ ol.pushGeneratorState();
+ //2.{
+ ol.disable(OutputGenerator::Html);
+ Doxygen::indexList->disable();
+
+ writeClassHierarchy(ol,0,addToIndex,ClassDef::Exception);
+
+ Doxygen::indexList->enable();
+ ol.popGeneratorState();
+ //2.}
+
+ // ---------------
+ // Dynamic exception hierarchical index for HTML
+ // ---------------
+ ol.pushGeneratorState();
+ //2.{
+ ol.disableAllBut(OutputGenerator::Html);
+
+ {
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(TRUE,title,0,"exceptionhierarchy",0,TRUE,TRUE);
+ }
+ FTVHelp* ftv = new FTVHelp(FALSE);
+ writeClassHierarchy(ol,ftv,addToIndex,ClassDef::Exception);
+ QGString outStr;
+ FTextStream t(&outStr);
+ ftv->generateTreeViewInline(t);
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeString(outStr);
+ ol.popGeneratorState();
+ delete ftv;
+ }
+ ol.popGeneratorState();
+ //2.}
+ // ------
+
+ endFile(ol);
+ ol.popGeneratorState();
+ //1.}
+}
+
+//----------------------------------------------------------------------------
+
+static void writeGraphicalExceptionHierarchy(OutputList &ol)
+{
+ if (hierarchyExceptions==0) return;
+ ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ExceptionHierarchy);
+ QCString title = lne ? lne->title() : theTranslator->trExceptionHierarchy();
+ startFile(ol,"exceptioninherits",0,title,HLI_ExceptionHierarchy,FALSE,"exceptionhierarchy");
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ ol.startParagraph();
+ ol.startTextLink("exceptionhierarchy",0);
+ ol.parseText(theTranslator->trGotoTextualHierarchy());
+ ol.endTextLink();
+ ol.endParagraph();
+ ol.endTextBlock();
+ DotGfxHierarchyTable g("exception_",ClassDef::Exception);
+ ol.writeGraphicalHierarchy(g);
+ endFile(ol);
+ ol.enableAll();
+}
+
+//----------------------------------------------------------------------------
+
static void countFiles(int &htmlFiles,int &files)
{
htmlFiles=0;
@@ -1170,6 +1423,7 @@ static void writeFileIndex(OutputList &ol)
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Docbook);
if (documentedFiles==0) ol.disableAllBut(OutputGenerator::Html);
LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileList);
@@ -1317,8 +1571,9 @@ static int countNamespaces()
//----------------------------------------------------------------------------
-void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalOnly)
+void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalOnly,ClassDef::CompoundType ct)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
if (clDict)
{
ClassSDict::Iterator cli(*clDict);
@@ -1340,6 +1595,11 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO
}
}
+ if (sliceOpt && cd->compoundType() != ct)
+ {
+ continue;
+ }
+
if (!globalOnly ||
cd->getOuterScope()==0 ||
cd->getOuterScope()==Doxygen::globalScope
@@ -1377,7 +1637,7 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO
if (count>0)
{
ftv->incContentsDepth();
- writeClassTree(cd->getClassSDict(),ftv,addToIndex,FALSE);
+ writeClassTree(cd->getClassSDict(),ftv,addToIndex,FALSE,ct);
ftv->decContentsDepth();
}
}
@@ -1387,8 +1647,9 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO
}
static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv,
- bool rootOnly,bool showClasses,bool addToIndex)
+ bool rootOnly,bool showClasses,bool addToIndex,ClassDef::CompoundType ct)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
if (nsDict)
{
NamespaceSDict::Iterator nli(*nsDict);
@@ -1399,7 +1660,7 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv,
(!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
{
- bool hasChildren = namespaceHasVisibleChild(nd,showClasses);
+ bool hasChildren = namespaceHasVisibleChild(nd,showClasses,sliceOpt,ct);
bool isLinkable = nd->isLinkableInProject();
QCString ref;
@@ -1430,10 +1691,26 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv,
{
if (addToIndex) Doxygen::indexList->incContentsDepth();
ftv->incContentsDepth();
- writeNamespaceTree(nd->getNamespaceSDict(),ftv,FALSE,showClasses,addToIndex);
+ writeNamespaceTree(nd->getNamespaceSDict(),ftv,FALSE,showClasses,addToIndex,ct);
if (showClasses)
{
- writeClassTree(nd->getClassSDict(),ftv,addToIndex,FALSE);
+ ClassSDict *d = nd->getClassSDict();
+ if (sliceOpt)
+ {
+ if (ct == ClassDef::Interface)
+ {
+ d = nd->getInterfaceSDict();
+ }
+ else if (ct == ClassDef::Struct)
+ {
+ d = nd->getStructSDict();
+ }
+ else if (ct == ClassDef::Exception)
+ {
+ d = nd->getExceptionSDict();
+ }
+ }
+ writeClassTree(d,ftv,addToIndex,FALSE,ct);
}
ftv->decContentsDepth();
if (addToIndex) Doxygen::indexList->decContentsDepth();
@@ -1450,6 +1727,7 @@ static void writeNamespaceIndex(OutputList &ol)
if (documentedNamespaces==0) return;
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Docbook);
LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::NamespaceList);
if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Namespaces); // fall back
QCString title = lne ? lne->title() : theTranslator->trNamespaceList();
@@ -1532,7 +1810,7 @@ static void writeNamespaceIndex(OutputList &ol)
Doxygen::indexList->incContentsDepth();
}
FTVHelp* ftv = new FTVHelp(FALSE);
- writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,FALSE,addToIndex);
+ writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,FALSE,addToIndex,ClassDef::Class);
QGString outStr;
FTextStream t(&outStr);
ftv->generateTreeViewInline(t);
@@ -1553,14 +1831,19 @@ static void writeNamespaceIndex(OutputList &ol)
//----------------------------------------------------------------------------
-static int countAnnotatedClasses(int *cp)
+static int countAnnotatedClasses(int *cp, ClassDef::CompoundType ct)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
int count=0;
int countPrinted=0;
ClassSDict::Iterator cli(*Doxygen::classSDict);
ClassDef *cd;
for (;(cd=cli.current());++cli)
{
+ if (sliceOpt && cd->compoundType() != ct)
+ {
+ continue;
+ }
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
if (!cd->isEmbeddedInOuterScope())
@@ -1575,12 +1858,14 @@ static int countAnnotatedClasses(int *cp)
}
-static void writeAnnotatedClassList(OutputList &ol)
+static void writeAnnotatedClassList(OutputList &ol,ClassDef::CompoundType ct)
{
//LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassList);
//bool addToIndex = lne==0 || lne->visible();
bool first=TRUE;
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+
ClassSDict::Iterator cli(*Doxygen::classSDict);
ClassDef *cd;
@@ -1599,10 +1884,16 @@ static void writeAnnotatedClassList(OutputList &ol)
first=FALSE;
}
+ if (sliceOpt && cd->compoundType() != ct)
+ {
+ continue;
+ }
+
ol.pushGeneratorState();
if (cd->isEmbeddedInOuterScope())
{
ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Docbook);
ol.disable(OutputGenerator::RTF);
}
if (cd->isLinkableInProject() && cd->templateMaster()==0)
@@ -1768,8 +2059,10 @@ class UsedIndexLetters : public SIntDict<uint>
};
// write an alphabetical index of all class with a header for each letter
-static void writeAlphabeticalClassList(OutputList &ol)
+static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct, int annotatedCount)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+
// What starting letters are used
UsedIndexLetters indexLettersUsed;
@@ -1780,6 +2073,8 @@ static void writeAlphabeticalClassList(OutputList &ol)
int headerItems=0;
for (;(cd=cli.current());++cli)
{
+ if (sliceOpt && cd->compoundType() != ct)
+ continue;
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
if (cd->getLanguage()==SrcLangExt_VHDL && !((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS ))// no architecture
@@ -1815,7 +2110,7 @@ static void writeAlphabeticalClassList(OutputList &ol)
const int columns = Config_getInt(COLS_IN_ALPHA_INDEX);
int i,j;
- int totalItems = headerItems*2 + annotatedClasses; // number of items in the table (headers span 2 items)
+ int totalItems = headerItems*2 + annotatedCount; // number of items in the table (headers span 2 items)
int rows = (totalItems + columns - 1)/columns; // number of rows in the table
//printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
@@ -1832,6 +2127,8 @@ static void writeAlphabeticalClassList(OutputList &ol)
startLetter=0;
for (cli.toFirst();(cd=cli.current());++cli)
{
+ if (sliceOpt && cd->compoundType() != ct)
+ continue;
if (cd->getLanguage()==SrcLangExt_VHDL && !((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS ))// no architecture
continue;
@@ -1987,11 +2284,12 @@ static void writeAlphabeticalClassList(OutputList &ol)
}
ol.writeNonBreakableSpace(3);
}
- ++(*colIterators[j]);
- if (cell->letter()!=0 || cell->classDef()!=(ClassDef*)0x8)
- {
- ol.writeString("</td>");
+ else
+ {
+ ol.writeString("<td>");
}
+ ++(*colIterators[j]);
+ ol.writeString("</td>");
}
}
else
@@ -2037,7 +2335,94 @@ static void writeAlphabeticalIndex(OutputList &ol)
}
ol.startContents();
- writeAlphabeticalClassList(ol);
+ writeAlphabeticalClassList(ol, ClassDef::Class, annotatedClasses);
+ endFile(ol); // contains ol.endContents()
+
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+static void writeAlphabeticalInterfaceIndex(OutputList &ol)
+{
+ if (annotatedInterfaces==0) return;
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::InterfaceIndex);
+ QCString title = lne ? lne->title() : theTranslator->trInterfaceIndex();
+ bool addToIndex = lne==0 || lne->visible();
+
+ startFile(ol,"interfaces",0,title,HLI_Interfaces);
+
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(FALSE,title,0,"interfaces",0,FALSE,TRUE);
+ }
+
+ ol.startContents();
+ writeAlphabeticalClassList(ol, ClassDef::Interface, annotatedInterfaces);
+ endFile(ol); // contains ol.endContents()
+
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+static void writeAlphabeticalStructIndex(OutputList &ol)
+{
+ if (annotatedStructs==0) return;
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::StructIndex);
+ QCString title = lne ? lne->title() : theTranslator->trStructIndex();
+ bool addToIndex = lne==0 || lne->visible();
+
+ startFile(ol,"structs",0,title,HLI_Structs);
+
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(FALSE,title,0,"structs",0,FALSE,TRUE);
+ }
+
+ ol.startContents();
+ writeAlphabeticalClassList(ol, ClassDef::Struct, annotatedStructs);
+ endFile(ol); // contains ol.endContents()
+
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+static void writeAlphabeticalExceptionIndex(OutputList &ol)
+{
+ if (annotatedExceptions==0) return;
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ExceptionIndex);
+ QCString title = lne ? lne->title() : theTranslator->trExceptionIndex();
+ bool addToIndex = lne==0 || lne->visible();
+
+ startFile(ol,"exceptions",0,title,HLI_Exceptions);
+
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(FALSE,title,0,"exceptions",0,FALSE,TRUE);
+ }
+
+ ol.startContents();
+ writeAlphabeticalClassList(ol, ClassDef::Exception, annotatedExceptions);
endFile(ol); // contains ol.endContents()
ol.popGeneratorState();
@@ -2064,7 +2449,7 @@ static void writeAnnotatedIndex(OutputList &ol)
bool addToIndex = lne==0 || lne->visible();
- startFile(ol,"annotated",0,title,HLI_Annotated);
+ startFile(ol,"annotated",0,title,HLI_AnnotatedClasses);
startTitle(ol,0);
ol.parseText(title);
@@ -2083,7 +2468,7 @@ static void writeAnnotatedIndex(OutputList &ol)
ol.disable(OutputGenerator::Html);
Doxygen::indexList->disable();
- writeAnnotatedClassList(ol);
+ writeAnnotatedClassList(ol, ClassDef::Class);
Doxygen::indexList->enable();
ol.popGeneratorState();
@@ -2101,8 +2486,239 @@ static void writeAnnotatedIndex(OutputList &ol)
Doxygen::indexList->incContentsDepth();
}
FTVHelp* ftv = new FTVHelp(FALSE);
- writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex);
- writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE);
+ writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex,ClassDef::Class);
+ writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE,ClassDef::Class);
+ QGString outStr;
+ FTextStream t(&outStr);
+ ftv->generateTreeViewInline(t);
+ ol.writeString(outStr);
+ delete ftv;
+ if (addToIndex)
+ {
+ Doxygen::indexList->decContentsDepth();
+ }
+ }
+
+ ol.popGeneratorState();
+ // ------
+
+ endFile(ol); // contains ol.endContents()
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+static void writeAnnotatedInterfaceIndex(OutputList &ol)
+{
+ //printf("writeAnnotatedInterfaceIndex: count=%d printed=%d\n",
+ // annotatedInterfaces,annotatedInterfacesPrinted);
+ if (annotatedInterfaces==0) return;
+
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ if (annotatedInterfacesPrinted==0)
+ {
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ }
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::InterfaceList);
+ if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Interfaces); // fall back
+ QCString title = lne ? lne->title() : theTranslator->trInterfaceList();
+ bool addToIndex = lne==0 || lne->visible();
+
+ startFile(ol,"annotatedinterfaces",0,title,HLI_AnnotatedInterfaces);
+
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+
+ ol.startContents();
+
+ ol.startTextBlock();
+ ol.parseText(lne ? lne->intro() : theTranslator->trInterfaceListDescription());
+ ol.endTextBlock();
+
+ // ---------------
+ // Linear interface index for Latex/RTF
+ // ---------------
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ Doxygen::indexList->disable();
+
+ writeAnnotatedClassList(ol, ClassDef::Interface);
+
+ Doxygen::indexList->enable();
+ ol.popGeneratorState();
+
+ // ---------------
+ // Hierarchical interface index for HTML
+ // ---------------
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ {
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(TRUE,title,0,"annotatedinterfaces",0,TRUE,TRUE);
+ Doxygen::indexList->incContentsDepth();
+ }
+ FTVHelp* ftv = new FTVHelp(FALSE);
+ writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex,ClassDef::Interface);
+ writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE,ClassDef::Interface);
+ QGString outStr;
+ FTextStream t(&outStr);
+ ftv->generateTreeViewInline(t);
+ ol.writeString(outStr);
+ delete ftv;
+ if (addToIndex)
+ {
+ Doxygen::indexList->decContentsDepth();
+ }
+ }
+
+ ol.popGeneratorState();
+ // ------
+
+ endFile(ol); // contains ol.endContents()
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+static void writeAnnotatedStructIndex(OutputList &ol)
+{
+ //printf("writeAnnotatedStructIndex: count=%d printed=%d\n",
+ // annotatedStructs,annotatedStructsPrinted);
+ if (annotatedStructs==0) return;
+
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ if (annotatedStructsPrinted==0)
+ {
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ }
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::StructList);
+ if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Structs); // fall back
+ QCString title = lne ? lne->title() : theTranslator->trStructList();
+ bool addToIndex = lne==0 || lne->visible();
+
+ startFile(ol,"annotatedstructs",0,title,HLI_AnnotatedStructs);
+
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+
+ ol.startContents();
+
+ ol.startTextBlock();
+ ol.parseText(lne ? lne->intro() : theTranslator->trStructListDescription());
+ ol.endTextBlock();
+
+ // ---------------
+ // Linear struct index for Latex/RTF
+ // ---------------
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ Doxygen::indexList->disable();
+
+ writeAnnotatedClassList(ol, ClassDef::Struct);
+
+ Doxygen::indexList->enable();
+ ol.popGeneratorState();
+
+ // ---------------
+ // Hierarchical struct index for HTML
+ // ---------------
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ {
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(TRUE,title,0,"annotatedstructs",0,TRUE,TRUE);
+ Doxygen::indexList->incContentsDepth();
+ }
+ FTVHelp* ftv = new FTVHelp(FALSE);
+ writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex,ClassDef::Struct);
+ writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE,ClassDef::Struct);
+ QGString outStr;
+ FTextStream t(&outStr);
+ ftv->generateTreeViewInline(t);
+ ol.writeString(outStr);
+ delete ftv;
+ if (addToIndex)
+ {
+ Doxygen::indexList->decContentsDepth();
+ }
+ }
+
+ ol.popGeneratorState();
+ // ------
+
+ endFile(ol); // contains ol.endContents()
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+static void writeAnnotatedExceptionIndex(OutputList &ol)
+{
+ //printf("writeAnnotatedExceptionIndex: count=%d printed=%d\n",
+ // annotatedExceptions,annotatedExceptionsPrinted);
+ if (annotatedExceptions==0) return;
+
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ if (annotatedExceptionsPrinted==0)
+ {
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ }
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ExceptionList);
+ if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Exceptions); // fall back
+ QCString title = lne ? lne->title() : theTranslator->trExceptionList();
+ bool addToIndex = lne==0 || lne->visible();
+
+ startFile(ol,"annotatedexceptions",0,title,HLI_AnnotatedExceptions);
+
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+
+ ol.startContents();
+
+ ol.startTextBlock();
+ ol.parseText(lne ? lne->intro() : theTranslator->trExceptionListDescription());
+ ol.endTextBlock();
+
+ // ---------------
+ // Linear interface index for Latex/RTF
+ // ---------------
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ Doxygen::indexList->disable();
+
+ writeAnnotatedClassList(ol, ClassDef::Exception);
+
+ Doxygen::indexList->enable();
+ ol.popGeneratorState();
+
+ // ---------------
+ // Hierarchical interface index for HTML
+ // ---------------
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ {
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(TRUE,title,0,"annotatedexceptions",0,TRUE,TRUE);
+ Doxygen::indexList->incContentsDepth();
+ }
+ FTVHelp* ftv = new FTVHelp(FALSE);
+ writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex,ClassDef::Exception);
+ writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE,ClassDef::Exception);
QGString outStr;
FTextStream t(&outStr);
ftv->generateTreeViewInline(t);
@@ -2216,7 +2832,7 @@ static void writeMemberList(OutputList &ol,bool useSections,int page,
if (!firstSection) ol.endItemList();
QCString cs = letterToLabel(ml->letter());
QCString cl = QString(QChar(ml->letter())).utf8();
- QCString anchor=(QCString)"index_"+cs;
+ QCString anchor=(QCString)"index_"+convertToId(cs);
QCString title=(QCString)"- "+cl+" -";
ol.startSection(anchor,title,SectionInfo::Subsection);
ol.docify(title);
@@ -2388,6 +3004,16 @@ void addNamespaceMemberNameToIndex(MemberDef *md)
g_namespaceIndexLetterUsed[NMHL_Typedefs].append(letter,md);
documentedNamespaceMembers[NMHL_Typedefs]++;
}
+ else if (md->isSequence())
+ {
+ g_namespaceIndexLetterUsed[NMHL_Sequences].append(letter,md);
+ documentedNamespaceMembers[NMHL_Sequences]++;
+ }
+ else if (md->isDictionary())
+ {
+ g_namespaceIndexLetterUsed[NMHL_Dictionaries].append(letter,md);
+ documentedNamespaceMembers[NMHL_Dictionaries]++;
+ }
else if (md->isEnumerate())
{
g_namespaceIndexLetterUsed[NMHL_Enums].append(letter,md);
@@ -2445,6 +3071,16 @@ void addFileMemberNameToIndex(MemberDef *md)
g_fileIndexLetterUsed[FMHL_Typedefs].append(letter,md);
documentedFileMembers[FMHL_Typedefs]++;
}
+ else if (md->isSequence())
+ {
+ g_fileIndexLetterUsed[FMHL_Sequences].append(letter,md);
+ documentedFileMembers[FMHL_Sequences]++;
+ }
+ else if (md->isDictionary())
+ {
+ g_fileIndexLetterUsed[FMHL_Dictionaries].append(letter,md);
+ documentedFileMembers[FMHL_Dictionaries]++;
+ }
else if (md->isEnumerate())
{
g_fileIndexLetterUsed[FMHL_Enums].append(letter,md);
@@ -2487,7 +3123,7 @@ static void writeQuickMemberIndex(OutputList &ol,
anchor=fullName+extension+"#index_";
else
anchor=fullName+"_"+letterToLabel(i)+extension+"#index_";
- startQuickIndexItem(ol,anchor+is,i==page,TRUE,first);
+ startQuickIndexItem(ol,anchor+convertToId(is),i==page,TRUE,first);
ol.writeString(ci);
endQuickIndexItem(ol);
first=FALSE;
@@ -2688,6 +3324,7 @@ static const FmhlInfo *getFmhlInfo(int hl)
{
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
static FmhlInfo fmhlInfo[] =
{
FmhlInfo("globals", theTranslator->trAll()),
@@ -2695,8 +3332,10 @@ static const FmhlInfo *getFmhlInfo(int hl)
fortranOpt ? theTranslator->trSubprograms() :
vhdlOpt ? theTranslator->trFunctionAndProc() :
theTranslator->trFunctions()),
- FmhlInfo("globals_vars",theTranslator->trVariables()),
+ FmhlInfo("globals_vars",sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables()),
FmhlInfo("globals_type",theTranslator->trTypedefs()),
+ FmhlInfo("globals_sequ",theTranslator->trSequences()),
+ FmhlInfo("globals_dict",theTranslator->trDictionaries()),
FmhlInfo("globals_enum",theTranslator->trEnumerations()),
FmhlInfo("globals_eval",theTranslator->trEnumerationValues()),
FmhlInfo("globals_defs",theTranslator->trDefines())
@@ -2832,6 +3471,8 @@ static void writeFileMemberIndex(OutputList &ol)
writeFileMemberIndexFiltered(ol,FMHL_Functions);
writeFileMemberIndexFiltered(ol,FMHL_Variables);
writeFileMemberIndexFiltered(ol,FMHL_Typedefs);
+ writeFileMemberIndexFiltered(ol,FMHL_Sequences);
+ writeFileMemberIndexFiltered(ol,FMHL_Dictionaries);
writeFileMemberIndexFiltered(ol,FMHL_Enums);
writeFileMemberIndexFiltered(ol,FMHL_EnumValues);
writeFileMemberIndexFiltered(ol,FMHL_Defines);
@@ -2856,6 +3497,7 @@ static const NmhlInfo *getNmhlInfo(int hl)
{
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
static NmhlInfo nmhlInfo[] =
{
NmhlInfo("namespacemembers", theTranslator->trAll()),
@@ -2863,8 +3505,10 @@ static const NmhlInfo *getNmhlInfo(int hl)
fortranOpt ? theTranslator->trSubprograms() :
vhdlOpt ? theTranslator->trFunctionAndProc() :
theTranslator->trFunctions()),
- NmhlInfo("namespacemembers_vars",theTranslator->trVariables()),
+ NmhlInfo("namespacemembers_vars",sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables()),
NmhlInfo("namespacemembers_type",theTranslator->trTypedefs()),
+ NmhlInfo("namespacemembers_sequ",theTranslator->trSequences()),
+ NmhlInfo("namespacemembers_dict",theTranslator->trDictionaries()),
NmhlInfo("namespacemembers_enum",theTranslator->trEnumerations()),
NmhlInfo("namespacemembers_eval",theTranslator->trEnumerationValues())
};
@@ -3004,6 +3648,8 @@ static void writeNamespaceMemberIndex(OutputList &ol)
writeNamespaceMemberIndexFiltered(ol,NMHL_Functions);
writeNamespaceMemberIndexFiltered(ol,NMHL_Variables);
writeNamespaceMemberIndexFiltered(ol,NMHL_Typedefs);
+ writeNamespaceMemberIndexFiltered(ol,NMHL_Sequences);
+ writeNamespaceMemberIndexFiltered(ol,NMHL_Dictionaries);
writeNamespaceMemberIndexFiltered(ol,NMHL_Enums);
writeNamespaceMemberIndexFiltered(ol,NMHL_EnumValues);
if (documentedNamespaceMembers[NMHL_All]>0 && addToIndex)
@@ -3022,6 +3668,7 @@ static void writeExampleIndex(OutputList &ol)
if (Doxygen::exampleSDict->count()==0) return;
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Docbook);
LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Examples);
QCString title = lne ? lne->title() : theTranslator->trExamples();
bool addToIndex = lne==0 || lne->visible();
@@ -3621,6 +4268,7 @@ static void writeGroupIndex(OutputList &ol)
ol.pushGeneratorState();
// 1.{
ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Docbook);
LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Modules);
QCString title = lne ? lne->title() : theTranslator->trModules();
bool addToIndex = lne==0 || lne->visible();
@@ -3910,6 +4558,7 @@ static void writeIndex(OutputList &ol)
// write LaTeX/RTF index
//--------------------------------------------------------------------
ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::Docbook);
ol.enable(OutputGenerator::RTF);
ol.startFile("refman",0,0);
@@ -3918,6 +4567,7 @@ static void writeIndex(OutputList &ol)
{
ol.disable(OutputGenerator::Latex);
}
+ ol.disable(OutputGenerator::Docbook);
if (projPrefix.isEmpty())
{
@@ -3939,6 +4589,7 @@ static void writeIndex(OutputList &ol)
ol.parseText(theTranslator->trGeneratedBy());
ol.endIndexSection(isTitlePageAuthor);
ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::Docbook);
ol.lastIndexPage();
if (Doxygen::mainPage)
@@ -3978,9 +4629,11 @@ static void writeIndex(OutputList &ol)
QCString title = pd->title();
if (title.isEmpty()) title=pd->name();
+ ol.disable(OutputGenerator::Docbook);
ol.startIndexSection(isPageDocumentation);
ol.parseText(title);
ol.endIndexSection(isPageDocumentation);
+ ol.enable(OutputGenerator::Docbook);
ol.pushGeneratorState(); // write TOC title (RTF only)
ol.disableAllBut(OutputGenerator::RTF);
@@ -4002,6 +4655,7 @@ static void writeIndex(OutputList &ol)
}
}
+ ol.disable(OutputGenerator::Docbook);
if (!Config_getBool(LATEX_HIDE_INDICES))
{
//if (indexedPages>0)
@@ -4022,6 +4676,12 @@ static void writeIndex(OutputList &ol)
ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trModulesIndex():theTranslator->trNamespaceIndex()));
ol.endIndexSection(isNamespaceIndex);
}
+ if (hierarchyInterfaces>0)
+ {
+ ol.startIndexSection(isClassHierarchyIndex);
+ ol.parseText(/*projPrefix+*/theTranslator->trHierarchicalIndex());
+ ol.endIndexSection(isClassHierarchyIndex);
+ }
if (hierarchyClasses>0)
{
ol.startIndexSection(isClassHierarchyIndex);
@@ -4032,6 +4692,18 @@ static void writeIndex(OutputList &ol)
));
ol.endIndexSection(isClassHierarchyIndex);
}
+ if (hierarchyExceptions>0)
+ {
+ ol.startIndexSection(isClassHierarchyIndex);
+ ol.parseText(/*projPrefix+*/theTranslator->trHierarchicalIndex());
+ ol.endIndexSection(isClassHierarchyIndex);
+ }
+ if (annotatedInterfacesPrinted>0)
+ {
+ ol.startIndexSection(isCompoundIndex);
+ ol.parseText(/*projPrefix+*/theTranslator->trInterfaceIndex());
+ ol.endIndexSection(isCompoundIndex);
+ }
if (annotatedClassesPrinted>0)
{
ol.startIndexSection(isCompoundIndex);
@@ -4042,6 +4714,18 @@ static void writeIndex(OutputList &ol)
));
ol.endIndexSection(isCompoundIndex);
}
+ if (annotatedStructsPrinted>0)
+ {
+ ol.startIndexSection(isCompoundIndex);
+ ol.parseText(/*projPrefix+*/theTranslator->trStructIndex());
+ ol.endIndexSection(isCompoundIndex);
+ }
+ if (annotatedExceptionsPrinted>0)
+ {
+ ol.startIndexSection(isCompoundIndex);
+ ol.parseText(/*projPrefix+*/theTranslator->trExceptionIndex());
+ ol.endIndexSection(isCompoundIndex);
+ }
if (documentedFiles>0)
{
ol.startIndexSection(isFileIndex);
@@ -4049,6 +4733,8 @@ static void writeIndex(OutputList &ol)
ol.endIndexSection(isFileIndex);
}
}
+ ol.enable(OutputGenerator::Docbook);
+
if (documentedGroups>0)
{
ol.startIndexSection(isModuleDocumentation);
@@ -4061,12 +4747,30 @@ static void writeIndex(OutputList &ol)
ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trModuleDocumentation():theTranslator->trNamespaceDocumentation()));
ol.endIndexSection(isNamespaceDocumentation);
}
+ if (annotatedInterfacesPrinted>0)
+ {
+ ol.startIndexSection(isClassDocumentation);
+ ol.parseText(/*projPrefix+*/theTranslator->trInterfaceDocumentation());
+ ol.endIndexSection(isClassDocumentation);
+ }
if (annotatedClassesPrinted>0)
{
ol.startIndexSection(isClassDocumentation);
ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trTypeDocumentation():theTranslator->trClassDocumentation()));
ol.endIndexSection(isClassDocumentation);
}
+ if (annotatedStructsPrinted>0)
+ {
+ ol.startIndexSection(isClassDocumentation);
+ ol.parseText(/*projPrefix+*/theTranslator->trStructDocumentation());
+ ol.endIndexSection(isClassDocumentation);
+ }
+ if (annotatedExceptionsPrinted>0)
+ {
+ ol.startIndexSection(isClassDocumentation);
+ ol.parseText(/*projPrefix+*/theTranslator->trExceptionDocumentation());
+ ol.endIndexSection(isClassDocumentation);
+ }
if (documentedFiles>0)
{
ol.startIndexSection(isFileDocumentation);
@@ -4105,6 +4809,7 @@ static QArray<bool> indexWritten;
static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry> &entries)
{
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
QListIterator<LayoutNavEntry> li(entries);
LayoutNavEntry *lne;
for (li.toFirst();(lne=li.current());++li)
@@ -4202,8 +4907,101 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry
}
break;
case LayoutNavEntry::ClassMembers:
- msg("Generating member index...\n");
- writeClassMemberIndex(ol);
+ if (!sliceOpt)
+ {
+ msg("Generating member index...\n");
+ writeClassMemberIndex(ol);
+ }
+ break;
+ case LayoutNavEntry::Interfaces:
+ if (sliceOpt && annotatedInterfaces>0 && addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0);
+ Doxygen::indexList->incContentsDepth();
+ needsClosing=TRUE;
+ }
+ break;
+ case LayoutNavEntry::InterfaceList:
+ if (sliceOpt)
+ {
+ msg("Generating annotated interface index...\n");
+ writeAnnotatedInterfaceIndex(ol);
+ }
+ break;
+ case LayoutNavEntry::InterfaceIndex:
+ if (sliceOpt)
+ {
+ msg("Generating alphabetical interface index...\n");
+ writeAlphabeticalInterfaceIndex(ol);
+ }
+ break;
+ case LayoutNavEntry::InterfaceHierarchy:
+ if (sliceOpt)
+ {
+ msg("Generating hierarchical interface index...\n");
+ writeHierarchicalInterfaceIndex(ol);
+ if (Config_getBool(HAVE_DOT) && Config_getBool(GRAPHICAL_HIERARCHY))
+ {
+ msg("Generating graphical interface hierarchy...\n");
+ writeGraphicalInterfaceHierarchy(ol);
+ }
+ }
+ break;
+ case LayoutNavEntry::Structs:
+ if (sliceOpt && annotatedStructs>0 && addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0);
+ Doxygen::indexList->incContentsDepth();
+ needsClosing=TRUE;
+ }
+ break;
+ case LayoutNavEntry::StructList:
+ if (sliceOpt)
+ {
+ msg("Generating annotated struct index...\n");
+ writeAnnotatedStructIndex(ol);
+ }
+ break;
+ case LayoutNavEntry::StructIndex:
+ if (sliceOpt)
+ {
+ msg("Generating alphabetical struct index...\n");
+ writeAlphabeticalStructIndex(ol);
+ }
+ break;
+ case LayoutNavEntry::Exceptions:
+ if (sliceOpt && annotatedExceptions>0 && addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0);
+ Doxygen::indexList->incContentsDepth();
+ needsClosing=TRUE;
+ }
+ break;
+ case LayoutNavEntry::ExceptionList:
+ if (sliceOpt)
+ {
+ msg("Generating annotated exception index...\n");
+ writeAnnotatedExceptionIndex(ol);
+ }
+ break;
+ case LayoutNavEntry::ExceptionIndex:
+ if (sliceOpt)
+ {
+ msg("Generating alphabetical exception index...\n");
+ writeAlphabeticalExceptionIndex(ol);
+ }
+ break;
+ case LayoutNavEntry::ExceptionHierarchy:
+ if (sliceOpt)
+ {
+ msg("Generating hierarchical exception index...\n");
+ writeHierarchicalExceptionIndex(ol);
+ if (Config_getBool(HAVE_DOT) && Config_getBool(GRAPHICAL_HIERARCHY))
+ {
+ msg("Generating graphical exception hierarchy...\n");
+ writeGraphicalExceptionHierarchy(ol);
+ }
+ }
break;
case LayoutNavEntry::Files:
{
@@ -4285,6 +5083,9 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry
}
writeUserGroupStubPage(ol,lne);
break;
+ case LayoutNavEntry::None:
+ assert(kind != LayoutNavEntry::None); // should never happen, means not properly initialized
+ break;
}
if (kind!=LayoutNavEntry::User && kind!=LayoutNavEntry::UserGroup) // User entry may appear multiple times
{
@@ -4314,26 +5115,40 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind)
{
static bool showFiles = Config_getBool(SHOW_FILES);
static bool showNamespaces = Config_getBool(SHOW_NAMESPACES);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
switch (kind)
{
- case LayoutNavEntry::MainPage: return TRUE;
- case LayoutNavEntry::User: return TRUE;
- case LayoutNavEntry::UserGroup: return TRUE;
- case LayoutNavEntry::Pages: return indexedPages>0;
- case LayoutNavEntry::Modules: return documentedGroups>0;
- case LayoutNavEntry::Namespaces: return documentedNamespaces>0 && showNamespaces;
- case LayoutNavEntry::NamespaceList: return documentedNamespaces>0 && showNamespaces;
- case LayoutNavEntry::NamespaceMembers: return documentedNamespaceMembers[NMHL_All]>0;
- case LayoutNavEntry::Classes: return annotatedClasses>0;
- case LayoutNavEntry::ClassList: return annotatedClasses>0;
- case LayoutNavEntry::ClassIndex: return annotatedClasses>0;
- case LayoutNavEntry::ClassHierarchy: return hierarchyClasses>0;
- case LayoutNavEntry::ClassMembers: return documentedClassMembers[CMHL_All]>0;
- case LayoutNavEntry::Files: return documentedHtmlFiles>0 && showFiles;
- case LayoutNavEntry::FileList: return documentedHtmlFiles>0 && showFiles;
- case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
- //case LayoutNavEntry::Dirs: return documentedDirs>0;
- case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0;
+ case LayoutNavEntry::MainPage: return TRUE;
+ case LayoutNavEntry::User: return TRUE;
+ case LayoutNavEntry::UserGroup: return TRUE;
+ case LayoutNavEntry::Pages: return indexedPages>0;
+ case LayoutNavEntry::Modules: return documentedGroups>0;
+ case LayoutNavEntry::Namespaces: return documentedNamespaces>0 && showNamespaces;
+ case LayoutNavEntry::NamespaceList: return documentedNamespaces>0 && showNamespaces;
+ case LayoutNavEntry::NamespaceMembers: return documentedNamespaceMembers[NMHL_All]>0;
+ case LayoutNavEntry::Classes: return annotatedClasses>0;
+ case LayoutNavEntry::ClassList: return annotatedClasses>0;
+ case LayoutNavEntry::ClassIndex: return annotatedClasses>0;
+ case LayoutNavEntry::ClassHierarchy: return hierarchyClasses>0;
+ case LayoutNavEntry::ClassMembers: return documentedClassMembers[CMHL_All]>0 && !sliceOpt;
+ case LayoutNavEntry::Interfaces: return annotatedInterfaces>0;
+ case LayoutNavEntry::InterfaceList: return annotatedInterfaces>0;
+ case LayoutNavEntry::InterfaceIndex: return annotatedInterfaces>0;
+ case LayoutNavEntry::InterfaceHierarchy: return hierarchyInterfaces>0;
+ case LayoutNavEntry::Structs: return annotatedStructs>0;
+ case LayoutNavEntry::StructList: return annotatedStructs>0;
+ case LayoutNavEntry::StructIndex: return annotatedStructs>0;
+ case LayoutNavEntry::Exceptions: return annotatedExceptions>0;
+ case LayoutNavEntry::ExceptionList: return annotatedExceptions>0;
+ case LayoutNavEntry::ExceptionIndex: return annotatedExceptions>0;
+ case LayoutNavEntry::ExceptionHierarchy: return hierarchyExceptions>0;
+ case LayoutNavEntry::Files: return documentedHtmlFiles>0 && showFiles;
+ case LayoutNavEntry::FileList: return documentedHtmlFiles>0 && showFiles;
+ case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
+ case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0;
+ case LayoutNavEntry::None: // should never happen, means not properly initialized
+ assert(kind != LayoutNavEntry::None);
+ return FALSE;
}
return FALSE;
}
@@ -4386,7 +5201,7 @@ void renderMemberIndicesAsJs(FTextStream &t,
else // other pages of multi page index
anchor=fullName+"_"+is+extension+"#index_";
t << "{text:\"" << convertToJSString(ci) << "\",url:\""
- << convertToJSString(anchor+is, false) << "\"}";
+ << convertToJSString(anchor+convertToId(is), false) << "\"}";
firstLetter=FALSE;
}
t << "]";
diff --git a/src/index.h b/src/index.h
index ace3614..f3e0241 100644
--- a/src/index.h
+++ b/src/index.h
@@ -184,9 +184,17 @@ enum HighlightedItem
HLI_Modules,
//HLI_Directories,
HLI_Namespaces,
- HLI_Hierarchy,
+ HLI_ClassHierarchy,
+ HLI_InterfaceHierarchy,
+ HLI_ExceptionHierarchy,
HLI_Classes,
- HLI_Annotated,
+ HLI_Interfaces,
+ HLI_Structs,
+ HLI_Exceptions,
+ HLI_AnnotatedClasses,
+ HLI_AnnotatedInterfaces,
+ HLI_AnnotatedStructs,
+ HLI_AnnotatedExceptions,
HLI_Files,
HLI_NamespaceMembers,
HLI_Functions,
@@ -197,6 +205,9 @@ enum HighlightedItem
HLI_UserGroup,
HLI_ClassVisible,
+ HLI_InterfaceVisible,
+ HLI_StructVisible,
+ HLI_ExceptionVisible,
HLI_NamespaceVisible,
HLI_FileVisible
};
@@ -221,6 +232,8 @@ enum FileMemberHighlight
FMHL_Functions,
FMHL_Variables,
FMHL_Typedefs,
+ FMHL_Sequences,
+ FMHL_Dictionaries,
FMHL_Enums,
FMHL_EnumValues,
FMHL_Defines,
@@ -233,6 +246,8 @@ enum NamespaceMemberHighlight
NMHL_Functions,
NMHL_Variables,
NMHL_Typedefs,
+ NMHL_Sequences,
+ NMHL_Dictionaries,
NMHL_Enums,
NMHL_EnumValues,
NMHL_Total = NMHL_EnumValues+1
@@ -257,7 +272,12 @@ void writeIndexHierarchy(OutputList &ol);
void countDataStructures();
extern int annotatedClasses;
+extern int annotatedInterfaces;
+extern int annotatedStructs;
+extern int annotatedExceptions;
extern int hierarchyClasses;
+extern int hierarchyInterfaces;
+extern int hierarchyExceptions;
extern int documentedFiles;
extern int documentedGroups;
extern int documentedNamespaces;
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 1856bb7..ff7c5b0 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -33,6 +33,7 @@
#include "filedef.h"
#include "config.h"
#include "htmlentity.h"
+#include "emoji.h"
#include "plantuml.h"
const int maxLevels=5;
@@ -48,16 +49,23 @@ static const char *getSectionName(int level)
return secLabels[QMIN(maxLevels-1,l)];
}
-static void visitPreStart(FTextStream &t, const bool hasCaption, QCString name, QCString width, QCString height)
+static void visitPreStart(FTextStream &t, bool hasCaption, QCString name, QCString width, QCString height, bool inlineImage = FALSE)
{
- if (hasCaption)
+ if (inlineImage)
{
- t << "\n\\begin{DoxyImage}\n";
+ t << "\n\\begin{DoxyInlineImage}\n";
}
else
{
- t << "\n\\begin{DoxyImageNoCaption}\n"
- " \\mbox{";
+ if (hasCaption)
+ {
+ t << "\n\\begin{DoxyImage}\n";
+ }
+ else
+ {
+ t << "\n\\begin{DoxyImageNoCaption}\n"
+ " \\mbox{";
+ }
}
t << "\\includegraphics";
@@ -80,7 +88,14 @@ static void visitPreStart(FTextStream &t, const bool hasCaption, QCString name,
if (width.isEmpty() && height.isEmpty())
{
/* default setting */
- t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
+ if (inlineImage)
+ {
+ t << "[height=\\baselineskip,keepaspectratio=true]";
+ }
+ else
+ {
+ t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
+ }
}
else
{
@@ -91,21 +106,36 @@ static void visitPreStart(FTextStream &t, const bool hasCaption, QCString name,
if (hasCaption)
{
- t << "\n\\doxyfigcaption{";
+ if (!inlineImage)
+ {
+ t << "\n\\doxyfigcaption{";
+ }
+ else
+ {
+ t << "%"; // to catch the caption
+ }
}
}
-static void visitPostEnd(FTextStream &t, const bool hasCaption)
+static void visitPostEnd(FTextStream &t, bool hasCaption, bool inlineImage = FALSE)
{
- t << "}\n"; // end mbox or caption
- if (hasCaption)
+ if (inlineImage)
{
- t << "\\end{DoxyImage}\n";
+ t << "\n\\end{DoxyInlineImage}\n";
}
- else{
- t << "\\end{DoxyImageNoCaption}\n";
+ else
+ {
+ t << "}\n"; // end mbox or caption
+ if (hasCaption)
+ {
+ t << "\\end{DoxyImage}\n";
+ }
+ else
+ {
+ t << "\\end{DoxyImageNoCaption}\n";
+ }
}
}
@@ -210,6 +240,21 @@ void LatexDocVisitor::visit(DocSymbol *s)
}
}
+void LatexDocVisitor::visit(DocEmoji *s)
+{
+ if (m_hide) return;
+ QCString emojiName = EmojiEntityMapper::instance()->name(s->index());
+ if (!emojiName.isEmpty())
+ {
+ QCString imageName=emojiName.mid(1,emojiName.length()-2); // strip : at start and end
+ m_t << "\\doxygenemoji{" << emojiName << "}{" << imageName << "}";
+ }
+ else
+ {
+ m_t << s->name();
+ }
+}
+
void LatexDocVisitor::visit(DocURL *u)
{
if (m_hide) return;
@@ -217,11 +262,11 @@ void LatexDocVisitor::visit(DocURL *u)
{
m_t << "\\href{";
if (u->isEmail()) m_t << "mailto:";
- m_t << u->url() << "}";
+ m_t << latexFilterURL(u->url()) << "}";
}
- m_t << "\\texttt{ ";
+ m_t << "{\\texttt{ ";
filter(u->url());
- m_t << "}";
+ m_t << "}}";
}
void LatexDocVisitor::visit(DocLineBreak *)
@@ -564,9 +609,9 @@ void LatexDocVisitor::visit(DocIndexEntry *i)
{
if (m_hide) return;
m_t << "\\index{";
- m_t << latexEscapeLabelName(i->entry(),false);
+ m_t << latexEscapeLabelName(i->entry());
m_t << "@{";
- m_t << latexEscapeIndexChars(i->entry(),false);
+ m_t << latexEscapeIndexChars(i->entry());
m_t << "}}";
}
@@ -1177,8 +1222,8 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c)
m_t << "r|}{";
break;
case DocHtmlCell::Center:
- break;
m_t << "c|}{";
+ break;
default:
m_t << "l|}{";
break;
@@ -1252,16 +1297,16 @@ void LatexDocVisitor::visitPre(DocHRef *href)
if (Config_getBool(PDF_HYPERLINKS))
{
m_t << "\\href{";
- m_t << href->url();
+ m_t << latexFilterURL(href->url());
m_t << "}";
}
- m_t << "\\texttt{ ";
+ m_t << "{\\texttt{ ";
}
void LatexDocVisitor::visitPost(DocHRef *)
{
if (m_hide) return;
- m_t << "}";
+ m_t << "}}";
}
void LatexDocVisitor::visitPre(DocHtmlHeader *header)
@@ -1286,7 +1331,7 @@ void LatexDocVisitor::visitPre(DocImage *img)
gfxName=gfxName.left(gfxName.length()-4);
}
- visitPreStart(m_t,img->hasCaption(), gfxName, img->width(), img->height());
+ visitPreStart(m_t,img->hasCaption(), gfxName, img->width(), img->height(), img->isInlineImage());
}
else // other format -> skip
{
@@ -1300,7 +1345,7 @@ void LatexDocVisitor::visitPost(DocImage *img)
if (img->type()==DocImage::Latex)
{
if (m_hide) return;
- visitPostEnd(m_t,img->hasCaption());
+ visitPostEnd(m_t,img->hasCaption(), img->isInlineImage());
}
else // other format
{
@@ -1445,11 +1490,8 @@ void LatexDocVisitor::visitPre(DocParamSect *s)
filter(theTranslator->trExceptions());
break;
case DocParamSect::TemplateParam:
- /* TODO: add this
- filter(theTranslator->trTemplateParam()); break;
- */
m_t << "\n\\begin{DoxyTemplParams}{";
- filter("Template Parameters");
+ filter(theTranslator->trTemplateParameters());
break;
default:
ASSERT(0);
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
index 881863a..7ea8ae1 100644
--- a/src/latexdocvisitor.h
+++ b/src/latexdocvisitor.h
@@ -42,6 +42,7 @@ class LatexDocVisitor : public DocVisitor
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
void visit(DocSymbol *);
+ void visit(DocEmoji *);
void visit(DocURL *);
void visit(DocLineBreak *);
void visit(DocHorRuler *);
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 204683e..b860195 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -165,11 +165,6 @@ void LatexCodeGenerator::writeCodeLink(const char *ref,const char *f,
static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
static bool usePDFLatex = Config_getBool(USE_PDFLATEX);
int l = qstrlen(name);
- if (m_col+l>80)
- {
- m_t << "\n ";
- m_col=0;
- }
if (!ref && usePDFLatex && pdfHyperlinks)
{
m_t << "\\mbox{\\hyperlink{";
@@ -485,6 +480,10 @@ static void writeDefaultHeaderPart1(FTextStream &t)
if (Config_getBool(LATEX_BATCHMODE))
t << "\\batchmode\n";
+ // to overcome problems wit too many open files
+ t << "\\let\\mypdfximage\\pdfximage"
+ "\\def\\pdfximage{\\immediate\\mypdfximage}";
+
// Set document class depending on configuration
QCString documentClass;
if (Config_getBool(COMPACT_LATEX))
@@ -564,6 +563,17 @@ static void writeDefaultHeaderPart1(FTextStream &t)
"\\newcommand{\\+}{\\discretionary{\\mbox{\\scriptsize$\\hookleftarrow$}}{}{}}\n"
"\n";
+ QCString emojiDir=Config_getString(LATEX_EMOJI_DIRECTORY);
+ if (emojiDir.isEmpty()) emojiDir = ".";
+ emojiDir = substitute(emojiDir,"\\","/");
+ t << "% Arguments of doxygenemoji:\n"
+ "% 1) ':<text>:' form of the emoji, already \"LaTeX\"-escaped\n"
+ "% 2) file with the name of the emoji without the .png extension\n"
+ "% in case image exist use this otherwise use the ':<text>:' form\n";
+ t << "\\newcommand{\\doxygenemoji}[2]{%\n"
+ " \\IfFileExists{" << emojiDir << "/#2.png}{\\raisebox{-0.1em}{\\includegraphics[height=0.9em]{" << emojiDir << "/#2.png}}}{#1}%\n"
+ "}\n";
+
// Define page & text layout
QCString paperName=Config_getEnum(PAPER_TYPE);
// "a4wide" package is obsolete (see bug 563698)
@@ -1369,12 +1379,12 @@ void LatexGenerator::startHtmlLink(const char *url)
t << url;
t << "}";
}
- t << "\\texttt{ ";
+ t << "{\\texttt{ ";
}
void LatexGenerator::endHtmlLink()
{
- t << "}";
+ t << "}}";
}
//void LatexGenerator::writeMailLink(const char *url)
@@ -1519,9 +1529,9 @@ void LatexGenerator::endTitleHead(const char *fileName,const char *name)
if (name)
{
t << "\\label{" << stripPath(fileName) << "}\\index{";
- t << latexEscapeLabelName(name,insideTabbing);
+ t << latexEscapeLabelName(name);
t << "@{";
- t << latexEscapeIndexChars(name,insideTabbing);
+ t << latexEscapeIndexChars(name);
t << "}}" << endl;
}
}
@@ -1602,27 +1612,27 @@ void LatexGenerator::startMemberDoc(const char *clname,
t << "\\index{";
if (clname)
{
- t << latexEscapeLabelName(clname,insideTabbing);
+ t << latexEscapeLabelName(clname);
t << "@{";
- t << latexEscapeIndexChars(clname,insideTabbing);
+ t << latexEscapeIndexChars(clname);
t << "}!";
}
- t << latexEscapeLabelName(memname,insideTabbing);
+ t << latexEscapeLabelName(memname);
t << "@{";
- t << latexEscapeIndexChars(memname,insideTabbing);
+ t << latexEscapeIndexChars(memname);
t << "}}" << endl;
t << "\\index{";
- t << latexEscapeLabelName(memname,insideTabbing);
+ t << latexEscapeLabelName(memname);
t << "@{";
- t << latexEscapeIndexChars(memname,insideTabbing);
+ t << latexEscapeIndexChars(memname);
t << "}";
if (clname)
{
t << "!";
- t << latexEscapeLabelName(clname,insideTabbing);
+ t << latexEscapeLabelName(clname);
t << "@{";
- t << latexEscapeIndexChars(clname,insideTabbing);
+ t << latexEscapeIndexChars(clname);
t << "}";
}
t << "}" << endl;
@@ -1640,7 +1650,7 @@ void LatexGenerator::startMemberDoc(const char *clname,
{
t << "\\texorpdfstring{";
}
- t << latexEscapeIndexChars(title,insideTabbing);
+ t << latexEscapeIndexChars(title);
if (pdfHyperlinks)
{
t << "}{" << latexEscapePDFString(title) << "}";
@@ -1715,16 +1725,16 @@ void LatexGenerator::addIndexItem(const char *s1,const char *s2)
if (s1)
{
t << "\\index{";
- t << latexEscapeLabelName(s1,insideTabbing);
+ t << latexEscapeLabelName(s1);
t << "@{";
- t << latexEscapeIndexChars(s1,insideTabbing);
+ t << latexEscapeIndexChars(s1);
t << "}";
if (s2)
{
t << "!";
- t << latexEscapeLabelName(s2,insideTabbing);
+ t << latexEscapeLabelName(s2);
t << "@{";
- t << latexEscapeIndexChars(s2,insideTabbing);
+ t << latexEscapeIndexChars(s2);
t << "}";
}
t << "}";
@@ -2159,7 +2169,7 @@ void LatexGenerator::endParameterName(bool last,bool /*emptyList*/,bool closeBra
void LatexGenerator::exceptionEntry(const char* prefix,bool closeBracket)
{
if (prefix)
- t << " " << prefix;
+ t << " " << prefix << "(";
else if (closeBracket)
t << ")";
t << " ";
@@ -2222,11 +2232,9 @@ void LatexGenerator::startCodeFragment()
void LatexGenerator::endCodeFragment()
{
- //if (DoxyCodeOpen)
- //{
- // t << "}\n";
- // DoxyCodeOpen = FALSE;
- //}
+ //endCodeLine checks is there is still an open code line, if so closes it.
+ endCodeLine();
+
t << "\\end{DoxyCode}\n";
DoxyCodeOpen = FALSE;
}
diff --git a/src/layout.cpp b/src/layout.cpp
index 1d9a5ed..393e05d 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -50,6 +50,9 @@ static const char layout_default[] =
#define COMPILE_FOR_4_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3,langId4,text4) \
COMPILE_FOR_3_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3)+ADD_OPTION(langId4,text4)
+#define COMPILE_FOR_5_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3,langId4,text4,langId5,text5) \
+ COMPILE_FOR_4_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3,langId4,text4)+ADD_OPTION(langId5,text5)
+
static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE)
{
QCString visible = attrib.value("visible").utf8();
@@ -265,6 +268,7 @@ class LayoutParser : public QXmlDefaultHandler
//bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
//bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
//bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
+ bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
// start & end handlers
m_sHandler.insert("doxygenlayout",
@@ -331,9 +335,10 @@ class LayoutParser : public QXmlDefaultHandler
m_sHandler.insert("class/memberdecl/publicmethods",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_pubMethods,
- COMPILE_FOR_1_OPTION(
+ COMPILE_FOR_2_OPTIONS(
theTranslator->trPublicMembers(),
- SrcLangExt_ObjC,theTranslator->trInstanceMethods()
+ SrcLangExt_ObjC,theTranslator->trInstanceMethods(),
+ SrcLangExt_Slice,theTranslator->trOperations()
)));
m_sHandler.insert("class/memberdecl/publicstaticmethods",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
@@ -344,7 +349,11 @@ class LayoutParser : public QXmlDefaultHandler
)));
m_sHandler.insert("class/memberdecl/publicattributes",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pubAttribs,theTranslator->trPublicAttribs()));
+ MemberListType_pubAttribs,
+ COMPILE_FOR_1_OPTION(
+ theTranslator->trPublicAttribs(),
+ SrcLangExt_Slice,theTranslator->trDataMembers()
+ )));
m_sHandler.insert("class/memberdecl/publicstaticattributes",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs()));
@@ -440,17 +449,22 @@ class LayoutParser : public QXmlDefaultHandler
m_sHandler.insert("class/memberdef/functions",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_functionMembers,
- COMPILE_FOR_2_OPTIONS(
+ COMPILE_FOR_3_OPTIONS(
theTranslator->trMemberFunctionDocumentation(),
SrcLangExt_ObjC,theTranslator->trMethodDocumentation(),
- SrcLangExt_Fortran,theTranslator->trMemberFunctionDocumentationFortran()
+ SrcLangExt_Fortran,theTranslator->trMemberFunctionDocumentationFortran(),
+ SrcLangExt_Slice,theTranslator->trOperationDocumentation()
)));
m_sHandler.insert("class/memberdef/related",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation()));
m_sHandler.insert("class/memberdef/variables",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_variableMembers,theTranslator->trMemberDataDocumentation()));
+ MemberListType_variableMembers,
+ COMPILE_FOR_1_OPTION(
+ theTranslator->trMemberDataDocumentation(),
+ SrcLangExt_Slice,theTranslator->trDataMemberDocumentation()
+ )));
m_sHandler.insert("class/memberdef/properties",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_propertyMembers,theTranslator->trPropertyDocumentation()));
@@ -477,16 +491,21 @@ class LayoutParser : public QXmlDefaultHandler
new StartElementHandler(this,&LayoutParser::startMemberDecl));
m_sHandler.insert("namespace/memberdecl/nestednamespaces",
new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry,
- COMPILE_FOR_4_OPTIONS(
+ COMPILE_FOR_5_OPTIONS(
theTranslator->trNamespaces(),
SrcLangExt_Java,theTranslator->trPackages(),
SrcLangExt_VHDL,theTranslator->trPackages(),
SrcLangExt_IDL,theTranslator->trModules(),
- SrcLangExt_Fortran,theTranslator->trModules()
- )));
+ SrcLangExt_Fortran,theTranslator->trModules(),
+ SrcLangExt_Slice,(sliceOpt ?
+ theTranslator->trModules() :
+ theTranslator->trNamespaces()))));
m_sHandler.insert("namespace/memberdecl/constantgroups",
new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedConstantGroups,&LayoutParser::startSectionEntry,
theTranslator->trConstantGroups()));
+ m_sHandler.insert("namespace/memberdecl/interfaces",
+ new StartElementHandlerSection(this,LayoutDocEntry::NamespaceInterfaces,&LayoutParser::startSectionEntry,
+ theTranslator->trSliceInterfaces()));
m_sHandler.insert("namespace/memberdecl/classes",
new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry,
COMPILE_FOR_2_OPTIONS(
@@ -494,11 +513,23 @@ class LayoutParser : public QXmlDefaultHandler
SrcLangExt_VHDL,theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
SrcLangExt_Fortran,theTranslator->trDataTypes()
)));
+ m_sHandler.insert("namespace/memberdecl/structs",
+ new StartElementHandlerSection(this,LayoutDocEntry::NamespaceStructs,&LayoutParser::startSectionEntry,
+ theTranslator->trStructs()));
+ m_sHandler.insert("namespace/memberdecl/exceptions",
+ new StartElementHandlerSection(this,LayoutDocEntry::NamespaceExceptions,&LayoutParser::startSectionEntry,
+ theTranslator->trExceptions()));
m_sHandler.insert("namespace/memberdecl/membergroups",
new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
m_sHandler.insert("namespace/memberdecl/typedefs",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_decTypedefMembers,theTranslator->trTypedefs()));
+ m_sHandler.insert("namespace/memberdecl/sequences",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberListType_decSequenceMembers,theTranslator->trSequences()));
+ m_sHandler.insert("namespace/memberdecl/dictionaries",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberListType_decDictionaryMembers,theTranslator->trDictionaries()));
m_sHandler.insert("namespace/memberdecl/enums",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_decEnumMembers,theTranslator->trEnumerations()));
@@ -512,7 +543,8 @@ class LayoutParser : public QXmlDefaultHandler
)));
m_sHandler.insert("namespace/memberdecl/variables",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decVarMembers,theTranslator->trVariables()));
+ MemberListType_decVarMembers,
+ sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables()));
m_eHandler.insert("namespace/memberdecl",
new EndElementHandler(this,&LayoutParser::endMemberDecl));
m_sHandler.insert("namespace/memberdef",
@@ -526,6 +558,13 @@ class LayoutParser : public QXmlDefaultHandler
m_sHandler.insert("namespace/memberdef/typedefs",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()));
+ m_sHandler.insert("namespace/memberdef/sequences",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation()));
+ m_sHandler.insert("namespace/memberdef/dictionaries",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberListType_docDictionaryMembers,
+ theTranslator->trDictionaryDocumentation()));
m_sHandler.insert("namespace/memberdef/enums",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
@@ -538,7 +577,9 @@ class LayoutParser : public QXmlDefaultHandler
)));
m_sHandler.insert("namespace/memberdef/variables",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docVarMembers,theTranslator->trVariableDocumentation()));
+ MemberListType_docVarMembers,
+ sliceOpt ? theTranslator->trConstantDocumentation() :
+ theTranslator->trVariableDocumentation()));
m_eHandler.insert("namespace/memberdef",
new EndElementHandler(this,&LayoutParser::endMemberDef));
m_eHandler.insert("namespace",
@@ -566,6 +607,9 @@ class LayoutParser : public QXmlDefaultHandler
new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
m_sHandler.insert("file/memberdecl",
new StartElementHandler(this,&LayoutParser::startMemberDecl));
+ m_sHandler.insert("file/memberdecl/interfaces",
+ new StartElementHandlerSection(this,LayoutDocEntry::FileInterfaces,&LayoutParser::startSectionEntry,
+ theTranslator->trSliceInterfaces()));
m_sHandler.insert("file/memberdecl/classes",
new StartElementHandlerSection(this,LayoutDocEntry::FileClasses,&LayoutParser::startSectionEntry,
COMPILE_FOR_2_OPTIONS(
@@ -573,13 +617,20 @@ class LayoutParser : public QXmlDefaultHandler
SrcLangExt_VHDL,theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
SrcLangExt_Fortran,theTranslator->trDataTypes()
)));
+ m_sHandler.insert("file/memberdecl/structs",
+ new StartElementHandlerSection(this,LayoutDocEntry::FileStructs,&LayoutParser::startSectionEntry,
+ theTranslator->trStructs()));
+ m_sHandler.insert("file/memberdecl/exceptions",
+ new StartElementHandlerSection(this,LayoutDocEntry::FileExceptions,&LayoutParser::startSectionEntry,
+ theTranslator->trExceptions()));
m_sHandler.insert("file/memberdecl/namespaces",
new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
- COMPILE_FOR_3_OPTIONS(
+ COMPILE_FOR_4_OPTIONS(
theTranslator->trNamespaces(),
SrcLangExt_Java,theTranslator->trPackages(),
SrcLangExt_IDL,theTranslator->trModules(),
- SrcLangExt_Fortran,theTranslator->trModules()
+ SrcLangExt_Fortran,theTranslator->trModules(),
+ SrcLangExt_Slice,theTranslator->trModules()
)));
m_sHandler.insert("file/memberdecl/constantgroups",
new StartElementHandlerSection(this,LayoutDocEntry::FileConstantGroups,&LayoutParser::startSectionEntry,
@@ -590,6 +641,12 @@ class LayoutParser : public QXmlDefaultHandler
m_sHandler.insert("file/memberdecl/typedefs",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_decTypedefMembers,theTranslator->trTypedefs()));
+ m_sHandler.insert("file/memberdecl/sequences",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberListType_decSequenceMembers,theTranslator->trSequences()));
+ m_sHandler.insert("file/memberdecl/dictionaries",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberListType_decDictionaryMembers,theTranslator->trDictionaries()));
m_sHandler.insert("file/memberdecl/enums",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_decEnumMembers,theTranslator->trEnumerations()));
@@ -603,7 +660,8 @@ class LayoutParser : public QXmlDefaultHandler
)));
m_sHandler.insert("file/memberdecl/variables",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decVarMembers,theTranslator->trVariables()));
+ MemberListType_decVarMembers,
+ sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables()));
m_eHandler.insert("file/memberdecl",
new EndElementHandler(this,&LayoutParser::endMemberDecl));
@@ -621,6 +679,13 @@ class LayoutParser : public QXmlDefaultHandler
m_sHandler.insert("file/memberdef/typedefs",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()));
+ m_sHandler.insert("file/memberdef/sequences",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation()));
+ m_sHandler.insert("file/memberdef/dictionaries",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberListType_docDictionaryMembers,
+ theTranslator->trDictionaryDocumentation()));
m_sHandler.insert("file/memberdef/enums",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_docEnumMembers,
@@ -689,6 +754,12 @@ class LayoutParser : public QXmlDefaultHandler
m_sHandler.insert("group/memberdecl/typedefs",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_decTypedefMembers,theTranslator->trTypedefs()));
+ m_sHandler.insert("group/memberdecl/sequences",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberListType_decSequenceMembers,theTranslator->trSequences()));
+ m_sHandler.insert("group/memberdecl/dictionaries",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberListType_decDictionaryMembers,theTranslator->trDictionaries()));
m_sHandler.insert("group/memberdecl/enums",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_decEnumMembers,theTranslator->trEnumerations()));
@@ -745,6 +816,13 @@ class LayoutParser : public QXmlDefaultHandler
m_sHandler.insert("group/memberdef/typedefs",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()));
+ m_sHandler.insert("group/memberdef/sequences",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation()));
+ m_sHandler.insert("group/memberdef/dictionaries",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberListType_docDictionaryMembers,
+ theTranslator->trDictionaryDocumentation()));
m_sHandler.insert("group/memberdef/enums",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
@@ -897,6 +975,7 @@ class LayoutParser : public QXmlDefaultHandler
static bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
static bool hasGraphicalHierarchy = Config_getBool(HAVE_DOT) &&
Config_getBool(GRAPHICAL_HIERARCHY);
static bool extractAll = Config_getBool(EXTRACT_ALL);
@@ -933,23 +1012,23 @@ class LayoutParser : public QXmlDefaultHandler
},
{ "namespaces",
LayoutNavEntry::Namespaces,
- javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModules() : theTranslator->trNamespaces(),
- javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
- javaOpt || vhdlOpt ? theTranslator->trPackageListDescription() : fortranOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
+ javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt || sliceOpt ? theTranslator->trModules() : theTranslator->trNamespaces(),
+ javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt || sliceOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
+ javaOpt || vhdlOpt ? theTranslator->trPackageListDescription() : fortranOpt || sliceOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
"namespaces"
},
{ "namespacelist",
LayoutNavEntry::NamespaceList,
- javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
+ javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt || sliceOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
QCString(),
- javaOpt || vhdlOpt ? theTranslator->trPackageListDescription() : fortranOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
+ javaOpt || vhdlOpt ? theTranslator->trPackageListDescription() : fortranOpt || sliceOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
"namespaces"
},
{ "namespacemembers",
LayoutNavEntry::NamespaceMembers,
- javaOpt || vhdlOpt ? theTranslator->trPackageMembers() : fortranOpt ? theTranslator->trModulesMembers() : theTranslator->trNamespaceMembers(),
+ javaOpt || vhdlOpt ? theTranslator->trPackageMembers() : fortranOpt || sliceOpt ? theTranslator->trModulesMembers() : theTranslator->trNamespaceMembers(),
QCString(),
- fortranOpt ? theTranslator->trModulesMemberDescription(extractAll) : theTranslator->trNamespaceMemberDescription(extractAll),
+ fortranOpt || sliceOpt ? theTranslator->trModulesMemberDescription(extractAll) : theTranslator->trNamespaceMemberDescription(extractAll),
"namespacemembers"
},
{ "classindex",
@@ -987,6 +1066,83 @@ class LayoutParser : public QXmlDefaultHandler
fortranOpt ? theTranslator->trCompoundMembersDescriptionFortran(extractAll) : theTranslator->trCompoundMembersDescription(extractAll),
"functions"
},
+ { "interfaceindex",
+ LayoutNavEntry::InterfaceIndex,
+ theTranslator->trInterfaceIndex(),
+ QCString(),
+ QCString(),
+ "interfaces"
+ },
+ { "interfaces",
+ LayoutNavEntry::Interfaces,
+ theTranslator->trSliceInterfaces(),
+ theTranslator->trInterfaceList(),
+ theTranslator->trInterfaceListDescription(),
+ "annotatedinterfaces"
+ },
+ { "interfacelist",
+ LayoutNavEntry::InterfaceList,
+ theTranslator->trInterfaceList(),
+ QCString(),
+ theTranslator->trInterfaceListDescription(),
+ "annotatedinterfaces"
+ },
+ { "interfacehierarchy",
+ LayoutNavEntry::InterfaceHierarchy,
+ theTranslator->trInterfaceHierarchy(),
+ QCString(),
+ theTranslator->trInterfaceHierarchyDescription(),
+ hasGraphicalHierarchy ? "interfaceinherits" : "interfacehierarchy"
+ },
+ { "structindex",
+ LayoutNavEntry::StructIndex,
+ theTranslator->trStructIndex(),
+ QCString(),
+ QCString(),
+ "structs"
+ },
+ { "structs",
+ LayoutNavEntry::Structs,
+ theTranslator->trStructs(),
+ theTranslator->trStructList(),
+ theTranslator->trStructListDescription(),
+ "annotatedstructs"
+ },
+ { "structlist",
+ LayoutNavEntry::StructList,
+ theTranslator->trStructList(),
+ QCString(),
+ theTranslator->trStructListDescription(),
+ "annotatedstructs"
+ },
+ { "exceptionindex",
+ LayoutNavEntry::ExceptionIndex,
+ theTranslator->trExceptionIndex(),
+ QCString(),
+ QCString(),
+ "exceptions"
+ },
+ { "exceptions",
+ LayoutNavEntry::Exceptions,
+ theTranslator->trExceptions(),
+ theTranslator->trExceptionList(),
+ theTranslator->trExceptionListDescription(),
+ "annotatedexceptions"
+ },
+ { "exceptionlist",
+ LayoutNavEntry::ExceptionList,
+ theTranslator->trExceptionList(),
+ QCString(),
+ theTranslator->trExceptionListDescription(),
+ "annotatedexceptions"
+ },
+ { "exceptionhierarchy",
+ LayoutNavEntry::ExceptionHierarchy,
+ theTranslator->trExceptionHierarchy(),
+ QCString(),
+ theTranslator->trExceptionHierarchyDescription(),
+ hasGraphicalHierarchy ? "exceptioninherits" : "exceptionhierarchy"
+ },
{ "files",
LayoutNavEntry::Files,
theTranslator->trFile(TRUE,FALSE),
@@ -1268,7 +1424,7 @@ class LayoutParser : public QXmlDefaultHandler
}
private:
- LayoutParser() : m_sHandler(163), m_eHandler(17), m_invalidEntry(FALSE) { }
+ LayoutParser() : m_sHandler(163), m_eHandler(17), m_invalidEntry(FALSE), m_part(0), m_rootNav(NULL) { }
~LayoutParser() { delete m_rootNav; }
QDict<StartElementHandler> m_sHandler;
diff --git a/src/layout.h b/src/layout.h
index 0b9ad9e..b25aa4e 100644
--- a/src/layout.h
+++ b/src/layout.h
@@ -46,10 +46,11 @@ struct LayoutDocEntry
// Namespace specific items
NamespaceNestedNamespaces, NamespaceNestedConstantGroups,
- NamespaceClasses, NamespaceInlineClasses,
+ NamespaceClasses, NamespaceInterfaces, NamespaceStructs, NamespaceExceptions,
+ NamespaceInlineClasses,
// File specific items
- FileClasses, FileNamespaces, FileConstantGroups,
+ FileClasses, FileInterfaces, FileStructs, FileExceptions, FileConstantGroups, FileNamespaces,
FileIncludes, FileIncludeGraph,
FileIncludedByGraph, FileSourceLink,
FileInlineClasses,
@@ -119,6 +120,7 @@ struct LayoutNavEntry
{
public:
enum Kind {
+ None = -1,
MainPage,
Pages,
Modules,
@@ -130,10 +132,20 @@ struct LayoutNavEntry
ClassIndex,
ClassHierarchy,
ClassMembers,
+ Interfaces,
+ InterfaceList,
+ InterfaceIndex,
+ InterfaceHierarchy,
+ Structs,
+ StructList,
+ StructIndex,
+ Exceptions,
+ ExceptionList,
+ ExceptionIndex,
+ ExceptionHierarchy,
Files,
FileList,
FileGlobals,
- //Dirs,
Examples,
User,
UserGroup
@@ -158,7 +170,7 @@ struct LayoutNavEntry
LayoutNavEntry *find(LayoutNavEntry::Kind k,const char *file=0) const;
private:
- LayoutNavEntry() : m_parent(0) {}
+ LayoutNavEntry() : m_parent(0), m_kind(None), m_visible(FALSE) {}
LayoutNavEntry *m_parent;
Kind m_kind;
bool m_visible;
diff --git a/src/layout_default.xml b/src/layout_default.xml
index f087958..373bb20 100644
--- a/src/layout_default.xml
+++ b/src/layout_default.xml
@@ -9,12 +9,26 @@
<tab type="namespacelist" visible="yes" title="" intro=""/>
<tab type="namespacemembers" visible="yes" title="" intro=""/>
</tab>
+ <tab type="interfaces" visible="yes" title="">
+ <tab type="interfacelist" visible="yes" title="" intro=""/>
+ <tab type="interfaceindex" visible="$ALPHABETICAL_INDEX" title=""/>
+ <tab type="interfacehierarchy" visible="yes" title="" intro=""/>
+ </tab>
<tab type="classes" visible="yes" title="">
<tab type="classlist" visible="yes" title="" intro=""/>
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
<tab type="hierarchy" visible="yes" title="" intro=""/>
<tab type="classmembers" visible="yes" title="" intro=""/>
</tab>
+ <tab type="structs" visible="yes" title="">
+ <tab type="structlist" visible="yes" title="" intro=""/>
+ <tab type="structindex" visible="$ALPHABETICAL_INDEX" title=""/>
+ </tab>
+ <tab type="exceptions" visible="yes" title="">
+ <tab type="exceptionlist" visible="yes" title="" intro=""/>
+ <tab type="exceptionindex" visible="$ALPHABETICAL_INDEX" title=""/>
+ <tab type="exceptionhierarchy" visible="yes" title="" intro=""/>
+ </tab>
<tab type="files" visible="yes" title="">
<tab type="filelist" visible="yes" title="" intro=""/>
<tab type="globals" visible="yes" title="" intro=""/>
@@ -87,8 +101,13 @@
<memberdecl>
<nestednamespaces visible="yes" title=""/>
<constantgroups visible="yes" title=""/>
+ <interfaces visible="yes" title=""/>
<classes visible="yes" title=""/>
+ <structs visible="yes" title=""/>
+ <exceptions visible="yes" title=""/>
<typedefs title=""/>
+ <sequences title=""/>
+ <dictionaries title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
@@ -98,6 +117,8 @@
<memberdef>
<inlineclasses title=""/>
<typedefs title=""/>
+ <sequences title=""/>
+ <dictionaries title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
@@ -113,11 +134,16 @@
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
<sourcelink visible="yes"/>
<memberdecl>
+ <interfaces visible="yes" title=""/>
<classes visible="yes" title=""/>
+ <structs visible="yes" title=""/>
+ <exceptions visible="yes" title=""/>
<namespaces visible="yes" title=""/>
<constantgroups visible="yes" title=""/>
<defines title=""/>
<typedefs title=""/>
+ <sequences title=""/>
+ <dictionaries title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
@@ -128,6 +154,8 @@
<inlineclasses title=""/>
<defines title=""/>
<typedefs title=""/>
+ <sequences title=""/>
+ <dictionaries title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
@@ -147,6 +175,8 @@
<classes visible="yes" title=""/>
<defines title=""/>
<typedefs title=""/>
+ <sequences title=""/>
+ <dictionaries title=""/>
<enums title=""/>
<enumvalues title=""/>
<functions title=""/>
@@ -166,6 +196,8 @@
<inlineclasses title=""/>
<defines title=""/>
<typedefs title=""/>
+ <sequences title=""/>
+ <dictionaries title=""/>
<enums title=""/>
<enumvalues title=""/>
<functions title=""/>
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
index e09cc8e..beef632 100644
--- a/src/mandocvisitor.cpp
+++ b/src/mandocvisitor.cpp
@@ -30,6 +30,7 @@
#include "parserintf.h"
#include "filedef.h"
#include "htmlentity.h"
+#include "emoji.h"
ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci,
const char *langExt)
@@ -89,6 +90,21 @@ void ManDocVisitor::visit(DocSymbol *s)
m_firstCol=FALSE;
}
+void ManDocVisitor::visit(DocEmoji *s)
+{
+ if (m_hide) return;
+ const char *res = EmojiEntityMapper::instance()->name(s->index());
+ if (res)
+ {
+ m_t << res;
+ }
+ else
+ {
+ m_t << s->name();
+ }
+ m_firstCol=FALSE;
+}
+
void ManDocVisitor::visit(DocURL *u)
{
if (m_hide) return;
@@ -906,10 +922,7 @@ void ManDocVisitor::visitPre(DocParamSect *s)
case DocParamSect::Exception:
m_t << theTranslator->trExceptions(); break;
case DocParamSect::TemplateParam:
- /* TODO: add this
- m_t << theTranslator->trTemplateParam(); break;
- */
- m_t << "Template Parameters"; break;
+ m_t << theTranslator->trTemplateParameters(); break;
default:
ASSERT(0);
}
diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h
index d248c87..8efc223 100644
--- a/src/mandocvisitor.h
+++ b/src/mandocvisitor.h
@@ -40,6 +40,7 @@ class ManDocVisitor : public DocVisitor
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
void visit(DocSymbol *);
+ void visit(DocEmoji *);
void visit(DocURL *);
void visit(DocLineBreak *);
void visit(DocHorRuler *);
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 2a10db6..b3ae732 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -34,7 +34,7 @@
static QCString getExtension()
{
/*
- * [.][nuber][rest]
+ * [.][number][rest]
* in case of . missing, just ignore it
* in case number missing, just place a 3 in front of it
*/
diff --git a/src/markdown.cpp b/src/markdown.cpp
index dff64ff..b00070e 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -76,7 +76,7 @@
// so for example *bla (*.txt) is cool*
#define ignoreCloseEmphChar(i) \
(data[i]=='(' || data[i]=='{' || data[i]=='[' || data[i]=='<' || \
- data[i]=='=' || data[i]=='+' || data[i]=='-' || data[i]=='\\' || \
+ data[i]=='\\' || \
data[i]=='@')
//----------
@@ -396,9 +396,11 @@ static int processEmphasis2(GrowBuf &out, const char *data, int size, char c)
data[i-1]!='\n'
)
{
- out.addStr("<strong>");
+ if (c == '~') out.addStr("<strike>");
+ else out.addStr("<strong>");
processInline(out,data,i);
- out.addStr("</strong>");
+ if (c == '~') out.addStr("</strike>");
+ else out.addStr("</strong>");
return i + 2;
}
i++;
@@ -406,7 +408,7 @@ static int processEmphasis2(GrowBuf &out, const char *data, int size, char c)
return 0;
}
-/** Parsing tripple emphasis.
+/** Parsing triple emphasis.
* Finds the first closing tag, and delegates to the other emph
*/
static int processEmphasis3(GrowBuf &out, const char *data, int size, char c)
@@ -616,7 +618,7 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
char c = data[0];
int ret;
- if (size>2 && data[1]!=c) // _bla or *bla
+ if (size>2 && c!='~' && data[1]!=c) // _bla or *bla
{
// whitespace cannot follow an opening emphasis
if (data[1]==' ' || data[1]=='\n' ||
@@ -635,7 +637,7 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
}
return ret+2;
}
- if (size>4 && data[1]==c && data[2]==c && data[3]!=c) // ___bla or ***bla
+ if (size>4 && c!='~' && data[1]==c && data[2]==c && data[3]!=c) // ___bla or ***bla
{
if (data[3]==' ' || data[3]=='\n' ||
(ret = processEmphasis3(out, data+3, size-3, c)) == 0)
@@ -647,6 +649,27 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
return 0;
}
+static void writeMarkdownImage(GrowBuf &out, const char *fmt, bool explicitTitle, QCString title, QCString content, QCString link, FileDef *fd)
+{
+ out.addStr("@image ");
+ out.addStr(fmt);
+ out.addStr(" ");
+ out.addStr(link.mid(fd ? 0 : 5));
+ if (!explicitTitle && !content.isEmpty())
+ {
+ out.addStr(" \"");
+ out.addStr(content);
+ out.addStr("\"");
+ }
+ else if ((content.isEmpty() || explicitTitle) && !title.isEmpty())
+ {
+ out.addStr(" \"");
+ out.addStr(title);
+ out.addStr("\"");
+ }
+ out.addStr("\n");
+}
+
static int processLink(GrowBuf &out,const char *data,int,int size)
{
QCString content;
@@ -844,7 +867,15 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
}
if (isToc) // special case for [TOC]
{
- out.addStr("@tableofcontents");
+ int level = Config_getInt(TOC_INCLUDE_HEADINGS);
+ if (level > 0 && level <=5)
+ {
+ char levStr[10];
+ sprintf(levStr,"%d",level);
+ out.addStr("@tableofcontents{html:");
+ out.addStr(levStr);
+ out.addStr("}");
+ }
}
else if (isImageLink)
{
@@ -854,20 +885,10 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
(fd=findFileDef(Doxygen::imageNameDict,link,ambig)))
// assume doxygen symbol link or local image link
{
- out.addStr("@image html ");
- out.addStr(link.mid(fd ? 0 : 5));
- if (!explicitTitle && !content.isEmpty())
- {
- out.addStr(" \"");
- out.addStr(content);
- out.addStr("\"");
- }
- else if ((content.isEmpty() || explicitTitle) && !title.isEmpty())
- {
- out.addStr(" \"");
- out.addStr(title);
- out.addStr("\"");
- }
+ writeMarkdownImage(out, "html", explicitTitle, title, content, link, fd);
+ writeMarkdownImage(out, "latex", explicitTitle, title, content, link, fd);
+ writeMarkdownImage(out, "rtf", explicitTitle, title, content, link, fd);
+ writeMarkdownImage(out, "docbook", explicitTitle, title, content, link, fd);
}
else
{
@@ -1879,7 +1900,7 @@ void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size)
QCString id;
if (isHRuler(data,size))
{
- out.addStr("<hr>\n");
+ out.addStr("\n<hr>\n");
}
else if ((level=isAtxHeader(data,size,header,id)))
{
@@ -1908,27 +1929,6 @@ void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size)
out.addStr(" ");
out.addStr(header);
out.addStr("\n");
- SectionInfo *si = Doxygen::sectionDict->find(id);
- if (si)
- {
- if (si->lineNr != -1)
- {
- warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",header.data(),si->fileName.data(),si->lineNr);
- }
- else
- {
- warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s)",header.data(),si->fileName.data());
- }
- }
- else
- {
- si = new SectionInfo(g_fileName,g_lineNr,id,header,type,level);
- if (g_current)
- {
- g_current->anchors->append(si);
- }
- Doxygen::sectionDict->append(id,si);
- }
}
else
{
@@ -1947,7 +1947,7 @@ void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size)
out.addStr(data,size);
if (hasLineBreak(data,size))
{
- out.addStr("<br>");
+ out.addStr("\n");
}
}
}
@@ -2314,7 +2314,7 @@ static QCString processBlocks(const QCString &s,int indent)
}
else
{
- out.addStr("<hr>\n");
+ out.addStr("\n<hr>\n");
}
pi=-1;
i=end;
@@ -2513,6 +2513,7 @@ QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,cons
// setup callback table for special characters
g_actions[(unsigned int)'_']=processEmphasis;
g_actions[(unsigned int)'*']=processEmphasis;
+ g_actions[(unsigned int)'~']=processEmphasis;
g_actions[(unsigned int)'`']=processCodeSpan;
g_actions[(unsigned int)'\\']=processSpecialCommand;
g_actions[(unsigned int)'@']=processSpecialCommand;
diff --git a/src/marshal.cpp b/src/marshal.cpp
index fa29aed..57ff44b 100644
--- a/src/marshal.cpp
+++ b/src/marshal.cpp
@@ -350,6 +350,7 @@ void marshalLocalToc(StorageIntf *s,const LocalToc &lt)
marshalInt(s,lt.htmlLevel());
marshalInt(s,lt.latexLevel());
marshalInt(s,lt.xmlLevel());
+ marshalInt(s,lt.docbookLevel());
}
void marshalEntry(StorageIntf *s,Entry *e)
@@ -369,6 +370,8 @@ void marshalEntry(StorageIntf *s,Entry *e)
marshalBool(s,e->subGrouping);
marshalBool(s,e->callGraph);
marshalBool(s,e->callerGraph);
+ marshalBool(s,e->referencedByRelation);
+ marshalBool(s,e->referencesRelation);
marshalInt(s,(int)e->virt);
marshalQCString(s,e->args);
marshalQCString(s,e->bitfields);
@@ -408,6 +411,7 @@ void marshalEntry(StorageIntf *s,Entry *e)
marshalBool(s,e->artificial);
marshalInt(s,(int)e->groupDocType);
marshalQCString(s,e->id);
+ marshalQCString(s,e->metaData);
}
void marshalEntryTree(StorageIntf *s,Entry *e)
@@ -740,6 +744,7 @@ LocalToc unmarshalLocalToc(StorageIntf *s)
int htmlLevel = unmarshalInt(s);
int latexLevel = unmarshalInt(s);
int xmlLevel = unmarshalInt(s);
+ int docbookLevel = unmarshalInt(s);
if ((mask & (1<<LocalToc::Html))!=0)
{
result.enableHtml(htmlLevel);
@@ -752,6 +757,10 @@ LocalToc unmarshalLocalToc(StorageIntf *s)
{
result.enableXml(xmlLevel);
}
+ if ((mask & (1<<LocalToc::Docbook))!=0)
+ {
+ result.enableDocbook(docbookLevel);
+ }
return result;
}
@@ -774,6 +783,8 @@ Entry * unmarshalEntry(StorageIntf *s)
e->subGrouping = unmarshalBool(s);
e->callGraph = unmarshalBool(s);
e->callerGraph = unmarshalBool(s);
+ e->referencedByRelation = unmarshalBool(s);
+ e->referencesRelation = unmarshalBool(s);
e->virt = (Specifier)unmarshalInt(s);
e->args = unmarshalQCString(s);
e->bitfields = unmarshalQCString(s);
@@ -817,6 +828,7 @@ Entry * unmarshalEntry(StorageIntf *s)
e->artificial = unmarshalBool(s);
e->groupDocType = (Entry::GroupDocType)unmarshalInt(s);
e->id = unmarshalQCString(s);
+ e->metaData = unmarshalQCString(s);
return e;
}
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index c9745ac..a2fcf69 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -161,10 +161,12 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md)
//ol.disableAllBut(OutputGenerator::Html);
bool htmlOn = ol.isEnabled(OutputGenerator::Html);
bool latexOn = ol.isEnabled(OutputGenerator::Latex);
+ bool docbookOn = ol.isEnabled(OutputGenerator::Docbook);
{
// html and latex
if (htmlOn) ol.enable(OutputGenerator::Html);
if (latexOn) ol.enable(OutputGenerator::Latex);
+ if (docbookOn) ol.enable(OutputGenerator::Docbook);
ol.endMemberDocName();
ol.startParameterList(!md->isObjCMethod());
@@ -172,6 +174,7 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md)
ol.enableAll();
ol.disable(OutputGenerator::Html);
ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Docbook);
{
// other formats
if (!md->isObjCMethod()) ol.docify("("); // start argument list
@@ -270,6 +273,7 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md)
// ol.docify(" ");
//}
ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Docbook);
ol.disable(OutputGenerator::Html);
ol.docify(" "); /* man page */
if (htmlOn) ol.enable(OutputGenerator::Html);
@@ -277,12 +281,15 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md)
ol.startEmphasis();
ol.enable(OutputGenerator::Man);
if (latexOn) ol.enable(OutputGenerator::Latex);
+ if (docbookOn) ol.enable(OutputGenerator::Docbook);
if (a->name.isEmpty()) ol.docify(a->type); else ol.docify(a->name);
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Docbook);
ol.endEmphasis();
ol.enable(OutputGenerator::Man);
if (latexOn) ol.enable(OutputGenerator::Latex);
+ if (docbookOn) ol.enable(OutputGenerator::Docbook);
}
if (!a->array.isEmpty())
{
@@ -338,10 +345,12 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md)
ol.pushGeneratorState();
ol.disable(OutputGenerator::Html);
ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Docbook);
if (!md->isObjCMethod()) ol.docify(")"); // end argument list
ol.enableAll();
if (htmlOn) ol.enable(OutputGenerator::Html);
if (latexOn) ol.enable(OutputGenerator::Latex);
+ if (docbookOn) ol.enable(OutputGenerator::Docbook);
if (first) ol.startParameterName(defArgList->count()<2);
ol.endParameterName(TRUE,defArgList->count()<2,!md->isObjCMethod());
ol.popGeneratorState();
@@ -475,7 +484,7 @@ class MemberDefImpl
void init(Definition *def,const char *t,const char *a,const char *e,
Protection p,Specifier v,bool s,Relationship r,
MemberType mt,const ArgumentList *tal,
- const ArgumentList *al
+ const ArgumentList *al,const char *meta
);
ClassDef *classDef; // member of or related to
@@ -530,6 +539,8 @@ class MemberDefImpl
QList<ArgumentList> *defTmpArgLists; // lists of template argument lists
// (for template functions in nested template classes)
+ QCString metaData; // Slice metadata.
+
ClassDef *cachedAnonymousType; // if the member has an anonymous compound
// as its type then this is computed by
// getClassDefOfAnonymousType() and
@@ -575,6 +586,8 @@ class MemberDefImpl
bool annUsed;
bool hasCallGraph;
bool hasCallerGraph;
+ bool hasReferencedByRelation;
+ bool hasReferencesRelation;
bool explExt; // member was explicitly declared external
bool tspec; // member is a template specialization
bool groupHasDocs; // true if the entry that caused the grouping was documented
@@ -617,7 +630,7 @@ void MemberDefImpl::init(Definition *def,
const char *t,const char *a,const char *e,
Protection p,Specifier v,bool s,Relationship r,
MemberType mt,const ArgumentList *tal,
- const ArgumentList *al
+ const ArgumentList *al,const char *meta
)
{
classDef=0;
@@ -638,6 +651,8 @@ void MemberDefImpl::init(Definition *def,
defTmpArgLists=0;
hasCallGraph = FALSE;
hasCallerGraph = FALSE;
+ hasReferencedByRelation = FALSE;
+ hasReferencesRelation = FALSE;
initLines=0;
type=t;
if (mt==MemberType_Typedef) type.stripPrefix("typedef ");
@@ -700,6 +715,7 @@ void MemberDefImpl::init(Definition *def,
{
declArgList = 0;
}
+ metaData = meta;
templateMaster = 0;
classSectionSDict = 0;
docsForDefinition = TRUE;
@@ -739,17 +755,18 @@ void MemberDefImpl::init(Definition *def,
* \param tal The template arguments of this member.
* \param al The arguments of this member. This is a structured form of
* the string past as argument \a a.
+ * \param meta Slice metadata.
*/
MemberDef::MemberDef(const char *df,int dl,int dc,
const char *t,const char *na,const char *a,const char *e,
Protection p,Specifier v,bool s,Relationship r,MemberType mt,
- const ArgumentList *tal,const ArgumentList *al
+ const ArgumentList *tal,const ArgumentList *al,const char *meta
) : Definition(df,dl,dc,removeRedundantWhiteSpace(na)), visited(FALSE)
{
//printf("MemberDef::MemberDef(%s)\n",na);
m_impl = new MemberDefImpl;
- m_impl->init(this,t,a,e,p,v,s,r,mt,tal,al);
+ m_impl->init(this,t,a,e,p,v,s,r,mt,tal,al,meta);
number_of_flowkw = 1;
m_isLinkableCached = 0;
m_isConstructorCached = 0;
@@ -1392,7 +1409,7 @@ bool MemberDef::isBriefSectionVisible() const
QCString MemberDef::getDeclType() const
{
QCString ltype(m_impl->type);
- if (m_impl->mtype==MemberType_Typedef)
+ if (isTypedef() && getLanguage() != SrcLangExt_Slice)
{
ltype.prepend("typedef ");
}
@@ -1478,6 +1495,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Docbook);
ol.docify("\n");
ol.popGeneratorState();
}
@@ -1501,7 +1519,10 @@ void MemberDef::writeDeclaration(OutputList &ol,
// *** write type
QCString ltype(m_impl->type);
- if (m_impl->mtype==MemberType_Typedef) ltype.prepend("typedef ");
+ if (isTypedef() && getLanguage() != SrcLangExt_Slice)
+ {
+ ltype.prepend("typedef ");
+ }
if (isAlias())
{
ltype="using";
@@ -2416,6 +2437,10 @@ QCString MemberDef::displayDefinition() const
else
{
ldef.prepend("enum ");
+ if (isSliceLocal())
+ {
+ ldef.prepend("local ");
+ }
}
}
else if (isEnumValue())
@@ -2550,7 +2575,7 @@ void MemberDef::writeDocumentation(MemberList *ml,
QCString scopeName = scName;
QCString memAnchor = anchor();
- QCString ciname = container->name();
+ QCString ciname = container->displayName();
Definition *scopedContainer = container; // see bug 753608
if (container->definitionType()==TypeGroup)
{
@@ -2593,6 +2618,10 @@ void MemberDef::writeDocumentation(MemberList *ml,
else
{
ldef.prepend("enum ");
+ if (isSliceLocal())
+ {
+ ldef.prepend("local ");
+ }
}
}
else if (isEnumValue())
@@ -2609,6 +2638,17 @@ void MemberDef::writeDocumentation(MemberList *ml,
int i=0,l;
static QRegExp r("@[0-9]+");
+ if (lang == SrcLangExt_Slice)
+ {
+ // Remove the container scope from the member name.
+ QCString prefix = scName + sep;
+ int pos = ldef.findRev(prefix.data());
+ if(pos != -1)
+ {
+ ldef.remove(pos, prefix.length());
+ }
+ }
+
//----------------------------------------
ol.pushGeneratorState();
@@ -2664,6 +2704,13 @@ void MemberDef::writeDocumentation(MemberList *ml,
ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
ol.startMemberDoc(ciname,name(),memAnchor,title,memCount,memTotal,showInline);
+ if (!m_impl->metaData.isEmpty() && getLanguage()==SrcLangExt_Slice)
+ {
+ ol.startMemberDocPrefixItem();
+ ol.docify(m_impl->metaData);
+ ol.endMemberDocPrefixItem();
+ }
+
ClassDef *cd=getClassDef();
NamespaceDef *nd=getNamespaceDef();
if (!Config_getBool(HIDE_SCOPE_NAMES))
@@ -2768,6 +2815,21 @@ void MemberDef::writeDocumentation(MemberList *ml,
{
hasParameterList=VhdlDocGen::writeVHDLTypeDocumentation(this,scopedContainer,ol);
}
+ else if (lang==SrcLangExt_Slice)
+ {
+ // Eliminate the self-reference.
+ int pos = ldef.findRev(' ');
+ linkifyText(TextGeneratorOLImpl(ol),
+ scopedContainer,
+ getBodyDef(),
+ this,
+ ldef.left(pos)
+ );
+ ol.docify(ldef.mid(pos));
+ Definition *scope = cd;
+ if (scope==0) scope = nd;
+ hasParameterList=writeDefArgumentList(ol,scope,this);
+ }
else
{
linkifyText(TextGeneratorOLImpl(ol),
@@ -2974,9 +3036,9 @@ void MemberDef::writeDocumentation(MemberList *ml,
_writeExamples(ol);
_writeTypeConstraints(ol);
writeSourceDef(ol,cname);
- writeSourceRefs(ol,cname);
- writeSourceReffedBy(ol,cname);
writeInlineCode(ol,cname);
+ if (hasReferencesRelation()) writeSourceRefs(ol,cname);
+ if (hasReferencedByRelation()) writeSourceReffedBy(ol,cname);
_writeCallGraph(ol);
_writeCallerGraph(ol);
@@ -3072,7 +3134,7 @@ QCString MemberDef::fieldType() const
type = m_impl->type;
}
- if (isTypedef()) type.prepend("typedef ");
+ if (isTypedef() && getLanguage() != SrcLangExt_Slice) type.prepend("typedef ");
return simplifyTypeForTable(type);
}
@@ -3189,6 +3251,8 @@ QCString MemberDef::memberTypeName() const
case MemberType_Event: return "event";
case MemberType_Interface: return "interface";
case MemberType_Service: return "service";
+ case MemberType_Sequence: return "sequence";
+ case MemberType_Dictionary: return "dictionary";
default: return "unknown";
}
}
@@ -3451,7 +3515,7 @@ MemberDef *MemberDef::createTemplateInstanceMember(
methodName,
substituteTemplateArgumentsInString(m_impl->args,formalArgs,actualArgs),
m_impl->exception, m_impl->prot,
- m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype, 0, 0
+ m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype, 0, 0, ""
);
imd->setArgumentList(actualArgList);
imd->setDefinition(substituteTemplateArgumentsInString(m_impl->def,formalArgs,actualArgs));
@@ -3613,6 +3677,8 @@ void MemberDef::writeTagFile(FTextStream &tagFile)
case MemberType_Slot: tagFile << "slot"; break;
case MemberType_Interface: tagFile << "interface"; break;
case MemberType_Service: tagFile << "service"; break;
+ case MemberType_Sequence: tagFile << "sequence"; break;
+ case MemberType_Dictionary: tagFile << "dictionary"; break;
}
if (m_impl->prot!=Public)
{
@@ -3836,8 +3902,10 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
typeDecl.pushGeneratorState();
typeDecl.disableAllBut(OutputGenerator::Html);
typeDecl.enable(OutputGenerator::Latex);
+ typeDecl.enable(OutputGenerator::Docbook);
typeDecl.lineBreak();
typeDecl.disable(OutputGenerator::Latex);
+ typeDecl.disable(OutputGenerator::Docbook);
typeDecl.writeString("&#160;&#160;");
typeDecl.popGeneratorState();
}
@@ -3948,6 +4016,18 @@ void MemberDef::enableCallerGraph(bool e)
if (e) Doxygen::parseSourcesNeeded = TRUE;
}
+void MemberDef::enableReferencedByRelation(bool e)
+{
+ m_impl->hasReferencedByRelation=e;
+ if (e) Doxygen::parseSourcesNeeded = TRUE;
+}
+
+void MemberDef::enableReferencesRelation(bool e)
+{
+ m_impl->hasReferencesRelation=e;
+ if (e) Doxygen::parseSourcesNeeded = TRUE;
+}
+
#if 0
bool MemberDef::protectionVisible() const
{
@@ -4173,6 +4253,16 @@ bool MemberDef::isTypedef() const
return m_impl->mtype==MemberType_Typedef;
}
+bool MemberDef::isSequence() const
+{
+ return m_impl->mtype==MemberType_Sequence;
+}
+
+bool MemberDef::isDictionary() const
+{
+ return m_impl->mtype==MemberType_Dictionary;
+}
+
bool MemberDef::isFunction() const
{
return m_impl->mtype==MemberType_Function;
@@ -4510,6 +4600,11 @@ bool MemberDef::livesInsideEnum() const
return m_impl->livesInsideEnum;
}
+bool MemberDef::isSliceLocal() const
+{
+ return (m_impl->memSpec&Entry::Local)!=0;
+}
+
MemberList *MemberDef::enumFieldList() const
{
return m_impl->enumFields;
@@ -4580,6 +4675,16 @@ bool MemberDef::hasCallerGraph() const
return m_impl->hasCallerGraph;
}
+bool MemberDef::hasReferencedByRelation() const
+{
+ return m_impl->hasReferencedByRelation;
+}
+
+bool MemberDef::hasReferencesRelation() const
+{
+ return m_impl->hasReferencesRelation;
+}
+
MemberDef *MemberDef::templateMaster() const
{
return m_impl->templateMaster;
@@ -5092,6 +5197,11 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
mdef->enableCallerGraph(mdec->hasCallerGraph() || mdef->hasCallerGraph());
mdec->enableCallGraph(mdec->hasCallGraph() || mdef->hasCallGraph());
mdec->enableCallerGraph(mdec->hasCallerGraph() || mdef->hasCallerGraph());
+
+ mdef->enableReferencedByRelation(mdec->hasReferencedByRelation() || mdef->hasReferencedByRelation());
+ mdef->enableCallerGraph(mdec->hasReferencesRelation() || mdef->hasReferencesRelation());
+ mdec->enableReferencedByRelation(mdec->hasReferencedByRelation() || mdef->hasReferencedByRelation());
+ mdec->enableCallerGraph(mdec->hasReferencesRelation() || mdef->hasReferencesRelation());
}
}
}
diff --git a/src/memberdef.h b/src/memberdef.h
index bf7ea9a..2c88438 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -48,7 +48,7 @@ class MemberDef : public Definition
const char *type,const char *name,const char *args,
const char *excp,Protection prot,Specifier virt,bool stat,
Relationship related,MemberType t,const ArgumentList *tal,
- const ArgumentList *al);
+ const ArgumentList *al,const char *metaData);
~MemberDef();
DefType definitionType() const { return TypeMember; }
// move this member into a different scope
@@ -109,6 +109,8 @@ class MemberDef : public Definition
bool isEnumerate() const;
bool isEnumValue() const;
bool isTypedef() const;
+ bool isSequence() const;
+ bool isDictionary() const;
bool isFunction() const;
bool isFunctionPtr() const;
bool isDefine() const;
@@ -177,6 +179,7 @@ class MemberDef : public Definition
bool showInCallGraph() const;
bool isStrongEnumValue() const;
bool livesInsideEnum() const;
+ bool isSliceLocal() const;
int numberOfFlowKeyWords();
// derived getters
@@ -237,6 +240,9 @@ class MemberDef : public Definition
bool hasCallGraph() const;
bool hasCallerGraph() const;
bool visibleMemberGroup(bool hideNoHeader);
+ // refrenced related members
+ bool hasReferencesRelation() const;
+ bool hasReferencedByRelation() const;
MemberDef *templateMaster() const;
QCString getScopeString() const;
@@ -349,6 +355,9 @@ class MemberDef : public Definition
void enableCallGraph(bool e);
void enableCallerGraph(bool e);
+ void enableReferencedByRelation(bool e);
+ void enableReferencesRelation(bool e);
+
void setTemplateMaster(MemberDef *mt);
void addListReference(Definition *d);
void setDocsForDefinition(bool b);
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index aaa504f..5ee47ab 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -278,6 +278,16 @@ int MemberGroup::typedefCount() const
return memberList->typedefCount();
}
+int MemberGroup::sequenceCount() const
+{
+ return memberList->sequenceCount();
+}
+
+int MemberGroup::dictionaryCount() const
+{
+ return memberList->dictionaryCount();
+}
+
int MemberGroup::protoCount() const
{
return memberList->protoCount();
diff --git a/src/membergroup.h b/src/membergroup.h
index 29fba07..b590d48 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -76,6 +76,8 @@ class MemberGroup
int enumCount() const;
int enumValueCount() const;
int typedefCount() const;
+ int sequenceCount() const;
+ int dictionaryCount() const;
int protoCount() const;
int defineCount() const;
int friendCount() const;
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index e19cead..a4e5596 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -41,6 +41,8 @@ MemberList::MemberList() : m_listType(MemberListType_pubMethods)
m_enumCnt=0;
m_enumValCnt=0;
m_typeCnt=0;
+ m_seqCnt=0;
+ m_dictCnt=0;
m_protoCnt=0;
m_defCnt=0;
m_friendCnt=0;
@@ -59,6 +61,8 @@ MemberList::MemberList(MemberListType lt) : m_listType(lt)
m_enumCnt=0;
m_enumValCnt=0;
m_typeCnt=0;
+ m_seqCnt=0;
+ m_dictCnt=0;
m_protoCnt=0;
m_defCnt=0;
m_friendCnt=0;
@@ -139,7 +143,7 @@ void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
//printf("----- countDecMembers count=%d ----\n",count());
m_varCnt=m_funcCnt=m_enumCnt=m_enumValCnt=0;
- m_typeCnt=m_protoCnt=m_defCnt=m_friendCnt=0;
+ m_typeCnt=m_seqCnt=m_dictCnt=m_protoCnt=m_defCnt=m_friendCnt=0;
m_numDecMembers=0;
QListIterator<MemberDef> mli(*this);
MemberDef *md;
@@ -168,6 +172,8 @@ void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
m_enumValCnt++,m_numDecMembers++;
break;
case MemberType_Typedef: m_typeCnt++,m_numDecMembers++; break;
+ case MemberType_Sequence: m_seqCnt++,m_numDecMembers++; break;
+ case MemberType_Dictionary: m_dictCnt++,m_numDecMembers++; break;
//case MemberType_Prototype: m_protoCnt++,m_numDecMembers++; break;
case MemberType_Define: if (Config_getBool(EXTRACT_ALL) ||
md->argsString() ||
@@ -194,6 +200,8 @@ void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
m_enumCnt+=mg->enumCount();
m_enumValCnt+=mg->enumValueCount();
m_typeCnt+=mg->typedefCount();
+ m_seqCnt+=mg->sequenceCount();
+ m_dictCnt+=mg->dictionaryCount();
m_protoCnt+=mg->protoCount();
m_defCnt+=mg->defineCount();
m_friendCnt+=mg->friendCount();
@@ -314,16 +322,18 @@ bool MemberList::declVisible() const
{
switch (md->memberType())
{
- case MemberType_Define: // fall through
- case MemberType_Typedef: // fall through
- case MemberType_Variable: // fall through
- case MemberType_Function: // fall through
- case MemberType_Signal: // fall through
- case MemberType_Slot: // fall through
- case MemberType_DCOP: // fall through
- case MemberType_Property: // fall through
- case MemberType_Interface: // fall through
- case MemberType_Service: // fall through
+ case MemberType_Define: // fall through
+ case MemberType_Typedef: // fall through
+ case MemberType_Variable: // fall through
+ case MemberType_Function: // fall through
+ case MemberType_Signal: // fall through
+ case MemberType_Slot: // fall through
+ case MemberType_DCOP: // fall through
+ case MemberType_Property: // fall through
+ case MemberType_Interface: // fall through
+ case MemberType_Service: // fall through
+ case MemberType_Sequence: // fall through
+ case MemberType_Dictionary: // fall through
case MemberType_Event:
return TRUE;
case MemberType_Enumeration:
@@ -383,17 +393,19 @@ void MemberList::writePlainDeclarations(OutputList &ol,
//printf(">>> rendering\n");
switch(md->memberType())
{
- case MemberType_Define: // fall through
+ case MemberType_Define: // fall through
//case MemberType_Prototype: // fall through
- case MemberType_Typedef: // fall through
- case MemberType_Variable: // fall through
- case MemberType_Function: // fall through
- case MemberType_Signal: // fall through
- case MemberType_Slot: // fall through
- case MemberType_DCOP: // fall through
- case MemberType_Property: // fall through
- case MemberType_Interface: // fall through
- case MemberType_Service: // fall through
+ case MemberType_Typedef: // fall through
+ case MemberType_Variable: // fall through
+ case MemberType_Function: // fall through
+ case MemberType_Signal: // fall through
+ case MemberType_Slot: // fall through
+ case MemberType_DCOP: // fall through
+ case MemberType_Property: // fall through
+ case MemberType_Interface: // fall through
+ case MemberType_Service: // fall through
+ case MemberType_Sequence: // fall through
+ case MemberType_Dictionary: // fall through
case MemberType_Event:
{
if (first) ol.startMemberList(),first=FALSE;
@@ -419,6 +431,10 @@ void MemberList::writePlainDeclarations(OutputList &ol,
{
ol.startDoxyAnchor(md->getOutputFileBase(),0,md->anchor(),md->name(),QCString());
}
+ if (md->isSliceLocal())
+ {
+ ol.writeString("local ");
+ }
ol.writeString("enum ");
ol.insertMemberAlign();
md->writeEnumDeclaration(ol,cd,nd,fd,gd);
@@ -921,6 +937,8 @@ void MemberList::marshal(StorageIntf *s)
marshalInt(s,m_enumCnt);
marshalInt(s,m_enumValCnt);
marshalInt(s,m_typeCnt);
+ marshalInt(s,m_seqCnt);
+ marshalInt(s,m_dictCnt);
marshalInt(s,m_protoCnt);
marshalInt(s,m_defCnt);
marshalInt(s,m_friendCnt);
@@ -953,6 +971,8 @@ void MemberList::unmarshal(StorageIntf *s)
m_enumCnt = unmarshalInt(s);
m_enumValCnt = unmarshalInt(s);
m_typeCnt = unmarshalInt(s);
+ m_seqCnt = unmarshalInt(s);
+ m_dictCnt = unmarshalInt(s);
m_protoCnt = unmarshalInt(s);
m_defCnt = unmarshalInt(s);
m_friendCnt = unmarshalInt(s);
@@ -1021,6 +1041,8 @@ QCString MemberList::listTypeAsString(MemberListType type)
case MemberListType_decDefineMembers: return "define-members";
case MemberListType_decProtoMembers: return "proto-members";
case MemberListType_decTypedefMembers: return "typedef-members";
+ case MemberListType_decSequenceMembers: return "sequence-members";
+ case MemberListType_decDictionaryMembers: return "dictionary-members";
case MemberListType_decEnumMembers: return "enum-members";
case MemberListType_decFuncMembers: return "func-members";
case MemberListType_decVarMembers: return "var-members";
diff --git a/src/memberlist.h b/src/memberlist.h
index 38f0e89..a96f61f 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -50,17 +50,19 @@ class MemberList : private QList<MemberDef>
MemberDef *take(uint index);
- int varCount() const { ASSERT(m_numDecMembers!=-1); return m_varCnt; }
- int funcCount() const { ASSERT(m_numDecMembers!=-1); return m_funcCnt; }
- int enumCount() const { ASSERT(m_numDecMembers!=-1); return m_enumCnt; }
- int enumValueCount() const { ASSERT(m_numDecMembers!=-1); return m_enumValCnt; }
- int typedefCount() const { ASSERT(m_numDecMembers!=-1); return m_typeCnt; }
- int protoCount() const { ASSERT(m_numDecMembers!=-1); return m_protoCnt; }
- int defineCount() const { ASSERT(m_numDecMembers!=-1); return m_defCnt; }
- int friendCount() const { ASSERT(m_numDecMembers!=-1); return m_friendCnt; }
- int numDecMembers() const { ASSERT(m_numDecMembers!=-1); return m_numDecMembers; }
- int numDocMembers() const { ASSERT(m_numDocMembers!=-1); return m_numDocMembers; }
- bool needsSorting() const { return m_needsSorting; }
+ int varCount() const { ASSERT(m_numDecMembers!=-1); return m_varCnt; }
+ int funcCount() const { ASSERT(m_numDecMembers!=-1); return m_funcCnt; }
+ int enumCount() const { ASSERT(m_numDecMembers!=-1); return m_enumCnt; }
+ int enumValueCount() const { ASSERT(m_numDecMembers!=-1); return m_enumValCnt; }
+ int typedefCount() const { ASSERT(m_numDecMembers!=-1); return m_typeCnt; }
+ int sequenceCount() const { ASSERT(m_numDecMembers!=-1); return m_seqCnt; }
+ int dictionaryCount() const { ASSERT(m_numDecMembers!=-1); return m_dictCnt; }
+ int protoCount() const { ASSERT(m_numDecMembers!=-1); return m_protoCnt; }
+ int defineCount() const { ASSERT(m_numDecMembers!=-1); return m_defCnt; }
+ int friendCount() const { ASSERT(m_numDecMembers!=-1); return m_friendCnt; }
+ int numDecMembers() const { ASSERT(m_numDecMembers!=-1); return m_numDecMembers; }
+ int numDocMembers() const { ASSERT(m_numDocMembers!=-1); return m_numDocMembers; }
+ bool needsSorting() const { return m_needsSorting; }
void countDecMembers(bool countEnumValues=FALSE,GroupDef *gd=0);
void countDocMembers(bool countEnumValues=FALSE);
int countInheritableMembers(ClassDef *inheritedFrom) const;
@@ -98,6 +100,8 @@ class MemberList : private QList<MemberDef>
int m_enumCnt;
int m_enumValCnt;
int m_typeCnt;
+ int m_seqCnt;
+ int m_dictCnt;
int m_protoCnt;
int m_defCnt;
int m_friendCnt;
diff --git a/src/msc.cpp b/src/msc.cpp
index 5b73d65..29f96ac 100644
--- a/src/msc.cpp
+++ b/src/msc.cpp
@@ -217,9 +217,16 @@ void writeMscImageMapFromFile(FTextStream &t,const QCString &inFile,
default:
t << "unknown";
}
- t << "\" alt=\""
- << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\"/>" << endl;
QCString imap = getMscImageMapFromFile(inFile,outDir,relPath,context);
- t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl;
+ if (!imap.isEmpty())
+ {
+ t << "\" alt=\""
+ << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\"/>" << endl;
+ t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl;
+ }
+ else
+ {
+ t << "\" alt=\"" << baseName << "\" border=\"0\"/>" << endl;
+ }
}
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index d3eb0df..bc8bb47 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -56,6 +56,9 @@ NamespaceDef::NamespaceDef(const char *df,int dl,int dc,
setFileName(name);
}
classSDict = new ClassSDict(17);
+ interfaceSDict = new ClassSDict(17);
+ structSDict = new ClassSDict(17);
+ exceptionSDict = new ClassSDict(17);
namespaceSDict = new NamespaceSDict(17);
m_innerCompounds = new SDict<Definition>(17);
usingDirList = 0;
@@ -87,6 +90,9 @@ NamespaceDef::NamespaceDef(const char *df,int dl,int dc,
NamespaceDef::~NamespaceDef()
{
delete classSDict;
+ delete interfaceSDict;
+ delete structSDict;
+ delete exceptionSDict;
delete namespaceSDict;
delete m_innerCompounds;
delete usingDirList;
@@ -164,12 +170,34 @@ void NamespaceDef::addInnerCompound(Definition *d)
void NamespaceDef::insertClass(ClassDef *cd)
{
- if (classSDict->find(cd->name())==0)
+ ClassSDict *d = classSDict;
+
+ if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ if (cd->compoundType()==ClassDef::Interface)
+ {
+ d = interfaceSDict;
+ }
+ else if (cd->compoundType()==ClassDef::Struct)
+ {
+ d = structSDict;
+ }
+ else if (cd->compoundType()==ClassDef::Exception)
+ {
+ d = exceptionSDict;
+ }
+ }
+
+ if (d->find(cd->name())==0)
{
if (Config_getBool(SORT_BRIEF_DOCS))
- classSDict->inSort(cd->name(),cd);
+ {
+ d->inSort(cd->name(),cd);
+ }
else
- classSDict->append(cd->name(),cd);
+ {
+ d->append(cd->name(),cd);
+ }
}
}
@@ -245,6 +273,14 @@ void NamespaceDef::insertMember(MemberDef *md)
addMemberToList(MemberListType_decTypedefMembers,md);
addMemberToList(MemberListType_docTypedefMembers,md);
break;
+ case MemberType_Sequence:
+ addMemberToList(MemberListType_decSequenceMembers,md);
+ addMemberToList(MemberListType_docSequenceMembers,md);
+ break;
+ case MemberType_Dictionary:
+ addMemberToList(MemberListType_decDictionaryMembers,md);
+ addMemberToList(MemberListType_docDictionaryMembers,md);
+ break;
case MemberType_Enumeration:
addMemberToList(MemberListType_decEnumMembers,md);
addMemberToList(MemberListType_docEnumMembers,md);
@@ -313,19 +349,27 @@ void NamespaceDef::writeTagFile(FTextStream &tagFile)
case LayoutDocEntry::NamespaceClasses:
{
if (classSDict)
- {
- SDict<ClassDef>::Iterator ci(*classSDict);
- ClassDef *cd;
- for (ci.toFirst();(cd=ci.current());++ci)
- {
- if (cd->isLinkableInProject())
- {
- tagFile << " <class kind=\"" << cd->compoundTypeString()
- << "\">" << convertToXML(cd->name()) << "</class>" << endl;
- }
- }
- }
+ writeClassesToTagFile(tagFile, classSDict);
}
+ break;
+ case LayoutDocEntry::NamespaceInterfaces:
+ {
+ if (interfaceSDict)
+ writeClassesToTagFile(tagFile, interfaceSDict);
+ }
+ break;
+ case LayoutDocEntry::NamespaceStructs:
+ {
+ if (structSDict)
+ writeClassesToTagFile(tagFile, structSDict);
+ }
+ break;
+ case LayoutDocEntry::NamespaceExceptions:
+ {
+ if (exceptionSDict)
+ writeClassesToTagFile(tagFile, exceptionSDict);
+ }
+ break;
case LayoutDocEntry::MemberDecl:
{
LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
@@ -436,6 +480,24 @@ void NamespaceDef::writeBriefDescription(OutputList &ol)
//ol.newParagraph();
//ol.popGeneratorState();
}
+
+ // Write a summary of the Slice definition including metadata.
+ if (getLanguage() == SrcLangExt_Slice)
+ {
+ ol.startParagraph();
+ ol.startTypewriter();
+ if (!metaData.isEmpty())
+ {
+ ol.docify(metaData);
+ ol.lineBreak();
+ }
+ ol.docify("module ");
+ ol.docify(stripScope(name()));
+ ol.docify(" { ... }");
+ ol.endTypewriter();
+ ol.endParagraph();
+ }
+
ol.writeSynopsis();
}
@@ -467,9 +529,9 @@ void NamespaceDef::endMemberDocumentation(OutputList &ol)
}
}
-void NamespaceDef::writeClassDeclarations(OutputList &ol,const QCString &title)
+void NamespaceDef::writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d)
{
- if (classSDict) classSDict->writeDeclaration(ol,0,title,TRUE);
+ if (d) d->writeDeclaration(ol,0,title,TRUE);
}
void NamespaceDef::writeInlineClasses(OutputList &ol)
@@ -525,12 +587,38 @@ void NamespaceDef::writeSummaryLinks(OutputList &ol)
SrcLangExt lang = getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if ((lde->kind()==LayoutDocEntry::NamespaceClasses && classSDict && classSDict->declVisible()) ||
- (lde->kind()==LayoutDocEntry::NamespaceNestedNamespaces && namespaceSDict && namespaceSDict->declVisible())
- )
+ if (lde->kind()==LayoutDocEntry::NamespaceClasses && classSDict && classSDict->declVisible())
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = "nested-classes";
+ ol.writeSummaryLink(0,label,ls->title(lang),first);
+ first=FALSE;
+ }
+ else if (lde->kind()==LayoutDocEntry::NamespaceInterfaces && interfaceSDict && interfaceSDict->declVisible())
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = "interfaces";
+ ol.writeSummaryLink(0,label,ls->title(lang),first);
+ first=FALSE;
+ }
+ else if (lde->kind()==LayoutDocEntry::NamespaceStructs && structSDict && structSDict->declVisible())
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = "structs";
+ ol.writeSummaryLink(0,label,ls->title(lang),first);
+ first=FALSE;
+ }
+ else if (lde->kind()==LayoutDocEntry::NamespaceExceptions && exceptionSDict && exceptionSDict->declVisible())
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = "exceptions";
+ ol.writeSummaryLink(0,label,ls->title(lang),first);
+ first=FALSE;
+ }
+ else if (lde->kind()==LayoutDocEntry::NamespaceNestedNamespaces && namespaceSDict && namespaceSDict->declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- QCString label = lde->kind()==LayoutDocEntry::NamespaceClasses ? "nested-classes" : "namespaces";
+ QCString label = "namespaces";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
@@ -566,6 +654,20 @@ void NamespaceDef::addNamespaceAttributes(OutputList &ol)
}
}
+void NamespaceDef::writeClassesToTagFile(FTextStream &tagFile,ClassSDict *d)
+{
+ SDict<ClassDef>::Iterator ci(*d);
+ ClassDef *cd;
+ for (ci.toFirst();(cd=ci.current());++ci)
+ {
+ if (cd->isLinkableInProject())
+ {
+ tagFile << " <class kind=\"" << cd->compoundTypeString()
+ << "\">" << convertToXML(cd->name()) << "</class>" << endl;
+ }
+ }
+}
+
void NamespaceDef::writeDocumentation(OutputList &ol)
{
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
@@ -618,7 +720,25 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::NamespaceClasses:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang));
+ writeClassDeclarations(ol,ls->title(lang),classSDict);
+ }
+ break;
+ case LayoutDocEntry::NamespaceInterfaces:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClassDeclarations(ol,ls->title(lang),interfaceSDict);
+ }
+ break;
+ case LayoutDocEntry::NamespaceStructs:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClassDeclarations(ol,ls->title(lang),structSDict);
+ }
+ break;
+ case LayoutDocEntry::NamespaceExceptions:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClassDeclarations(ol,ls->title(lang),exceptionSDict);
}
break;
case LayoutDocEntry::NamespaceNestedNamespaces:
@@ -677,6 +797,9 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::ClassUsedFiles:
case LayoutDocEntry::ClassInlineClasses:
case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileInterfaces:
+ case LayoutDocEntry::FileStructs:
+ case LayoutDocEntry::FileExceptions:
case LayoutDocEntry::FileNamespaces:
case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
@@ -779,7 +902,8 @@ int NamespaceDef::countMembers()
{
MemberList *allMemberList = getMemberList(MemberListType_allMembersList);
if (allMemberList) allMemberList->countDocMembers();
- return (allMemberList ? allMemberList->numDocMembers() : 0)+classSDict->count();
+ return (allMemberList ? allMemberList->numDocMembers() : 0) +
+ classSDict->count() + interfaceSDict->count() + structSDict->count() + exceptionSDict->count();
}
void NamespaceDef::addUsingDirective(NamespaceDef *nd)
@@ -1078,14 +1202,24 @@ void NamespaceDef::sortMemberLists()
{
classSDict->sort();
}
+ if (interfaceSDict)
+ {
+ interfaceSDict->sort();
+ }
+ if (structSDict)
+ {
+ structSDict->sort();
+ }
+ if (exceptionSDict)
+ {
+ exceptionSDict->sort();
+ }
if (namespaceSDict)
{
namespaceSDict->sort();
}
}
-
-
MemberList *NamespaceDef::getMemberList(MemberListType lt) const
{
QListIterator<MemberList> mli(m_memberLists);
@@ -1155,7 +1289,7 @@ QCString NamespaceDef::title() const
{
pageTitle = theTranslator->trPackage(displayName());
}
- else if (lang==SrcLangExt_Fortran)
+ else if (lang==SrcLangExt_Fortran || lang==SrcLangExt_Slice)
{
pageTitle = theTranslator->trModuleReference(displayName());
}
@@ -1209,3 +1343,7 @@ QCString NamespaceDef::compoundTypeString() const
return "";
}
+void NamespaceDef::setMetaData(const QCString &m)
+{
+ metaData = m;
+}
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 8b7d7cc..b46d074 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -97,12 +97,23 @@ class NamespaceDef : public Definition
/*! Returns the classes contained in this namespace */
ClassSDict *getClassSDict() const { return classSDict; }
+ /*! Returns the Slice interfaces contained in this namespace */
+ ClassSDict *getInterfaceSDict() const { return interfaceSDict; }
+
+ /*! Returns the Slice structs contained in this namespace */
+ ClassSDict *getStructSDict() const { return structSDict; }
+
+ /*! Returns the Slice exceptions contained in this namespace */
+ ClassSDict *getExceptionSDict() const { return exceptionSDict; }
+
/*! Returns the namespaces contained in this namespace */
NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
QCString title() const;
QCString compoundTypeString() const;
+ void setMetaData(const QCString &m);
+
bool visited;
private:
@@ -114,7 +125,7 @@ class NamespaceDef : public Definition
void writeBriefDescription(OutputList &ol);
void startMemberDeclarations(OutputList &ol);
void endMemberDeclarations(OutputList &ol);
- void writeClassDeclarations(OutputList &ol,const QCString &title);
+ void writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d);
void writeInlineClasses(OutputList &ol);
void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
bool isConstantGroup=false);
@@ -124,6 +135,7 @@ class NamespaceDef : public Definition
void endMemberDocumentation(OutputList &ol);
void writeSummaryLinks(OutputList &ol);
void addNamespaceAttributes(OutputList &ol);
+ void writeClassesToTagFile(FTextStream &,ClassSDict *d);
QCString fileName;
FileList files;
@@ -136,10 +148,14 @@ class NamespaceDef : public Definition
QList<MemberList> m_memberLists;
MemberGroupSDict *memberGroupSDict;
ClassSDict *classSDict;
+ ClassSDict *interfaceSDict;
+ ClassSDict *structSDict;
+ ClassSDict *exceptionSDict;
NamespaceSDict *namespaceSDict;
bool m_subGrouping;
enum { NAMESPACE, MODULE, CONSTANT_GROUP, LIBRARY } m_type;
bool m_isPublished;
+ QCString metaData;
};
/** A list of NamespaceDef objects. */
diff --git a/src/outputgen.h b/src/outputgen.h
index 9935bd9..a99cff3 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -322,7 +322,7 @@ class BaseOutputDocInterface : public CodeOutputInterface
class OutputGenerator : public BaseOutputDocInterface
{
public:
- enum OutputType { Html, Latex, Man, RTF, XML, DEF, Perl };
+ enum OutputType { Html, Latex, Man, RTF, XML, DEF, Perl , Docbook};
OutputGenerator();
virtual ~OutputGenerator();
diff --git a/src/pagedef.cpp b/src/pagedef.cpp
index d2c3f68..79a78d3 100644
--- a/src/pagedef.cpp
+++ b/src/pagedef.cpp
@@ -187,6 +187,7 @@ void PageDef::writeDocumentation(OutputList &ol)
ol.pushGeneratorState();
//2.{
ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Docbook);
ol.disable(OutputGenerator::RTF);
ol.disable(OutputGenerator::Man);
if (!title().isEmpty() && !name().isEmpty() && si!=0)
@@ -207,7 +208,7 @@ void PageDef::writeDocumentation(OutputList &ol)
ol.popGeneratorState();
//2.}
- if ((m_localToc.isHtmlEnabled() || m_localToc.isLatexEnabled()) && hasSections())
+ if ((m_localToc.isHtmlEnabled() || m_localToc.isLatexEnabled() || m_localToc.isDocbookEnabled()) && hasSections())
{
writeToc(ol, m_localToc);
}
@@ -269,6 +270,7 @@ void PageDef::writePageDocumentation(OutputList &ol)
ol.pushGeneratorState();
ol.disableAll();
ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::Docbook);
ol.enable(OutputGenerator::RTF);
PageSDict::Iterator pdi(*m_subPageDict);
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index f805383..fcc7ef5 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -43,6 +43,7 @@
#include "section.h"
#include "util.h"
#include "htmlentity.h"
+#include "emoji.h"
#define PERLOUTPUT_MAX_INDENTATION 40
@@ -299,6 +300,7 @@ public:
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
void visit(DocSymbol *);
+ void visit(DocEmoji *);
void visit(DocURL *);
void visit(DocLineBreak *);
void visit(DocHorRuler *);
@@ -428,7 +430,7 @@ private:
};
PerlModDocVisitor::PerlModDocVisitor(PerlModOutput &output)
- : DocVisitor(DocVisitor_Other), m_output(output), m_textmode(false)
+ : DocVisitor(DocVisitor_Other), m_output(output), m_textmode(false), m_textblockstart(FALSE)
{
m_output.openList("doc");
}
@@ -609,6 +611,19 @@ void PerlModDocVisitor::visit(DocSymbol *sy)
err("perl: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(sy->symbol(),TRUE));
}
}
+void PerlModDocVisitor::visit(DocEmoji *sy)
+{
+ enterText();
+ const char *name = EmojiEntityMapper::instance()->name(sy->index());
+ if (name)
+ {
+ m_output.add(name);
+ }
+ else
+ {
+ m_output.add(sy->name());
+ }
+}
void PerlModDocVisitor::visit(DocURL *u)
{
@@ -1570,21 +1585,22 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
bool isFunc=FALSE;
switch (md->memberType())
{
- case MemberType_Define: memType="define"; break;
- case MemberType_EnumValue: memType="enumvalue"; break;
- case MemberType_Property: memType="property"; break;
- case MemberType_Variable: memType="variable"; break;
- case MemberType_Typedef: memType="typedef"; break;
- case MemberType_Enumeration: memType="enum"; break;
- case MemberType_Function: memType="function"; isFunc=TRUE; break;
- case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
- //case MemberType_Prototype: memType="prototype"; isFunc=TRUE; break;
- case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
- case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
- case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
- case MemberType_Event: memType="event"; break;
- case MemberType_Interface: memType="interface"; break;
- case MemberType_Service: memType="service"; break;
+ case MemberType_Define: memType="define"; break;
+ case MemberType_EnumValue: memType="enumvalue"; break;
+ case MemberType_Property: memType="property"; break;
+ case MemberType_Variable: memType="variable"; break;
+ case MemberType_Typedef: memType="typedef"; break;
+ case MemberType_Enumeration: memType="enum"; break;
+ case MemberType_Function: memType="function"; isFunc=TRUE; break;
+ case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
+ case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
+ case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
+ case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
+ case MemberType_Event: memType="event"; break;
+ case MemberType_Interface: memType="interface"; break;
+ case MemberType_Service: memType="service"; break;
+ case MemberType_Sequence: memType="sequence"; break;
+ case MemberType_Dictionary: memType="dictionary"; break;
}
m_output.openHash()
@@ -1609,7 +1625,7 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
m_output.openList("parameters");
ArgumentList *declAl = md->declArgumentList();
ArgumentList *defAl = md->argumentList();
- if (declAl && declAl->count()>0)
+ if (declAl && defAl && declAl->count()>0)
{
ArgumentListIterator declAli(*declAl);
ArgumentListIterator defAli(*defAl);
diff --git a/src/portable.cpp b/src/portable.cpp
index 08691b2..3dccaed 100644
--- a/src/portable.cpp
+++ b/src/portable.cpp
@@ -211,8 +211,8 @@ void portable_setenv(const char *name,const char *value)
#if defined(_WIN32) && !defined(__CYGWIN__)
SetEnvironmentVariable(name,value);
#else
- register char **ep = 0;
- register size_t size;
+ char **ep = 0;
+ size_t size;
const size_t namelen=qstrlen(name);
const size_t vallen=qstrlen(value) + 1;
diff --git a/src/pre.l b/src/pre.l
index b6ebbf8..5eb0c5c 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -1405,7 +1405,7 @@ void addDefine()
MemberDef *md=new MemberDef(
g_yyFileName,g_yyLineNr-g_yyMLines,g_yyColNr,
"#define",g_defName,g_defArgsStr,0,
- Public,Normal,FALSE,Member,MemberType_Define,0,0);
+ Public,Normal,FALSE,Member,MemberType_Define,0,0,"");
if (!g_defArgsStr.isEmpty())
{
ArgumentList *argList = new ArgumentList;
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
index 8d9a2b9..8d375fc 100644
--- a/src/printdocvisitor.h
+++ b/src/printdocvisitor.h
@@ -22,6 +22,7 @@
#include <qglobal.h>
#include "docvisitor.h"
#include "htmlentity.h"
+#include "emoji.h"
#include "message.h"
/*! Concrete visitor implementation for pretty printing */
@@ -68,6 +69,19 @@ class PrintDocVisitor : public DocVisitor
printf("print: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
}
}
+ void visit(DocEmoji *s)
+ {
+ indent_leaf();
+ const char *res = EmojiEntityMapper::instance()->name(s->index());
+ if (res)
+ {
+ printf("%s",res);
+ }
+ else
+ {
+ printf("print: non supported emoji found: %s\n",qPrint(s->name()));
+ }
+ }
void visit(DocURL *u)
{
indent_leaf();
@@ -173,7 +187,10 @@ class PrintDocVisitor : public DocVisitor
case DocInclude::Include: printf("include"); break;
case DocInclude::IncWithLines: printf("incwithlines"); break;
case DocInclude::DontInclude: printf("dontinclude"); break;
- case DocInclude::HtmlInclude: printf("htmlinclude"); break;
+ case DocInclude::HtmlInclude:
+ printf("htmlinclude");
+ if (inc->isBlock()) printf(" block=\"yes\"");
+ break;
case DocInclude::LatexInclude: printf("latexinclude"); break;
case DocInclude::VerbInclude: printf("verbinclude"); break;
case DocInclude::Snippet: printf("snippet"); break;
@@ -496,7 +513,7 @@ class PrintDocVisitor : public DocVisitor
case DocImage::Rtf: printf("rtf"); break;
case DocImage::DocBook: printf("docbook"); break;
}
- printf("\" %s %s>\n",img->width().data(),img->height().data());
+ printf("\" %s %s inline=\"%s\">\n",img->width().data(),img->height().data(),img->isInlineImage() ? "yes" : "no");
}
void visitPost(DocImage *)
{
@@ -640,13 +657,13 @@ class PrintDocVisitor : public DocVisitor
void visitPre(DocXRefItem *x)
{
indent_pre();
- printf("<xrefitem file=\"%s\" anchor=\"%s\" title=\"%s\"/>\n",
+ printf("<xrefitem file=\"%s\" anchor=\"%s\" title=\"%s\">\n",
x->file().data(),x->anchor().data(),x->title().data());
}
void visitPost(DocXRefItem *)
{
indent_post();
- printf("<xrefitem/>\n");
+ printf("</xrefitem>\n");
}
void visitPre(DocInternalRef *r)
{
diff --git a/src/pycode.l b/src/pycode.l
index 1b176d6..dfa383f 100644
--- a/src/pycode.l
+++ b/src/pycode.l
@@ -1311,7 +1311,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
\\. { // espaced char
codify(yytext);
}
- {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // tripple double quotes
+ {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // triple double quotes
codify(yytext);
}
"'" { // end of the string
@@ -1334,7 +1334,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
\\. { // espaced char
codify(yytext);
}
- {STRINGPREFIX}?{TRISINGLEQUOTE} { // tripple single quotes
+ {STRINGPREFIX}?{TRISINGLEQUOTE} { // triple single quotes
codify(yytext);
}
"\"" { // end of the string
diff --git a/src/pyscanner.l b/src/pyscanner.l
index 4718e3b..1596b9d 100644
--- a/src/pyscanner.l
+++ b/src/pyscanner.l
@@ -118,6 +118,8 @@ static bool g_packageCommentAllowed;
static bool g_start_init = FALSE;
static int g_search_count = 0;
+static QCString g_argType = "";
+static bool g_funcParamsEnd;
//-----------------------------------------------------------------------------
@@ -513,6 +515,8 @@ STARTDOCSYMS "##"
%x FunctionDec
%x FunctionParams
%x FunctionBody
+%x FunctionAnnotation
+%x FunctionTypeAnnotation
%x FunctionParamDefVal
/* Class states */
@@ -932,7 +936,6 @@ STARTDOCSYMS "##"
}
<FunctionDec>{
-
{IDENTIFIER} {
//found function name
if (current->type.isEmpty())
@@ -943,47 +946,59 @@ STARTDOCSYMS "##"
current->name = current->name.stripWhiteSpace();
newFunction();
}
- {B}":" { // function without arguments
+ {B}":"{B} { // function without arguments
g_specialBlock = TRUE; // expecting a docstring
bodyEntry = current;
- current->bodyLine = yyLineNr;
- BEGIN( FunctionBody );
+ BEGIN(FunctionBody);
}
+ "->" {
+ g_defVal.resize(0);
+ g_braceCount = 0;
+ BEGIN(FunctionTypeAnnotation);
+ }
{B}"(" {
- BEGIN( FunctionParams );
+ g_funcParamsEnd = FALSE;
+ current->bodyLine = yyLineNr;
+ BEGIN(FunctionParams);
}
+ ")" { // end of parameter list
+ current->args = argListToString(current->argList);
+ g_funcParamsEnd = TRUE;
+ }
}
<FunctionParams>{
({BB}|",") {
}
+ [\*]+ {
+ g_argType = yytext;
+ }
{IDENTIFIER} { // Name of parameter
lineCount();
Argument *a = new Argument;
current->argList->append(a);
current->argList->getLast()->name = QCString(yytext).stripWhiteSpace();
- current->argList->getLast()->type = "";
+ current->argList->getLast()->type = g_argType;
+ g_argType = "";
}
"=" { // default value
// TODO: this rule is too simple, need to be able to
// match things like =")" as well!
g_defVal.resize(0);
- g_braceCount=0;
+ g_braceCount = 0;
BEGIN(FunctionParamDefVal);
}
-
- ")" { // end of parameter list
- current->args = argListToString(current->argList);
+ ")" {
+ unput(*yytext);
+ BEGIN(FunctionDec);
}
-
":"{B} {
- g_specialBlock = TRUE; // expecting a docstring
- bodyEntry = current;
- current->bodyLine = yyLineNr;
- BEGIN( FunctionBody );
- }
+ g_defVal.resize(0);
+ g_braceCount = 0;
+ BEGIN(FunctionAnnotation);
+ }
{POUNDCOMMENT} { // a comment
}
{PARAMNONEMPTY} { // Default rule inside arguments.
@@ -991,31 +1006,131 @@ STARTDOCSYMS "##"
}
+<FunctionTypeAnnotation>{
+ "{" |
+ "[" |
+ "(" {
+ ++g_braceCount;
+ g_defVal+=*yytext;
+ }
+ "}" |
+ "]" |
+ ")" {
+ --g_braceCount;
+ g_defVal+=*yytext;
+ }
+ ":" {
+ if (g_braceCount == 0)
+ {
+ current->type = g_defVal.data();
+ unput(*yytext);
+ BEGIN(FunctionDec);
+ }
+ else
+ g_defVal+=*yytext;
+ }
+ "'" {
+ g_defVal+=*yytext;
+ g_copyString=&g_defVal;
+ g_stringContext=FunctionTypeAnnotation;
+ BEGIN(SingleQuoteString);
+ }
+ "\"" {
+ g_defVal+=*yytext;
+ g_copyString=&g_defVal;
+ g_stringContext=FunctionTypeAnnotation;
+ BEGIN(DoubleQuoteString);
+ }
+ \n {
+ g_defVal+=*yytext;
+ incLineNr();
+ }
+ . {
+ g_defVal+=*yytext;
+ }
+}
+
+<FunctionAnnotation>{
+ "{" |
+ "[" |
+ "(" {
+ ++g_braceCount;
+ g_defVal+=*yytext;
+ }
+ "}" |
+ "]" {
+ --g_braceCount;
+ g_defVal+=*yytext;
+ }
+ ")" |
+ "=" |
+ "," {
+ if (g_braceCount == 0)
+ {
+ if (current->argList->getLast())
+ current->argList->getLast()->type += g_defVal.data();
+ if (*yytext != ',')
+ unput(*yytext);
+ BEGIN(FunctionParams);
+ }
+ else
+ {
+ if (*yytext == ')')
+ --g_braceCount;
+ g_defVal += *yytext;
+ }
+ }
+ "'" {
+ g_defVal+=*yytext;
+ g_copyString=&g_defVal;
+ g_stringContext=FunctionAnnotation;
+ BEGIN(SingleQuoteString);
+ }
+ "\"" {
+ g_defVal+=*yytext;
+ g_copyString=&g_defVal;
+ g_stringContext=FunctionAnnotation;
+ BEGIN(DoubleQuoteString);
+ }
+ \n {
+ g_defVal+=*yytext;
+ incLineNr();
+ }
+ . {
+ g_defVal+=*yytext;
+ }
+}
+
<FunctionParamDefVal>{
+ "{" |
"[" |
"(" { // internal opening brace, assumption is that we have correct code so braces do match
- g_braceCount++;
+ ++g_braceCount;
g_defVal+=*yytext;
}
- "," |
- "]" |
- ")" {
- if (g_braceCount==0) // end of default argument
+ "}" |
+ "]" {
+ --g_braceCount;
+ g_defVal+=*yytext;
+ }
+ ")" |
+ "," {
+ if (g_braceCount == 0)
{
if (current->argList->getLast())
- {
current->argList->getLast()->defval=QCString(g_defVal.data()).stripWhiteSpace();
- }
- if (*yytext != ',')
- current->args = argListToString(current->argList);
+ if (*yytext == ')')
+ unput(*yytext);
BEGIN(FunctionParams);
}
- else // continue
- {
- if (*yytext != ',')g_braceCount--;
- g_defVal+=*yytext;
- }
+ else
+ {
+ if (*yytext == ')')
+ --g_braceCount;
+ g_defVal += *yytext;
+ }
}
+
"'" {
g_defVal+=*yytext;
g_copyString=&g_defVal;
@@ -1396,7 +1511,6 @@ STARTDOCSYMS "##"
BEGIN(Search);
}
<<EOF>> { yyterminate();
- newEntry();
}
}
@@ -1425,7 +1539,7 @@ STARTDOCSYMS "##"
actualDoc.prepend("\\verbatim ");
actualDoc.append("\\endverbatim ");
}
- actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr ");
+ actualDoc.prepend("\\namespace "+g_moduleScope+" ");
handleCommentBlock(actualDoc, FALSE);
}
if ((docBlockContext==ClassBody /*&& !g_hideClassDocs*/) ||
@@ -1508,7 +1622,7 @@ STARTDOCSYMS "##"
\\. { // espaced char
addToString(yytext);
}
- "\"\"\"" { // tripple double quotes
+ "\"\"\"" { // triple double quotes
addToString(yytext);
}
"'" { // end of the string
@@ -1531,7 +1645,7 @@ STARTDOCSYMS "##"
\\. { // espaced char
addToString(yytext);
}
- "'''" { // tripple single quotes
+ "'''" { // triple single quotes
addToString(yytext);
}
"\"" { // end of the string
diff --git a/src/reflist.cpp b/src/reflist.cpp
index 1da603e..6f2a763 100644
--- a/src/reflist.cpp
+++ b/src/reflist.cpp
@@ -131,7 +131,15 @@ void RefList::insertIntoList(const char *key,RefItem *item)
{
if (ri!=item)
{
- ri->extraItems.append(item);
+ // We also have to check if the item is not already in the "extra" list
+ QListIterator<RefItem> li(ri->extraItems);
+ RefItem *extraItem;
+ bool doubleItem = false;
+ for (li.toFirst();(extraItem=li.current());++li)
+ {
+ if (item == extraItem) doubleItem = true;
+ }
+ if (!doubleItem) ri->extraItems.append(item);
}
}
}
@@ -148,8 +156,6 @@ void RefList::generatePage()
for (it.toFirst();(item=it.current());++it)
{
doc += " <dt>";
- doc += "\\anchor ";
- doc += item->listAnchor;
doc += "\n";
if (item->scope)
{
@@ -163,23 +169,38 @@ void RefList::generatePage()
doc += item->prefix;
doc += " \\_internalref ";
doc += item->name;
- doc += " \"";
// escape \'s in title, see issue #5901
- doc += substitute(item->title,"\\","\\\\");
- doc += "\" ";
+ QCString escapedTitle = substitute(item->title,"\\","\\\\");
+ if (item->scope &&
+ (item->scope->definitionType()==Definition::TypeClass ||
+ item->scope->definitionType()==Definition::TypeNamespace ||
+ item->scope->definitionType()==Definition::TypeMember ||
+ item->scope->definitionType()==Definition::TypePackage)
+ )
+ {
+ // prevent Obj-C names in e.g. todo list are seen as emoji
+ escapedTitle = substitute(escapedTitle,":","&Colon;");
+ }
+ doc += " \""+escapedTitle+"\" ";
// write declaration in case a function with arguments
if (!item->args.isEmpty())
{
// escape @'s in argument list, needed for Java annotations (see issue #6208)
- doc += substitute(item->args,"@","@@");
+ // escape \'s in argument list (see issue #6533)
+ doc += substitute(substitute(item->args,"@","@@"),"\\","\\\\");
}
- doc += "</dt><dd> ";
+ doc += "</dt><dd> \\anchor ";
+ doc += item->listAnchor;
+ doc += " ";
doc += item->text;
QListIterator<RefItem> li(item->extraItems);
RefItem *extraItem;
for (li.toFirst();(extraItem=li.current());++li)
{
- doc += "<p>" + extraItem->text;
+ doc += "<p> \\anchor ";
+ doc += extraItem->listAnchor;
+ doc += " ";
+ doc += extraItem->text;
}
doc += "</dd>";
}
diff --git a/src/res2cc_cmd.py b/src/res2cc_cmd.py
index 7e0322d..86d999d 100755
--- a/src/res2cc_cmd.py
+++ b/src/res2cc_cmd.py
@@ -98,10 +98,11 @@ def main():
directory = sys.argv[1]
files = []
for dirName, subdirList, fileList in walk(directory):
- for fname in sorted(fileList):
+ 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:
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index b786ec5..b79af05 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -34,6 +34,7 @@
#include "filedef.h"
#include "config.h"
#include "htmlentity.h"
+#include "emoji.h"
#include "plantuml.h"
//#define DBG_RTF(x) m_t << x
@@ -136,6 +137,48 @@ void RTFDocVisitor::visit(DocSymbol *s)
m_lastIsPara=FALSE;
}
+void RTFDocVisitor::visit(DocEmoji *s)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocEmoji)}\n");
+ const char *res = EmojiEntityMapper::instance()->unicode(s->index());
+ if (res)
+ {
+ const char *p = res;
+ int val = 0;
+ int val1 = 0;
+ while (*p)
+ {
+ switch(*p)
+ {
+ case '&': case '#': case 'x':
+ break;
+ case ';':
+ val1 = val;
+ val = 0xd800 + ( ( val1 - 0x10000 ) & 0xffc00 ) / 0x400 - 0x10000;
+ m_t << "\\u" << val << "?";
+ val = 0xdC00 + ( ( val1 - 0x10000 ) & 0x3ff ) - 0x10000 ;
+ m_t << "\\u" << val << "?";
+ val = 0;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ val = val * 16 + *p - '0';
+ break;
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ val = val * 16 + *p - 'a' + 10;
+ break;
+ }
+ p++;
+ }
+ }
+ else
+ {
+ m_t << s->name();
+ }
+ m_lastIsPara=FALSE;
+}
+
void RTFDocVisitor::visit(DocURL *u)
{
if (m_hide) return;
@@ -604,9 +647,10 @@ void RTFDocVisitor::visitPost(DocAutoList *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocAutoList)}\n");
- m_t << "\\par";
+ if (!m_lastIsPara) m_t << "\\par";
m_t << "}" << endl;
m_lastIsPara=TRUE;
+ if (!m_indentLevel) m_t << "\\par";
}
void RTFDocVisitor::visitPre(DocAutoListItem *)
@@ -1072,7 +1116,7 @@ void RTFDocVisitor::visitPre(DocHtmlHeader *header)
m_t << "{" // start section
<< rtf_Style_Reset;
QCString heading;
- int level = QMIN(header->level()+2,4);
+ int level = QMIN(header->level(),5);
heading.sprintf("Heading%d",level);
// set style
m_t << rtf_Style[heading]->reference;
@@ -1094,27 +1138,37 @@ void RTFDocVisitor::visitPost(DocHtmlHeader *)
void RTFDocVisitor::visitPre(DocImage *img)
{
DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocImage)}\n");
- includePicturePreRTF(img->name(), img->type()==DocImage::Rtf, img->hasCaption());
+ includePicturePreRTF(img->name(), img->type()==DocImage::Rtf, img->hasCaption(), img->isInlineImage());
}
-
-void RTFDocVisitor::includePicturePreRTF(const QCString name, const bool isTypeRTF, const bool hasCaption)
+void RTFDocVisitor::includePicturePreRTF(const QCString name, bool isTypeRTF, bool hasCaption, bool inlineImage)
{
if (isTypeRTF)
{
- m_t << "\\par" << endl;
- m_t << "{" << endl;
- m_t << rtf_Style_Reset << endl;
- if (hasCaption || m_lastIsPara) m_t << "\\par" << endl;
- m_t << "\\pard \\qc { \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ if (!inlineImage)
+ {
+ m_t << "\\par" << endl;
+ m_t << "{" << endl;
+ m_t << rtf_Style_Reset << endl;
+ if (hasCaption || m_lastIsPara) m_t << "\\par" << endl;
+ m_t << "\\pard \\qc ";
+ }
+ m_t << "{ \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
m_t << name;
m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}" << endl;
- m_t << "\\par" << endl;
- if (hasCaption)
+ if (!inlineImage)
+ {
+ m_t << "\\par" << endl;
+ if (hasCaption)
+ {
+ m_t << "\\pard \\qc \\b";
+ m_t << "{Image \\field\\flddirty{\\*\\fldinst { SEQ Image \\\\*Arabic }}{\\fldrslt {\\noproof 1}} ";
+ }
+ m_lastIsPara=TRUE;
+ }
+ else
{
- m_t << "\\pard \\qc \\b";
- m_t << "{Image \\field\\flddirty{\\*\\fldinst { SEQ Image \\\\*Arabic }}{\\fldrslt {\\noproof 1}} ";
+ if (hasCaption) m_t << "{\\comment "; // to prevent caption to be shown
}
- m_lastIsPara=TRUE;
}
else // other format -> skip
{
@@ -1126,22 +1180,29 @@ void RTFDocVisitor::includePicturePreRTF(const QCString name, const bool isTypeR
void RTFDocVisitor::visitPost(DocImage *img)
{
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocImage)}\n");
- includePicturePostRTF(img->type()==DocImage::Rtf, img->hasCaption());
+ includePicturePostRTF(img->type()==DocImage::Rtf, img->hasCaption(), img->isInlineImage());
}
-void RTFDocVisitor::includePicturePostRTF(const bool isTypeRTF, const bool hasCaption)
+void RTFDocVisitor::includePicturePostRTF(bool isTypeRTF, bool hasCaption, bool inlineImage)
{
if (isTypeRTF)
{
if (m_hide) return;
- if (hasCaption)
+ if (inlineImage)
{
- m_t << "}" <<endl;
- m_t << "\\par}" <<endl;
+ if (hasCaption) m_t << " }";
}
else
{
- m_t << "}" <<endl;
+ if (hasCaption)
+ {
+ m_t << "}" <<endl;
+ m_t << "\\par}" <<endl;
+ }
+ else
+ {
+ m_t << "}" <<endl;
+ }
}
}
else
@@ -1294,10 +1355,7 @@ void RTFDocVisitor::visitPre(DocParamSect *s)
case DocParamSect::Exception:
m_t << theTranslator->trExceptions(); break;
case DocParamSect::TemplateParam:
- /* TODO: add this
- m_t << theTranslator->trTemplateParam(); break;
- */
- m_t << "Template Parameters"; break;
+ m_t << theTranslator->trTemplateParameters(); break;
default:
ASSERT(0);
}
@@ -1757,7 +1815,7 @@ void RTFDocVisitor::writeDotFile(DocDotFile *df)
{
writeDotFile(df->file(), df->hasCaption());
}
-void RTFDocVisitor::writeDotFile(const QCString &filename, const bool hasCaption)
+void RTFDocVisitor::writeDotFile(const QCString &filename, bool hasCaption)
{
QCString baseName=filename;
int i;
@@ -1775,7 +1833,7 @@ void RTFDocVisitor::writeMscFile(DocMscFile *df)
{
writeMscFile(df->file(), df->hasCaption());
}
-void RTFDocVisitor::writeMscFile(const QCString &fileName, const bool hasCaption)
+void RTFDocVisitor::writeMscFile(const QCString &fileName, bool hasCaption)
{
QCString baseName=fileName;
int i;
@@ -1801,7 +1859,7 @@ void RTFDocVisitor::writeDiaFile(DocDiaFile *df)
includePicturePreRTF(baseName + ".png", true, df->hasCaption());
}
-void RTFDocVisitor::writePlantUMLFile(const QCString &fileName, const bool hasCaption)
+void RTFDocVisitor::writePlantUMLFile(const QCString &fileName, bool hasCaption)
{
QCString baseName=fileName;
int i;
diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h
index 1e927e7..b7cc3ea 100644
--- a/src/rtfdocvisitor.h
+++ b/src/rtfdocvisitor.h
@@ -40,6 +40,7 @@ class RTFDocVisitor : public DocVisitor
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
void visit(DocSymbol *);
+ void visit(DocEmoji *);
void visit(DocURL *);
void visit(DocLineBreak *);
void visit(DocHorRuler *);
@@ -152,14 +153,14 @@ class RTFDocVisitor : public DocVisitor
void pushEnabled();
void popEnabled();
- void includePicturePreRTF(const QCString name, const bool isTypeRTF, const bool hasCaption);
- void includePicturePostRTF(const bool isTypeRTF, const bool hasCaption);
- void writeDotFile(const QCString &fileName, const bool hasCaption);
+ void includePicturePreRTF(const QCString name, bool isTypeRTF, bool hasCaption, bool inlineImage = FALSE);
+ void includePicturePostRTF(bool isTypeRTF, bool hasCaption, bool inlineImage = FALSE);
+ void writeDotFile(const QCString &fileName, bool hasCaption);
void writeDotFile(DocDotFile *);
- void writeMscFile(const QCString &fileName, const bool hasCaption);
+ void writeMscFile(const QCString &fileName, bool hasCaption);
void writeMscFile(DocMscFile *);
void writeDiaFile(DocDiaFile *);
- void writePlantUMLFile(const QCString &fileName, const bool hasCaption);
+ void writePlantUMLFile(const QCString &fileName, bool hasCaption);
//--------------------------------------
// state variables
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index e2de5ab..2e67c26 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -287,21 +287,22 @@ void RTFGenerator::beginRTFDocument()
t << "\\margl1800\\margr1800\\margt1440\\margb1440\\gutter0\\ltrsect}\n";
// sort styles ascending by \s-number via an intermediate QArray
- QArray<const StyleData*> array(128);
- array.fill(0);
QDictIterator<StyleData> iter(rtf_Style);
const StyleData* style;
+ unsigned maxIndex = 0;
+ for(; (style = iter.current()); ++iter)
+ {
+ unsigned index = style->index;
+ if (maxIndex < index) maxIndex = index;
+ }
+ QArray<const StyleData*> array(maxIndex + 1);
+ array.fill(0);
+ ASSERT(maxIndex < array.size());
+
+ iter.toFirst();
for(; (style = iter.current()); ++iter)
{
unsigned index = style->index;
- unsigned size = array.size();
- if (index >= size)
- {
- // +1 to add at least one element, then align up to multiple of 8
- array.resize((index + 1 + 7) & ~7);
- array.fill(0, size);
- ASSERT(index < array.size());
- }
if (array.at(index) != 0)
{
QCString key(iter.currentKey());
@@ -2180,11 +2181,12 @@ void RTFGenerator::newParagraph()
m_omitParagraph = FALSE;
}
-void RTFGenerator::startParagraph(const char *)
+void RTFGenerator::startParagraph(const char *txt)
{
DBG_RTF(t << "{\\comment startParagraph}" << endl)
newParagraph();
t << "{" << endl;
+ if (QCString(txt) == "reference") t << "\\ql" << endl;
}
void RTFGenerator::endParagraph()
@@ -2632,7 +2634,7 @@ void testRTFOutput(const char *name)
err:
err("RTF integrity test failed at line %d of %s due to a bracket mismatch.\n"
" Please try to create a small code example that produces this error \n"
- " and send that to dimitri@stack.nl.\n",line,name);
+ " and send that to doxygen@gmail.com.\n",line,name);
}
/**
@@ -2795,7 +2797,7 @@ void RTFGenerator::exceptionEntry(const char* prefix,bool closeBracket)
{
DBG_RTF(t << "{\\comment (exceptionEntry)}" << endl)
if (prefix)
- t << " " << prefix;
+ t << " " << prefix << "(";
else if (closeBracket)
t << ")";
t << " ";
diff --git a/src/rtfstyle.cpp b/src/rtfstyle.cpp
index 1ea8868..47a8166 100644
--- a/src/rtfstyle.cpp
+++ b/src/rtfstyle.cpp
@@ -40,6 +40,43 @@ QCString rtf_keywords;
char rtf_Style_Reset[] = "\\pard\\plain ";
+#define RTF_LatexToc(lvl,nest,nxt,pos,twps) \
+ \
+ { "LatexTOC"#lvl, \
+ "\\s"#nest"\\li"#pos"\\sa"#twps"\\sb"#twps"\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",\
+ "\\sbasedon0 \\snext"#nxt" LatexTOC "#lvl \
+ }
+
+#define RTF_ListBullet(lvl,nest,nxt,pos,lvl2) \
+ { "ListBullet"#lvl, \
+ "\\s"#nest"\\fi-360\\li"#pos"\\widctlpar\\jclisttab\\tx"#pos"{\\*\\pn \\pnlvlbody\\ilvl0\\ls"#lvl2"\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid ", \
+ "\\sbasedon0 \\snext"#nxt" \\sautoupd List Bullet "#lvl \
+ }
+
+#define RTF_ListEnum(lvl,nest,nxt,pos) \
+ { "ListEnum"#lvl, \
+ "\\s"#nest"\\fi-360\\li"#pos"\\widctlpar\\fs20\\cgrid ", \
+ "\\sbasedon0 \\snext"#nxt" \\sautoupd List Enum "#lvl \
+ }
+
+#define RTF_CodeExample(lvl,nest,nxt,pos) \
+ { "CodeExample"#lvl, \
+ "\\s"#nest"\\li"#pos"\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ", \
+ "\\sbasedon0 \\snext"#nxt" Code Example "#lvl \
+ }
+
+#define RTF_ListContinue(lvl,nest,nxt,pos) \
+ { "ListContinue"#lvl, \
+ "\\s"#nest"\\li"#pos"\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ", \
+ "\\sbasedon0 \\snext"#nxt" List Continue "#lvl \
+ }
+
+#define RTF_DescContinue(lvl,nest,nxt,pos) \
+ { "DescContinue"#lvl, \
+ "\\s"#nest"\\li"#pos"\\widctlpar\\ql\\adjustright \\fs20\\cgrid ", \
+ "\\sbasedon0 \\snext"#nxt" DescContinue "#lvl \
+ }
+
Rtf_Style_Default rtf_Style_Default[] =
{
{ "Heading1",
@@ -90,246 +127,97 @@ Rtf_Style_Default rtf_Style_Default[] =
"\\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
"\\sbasedon0 \\snext30 GroupHeader"
},
- { "CodeExample0",
- "\\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext41 Code Example 0"
- },
- { "CodeExample1",
- "\\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext42 Code Example 1"
- },
- { "CodeExample2",
- "\\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext43 Code Example 2"
- },
- { "CodeExample3",
- "\\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext44 Code Example 3"
- },
- { "CodeExample4",
- "\\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext45 Code Example 4"
- },
- { "CodeExample5",
- "\\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext46 Code Example 5"
- },
- { "CodeExample6",
- "\\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext47 Code Example 6"
- },
- { "CodeExample7",
- "\\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext48 Code Example 7"
- },
- { "CodeExample8",
- "\\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext49 Code Example 8"
- },
- { "CodeExample9",
- "\\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext49 Code Example 9"
- },
- { "ListContinue0",
- "\\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext51 List Continue 0"
- },
- { "ListContinue1",
- "\\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext52 List Continue 1"
- },
- { "ListContinue2",
- "\\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext53 List Continue 2"
- },
- { "ListContinue3",
- "\\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext54 List Continue 3"
- },
- { "ListContinue4",
- "\\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext55 List Continue 4"
- },
- { "ListContinue5",
- "\\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext56 List Continue 5"
- },
- { "ListContinue6",
- "\\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext57 List Continue 6"
- },
- { "ListContinue7",
- "\\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext58 List Continue 7"
- },
- { "ListContinue8",
- "\\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext59 List Continue 8"
- },
- { "ListContinue9",
- "\\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext59 List Continue 9"
- },
- { "DescContinue0",
- "\\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext61 DescContinue 0"
- },
- { "DescContinue1",
- "\\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext62 DescContinue 1"
- },
- { "DescContinue2",
- "\\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext63 DescContinue 2"
- },
- { "DescContinue3",
- "\\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext64 DescContinue 3"
- },
- { "DescContinue4",
- "\\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext65 DescContinue 4"
- },
- { "DescContinue5",
- "\\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext66 DescContinue 5"
- },
- { "DescContinue6",
- "\\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext67 DescContinue 6"
- },
- { "DescContinue7",
- "\\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext68 DescContinue 7"
- },
- { "DescContinue8",
- "\\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext69 DescContinue 8"
- },
- { "DescContinue9",
- "\\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext69 DescContinue 9"
- },
- { "LatexTOC0",
- "\\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext81 LatexTOC 0"
- },
- { "LatexTOC1",
- "\\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext82 LatexTOC 1"
- },
- { "LatexTOC2",
- "\\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext83 LatexTOC 2"
- },
- { "LatexTOC3",
- "\\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext84 LatexTOC 3"
- },
- { "LatexTOC4",
- "\\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext85 LatexTOC 4"
- },
- { "LatexTOC5",
- "\\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext86 LatexTOC 5"
- },
- { "LatexTOC6",
- "\\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext87 LatexTOC 6"
- },
- { "LatexTOC7",
- "\\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext88 LatexTOC 7"
- },
- { "LatexTOC8",
- "\\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 LatexTOC 8"
- },
- { "LatexTOC9",
- "\\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 LatexTOC 9"
- },
- { "ListBullet0",
- "\\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext81 \\sautoupd List Bullet 0"
- },
- { "ListBullet1",
- "\\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext82 \\sautoupd List Bullet 1"
- },
- { "ListBullet2",
- "\\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext83 \\sautoupd List Bullet 2"
- },
- { "ListBullet3",
- "\\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext84 \\sautoupd List Bullet 3"
- },
- { "ListBullet4",
- "\\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext85 \\sautoupd List Bullet 4"
- },
- { "ListBullet5",
- "\\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext86 \\sautoupd List Bullet 5"
- },
- { "ListBullet6",
- "\\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext87 \\sautoupd List Bullet 6"
- },
- { "ListBullet7",
- "\\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext88 \\sautoupd List Bullet 7"
- },
- { "ListBullet8",
- "\\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 \\sautoupd List Bullet 8"
- },
- { "ListBullet9",
- "\\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 \\sautoupd List Bullet 9"
- },
- { "ListEnum0",
- "\\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext91 \\sautoupd List Enum 0"
- },
- { "ListEnum1",
- "\\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext92 \\sautoupd List Enum 1"
- },
- { "ListEnum2",
- "\\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext93 \\sautoupd List Enum 2"
- },
- { "ListEnum3",
- "\\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext94 \\sautoupd List Enum 3"
- },
- { "ListEnum4",
- "\\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext95 \\sautoupd List Enum 4"
- },
- { "ListEnum5",
- "\\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
- },
- { "ListEnum6",
- "\\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
- },
- { "ListEnum7",
- "\\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext98 \\sautoupd List Enum 7"
- },
- { "ListEnum8",
- "\\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext99 \\sautoupd List Enum 8"
- },
- { "ListEnum9",
- "\\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext99 \\sautoupd List Enum 9"
- },
+
+ RTF_CodeExample( 0, 40, 41, 0),
+ RTF_CodeExample( 1, 41, 42, 360),
+ RTF_CodeExample( 2, 42, 43, 720),
+ RTF_CodeExample( 3, 43, 44,1080),
+ RTF_CodeExample( 4, 44, 45,1440),
+ RTF_CodeExample( 5, 45, 46,1800),
+ RTF_CodeExample( 6, 46, 47,2160),
+ RTF_CodeExample( 7, 47, 48,2520),
+ RTF_CodeExample( 8, 48, 49,2880),
+ RTF_CodeExample( 9, 49, 50,3240),
+ RTF_CodeExample(10, 50, 51,3600),
+ RTF_CodeExample(11, 51, 52,3960),
+ RTF_CodeExample(12, 52, 53,4320),
+ RTF_CodeExample(13, 53, 53,4680),
+
+ RTF_ListContinue( 0, 60, 61, 0),
+ RTF_ListContinue( 1, 61, 62, 360),
+ RTF_ListContinue( 2, 62, 63, 720),
+ RTF_ListContinue( 3, 63, 64,1080),
+ RTF_ListContinue( 4, 64, 65,1440),
+ RTF_ListContinue( 5, 65, 66,1800),
+ RTF_ListContinue( 6, 66, 67,2160),
+ RTF_ListContinue( 7, 67, 68,2520),
+ RTF_ListContinue( 8, 68, 69,2880),
+ RTF_ListContinue( 9, 69, 70,3240),
+ RTF_ListContinue(10, 70, 71,3600),
+ RTF_ListContinue(11, 71, 72,3960),
+ RTF_ListContinue(12, 72, 73,4320),
+ RTF_ListContinue(13, 73, 73,4680),
+
+ RTF_DescContinue( 0, 80, 81, 0),
+ RTF_DescContinue( 1, 81, 82, 360),
+ RTF_DescContinue( 2, 82, 83, 720),
+ RTF_DescContinue( 3, 83, 84,1080),
+ RTF_DescContinue( 4, 84, 85,1440),
+ RTF_DescContinue( 5, 85, 86,1800),
+ RTF_DescContinue( 6, 86, 87,2160),
+ RTF_DescContinue( 7, 87, 88,2520),
+ RTF_DescContinue( 8, 88, 89,2880),
+ RTF_DescContinue( 9, 89, 90,3240),
+ RTF_DescContinue(10, 90, 91,3600),
+ RTF_DescContinue(11, 91, 92,3960),
+ RTF_DescContinue(12, 92, 93,4320),
+ RTF_DescContinue(13, 93, 93,4680),
+
+ RTF_LatexToc( 0,100,101, 0,30),
+ RTF_LatexToc( 1,101,102, 360,27),
+ RTF_LatexToc( 2,102,103, 720,24),
+ RTF_LatexToc( 3,103,104,1080,21),
+ RTF_LatexToc( 4,104,105,1440,18),
+ RTF_LatexToc( 5,105,106,1800,15),
+ RTF_LatexToc( 6,106,107,2160,12),
+ RTF_LatexToc( 7,107,108,2520, 9),
+ RTF_LatexToc( 8,108,109,2880, 6),
+ RTF_LatexToc( 9,109,110,3240, 3),
+ RTF_LatexToc(10,110,111,3600, 3),
+ RTF_LatexToc(11,111,112,3960, 3),
+ RTF_LatexToc(12,112,113,4320, 3),
+ RTF_LatexToc(13,113,113,4680, 3),
+
+ RTF_ListBullet( 0,120,121, 360, 1),
+ RTF_ListBullet( 1,121,122, 720, 2),
+ RTF_ListBullet( 2,122,123,1080, 3),
+ RTF_ListBullet( 3,123,124,1440, 4),
+ RTF_ListBullet( 4,124,125,1800, 5),
+ RTF_ListBullet( 5,125,126,2160, 6),
+ RTF_ListBullet( 6,126,127,2520, 7),
+ RTF_ListBullet( 7,127,128,2880, 8),
+ RTF_ListBullet( 8,128,129,3240, 9),
+ RTF_ListBullet( 9,129,130,3600,10),
+ RTF_ListBullet(10,130,131,3960,11),
+ RTF_ListBullet(11,131,132,4320,12),
+ RTF_ListBullet(12,132,133,4680,13),
+ RTF_ListBullet(13,133,133,5040,14),
+
+ RTF_ListEnum( 0,140,141, 360),
+ RTF_ListEnum( 1,141,142, 720),
+ RTF_ListEnum( 2,142,143,1080),
+ RTF_ListEnum( 3,143,144,1440),
+ RTF_ListEnum( 4,144,145,1800),
+ RTF_ListEnum( 5,145,146,2160),
+ RTF_ListEnum( 6,146,147,2520),
+ RTF_ListEnum( 7,147,148,2880),
+ RTF_ListEnum( 8,148,149,3240),
+ RTF_ListEnum( 9,149,150,3600),
+ RTF_ListEnum(10,150,151,3960),
+ RTF_ListEnum(11,151,152,4320),
+ RTF_ListEnum(12,152,153,4680),
+ RTF_ListEnum(13,153,153,5040),
+
{ 0,
0,
0
diff --git a/src/rtfstyle.h b/src/rtfstyle.h
index 60f671f..1058351 100644
--- a/src/rtfstyle.h
+++ b/src/rtfstyle.h
@@ -42,7 +42,7 @@ struct RTFListItemInfo
int number;
};
-const int rtf_maxIndentLevels = 10;
+const int rtf_maxIndentLevels = 13;
extern RTFListItemInfo rtf_listItemInfo[rtf_maxIndentLevels];
diff --git a/src/scanner.l b/src/scanner.l
index 4846132..7559e0b 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -31,7 +31,7 @@
#include <qstack.h>
#include <qregexp.h>
#include <qfile.h>
-
+
#include "scanner.h"
#include "entry.h"
#include "message.h"
@@ -126,8 +126,11 @@ static bool insidePHP = FALSE; //!< processing PHP code?
static bool insideObjC = FALSE; //!< processing Objective C code?
static bool insideCli = FALSE; //!< processing C++/CLI code?
static bool insideJS = FALSE; //!< processing JavaScript code?
+static bool insideSlice = FALSE; //!< processing Slice code?
static bool insideCpp = TRUE; //!< processing C/C++ code
+static bool sliceOpt = FALSE;
+
static bool insideCppQuote = FALSE;
static bool insideProtocolList = FALSE;
@@ -219,6 +222,7 @@ static void initParser()
insideFormula = FALSE;
insideCode=FALSE;
insideCli=Config_getBool(CPP_CLI_SUPPORT);
+ sliceOpt=Config_getBool(OPTIMIZE_OUTPUT_SLICE);
previous = 0;
firstTypedefEntry = 0;
tempEntry = 0;
@@ -376,15 +380,16 @@ static bool nameIsOperator(QCString &name)
static void setContext()
{
QCString fileName = yyFileName;
- language = getLanguageFromFileName(fileName);
- insideIDL = language==SrcLangExt_IDL;
- insideJava = language==SrcLangExt_Java;
- insideCS = language==SrcLangExt_CSharp;
- insideD = language==SrcLangExt_D;
- insidePHP = language==SrcLangExt_PHP;
- insideObjC = language==SrcLangExt_ObjC;
- insideJS = language==SrcLangExt_JS;
- insideCpp = language==SrcLangExt_Cpp;
+ language = getLanguageFromFileName(fileName);
+ insideIDL = language==SrcLangExt_IDL;
+ insideJava = language==SrcLangExt_Java;
+ insideCS = language==SrcLangExt_CSharp;
+ insideD = language==SrcLangExt_D;
+ insidePHP = language==SrcLangExt_PHP;
+ insideObjC = language==SrcLangExt_ObjC;
+ insideJS = language==SrcLangExt_JS;
+ insideSlice = language==SrcLangExt_Slice;
+ insideCpp = language==SrcLangExt_Cpp;
if ( insidePHP )
{
useOverrideCommands = TRUE;
@@ -597,15 +602,11 @@ static int yyread(char *buf,int max_size)
/* start command character */
CMD ("\\"|"@")
-SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"callergraph"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"manonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">")
BN [ \t\n\r]
BL [ \t\r]*"\n"
B [ \t]
-BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
-SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)(((~|!){BN}*)?{ID})
-PHPSCOPENAME ({ID}"\\")+{ID}
TSCOPE {ID}("<"[a-z_A-Z0-9 \t\*\&,:]*">")?
CSSCOPENAME (({ID}?{BN}*"."{BN}*)*)((~{BN}*)?{ID})
PRE [pP][rR][eE]
@@ -763,6 +764,14 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
%x IDLProp
%x IDLPropName
+ /** Slice states */
+
+%x SliceMetadata
+%x SliceSequence
+%x SliceSequenceName
+%x SliceDictionary
+%x SliceDictionaryName
+
/** Prototype scanner states */
%x Prototype
@@ -1220,6 +1229,38 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
unput('{');
BEGIN( Function );
}
+<FindMembers>{B}*"sequence"{BN}*"<"{BN}* {
+ if (insideSlice)
+ {
+ lineCount();
+ current->bodyLine = yyLineNr;
+ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ current->startColumn = yyColNr;
+ current->args.resize(0);
+ current->section = Entry::TYPEDEF_SEC ;
+ isTypedef = TRUE;
+ BEGIN( SliceSequence );
+ }
+ else
+ REJECT;
+ }
+<FindMembers>{B}*"dictionary"{BN}*"<"{BN}* {
+ if (insideSlice)
+ {
+ lineCount();
+ current->bodyLine = yyLineNr;
+ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ current->startColumn = yyColNr;
+ current->args.resize(0);
+ current->section = Entry::TYPEDEF_SEC ;
+ isTypedef = TRUE;
+ BEGIN( SliceDictionary );
+ }
+ else
+ REJECT;
+ }
<FindMembers>{BN}{1,80} {
lineCount();
}
@@ -1392,6 +1433,9 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
<FindMembers>{B}*"explicit"{BN}+ { current->spec|=Entry::Explicit;
lineCount();
}
+<FindMembers>{B}*"local"{BN}+ { current->spec|=Entry::Local;
+ lineCount();
+ }
<FindMembers>{B}*"@required"{BN}+ { // Objective C 2.0 protocol required section
current->spec=(current->spec & ~Entry::Optional) | Entry::Required;
lineCount();
@@ -1426,7 +1470,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
<FindMembers>{B}*"module"{BN}+ {
lineCount();
- if (insideIDL)
+ if (insideIDL || insideSlice)
{
isTypedef=FALSE;
current->section = Entry::NAMESPACE_SEC;
@@ -1529,15 +1573,15 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
current->name = QCString(yytext).stripWhiteSpace();
}
}
-<FindMembers>{BN}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba/UNO IDL/Java interface
+<FindMembers>{BN}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba/UNO IDL/Java/Slice interface
lineCount();
- if (insideIDL || insideJava || insideCS || insideD || insidePHP)
+ if (insideIDL || insideJava || insideCS || insideD || insidePHP || insideSlice)
{
isTypedef=FALSE;
current->section = Entry::CLASS_SEC;
- current->spec = Entry::Interface |
- // preserve UNO IDL [optional] or published
- (current->spec & (Entry::Optional|Entry::Published));
+ current->spec = Entry::Interface |
+ // preserve UNO IDL [optional], published, Slice local
+ (current->spec & (Entry::Optional|Entry::Published|Entry::Local));
addType( current ) ;
current->type += " interface" ;
current->fileName = yyFileName;
@@ -1601,11 +1645,13 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
current->bodyLine = yyLineNr;
BEGIN( CompoundName );
}
-<FindMembers>{B}*"exception"{BN}+ { // Corba IDL exception
+<FindMembers>{B}*"exception"{BN}+ { // Corba IDL/Slice exception
isTypedef=FALSE;
current->section = Entry::CLASS_SEC;
+ // preserve UNO IDL, Slice local
current->spec = Entry::Exception |
- (current->spec & Entry::Published); // preserve UNO IDL
+ (current->spec & Entry::Published) |
+ (current->spec & Entry::Local);
addType( current ) ;
current->type += " exception" ;
current->fileName = yyFileName;
@@ -1624,6 +1670,16 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
bool isVolatile=decl.find("volatile")!=-1;
current->section = Entry::CLASS_SEC;
addType( current ) ;
+ uint64 spec = current->spec;
+ if (insidePHP && current->spec&Entry::Abstract)
+ {
+ // convert Abstract to AbstractClass
+ current->spec=(current->spec&~Entry::Abstract)|Entry::AbstractClass;
+ }
+ if (insideSlice && spec&Entry::Local)
+ {
+ current->spec|=Entry::Local;
+ }
if (isConst)
{
current->type += " const";
@@ -1644,11 +1700,6 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
- if (insidePHP && current->spec&Entry::Abstract)
- {
- // convert Abstract to AbstractClass
- current->spec=(current->spec&~Entry::Abstract)|Entry::AbstractClass;
- }
BEGIN( CompoundName ) ;
}
<FindMembers>{B}*"value class{" | // C++/CLI extension
@@ -1724,10 +1775,13 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
isTypedef=decl.find("typedef")!=-1;
bool isConst=decl.find("const")!=-1;
bool isVolatile=decl.find("volatile")!=-1;
+ uint64 spec = current->spec;
current->section = Entry::CLASS_SEC ;
+ // preserve UNO IDL & Inline attributes, Slice local
current->spec = Entry::Struct |
(current->spec & Entry::Published) |
- (current->spec & Entry::Inline); // preserve UNO IDL & Inline attributes
+ (current->spec & Entry::Inline) |
+ (current->spec & Entry::Local);
// bug 582676: can be a struct nested in an interface so keep insideObjC state
//current->objc = insideObjC = FALSE;
addType( current ) ;
@@ -3079,6 +3133,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
*pCopyQuotedGString+=*yytext;
BEGIN( lastStringContext );
}
+<CopyGString,CopyPHPGString>"<?php" { // we had an odd number of quotes.
+ *pCopyQuotedGString += yytext;
+ BEGIN( lastStringContext );
+ }
<CopyGString,CopyPHPGString>"/*"|"*/"|"//" {
*pCopyQuotedGString+=yytext;
}
@@ -3448,7 +3506,14 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
<FindMembers>"[" {
- if (!insideCS &&
+ if (insideSlice)
+ {
+ squareCount=1;
+ lastSquareContext = YY_START;
+ current->metaData += "[";
+ BEGIN( SliceMetadata );
+ }
+ else if (!insideCS &&
(current->name.isEmpty() ||
current->name=="typedef"
)
@@ -3488,6 +3553,26 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN( Array ) ;
}
}
+<SliceMetadata>"[" { // Global metadata.
+ squareCount++;
+ current->metaData += "[";
+ }
+<SliceMetadata>{BN}* {
+ lineCount();
+ }
+<SliceMetadata>\"[^\"]*\" {
+ current->metaData += yytext;
+ }
+<SliceMetadata>"," {
+ current->metaData += yytext;
+ }
+<SliceMetadata>"]" {
+ current->metaData += yytext;
+ if (--squareCount<=0)
+ {
+ BEGIN (lastSquareContext);
+ }
+ }
<IDLAttribute>"]" {
// end of IDL function attribute
if (--squareCount<=0)
@@ -3840,6 +3925,28 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
else
{
current->endBodyLine = yyLineNr;
+ if (current->section == Entry::NAMESPACE_SEC && current->type == "namespace")
+ {
+ int split_point;
+ while ((split_point = current->name.find("::")) != -1)
+ {
+ Entry *new_current = new Entry(*current);
+ current->program = "";
+ new_current->doc = "";
+ new_current->docLine = 0;
+ new_current->docFile = "";
+ new_current->brief = "";
+ new_current->briefLine = 0;
+ new_current->briefFile = "";
+ new_current->name = current->name.mid(split_point + 2);
+ current->name = current->name.left(split_point);
+ if (!current_root->name.isEmpty()) current->name.prepend(current_root->name+"::");
+
+ current_root->addSubEntry(current);
+ current_root = current;
+ current = new_current;
+ }
+ }
QCString &cn = current->name;
QCString rn = current_root->name.copy();
//printf("cn=`%s' rn=`%s' isTypedef=%d\n",cn.data(),rn.data(),isTypedef);
@@ -3877,7 +3984,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
current = new Entry(*current);
if (current->section==Entry::NAMESPACE_SEC ||
(current->spec==Entry::Interface) ||
- insideJava || insidePHP || insideCS || insideD || insideJS
+ insideJava || insidePHP || insideCS || insideD || insideJS ||
+ insideSlice
)
{ // namespaces and interfaces and java classes ends with a closing bracket without semicolon
current->reset();
@@ -5349,7 +5457,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
BEGIN( FindMembers ) ;
}
-<CompoundName>{SCOPENAME}{BN}*/"<" {
+<CompoundName>{SCOPENAME}/{BN}*"<" {
sharpCount = 0;
current->name = yytext ;
if (current->spec & Entry::Protocol)
@@ -5587,7 +5695,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
roundCount=0;
BEGIN(SkipUnionSwitch);
}
- else if ((insideJava || insidePHP || insideJS) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0))
+ else if ((insideJava || insidePHP || insideJS || insideSlice) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0))
{
current->type.resize(0);
baseProt=Public;
@@ -6014,7 +6122,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
if ((current->spec & (Entry::Interface|Entry::Struct)) ||
insideJava || insidePHP || insideCS ||
- insideD || insideObjC || insideIDL)
+ insideD || insideObjC || insideIDL || insideSlice)
{
baseProt=Public;
}
@@ -6304,8 +6412,67 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
<CSString>\n { lineCount(); }
<CSString>"." {}
+ /* ---- Slice-specific rules ------ */
+<SliceSequence>{SCOPENAME} {
+ if (current->spec&Entry::Local)
+ {
+ current->type = "local ";
+ }
+ current->type += "sequence<";
+ current->type += yytext;
+ current->type += ">";
+ }
+<SliceSequence>{BN}*">"{BN}* {
+ lineCount();
+ BEGIN(SliceSequenceName);
+ }
+
+<SliceSequenceName>{ID}{BN}* {
+ lineCount();
+ current->name = yytext ;
+ current->name = current->name.stripWhiteSpace();
+ }
+
+<SliceSequenceName>";" {
+ current->section = Entry::VARIABLE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+ BEGIN(FindMembers);
+ }
+
+<SliceDictionary>{SCOPENAME}{BN}*","{BN}*{SCOPENAME} {
+ lineCount();
+ if (current->spec&Entry::Local)
+ {
+ current->type = "local ";
+ }
+ current->type += "dictionary<";
+ current->type += yytext;
+ current->type += ">";
+ current->type = current->type.simplifyWhiteSpace();
+ }
+
+<SliceDictionary>{BN}*">"{BN}* {
+ lineCount();
+ BEGIN(SliceDictionaryName);
+ }
+
+<SliceDictionaryName>{ID}{BN}* {
+ lineCount();
+ current->name = yytext ;
+ current->name = current->name.stripWhiteSpace();
+ }
+
+<SliceDictionaryName>";" {
+ current->section = Entry::VARIABLE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+ BEGIN(FindMembers);
+ }
/**********************************************************************************/
/******************** Documentation block related rules ***************************/
@@ -6901,7 +7068,7 @@ static void parseCompounds(Entry *rt)
// set default protection based on the compound type
if( ce->section==Entry::CLASS_SEC ) // class
{
- if (insidePHP || insideD || insideJS || insideIDL)
+ if (insidePHP || insideD || insideJS || insideIDL || insideSlice)
{
current->protection = protection = Public ;
}
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
index 6276eae..5859d67 100644
--- a/src/searchindex.cpp
+++ b/src/searchindex.cpp
@@ -620,6 +620,14 @@ static void addMemberToSearchIndex(MemberDef *md)
{
g_searchIndexInfo[SEARCH_INDEX_VARIABLES].symbolList.append(letter,md);
}
+ else if (md->isSequence())
+ {
+ g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].symbolList.append(letter,md);
+ }
+ else if (md->isDictionary())
+ {
+ g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].symbolList.append(letter,md);
+ }
else if (md->isTypedef())
{
g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].symbolList.append(letter,md);
@@ -667,6 +675,14 @@ static void addMemberToSearchIndex(MemberDef *md)
{
g_searchIndexInfo[SEARCH_INDEX_VARIABLES].symbolList.append(letter,md);
}
+ else if (md->isSequence())
+ {
+ g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].symbolList.append(letter,md);
+ }
+ else if (md->isDictionary())
+ {
+ g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].symbolList.append(letter,md);
+ }
else if (md->isTypedef())
{
g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].symbolList.append(letter,md);
@@ -717,39 +733,54 @@ static QCString searchId(const QCString &s)
void createJavascriptSearchIndex()
{
+ bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+
// set index names
- g_searchIndexInfo[SEARCH_INDEX_ALL].name = "all";
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].name = "classes";
- g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].name = "namespaces";
- g_searchIndexInfo[SEARCH_INDEX_FILES].name = "files";
- g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].name = "functions";
- g_searchIndexInfo[SEARCH_INDEX_VARIABLES].name = "variables";
- g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].name = "typedefs";
- g_searchIndexInfo[SEARCH_INDEX_ENUMS].name = "enums";
- g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].name = "enumvalues";
- g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].name = "properties";
- g_searchIndexInfo[SEARCH_INDEX_EVENTS].name = "events";
- g_searchIndexInfo[SEARCH_INDEX_RELATED].name = "related";
- g_searchIndexInfo[SEARCH_INDEX_DEFINES].name = "defines";
- g_searchIndexInfo[SEARCH_INDEX_GROUPS].name = "groups";
- g_searchIndexInfo[SEARCH_INDEX_PAGES].name = "pages";
+ g_searchIndexInfo[SEARCH_INDEX_ALL].name = "all";
+ g_searchIndexInfo[SEARCH_INDEX_CLASSES].name = "classes";
+ g_searchIndexInfo[SEARCH_INDEX_INTERFACES].name = "interfaces";
+ g_searchIndexInfo[SEARCH_INDEX_STRUCTS].name = "structs";
+ g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].name = "exceptions";
+ g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].name = "namespaces";
+ g_searchIndexInfo[SEARCH_INDEX_FILES].name = "files";
+ g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].name = "functions";
+ g_searchIndexInfo[SEARCH_INDEX_VARIABLES].name = "variables";
+ g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].name = "typedefs";
+ g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].name = "sequences";
+ g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].name = "dictionaries";
+ g_searchIndexInfo[SEARCH_INDEX_ENUMS].name = "enums";
+ g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].name = "enumvalues";
+ g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].name = "properties";
+ g_searchIndexInfo[SEARCH_INDEX_EVENTS].name = "events";
+ g_searchIndexInfo[SEARCH_INDEX_RELATED].name = "related";
+ g_searchIndexInfo[SEARCH_INDEX_DEFINES].name = "defines";
+ g_searchIndexInfo[SEARCH_INDEX_GROUPS].name = "groups";
+ g_searchIndexInfo[SEARCH_INDEX_PAGES].name = "pages";
// set index texts
- g_searchIndexInfo[SEARCH_INDEX_ALL].text = theTranslator->trAll();
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].text = theTranslator->trClasses();
- g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].text = theTranslator->trNamespace(TRUE,FALSE);
- g_searchIndexInfo[SEARCH_INDEX_FILES].text = theTranslator->trFile(TRUE,FALSE);
- g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].text = theTranslator->trFunctions();
- g_searchIndexInfo[SEARCH_INDEX_VARIABLES].text = theTranslator->trVariables();
- g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].text = theTranslator->trTypedefs();
- g_searchIndexInfo[SEARCH_INDEX_ENUMS].text = theTranslator->trEnumerations();
- g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].text = theTranslator->trEnumerationValues();
- g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].text = theTranslator->trProperties();
- g_searchIndexInfo[SEARCH_INDEX_EVENTS].text = theTranslator->trEvents();
- g_searchIndexInfo[SEARCH_INDEX_RELATED].text = theTranslator->trFriends();
- g_searchIndexInfo[SEARCH_INDEX_DEFINES].text = theTranslator->trDefines();
- g_searchIndexInfo[SEARCH_INDEX_GROUPS].text = theTranslator->trGroup(TRUE,FALSE);
- g_searchIndexInfo[SEARCH_INDEX_PAGES].text = theTranslator->trPage(TRUE,FALSE);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].text = theTranslator->trAll();
+ g_searchIndexInfo[SEARCH_INDEX_CLASSES].text = theTranslator->trClasses();
+ g_searchIndexInfo[SEARCH_INDEX_INTERFACES].text = theTranslator->trSliceInterfaces();
+ g_searchIndexInfo[SEARCH_INDEX_STRUCTS].text = theTranslator->trStructs();
+ g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].text = theTranslator->trExceptions();
+ g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].text = sliceOpt ? theTranslator->trModules() :
+ theTranslator->trNamespace(TRUE,FALSE);
+ g_searchIndexInfo[SEARCH_INDEX_FILES].text = theTranslator->trFile(TRUE,FALSE);
+ g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].text = sliceOpt ? theTranslator->trOperations() :
+ theTranslator->trFunctions();
+ g_searchIndexInfo[SEARCH_INDEX_VARIABLES].text = sliceOpt ? theTranslator->trConstants() :
+ theTranslator->trVariables();
+ g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].text = theTranslator->trTypedefs();
+ g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].text = theTranslator->trSequences();
+ g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].text = theTranslator->trDictionaries();
+ g_searchIndexInfo[SEARCH_INDEX_ENUMS].text = theTranslator->trEnumerations();
+ g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].text = theTranslator->trEnumerationValues();
+ g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].text = theTranslator->trProperties();
+ g_searchIndexInfo[SEARCH_INDEX_EVENTS].text = theTranslator->trEvents();
+ g_searchIndexInfo[SEARCH_INDEX_RELATED].text = theTranslator->trFriends();
+ g_searchIndexInfo[SEARCH_INDEX_DEFINES].text = theTranslator->trDefines();
+ g_searchIndexInfo[SEARCH_INDEX_GROUPS].text = theTranslator->trGroup(TRUE,FALSE);
+ g_searchIndexInfo[SEARCH_INDEX_PAGES].text = theTranslator->trPage(TRUE,FALSE);
// add symbols to letter -> symbol list map
@@ -762,7 +793,29 @@ void createJavascriptSearchIndex()
if (cd->isLinkable() && isId(letter))
{
g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,cd);
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd);
+ if (sliceOpt)
+ {
+ if (cd->compoundType()==ClassDef::Interface)
+ {
+ g_searchIndexInfo[SEARCH_INDEX_INTERFACES].symbolList.append(letter,cd);
+ }
+ else if (cd->compoundType()==ClassDef::Struct)
+ {
+ g_searchIndexInfo[SEARCH_INDEX_STRUCTS].symbolList.append(letter,cd);
+ }
+ else if (cd->compoundType()==ClassDef::Exception)
+ {
+ g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].symbolList.append(letter,cd);
+ }
+ else // cd->compoundType()==ClassDef::Class
+ {
+ g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd);
+ }
+ }
+ else // non slice optimisation: group all types under classes
+ {
+ g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd);
+ }
}
}
@@ -927,7 +980,7 @@ void writeJavascriptSearchIndex()
FTextStream t(&outFile);
t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
- " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
+ " \"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
t << "<html><head><title></title>" << endl;
t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
t << "<meta name=\"generator\" content=\"Doxygen " << versionString << "\"/>" << endl;
@@ -1231,7 +1284,7 @@ void writeJavascriptSearchIndex()
{
FTextStream t(&f);
t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
- "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
+ "\"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
t << "<html><head><title></title>" << endl;
t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
diff --git a/src/searchindex.h b/src/searchindex.h
index e491f47..0345b41 100644
--- a/src/searchindex.h
+++ b/src/searchindex.h
@@ -112,22 +112,27 @@ class SearchIndexExternal : public SearchIndexIntf
//------- client side search index ----------------------
-#define SEARCH_INDEX_ALL 0
-#define SEARCH_INDEX_CLASSES 1
-#define SEARCH_INDEX_NAMESPACES 2
-#define SEARCH_INDEX_FILES 3
-#define SEARCH_INDEX_FUNCTIONS 4
-#define SEARCH_INDEX_VARIABLES 5
-#define SEARCH_INDEX_TYPEDEFS 6
-#define SEARCH_INDEX_ENUMS 7
-#define SEARCH_INDEX_ENUMVALUES 8
-#define SEARCH_INDEX_PROPERTIES 9
-#define SEARCH_INDEX_EVENTS 10
-#define SEARCH_INDEX_RELATED 11
-#define SEARCH_INDEX_DEFINES 12
-#define SEARCH_INDEX_GROUPS 13
-#define SEARCH_INDEX_PAGES 14
-#define NUM_SEARCH_INDICES 15
+#define SEARCH_INDEX_ALL 0
+#define SEARCH_INDEX_CLASSES 1
+#define SEARCH_INDEX_INTERFACES 2
+#define SEARCH_INDEX_STRUCTS 3
+#define SEARCH_INDEX_EXCEPTIONS 4
+#define SEARCH_INDEX_NAMESPACES 5
+#define SEARCH_INDEX_FILES 6
+#define SEARCH_INDEX_FUNCTIONS 7
+#define SEARCH_INDEX_VARIABLES 8
+#define SEARCH_INDEX_TYPEDEFS 9
+#define SEARCH_INDEX_SEQUENCES 10
+#define SEARCH_INDEX_DICTIONARIES 11
+#define SEARCH_INDEX_ENUMS 12
+#define SEARCH_INDEX_ENUMVALUES 13
+#define SEARCH_INDEX_PROPERTIES 14
+#define SEARCH_INDEX_EVENTS 15
+#define SEARCH_INDEX_RELATED 16
+#define SEARCH_INDEX_DEFINES 17
+#define SEARCH_INDEX_GROUPS 18
+#define SEARCH_INDEX_PAGES 19
+#define NUM_SEARCH_INDICES 20
class SearchDefinitionList : public QList<Definition>
{
diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp
index 6cd9581..a7b8dbb 100644
--- a/src/sqlite3gen.cpp
+++ b/src/sqlite3gen.cpp
@@ -23,11 +23,15 @@
#include "qtbc.h"
#include "sqlite3gen.h"
#include "doxygen.h"
+#include "xmlgen.h"
+#include "xmldocvisitor.h"
#include "config.h"
#include "util.h"
+#include "outputlist.h"
#include "docparser.h"
#include "language.h"
+#include "version.h"
#include "dot.h"
#include "arguments.h"
#include "classlist.h"
@@ -35,65 +39,129 @@
#include "namespacedef.h"
#include "filename.h"
#include "groupdef.h"
+#include "membername.h"
+#include "memberdef.h"
#include "pagedef.h"
#include "dirdef.h"
+#include "section.h"
+#include <sys/stat.h>
#include <qdir.h>
#include <string.h>
#include <sqlite3.h>
-//#define DBG_CTX(x) printf x
-#define DBG_CTX(x) do { } while(0)
+// enable to show general debug messages
+// #define SQLITE3_DEBUG
-const char * schema_queries[][2] = {
+// enable to print all executed SQL statements.
+// I recommend using the smallest possible input list.
+// #define SQLITE3_DEBUG_SQL
+
+# ifdef SQLITE3_DEBUG
+# define DBG_CTX(x) printf x
+# else // SQLITE3_DEBUG
+# define DBG_CTX(x) do { } while(0)
+# endif
+
+# ifdef SQLITE3_DEBUG_SQL
+// used by sqlite3_trace in generateSqlite3()
+static void sqlLog(void *dbName, const char *sql){
+ msg("SQL: '%s'\n", sql);
+}
+# endif
+
+const char * table_schema[][2] = {
+ /* TABLES */
+ { "meta",
+ "CREATE TABLE IF NOT EXISTS meta (\n"
+ "\t-- Information about this db and how it was generated.\n"
+ "\t-- Doxygen info\n"
+ "\tdoxygen_version TEXT PRIMARY KEY NOT NULL,\n"
+ /*
+ Doxygen's version is likely to rollover much faster than the schema, and
+ at least until it becomes a core output format, we might want to make
+ fairly large schema changes even on minor iterations for Doxygen itself.
+ If these tools just track a predefined semver schema version that can
+ iterate independently, it *might* not be as hard to keep them in sync?
+ */
+ "\tschema_version TEXT NOT NULL, -- Schema-specific semver\n"
+ "\t-- run info\n"
+ "\tgenerated_at TEXT NOT NULL,\n"
+ "\tgenerated_on TEXT NOT NULL,\n"
+ "\t-- project info\n"
+ "\tproject_name TEXT NOT NULL,\n"
+ "\tproject_number TEXT,\n"
+ "\tproject_brief TEXT\n"
+ ");"
+ },
{ "includes",
"CREATE TABLE IF NOT EXISTS includes (\n"
"\t-- #include relations.\n"
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
"\tlocal INTEGER NOT NULL,\n"
- "\tid_src INTEGER NOT NULL, -- File id of the includer.\n"
- "\tid_dst INTEGER NOT NULL -- File id of the includee.\n"
- ");\n"
- "CREATE UNIQUE INDEX idx_includes ON includes\n"
- "\t(local, id_src, id_dst);"
+ "\tsrc_id INTEGER NOT NULL REFERENCES path, -- File id of the includer.\n"
+ "\tdst_id INTEGER NOT NULL REFERENCES path, -- File id of the includee.\n"
+ /*
+ In theory we could include name here to be informationally equivalent
+ with the XML, but I don't see an obvious use for it.
+ */
+ "\tUNIQUE(local, src_id, dst_id) ON CONFLICT IGNORE\n"
+ ");"
},
- { "innerclass",
- "CREATE TABLE IF NOT EXISTS innerclass (\n"
+ { "contains",
+ "CREATE TABLE IF NOT EXISTS contains (\n"
+ "\t-- inner/outer relations (file, namespace, dir, class, group, page)\n"
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
- "\trefid INTEGER NOT NULL,\n"
- "\tprot INTEGER NOT NULL,\n"
- "\tname TEXT NOT NULL\n"
- ");"
+ "\tinner_rowid INTEGER NOT NULL REFERENCES compounddef,\n"
+ "\touter_rowid INTEGER NOT NULL REFERENCES compounddef\n"
+ ");"
},
- { "files",
- "CREATE TABLE IF NOT EXISTS files (\n"
- "\t-- Names of source files and includes.\n"
- "\tname TEXT PRIMARY KEY NOT NULL\n"
- ");"
+ /* TODO: Path can also share rowids with refid/compounddef/def. (It could
+ * even collapse into that table...)
+ *
+ * I took a first swing at this by changing insertPath() to:
+ * - accept a FileDef
+ * - make its own call to insertRefid
+ * - return a refid struct.
+ *
+ * I rolled this back when I had trouble getting a FileDef for all types
+ * (PageDef in particular).
+ *
+ * Note: all colums referencing path would need an update.
+ */
+ { "path",
+ "CREATE TABLE IF NOT EXISTS path (\n"
+ "\t-- Paths of source files and includes.\n"
+ "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
+ "\ttype INTEGER NOT NULL, -- 1:file 2:dir\n"
+ "\tlocal INTEGER NOT NULL,\n"
+ "\tfound INTEGER NOT NULL,\n"
+ "\tname TEXT NOT NULL\n"
+ ");"
},
- { "refids",
- "CREATE TABLE IF NOT EXISTS refids (\n"
- "\trefid TEXT PRIMARY KEY NOT NULL\n"
- ");"
+ { "refid",
+ "CREATE TABLE IF NOT EXISTS refid (\n"
+ "\t-- Distinct refid for all documented entities.\n"
+ "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
+ "\trefid TEXT NOT NULL UNIQUE\n"
+ ");"
},
{ "xrefs",
"CREATE TABLE IF NOT EXISTS xrefs (\n"
- "\t-- Cross reference relation.\n"
+ "\t-- Cross-reference relation\n"
+ "\t-- (combines xml <referencedby> and <references> nodes).\n"
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
- "\trefid_src INTEGER NOT NULL, -- referrer id.\n"
- "\trefid_dst INTEGER NOT NULL, -- referee id.\n"
- "\tid_file INTEGER NOT NULL, -- file where the reference is happening.\n"
- "\tline INTEGER NOT NULL, -- line where the reference is happening.\n"
- "\tcolumn INTEGER NOT NULL -- column where the reference is happening.\n"
- ");\n"
- "CREATE UNIQUE INDEX idx_xrefs ON xrefs\n"
- "\t(refid_src, refid_dst, id_file, line, column);"
+ "\tsrc_rowid INTEGER NOT NULL REFERENCES refid, -- referrer id.\n"
+ "\tdst_rowid INTEGER NOT NULL REFERENCES refid, -- referee id.\n"
+ "\tcontext TEXT NOT NULL, -- inline, argument, initializer\n"
+ "\t-- Just need to know they link; ignore duplicates.\n"
+ "\tUNIQUE(src_rowid, dst_rowid, context) ON CONFLICT IGNORE\n"
+ ");\n"
},
{ "memberdef",
"CREATE TABLE IF NOT EXISTS memberdef (\n"
"\t-- All processed identifiers.\n"
- "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
- "\trefid INTEGER NOT NULL, -- see the refids table\n"
+ "\trowid INTEGER PRIMARY KEY NOT NULL,\n"
"\tname TEXT NOT NULL,\n"
"\tdefinition TEXT,\n"
"\ttype TEXT,\n"
@@ -107,7 +175,7 @@ const char * schema_queries[][2] = {
"\tstatic INTEGER DEFAULT 0, -- 0:no 1:yes\n"
"\tconst INTEGER DEFAULT 0, -- 0:no 1:yes\n"
"\texplicit INTEGER DEFAULT 0, -- 0:no 1:yes\n"
- "\tinline INTEGER DEFAULT 0, -- 0:no 1:yes\n"
+ "\tinline INTEGER DEFAULT 0, -- 0:no 1:yes 2:both (set after encountering inline and not-inline)\n"
"\tfinal INTEGER DEFAULT 0, -- 0:no 1:yes\n"
"\tsealed INTEGER DEFAULT 0, -- 0:no 1:yes\n"
"\tnew INTEGER DEFAULT 0, -- 0:no 1:yes\n"
@@ -138,55 +206,71 @@ const char * schema_queries[][2] = {
"\taddable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
"\tremovable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
"\traisable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
- /// @todo make a `kind' table
- "\tkind INTEGER DEFAULT 0, -- 0:define 1:function 2:variable 3:typedef 4:enum 5:enumvalue 6:signal 7:slot 8:friend 9:DCOP 10:property 11:event\n"
+ "\tkind TEXT NOT NULL, -- 'macro definition' 'function' 'variable' 'typedef' 'enumeration' 'enumvalue' 'signal' 'slot' 'friend' 'dcop' 'property' 'event' 'interface' 'service'\n"
"\tbodystart INTEGER DEFAULT 0, -- starting line of definition\n"
"\tbodyend INTEGER DEFAULT 0, -- ending line of definition\n"
- "\tid_bodyfile INTEGER DEFAULT 0, -- file of definition\n"
- "\tid_file INTEGER NOT NULL, -- file where this identifier is located\n"
+ "\tbodyfile_id INTEGER REFERENCES path, -- file of definition\n"
+ "\tfile_id INTEGER NOT NULL REFERENCES path, -- file where this identifier is located\n"
"\tline INTEGER NOT NULL, -- line where this identifier is located\n"
"\tcolumn INTEGER NOT NULL, -- column where this identifier is located\n"
- /// @todo make a `detaileddescription' table
"\tdetaileddescription TEXT,\n"
"\tbriefdescription TEXT,\n"
- "\tinbodydescription TEXT\n"
- ");"
+ "\tinbodydescription TEXT,\n"
+ "\tFOREIGN KEY (rowid) REFERENCES refid (rowid)\n"
+ ");"
+ },
+ { "member",
+ "CREATE TABLE IF NOT EXISTS member (\n"
+ "\t-- Memberdef <-> containing compound relation.\n"
+ "\t-- Similar to XML listofallmembers.\n"
+ "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
+ "\tscope_rowid INTEGER NOT NULL REFERENCES compounddef,\n"
+ "\tmemberdef_rowid INTEGER NOT NULL REFERENCES memberdef,\n"
+ "\tprot INTEGER NOT NULL,\n"
+ "\tvirt INTEGER NOT NULL,\n"
+ "\tUNIQUE(scope_rowid, memberdef_rowid)\n"
+ ");"
+ },
+ { "reimplements",
+ "CREATE TABLE IF NOT EXISTS reimplements (\n"
+ "\t-- Inherited member reimplmentation relations.\n"
+ "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
+ "\tmemberdef_rowid INTEGER NOT NULL REFERENCES memberdef, -- reimplementing memberdef id.\n"
+ "\treimplemented_rowid INTEGER NOT NULL REFERENCES memberdef, -- reimplemented memberdef id.\n"
+ "\tUNIQUE(memberdef_rowid, reimplemented_rowid) ON CONFLICT IGNORE\n"
+ ");\n"
},
{ "compounddef",
"CREATE TABLE IF NOT EXISTS compounddef (\n"
- "\t-- class/struct definitions.\n"
- "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
- "\tname TEXT NOT NULL,\n"
- "\tkind TEXT NOT NULL,\n"
- "\trefid INTEGER NOT NULL,\n"
- "\tprot INTEGER NOT NULL,\n"
- "\tid_file INTEGER NOT NULL,\n"
- "\tline INTEGER NOT NULL,\n"
- "\tcolumn INTEGER NOT NULL\n"
- ");"
- },
- { "basecompoundref",
- "CREATE TABLE IF NOT EXISTS basecompoundref (\n"
- "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
- "\tbase TEXT NOT NULL,\n"
- "\tderived TEXT NOT NULL,\n"
- "\trefid INTEGER NOT NULL,\n"
- "\tprot INTEGER NOT NULL,\n"
- "\tvirt INTEGER NOT NULL\n"
- ");"
+ "\t-- Class/struct definitions.\n"
+ "\trowid INTEGER PRIMARY KEY NOT NULL,\n"
+ "\tname TEXT NOT NULL,\n"
+ "\ttitle TEXT,\n"
+ // probably won't be empty '' or unknown, but the source *could* return them...
+ "\tkind TEXT NOT NULL, -- 'category' 'class' 'constants' 'dir' 'enum' 'example' 'exception' 'file' 'group' 'interface' 'library' 'module' 'namespace' 'package' 'page' 'protocol' 'service' 'singleton' 'struct' 'type' 'union' 'unknown' ''\n"
+ "\tprot INTEGER,\n"
+ "\tfile_id INTEGER NOT NULL REFERENCES path,\n"
+ "\tline INTEGER NOT NULL,\n"
+ "\tcolumn INTEGER NOT NULL,\n"
+ "\theader_id INTEGER REFERENCES path,\n"
+ "\tdetaileddescription TEXT,\n"
+ "\tbriefdescription TEXT,\n"
+ "\tFOREIGN KEY (rowid) REFERENCES refid (rowid)\n"
+ ");"
},
- { "derivedcompoundref",
- "CREATE TABLE IF NOT EXISTS derivedcompoundref (\n"
- "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
- "\tbase TEXT NOT NULL,\n"
- "\tderived TEXT NOT NULL,\n"
- "\trefid INTEGER NOT NULL,\n"
- "\tprot INTEGER NOT NULL,\n"
- "\tvirt INTEGER NOT NULL\n"
- ");"
+ { "compoundref",
+ "CREATE TABLE IF NOT EXISTS compoundref (\n"
+ "\t-- Inheritance relation.\n"
+ "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
+ "\tbase_rowid INTEGER NOT NULL REFERENCES compounddef,\n"
+ "\tderived_rowid INTEGER NOT NULL REFERENCES compounddef,\n"
+ "\tprot INTEGER NOT NULL,\n"
+ "\tvirt INTEGER NOT NULL,\n"
+ "\tUNIQUE(base_rowid, derived_rowid)\n"
+ ");"
},
- { "params",
- "CREATE TABLE IF NOT EXISTS params (\n"
+ { "param",
+ "CREATE TABLE IF NOT EXISTS param (\n"
"\t-- All processed parameters.\n"
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
"\tattributes TEXT,\n"
@@ -196,24 +280,222 @@ const char * schema_queries[][2] = {
"\tarray TEXT,\n"
"\tdefval TEXT,\n"
"\tbriefdescription TEXT\n"
- ");"
- "CREATE UNIQUE INDEX idx_params ON params\n"
+ ");"
+ "CREATE UNIQUE INDEX idx_param ON param\n"
"\t(type, defname);"
},
- { "memberdef_params",
- "CREATE TABLE IF NOT EXISTS memberdef_params (\n"
+ { "memberdef_param",
+ "CREATE TABLE IF NOT EXISTS memberdef_param (\n"
"\t-- Junction table for memberdef parameters.\n"
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
- "\tid_memberdef INTEGER NOT NULL,\n"
- "\tid_param INTEGER NOT NULL\n"
- ");"
+ "\tmemberdef_id INTEGER NOT NULL REFERENCES memberdef,\n"
+ "\tparam_id INTEGER NOT NULL REFERENCES param\n"
+ ");"
},
- { "innernamespaces",
- "CREATE TABLE IF NOT EXISTS innernamespaces (\n"
- "\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
- "\trefid INTEGER NOT NULL,\n"
- "\tname TEXT NOT NULL\n"
- ");"
+};
+ const char * view_schema[][2] = {
+ /* VIEWS *
+ We'll set these up AFTER we build the database, so that they can be indexed,
+ but so we don't have to pay a performance penalty for inserts as we build.
+ */
+ {
+ /*
+ Makes all reference/relation tables easier to use. For example:
+ 1. query xrefs and join this view on either xrefs.dst_rowid=def.rowid or
+ xrefs.src_rowid=def.rowid
+ 2. get everything you need to output a list of references to/from an entity
+
+ Also supports simple name search/lookup for both compound and member types.
+
+ NOTES:
+ - summary for compounds generalizes title and briefdescription because
+ there's no single field that works as a quick introduction for both
+ pages and classes
+ - May be value in eventually extending this to fulltext or levenshtein
+ distance-driven lookup/search, but I'm avoiding these for now as it
+ takes some effort to enable them.
+ */
+ "def",
+ "CREATE VIEW IF NOT EXISTS def (\n"
+ "\t-- Combined summary of all -def types for easier joins.\n"
+ "\trowid,\n"
+ "\trefid,\n"
+ "\tkind,\n"
+ "\tname,\n"
+ "\tsummary"
+ ")\n"
+ "as SELECT \n"
+ "\trefid.rowid,\n"
+ "\trefid.refid,\n"
+ "\tmemberdef.kind,\n"
+ "\tmemberdef.name,\n"
+ "\tmemberdef.briefdescription \n"
+ "FROM refid \n"
+ "JOIN memberdef ON refid.rowid=memberdef.rowid \n"
+ "UNION ALL \n"
+ "SELECT \n"
+ "\trefid.rowid,\n"
+ "\trefid.refid,\n"
+ "\tcompounddef.kind,\n"
+ "\tcompounddef.name,\n"
+ "\tCASE \n"
+ "\t\tWHEN briefdescription IS NOT NULL \n"
+ "\t\tTHEN briefdescription \n"
+ "\t\tELSE title \n"
+ "\tEND summary\n"
+ "FROM refid \n"
+ "JOIN compounddef ON refid.rowid=compounddef.rowid;"
+ },
+ {
+ "local_file",
+ "CREATE VIEW IF NOT EXISTS local_file (\n"
+ "\t-- File paths found within the project.\n"
+ "\trowid,\n"
+ "\tfound,\n"
+ "\tname\n"
+ ")\n"
+ "as SELECT \n"
+ "\tpath.rowid,\n"
+ "\tpath.found,\n"
+ "\tpath.name\n"
+ "FROM path WHERE path.type=1 AND path.local=1 AND path.found=1;\n"
+ },
+ {
+ "external_file",
+ "CREATE VIEW IF NOT EXISTS external_file (\n"
+ "\t-- File paths outside the project (found or not).\n"
+ "\trowid,\n"
+ "\tfound,\n"
+ "\tname\n"
+ ")\n"
+ "as SELECT \n"
+ "\tpath.rowid,\n"
+ "\tpath.found,\n"
+ "\tpath.name\n"
+ "FROM path WHERE path.type=1 AND path.local=0;\n"
+ },
+ {
+ "inline_xrefs",
+ "CREATE VIEW IF NOT EXISTS inline_xrefs (\n"
+ "\t-- Crossrefs from inline member source.\n"
+ "\trowid,\n"
+ "\tsrc_rowid,\n"
+ "\tdst_rowid\n"
+ ")\n"
+ "as SELECT \n"
+ "\txrefs.rowid,\n"
+ "\txrefs.src_rowid,\n"
+ "\txrefs.dst_rowid\n"
+ "FROM xrefs WHERE xrefs.context='inline';\n"
+ },
+ {
+ "argument_xrefs",
+ "CREATE VIEW IF NOT EXISTS argument_xrefs (\n"
+ "\t-- Crossrefs from member def/decl arguments\n"
+ "\trowid,\n"
+ "\tsrc_rowid,\n"
+ "\tdst_rowid\n"
+ ")\n"
+ "as SELECT \n"
+ "\txrefs.rowid,\n"
+ "\txrefs.src_rowid,\n"
+ "\txrefs.dst_rowid\n"
+ "FROM xrefs WHERE xrefs.context='argument';\n"
+ },
+ {
+ "initializer_xrefs",
+ "CREATE VIEW IF NOT EXISTS initializer_xrefs (\n"
+ "\t-- Crossrefs from member initializers\n"
+ "\trowid,\n"
+ "\tsrc_rowid,\n"
+ "\tdst_rowid\n"
+ ")\n"
+ "as SELECT \n"
+ "\txrefs.rowid,\n"
+ "\txrefs.src_rowid,\n"
+ "\txrefs.dst_rowid\n"
+ "FROM xrefs WHERE xrefs.context='initializer';\n"
+ },
+ {
+ "inner_outer",
+ "CREATE VIEW IF NOT EXISTS inner_outer\n"
+ "\t-- Joins 'contains' relations to simplify inner/outer 'rel' queries.\n"
+ "as SELECT \n"
+ "\tinner.*,\n"
+ "\touter.*\n"
+ "FROM def as inner\n"
+ "\tJOIN contains ON inner.rowid=contains.inner_rowid\n"
+ "\tJOIN def AS outer ON outer.rowid=contains.outer_rowid;\n"
+ },
+ {
+ "rel",
+ "CREATE VIEW IF NOT EXISTS rel (\n"
+ "\t-- Boolean indicator of relations available for a given entity.\n"
+ "\t-- Join to (compound-|member-)def to find fetch-worthy relations.\n"
+ "\trowid,\n"
+ "\treimplemented,\n"
+ "\treimplements,\n"
+ "\tinnercompounds,\n"
+ "\toutercompounds,\n"
+ "\tinnerpages,\n"
+ "\touterpages,\n"
+ "\tinnerdirs,\n"
+ "\touterdirs,\n"
+ "\tinnerfiles,\n"
+ "\touterfiles,\n"
+ "\tinnerclasses,\n"
+ "\touterclasses,\n"
+ "\tinnernamespaces,\n"
+ "\touternamespaces,\n"
+ "\tinnergroups,\n"
+ "\toutergroups,\n"
+ "\tmembers,\n"
+ "\tcompounds,\n"
+ "\tsubclasses,\n"
+ "\tsuperclasses,\n"
+ "\tlinks_in,\n"
+ "\tlinks_out,\n"
+ "\targument_links_in,\n"
+ "\targument_links_out,\n"
+ "\tinitializer_links_in,\n"
+ "\tinitializer_links_out\n"
+ ")\n"
+ "as SELECT \n"
+ "\tdef.rowid,\n"
+ "\tEXISTS (SELECT rowid FROM reimplements WHERE reimplemented_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM reimplements WHERE memberdef_rowid=def.rowid),\n"
+ "\t-- rowid/kind for inner, [rowid:1/kind:1] for outer\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE [rowid:1]=def.rowid),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE rowid=def.rowid),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE [rowid:1]=def.rowid AND kind='page'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE rowid=def.rowid AND [kind:1]='page'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE [rowid:1]=def.rowid AND kind='dir'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE rowid=def.rowid AND [kind:1]='dir'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE [rowid:1]=def.rowid AND kind='file'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE rowid=def.rowid AND [kind:1]='file'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE [rowid:1]=def.rowid AND kind in (\n"
+ "'category','class','enum','exception','interface','module','protocol',\n"
+ "'service','singleton','struct','type','union'\n"
+ ")),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE rowid=def.rowid AND [kind:1] in (\n"
+ "'category','class','enum','exception','interface','module','protocol',\n"
+ "'service','singleton','struct','type','union'\n"
+ ")),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE [rowid:1]=def.rowid AND kind='namespace'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE rowid=def.rowid AND [kind:1]='namespace'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE [rowid:1]=def.rowid AND kind='group'),\n"
+ "\tEXISTS (SELECT * FROM inner_outer WHERE rowid=def.rowid AND [kind:1]='group'),\n"
+ "\tEXISTS (SELECT rowid FROM member WHERE scope_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM member WHERE memberdef_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM compoundref WHERE base_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM compoundref WHERE derived_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM inline_xrefs WHERE dst_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM inline_xrefs WHERE src_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM argument_xrefs WHERE dst_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM argument_xrefs WHERE src_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM initializer_xrefs WHERE dst_rowid=def.rowid),\n"
+ "\tEXISTS (SELECT rowid FROM initializer_xrefs WHERE src_rowid=def.rowid)\n"
+ "FROM def ORDER BY def.rowid;"
}
};
@@ -224,193 +506,298 @@ struct SqlStmt {
sqlite3 *db;
};
//////////////////////////////////////////////////////
-SqlStmt incl_insert = { "INSERT INTO includes "
- "( local, id_src, id_dst ) "
- "VALUES "
- "(:local,:id_src,:id_dst )"
- ,NULL
+/* If you add a new statement below, make sure to add it to
+ prepareStatements(). If sqlite3 is segfaulting (especially in
+ sqlite3_clear_bindings()), using an un-prepared statement may
+ be the cause. */
+SqlStmt meta_insert = {
+ "INSERT INTO meta "
+ "( doxygen_version, schema_version, generated_at, generated_on, project_name, project_number, project_brief )"
+ "VALUES "
+ "(:doxygen_version,:schema_version,:generated_at,:generated_on,:project_name,:project_number,:project_brief )"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt incl_insert = {
+ "INSERT INTO includes "
+ "( local, src_id, dst_id ) "
+ "VALUES "
+ "(:local,:src_id,:dst_id )"
+ ,NULL
};
-SqlStmt incl_select = { "SELECT COUNT(*) FROM includes WHERE "
- "local=:local AND id_src=:id_src AND id_dst=:id_dst"
- ,NULL
+SqlStmt incl_select = {
+ "SELECT COUNT(*) FROM includes WHERE "
+ "local=:local AND src_id=:src_id AND dst_id=:dst_id"
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt innerclass_insert={"INSERT INTO innerclass "
- "( refid, prot, name )"
- "VALUES "
- "(:refid,:prot,:name )"
- ,NULL
+SqlStmt contains_insert={
+ "INSERT INTO contains "
+ "( inner_rowid, outer_rowid )"
+ "VALUES "
+ "(:inner_rowid,:outer_rowid )"
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt files_select = {"SELECT rowid FROM files WHERE name=:name"
+SqlStmt path_select = {
+ "SELECT rowid FROM path WHERE name=:name"
,NULL
};
-SqlStmt files_insert = {"INSERT INTO files "
- "( name )"
- "VALUES "
- "(:name )"
- ,NULL
+SqlStmt path_insert = {
+ "INSERT INTO path "
+ "( type, local, found, name )"
+ "VALUES "
+ "(:type,:local,:found,:name )"
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt refids_select = {"SELECT rowid FROM refids WHERE "
- "refid=:refid"
- ,NULL
+SqlStmt refid_select = {
+ "SELECT rowid FROM refid WHERE refid=:refid"
+ ,NULL
};
-SqlStmt refids_insert = {"INSERT INTO refids "
- "( refid )"
- "VALUES "
+SqlStmt refid_insert = {
+ "INSERT INTO refid "
+ "( refid )"
+ "VALUES "
"(:refid )"
- ,NULL
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt xrefs_insert= {"INSERT INTO xrefs "
- "( refid_src, refid_dst, id_file, line, column )"
- "VALUES "
- "(:refid_src,:refid_dst,:id_file,:line,:column )"
- ,NULL
+SqlStmt xrefs_insert= {
+ "INSERT INTO xrefs "
+ "( src_rowid, dst_rowid, context )"
+ "VALUES "
+ "(:src_rowid,:dst_rowid,:context )"
+ ,NULL
+};//////////////////////////////////////////////////////
+SqlStmt reimplements_insert= {
+ "INSERT INTO reimplements "
+ "( memberdef_rowid, reimplemented_rowid )"
+ "VALUES "
+ "(:memberdef_rowid,:reimplemented_rowid )"
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt memberdef_insert={"INSERT INTO memberdef "
- "("
- "refid,"
- "name,"
- "definition,"
- "type,"
- "argsstring,"
- "scope,"
- "initializer,"
- "bitfield,"
- "read,"
- "write,"
- "prot,"
- "static,"
- "const,"
- "explicit,"
- "inline,"
- "final,"
- "sealed,"
- "new,"
- "optional,"
- "required,"
- "volatile,"
- "virt,"
- "mutable,"
- "initonly,"
- "attribute,"
- "property,"
- "readonly,"
- "bound,"
- "constrained,"
- "transient,"
- "maybevoid,"
- "maybedefault,"
- "maybeambiguous,"
- "readable,"
- "writable,"
- "gettable,"
- "protectedsettable,"
- "protectedgettable,"
- "settable,"
- "privatesettable,"
- "privategettable,"
- "accessor,"
- "addable,"
- "removable,"
- "raisable,"
- "kind,"
- "bodystart,"
- "bodyend,"
- "id_bodyfile,"
- "id_file,"
- "line,"
- "column,"
- "detaileddescription,"
- "briefdescription,"
- "inbodydescription"
- ")"
- "VALUES "
- "("
- ":refid,"
- ":name,"
- ":definition,"
- ":type,"
- ":argsstring,"
- ":scope,"
- ":initializer,"
- ":bitfield,"
- ":read,"
- ":write,"
- ":prot,"
- ":static,"
- ":const,"
- ":explicit,"
- ":inline,"
- ":final,"
- ":sealed,"
- ":new,"
- ":optional,"
- ":required,"
- ":volatile,"
- ":virt,"
- ":mutable,"
- ":initonly,"
- ":attribute,"
- ":property,"
- ":readonly,"
- ":bound,"
- ":constrained,"
- ":transient,"
- ":maybevoid,"
- ":maybedefault,"
- ":maybeambiguous,"
- ":readable,"
- ":writable,"
- ":gettable,"
- ":protectedsettable,"
- ":protectedgettable,"
- ":settable,"
- ":privatesettable,"
- ":privategettable,"
- ":accessor,"
- ":addable,"
- ":removable,"
- ":raisable,"
- ":kind,"
- ":bodystart,"
- ":bodyend,"
- ":id_bodyfile,"
- ":id_file,"
- ":line,"
- ":column,"
- ":detaileddescription,"
- ":briefdescription,"
- ":inbodydescription"
- ")"
- ,NULL
+SqlStmt memberdef_exists={
+ "SELECT EXISTS (SELECT * FROM memberdef WHERE rowid = :rowid)"
+ ,NULL
+};
+
+SqlStmt memberdef_incomplete={
+ "SELECT EXISTS ("
+ "SELECT * FROM memberdef WHERE "
+ "rowid = :rowid AND inline != 2 AND inline != :new_inline"
+ ")"
+ ,NULL
+};
+
+SqlStmt memberdef_insert={
+ "INSERT INTO memberdef "
+ "("
+ "rowid,"
+ "name,"
+ "definition,"
+ "type,"
+ "argsstring,"
+ "scope,"
+ "initializer,"
+ "bitfield,"
+ "read,"
+ "write,"
+ "prot,"
+ "static,"
+ "const,"
+ "explicit,"
+ "inline,"
+ "final,"
+ "sealed,"
+ "new,"
+ "optional,"
+ "required,"
+ "volatile,"
+ "virt,"
+ "mutable,"
+ "initonly,"
+ "attribute,"
+ "property,"
+ "readonly,"
+ "bound,"
+ "constrained,"
+ "transient,"
+ "maybevoid,"
+ "maybedefault,"
+ "maybeambiguous,"
+ "readable,"
+ "writable,"
+ "gettable,"
+ "protectedsettable,"
+ "protectedgettable,"
+ "settable,"
+ "privatesettable,"
+ "privategettable,"
+ "accessor,"
+ "addable,"
+ "removable,"
+ "raisable,"
+ "kind,"
+ "bodystart,"
+ "bodyend,"
+ "bodyfile_id,"
+ "file_id,"
+ "line,"
+ "column,"
+ "detaileddescription,"
+ "briefdescription,"
+ "inbodydescription"
+ ")"
+ "VALUES "
+ "("
+ ":rowid,"
+ ":name,"
+ ":definition,"
+ ":type,"
+ ":argsstring,"
+ ":scope,"
+ ":initializer,"
+ ":bitfield,"
+ ":read,"
+ ":write,"
+ ":prot,"
+ ":static,"
+ ":const,"
+ ":explicit,"
+ ":inline,"
+ ":final,"
+ ":sealed,"
+ ":new,"
+ ":optional,"
+ ":required,"
+ ":volatile,"
+ ":virt,"
+ ":mutable,"
+ ":initonly,"
+ ":attribute,"
+ ":property,"
+ ":readonly,"
+ ":bound,"
+ ":constrained,"
+ ":transient,"
+ ":maybevoid,"
+ ":maybedefault,"
+ ":maybeambiguous,"
+ ":readable,"
+ ":writable,"
+ ":gettable,"
+ ":protectedsettable,"
+ ":protectedgettable,"
+ ":settable,"
+ ":privatesettable,"
+ ":privategettable,"
+ ":accessor,"
+ ":addable,"
+ ":removable,"
+ ":raisable,"
+ ":kind,"
+ ":bodystart,"
+ ":bodyend,"
+ ":bodyfile_id,"
+ ":file_id,"
+ ":line,"
+ ":column,"
+ ":detaileddescription,"
+ ":briefdescription,"
+ ":inbodydescription"
+ ")"
+ ,NULL
+};
+/*
+We have a slightly different need than the XML here. The XML can have two
+memberdef nodes with the same refid to document the declaration and the
+definition. This doesn't play very nice with a referential model. It isn't a
+big issue if only one is documented, but in case both are, we'll fall back on
+this kludge to combine them in a single row...
+*/
+SqlStmt memberdef_update_decl={
+ "UPDATE memberdef SET "
+ "inline = :inline,"
+ "file_id = :file_id,"
+ "line = :line,"
+ "column = :column,"
+ "detaileddescription = 'Declaration: ' || :detaileddescription || 'Definition: ' || detaileddescription,"
+ "briefdescription = 'Declaration: ' || :briefdescription || 'Definition: ' || briefdescription,"
+ "inbodydescription = 'Declaration: ' || :inbodydescription || 'Definition: ' || inbodydescription "
+ "WHERE rowid = :rowid"
+ ,NULL
+};
+SqlStmt memberdef_update_def={
+ "UPDATE memberdef SET "
+ "inline = :inline,"
+ "bodystart = :bodystart,"
+ "bodyend = :bodyend,"
+ "bodyfile_id = :bodyfile_id,"
+ "detaileddescription = 'Declaration: ' || detaileddescription || 'Definition: ' || :detaileddescription,"
+ "briefdescription = 'Declaration: ' || briefdescription || 'Definition: ' || :briefdescription,"
+ "inbodydescription = 'Declaration: ' || inbodydescription || 'Definition: ' || :inbodydescription "
+ "WHERE rowid = :rowid"
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt compounddef_insert={"INSERT INTO compounddef "
- "( name, kind, prot, refid, id_file, line, column ) "
- "VALUES "
- "(:name,:kind,:prot,:refid,:id_file,:line,:column )"
- ,NULL
+SqlStmt member_insert={
+ "INSERT INTO member "
+ "( scope_rowid, memberdef_rowid, prot, virt ) "
+ "VALUES "
+ "(:scope_rowid,:memberdef_rowid,:prot,:virt )"
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt basecompoundref_insert={"INSERT INTO basecompoundref "
- "( base, derived, refid, prot, virt ) "
- "VALUES "
- "(:base,:derived,:refid,:prot,:virt )"
- ,NULL
+SqlStmt compounddef_insert={
+ "INSERT INTO compounddef "
+ "("
+ "rowid,"
+ "name,"
+ "title,"
+ "kind,"
+ "prot,"
+ "file_id,"
+ "line,"
+ "column,"
+ "header_id,"
+ "briefdescription,"
+ "detaileddescription"
+ ")"
+ "VALUES "
+ "("
+ ":rowid,"
+ ":name,"
+ ":title,"
+ ":kind,"
+ ":prot,"
+ ":file_id,"
+ ":line,"
+ ":column,"
+ ":header_id,"
+ ":briefdescription,"
+ ":detaileddescription"
+ ")"
+ ,NULL
+};
+SqlStmt compounddef_exists={
+ "SELECT EXISTS ("
+ "SELECT * FROM compounddef WHERE rowid = :rowid"
+ ")"
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt derivedcompoundref_insert={"INSERT INTO derivedcompoundref "
- "( refid, prot, virt, base, derived ) "
- "VALUES "
- "(:refid,:prot,:virt,:base,:derived )"
- ,NULL
+SqlStmt compoundref_insert={
+ "INSERT INTO compoundref "
+ "( base_rowid, derived_rowid, prot, virt ) "
+ "VALUES "
+ "(:base_rowid,:derived_rowid,:prot,:virt )"
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt params_select = { "SELECT rowid FROM params WHERE "
+SqlStmt param_select = {
+ "SELECT rowid FROM param WHERE "
"(attributes IS NULL OR attributes=:attributes) AND "
"(type IS NULL OR type=:type) AND "
"(declname IS NULL OR declname=:declname) AND "
@@ -418,27 +805,22 @@ SqlStmt params_select = { "SELECT rowid FROM params WHERE "
"(array IS NULL OR array=:array) AND "
"(defval IS NULL OR defval=:defval) AND "
"(briefdescription IS NULL OR briefdescription=:briefdescription)"
- ,NULL
+ ,NULL
};
-SqlStmt params_insert = { "INSERT INTO params "
- "( attributes, type, declname, defname, array, defval, briefdescription ) "
- "VALUES "
+SqlStmt param_insert = {
+ "INSERT INTO param "
+ "( attributes, type, declname, defname, array, defval, briefdescription ) "
+ "VALUES "
"(:attributes,:type,:declname,:defname,:array,:defval,:briefdescription)"
- ,NULL
-};
-//////////////////////////////////////////////////////
-SqlStmt memberdef_params_insert={ "INSERT INTO memberdef_params "
- "( id_memberdef, id_param)"
- "VALUES "
- "(:id_memberdef,:id_param)"
- ,NULL
+ ,NULL
};
//////////////////////////////////////////////////////
-SqlStmt innernamespace_insert={"INSERT INTO innernamespaces "
- "( refid, name)"
- "VALUES "
- "(:refid,:name)",
- NULL
+SqlStmt memberdef_param_insert={
+ "INSERT INTO memberdef_param "
+ "( memberdef_id, param_id)"
+ "VALUES "
+ "(:memberdef_id,:param_id)"
+ ,NULL
};
@@ -491,7 +873,7 @@ static bool bindIntParameter(SqlStmt &s,const char *name,int value)
{
int idx = sqlite3_bind_parameter_index(s.stmt, name);
if (idx==0) {
- msg("sqlite3_bind_parameter_index(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
+ msg("sqlite3_bind_parameter_index(%s)[%s] failed to find column: %s\n", name, s.query, sqlite3_errmsg(s.db));
return false;
}
int rv = sqlite3_bind_int(s.stmt, idx, value);
@@ -508,7 +890,7 @@ static int step(SqlStmt &s,bool getRowId=FALSE, bool select=FALSE)
int rc = sqlite3_step(s.stmt);
if (rc!=SQLITE_DONE && rc!=SQLITE_ROW)
{
- msg("sqlite3_step: %s\n", sqlite3_errmsg(s.db));
+ DBG_CTX(("sqlite3_step: %s (rc: %d)\n", sqlite3_errmsg(s.db), rc));
sqlite3_reset(s.stmt);
sqlite3_clear_bindings(s.stmt);
return -1;
@@ -520,76 +902,122 @@ static int step(SqlStmt &s,bool getRowId=FALSE, bool select=FALSE)
return rowid;
}
-static int insertFile(const char* name)
+static int insertPath(QCString name, bool local=TRUE, bool found=TRUE, int type=1)
{
int rowid=-1;
if (name==0) return rowid;
- bindTextParameter(files_select,":name",name);
- rowid=step(files_select,TRUE,TRUE);
+ name = stripFromPath(name);
+
+ bindTextParameter(path_select,":name",name.data(),FALSE);
+ rowid=step(path_select,TRUE,TRUE);
if (rowid==0)
{
- bindTextParameter(files_insert,":name",name);
- rowid=step(files_insert,TRUE);
+ bindTextParameter(path_insert,":name",name.data(),FALSE);
+ bindIntParameter(path_insert,":type",type);
+ bindIntParameter(path_insert,":local",local?1:0);
+ bindIntParameter(path_insert,":found",found?1:0);
+ rowid=step(path_insert,TRUE);
}
return rowid;
}
-static int insertRefid(const char *refid)
+static void recordMetadata()
{
- int rowid=-1;
- if (refid==0) return rowid;
+ bindTextParameter(meta_insert,":doxygen_version",versionString);
+ bindTextParameter(meta_insert,":schema_version","0.2.0"); //TODO: this should be a constant somewhere; not sure where
+ bindTextParameter(meta_insert,":generated_at",dateToString(TRUE), FALSE);
+ bindTextParameter(meta_insert,":generated_on",dateToString(FALSE), FALSE);
+ bindTextParameter(meta_insert,":project_name",Config_getString(PROJECT_NAME));
+ bindTextParameter(meta_insert,":project_number",Config_getString(PROJECT_NUMBER));
+ bindTextParameter(meta_insert,":project_brief",Config_getString(PROJECT_BRIEF));
+ step(meta_insert);
+}
- bindTextParameter(refids_select,":refid",refid);
- rowid=step(refids_select,TRUE,TRUE);
- if (rowid==0)
+struct Refid {
+ int rowid;
+ const char *refid;
+ bool created;
+};
+
+struct Refid insertRefid(const char *refid)
+{
+ struct Refid ret;
+ ret.rowid=-1;
+ ret.refid=refid;
+ ret.created = FALSE;
+ if (refid==0) return ret;
+
+ bindTextParameter(refid_select,":refid",refid);
+ ret.rowid=step(refid_select,TRUE,TRUE);
+ if (ret.rowid==0)
{
- bindTextParameter(refids_insert,":refid",refid);
- rowid=step(refids_insert,TRUE);
+ bindTextParameter(refid_insert,":refid",refid);
+ ret.rowid=step(refid_insert,TRUE);
+ ret.created = TRUE;
}
- return rowid;
+
+ return ret;
+}
+
+static bool memberdefExists(struct Refid refid)
+{
+ bindIntParameter(memberdef_exists,":rowid",refid.rowid);
+ int test = step(memberdef_exists,TRUE,TRUE);
+ return test ? true : false;
}
+static bool memberdefIncomplete(struct Refid refid, const MemberDef* md)
+{
+ bindIntParameter(memberdef_incomplete,":rowid",refid.rowid);
+ bindIntParameter(memberdef_incomplete,":new_inline",md->isInline());
+ int test = step(memberdef_incomplete,TRUE,TRUE);
+ return test ? true : false;
+}
-static bool insertMemberReference(int refid_src, int refid_dst,
- int id_file, int line, int column)
+static bool compounddefExists(struct Refid refid)
{
- if (id_file==-1||refid_src==-1||refid_dst==-1)
+ bindIntParameter(compounddef_exists,":rowid",refid.rowid);
+ int test = step(compounddef_exists,TRUE,TRUE);
+ return test ? true : false;
+}
+
+static bool insertMemberReference(struct Refid src_refid, struct Refid dst_refid, const char *context)
+{
+ if (src_refid.rowid==-1||dst_refid.rowid==-1)
return false;
if (
- !bindIntParameter(xrefs_insert,":refid_src",refid_src) ||
- !bindIntParameter(xrefs_insert,":refid_dst",refid_dst) ||
- !bindIntParameter(xrefs_insert,":id_file",id_file) ||
- !bindIntParameter(xrefs_insert,":line",line) ||
- !bindIntParameter(xrefs_insert,":column",column)
+ !bindIntParameter(xrefs_insert,":src_rowid",src_refid.rowid) ||
+ !bindIntParameter(xrefs_insert,":dst_rowid",dst_refid.rowid)
)
{
return false;
}
+ else
+ {
+ bindTextParameter(xrefs_insert,":context",context);
+ }
step(xrefs_insert);
return true;
}
-static void insertMemberReference(const MemberDef *src, const MemberDef *dst)
+static void insertMemberReference(const MemberDef *src, const MemberDef *dst, const char *context)
{
- QCString qrefid_dst = dst->getOutputFileBase() + "_1" + dst->anchor();
- QCString qrefid_src = src->getOutputFileBase() + "_1" + src->anchor();
- if (dst->getStartBodyLine()!=-1 && dst->getBodyDef())
- {
- int refid_src = insertRefid(qrefid_src.data());
- int refid_dst = insertRefid(qrefid_dst.data());
- int id_file = insertFile("no-file"); // TODO: replace no-file with proper file
- insertMemberReference(refid_src,refid_dst,id_file,dst->getStartBodyLine(),-1);
- }
+ QCString qdst_refid = dst->getOutputFileBase() + "_1" + dst->anchor();
+ QCString qsrc_refid = src->getOutputFileBase() + "_1" + src->anchor();
+
+ struct Refid src_refid = insertRefid(qsrc_refid);
+ struct Refid dst_refid = insertRefid(qdst_refid);
+ insertMemberReference(src_refid,dst_refid,context);
}
-static void insertMemberFunctionParams(int id_memberdef, const MemberDef *md, const Definition *def)
+static void insertMemberFunctionParams(int memberdef_id, const MemberDef *md, const Definition *def)
{
ArgumentList *declAl = md->declArgumentList();
ArgumentList *defAl = md->argumentList();
- if (declAl!=0 && declAl->count()>0)
+ if (declAl!=0 && defAl!=0 && declAl->count()>0)
{
ArgumentListIterator declAli(*declAl);
ArgumentListIterator defAli(*defAl);
@@ -600,8 +1028,8 @@ static void insertMemberFunctionParams(int id_memberdef, const MemberDef *md, co
if (!a->attrib.isEmpty())
{
- bindTextParameter(params_select,":attributes",a->attrib.data());
- bindTextParameter(params_insert,":attributes",a->attrib.data());
+ bindTextParameter(param_select,":attributes",a->attrib);
+ bindTextParameter(param_insert,":attributes",a->attrib);
}
if (!a->type.isEmpty())
{
@@ -612,57 +1040,56 @@ static void insertMemberFunctionParams(int id_memberdef, const MemberDef *md, co
QCString *s;
while ((s=li.current()))
{
- QCString qrefid_src = md->getOutputFileBase() + "_1" + md->anchor();
- int refid_src = insertRefid(qrefid_src.data());
- int refid_dst = insertRefid(s->data());
- int id_file = insertFile(stripFromPath(def->getDefFileName()));
- insertMemberReference(refid_src,refid_dst,id_file,md->getDefLine(),-1);
+ QCString qsrc_refid = md->getOutputFileBase() + "_1" + md->anchor();
+ struct Refid src_refid = insertRefid(qsrc_refid);
+ struct Refid dst_refid = insertRefid(s->data());
+ insertMemberReference(src_refid,dst_refid, "argument");
++li;
}
- bindTextParameter(params_select,":type",a->type.data());
- bindTextParameter(params_insert,":type",a->type.data());
+ bindTextParameter(param_select,":type",a->type);
+ bindTextParameter(param_insert,":type",a->type);
}
if (!a->name.isEmpty())
{
- bindTextParameter(params_select,":declname",a->name.data());
- bindTextParameter(params_insert,":declname",a->name.data());
+ bindTextParameter(param_select,":declname",a->name);
+ bindTextParameter(param_insert,":declname",a->name);
}
if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
{
- bindTextParameter(params_select,":defname",defArg->name.data());
- bindTextParameter(params_insert,":defname",defArg->name.data());
+ bindTextParameter(param_select,":defname",defArg->name);
+ bindTextParameter(param_insert,":defname",defArg->name);
}
if (!a->array.isEmpty())
{
- bindTextParameter(params_select,":array",a->array.data());
- bindTextParameter(params_insert,":array",a->array.data());
+ bindTextParameter(param_select,":array",a->array);
+ bindTextParameter(param_insert,":array",a->array);
}
if (!a->defval.isEmpty())
{
StringList l;
linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval);
- bindTextParameter(params_select,":defval",a->defval.data());
- bindTextParameter(params_insert,":defval",a->defval.data());
+ bindTextParameter(param_select,":defval",a->defval);
+ bindTextParameter(param_insert,":defval",a->defval);
}
if (defArg) ++defAli;
- int id_param=step(params_select,TRUE,TRUE);
- if (id_param==0) {
- id_param=step(params_insert,TRUE);
+ int param_id=step(param_select,TRUE,TRUE);
+ if (param_id==0) {
+ param_id=step(param_insert,TRUE);
}
- if (id_param==-1) {
- msg("error INSERT params failed\n");
+ if (param_id==-1) {
+ DBG_CTX(("error INSERT params failed\n"));
continue;
}
- bindIntParameter(memberdef_params_insert,":id_memberdef",id_memberdef);
- bindIntParameter(memberdef_params_insert,":id_param",id_param);
- step(memberdef_params_insert);
+ bindIntParameter(memberdef_param_insert,":memberdef_id",memberdef_id);
+ bindIntParameter(memberdef_param_insert,":param_id",param_id);
+ step(memberdef_param_insert);
}
}
}
-static void insertMemberDefineParams(int id_memberdef,const MemberDef *md, const Definition *def)
+static void insertMemberDefineParams(int memberdef_id,const MemberDef *md, const Definition *def)
{
if (md->argumentList()->count()==0) // special case for "foo()" to
// disguish it from "foo".
@@ -675,20 +1102,34 @@ static void insertMemberDefineParams(int id_memberdef,const MemberDef *md, const
Argument *a;
for (ali.toFirst();(a=ali.current());++ali)
{
- bindTextParameter(params_insert,":defname",a->type.data());
- int id_param=step(params_insert,TRUE);
- if (id_param==-1) {
- msg("error INSERT param(%s) failed\n", a->type.data());
+ bindTextParameter(param_insert,":defname",a->type);
+ int param_id=step(param_insert,TRUE);
+ if (param_id==-1) {
continue;
}
- bindIntParameter(memberdef_params_insert,":id_memberdef",id_memberdef);
- bindIntParameter(memberdef_params_insert,":id_param",id_param);
- step(memberdef_params_insert);
+ bindIntParameter(memberdef_param_insert,":memberdef_id",memberdef_id);
+ bindIntParameter(memberdef_param_insert,":param_id",param_id);
+ step(memberdef_param_insert);
}
}
}
+static void associateMember(const MemberDef *md, struct Refid member_refid, struct Refid scope_refid)
+{
+ // TODO: skip EnumValue only to guard against recording refids and member records
+ // for enumvalues until we can support documenting them as entities.
+ if (md->memberType()==MemberType_EnumValue) return;
+ if (md->name().at(0)!='@') // skip anonymous members
+ {
+ bindIntParameter(member_insert, ":scope_rowid", scope_refid.rowid);
+ bindIntParameter(member_insert, ":memberdef_rowid", member_refid.rowid);
+
+ bindIntParameter(member_insert, ":prot", md->protection());
+ bindIntParameter(member_insert, ":virt", md->virtualness());
+ step(member_insert);
+ }
+}
static void stripQualifiers(QCString &typeStr)
{
@@ -720,22 +1161,28 @@ static int prepareStatement(sqlite3 *db, SqlStmt &s)
static int prepareStatements(sqlite3 *db)
{
if (
+ -1==prepareStatement(db, meta_insert) ||
+ -1==prepareStatement(db, memberdef_exists) ||
+ -1==prepareStatement(db, memberdef_incomplete) ||
-1==prepareStatement(db, memberdef_insert) ||
- -1==prepareStatement(db, files_insert) ||
- -1==prepareStatement(db, files_select) ||
- -1==prepareStatement(db, refids_insert) ||
- -1==prepareStatement(db, refids_select) ||
+ -1==prepareStatement(db, memberdef_update_def) ||
+ -1==prepareStatement(db, memberdef_update_decl) ||
+ -1==prepareStatement(db, member_insert) ||
+ -1==prepareStatement(db, path_insert) ||
+ -1==prepareStatement(db, path_select) ||
+ -1==prepareStatement(db, refid_insert) ||
+ -1==prepareStatement(db, refid_select) ||
-1==prepareStatement(db, incl_insert)||
-1==prepareStatement(db, incl_select)||
- -1==prepareStatement(db, params_insert) ||
- -1==prepareStatement(db, params_select) ||
+ -1==prepareStatement(db, param_insert) ||
+ -1==prepareStatement(db, param_select) ||
-1==prepareStatement(db, xrefs_insert) ||
- -1==prepareStatement(db, innerclass_insert) ||
+ -1==prepareStatement(db, reimplements_insert) ||
+ -1==prepareStatement(db, contains_insert) ||
+ -1==prepareStatement(db, compounddef_exists) ||
-1==prepareStatement(db, compounddef_insert) ||
- -1==prepareStatement(db, basecompoundref_insert) ||
- -1==prepareStatement(db, derivedcompoundref_insert) ||
- -1==prepareStatement(db, memberdef_params_insert)||
- -1==prepareStatement(db, innernamespace_insert)
+ -1==prepareStatement(db, compoundref_insert) ||
+ -1==prepareStatement(db, memberdef_param_insert)
)
{
return -1;
@@ -763,15 +1210,35 @@ static void pragmaTuning(sqlite3 *db)
sqlite3_exec(db, "PRAGMA temp_store = MEMORY;", NULL, NULL, &sErrMsg);
}
-static int initializeSchema(sqlite3* db)
+static int initializeTables(sqlite3* db)
+{
+ int rc;
+ sqlite3_stmt *stmt = 0;
+
+ msg("Initializing DB schema (tables)...\n");
+ for (unsigned int k = 0; k < sizeof(table_schema) / sizeof(table_schema[0]); k++)
+ {
+ const char *q = table_schema[k][1];
+ char *errmsg;
+ rc = sqlite3_exec(db, q, NULL, NULL, &errmsg);
+ if (rc != SQLITE_OK)
+ {
+ msg("failed to execute query: %s\n\t%s\n", q, errmsg);
+ return -1;
+ }
+ }
+ return 0;
+}
+
+static int initializeViews(sqlite3* db)
{
int rc;
sqlite3_stmt *stmt = 0;
- msg("Initializing DB schema...\n");
- for (unsigned int k = 0; k < sizeof(schema_queries) / sizeof(schema_queries[0]); k++)
+ msg("Initializing DB schema (views)...\n");
+ for (unsigned int k = 0; k < sizeof(view_schema) / sizeof(view_schema[0]); k++)
{
- const char *q = schema_queries[k][1];
+ const char *q = view_schema[k][1];
char *errmsg;
rc = sqlite3_exec(db, q, NULL, NULL, &errmsg);
if (rc != SQLITE_OK)
@@ -784,40 +1251,122 @@ static int initializeSchema(sqlite3* db)
}
////////////////////////////////////////////
-static void writeInnerClasses(const ClassSDict *cl)
+/* TODO:
+I collapsed all innerX tables into 'contains', which raises the prospect that
+all of these very similar writeInnerX funcs could be refactored into a one,
+or a small set of common parts.
+
+I think the hurdles are:
+- picking a first argument that every call location can pass
+- which yields a consistent iterator
+- accommodates PageDef's slightly different rules for generating the
+ inner_refid (unless I'm missing a method that would uniformly return
+ the correct refid for all types).
+*/
+static void writeInnerClasses(const ClassSDict *cl, struct Refid outer_refid)
{
if (!cl) return;
ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
+ const ClassDef *cd;
for (cli.toFirst();(cd=cli.current());++cli)
{
if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
{
- int refid = insertRefid(cd->getOutputFileBase());
- bindIntParameter(innerclass_insert,":refid", refid);
- bindIntParameter(innerclass_insert,":prot",cd->protection());
- bindTextParameter(innerclass_insert,":name",cd->name());
- step(innerclass_insert);
+ struct Refid inner_refid = insertRefid(cd->getOutputFileBase());
+
+ bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
+ step(contains_insert);
}
}
}
+static void writeInnerPages(const PageSDict *pl, struct Refid outer_refid)
+{
+ if (!pl) return;
+
+ PageSDict::Iterator pli(*pl);
+ const PageDef *pd;
+ for (pli.toFirst();(pd=pli.current());++pli)
+ {
+ struct Refid inner_refid = insertRefid(
+ pd->getGroupDef() ? pd->getOutputFileBase()+"_"+pd->name() : pd->getOutputFileBase()
+ );
+
+ bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
+ step(contains_insert);
-static void writeInnerNamespaces(const NamespaceSDict *nl)
+ }
+}
+
+static void writeInnerGroups(const GroupList *gl, struct Refid outer_refid)
+{
+ if (gl)
+ {
+ GroupListIterator gli(*gl);
+ const GroupDef *sgd;
+ for (gli.toFirst();(sgd=gli.current());++gli)
+ {
+ struct Refid inner_refid = insertRefid(sgd->getOutputFileBase());
+
+ bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
+ step(contains_insert);
+ }
+ }
+}
+
+static void writeInnerFiles(const FileList *fl, struct Refid outer_refid)
+{
+ if (fl)
+ {
+ QListIterator<FileDef> fli(*fl);
+ const FileDef *fd;
+ for (fli.toFirst();(fd=fli.current());++fli)
+ {
+ struct Refid inner_refid = insertRefid(fd->getOutputFileBase());
+
+ bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
+ step(contains_insert);
+ }
+ }
+}
+
+static void writeInnerDirs(const DirList *dl, struct Refid outer_refid)
+{
+ if (dl)
+ {
+ QListIterator<DirDef> subdirs(*dl);
+ const DirDef *subdir;
+ for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
+ {
+ struct Refid inner_refid = insertRefid(subdir->getOutputFileBase());
+
+ bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
+ step(contains_insert);
+ }
+ }
+}
+
+static void writeInnerNamespaces(const NamespaceSDict *nl, struct Refid outer_refid)
{
if (nl)
{
NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *nd;
+ const NamespaceDef *nd;
for (nli.toFirst();(nd=nli.current());++nli)
{
- if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
+ if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymous scopes
{
- int refid = insertRefid(nd->getOutputFileBase());
- bindIntParameter(innernamespace_insert,":refid",refid);
- bindTextParameter(innernamespace_insert,":name",nd->name(),FALSE);
- step(innernamespace_insert);
+ struct Refid inner_refid = insertRefid(nd->getOutputFileBase());
+
+ bindIntParameter(contains_insert,":inner_rowid",inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid",outer_refid.rowid);
+ step(contains_insert);
}
}
}
@@ -837,24 +1386,24 @@ static void writeTemplateArgumentList(const ArgumentList * al,
if (!a->type.isEmpty())
{
#warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
- bindTextParameter(params_select,":type",a->type);
- bindTextParameter(params_insert,":type",a->type);
+ bindTextParameter(param_select,":type",a->type);
+ bindTextParameter(param_insert,":type",a->type);
}
if (!a->name.isEmpty())
{
- bindTextParameter(params_select,":declname",a->name);
- bindTextParameter(params_insert,":declname",a->name);
- bindTextParameter(params_select,":defname",a->name);
- bindTextParameter(params_insert,":defname",a->name);
+ bindTextParameter(param_select,":declname",a->name);
+ bindTextParameter(param_insert,":declname",a->name);
+ bindTextParameter(param_select,":defname",a->name);
+ bindTextParameter(param_insert,":defname",a->name);
}
if (!a->defval.isEmpty())
{
#warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
- bindTextParameter(params_select,":defval",a->defval);
- bindTextParameter(params_insert,":defval",a->defval);
+ bindTextParameter(param_select,":defval",a->defval);
+ bindTextParameter(param_insert,":defval",a->defval);
}
- if (!step(params_select,TRUE,TRUE))
- step(params_insert);
+ if (!step(param_select,TRUE,TRUE))
+ step(param_insert);
}
}
}
@@ -871,15 +1420,132 @@ static void writeTemplateList(const ClassDef *cd)
{
writeTemplateArgumentList(cd->templateArguments(),cd,0);
}
+
+QCString getSQLDocBlock(const Definition *scope,
+ const Definition *def,
+ const QCString &doc,
+ const QCString &fileName,
+ int lineNr)
+{
+ QGString s;
+ if (doc.isEmpty()) return s.data();
+ FTextStream t(&s);
+ DocNode *root = validatingParseDoc(
+ fileName,
+ lineNr,
+ const_cast<Definition*>(scope),
+ const_cast<MemberDef*>(reinterpret_cast<const MemberDef*>(def)),
+ doc,
+ FALSE,
+ FALSE
+ );
+ XMLCodeGenerator codeGen(t);
+ // create a parse tree visitor for XML
+ XmlDocVisitor *visitor = new XmlDocVisitor(t,codeGen);
+ root->accept(visitor);
+ delete visitor;
+ delete root;
+ QCString result = convertCharEntitiesToUTF8(s.data());
+ return result.data();
+}
+
+static void getSQLDesc(SqlStmt &s,const char *col,const char *value,const Definition *def)
+{
+ bindTextParameter(
+ s,
+ col,
+ getSQLDocBlock(
+ def->getOuterScope(),
+ def,
+ value,
+ def->docFile(),
+ def->docLine()
+ ),
+ FALSE
+ );
+}
////////////////////////////////////////////
+/* (updated Sep 01 2018)
+DoxMemberKind and DoxCompoundKind (compound.xsd) gave me some
+faulty assumptions about "kind" strings, so I compiled a reference
+
+The XML schema claims:
+ DoxMemberKind: (14)
+ dcop define enum event friend function interface property prototype
+ service signal slot typedef variable
+
+ DoxCompoundKind: (17)
+ category class dir example exception file group interface module
+ namespace page protocol service singleton struct type union
+
+Member kind comes from MemberDef::memberTypeName()
+ types.h defines 14 MemberType_*s
+ _DCOP _Define _Enumeration _EnumValue _Event _Friend _Function _Interface
+ _Property _Service _Signal _Slot _Typedef _Variable
+ - xml doesn't include enumvalue here
+ (but renders enumvalue as) a sub-node of memberdef/templateparamlist
+ - xml includes 'prototype' that is unlisted here
+ vestigial? commented out in docsets.cpp and perlmodgen.cpp
+ MemberDef::memberTypeName() can return 15 strings:
+ (sorted by MemberType to match above; quoted because whitespace...)
+ "dcop" "macro definition" "enumeration" "enumvalue" "event" "friend"
+ "function" "interface" "property" "service" "signal" "slot" "typedef"
+ "variable"
+
+ Above describes potential values for memberdef.kind
+
+Compound kind is more complex. *Def::compoundTypeString()
+ ClassDef kind comes from ::compoundTypeString()
+ classdef.h defines 9 compound types
+ Category Class Exception Interface Protocol Service Singleton Struct Union
+ But ClassDef::compoundTypeString() "could" return 13 strings
+ - default "unknown" shouldn't actually return
+ - other 12 can vary by source language; see method for specifics
+ category class enum exception interface module protocol service
+ singleton struct type union
+
+ DirDef, FileDef, GroupDef have no method to return a string
+ tagfile/outputs hard-code kind to 'dir' 'file' or 'group'
+
+ NamespaceDef kind comes from ::compoundTypeString()
+ NamespaceDef::compoundTypeString() "could" return 6 strings
+ - default empty ("") string
+ - other 5 differ by source language
+ constants library module namespace package
+
+ PageDef also has no method to return a string
+ - some locations hard-code the kind to 'page'
+ - others conditionally output 'page' or 'example'
+
+ All together, that's 23 potential strings (21 excl "" and unknown)
+ "" category class constants dir enum example exception file group
+ interface library module namespace package page protocol service singleton
+ struct type union unknown
+
+ Above describes potential values for compounddef.kind
+
+For reference, there are 35 potential values of def.kind (33 excl "" and unknown):
+ "" "category" "class" "constants" "dcop" "dir" "enum" "enumeration"
+ "enumvalue" "event" "example" "exception" "file" "friend" "function" "group"
+ "interface" "library" "macro definition" "module" "namespace" "package"
+ "page" "property" "protocol" "service" "signal" "singleton" "slot" "struct"
+ "type" "typedef" "union" "unknown" "variable"
+
+This is relevant because the 'def' view generalizes memberdef and compounddef,
+and two member+compound kind strings (interface and service) overlap.
+
+I have no grasp of whether a real user docset would include one or more
+member and compound using the interface or service kind.
+*/
+
//////////////////////////////////////////////////////////////////////////////
-static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
+static void generateSqlite3ForMember(const MemberDef *md, struct Refid scope_refid, const Definition *def)
{
// + declaration/definition arg lists
// + reimplements
// + reimplementedBy
- // + exceptions
+ // - exceptions
// + const/volatile specifiers
// - examples
// + source definition
@@ -893,18 +1559,102 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
// enum values are written as part of the enum
if (md->memberType()==MemberType_EnumValue) return;
if (md->isHidden()) return;
- //if (md->name().at(0)=='@') return; // anonymous member
- // group members are only visible in their group
- //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
QCString memType;
// memberdef
QCString qrefid = md->getOutputFileBase() + "_1" + md->anchor();
- int refid = insertRefid(qrefid.data());
+ struct Refid refid = insertRefid(qrefid);
+
+ associateMember(md, refid, scope_refid);
+
+ // compacting duplicate defs
+ if(!refid.created && memberdefExists(refid) && memberdefIncomplete(refid, md))
+ {
+ /*
+ For performance, ideal to skip a member we've already added.
+ Unfortunately, we can have two memberdefs with the same refid documenting
+ the declaration and definition. memberdefIncomplete() uses the 'inline'
+ value to figure this out. Once we get to this point, we should *only* be
+ seeing the *other* type of def/decl, so we'll set inline to a new value (2),
+ indicating that this entry covers both inline types.
+ */
+ struct SqlStmt memberdef_update;
+
+ // definitions have bodyfile/start/end
+ if (md->getStartBodyLine()!=-1)
+ {
+ memberdef_update = memberdef_update_def;
+ int bodyfile_id = insertPath(md->getBodyDef()->absFilePath(),!md->getBodyDef()->isReference());
+ if (bodyfile_id == -1)
+ {
+ sqlite3_clear_bindings(memberdef_update.stmt);
+ }
+ else
+ {
+ bindIntParameter(memberdef_update,":bodyfile_id",bodyfile_id);
+ bindIntParameter(memberdef_update,":bodystart",md->getStartBodyLine());
+ bindIntParameter(memberdef_update,":bodyend",md->getEndBodyLine());
+ }
+ }
+ // declarations don't
+ else
+ {
+ memberdef_update = memberdef_update_decl;
+ if (md->getDefLine() != -1)
+ {
+ int file_id = insertPath(md->getDefFileName(),!md->isReference());
+ if (file_id!=-1)
+ {
+ bindIntParameter(memberdef_update,":file_id",file_id);
+ bindIntParameter(memberdef_update,":line",md->getDefLine());
+ bindIntParameter(memberdef_update,":column",md->getDefColumn());
+ }
+ }
+ }
- bindIntParameter(memberdef_insert,":refid", refid);
- bindIntParameter(memberdef_insert,":kind",md->memberType());
+ bindIntParameter(memberdef_update, ":rowid", refid.rowid);
+ // value 2 indicates we've seen "both" inline types.
+ bindIntParameter(memberdef_update,":inline", 2);
+
+ /* in case both are used, append/prepend descriptions */
+ getSQLDesc(memberdef_update,":briefdescription",md->briefDescription(),md);
+ getSQLDesc(memberdef_update,":detaileddescription",md->documentation(),md);
+ getSQLDesc(memberdef_update,":inbodydescription",md->inbodyDocumentation(),md);
+
+ step(memberdef_update,TRUE);
+
+ // don't think we need to repeat params; should have from first encounter
+
+ // + source references
+ // The cross-references in initializers only work when both the src and dst
+ // are defined.
+ MemberSDict *mdict = md->getReferencesMembers();
+ if (mdict!=0)
+ {
+ MemberSDict::IteratorDict mdi(*mdict);
+ const MemberDef *rmd;
+ for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ {
+ insertMemberReference(md,rmd, "inline");
+ }
+ }
+ // + source referenced by
+ mdict = md->getReferencedByMembers();
+ if (mdict!=0)
+ {
+ MemberSDict::IteratorDict mdi(*mdict);
+ const MemberDef *rmd;
+ for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ {
+ insertMemberReference(rmd,md, "inline");
+ }
+ }
+ return;
+ }
+
+ bindIntParameter(memberdef_insert,":rowid", refid.rowid);
+ bindTextParameter(memberdef_insert,":kind",md->memberTypeName(),FALSE);
bindIntParameter(memberdef_insert,":prot",md->protection());
bindIntParameter(memberdef_insert,":static",md->isStatic());
@@ -973,6 +1723,7 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
bindIntParameter(memberdef_insert,":settable",md->isSettable());
bindIntParameter(memberdef_insert,":privatesettable",md->isPrivateSettable());
bindIntParameter(memberdef_insert,":protectedsettable",md->isProtectedSettable());
+
if (md->isAssign() || md->isCopy() || md->isRetain()
|| md->isStrong() || md->isWeak())
{
@@ -995,6 +1746,18 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
bindIntParameter(memberdef_insert,":raisable",md->isRaisable());
}
+ const MemberDef *rmd = md->reimplements();
+ if(rmd)
+ {
+ QCString qreimplemented_refid = rmd->getOutputFileBase() + "_1" + rmd->anchor();
+
+ struct Refid reimplemented_refid = insertRefid(qreimplemented_refid);
+
+ bindIntParameter(reimplements_insert,":memberdef_rowid", refid.rowid);
+ bindIntParameter(reimplements_insert,":reimplemented_rowid", reimplemented_refid.rowid);
+ step(reimplements_insert,TRUE);
+ }
+
// + declaration/definition arg lists
if (md->memberType()!=MemberType_Define &&
md->memberType()!=MemberType_Enumeration
@@ -1008,9 +1771,9 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
stripQualifiers(typeStr);
StringList l;
linkifyText(TextGeneratorSqlite3Impl(l), def, md->getBodyDef(),md,typeStr);
- if (typeStr.data())
+ if (typeStr)
{
- bindTextParameter(memberdef_insert,":type",typeStr.data(),FALSE);
+ bindTextParameter(memberdef_insert,":type",typeStr,FALSE);
}
if (md->definition())
@@ -1029,7 +1792,7 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
// Extract references from initializer
if (md->hasMultiLineInitializer() || md->hasOneLineInitializer())
{
- bindTextParameter(memberdef_insert,":initializer",md->initializer().data());
+ bindTextParameter(memberdef_insert,":initializer",md->initializer());
StringList l;
linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,md->initializer());
@@ -1044,11 +1807,10 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
s->data(),
md->getBodyDef()->getDefFileName().data(),
md->getStartBodyLine()));
- QCString qrefid_src = md->getOutputFileBase() + "_1" + md->anchor();
- int refid_src = insertRefid(qrefid_src.data());
- int refid_dst = insertRefid(s->data());
- int id_file = insertFile(stripFromPath(md->getBodyDef()->getDefFileName()));
- insertMemberReference(refid_src,refid_dst,id_file,md->getStartBodyLine(),-1);
+ QCString qsrc_refid = md->getOutputFileBase() + "_1" + md->anchor();
+ struct Refid src_refid = insertRefid(qsrc_refid);
+ struct Refid dst_refid = insertRefid(s->data());
+ insertMemberReference(src_refid,dst_refid, "initializer");
}
++li;
}
@@ -1056,34 +1818,35 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
if ( md->getScopeString() )
{
- bindTextParameter(memberdef_insert,":scope",md->getScopeString().data(),FALSE);
+ bindTextParameter(memberdef_insert,":scope",md->getScopeString(),FALSE);
}
// +Brief, detailed and inbody description
- bindTextParameter(memberdef_insert,":briefdescription",md->briefDescription(),FALSE);
- bindTextParameter(memberdef_insert,":detaileddescription",md->documentation(),FALSE);
- bindTextParameter(memberdef_insert,":inbodydescription",md->inbodyDocumentation(),FALSE);
+ getSQLDesc(memberdef_insert,":briefdescription",md->briefDescription(),md);
+ getSQLDesc(memberdef_insert,":detaileddescription",md->documentation(),md);
+ getSQLDesc(memberdef_insert,":inbodydescription",md->inbodyDocumentation(),md);
// File location
if (md->getDefLine() != -1)
{
- int id_file = insertFile(stripFromPath(md->getDefFileName()));
- if (id_file!=-1)
+ int file_id = insertPath(md->getDefFileName(),!md->isReference());
+ if (file_id!=-1)
{
- bindIntParameter(memberdef_insert,":id_file",id_file);
+ bindIntParameter(memberdef_insert,":file_id",file_id);
bindIntParameter(memberdef_insert,":line",md->getDefLine());
bindIntParameter(memberdef_insert,":column",md->getDefColumn());
+ // definitions also have bodyfile/start/end
if (md->getStartBodyLine()!=-1)
{
- int id_bodyfile = insertFile(stripFromPath(md->getBodyDef()->absFilePath()));
- if (id_bodyfile == -1)
+ int bodyfile_id = insertPath(md->getBodyDef()->absFilePath(),!md->getBodyDef()->isReference());
+ if (bodyfile_id == -1)
{
sqlite3_clear_bindings(memberdef_insert.stmt);
}
else
{
- bindIntParameter(memberdef_insert,":id_bodyfile",id_bodyfile);
+ bindIntParameter(memberdef_insert,":bodyfile_id",bodyfile_id);
bindIntParameter(memberdef_insert,":bodystart",md->getStartBodyLine());
bindIntParameter(memberdef_insert,":bodyend",md->getEndBodyLine());
}
@@ -1091,16 +1854,16 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
}
}
- int id_memberdef=step(memberdef_insert,TRUE);
+ int memberdef_id=step(memberdef_insert,TRUE);
if (isFunc)
{
- insertMemberFunctionParams(id_memberdef,md,def);
+ insertMemberFunctionParams(memberdef_id,md,def);
}
else if (md->memberType()==MemberType_Define &&
md->argsString())
{
- insertMemberDefineParams(id_memberdef,md,def);
+ insertMemberDefineParams(memberdef_id,md,def);
}
// + source references
@@ -1110,10 +1873,10 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
if (mdict!=0)
{
MemberSDict::IteratorDict mdi(*mdict);
- MemberDef *rmd;
+ const MemberDef *rmd;
for (mdi.toFirst();(rmd=mdi.current());++mdi)
{
- insertMemberReference(md,rmd);//,mdi.currentKey());
+ insertMemberReference(md,rmd, "inline");
}
}
// + source referenced by
@@ -1121,62 +1884,79 @@ static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
if (mdict!=0)
{
MemberSDict::IteratorDict mdi(*mdict);
- MemberDef *rmd;
+ const MemberDef *rmd;
for (mdi.toFirst();(rmd=mdi.current());++mdi)
{
- insertMemberReference(rmd,md);//,mdi.currentKey());
+ insertMemberReference(rmd,md, "inline");
}
}
}
static void generateSqlite3Section( const Definition *d,
const MemberList *ml,
+ struct Refid scope_refid,
const char * /*kind*/,
const char * /*header*/=0,
const char * /*documentation*/=0)
{
if (ml==0) return;
MemberListIterator mli(*ml);
- MemberDef *md;
- int count=0;
+ const MemberDef *md;
+
for (mli.toFirst();(md=mli.current());++mli)
{
+ // TODO: necessary? just tracking what xmlgen does; xmlgen says:
// namespace members are also inserted in the file scope, but
// to prevent this duplication in the XML output, we filter those here.
if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
{
- count++;
+ generateSqlite3ForMember(md, scope_refid, d);
}
}
- if (count==0) return; // empty list
- for (mli.toFirst();(md=mli.current());++mli)
+}
+
+static void associateAllClassMembers(const ClassDef *cd, struct Refid scope_refid)
+{
+ if (cd->memberNameInfoSDict())
{
- // namespace members are also inserted in the file scope, but
- // to prevent this duplication in the XML output, we filter those here.
- //if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+ MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
+ MemberNameInfo *mni;
+ for (mnii.toFirst();(mni=mnii.current());++mnii)
{
- generateSqlite3ForMember(md,d);
+ MemberNameInfoIterator mii(*mni);
+ MemberInfo *mi;
+ for (mii.toFirst();(mi=mii.current());++mii)
+ {
+ MemberDef *md = mi->memberDef;
+ QCString qrefid = md->getOutputFileBase() + "_1" + md->anchor();
+ associateMember(md, insertRefid(qrefid), scope_refid);
+ }
}
}
}
-
+// many kinds: category class enum exception interface
+// module protocol service singleton struct type union
+// enum is Java only (and is distinct from enum memberdefs)
static void generateSqlite3ForClass(const ClassDef *cd)
{
+ // NOTE: Skeptical about XML's version of these
+ // 'x' marks missing items XML claims to include
+
+ // + brief description
+ // + detailed description
+ // + template argument list(s)
+ // + include file
+ // + member groups
+ // x inheritance DOT diagram
// + list of direct super classes
// + list of direct sub classes
- // + include file
// + list of inner classes
- // - template argument list(s)
- // + member groups
+ // x collaboration DOT diagram
// + list of all members
- // - brief description
- // - detailed description
- // - inheritance DOT diagram
- // - collaboration DOT diagram
- // - user defined member sections
- // - standard member sections
- // - detailed member documentation
+ // x user defined member sections
+ // x standard member sections
+ // x detailed member documentation
// - examples using the class
if (cd->isReference()) return; // skip external references.
@@ -1184,43 +1964,86 @@ static void generateSqlite3ForClass(const ClassDef *cd)
if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
if (cd->templateMaster()!=0) return; // skip generated template instances.
- msg("Generating Sqlite3 output for class %s\n",cd->name().data());
+ struct Refid refid = insertRefid(cd->getOutputFileBase());
+
+ // can omit a class that already has a refid
+ if(!refid.created && compounddefExists(refid)){return;}
+
+ bindIntParameter(compounddef_insert,":rowid", refid.rowid);
bindTextParameter(compounddef_insert,":name",cd->name());
+ bindTextParameter(compounddef_insert,":title",cd->title(), FALSE);
bindTextParameter(compounddef_insert,":kind",cd->compoundTypeString(),FALSE);
bindIntParameter(compounddef_insert,":prot",cd->protection());
- int refid = insertRefid(cd->getOutputFileBase());
- bindIntParameter(compounddef_insert,":refid", refid);
- int id_file = insertFile(stripFromPath(cd->getDefFileName()));
- bindIntParameter(compounddef_insert,":id_file",id_file);
+ int file_id = insertPath(cd->getDefFileName());
+ bindIntParameter(compounddef_insert,":file_id",file_id);
bindIntParameter(compounddef_insert,":line",cd->getDefLine());
bindIntParameter(compounddef_insert,":column",cd->getDefColumn());
+ // + include file
+ /*
+ TODO: I wonder if this can actually be cut (just here)
+
+ We were adding this "include" to the "includes" table alongside
+ other includes (from a FileDef). However, FileDef and ClassDef are using
+ "includes" nodes in very a different way:
+ - With FileDef, it means the file includes another.
+ - With ClassDef, it means you should include this file to use this class.
+
+ Because of this difference, I added a column to compounddef, header_id, and
+ linked it back to the appropriate file. We could just add a nullable text
+ column that would hold a string equivalent to what the HTML docs include,
+ but the logic for generating it is embedded in
+ ClassDef::writeIncludeFiles(OutputList &ol).
+
+ That said, at least on the handful of test sets I have, header_id == file_id,
+ suggesting it could be cut and clients might be able to reconstruct it from
+ other values if there's a solid heuristic for *when a class will
+ have a header file*.
+ */
+ IncludeInfo *ii=cd->includeInfo();
+ if (ii)
+ {
+ QCString nm = ii->includeName;
+ if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
+ if (!nm.isEmpty())
+ {
+ int header_id=insertPath(ii->fileDef->absFilePath(),!ii->fileDef->isReference());
+ DBG_CTX(("-----> ClassDef includeInfo for %s\n", nm.data()));
+ DBG_CTX((" local : %d\n", ii->local));
+ DBG_CTX((" imported : %d\n", ii->imported));
+ DBG_CTX((" indirect : %d\n", ii->indirect));
+ DBG_CTX(("header: %s\n", ii->fileDef->absFilePath().data()));
+ DBG_CTX((" file_id : %d\n", file_id));
+ DBG_CTX((" header_id: %d\n", header_id));
+
+ if(header_id!=-1)
+ {
+ bindIntParameter(compounddef_insert,":header_id",header_id);
+ }
+ }
+ }
+
+ getSQLDesc(compounddef_insert,":briefdescription",cd->briefDescription(),cd);
+ getSQLDesc(compounddef_insert,":detaileddescription",cd->documentation(),cd);
+
step(compounddef_insert);
// + list of direct super classes
if (cd->baseClasses())
{
BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
+ const BaseClassDef *bcd;
for (bcli.toFirst();(bcd=bcli.current());++bcli)
{
- int refid = insertRefid(bcd->classDef->getOutputFileBase());
- bindIntParameter(basecompoundref_insert,":refid", refid);
- bindIntParameter(basecompoundref_insert,":prot",bcd->prot);
- bindIntParameter(basecompoundref_insert,":virt",bcd->virt);
-
- if (!bcd->templSpecifiers.isEmpty())
- {
- bindTextParameter(basecompoundref_insert,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers),FALSE);
- }
- else
- {
- bindTextParameter(basecompoundref_insert,":base",bcd->classDef->displayName(),FALSE);
- }
- bindTextParameter(basecompoundref_insert,":derived",cd->displayName(),FALSE);
- step(basecompoundref_insert);
+ struct Refid base_refid = insertRefid(bcd->classDef->getOutputFileBase());
+ struct Refid derived_refid = insertRefid(cd->getOutputFileBase());
+ bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
+ bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
+ bindIntParameter(compoundref_insert,":prot",bcd->prot);
+ bindIntParameter(compoundref_insert,":virt",bcd->virt);
+ step(compoundref_insert);
}
}
@@ -1228,54 +2051,23 @@ static void generateSqlite3ForClass(const ClassDef *cd)
if (cd->subClasses())
{
BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
+ const BaseClassDef *bcd;
for (bcli.toFirst();(bcd=bcli.current());++bcli)
{
- bindTextParameter(derivedcompoundref_insert,":base",cd->displayName(),FALSE);
- if (!bcd->templSpecifiers.isEmpty())
- {
- bindTextParameter(derivedcompoundref_insert,":derived",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers),FALSE);
- }
- else
- {
- bindTextParameter(derivedcompoundref_insert,":derived",bcd->classDef->displayName(),FALSE);
- }
- int refid = insertRefid(bcd->classDef->getOutputFileBase());
- bindIntParameter(derivedcompoundref_insert,":refid", refid);
- bindIntParameter(derivedcompoundref_insert,":prot",bcd->prot);
- bindIntParameter(derivedcompoundref_insert,":virt",bcd->virt);
- step(derivedcompoundref_insert);
+ struct Refid derived_refid = insertRefid(bcd->classDef->getOutputFileBase());
+ struct Refid base_refid = insertRefid(cd->getOutputFileBase());
+ bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
+ bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
+ bindIntParameter(compoundref_insert,":prot",bcd->prot);
+ bindIntParameter(compoundref_insert,":virt",bcd->virt);
+ step(compoundref_insert);
}
}
- // + include file
- IncludeInfo *ii=cd->includeInfo();
- if (ii)
- {
- QCString nm = ii->includeName;
- if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
- if (!nm.isEmpty())
- {
- int id_dst=insertFile(nm);
- if (id_dst!=-1) {
- bindIntParameter(incl_select,":local",ii->local);
- bindIntParameter(incl_select,":id_src",id_file);
- bindIntParameter(incl_select,":id_dst",id_dst);
- int count=step(incl_select,TRUE,TRUE);
- if (count==0)
- {
- bindIntParameter(incl_insert,":local",ii->local);
- bindIntParameter(incl_insert,":id_src",id_file);
- bindIntParameter(incl_insert,":id_dst",id_dst);
- step(incl_insert);
- }
- }
- }
- }
// + list of inner classes
- writeInnerClasses(cd->getClassSDict());
+ writeInnerClasses(cd->getClassSDict(),refid);
- // - template argument list(s)
+ // + template argument list(s)
writeTemplateList(cd);
// + member groups
@@ -1285,41 +2077,62 @@ static void generateSqlite3ForClass(const ClassDef *cd)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
- generateSqlite3Section(cd,mg->members(),"user-defined",mg->header(),
+ generateSqlite3Section(cd,mg->members(),refid,"user-defined",mg->header(),
mg->documentation());
}
}
- // + list of all members
+ // this is just a list of *local* members
QListIterator<MemberList> mli(cd->getMemberLists());
MemberList *ml;
for (mli.toFirst();(ml=mli.current());++mli)
{
if ((ml->listType()&MemberListType_detailedLists)==0)
{
- generateSqlite3Section(cd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+ generateSqlite3Section(cd,ml,refid,"user-defined");
}
}
+
+ // + list of all members
+ associateAllClassMembers(cd, refid);
}
+// kinds: constants library module namespace package
static void generateSqlite3ForNamespace(const NamespaceDef *nd)
{
// + contained class definitions
// + contained namespace definitions
// + member groups
// + normal members
- // - brief desc
- // - detailed desc
- // - location
+ // + brief desc
+ // + detailed desc
+ // + location (file_id, line, column)
// - files containing (parts of) the namespace definition
if (nd->isReference() || nd->isHidden()) return; // skip external references
+ struct Refid refid = insertRefid(nd->getOutputFileBase());
+ if(!refid.created && compounddefExists(refid)){return;}
+ bindIntParameter(compounddef_insert,":rowid", refid.rowid);
+
+ bindTextParameter(compounddef_insert,":name",nd->name());
+ bindTextParameter(compounddef_insert,":title",nd->title(), FALSE);
+ bindTextParameter(compounddef_insert,":kind","namespace",FALSE);
+
+ int file_id = insertPath(nd->getDefFileName());
+ bindIntParameter(compounddef_insert,":file_id",file_id);
+ bindIntParameter(compounddef_insert,":line",nd->getDefLine());
+ bindIntParameter(compounddef_insert,":column",nd->getDefColumn());
+
+ getSQLDesc(compounddef_insert,":briefdescription",nd->briefDescription(),nd);
+ getSQLDesc(compounddef_insert,":detaileddescription",nd->documentation(),nd);
+
+ step(compounddef_insert);
// + contained class definitions
- writeInnerClasses(nd->getClassSDict());
+ writeInnerClasses(nd->getClassSDict(),refid);
// + contained namespace definitions
- writeInnerNamespaces(nd->getNamespaceSDict());
+ writeInnerNamespaces(nd->getNamespaceSDict(),refid);
// + member groups
if (nd->getMemberGroupSDict())
@@ -1328,7 +2141,7 @@ static void generateSqlite3ForNamespace(const NamespaceDef *nd)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
- generateSqlite3Section(nd,mg->members(),"user-defined",mg->header(),
+ generateSqlite3Section(nd,mg->members(),refid,"user-defined",mg->header(),
mg->documentation());
}
}
@@ -1340,29 +2153,48 @@ static void generateSqlite3ForNamespace(const NamespaceDef *nd)
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
- generateSqlite3Section(nd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+ generateSqlite3Section(nd,ml,refid,"user-defined");
}
}
}
+// kind: file
static void generateSqlite3ForFile(const FileDef *fd)
{
// + includes files
// + includedby files
- // - include graph
- // - included by graph
+ // x include graph
+ // x included by graph
// + contained class definitions
// + contained namespace definitions
// + member groups
// + normal members
- // - brief desc
- // - detailed desc
- // - source code
- // - location
+ // + brief desc
+ // + detailed desc
+ // x source code
+ // + location (file_id, line, column)
// - number of lines
if (fd->isReference()) return; // skip external references
+ struct Refid refid = insertRefid(fd->getOutputFileBase());
+ if(!refid.created && compounddefExists(refid)){return;}
+ bindIntParameter(compounddef_insert,":rowid", refid.rowid);
+
+ bindTextParameter(compounddef_insert,":name",fd->name(),FALSE);
+ bindTextParameter(compounddef_insert,":title",fd->title(),FALSE);
+ bindTextParameter(compounddef_insert,":kind","file",FALSE);
+
+ int file_id = insertPath(fd->getDefFileName());
+ bindIntParameter(compounddef_insert,":file_id",file_id);
+ bindIntParameter(compounddef_insert,":line",fd->getDefLine());
+ bindIntParameter(compounddef_insert,":column",fd->getDefColumn());
+
+ getSQLDesc(compounddef_insert,":briefdescription",fd->briefDescription(),fd);
+ getSQLDesc(compounddef_insert,":detaileddescription",fd->documentation(),fd);
+
+ step(compounddef_insert);
+
// + includes files
IncludeInfo *ii;
if (fd->includeFileList())
@@ -1370,15 +2202,48 @@ static void generateSqlite3ForFile(const FileDef *fd)
QListIterator<IncludeInfo> ili(*fd->includeFileList());
for (ili.toFirst();(ii=ili.current());++ili)
{
- int id_src=insertFile(fd->absFilePath().data());
- int id_dst=insertFile(ii->includeName.data());
+ int src_id=insertPath(fd->absFilePath(),!fd->isReference());
+ int dst_id;
+ QCString dst_path;
+
+ if(ii->fileDef) // found file
+ {
+ if(ii->fileDef->isReference())
+ {
+ // strip tagfile from path
+ QCString tagfile = ii->fileDef->getReference();
+ dst_path = ii->fileDef->absFilePath().copy();
+ dst_path.stripPrefix(tagfile+":");
+ }
+ else
+ {
+ dst_path = ii->fileDef->absFilePath();
+ }
+ dst_id = insertPath(dst_path,ii->local);
+ }
+ else // can't find file
+ {
+ dst_id = insertPath(ii->includeName,ii->local,FALSE);
+ }
+
+ DBG_CTX(("-----> FileDef includeInfo for %s\n", ii->includeName.data()));
+ DBG_CTX((" local: %d\n", ii->local));
+ DBG_CTX((" imported: %d\n", ii->imported));
+ DBG_CTX((" indirect: %d\n", ii->indirect));
+ if(ii->fileDef)
+ {
+ DBG_CTX(("include: %s\n", ii->fileDef->absFilePath().data()));
+ }
+ DBG_CTX((" src_id : %d\n", src_id));
+ DBG_CTX((" dst_id: %d\n", dst_id));
+
bindIntParameter(incl_select,":local",ii->local);
- bindIntParameter(incl_select,":id_src",id_src);
- bindIntParameter(incl_select,":id_dst",id_dst);
+ bindIntParameter(incl_select,":src_id",src_id);
+ bindIntParameter(incl_select,":dst_id",dst_id);
if (step(incl_select,TRUE,TRUE)==0) {
bindIntParameter(incl_insert,":local",ii->local);
- bindIntParameter(incl_insert,":id_src",id_src);
- bindIntParameter(incl_insert,":id_dst",id_dst);
+ bindIntParameter(incl_insert,":src_id",src_id);
+ bindIntParameter(incl_insert,":dst_id",dst_id);
step(incl_insert);
}
}
@@ -1390,15 +2255,37 @@ static void generateSqlite3ForFile(const FileDef *fd)
QListIterator<IncludeInfo> ili(*fd->includedByFileList());
for (ili.toFirst();(ii=ili.current());++ili)
{
- int id_src=insertFile(ii->includeName);
- int id_dst=insertFile(fd->absFilePath());
+ int dst_id=insertPath(fd->absFilePath(),!fd->isReference());
+ int src_id;
+ QCString src_path;
+
+ if(ii->fileDef) // found file
+ {
+ if(ii->fileDef->isReference())
+ {
+ // strip tagfile from path
+ QCString tagfile = ii->fileDef->getReference();
+ src_path = ii->fileDef->absFilePath().copy();
+ src_path.stripPrefix(tagfile+":");
+ }
+ else
+ {
+ src_path = ii->fileDef->absFilePath();
+ }
+ src_id = insertPath(src_path,ii->local);
+ }
+ else // can't find file
+ {
+ src_id = insertPath(ii->includeName,ii->local,FALSE);
+ }
+
bindIntParameter(incl_select,":local",ii->local);
- bindIntParameter(incl_select,":id_src",id_src);
- bindIntParameter(incl_select,":id_dst",id_dst);
+ bindIntParameter(incl_select,":src_id",src_id);
+ bindIntParameter(incl_select,":dst_id",dst_id);
if (step(incl_select,TRUE,TRUE)==0) {
bindIntParameter(incl_insert,":local",ii->local);
- bindIntParameter(incl_insert,":id_src",id_src);
- bindIntParameter(incl_insert,":id_dst",id_dst);
+ bindIntParameter(incl_insert,":src_id",src_id);
+ bindIntParameter(incl_insert,":dst_id",dst_id);
step(incl_insert);
}
}
@@ -1407,13 +2294,13 @@ static void generateSqlite3ForFile(const FileDef *fd)
// + contained class definitions
if (fd->getClassSDict())
{
- writeInnerClasses(fd->getClassSDict());
+ writeInnerClasses(fd->getClassSDict(),refid);
}
// + contained namespace definitions
if (fd->getNamespaceSDict())
{
- writeInnerNamespaces(fd->getNamespaceSDict());
+ writeInnerNamespaces(fd->getNamespaceSDict(),refid);
}
// + member groups
@@ -1423,7 +2310,7 @@ static void generateSqlite3ForFile(const FileDef *fd)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
- generateSqlite3Section(fd,mg->members(),"user-defined",mg->header(),
+ generateSqlite3Section(fd,mg->members(),refid,"user-defined",mg->header(),
mg->documentation());
}
}
@@ -1435,24 +2322,201 @@ static void generateSqlite3ForFile(const FileDef *fd)
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
- generateSqlite3Section(fd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+ generateSqlite3Section(fd,ml,refid,"user-defined");
}
}
}
+// kind: group
static void generateSqlite3ForGroup(const GroupDef *gd)
{
-#warning WorkInProgress
+ // + members
+ // + member groups
+ // + files
+ // + classes
+ // + namespaces
+ // - packages
+ // + pages
+ // + child groups
+ // - examples
+ // + brief description
+ // + detailed description
+
+ if (gd->isReference()) return; // skip external references.
+
+ struct Refid refid = insertRefid(gd->getOutputFileBase());
+ if(!refid.created && compounddefExists(refid)){return;}
+ bindIntParameter(compounddef_insert,":rowid", refid.rowid);
+
+ bindTextParameter(compounddef_insert,":name",gd->name());
+ bindTextParameter(compounddef_insert,":title",gd->groupTitle(), FALSE);
+ bindTextParameter(compounddef_insert,":kind","group",FALSE);
+
+ int file_id = insertPath(gd->getDefFileName());
+ bindIntParameter(compounddef_insert,":file_id",file_id);
+ bindIntParameter(compounddef_insert,":line",gd->getDefLine());
+ bindIntParameter(compounddef_insert,":column",gd->getDefColumn());
+
+ getSQLDesc(compounddef_insert,":briefdescription",gd->briefDescription(),gd);
+ getSQLDesc(compounddef_insert,":detaileddescription",gd->documentation(),gd);
+
+ step(compounddef_insert);
+
+ // + files
+ writeInnerFiles(gd->getFiles(),refid);
+
+ // + classes
+ writeInnerClasses(gd->getClasses(),refid);
+
+ // + namespaces
+ writeInnerNamespaces(gd->getNamespaces(),refid);
+
+ // + pages
+ writeInnerPages(gd->getPages(),refid);
+
+ // + groups
+ writeInnerGroups(gd->getSubGroups(),refid);
+
+ // + member groups
+ if (gd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateSqlite3Section(gd,mg->members(),refid,"user-defined",mg->header(),
+ mg->documentation());
+ }
+ }
+
+ // + members
+ QListIterator<MemberList> mli(gd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_declarationLists)!=0)
+ {
+ generateSqlite3Section(gd,ml,refid,"user-defined");
+ }
+ }
}
+// kind: dir
static void generateSqlite3ForDir(const DirDef *dd)
{
-#warning WorkInProgress
+ // + dirs
+ // + files
+ // + briefdescription
+ // + detaileddescription
+ // + location (below uses file_id, line, column; XML just uses file)
+ if (dd->isReference()) return; // skip external references
+
+ struct Refid refid = insertRefid(dd->getOutputFileBase());
+ if(!refid.created && compounddefExists(refid)){return;}
+ bindIntParameter(compounddef_insert,":rowid", refid.rowid);
+
+ bindTextParameter(compounddef_insert,":name",dd->displayName());
+ bindTextParameter(compounddef_insert,":kind","dir",FALSE);
+
+ int file_id = insertPath(dd->getDefFileName(),TRUE,TRUE,2);
+ bindIntParameter(compounddef_insert,":file_id",file_id);
+
+ /*
+ line and column are weird here, but:
+ - dir goes into compounddef with all of the others
+ - the semantics would be fine if we set them to NULL here
+ - but defining line and column as NOT NULL is an important promise
+ for other compounds, so I don't want to loosen it
+
+ For reference, the queries return 1.
+ 0 or -1 make more sense, but I see that as a change for DirDef.
+ */
+ bindIntParameter(compounddef_insert,":line",dd->getDefLine());
+ bindIntParameter(compounddef_insert,":column",dd->getDefColumn());
+
+ getSQLDesc(compounddef_insert,":briefdescription",dd->briefDescription(),dd);
+ getSQLDesc(compounddef_insert,":detaileddescription",dd->documentation(),dd);
+
+ step(compounddef_insert);
+
+ // + files
+ writeInnerDirs(&dd->subDirs(),refid);
+
+ // + files
+ writeInnerFiles(dd->getFiles(),refid);
}
+// kinds: page, example
static void generateSqlite3ForPage(const PageDef *pd,bool isExample)
{
-#warning WorkInProgress
+ // + name
+ // + title
+ // + brief description
+ // + documentation (detailed description)
+ // + inbody documentation
+ // + sub pages
+ if (pd->isReference()) return; // skip external references.
+
+ // TODO: do we more special handling if isExample?
+
+ QCString qrefid = pd->getOutputFileBase();
+ if (pd->getGroupDef())
+ {
+ qrefid+=(QCString)"_"+pd->name();
+ }
+ if (qrefid=="index") qrefid="indexpage"; // to prevent overwriting the generated index page.
+
+ struct Refid refid = insertRefid(qrefid);
+
+ // can omit a page that already has a refid
+ if(!refid.created && compounddefExists(refid)){return;}
+
+ bindIntParameter(compounddef_insert,":rowid",refid.rowid);
+ // + name
+ bindTextParameter(compounddef_insert,":name",pd->name());
+
+ QCString title;
+ if (pd==Doxygen::mainPage) // main page is special
+ {
+ if (!pd->title().isEmpty() && pd->title().lower()!="notitle")
+ {
+ title = filterTitle(convertCharEntitiesToUTF8(Doxygen::mainPage->title()));
+ }
+ else
+ {
+ title = Config_getString(PROJECT_NAME);
+ }
+ }
+ else
+ {
+ SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+ if (si)
+ {
+ title = si->title;
+ }
+
+ if(!title){title = pd->title();}
+ }
+
+ // + title
+ bindTextParameter(compounddef_insert,":title",title,FALSE);
+
+ bindTextParameter(compounddef_insert,":kind", isExample ? "example" : "page");
+
+ int file_id = insertPath(pd->getDefFileName());
+
+ bindIntParameter(compounddef_insert,":file_id",file_id);
+ bindIntParameter(compounddef_insert,":line",pd->getDefLine());
+ bindIntParameter(compounddef_insert,":column",pd->getDefColumn());
+
+ // + brief description
+ getSQLDesc(compounddef_insert,":briefdescription",pd->briefDescription(),pd);
+ // + documentation (detailed description)
+ getSQLDesc(compounddef_insert,":detaileddescription",pd->documentation(),pd);
+
+ step(compounddef_insert);
+ // + sub pages
+ writeInnerPages(pd->getSubPages(),refid);
}
@@ -1463,6 +2527,7 @@ static sqlite3* openDbConnection()
QDir sqlite3Dir(outputDirectory);
sqlite3 *db;
int rc;
+ struct stat buf;
rc = sqlite3_initialize();
if (rc != SQLITE_OK)
@@ -1470,7 +2535,21 @@ static sqlite3* openDbConnection()
msg("sqlite3_initialize failed\n");
return NULL;
}
- rc = sqlite3_open_v2(outputDirectory+"/doxygen_sqlite3.db", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
+
+
+ if (stat (outputDirectory+"/doxygen_sqlite3.db", &buf) == 0)
+ {
+ msg("doxygen_sqlite3.db already exists! aborting sqlite3 output generation!\n");
+ msg("If you wish to re-generate the database, remove or archive the existing copy first.\n");
+ return NULL;
+ }
+
+ rc = sqlite3_open_v2(
+ outputDirectory+"/doxygen_sqlite3.db",
+ &db,
+ SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
+ 0
+ );
if (rc != SQLITE_OK)
{
sqlite3_close(db);
@@ -1497,10 +2576,16 @@ void generateSqlite3()
{
return;
}
+
+# ifdef SQLITE3_DEBUG
+ // debug: show all executed statements
+ sqlite3_trace(db, &sqlLog, NULL);
+# endif
+
beginTransaction(db);
pragmaTuning(db);
- if (-1==initializeSchema(db))
+ if (-1==initializeTables(db))
return;
if ( -1 == prepareStatements(db) )
@@ -1509,9 +2594,11 @@ void generateSqlite3()
return;
}
+ recordMetadata();
+
// + classes
ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
+ const ClassDef *cd;
for (cli.toFirst();(cd=cli.current());++cli)
{
msg("Generating Sqlite3 output for class %s\n",cd->name().data());
@@ -1520,7 +2607,7 @@ void generateSqlite3()
// + namespaces
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
+ const NamespaceDef *nd;
for (nli.toFirst();(nd=nli.current());++nli)
{
msg("Generating Sqlite3 output for namespace %s\n",nd->name().data());
@@ -1533,7 +2620,7 @@ void generateSqlite3()
for (;(fn=fnli.current());++fnli)
{
FileNameIterator fni(*fn);
- FileDef *fd;
+ const FileDef *fd;
for (;(fd=fni.current());++fni)
{
msg("Generating Sqlite3 output for file %s\n",fd->name().data());
@@ -1543,7 +2630,7 @@ void generateSqlite3()
// + groups
GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
+ const GroupDef *gd;
for (;(gd=gli.current());++gli)
{
msg("Generating Sqlite3 output for group %s\n",gd->name().data());
@@ -1553,7 +2640,7 @@ void generateSqlite3()
// + page
{
PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
+ const PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
msg("Generating Sqlite3 output for page %s\n",pd->name().data());
@@ -1563,7 +2650,7 @@ void generateSqlite3()
// + dirs
{
- DirDef *dir;
+ const DirDef *dir;
DirSDict::Iterator sdi(*Doxygen::directories);
for (sdi.toFirst();(dir=sdi.current());++sdi)
{
@@ -1575,7 +2662,7 @@ void generateSqlite3()
// + examples
{
PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=0;
+ const PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
msg("Generating Sqlite3 output for example %s\n",pd->name().data());
@@ -1590,6 +2677,11 @@ void generateSqlite3()
generateSqlite3ForPage(Doxygen::mainPage,FALSE);
}
+ // TODO: copied from initializeSchema; not certain if we should say/do more
+ // if there's a failure here?
+ if (-1==initializeViews(db))
+ return;
+
endTransaction(db);
}
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index cf64a35..45543de 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -18,6 +18,7 @@
#include "tagreader.h"
+#include <assert.h>
#include <stdio.h>
#include <stdarg.h>
@@ -39,6 +40,7 @@
#include "filedef.h"
#include "filename.h"
#include "section.h"
+#include "groupdef.h"
/** Information about an linkable anchor */
class TagAnchorInfo
@@ -95,12 +97,13 @@ class TagMemberInfo
class TagClassInfo
{
public:
- enum Kind { Class, Struct, Union, Interface, Exception, Protocol, Category, Enum, Service, Singleton };
- TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; }
+ enum Kind { None=-1, Class, Struct, Union, Interface, Exception, Protocol, Category, Enum, Service, Singleton };
+ TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; kind = None; }
~TagClassInfo() { delete bases; delete templateArguments; }
QCString name;
QCString filename;
QCString clangId;
+ QCString anchor;
TagAnchorInfoList docAnchors;
QList<BaseInfo> *bases;
QList<TagMemberInfo> members;
@@ -381,7 +384,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unknown compound attribute `%s' found!\n",kind.data());
+ warn("Unknown compound attribute `%s' found!",kind.data());
m_state = Invalid;
}
if (isObjC=="yes" && m_curClass)
@@ -409,7 +412,7 @@ class TagFileParser : public QXmlDefaultHandler
case InPackage: m_tagFilePackages.append(m_curPackage);
m_curPackage=0; break;
default:
- warn("tag `compound' was not expected!\n");
+ warn("tag `compound' was not expected!");
}
}
@@ -455,7 +458,7 @@ class TagFileParser : public QXmlDefaultHandler
case InNamespace: m_curNamespace->members.append(m_curMember); break;
case InGroup: m_curGroup->members.append(m_curMember); break;
case InPackage: m_curPackage->members.append(m_curMember); break;
- default: warn("Unexpected tag `member' found\n"); break;
+ default: warn("Unexpected tag `member' found"); break;
}
}
@@ -473,7 +476,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Found enumvalue tag outside of member tag\n");
+ warn("Found `enumvalue' tag outside of member tag");
}
}
@@ -501,7 +504,7 @@ class TagFileParser : public QXmlDefaultHandler
case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
- default: warn("Unexpected tag `member' found\n"); break;
+ default: warn("Unexpected tag `docanchor' found"); break;
}
}
@@ -514,7 +517,7 @@ class TagFileParser : public QXmlDefaultHandler
case InNamespace: m_curNamespace->classList.append(m_curString); break;
case InGroup: m_curGroup->classList.append(m_curString); break;
case InPackage: m_curPackage->classList.append(m_curString); break;
- default: warn("Unexpected tag `class' found\n"); break;
+ default: warn("Unexpected tag `class' found"); break;
}
}
@@ -525,7 +528,7 @@ class TagFileParser : public QXmlDefaultHandler
case InNamespace: m_curNamespace->classList.append(m_curString); break;
case InFile: m_curFile->namespaceList.append(m_curString); break;
case InGroup: m_curGroup->namespaceList.append(m_curString); break;
- default: warn("Unexpected tag `namespace' found\n"); break;
+ default: warn("Unexpected tag `namespace' found"); break;
}
}
@@ -535,7 +538,7 @@ class TagFileParser : public QXmlDefaultHandler
{
case InGroup: m_curGroup->fileList.append(m_curString); break;
case InDir: m_curDir->fileList.append(m_curString); break;
- default: warn("Unexpected tag `file' found\n"); break;
+ default: warn("Unexpected tag `file' found"); break;
}
}
@@ -544,7 +547,7 @@ class TagFileParser : public QXmlDefaultHandler
switch(m_state)
{
case InGroup: m_curGroup->fileList.append(m_curString); break;
- default: warn("Unexpected tag `page' found\n"); break;
+ default: warn("Unexpected tag `page' found"); break;
}
}
@@ -553,7 +556,7 @@ class TagFileParser : public QXmlDefaultHandler
switch(m_state)
{
case InDir: m_curDir->subdirList.append(m_curString); break;
- default: warn("Unexpected tag `page' found\n"); break;
+ default: warn("Unexpected tag `dir' found"); break;
}
}
@@ -577,7 +580,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unexpected tag `type' found\n");
+ warn("Unexpected tag `type' found");
}
}
@@ -593,7 +596,7 @@ class TagFileParser : public QXmlDefaultHandler
case InDir: m_curDir->name = m_curString; break;
case InMember: m_curMember->name = m_curString; break;
case InPackage: m_curPackage->name = m_curString; break;
- default: warn("Unexpected tag `name' found\n"); break;
+ default: warn("Unexpected tag `name' found"); break;
}
}
@@ -627,7 +630,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unexpected tag `base' found\n");
+ warn("Unexpected tag `base' found");
}
}
@@ -639,7 +642,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unexpected tag `base' found\n");
+ warn("Unexpected tag `base' found");
}
}
@@ -656,7 +659,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unexpected tag `includes' found\n");
+ warn("Unexpected tag `includes' found");
}
m_curString="";
}
@@ -679,7 +682,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unexpected tag `templarg' found\n");
+ warn("Unexpected tag `templarg' found");
}
}
@@ -694,7 +697,7 @@ class TagFileParser : public QXmlDefaultHandler
case InPage: m_curPage->filename = m_curString; break;
case InPackage: m_curPackage->filename = m_curString; break;
case InDir: m_curDir->filename = m_curString; break;
- default: warn("Unexpected tag `filename' found\n"); break;
+ default: warn("Unexpected tag `filename' found"); break;
}
}
@@ -704,7 +707,7 @@ class TagFileParser : public QXmlDefaultHandler
{
case InFile: m_curFile->path = m_curString; break;
case InDir: m_curDir->path = m_curString; break;
- default: warn("Unexpected tag `path' found\n"); break;
+ default: warn("Unexpected tag `path' found"); break;
}
}
@@ -714,9 +717,13 @@ class TagFileParser : public QXmlDefaultHandler
{
m_curMember->anchor = m_curString;
}
+ else if (m_state==InClass)
+ {
+ m_curClass->anchor = m_curString;
+ }
else
{
- warn("Unexpected tag `anchor' found\n");
+ warn("Unexpected tag `anchor' found");
}
}
@@ -736,7 +743,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `anchor' found\n");
+ warn("Unexpected tag `clangid' found");
}
}
@@ -750,7 +757,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unexpected tag `anchorfile' found\n");
+ warn("Unexpected tag `anchorfile' found");
}
}
@@ -762,7 +769,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unexpected tag `arglist' found\n");
+ warn("Unexpected tag `arglist' found");
}
}
void endTitle()
@@ -771,7 +778,7 @@ class TagFileParser : public QXmlDefaultHandler
{
case InGroup: m_curGroup->title = m_curString; break;
case InPage: m_curPage->title = m_curString; break;
- default: warn("Unexpected tag `title' found\n"); break;
+ default: warn("Unexpected tag `title' found"); break;
}
}
@@ -783,7 +790,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unexpected tag `subgroup' found\n");
+ warn("Unexpected tag `subgroup' found");
}
}
@@ -878,7 +885,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unknown tag `%s' found!\n",name.data());
+ warn("Unknown tag `%s' found!",name.data());
}
return TRUE;
}
@@ -893,7 +900,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("Unknown tag `%s' found!\n",name.data());
+ warn("Unknown tag `%s' found!",name.data());
}
return TRUE;
}
@@ -1157,7 +1164,7 @@ void TagFileParser::addDocAnchors(Entry *e,const TagAnchorInfoList &l)
}
else
{
- warn("Duplicate anchor %s found\n",ta->label.data());
+ warn("Duplicate anchor %s found",ta->label.data());
}
}
}
@@ -1322,6 +1329,9 @@ void TagFileParser::buildLists(Entry *root)
case TagClassInfo::Category: ce->spec = Entry::Category; break;
case TagClassInfo::Service: ce->spec = Entry::Service; break;
case TagClassInfo::Singleton: ce->spec = Entry::Singleton; break;
+ case TagClassInfo::None: // should never happen, means not properly initialized
+ assert(tci->kind != TagClassInfo::None);
+ break;
}
ce->name = tci->name;
if (tci->kind==TagClassInfo::Protocol)
@@ -1331,6 +1341,7 @@ void TagFileParser::buildLists(Entry *root)
addDocAnchors(ce,tci->docAnchors);
TagInfo *ti = new TagInfo;
ti->tagName = m_tagName;
+ ti->anchor = tci->anchor;
ti->fileName = tci->filename;
ce->id = tci->clangId;
ce->tagInfo = ti;
@@ -1459,6 +1470,22 @@ void TagFileParser::buildLists(Entry *root)
root->addSubEntry(ge);
}
+ // set subgroup relations bug_774118
+ for (git.toFirst();(tgi=git.current());++git)
+ {
+ QCStringList::Iterator it;
+ for ( it = tgi->subgroupList.begin(); it != tgi->subgroupList.end(); ++it )
+ {
+ QListIterator<Entry> eli(*(root->children()));
+ Entry *childNode;
+ for (eli.toFirst();(childNode=eli.current());++eli)
+ {
+ if (childNode->name == (*it)) break;
+ }
+ childNode->groups->append(new Grouping(tgi->name,Grouping::GROUPING_INGROUP));
+ }
+ }
+
// build page list
QListIterator<TagPageInfo> pgit(m_tagFilePages);
TagPageInfo *tpi;
diff --git a/src/tclscanner.l b/src/tclscanner.l
index 7ca5ade..ca5294b 100644
--- a/src/tclscanner.l
+++ b/src/tclscanner.l
@@ -1431,7 +1431,6 @@ tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data());
yyless(0);
tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data());
return;
- myWhite=0;
break;
default:
tcl_err("wrong state: %d\n",what);
diff --git a/src/template.cpp b/src/template.cpp
index 3e39d3c..b1435ce 100644
--- a/src/template.cpp
+++ b/src/template.cpp
@@ -698,7 +698,7 @@ class FilterTexLabel
{
if (v.isValid() && (v.type()==TemplateVariant::String))
{
- return TemplateVariant(latexEscapeLabelName(v.toString(),FALSE),TRUE);
+ return TemplateVariant(latexEscapeLabelName(v.toString()),TRUE);
}
else
{
@@ -717,7 +717,7 @@ class FilterTexIndex
{
if (v.isValid() && (v.type()==TemplateVariant::String))
{
- return TemplateVariant(latexEscapeIndexChars(v.toString(),FALSE),TRUE);
+ return TemplateVariant(latexEscapeIndexChars(v.toString()),TRUE);
}
else
{
diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp
index c899232..b6c90e3 100644
--- a/src/textdocvisitor.cpp
+++ b/src/textdocvisitor.cpp
@@ -21,6 +21,7 @@
#include "message.h"
#include "util.h"
#include "htmlentity.h"
+#include "emoji.h"
//-------------------------------------------------------------------------
@@ -37,6 +38,18 @@ void TextDocVisitor::visit(DocSymbol *s)
}
}
+void TextDocVisitor::visit(DocEmoji *s)
+{
+ const char *res = EmojiEntityMapper::instance()->name(s->index());
+ if (res)
+ {
+ filter(res);
+ }
+ else
+ {
+ filter(s->name());
+ }
+}
void TextDocVisitor::filter(const char *str)
{
diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h
index 1bbc357..bbc70e8 100644
--- a/src/textdocvisitor.h
+++ b/src/textdocvisitor.h
@@ -40,6 +40,7 @@ class TextDocVisitor : public DocVisitor
void visit(DocLinkedWord *w) { filter(w->word()); }
void visit(DocWhiteSpace *) { m_t << " "; }
void visit(DocSymbol *);
+ void visit(DocEmoji *);
void visit(DocURL *u) { filter(u->url()); }
void visit(DocLineBreak *) { m_t << " "; }
void visit(DocHorRuler *) {}
diff --git a/src/translator.h b/src/translator.h
index 9da2317..ac55911 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -46,7 +46,7 @@ class Translator
/*!
* Sets the LaTeX font encoding to be used. The default is set to `T1`,
* in case another font encoding has to be used this can be specified with
- * this routine. In case no font encoding is required the empty string
+ * this routine. In case no font encoding is required the empty string
* can be returned.
*/
virtual QCString latexFontenc() { return "T1"; }
@@ -616,6 +616,36 @@ class Translator
virtual QCString trFunctionAndProc() = 0;
virtual QCString trVhdlType(uint64 type,bool single) = 0;
virtual QCString trCustomReference(const char *name) = 0;
+
+ virtual QCString trConstants() = 0;
+ virtual QCString trConstantDocumentation() = 0;
+ virtual QCString trSequences() = 0;
+ virtual QCString trSequenceDocumentation() = 0;
+ virtual QCString trDictionaries() = 0;
+ virtual QCString trDictionaryDocumentation() = 0;
+ virtual QCString trSliceInterfaces() = 0;
+ virtual QCString trInterfaceIndex() = 0;
+ virtual QCString trInterfaceList() = 0;
+ virtual QCString trInterfaceListDescription() = 0;
+ virtual QCString trInterfaceHierarchy() = 0;
+ virtual QCString trInterfaceHierarchyDescription() = 0;
+ virtual QCString trInterfaceDocumentation() = 0;
+ virtual QCString trStructs() = 0;
+ virtual QCString trStructIndex() = 0;
+ virtual QCString trStructList() = 0;
+ virtual QCString trStructListDescription() = 0;
+ virtual QCString trStructDocumentation() = 0;
+ virtual QCString trExceptionIndex() = 0;
+ virtual QCString trExceptionList() = 0;
+ virtual QCString trExceptionListDescription() = 0;
+ virtual QCString trExceptionHierarchy() = 0;
+ virtual QCString trExceptionHierarchyDescription() = 0;
+ virtual QCString trExceptionDocumentation() = 0;
+ virtual QCString trCompoundReferenceSlice(const char *clName, ClassDef::CompoundType compType, bool isLocal) = 0;
+ virtual QCString trOperations() = 0;
+ virtual QCString trOperationDocumentation() = 0;
+ virtual QCString trDataMembers() = 0;
+ virtual QCString trDataMemberDocumentation() = 0;
};
#endif
diff --git a/src/translator_adapter.h b/src/translator_adapter.h
index e66c9bf..b0c8a24 100644
--- a/src/translator_adapter.h
+++ b/src/translator_adapter.h
@@ -70,8 +70,96 @@ class TranslatorAdapter_1_8_15 : public TranslatorAdapterBase
virtual QCString trVhdlType(uint64 type,bool single)
{ return english.trVhdlType(type,single); }
+
virtual QCString trCustomReference(const char *name)
{ return english.trCustomReference(name); }
+
+ virtual QCString trConstants()
+ { return english.trConstants(); }
+
+ virtual QCString trConstantDocumentation()
+ { return english.trConstantDocumentation(); }
+
+ virtual QCString trSequences()
+ { return english.trSequences(); }
+
+ virtual QCString trSequenceDocumentation()
+ { return english.trSequenceDocumentation(); }
+
+ virtual QCString trDictionaries()
+ { return english.trDictionaries(); }
+
+ virtual QCString trDictionaryDocumentation()
+ { return english.trDictionaryDocumentation(); }
+
+ virtual QCString trSliceInterfaces()
+ { return english.trSliceInterfaces(); }
+
+ virtual QCString trInterfaceIndex()
+ { return english.trInterfaceIndex(); }
+
+ virtual QCString trInterfaceList()
+ { return english.trInterfaceList(); }
+
+ virtual QCString trInterfaceListDescription()
+ { return english.trInterfaceListDescription(); }
+
+ virtual QCString trInterfaceHierarchy()
+ { return english.trInterfaceHierarchy(); }
+
+ virtual QCString trInterfaceHierarchyDescription()
+ { return english.trInterfaceHierarchyDescription(); }
+
+ virtual QCString trInterfaceDocumentation()
+ { return english.trInterfaceDocumentation(); }
+
+ virtual QCString trStructs()
+ { return english.trStructs(); }
+
+ virtual QCString trStructIndex()
+ { return english.trStructIndex(); }
+
+ virtual QCString trStructList()
+ { return english.trStructList(); }
+
+ virtual QCString trStructListDescription()
+ { return english.trStructListDescription(); }
+
+ virtual QCString trStructDocumentation()
+ { return english.trStructDocumentation(); }
+
+ virtual QCString trExceptionIndex()
+ { return english.trExceptionIndex(); }
+
+ virtual QCString trExceptionList()
+ { return english.trExceptionList(); }
+
+ virtual QCString trExceptionListDescription()
+ { return english.trExceptionListDescription(); }
+
+ virtual QCString trExceptionHierarchy()
+ { return english.trExceptionHierarchy(); }
+
+ virtual QCString trExceptionHierarchyDescription()
+ { return english.trExceptionHierarchyDescription(); }
+
+ virtual QCString trExceptionDocumentation()
+ { return english.trExceptionDocumentation(); }
+
+ virtual QCString trCompoundReferenceSlice(const char *clName, ClassDef::CompoundType compType, bool isLocal)
+ { return english.trCompoundReferenceSlice(clName,compType,isLocal); }
+
+ virtual QCString trOperations()
+ { return english.trOperations(); }
+
+ virtual QCString trOperationDocumentation()
+ { return english.trOperationDocumentation(); }
+
+ virtual QCString trDataMembers()
+ { return english.trDataMembers(); }
+
+ virtual QCString trDataMemberDocumentation()
+ { return english.trDataMemberDocumentation(); }
};
class TranslatorAdapter_1_8_4 : public TranslatorAdapter_1_8_15
@@ -328,4 +416,3 @@ class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_5_4
};
#endif
-
diff --git a/src/translator_br.h b/src/translator_br.h
index 774e554..c2d079a 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -14,7 +14,7 @@
* Maintainer:
* Fabio "FJTC" Jun Takada Chino <fjtc at brokenbits dot com dot br>
* Collaborators:
- * Emerson Ferreira <nuskorpios at gmail dot com>
+ * Emerson Ferreira <nuskorpios at gmail dot com>
* Thanks to Jorge Ramos, Fernando Carijo and others for their contributions.
*
* History:
@@ -47,7 +47,7 @@
#ifndef TRANSLATOR_BR_H
#define TRANSLATOR_BR_H
-class TranslatorBrazilian : public Translator
+class TranslatorBrazilian : public TranslatorAdapter_1_8_15
{
public:
@@ -610,7 +610,7 @@ class TranslatorBrazilian : public Translator
{
QCString result="Referência";
if (isTemplate) result+=" do <em>Template</em>";
- if (compType == ClassDef::Protocol)
+ if (compType == ClassDef::Protocol)
{
result+=" do ";
}
@@ -836,7 +836,7 @@ class TranslatorBrazilian : public Translator
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
- {
+ {
// Decidi mudar de página para "p." para ficar mais compacto.
return "p.";
}
@@ -2200,9 +2200,6 @@ class TranslatorBrazilian : public Translator
}
virtual QCString trCustomReference(const char *name)
{ return "Referência de " + QCString(name); }
-
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_de.h b/src/translator_de.h
index 8e6ec2c..bf5ce5e 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -133,7 +133,7 @@
// 2017/10/12 Arnd Weber (arnd dot weber at bafg dot de)
// Beatrix Konz
// - Updated for 1.8.13
-// - Resynced trMemberDataDocumentation() and trFileMembers() to include the
+// - Resynced trMemberDataDocumentation() and trFileMembers() to include the
// boolean switch OPTIMIZE_OUTPUT_FOR_C
// - Replaced "\t" by " "
//
@@ -143,7 +143,7 @@
#ifndef TRANSLATOR_DE_H
#define TRANSLATOR_DE_H
-class TranslatorGerman : public Translator
+class TranslatorGerman : public TranslatorAdapter_1_8_15
{
public:
@@ -1995,7 +1995,7 @@ class TranslatorGerman : public Translator
/*! Used file list for a Java enum */
virtual QCString trEnumGeneratedFromFiles(bool single)
{ QCString result = "Die Dokumentation für diesen enum wurde aus ";
- if (single)
+ if (single)
result += "der folgenden Datei";
else
result += "den folgenden Dateien";
@@ -2254,7 +2254,7 @@ class TranslatorGerman : public Translator
virtual QCString trCustomReference(const char *name)
{ return QCString(name)+"-Referenz"; }
-//////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_en.h b/src/translator_en.h
index d12621e..400e59c 100644
--- a/src/translator_en.h
+++ b/src/translator_en.h
@@ -253,6 +253,10 @@ class TranslatorEnglish : public Translator
{
return "Here are the data structures with brief descriptions:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Here are the classes with brief descriptions:";
+ }
else
{
return "Here are the classes, structs, "
@@ -2117,6 +2121,138 @@ class TranslatorEnglish : public Translator
virtual QCString trCustomReference(const char *name)
{ return QCString(name)+" Reference"; }
+ /* Slice */
+ virtual QCString trConstants()
+ {
+ return "Constants";
+ }
+ virtual QCString trConstantDocumentation()
+ {
+ return "Constant Documentation";
+ }
+ virtual QCString trSequences()
+ {
+ return "Sequences";
+ }
+ virtual QCString trSequenceDocumentation()
+ {
+ return "Sequence Documentation";
+ }
+ virtual QCString trDictionaries()
+ {
+ return "Dictionaries";
+ }
+ virtual QCString trDictionaryDocumentation()
+ {
+ return "Dictionary Documentation";
+ }
+ virtual QCString trSliceInterfaces()
+ {
+ return "Interfaces";
+ }
+ virtual QCString trInterfaceIndex()
+ {
+ return "Interface Index";
+ }
+ virtual QCString trInterfaceList()
+ {
+ return "Interface List";
+ }
+ virtual QCString trInterfaceListDescription()
+ {
+ return "Here are the interfaces with brief descriptions:";
+ }
+ virtual QCString trInterfaceHierarchy()
+ {
+ return "Interface Hierarchy";
+ }
+ virtual QCString trInterfaceHierarchyDescription()
+ {
+ return "This inheritance list is sorted roughly, but not completely, alphabetically:";
+ }
+ virtual QCString trInterfaceDocumentation()
+ {
+ return "Interface Documentation";
+ }
+ virtual QCString trStructs()
+ {
+ return "Structs";
+ }
+ virtual QCString trStructIndex()
+ {
+ return "Struct Index";
+ }
+ virtual QCString trStructList()
+ {
+ return "Struct List";
+ }
+ virtual QCString trStructListDescription()
+ {
+ return "Here are the structs with brief descriptions:";
+ }
+ virtual QCString trStructDocumentation()
+ {
+ return "Struct Documentation";
+ }
+ virtual QCString trExceptionIndex()
+ {
+ return "Exception Index";
+ }
+ virtual QCString trExceptionList()
+ {
+ return "Exception List";
+ }
+ virtual QCString trExceptionListDescription()
+ {
+ return "Here are the exceptions with brief descriptions:";
+ }
+ virtual QCString trExceptionHierarchy()
+ {
+ return "Exception Hierarchy";
+ }
+ virtual QCString trExceptionHierarchyDescription()
+ {
+ return "This inheritance list is sorted roughly, but not completely, alphabetically:";
+ }
+ virtual QCString trExceptionDocumentation()
+ {
+ return "Exception Documentation";
+ }
+ virtual QCString trCompoundReferenceSlice(const char *clName, ClassDef::CompoundType compType, bool isLocal)
+ {
+ QCString result=(QCString)clName;
+ if (isLocal) result+=" Local";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Class"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
+ }
+ result+=" Reference";
+ return result;
+ }
+ virtual QCString trOperations()
+ {
+ return "Operations";
+ }
+ virtual QCString trOperationDocumentation()
+ {
+ return "Operation Documentation";
+ }
+ virtual QCString trDataMembers()
+ {
+ return "Data Members";
+ }
+ virtual QCString trDataMemberDocumentation()
+ {
+ return "Data Member Documentation";
+ }
+
//////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_es.h b/src/translator_es.h
index 5f89f24..b28ed75 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -2057,6 +2057,254 @@ class TranslatorSpanish : public TranslatorAdapter_1_8_15
}
//////////////////////////////////////////////////////////////////////////
+// new since 1.8.15
+//////////////////////////////////////////////////////////////////////////
+
+ /** VHDL design unit hierarchy */
+ virtual QCString trDesignUnitHierarchy()
+ { return "Jerarquía de unidades de diseño"; }
+ /** VHDL design unit list */
+ virtual QCString trDesignUnitList()
+ { return "Lista de unidades de diseño"; }
+ /** VHDL design unit members */
+ virtual QCString trDesignUnitMembers()
+ { return "Miembros de las unidades de diseño"; }
+ /** VHDL design unit list description */
+ virtual QCString trDesignUnitListDescription()
+ {
+ return "Aquí hay una lista de todos los miembros de la unidad de diseño con "
+ "enlaces a las entidades a las que pertenecen:";
+ }
+ /** VHDL design unit index */
+ virtual QCString trDesignUnitIndex()
+ { return "Indice de unidades de diseño"; }
+ /** VHDL design units */
+ virtual QCString trDesignUnits()
+ { return "Unidades de Diseño"; }
+ /** VHDL functions/procedures/processes */
+ virtual QCString trFunctionAndProc()
+ { return "Funciones/Procedimientos/Procesos"; }
+ /** VHDL type */
+ virtual QCString trVhdlType(uint64 type,bool single)
+ {
+ switch(type)
+ {
+ case VhdlDocGen::LIBRARY:
+ if (single) return "Libreria";
+ else return "Librerias";
+ case VhdlDocGen::PACKAGE:
+ if (single) return "Paquete";
+ else return "Paquetes";
+ case VhdlDocGen::SIGNAL:
+ if (single) return "Señal";
+ else return "Señales";
+ case VhdlDocGen::COMPONENT:
+ if (single) return "Componente";
+ else return "Componentes";
+ case VhdlDocGen::CONSTANT:
+ if (single) return "Constante";
+ else return "Constantes";
+ case VhdlDocGen::ENTITY:
+ if (single) return "Entidad";
+ else return "Entidades";
+ case VhdlDocGen::TYPE:
+ if (single) return "Tipo";
+ else return "Tipos";
+ case VhdlDocGen::SUBTYPE:
+ if (single) return "Subtipo";
+ else return "Subtipos";
+ case VhdlDocGen::FUNCTION:
+ if (single) return "Función";
+ else return "Funciones";
+ case VhdlDocGen::RECORD:
+ if (single) return "Registro";
+ else return "Registros";
+ case VhdlDocGen::PROCEDURE:
+ if (single) return "Procedimiento";
+ else return "Procedimientos";
+ case VhdlDocGen::ARCHITECTURE:
+ if (single) return "Arquitectura";
+ else return "Arquitecturas";
+ case VhdlDocGen::ATTRIBUTE:
+ if (single) return "Atributo";
+ else return "Atributos";
+ case VhdlDocGen::PROCESS:
+ if (single) return "Proceso";
+ else return "Procesos";
+ case VhdlDocGen::PORT:
+ if (single) return "Puerto";
+ else return "Puertos";
+ case VhdlDocGen::USE:
+ if (single) return "cláusula de uso";
+ else return "Cláusulas de uso";
+ case VhdlDocGen::GENERIC:
+ if (single) return "Genérico";
+ else return "Genéricos";
+ case VhdlDocGen::PACKAGE_BODY:
+ return "Cuerpo del paquete";
+ case VhdlDocGen::UNITS:
+ return "Unidades";
+ case VhdlDocGen::SHAREDVARIABLE:
+ if (single) return "Variable Compartida";
+ else return "Variable Compartidas";
+ case VhdlDocGen::VFILE:
+ if (single) return "Fichero";
+ else return "Ficheros";
+ case VhdlDocGen::GROUP:
+ if (single) return "Grupo";
+ else return "Grupos";
+ case VhdlDocGen::INSTANTIATION:
+ if (single) return "Instanciación";
+ else return "Instanciaciones";
+ case VhdlDocGen::ALIAS:
+ if (single) return "Alias";
+ else return "Aliases";
+ case VhdlDocGen::CONFIG:
+ if (single) return "Configuración";
+ else return "Configuraciones";
+ case VhdlDocGen::MISCELLANEOUS:
+ return "Varios";
+ case VhdlDocGen::UCF_CONST:
+ return "Restricciones";
+ default:
+ return "Clase";
+ }
+ }
+ virtual QCString trCustomReference(const char *name)
+ { return "Referencia"+QCString(name); }
+
+ virtual QCString trConstants()
+ {
+ return "Constantes";
+ }
+ virtual QCString trConstantDocumentation()
+ {
+ return "Documentación de constante";
+ }
+ virtual QCString trSequences()
+ {
+ return "Secuencias";
+ }
+ virtual QCString trSequenceDocumentation()
+ {
+ return "Documentación de secuencia";
+ }
+ virtual QCString trDictionaries()
+ {
+ return "Diccionarios";
+ }
+ virtual QCString trDictionaryDocumentation()
+ {
+ return "Documentación de diccionario";
+ }
+ virtual QCString trSliceInterfaces()
+ {
+ return "Interfaces";
+ }
+ virtual QCString trInterfaceIndex()
+ {
+ return "Indice de interfaces";
+ }
+ virtual QCString trInterfaceList()
+ {
+ return "Lista de interfaces";
+ }
+ virtual QCString trInterfaceListDescription()
+ {
+ return "Aquí están las interfaces con una breve descripción:";
+ }
+ virtual QCString trInterfaceHierarchy()
+ {
+ return "Jerarquía de interfaces";
+ }
+ virtual QCString trInterfaceHierarchyDescription()
+ {
+ return "Este listado de herencia está ordenado de forma aproximada, pero no completamente en orden alfabético:";
+ }
+ virtual QCString trInterfaceDocumentation()
+ {
+ return "Documentación de interfaz";
+ }
+ virtual QCString trStructs()
+ {
+ return "Estructuras";
+ }
+ virtual QCString trStructIndex()
+ {
+ return "Indice de estructuras";
+ }
+ virtual QCString trStructList()
+ {
+ return "Lista de estructuras";
+ }
+ virtual QCString trStructListDescription()
+ {
+ return "Aquí están las estructuras de datos con una breve descripción:";
+ }
+ virtual QCString trStructDocumentation()
+ {
+ return "Documentación estructura";
+ }
+ virtual QCString trExceptionIndex()
+ {
+ return "Indice de excepciones";
+ }
+ virtual QCString trExceptionList()
+ {
+ return "Lista de excepciones";
+ }
+ virtual QCString trExceptionListDescription()
+ {
+ return "Aquí están las excepciones con una breve descripción:";
+ }
+ virtual QCString trExceptionHierarchy()
+ {
+ return "Jerarquía de excepciones";
+ }
+ virtual QCString trExceptionHierarchyDescription()
+ {
+ return "Este listado de herencia está ordenado de forma aproximada, pero no completamente en orden alfabético:";
+ }
+ virtual QCString trExceptionDocumentation()
+ {
+ return "Documentación de excepción";
+ }
+ virtual QCString trCompoundReferenceSlice(const char *clName, ClassDef::CompoundType compType, bool isLocal)
+ {
+ QCString result="Referencia de";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" la Clase"; break;
+ case ClassDef::Struct: result+=" la Estructura"; break;
+ case ClassDef::Union: result+=" la Unión"; break;
+ case ClassDef::Interface: result+=" la Interfaz"; break;
+ case ClassDef::Protocol: result+="l Protocolo"; break;
+ case ClassDef::Category: result+=" la Categoría"; break;
+ case ClassDef::Exception: result+=" la Excepción"; break;
+ default: break;
+ }
+ if (isLocal) result+=" Local";
+ result+=(QCString)clName;
+ return result;
+ }
+ virtual QCString trOperations()
+ {
+ return "Operaciones";
+ }
+ virtual QCString trOperationDocumentation()
+ {
+ return "Documentación de operación";
+ }
+ virtual QCString trDataMembers()
+ {
+ return "Miembros de datos";
+ }
+ virtual QCString trDataMemberDocumentation()
+ {
+ return "Documentación miembro de datos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_fr.h b/src/translator_fr.h
index b0fb5b1..f355619 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -2055,6 +2055,258 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
}
//////////////////////////////////////////////////////////////////////////
+// new since 1.8.15
+//////////////////////////////////////////////////////////////////////////
+
+ /** VHDL design unit hierarchy */
+ virtual QCString trDesignUnitHierarchy()
+ { return "Hiérarchie des unités de conception"; }
+ /** VHDL design unit list */
+ virtual QCString trDesignUnitList()
+ { return "Liste des unités de conception"; }
+ /** VHDL design unit members */
+ virtual QCString trDesignUnitMembers()
+ { return "Membres des unités de conception"; }
+ /** VHDL design unit list description */
+ virtual QCString trDesignUnitListDescription()
+ {
+ return "Liste de tous les membres des unités de conception avec liens vers "
+ "les entités auxquelles ils appartiennent :";
+ }
+ /** VHDL design unit index */
+ virtual QCString trDesignUnitIndex()
+ { return "Index des unités de conception"; }
+ /** VHDL design units */
+ virtual QCString trDesignUnits()
+ { return "Unités de conception"; }
+ /** VHDL functions/procedures/processes */
+ virtual QCString trFunctionAndProc()
+ { return "Fonctions/Procédures/Processes"; }
+ /** VHDL type */
+ virtual QCString trVhdlType(uint64 type,bool single)
+ {
+ switch(type)
+ {
+ case VhdlDocGen::LIBRARY:
+ if (single) return "Librairie";
+ else return "Librairies";
+ case VhdlDocGen::PACKAGE:
+ if (single) return "Paquetage";
+ else return "Paquetages";
+ case VhdlDocGen::SIGNAL:
+ if (single) return "Signal";
+ else return "Signaux";
+ case VhdlDocGen::COMPONENT:
+ if (single) return "Composant";
+ else return "Composants";
+ case VhdlDocGen::CONSTANT:
+ if (single) return "Constante";
+ else return "Constantes";
+ case VhdlDocGen::ENTITY:
+ if (single) return "Entité";
+ else return "Entités";
+ case VhdlDocGen::TYPE:
+ if (single) return "Type";
+ else return "Types";
+ case VhdlDocGen::SUBTYPE:
+ if (single) return "Sous-type";
+ else return "Sous-types";
+ case VhdlDocGen::FUNCTION:
+ if (single) return "Fonction";
+ else return "Fonctions";
+ case VhdlDocGen::RECORD:
+ if (single) return "Enregistrement";
+ else return "Enregistrements";
+ case VhdlDocGen::PROCEDURE:
+ if (single) return "Procédure";
+ else return "Procédures";
+ case VhdlDocGen::ARCHITECTURE:
+ if (single) return "Architecture";
+ else return "Architectures";
+ case VhdlDocGen::ATTRIBUTE:
+ if (single) return "Attribut";
+ else return "Attributs";
+ case VhdlDocGen::PROCESS:
+ if (single) return "Process";
+ else return "Processes";
+ case VhdlDocGen::PORT:
+ if (single) return "Port";
+ else return "Ports";
+ case VhdlDocGen::USE:
+ if (single) return "Clause d'utilisation";
+ else return "Clauses d'utilisation";
+ case VhdlDocGen::GENERIC:
+ if (single) return "Generique";
+ else return "Generiques";
+ case VhdlDocGen::PACKAGE_BODY:
+ return "Corps du paquetage";
+ case VhdlDocGen::UNITS:
+ return "Unités";
+ case VhdlDocGen::SHAREDVARIABLE:
+ if (single) return "Variable partagée";
+ else return "Variables partagées";
+ case VhdlDocGen::VFILE:
+ if (single) return "Fichier";
+ else return "Fichiers";
+ case VhdlDocGen::GROUP:
+ if (single) return "Groupe";
+ else return "Groupes";
+ case VhdlDocGen::INSTANTIATION:
+ if (single) return "Instanciation";
+ else return "Instanciations";
+ case VhdlDocGen::ALIAS:
+ if (single) return "Alias";
+ else return "Alias";
+ case VhdlDocGen::CONFIG:
+ if (single) return "Configuration";
+ else return "Configurations";
+ case VhdlDocGen::MISCELLANEOUS:
+ return "Divers";
+ case VhdlDocGen::UCF_CONST:
+ return "Contraintes";
+ default:
+ return "Classe";
+ }
+ }
+ virtual QCString trCustomReference(const char *name)
+ { return QCString("Référence ") + QCString(name); }
+
+ virtual QCString trConstants()
+ {
+ return "Constantes";
+ }
+ virtual QCString trConstantDocumentation()
+ {
+ return "Documentation des constantes";
+ }
+ virtual QCString trSequences()
+ {
+ return "Séquences";
+ }
+ virtual QCString trSequenceDocumentation()
+ {
+ return "Documentation des séquences";
+ }
+ virtual QCString trDictionaries()
+ {
+ return "Dictionnaires";
+ }
+ virtual QCString trDictionaryDocumentation()
+ {
+ return "Documentation des dictionnaires";
+ }
+ virtual QCString trSliceInterfaces()
+ {
+ return "Interfaces";
+ }
+ virtual QCString trInterfaceIndex()
+ {
+ return "Index des interfaces";
+ }
+ virtual QCString trInterfaceList()
+ {
+ return "Liste des interfaces";
+ }
+ virtual QCString trInterfaceListDescription()
+ {
+ return "Liste des interfaces avec une brève description :";
+ }
+ virtual QCString trInterfaceHierarchy()
+ {
+ return "Hiérarchies des interfaces";
+ }
+ virtual QCString trInterfaceHierarchyDescription()
+ {
+ return "Cette liste d'héritage est classée approximativement par ordre alphabétique :";
+ }
+ virtual QCString trInterfaceDocumentation()
+ {
+ return "Documentation des interfaces";
+ }
+ virtual QCString trStructs()
+ {
+ return "Structures";
+ }
+ virtual QCString trStructIndex()
+ {
+ return "Index des structures";
+ }
+ virtual QCString trStructList()
+ {
+ return "Liste des structures";
+ }
+ virtual QCString trStructListDescription()
+ {
+ return "Liste des structures avec une brève description :";
+ }
+ virtual QCString trStructDocumentation()
+ {
+ return "Documentation des structures";
+ }
+ virtual QCString trExceptionIndex()
+ {
+ return "Index des exceptions";
+ }
+ virtual QCString trExceptionList()
+ {
+ return "Liste des exceptions";
+ }
+ virtual QCString trExceptionListDescription()
+ {
+ return "Liste des exceptions avec une brève description :";
+ }
+ virtual QCString trExceptionHierarchy()
+ {
+ return "Hiérarchies des exceptions";
+ }
+ virtual QCString trExceptionHierarchyDescription()
+ {
+ return "Cette liste d'héritage est classée approximativement par ordre alphabétique :";
+ }
+ virtual QCString trExceptionDocumentation()
+ {
+ return "Documentation des exceptions";
+ }
+ virtual QCString trCompoundReferenceSlice(const char *clName, ClassDef::CompoundType compType, bool isLocal)
+ {
+ QCString result = "Référence de ";
+
+ switch(compType)
+ {
+ case ClassDef::Class: result+="la classe "; break;
+ case ClassDef::Struct: result+="la structure "; break;
+ case ClassDef::Interface: result+="l'interface "; break;
+ case ClassDef::Exception: result+="l'exception "; break;
+ default: break;
+ }
+
+ if(isLocal)
+ {
+ result += "locale ";
+ }
+
+ result += (QCString)clName;
+
+ return result;
+ }
+ virtual QCString trOperations()
+ {
+ return "Opérations";
+ }
+ virtual QCString trOperationDocumentation()
+ {
+ return "Documentation des opérations";
+ }
+ virtual QCString trDataMembers()
+ {
+ return "Champs de données";
+ }
+ virtual QCString trDataMemberDocumentation()
+ {
+ return "Documentation des champs de données";
+ }
+
+//////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_nl.h b/src/translator_nl.h
index c0c8c9b..7cecc7d 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -1709,7 +1709,82 @@ class TranslatorDutch : public Translator
virtual QCString trCustomReference(const char *name)
{ return QCString(name)+" Referentie"; }
-//////////////////////////////////////////////////////////////////////////
+ /* Slice */
+ virtual QCString trConstants()
+ { return "Konstanten"; }
+ virtual QCString trConstantDocumentation()
+ { return "Documentatie van konstanten"; }
+ virtual QCString trSequences()
+ { return "Reeksen"; }
+ virtual QCString trSequenceDocumentation()
+ { return "Documentatie van reeksen"; }
+ virtual QCString trDictionaries()
+ { return "Vertalingslijsten"; }
+ virtual QCString trDictionaryDocumentation()
+ { return "Documentatie van vertalingslijsten"; }
+ virtual QCString trSliceInterfaces()
+ { return "Interfaces"; }
+ virtual QCString trInterfaceIndex()
+ { return "Index van interfaces"; }
+ virtual QCString trInterfaceList()
+ { return "Lijst van interfaces"; }
+ virtual QCString trInterfaceListDescription()
+ { return "Hieronder volgt de lijst met alle interfaces, elk met een korte beschrijving:"; }
+ virtual QCString trInterfaceHierarchy()
+ { return "Interface Hi&euml;rarchie"; }
+ virtual QCString trInterfaceHierarchyDescription()
+ { return "Deze inheritance lijst is min of meer alfabetisch gesorteerd:"; }
+ virtual QCString trInterfaceDocumentation()
+ { return "Documentatie van interfaces"; }
+ virtual QCString trStructs()
+ { return "Structs"; }
+ virtual QCString trStructIndex()
+ { return "Index van struct"; }
+ virtual QCString trStructList()
+ { return "Lijst van struct"; }
+ virtual QCString trStructListDescription()
+ { return "Hieronder volgt de lijst met alle structs, elk met een korte beschrijving:"; }
+ virtual QCString trStructDocumentation()
+ { return "Documentatie van structs"; }
+ virtual QCString trExceptionIndex()
+ { return "Index van exceptions"; }
+ virtual QCString trExceptionList()
+ { return "Lijst van exceptions"; }
+ virtual QCString trExceptionListDescription()
+ { return "Hieronder volgt de lijst met alle exeptions, elk met een korte beschrijving:"; }
+ virtual QCString trExceptionHierarchy()
+ { return "Exception Hi&euml;rarchie"; }
+ virtual QCString trExceptionHierarchyDescription()
+ { return "Deze inheritance lijst is min of meer alfabetisch gesorteerd:"; }
+ virtual QCString trExceptionDocumentation()
+ { return "Documentatie van exceptions"; }
+ virtual QCString trCompoundReferenceSlice(const char *clName, ClassDef::CompoundType compType, bool isLocal)
+ {
+ QCString result=(QCString)clName;
+ if (isLocal) result+=" Lokale";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Class"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
+ }
+ result+=" Referentie";
+ return result;
+ }
+ virtual QCString trOperations()
+ { return "Bewerkingen"; }
+ virtual QCString trOperationDocumentation()
+ { return "Documentatie van bewerkingen"; }
+ virtual QCString trDataMembers()
+ { return "Data members"; }
+ virtual QCString trDataMemberDocumentation()
+ { return "Documentatie van data members"; }
+ //////////////////////////////////////////////////////////////////////////
};
#endif
diff --git a/src/translator_pt.h b/src/translator_pt.h
index 2506f7f..23faf7f 100644
--- a/src/translator_pt.h
+++ b/src/translator_pt.h
@@ -57,7 +57,7 @@
#define TRANSLATOR_PT_H
-class TranslatorPortuguese : public Translator
+class TranslatorPortuguese : public TranslatorAdapter_1_8_15
{
public:
@@ -2138,9 +2138,7 @@ class TranslatorPortuguese : public Translator
virtual QCString trCustomReference(const char *name)
{ return "Referência de " + QCString(name); }
-//////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////
};
#endif
diff --git a/src/types.h b/src/types.h
index e58c8fc..4d305b6 100644
--- a/src/types.h
+++ b/src/types.h
@@ -56,7 +56,8 @@ enum SrcLangExt
SrcLangExt_XML = 0x04000,
SrcLangExt_Tcl = 0x08000,
SrcLangExt_Markdown = 0x10000,
- SrcLangExt_SQL = 0x20000
+ SrcLangExt_SQL = 0x20000,
+ SrcLangExt_Slice = 0x40000
};
/** Grouping info */
@@ -192,15 +193,20 @@ enum MemberListType
MemberListType_interfaceMembers = 71 + MemberListType_detailedLists,
MemberListType_services = 72,
MemberListType_serviceMembers = 73 + MemberListType_detailedLists,
+
+ MemberListType_decSequenceMembers = 74 + MemberListType_declarationLists,
+ MemberListType_docSequenceMembers = 75 + MemberListType_documentationLists,
+ MemberListType_decDictionaryMembers = 76 + MemberListType_declarationLists,
+ MemberListType_docDictionaryMembers = 77 + MemberListType_documentationLists
};
-enum MemberType
-{
+enum MemberType
+{
MemberType_Define,
- MemberType_Function,
- MemberType_Variable,
- MemberType_Typedef,
- MemberType_Enumeration,
+ MemberType_Function,
+ MemberType_Variable,
+ MemberType_Typedef,
+ MemberType_Enumeration,
MemberType_EnumValue,
MemberType_Signal,
MemberType_Slot,
@@ -210,6 +216,8 @@ enum MemberType
MemberType_Event,
MemberType_Interface,
MemberType_Service,
+ MemberType_Sequence,
+ MemberType_Dictionary
};
enum FortranFormat
@@ -227,7 +235,8 @@ class LocalToc
Html = 0, // index / also to be used as bit position in mask (1 << Html)
Latex = 1, // ...
Xml = 2, // ...
- numTocTypes = 3 // number of enum values
+ Docbook = 3, // ...
+ numTocTypes = 4 // number of enum values
};
LocalToc() : m_mask(None) { memset(m_level,0,sizeof(m_level)); }
@@ -247,15 +256,22 @@ class LocalToc
m_mask|=(1<<Xml);
m_level[Xml]=level;
}
+ void enableDocbook(int level)
+ {
+ m_mask|=(1<<Docbook);
+ m_level[Docbook]=level;
+ }
// getters
bool isHtmlEnabled() const { return (m_mask & (1<<Html))!=0; }
bool isLatexEnabled() const { return (m_mask & (1<<Latex))!=0; }
bool isXmlEnabled() const { return (m_mask & (1<<Xml))!=0; }
+ bool isDocbookEnabled() const { return (m_mask & (1<<Docbook))!=0; }
bool nothingEnabled() const { return m_mask == None; }
int htmlLevel() const { return m_level[Html]; }
int latexLevel() const { return m_level[Latex]; }
int xmlLevel() const { return m_level[Xml]; }
+ int docbookLevel() const { return m_level[Docbook]; }
int mask() const { return m_mask; }
private:
diff --git a/src/util.cpp b/src/util.cpp
index b387a84..08c13fb 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -251,6 +251,7 @@ void writePageRef(OutputDocInterface &od,const char *cn,const char *mn)
od.disable(OutputGenerator::Html);
od.disable(OutputGenerator::Man);
+ od.disable(OutputGenerator::Docbook);
if (Config_getBool(PDF_HYPERLINKS)) od.disable(OutputGenerator::Latex);
if (Config_getBool(RTF_HYPERLINKS)) od.disable(OutputGenerator::RTF);
od.startPageRef();
@@ -332,14 +333,15 @@ int guessSection(const char *name)
n.right(4)==".xml" ||
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"
+ 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;
return 0;
}
@@ -1845,7 +1847,7 @@ QCString removeRedundantWhiteSpace(const QCString &s)
case '*':
if (i>0 && pc!=' ' && pc!='\t' && pc!=':' &&
pc!='*' && pc!='&' && pc!='(' && pc!='/' &&
- pc!='.' && (osp<9 || (pc=='>' && osp==11)))
+ pc!='.' && (osp<9 || !(pc=='>' && osp==11)))
// avoid splitting &&, **, .*, operator*, operator->*
{
*dst++=' ';
@@ -1893,11 +1895,18 @@ QCString removeRedundantWhiteSpace(const QCString &s)
if (g_charAroundSpace.charMap[(uchar)pc].before &&
g_charAroundSpace.charMap[(uchar)nc].after &&
!(pc==',' && nc=='.') &&
- (osp<8 || (osp>=8 && isId(nc))) // e.g. "operator >>" -> "operator>>", but not "operator int" -> operatorint"
+ (osp<8 || (osp>=8 && pc!='"' && isId(nc)) || (osp>=8 && pc!='"' && nc!='"'))
+ // e.g. 'operator >>' -> 'operator>>',
+ // 'operator "" _x' -> 'operator""_x',
+ // but not 'operator int' -> 'operatorint'
)
{ // keep space
*dst++=' ';
}
+ else if ((pc=='*' || pc=='&' || pc=='.') && nc=='>')
+ {
+ *dst++=' ';
+ }
}
break;
default:
@@ -2215,6 +2224,7 @@ void writeExample(OutputList &ol,ExampleSDict *ed)
//if (latexEnabled) ol.disable(OutputGenerator::Latex);
ol.disable(OutputGenerator::Latex);
ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Docbook);
// link for Html / man
//printf("writeObjectLink(file=%s)\n",e->file.data());
ol.writeObjectLink(0,e->file,e->anchor,e->name);
@@ -2591,7 +2601,7 @@ QCString dateToString(bool includeTime)
static bool warnedOnce=FALSE;
if (!warnedOnce)
{
- warn_uncond("Environment variable SOURCE_DATA_EPOCH must have a value smaller than or equal to %llu; actual value %llu\n",UINT_MAX,epoch);
+ warn_uncond("Environment variable SOURCE_DATE_EPOCH must have a value smaller than or equal to %llu; actual value %llu\n",UINT_MAX,epoch);
warnedOnce=TRUE;
}
}
@@ -2665,7 +2675,7 @@ Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection p
if (level==256)
{
err("Internal inconsistency: found class %s seem to have a recursive "
- "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data());
+ "inheritance relation! Please send a bug report to doxygen@gmail.com\n",cd->name().data());
}
else if (cd->baseClasses())
{
@@ -5932,6 +5942,66 @@ QCString convertToXML(const char *s)
return growBuf.get();
}
+/*! Converts a string to an DocBook-encoded string */
+QCString convertToDocBook(const char *s)
+{
+ static GrowBuf growBuf;
+ growBuf.clear();
+ if (s==0) return "";
+ const unsigned char *q;
+ int cnt;
+ const unsigned char *p=(const unsigned char *)s;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '<': growBuf.addStr("&lt;"); break;
+ case '>': growBuf.addStr("&gt;"); break;
+ case '&': // possibility to have a special symbol
+ q = p;
+ cnt = 2; // we have to count & and ; as well
+ while ((*q >= 'a' && *q <= 'z') || (*q >= 'A' && *q <= 'Z') || (*q >= '0' && *q <= '9'))
+ {
+ cnt++;
+ q++;
+ }
+ if (*q == ';')
+ {
+ --p; // we need & as well
+ DocSymbol::SymType res = HtmlEntityMapper::instance()->name2sym(QCString((char *)p).left(cnt));
+ if (res == DocSymbol::Sym_Unknown)
+ {
+ p++;
+ growBuf.addStr("&amp;");
+ }
+ else
+ {
+ growBuf.addStr(HtmlEntityMapper::instance()->docbook(res));
+ q++;
+ p = q;
+ }
+ }
+ else
+ {
+ growBuf.addStr("&amp;");
+ }
+ break;
+ case '\'': growBuf.addStr("&apos;"); break;
+ case '"': growBuf.addStr("&quot;"); break;
+ case '\007': growBuf.addStr("&#x2407;"); break;
+ case 1: case 2: case 3: case 4: case 5: case 6: case 8:
+ case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18:
+ case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:
+ case 27: case 28: case 29: case 30: case 31:
+ break; // skip invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char)
+ default: growBuf.addChar(c); break;
+ }
+ }
+ growBuf.addChar(0);
+ return growBuf.get();
+}
+
/*! Converts a string to a HTML-encoded string */
QCString convertToHtml(const char *s,bool keepEntities)
{
@@ -6487,7 +6557,7 @@ QCString mergeScopes(const QCString &leftScope,const QCString &rightScope)
// case leftScope=="A::B" rightScope=="B::C" => result = "A::B::C"
// case leftScope=="A::B" rightScope=="B" => result = "A::B"
bool found=FALSE;
- while ((i=leftScope.findRev("::",p))!=-1)
+ while ((i=leftScope.findRev("::",p))>0)
{
if (leftScopeMatch(rightScope,leftScope.right(leftScope.length()-i-2)))
{
@@ -6576,6 +6646,8 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
// append documentation block to the page.
pd->setDocumentation(doc,fileName,startLine);
//printf("Adding page docs `%s' pi=%p name=%s\n",doc.data(),pd,name);
+ // append (x)refitems to the page.
+ pd->setRefItems(sli);
}
else // new page
{
@@ -6865,7 +6937,7 @@ void filterLatexString(FTextStream &t,const char *str,
}
}
-QCString latexEscapeLabelName(const char *s,bool insideTabbing)
+QCString latexEscapeLabelName(const char *s)
{
QGString result;
QCString tmp(qstrlen(s)+1);
@@ -6895,14 +6967,14 @@ QCString latexEscapeLabelName(const char *s,bool insideTabbing)
p++;
}
tmp[i]=0;
- filterLatexString(t,tmp.data(),insideTabbing);
+ filterLatexString(t,tmp,TRUE);
break;
}
}
return result.data();
}
-QCString latexEscapeIndexChars(const char *s,bool insideTabbing)
+QCString latexEscapeIndexChars(const char *s)
{
QGString result;
QCString tmp(qstrlen(s)+1);
@@ -6933,7 +7005,7 @@ QCString latexEscapeIndexChars(const char *s,bool insideTabbing)
p++;
}
tmp[i]=0;
- filterLatexString(t,tmp.data(),insideTabbing);
+ filterLatexString(t,tmp.data(),TRUE);
break;
}
}
@@ -6964,6 +7036,25 @@ QCString latexEscapePDFString(const char *s)
return result.data();
}
+QCString latexFilterURL(const char *s)
+{
+ QGString result;
+ FTextStream t(&result);
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '#': t << "\\#"; break;
+ default:
+ t << c;
+ break;
+ }
+ }
+ return result.data();
+}
+
QCString rtfFormatBmkStr(const char *name)
{
@@ -7174,6 +7265,7 @@ g_lang2extMap[] =
{ "objective-c", "c", SrcLangExt_ObjC },
{ "c", "c", SrcLangExt_Cpp },
{ "c++", "c", SrcLangExt_Cpp },
+ { "slice", "c", SrcLangExt_Slice },
{ "python", "python", SrcLangExt_Python },
{ "fortran", "fortran", SrcLangExt_Fortran },
{ "fortranfree", "fortranfree", SrcLangExt_Fortran },
@@ -7279,6 +7371,7 @@ void initDefaultExtensionMapping()
updateLanguageMapping(".qsf", "vhdl");
updateLanguageMapping(".md", "md");
updateLanguageMapping(".markdown", "md");
+ updateLanguageMapping(".ice", "slice");
}
void addCodeOnlyMappings()
@@ -8312,6 +8405,7 @@ QCString langToString(SrcLangExt lang)
case SrcLangExt_SQL: return "SQL";
case SrcLangExt_Tcl: return "Tcl";
case SrcLangExt_Markdown: return "Markdown";
+ case SrcLangExt_Slice: return "Slice";
}
return "Unknown";
}
@@ -8443,12 +8537,9 @@ bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile)
void addDocCrossReference(MemberDef *src,MemberDef *dst)
{
- static bool referencedByRelation = Config_getBool(REFERENCED_BY_RELATION);
- static bool referencesRelation = Config_getBool(REFERENCES_RELATION);
-
//printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
- if ((referencedByRelation || dst->hasCallerGraph()) &&
+ if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
src->showInCallGraph()
)
{
@@ -8464,7 +8555,7 @@ void addDocCrossReference(MemberDef *src,MemberDef *dst)
mdDecl->addSourceReferencedBy(src);
}
}
- if ((referencesRelation || src->hasCallGraph()) &&
+ if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
src->showInCallGraph()
)
{
@@ -8551,7 +8642,7 @@ uint getUtf8CodeToUpper( const QCString& s, int idx )
//--------------------------------------------------------------------------------------
-bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses)
+bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses,bool filterClasses,ClassDef::CompoundType ct)
{
if (nd->getNamespaceSDict())
{
@@ -8563,21 +8654,41 @@ bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses)
{
return TRUE;
}
- else if (namespaceHasVisibleChild(cnd,includeClasses))
+ else if (namespaceHasVisibleChild(cnd,includeClasses,filterClasses,ct))
{
return TRUE;
}
}
}
- if (includeClasses && nd->getClassSDict())
+ if (includeClasses)
{
- ClassSDict::Iterator cli(*nd->getClassSDict());
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ ClassSDict *d = nd->getClassSDict();
+ if (filterClasses)
{
- if (cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- return TRUE;
+ if (ct == ClassDef::Interface)
+ {
+ d = nd->getInterfaceSDict();
+ }
+ else if (ct == ClassDef::Struct)
+ {
+ d = nd->getStructSDict();
+ }
+ else if (ct == ClassDef::Exception)
+ {
+ d = nd->getExceptionSDict();
+ }
+ }
+
+ if (d)
+ {
+ ClassSDict::Iterator cli(*d);
+ ClassDef *cd;
+ for (;(cd=cli.current());++cli)
+ {
+ if (cd->isLinkableInProject() && cd->templateMaster()==0)
+ {
+ return TRUE;
+ }
}
}
}
diff --git a/src/util.h b/src/util.h
index a9eee67..3305332 100644
--- a/src/util.h
+++ b/src/util.h
@@ -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.
*
@@ -18,7 +18,7 @@
#ifndef UTIL_H
#define UTIL_H
-/*! \file
+/*! \file
* \brief A bunch of utility functions.
*/
@@ -26,6 +26,8 @@
#include <ctype.h>
#include "types.h"
#include "sortdict.h"
+#include "docparser.h"
+#include "classdef.h"
//--------------------------------------------------------------------
@@ -69,7 +71,7 @@ class TextGeneratorIntf
virtual void writeBreak(int indent) const = 0;
virtual void writeLink(const char *extRef,const char *file,
const char *anchor,const char *text
- ) const = 0;
+ ) const = 0;
};
/** Implements TextGeneratorIntf for an OutputDocInterface stream. */
@@ -138,11 +140,11 @@ QCString fileToString(const char *name,bool filter=FALSE,bool isSourceCode=FALSE
QCString dateToString(bool);
bool getDefs(const QCString &scopeName,
- const QCString &memberName,
- const char *,
- MemberDef *&md,
+ const QCString &memberName,
+ const char *,
+ MemberDef *&md,
ClassDef *&cd,
- FileDef *&fd,
+ FileDef *&fd,
NamespaceDef *&nd,
GroupDef *&gd,
bool forceEmptyScope=FALSE,
@@ -260,7 +262,7 @@ void initClassHierarchy(ClassSDict *cl);
bool hasVisibleRoot(BaseClassList *bcl);
bool classHasVisibleChildren(ClassDef *cd);
-bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses);
+bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses,bool filterClasses,ClassDef::CompoundType ct);
bool classVisibleInIndex(ClassDef *cd);
int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level=0);
@@ -284,6 +286,8 @@ QCString convertToLaTeX(const QCString &s,bool insideTabbing=FALSE,bool keepSpac
QCString convertToXML(const char *s);
+QCString convertToDocBook(const char *s);
+
QCString convertToJSString(const char *s, bool applyTextDir = true);
QCString getOverloadDocs();
@@ -343,9 +347,10 @@ void filterLatexString(FTextStream &t,const char *str,
bool insideItem=FALSE,
bool keepSpaces=FALSE);
-QCString latexEscapeLabelName(const char *s,bool insideTabbing);
-QCString latexEscapeIndexChars(const char *s,bool insideTabbing);
+QCString latexEscapeLabelName(const char *s);
+QCString latexEscapeIndexChars(const char *s);
QCString latexEscapePDFString(const char *s);
+QCString latexFilterURL(const char *s);
QCString rtfFormatBmkStr(const char *name);
@@ -389,7 +394,7 @@ SrcLangExt getLanguageFromFileName(const QCString& fileName);
void initDefaultExtensionMapping();
void addCodeOnlyMappings();
-MemberDef *getMemberFromSymbol(Definition *scope,FileDef *fileScope,
+MemberDef *getMemberFromSymbol(Definition *scope,FileDef *fileScope,
const char *n);
bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n);
@@ -485,4 +490,3 @@ void incUsedTableLevels();
void decUsedTableLevels();
#endif
-
diff --git a/src/vhdlcode.l b/src/vhdlcode.l
index 68dcafb..aa15183 100644
--- a/src/vhdlcode.l
+++ b/src/vhdlcode.l
@@ -370,7 +370,7 @@ static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE,b
//g_code->codify(sp);
if (comment)
{
- writeFont("keyword",line.data());
+ writeFont("comment",line.data());
}
else
{
@@ -381,7 +381,7 @@ static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE,b
else
{
if (comment)
- writeFont("keyword",sp);
+ writeFont("comment",sp);
else
writeWord(sp,cl,classlink);
done=TRUE;
@@ -1478,11 +1478,11 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI
writeFont("keyword",vhdlcodeYYtext);
}
-<Bases>^{B}*{XILINX}[^\n]* {
- writeWord(yytext);
- //codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
- }
-
+<Bases>^{B}*{XILINX}/[^a-zA-Z0-9_] {
+ writeWord(yytext);
+ //codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
+ }
+
<Bases>^{B}*"set_"[^\n]* {
writeWord(yytext);
}
@@ -1497,37 +1497,38 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI
}
<*>\n{TEXTT} { // found normal or special comment on its own line
- QCString text(vhdlcodeYYtext);
- int i=text.find("--");
- if (text.mid(i,3)=="--!" && // hide special comment
- Config_getBool(STRIP_CODE_COMMENTS))
- {
- g_yyLineNr++; // skip complete line
- }
- else // normal comment
- {
- // startFontClass("keyword");
- codifyLines(text,0,FALSE,TRUE);
- // endFontClass();
- }
+ QCString text(vhdlcodeYYtext);
+ int i=text.find("--");
+ if (text.mid(i,3)=="--!") // && // hide special comment
+ {
+ if (!Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ codifyLines(text,0,FALSE,TRUE);
+ }
+ else g_yyLineNr++; // skip complete line, but count line
+ }
+ else // normal comment
+ {
+ codifyLines(text,0,FALSE,TRUE);
+ }
}
<*>{TEXTT} { // found normal or special comment after something
- QCString text(vhdlcodeYYtext);
- int i=text.find("--");
- if (text.mid(i,3)=="--!" &&
- Config_getBool(STRIP_CODE_COMMENTS))
- {
- // hide special comment
- }
- else // normal comment
- {
- // startFontClass("keyword");
- codifyLines(text,0,FALSE,TRUE);
- // endFontClass();
- }
+ QCString text(vhdlcodeYYtext);
+ int i=text.find("--");
+ if (text.mid(i,3)=="--!")
+ {
+ // hide special comment
+ if (!Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ codifyLines(text,0,FALSE,TRUE);
+ }
+ }
+ else // normal comment
+ {
+ codifyLines(text,0,FALSE,TRUE);
+ }
}
-
%%
/*@ ----------------------------------------------------------------------------
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
index a8d6968..c34f0b8 100644
--- a/src/vhdldocgen.cpp
+++ b/src/vhdldocgen.cpp
@@ -602,7 +602,7 @@ const char* g_vhdlKeyWordMap1[] =
{
"natural","unsigned","signed","string","boolean", "bit","bit_vector","character",
"std_ulogic","std_ulogic_vector","std_logic","std_logic_vector","integer",
- "real","float","ufixed","sfixed","time",0
+ "real","float","ufixed","sfixed","time","positive",0
};
// logic
@@ -667,7 +667,7 @@ const char* g_vhdlKeyWordMap3[] =
QCString* VhdlDocGen::findKeyWord(const QCString& tmp)
{
static QCString vhdlkeyword("vhdlkeyword");
- static QCString vhdltype("comment");
+ static QCString vhdltype("keywordtype");
static QCString vhdllogic("vhdllogic");
static QCString preprocessor("keywordflow");
@@ -2329,7 +2329,7 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
if (title)
{
- ol.startMemberHeader(title,type == VhdlDocGen::PORT ? 3 : 2);
+ ol.startMemberHeader(convertToId(title),type == VhdlDocGen::PORT ? 3 : 2);
ol.parseText(title);
ol.endMemberHeader();
ol.docify(" ");
@@ -2466,8 +2466,8 @@ void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
if (cname.isEmpty()) return;
mdef->writeSourceDef(ol,cname);
- mdef->writeSourceRefs(ol,cname);
- mdef->writeSourceReffedBy(ol,cname);
+ if (mdef->hasReferencesRelation()) mdef->writeSourceRefs(ol,cname);
+ if (mdef->hasReferencedByRelation()) mdef->writeSourceReffedBy(ol,cname);
}
@@ -2990,7 +2990,8 @@ ferr:
Public, Normal, cur->stat,Member,
MemberType_Variable,
0,
- 0);
+ 0,
+ "");
if (ar->getOutputFileBase())
{
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
index 7c31687..a65695c 100644
--- a/src/xmldocvisitor.cpp
+++ b/src/xmldocvisitor.cpp
@@ -31,6 +31,7 @@
#include "filename.h"
#include "config.h"
#include "htmlentity.h"
+#include "emoji.h"
static void visitCaption(XmlDocVisitor *parent, QList<DocNode> children)
{
@@ -39,10 +40,10 @@ static void visitCaption(XmlDocVisitor *parent, QList<DocNode> children)
for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
}
-static void visitPreStart(FTextStream &t, const char *cmd, const bool doCaption,
+static void visitPreStart(FTextStream &t, const char *cmd, bool doCaption,
XmlDocVisitor *parent, QList<DocNode> children,
const QCString &name, bool writeType, DocImage::Type type, const QCString &width,
- const QCString &height)
+ const QCString &height, bool inlineImage = FALSE)
{
t << "<" << cmd;
if (writeType)
@@ -65,10 +66,11 @@ static void visitPreStart(FTextStream &t, const char *cmd, const bool doCaption,
{
t << " width=\"" << convertToXML(width) << "\"";
}
- else if (!height.isEmpty())
+ if (!height.isEmpty())
{
t << " height=\"" << convertToXML(height) << "\"";
}
+ if (inlineImage) t << " inline=\"yes\">";
if (doCaption)
{
t << " caption=\"";
@@ -133,6 +135,24 @@ void XmlDocVisitor::visit(DocSymbol *s)
}
}
+void XmlDocVisitor::visit(DocEmoji *s)
+{
+ if (m_hide) return;
+ const char *res = EmojiEntityMapper::instance()->name(s->index());
+ if (res)
+ {
+ QCString name=res;
+ name = name.mid(1,name.length()-2);
+ m_t << "<emoji name=\"" << name << "\" unicode=\"";
+ filter(EmojiEntityMapper::instance()->unicode(s->index()));
+ m_t << "\"/>";
+ }
+ else
+ {
+ m_t << s->name();
+ }
+}
+
void XmlDocVisitor::visit(DocURL *u)
{
if (m_hide) return;
@@ -313,7 +333,14 @@ void XmlDocVisitor::visit(DocInclude *inc)
case DocInclude::DontInclude:
break;
case DocInclude::HtmlInclude:
- m_t << "<htmlonly>";
+ if (inc->isBlock())
+ {
+ m_t << "<htmlonly block=\"yes\">";
+ }
+ else
+ {
+ m_t << "<htmlonly>";
+ }
filter(inc->text());
m_t << "</htmlonly>";
break;
@@ -494,7 +521,7 @@ void XmlDocVisitor::visitPre(DocPara *)
void XmlDocVisitor::visitPost(DocPara *)
{
if (m_hide) return;
- m_t << "</para>";
+ m_t << "</para>" << endl;
}
void XmlDocVisitor::visitPre(DocRoot *)
@@ -773,7 +800,7 @@ void XmlDocVisitor::visitPre(DocImage *img)
{
baseName=baseName.right(baseName.length()-i-1);
}
- visitPreStart(m_t, "image", FALSE, this, img->children(), baseName, TRUE, img->type(), img->width(), img->height());
+ visitPreStart(m_t, "image", FALSE, this, img->children(), baseName, TRUE, img->type(), img->width(), img->height(), img ->isInlineImage());
// copy the image to the output dir
FileDef *fd;
diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h
index c65688f..c2c6537 100644
--- a/src/xmldocvisitor.h
+++ b/src/xmldocvisitor.h
@@ -41,6 +41,7 @@ class XmlDocVisitor : public DocVisitor
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
void visit(DocSymbol *);
+ void visit(DocEmoji *);
void visit(DocURL *);
void visit(DocLineBreak *);
void visit(DocHorRuler *);
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index e68c454..4b12757 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -97,6 +97,8 @@ class XmlSectionMapper : public QIntDict<char>
insert(MemberListType_decDefineMembers,"define");
insert(MemberListType_decProtoMembers,"prototype");
insert(MemberListType_decTypedefMembers,"typedef");
+ insert(MemberListType_decSequenceMembers,"sequence");
+ insert(MemberListType_decDictionaryMembers,"dictionary");
insert(MemberListType_decEnumMembers,"enum");
insert(MemberListType_decFuncMembers,"func");
insert(MemberListType_decVarMembers,"var");
@@ -222,146 +224,117 @@ class TextGeneratorXMLImpl : public TextGeneratorIntf
/** Generator for producing XML formatted source code. */
-class XMLCodeGenerator : public CodeOutputInterface
+void XMLCodeGenerator::codify(const char *text)
{
- public:
-
- XMLCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1), m_isMemberRef(FALSE), m_col(0),
- m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE), m_insideSpecialHL(FALSE) {}
- virtual ~XMLCodeGenerator() { }
-
- void codify(const char *text)
- {
- XML_DB(("(codify \"%s\")\n",text));
- if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
- {
- m_t << "<highlight class=\"normal\">";
- m_normalHLNeedStartTag=FALSE;
- }
- writeXMLCodeString(m_t,text,m_col);
- }
- void writeCodeLink(const char *ref,const char *file,
- const char *anchor,const char *name,
- const char *tooltip)
- {
- XML_DB(("(writeCodeLink)\n"));
- if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
- {
- m_t << "<highlight class=\"normal\">";
- m_normalHLNeedStartTag=FALSE;
- }
- writeXMLLink(m_t,ref,file,anchor,name,tooltip);
- m_col+=qstrlen(name);
- }
- void writeTooltip(const char *, const DocLinkInfo &, const char *,
- const char *, const SourceLinkInfo &, const SourceLinkInfo &
- )
- {
- XML_DB(("(writeToolTip)\n"));
- }
- void startCodeLine(bool)
- {
- XML_DB(("(startCodeLine)\n"));
- m_t << "<codeline";
- if (m_lineNumber!=-1)
- {
- m_t << " lineno=\"" << m_lineNumber << "\"";
- if (!m_refId.isEmpty())
- {
- m_t << " refid=\"" << m_refId << "\"";
- if (m_isMemberRef)
- {
- m_t << " refkind=\"member\"";
- }
- else
- {
- m_t << " refkind=\"compound\"";
- }
- }
- if (!m_external.isEmpty())
- {
- m_t << " external=\"" << m_external << "\"";
- }
- }
- m_t << ">";
- m_insideCodeLine=TRUE;
- m_col=0;
- }
- void endCodeLine()
- {
- XML_DB(("(endCodeLine)\n"));
- if (!m_insideSpecialHL && !m_normalHLNeedStartTag)
- {
- m_t << "</highlight>";
- m_normalHLNeedStartTag=TRUE;
- }
- m_t << "</codeline>" << endl; // non DocBook
- m_lineNumber = -1;
- m_refId.resize(0);
- m_external.resize(0);
- m_insideCodeLine=FALSE;
- }
- void startFontClass(const char *colorClass)
+ XML_DB(("(codify \"%s\")\n",text));
+ if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
+ {
+ m_t << "<highlight class=\"normal\">";
+ m_normalHLNeedStartTag=FALSE;
+ }
+ writeXMLCodeString(m_t,text,m_col);
+}
+void XMLCodeGenerator::writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip)
+{
+ XML_DB(("(writeCodeLink)\n"));
+ if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
+ {
+ m_t << "<highlight class=\"normal\">";
+ m_normalHLNeedStartTag=FALSE;
+ }
+ writeXMLLink(m_t,ref,file,anchor,name,tooltip);
+ m_col+=qstrlen(name);
+}
+void XMLCodeGenerator::writeTooltip(const char *, const DocLinkInfo &, const char *,
+ const char *, const SourceLinkInfo &, const SourceLinkInfo &
+ )
+{
+ XML_DB(("(writeToolTip)\n"));
+}
+void XMLCodeGenerator::startCodeLine(bool)
+{
+ XML_DB(("(startCodeLine)\n"));
+ m_t << "<codeline";
+ if (m_lineNumber!=-1)
+ {
+ m_t << " lineno=\"" << m_lineNumber << "\"";
+ if (!m_refId.isEmpty())
{
- XML_DB(("(startFontClass)\n"));
- if (m_insideCodeLine && !m_insideSpecialHL && !m_normalHLNeedStartTag)
+ m_t << " refid=\"" << m_refId << "\"";
+ if (m_isMemberRef)
{
- m_t << "</highlight>";
- m_normalHLNeedStartTag=TRUE;
+ m_t << " refkind=\"member\"";
}
- m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook
- m_insideSpecialHL=TRUE;
- }
- void endFontClass()
- {
- XML_DB(("(endFontClass)\n"));
- m_t << "</highlight>"; // non DocBook
- m_insideSpecialHL=FALSE;
- }
- void writeCodeAnchor(const char *)
- {
- XML_DB(("(writeCodeAnchor)\n"));
- }
- void writeLineNumber(const char *extRef,const char *compId,
- const char *anchorId,int l)
- {
- XML_DB(("(writeLineNumber)\n"));
- // we remember the information provided here to use it
- // at the <codeline> start tag.
- m_lineNumber = l;
- if (compId)
+ else
{
- m_refId=compId;
- if (anchorId) m_refId+=(QCString)"_1"+anchorId;
- m_isMemberRef = anchorId!=0;
- if (extRef) m_external=extRef;
+ m_t << " refkind=\"compound\"";
}
}
- void setCurrentDoc(Definition *,const char *,bool)
- {
- }
- void addWord(const char *,bool)
+ if (!m_external.isEmpty())
{
+ m_t << " external=\"" << m_external << "\"";
}
-
- void finish()
- {
- if (m_insideCodeLine) endCodeLine();
- }
-
- private:
- FTextStream &m_t;
- QCString m_refId;
- QCString m_external;
- int m_lineNumber;
- bool m_isMemberRef;
- int m_col;
-
- bool m_insideCodeLine;
- bool m_normalHLNeedStartTag;
- bool m_insideSpecialHL;
-};
-
+ }
+ m_t << ">";
+ m_insideCodeLine=TRUE;
+ m_col=0;
+}
+void XMLCodeGenerator::endCodeLine()
+{
+ XML_DB(("(endCodeLine)\n"));
+ if (!m_insideSpecialHL && !m_normalHLNeedStartTag)
+ {
+ m_t << "</highlight>";
+ m_normalHLNeedStartTag=TRUE;
+ }
+ m_t << "</codeline>" << endl; // non DocBook
+ m_lineNumber = -1;
+ m_refId.resize(0);
+ m_external.resize(0);
+ m_insideCodeLine=FALSE;
+}
+void XMLCodeGenerator::startFontClass(const char *colorClass)
+{
+ XML_DB(("(startFontClass)\n"));
+ if (m_insideCodeLine && !m_insideSpecialHL && !m_normalHLNeedStartTag)
+ {
+ m_t << "</highlight>";
+ m_normalHLNeedStartTag=TRUE;
+ }
+ m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook
+ m_insideSpecialHL=TRUE;
+}
+void XMLCodeGenerator::endFontClass()
+{
+ XML_DB(("(endFontClass)\n"));
+ m_t << "</highlight>"; // non DocBook
+ m_insideSpecialHL=FALSE;
+}
+void XMLCodeGenerator::writeCodeAnchor(const char *)
+{
+ XML_DB(("(writeCodeAnchor)\n"));
+}
+void XMLCodeGenerator::writeLineNumber(const char *extRef,const char *compId,
+ const char *anchorId,int l)
+{
+ XML_DB(("(writeLineNumber)\n"));
+ // we remember the information provided here to use it
+ // at the <codeline> start tag.
+ m_lineNumber = l;
+ if (compId)
+ {
+ m_refId=compId;
+ if (anchorId) m_refId+=(QCString)"_1"+anchorId;
+ m_isMemberRef = anchorId!=0;
+ if (extRef) m_external=extRef;
+ }
+}
+void XMLCodeGenerator::finish()
+{
+ if (m_insideCodeLine) endCodeLine();
+}
static void writeTemplateArgumentList(ArgumentList *al,
FTextStream &t,
@@ -554,20 +527,22 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
bool isFunc=FALSE;
switch (md->memberType())
{
- case MemberType_Define: memType="define"; break;
- case MemberType_Function: memType="function"; isFunc=TRUE; break;
- case MemberType_Variable: memType="variable"; break;
- case MemberType_Typedef: memType="typedef"; break;
- case MemberType_Enumeration: memType="enum"; break;
- case MemberType_EnumValue: ASSERT(0); break;
- case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
- case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
- case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
- case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
- case MemberType_Property: memType="property"; break;
- case MemberType_Event: memType="event"; break;
- case MemberType_Interface: memType="interface"; break;
- case MemberType_Service: memType="service"; break;
+ case MemberType_Define: memType="define"; break;
+ case MemberType_Function: memType="function"; isFunc=TRUE; break;
+ case MemberType_Variable: memType="variable"; break;
+ case MemberType_Typedef: memType="typedef"; break;
+ case MemberType_Enumeration: memType="enum"; break;
+ case MemberType_EnumValue: ASSERT(0); break;
+ case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
+ case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
+ case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
+ case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
+ case MemberType_Property: memType="property"; break;
+ case MemberType_Event: memType="event"; break;
+ case MemberType_Interface: memType="interface"; break;
+ case MemberType_Service: memType="service"; break;
+ case MemberType_Sequence: memType="sequence"; break;
+ case MemberType_Dictionary: memType="dictionary"; break;
}
ti << " <member refid=\"" << memberOutputFileBase(md)
@@ -1163,7 +1138,7 @@ static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
NamespaceDef *nd;
for (nli.toFirst();(nd=nli.current());++nli)
{
- if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
+ if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymous scopes
{
t << " <innernamespace refid=\"" << nd->getOutputFileBase()
<< "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
@@ -1845,7 +1820,7 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
SDict<SectionInfo>::Iterator li(*sectionDict);
SectionInfo *si;
int level=1,l;
- bool inLi[5]={ FALSE, FALSE, FALSE, FALSE };
+ bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE };
int maxLevel = pd->localToc().xmlLevel();
for (li.toFirst();(si=li.current());++li)
{
@@ -1872,16 +1847,16 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
if (l <= maxLevel) t << " </tableofcontents>" << endl;
}
}
- if (l <= maxLevel && inLi[nextLevel]) t << " </tocsect>" << endl;
if (nextLevel <= maxLevel)
{
+ if (inLi[nextLevel]) t << " </tocsect>" << endl;
QCString titleDoc = convertToXML(si->title);
t << " <tocsect>" << endl;
t << " <name>" << (si->title.isEmpty()?si->label:titleDoc) << "</name>" << endl;
t << " <reference>" << convertToXML(pageName) << "_1" << convertToXML(si -> label) << "</reference>" << endl;
+ inLi[nextLevel]=TRUE;
+ level = nextLevel;
}
- inLi[nextLevel]=TRUE;
- level = nextLevel;
}
}
while (level>1 && level <= maxLevel)
diff --git a/src/xmlgen.h b/src/xmlgen.h
index 0447591..0555546 100644
--- a/src/xmlgen.h
+++ b/src/xmlgen.h
@@ -15,6 +15,48 @@
#ifndef XMLGEN_H
#define XMLGEN_H
+#include "outputgen.h"
+
+class XMLCodeGenerator : public CodeOutputInterface
+{
+ public:
+
+ XMLCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1), m_isMemberRef(FALSE), m_col(0),
+ m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE), m_insideSpecialHL(FALSE) {}
+ virtual ~XMLCodeGenerator() { }
+
+ void codify(const char *text);
+ void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip);
+ void writeTooltip(const char *, const DocLinkInfo &, const char *,
+ const char *, const SourceLinkInfo &, const SourceLinkInfo &
+ );
+ void startCodeLine(bool);
+ void endCodeLine();
+ void startFontClass(const char *colorClass);
+ void endFontClass();
+ void writeCodeAnchor(const char *);
+ void writeLineNumber(const char *extRef,const char *compId,
+ const char *anchorId,int l);
+ void setCurrentDoc(Definition *,const char *,bool){}
+ void addWord(const char *,bool){}
+
+ void finish();
+
+ private:
+ FTextStream &m_t;
+ QCString m_refId;
+ QCString m_external;
+ int m_lineNumber;
+ bool m_isMemberRef;
+ int m_col;
+
+ bool m_insideCodeLine;
+ bool m_normalHLNeedStartTag;
+ bool m_insideSpecialHL;
+};
+
void generateXML();
#endif
diff --git a/templates/html/doxygen.css b/templates/html/doxygen.css
index 13d72c9..83e29e5 100644
--- a/templates/html/doxygen.css
+++ b/templates/html/doxygen.css
@@ -80,6 +80,15 @@ p.endtd {
margin-bottom: 2px;
}
+p.interli {
+}
+
+p.interdd {
+}
+
+p.intertd {
+}
+
/* @end */
caption {
@@ -343,7 +352,7 @@ img.formulaDsp {
}
-img.formulaInl {
+img.formulaInl, img.inline {
vertical-align: middle;
}
@@ -692,17 +701,17 @@ dl.reflist dd {
padding-left: 0px;
}
-.params .paramname, .retval .paramname {
+.params .paramname, .retval .paramname, .tparams .paramname {
font-weight: bold;
vertical-align: top;
}
-.params .paramtype {
+.params .paramtype, .tparams .paramtype {
font-style: italic;
vertical-align: top;
}
-.params .paramdir {
+.params .paramdir, .tparams .paramdir {
font-family: "courier new",courier,monospace;
vertical-align: top;
}
diff --git a/templates/html/header.html b/templates/html/header.html
index 338d0be..9527936 100644
--- a/templates/html/header.html
+++ b/templates/html/header.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!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">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
diff --git a/templates/html/htmlbase.tpl b/templates/html/htmlbase.tpl
index e271d3a..47939fd 100644
--- a/templates/html/htmlbase.tpl
+++ b/templates/html/htmlbase.tpl
@@ -1,5 +1,5 @@
{% block header %}
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!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">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
diff --git a/templates/html/htmlsearchresult.tpl b/templates/html/htmlsearchresult.tpl
index b795743..db37a5d 100644
--- a/templates/html/htmlsearchresult.tpl
+++ b/templates/html/htmlsearchresult.tpl
@@ -1,5 +1,5 @@
{# input: baseName #}
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen {{ doxygen.version }}"/>
diff --git a/templates/html/mag.png b/templates/html/mag.png
index 492f71f..858fea5 100644
--- a/templates/html/mag.png
+++ b/templates/html/mag.png
Binary files differ
diff --git a/templates/html/mag_sel.png b/templates/html/mag_sel.png
index 81f6040..39c0ed5 100644
--- a/templates/html/mag_sel.png
+++ b/templates/html/mag_sel.png
Binary files differ
diff --git a/templates/html/search_l.png b/templates/html/search_l.png
index c872f4d..fd5f7da 100644
--- a/templates/html/search_l.png
+++ b/templates/html/search_l.png
Binary files differ
diff --git a/templates/html/search_r.png b/templates/html/search_r.png
index 97ee8b4..1af5d21 100644
--- a/templates/html/search_r.png
+++ b/templates/html/search_r.png
Binary files differ
diff --git a/templates/latex/doxygen.sty b/templates/latex/doxygen.sty
index 4b8c455..cf92712 100644
--- a/templates/latex/doxygen.sty
+++ b/templates/latex/doxygen.sty
@@ -190,6 +190,12 @@
\end{center}%
}
+% Used by @image
+% (only if inline is specified)
+\newenvironment{DoxyInlineImage}{%
+}{%
+}
+
% Used by @attention
\newenvironment{DoxyAttention}[1]{%
\begin{DoxyDesc}{#1}%
diff --git a/templates/xml/compound.xsd b/templates/xml/compound.xsd
index 61da4a7..cf48e03 100644
--- a/templates/xml/compound.xsd
+++ b/templates/xml/compound.xsd
@@ -402,6 +402,7 @@
<xsd:element name="anchor" type="docAnchorType" />
<xsd:element name="formula" type="docFormulaType" />
<xsd:element name="ref" type="docRefTextType" />
+ <xsd:element name="emoji" type="docEmojiType" />
<!-- Automatically insert here the HTML entities -->
</xsd:choice>
</xsd:group>
@@ -643,6 +644,25 @@
<xsd:complexType name="docEmptyType"/>
+ <xsd:complexType name="tableofcontentsType">
+ <xsd:sequence>
+ <xsd:element name="tocsect" type="tableofcontentsKindType" minOccurs="1" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="tableofcontentsKindType">
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="reference" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="tableofcontents" type="tableofcontentsType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docEmojiType">
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="unicode" type="xsd:string"/>
+ </xsd:complexType>
+
<!-- Simple types -->
<xsd:simpleType name="DoxBool">
@@ -881,19 +901,5 @@
</xsd:restriction>
</xsd:simpleType>
- <xsd:complexType name="tableofcontentsType">
- <xsd:sequence>
- <xsd:element name="tocsect" type="tableofcontentsKindType" minOccurs="1" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="tableofcontentsKindType">
- <xsd:sequence>
- <xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <xsd:element name="reference" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <xsd:element name="tableofcontents" type="tableofcontentsType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
</xsd:schema>
diff --git a/testing/005_attention.dox b/testing/005_attention.dox
index c3c390e..90f67f5 100644
--- a/testing/005_attention.dox
+++ b/testing/005_attention.dox
@@ -1,4 +1,4 @@
-// objective: test \attention, \not, \remark, \warning, and \par commands
+// objective: test \attention, \note, \remark, \warning, and \par commands
// check: indexpage.xml
/** \mainpage
* \attention Attention message.
diff --git a/testing/009/bug.xml b/testing/009/bug.xml
index a6dfe88..34a411b 100644
--- a/testing/009/bug.xml
+++ b/testing/009/bug.xml
@@ -9,17 +9,16 @@
<para>
<variablelist>
<varlistentry>
- <term><anchor id="bug_1_bug000001"/>Class <ref refid="class_bug" kindref="compound">Bug</ref></term>
+ <term>Class <ref refid="class_bug" kindref="compound">Bug</ref></term>
</varlistentry>
<listitem>
- <para>Class bug. </para>
+ <para><anchor id="bug_1_bug000001"/>Class bug. </para>
</listitem>
<varlistentry>
- <term><anchor id="bug_1_bug000002"/>Member <ref refid="class_bug_1a1f720954dd97cd1203e80501a6eae74c" kindref="member">Bug::foo</ref> ()</term>
+ <term>Member <ref refid="class_bug_1a1f720954dd97cd1203e80501a6eae74c" kindref="member">Bug::foo</ref> ()</term>
</varlistentry>
<listitem>
- <para>Function bug<itemizedlist><listitem><para>list item 1 in bug</para></listitem><listitem><para>list item 2 in bug</para></listitem></itemizedlist>
-</para>
+ <para><anchor id="bug_1_bug000002"/>Function bug<itemizedlist><listitem><para>list item 1 in bug</para></listitem><listitem><para>list item 2 in bug</para></listitem></itemizedlist></para>
</listitem>
</variablelist>
</para>
diff --git a/testing/009/deprecated.xml b/testing/009/deprecated.xml
index 5db2acd..a787015 100644
--- a/testing/009/deprecated.xml
+++ b/testing/009/deprecated.xml
@@ -9,16 +9,16 @@
<para>
<variablelist>
<varlistentry>
- <term><anchor id="deprecated_1_deprecated000001"/>Class <ref refid="class_deprecated" kindref="compound">Deprecated</ref></term>
+ <term>Class <ref refid="class_deprecated" kindref="compound">Deprecated</ref></term>
</varlistentry>
<listitem>
- <para>This class is deprecated </para>
+ <para><anchor id="deprecated_1_deprecated000001"/>This class is deprecated </para>
</listitem>
<varlistentry>
- <term><anchor id="deprecated_1_deprecated000002"/>Member <ref refid="class_deprecated_1a1d5f6803e72c625727e7083d1722dbf9" kindref="member">Deprecated::deprecated</ref> ()</term>
+ <term>Member <ref refid="class_deprecated_1a1d5f6803e72c625727e7083d1722dbf9" kindref="member">Deprecated::deprecated</ref> ()</term>
</varlistentry>
<listitem>
- <para>No not use this function anymore. </para>
+ <para><anchor id="deprecated_1_deprecated000002"/>No not use this function anymore. </para>
</listitem>
</variablelist>
</para>
diff --git a/testing/009/reminders.xml b/testing/009/reminders.xml
index a5c5560..f848e3c 100644
--- a/testing/009/reminders.xml
+++ b/testing/009/reminders.xml
@@ -9,16 +9,16 @@
<para>
<variablelist>
<varlistentry>
- <term><anchor id="reminders_1_reminders000001"/>Class <ref refid="class_reminder" kindref="compound">Reminder</ref></term>
+ <term>Class <ref refid="class_reminder" kindref="compound">Reminder</ref></term>
</varlistentry>
<listitem>
- <para>A reminder </para>
+ <para><anchor id="reminders_1_reminders000001"/>A reminder </para>
</listitem>
<varlistentry>
- <term><anchor id="reminders_1_reminders000002"/>Member <ref refid="class_reminder_1a173b5218bb11287b0e86a550d9f0728d" kindref="member">Reminder::reminder</ref> ()</term>
+ <term>Member <ref refid="class_reminder_1a173b5218bb11287b0e86a550d9f0728d" kindref="member">Reminder::reminder</ref> ()</term>
</varlistentry>
<listitem>
- <para>Need to rework this before the next release. </para>
+ <para><anchor id="reminders_1_reminders000002"/>Need to rework this before the next release. </para>
</listitem>
</variablelist>
</para>
diff --git a/testing/009/test.xml b/testing/009/test.xml
index e206440..828316d 100644
--- a/testing/009/test.xml
+++ b/testing/009/test.xml
@@ -9,16 +9,16 @@
<para>
<variablelist>
<varlistentry>
- <term><anchor id="test_1_test000001"/>Class <ref refid="class_test" kindref="compound">Test</ref></term>
+ <term>Class <ref refid="class_test" kindref="compound">Test</ref></term>
</varlistentry>
<listitem>
- <para>This is part of testing </para>
+ <para><anchor id="test_1_test000001"/>This is part of testing </para>
</listitem>
<varlistentry>
- <term><anchor id="test_1_test000002"/>Member <ref refid="class_test_1a9fc54b716f326514a4c5f434137f4fc0" kindref="member">Test::test</ref> ()</term>
+ <term>Member <ref refid="class_test_1a9fc54b716f326514a4c5f434137f4fc0" kindref="member">Test::test</ref> ()</term>
</varlistentry>
<listitem>
- <para>more things to test. </para>
+ <para><anchor id="test_1_test000002"/>more things to test. </para>
</listitem>
</variablelist>
</para>
diff --git a/testing/009/todo.xml b/testing/009/todo.xml
index 88d050e..394f07d 100644
--- a/testing/009/todo.xml
+++ b/testing/009/todo.xml
@@ -9,16 +9,16 @@
<para>
<variablelist>
<varlistentry>
- <term><anchor id="todo_1_todo000001"/>Class <ref refid="class_todo" kindref="compound">Todo</ref></term>
+ <term>Class <ref refid="class_todo" kindref="compound">Todo</ref></term>
</varlistentry>
<listitem>
- <para>This still needs to be done. </para>
+ <para><anchor id="todo_1_todo000001"/>This still needs to be done. </para>
</listitem>
<varlistentry>
- <term><anchor id="todo_1_todo000002"/>Member <ref refid="class_todo_1a9e70ec9176ac4c1b20e011b4daddc9d8" kindref="member">Todo::todo</ref> ()</term>
+ <term>Member <ref refid="class_todo_1a9e70ec9176ac4c1b20e011b4daddc9d8" kindref="member">Todo::todo</ref> ()</term>
</varlistentry>
<listitem>
- <para>more things to do here </para>
+ <para><anchor id="todo_1_todo000002"/>more things to do here </para>
</listitem>
</variablelist>
</para>
diff --git a/testing/012/citelist.xml b/testing/012/citelist.xml
index 96b94a3..f415968 100644
--- a/testing/012/citelist.xml
+++ b/testing/012/citelist.xml
@@ -9,7 +9,7 @@
<para>
<variablelist>
<varlistentry>
- <term><anchor id="_1CITEREF_knuth79"/>[1]</term>
+ <term><anchor id="citelist_1CITEREF_knuth79"/>[1]</term>
</varlistentry>
<listitem>
<para>Donald<nonbreakablespace/>E. Knuth. <emphasis>Tex and Metafont, New Directions in Typesetting</emphasis>. American Mathematical Society and Digital Press, Stanford, 1979.</para>
diff --git a/testing/030/indexpage.xml b/testing/030/indexpage.xml
index 6731890..a45eb8d 100644
--- a/testing/030/indexpage.xml
+++ b/testing/030/indexpage.xml
@@ -6,7 +6,7 @@
<briefdescription>
</briefdescription>
<detaileddescription>
- <para>Some text. <htmlonly>&lt;h1&gt;Hello world&lt;/h1&gt;
+ <para>Some text. <htmlonly block="yes">&lt;h1&gt;Hello world&lt;/h1&gt;
</htmlonly> More text. </para>
</detaileddescription>
</compounddef>
diff --git a/testing/030_htmlinclude.dox b/testing/030_htmlinclude.dox
index a8e8af6..17d934d 100644
--- a/testing/030_htmlinclude.dox
+++ b/testing/030_htmlinclude.dox
@@ -2,6 +2,6 @@
// check: indexpage.xml
/** \mainpage
* Some text.
- * \htmlinclude sample.html
+ * \htmlinclude[block] sample.html
* More text.
*/
diff --git a/testing/031/indexpage.xml b/testing/031/indexpage.xml
index 3b3a2e3..2c1dfd7 100644
--- a/testing/031/indexpage.xml
+++ b/testing/031/indexpage.xml
@@ -8,6 +8,7 @@
<detaileddescription>
<para>Some text. <image type="html" name="sample.png"/>
<image type="latex" name="sample.png" width="5cm">Doxygen logo</image>
+ <image type="docbook" name="sample.png"/>
More text. </para>
</detaileddescription>
</compounddef>
diff --git a/testing/031_image.dox b/testing/031_image.dox
index f437086..8ba47b7 100644
--- a/testing/031_image.dox
+++ b/testing/031_image.dox
@@ -5,5 +5,6 @@
* Some text.
* \image html sample.png
* \image latex sample.png "Doxygen logo" width=5cm
+ * \image docbook sample.png
* More text.
*/
diff --git a/testing/043_page.dox b/testing/043_page.dox
index d554da2..9ac5c0e 100644
--- a/testing/043_page.dox
+++ b/testing/043_page.dox
@@ -4,7 +4,7 @@
/** \page mypage Page Title
* \brief Page brief description.
*
- * @tableofcontents{xml,html,latex}
+ * @tableofcontents{xml,html,latex,docbook}
*
* Text at page level. See \ref mysect for more.
* \section mysect Section Title.
diff --git a/testing/051/indexpage.xml b/testing/051/indexpage.xml
index 776f525..50a6ff8 100644
--- a/testing/051/indexpage.xml
+++ b/testing/051/indexpage.xml
@@ -6,7 +6,7 @@
<briefdescription>
</briefdescription>
<detaileddescription>
- <para>Dollar $ At @ Backslash \ Amphasand &amp; Less &lt; Greater &gt; Hash # Percent % Quote " Dot . Double colon :: Pipe | Plus + Minus - </para>
+ <para>Dollar $ At @ Backslash \ Ampersand &amp; Less &lt; Greater &gt; Hash # Percent % Quote " Dot . Double colon :: Pipe | Plus + Minus - </para>
</detaileddescription>
</compounddef>
</doxygen>
diff --git a/testing/051_escape.dox b/testing/051_escape.dox
index 290b298..2165564 100644
--- a/testing/051_escape.dox
+++ b/testing/051_escape.dox
@@ -5,7 +5,7 @@
Dollar \$
At \@
Backslash \\
-Amphasand \&
+Ampersand \&
Less \<
Greater \>
Hash \#
diff --git a/testing/074/struct_foo.xml b/testing/074/struct_foo.xml
new file mode 100644
index 0000000..56a497a
--- /dev/null
+++ b/testing/074/struct_foo.xml
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+ <compounddef id="struct_foo" kind="struct" language="C++" prot="public">
+ <compoundname>Foo</compoundname>
+ <sectiondef kind="public-func">
+ <memberdef kind="function" id="struct_foo_1a5c036d1b3561a0e1beffe8c6799a4276" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>Foo::Foo</definition>
+ <argsstring>()</argsstring>
+ <name>Foo</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>Constructor </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="16" column="1"/>
+ </memberdef>
+ <memberdef kind="function" id="struct_foo_1a279debd94d894223fa8468933e2d6188" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type><ref refid="struct_foo" kindref="compound">Foo</ref> &amp;</type>
+ <definition>Foo&amp; Foo::operator&lt;&lt;</definition>
+ <argsstring>(int i)</argsstring>
+ <name>operator&lt;&lt;</name>
+ <param>
+ <type>int</type>
+ <declname>i</declname>
+ </param>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>overloaded less than operator </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="27" column="1"/>
+ </memberdef>
+ <memberdef kind="function" id="struct_foo_1a48bcc3de9b2f1ad09a3518a0c9f0da61" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+ <type>const <ref refid="struct_foo" kindref="compound">Foo</ref> &amp;</type>
+ <definition>const Foo&amp; Foo::operator&lt;&lt;</definition>
+ <argsstring>(int i) const</argsstring>
+ <name>operator&lt;&lt;</name>
+ <param>
+ <type>int</type>
+ <declname>i</declname>
+ </param>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>overloaded const less than operator </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="30" column="1"/>
+ </memberdef>
+ <memberdef kind="function" id="struct_foo_1a3a41dcf8c53f777d50676ea28400a640" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>int</type>
+ <definition>int Foo::operator()</definition>
+ <argsstring>(int i)</argsstring>
+ <name>operator()</name>
+ <param>
+ <type>int</type>
+ <declname>i</declname>
+ </param>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>overloaded call operator </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="33" column="1"/>
+ </memberdef>
+ <memberdef kind="function" id="struct_foo_1ae3c9c1f33cdb8b932c6eb104660a262b" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+ <type>int</type>
+ <definition>int Foo::operator()</definition>
+ <argsstring>(int i) const</argsstring>
+ <name>operator()</name>
+ <param>
+ <type>int</type>
+ <declname>i</declname>
+ </param>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>overloaded call operator </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="36" column="1"/>
+ </memberdef>
+ <memberdef kind="function" id="struct_foo_1aa20bd44b1bb87a652ac65170ddfa1a5a" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type><ref refid="struct_foo" kindref="compound">Foo</ref> &amp;</type>
+ <definition>Foo&amp; Foo::operator&amp;=</definition>
+ <argsstring>(const Foo &amp;rhs)</argsstring>
+ <name>operator&amp;=</name>
+ <param>
+ <type>const <ref refid="struct_foo" kindref="compound">Foo</ref> &amp;</type>
+ <declname>rhs</declname>
+ </param>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>and equal operator </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="39" column="1"/>
+ </memberdef>
+ <memberdef kind="function" id="struct_foo_1aa20bd44b1bb87a652ac65170ddfa1a5a" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type><ref refid="struct_foo" kindref="compound">Foo</ref> &amp;</type>
+ <definition>Foo&amp; Foo::operator&amp;=</definition>
+ <argsstring>(const Foo &amp;rhs)</argsstring>
+ <name>operator&amp;=</name>
+ <param>
+ <type>const <ref refid="struct_foo" kindref="compound">Foo</ref> &amp;</type>
+ <declname>rhs</declname>
+ </param>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>and equal operator </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="42" column="1"/>
+ </memberdef>
+ <memberdef kind="function" id="struct_foo_1a0514e1f5b30cbf77e1c39d7aba308656" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>int *</type>
+ <definition>int* Foo::operator-&gt;*</definition>
+ <argsstring>(int *p)</argsstring>
+ <name>operator-&gt;*</name>
+ <param>
+ <type>int *</type>
+ <declname>p</declname>
+ </param>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>Member pointer operator </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="45" column="1"/>
+ </memberdef>
+ <memberdef kind="function" id="struct_foo_1a978acd73e910ce56cc169ebec8736669" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
+ <type>
+ <ref refid="struct_foo" kindref="compound">Foo</ref>
+ </type>
+ <definition>Foo Foo::fun</definition>
+ <argsstring>() const</argsstring>
+ <name>fun</name>
+ <briefdescription>
+ <para>Fun with itself. </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="48" column="1"/>
+ </memberdef>
+ </sectiondef>
+ <sectiondef kind="public-static-func">
+ <memberdef kind="function" id="struct_foo_1abdf64a71706807b0f946265902c530ee" prot="public" static="yes" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>
+ <ref refid="struct_foo" kindref="compound">Foo</ref>
+ </type>
+ <definition>static Foo Foo::fun</definition>
+ <argsstring>(Foo a, Foo b)</argsstring>
+ <name>fun</name>
+ <param>
+ <type>
+ <ref refid="struct_foo" kindref="compound">Foo</ref>
+ </type>
+ <declname>a</declname>
+ </param>
+ <param>
+ <type>
+ <ref refid="struct_foo" kindref="compound">Foo</ref>
+ </type>
+ <declname>b</declname>
+ </param>
+ <briefdescription>
+ <para>Fun of two. </para>
+ </briefdescription>
+ <detaileddescription>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <ref refid="struct_foo_1a978acd73e910ce56cc169ebec8736669" kindref="member">fun() const</ref>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <ref refid="struct_foo_1a978acd73e910ce56cc169ebec8736669" kindref="member">fun() const</ref>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <ref refid="struct_foo_1a978acd73e910ce56cc169ebec8736669" kindref="member">title</ref>
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="074_ref.cpp" line="24" column="1"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ <para><ref refid="struct_foo" kindref="compound">Foo</ref> class. </para>
+ </briefdescription>
+ <detaileddescription>
+ <para>
+ <simplesect kind="see">
+ <para><ref refid="struct_foo_1a5c036d1b3561a0e1beffe8c6799a4276" kindref="member">Foo::Foo()</ref> constructor for details. </para>
+ </simplesect>
+ <simplesect kind="see">
+ <para><ref refid="struct_foo" kindref="compound">Foo</ref> constant. </para>
+ </simplesect>
+ <simplesect kind="see">
+ <para><ref refid="struct_foo_1a279debd94d894223fa8468933e2d6188" kindref="member">less than operator</ref>. </para>
+ </simplesect>
+ <simplesect kind="see">
+ <para><ref refid="struct_foo_1a48bcc3de9b2f1ad09a3518a0c9f0da61" kindref="member">const less than operator</ref>. </para>
+ </simplesect>
+ <simplesect kind="see">
+ <para><ref refid="struct_foo_1a3a41dcf8c53f777d50676ea28400a640" kindref="member">call operator</ref>. </para>
+ </simplesect>
+ <simplesect kind="see">
+ <para><ref refid="struct_foo_1ae3c9c1f33cdb8b932c6eb104660a262b" kindref="member">const call operator</ref>. </para>
+ </simplesect>
+ <simplesect kind="see">
+ <para><ref refid="struct_foo_1aa20bd44b1bb87a652ac65170ddfa1a5a" kindref="member">and equal operator</ref>. </para>
+ </simplesect>
+ <simplesect kind="see">
+ <para><ref refid="struct_foo_1a0514e1f5b30cbf77e1c39d7aba308656" kindref="member">member pointer operator</ref>. </para>
+ </simplesect>
+ </para>
+ </detaileddescription>
+ <location file="074_ref.cpp" line="14" column="1" bodyfile="074_ref.cpp" bodystart="14" bodyend="49"/>
+ <listofallmembers>
+ <member refid="struct_foo_1a5c036d1b3561a0e1beffe8c6799a4276" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>Foo</name>
+ </member>
+ <member refid="struct_foo_1abdf64a71706807b0f946265902c530ee" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>fun</name>
+ </member>
+ <member refid="struct_foo_1a978acd73e910ce56cc169ebec8736669" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>fun</name>
+ </member>
+ <member refid="struct_foo_1aa20bd44b1bb87a652ac65170ddfa1a5a" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>operator&amp;=</name>
+ </member>
+ <member refid="struct_foo_1aa20bd44b1bb87a652ac65170ddfa1a5a" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>operator&amp;=</name>
+ </member>
+ <member refid="struct_foo_1a3a41dcf8c53f777d50676ea28400a640" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>operator()</name>
+ </member>
+ <member refid="struct_foo_1ae3c9c1f33cdb8b932c6eb104660a262b" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>operator()</name>
+ </member>
+ <member refid="struct_foo_1a0514e1f5b30cbf77e1c39d7aba308656" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>operator-&gt;*</name>
+ </member>
+ <member refid="struct_foo_1a279debd94d894223fa8468933e2d6188" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>operator&lt;&lt;</name>
+ </member>
+ <member refid="struct_foo_1a48bcc3de9b2f1ad09a3518a0c9f0da61" prot="public" virt="non-virtual">
+ <scope>Foo</scope>
+ <name>operator&lt;&lt;</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
diff --git a/testing/074_ref.cpp b/testing/074_ref.cpp
new file mode 100644
index 0000000..141e2b4
--- /dev/null
+++ b/testing/074_ref.cpp
@@ -0,0 +1,49 @@
+// objective: test \ref command in combination with const
+// check: struct_foo.xml
+/** @brief Foo class.
+ *
+ * @see @ref Foo::Foo() constructor for details.
+ * @see @ref Foo constant.
+ * @see @ref operator<<(int) "less than operator".
+ * @see @ref operator<<(int) const "const less than operator".
+ * @see @ref operator()(int) "call operator".
+ * @see @ref operator()(int) const "const call operator".
+ * @see @ref operator&=(const Foo&) "and equal operator".
+ * @see @ref operator->*(int *) "member pointer operator".
+ */
+struct Foo {
+ /** Constructor */
+ Foo();
+ /**
+ * @brief Fun of two
+ *
+ * - fun() const
+ * - @ref fun() const
+ * - @ref fun() const "title"
+ */
+ static Foo fun(Foo a, Foo b);
+
+ /** overloaded less than operator */
+ Foo& operator<< (int i);
+
+ /** overloaded const less than operator */
+ const Foo& operator<< (int i) const;
+
+ /** overloaded call operator */
+ int operator()(int i);
+
+ /** overloaded call operator */
+ int operator()(int i) const;
+
+ /** and equal operator */
+ Foo& operator&=(const Foo& rhs);
+
+ /** and equal operator */
+ Foo& operator&=(const Foo& rhs);
+
+ /** Member pointer operator */
+ int* operator->*(int *p);
+
+ /** @brief Fun with itself */
+ Foo fun() const;
+};
diff --git a/testing/README.txt b/testing/README.txt
index a5a0ad9..39b2345 100644
--- a/testing/README.txt
+++ b/testing/README.txt
@@ -1,4 +1,4 @@
-Doxygen regession test suite
+Doxygen regression test suite
============================
This directory contains a set of regression tests. Each test consists of a
@@ -7,7 +7,7 @@ has the same 3 digit number. The directory contains one or more reference
files that are compared against the XML output produced by doxygen. If the
result is the same, there is no regression and the test passes. If there is a
difference the test fails and the difference (in diff -u format) will be shown.
-It is also possible to see whether or not the test can be build to a xhtml set
+It is also possible to see whether or not the test can be built to a xhtml set
of files (and tested against a DTD), it is also possible to create a pdf file
for each test to see if the LaTeX / pdf generation is possible.
@@ -17,6 +17,8 @@ optional parameters:
--doxygen [DOXYGEN] path/name of the doxygen executable
--xmllint [XMLLINT] path/name of the xmllint executable
--id IDS [IDS ...] id of the test to perform
+ --start_id START_ID run tests starting with number n
+ --end_id END_ID run tests ending with number n
--all perform all tests
--inputdir [INPUTDIR]
input directory containing the tests
@@ -24,10 +26,15 @@ optional parameters:
output directory to write the doxygen output to
--noredir disable redirection of doxygen warnings
--xml create xml output and check
+ --rtf create rtf output
+ --docbook create docbook output and check with xmllint
--xhtml create xhtml output and check with xmllint
--pdf create LaTeX output and create pdf from it
+ --subdirs use the configuration parameter CREATE_SUBDIRS=YES
--keep keep result directories
-In case neither --xml, --pdf or --xhtml is used the default is set to --xml.
+ --cfg CFGS [CFGS ...] run test with extra doxygen configuration settings
+ (the option may be specified multiple times
+In case neither --xml, --pdf, --rtf, --docbook or --xhtml is used the default is set to --xml.
The runtest.pl has the following dependencies on 3rd party tools:
- python to run the script
@@ -57,4 +64,3 @@ There is also a CMakeLists.txt, which can be used from the build directory
to run all tests by simply invoking 'make tests', to use the specific options use
the flag TEST_FLAGS with make
e.g. make tests TEST_FLAGS="--id=5 --id=10 --pdf --xhtml"
-
diff --git a/testing/dtd/xhtml1-transitional.dtd b/testing/dtd/xhtml1-transitional.dtd
index 628f27a..4ac1571 100755
--- a/testing/dtd/xhtml1-transitional.dtd
+++ b/testing/dtd/xhtml1-transitional.dtd
@@ -20,6 +20,21 @@
$Date: 2002/08/01 18:37:55 $
-->
+<!--
+ Note:
+ This is an adjusted version of the official document only to be used
+ for validation of doxygen generated documents.
+
+ Adjustments:
+ - in
+ <!ATTLIST script
+ added
+ async (async) #IMPLIED
+ - in
+ <!ATTLIST a
+ added
+ doxygen %URI; #IMPLIED
+-->
<!--================ Character mnemonic entities =========================-->
@@ -363,6 +378,7 @@
>
<!-- script statements, which may include CDATA sections -->
+<!-- added for doxygen: async (async) #IMPLIED -->
<!ELEMENT script (#PCDATA)>
<!ATTLIST script
id ID #IMPLIED
@@ -370,6 +386,7 @@
type %ContentType; #REQUIRED
language CDATA #IMPLIED
src %URI; #IMPLIED
+ async (async) #IMPLIED
defer (defer) #IMPLIED
xml:space (preserve) #FIXED 'preserve'
>
@@ -633,6 +650,7 @@
<!--================== The Anchor Element ================================-->
<!-- content is %Inline; except that anchors shouldn't be nested -->
+<!-- added for doxygen: doxygen %URI; #IMPLIED -->
<!ELEMENT a %a.content;>
<!ATTLIST a
@@ -641,6 +659,7 @@
charset %Charset; #IMPLIED
type %ContentType; #IMPLIED
name NMTOKEN #IMPLIED
+ doxygen %URI; #IMPLIED
href %URI; #IMPLIED
hreflang %LanguageCode; #IMPLIED
rel %LinkTypes; #IMPLIED
diff --git a/testing/runtests.py b/testing/runtests.py
index 9330d23..452c36e 100644
--- a/testing/runtests.py
+++ b/testing/runtests.py
@@ -43,6 +43,28 @@ class Tester:
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 open(self.args.inputdir+'/'+self.test,'r') as f:
@@ -53,7 +75,7 @@ class Tester:
value = m.group('value')
if (key=='config'):
value = value.replace('$INPUTDIR',self.args.inputdir)
- #print('key=%s value=%s' % (key,value))
+ # print('key=%s value=%s' % (key,value))
config.setdefault(key, []).append(value)
return config
@@ -74,6 +96,16 @@ class Tester:
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_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.xhtml):
print('GENERATE_HTML=YES', file=f)
# HTML_OUTPUT can also be set locally
@@ -82,6 +114,14 @@ class Tester:
if (self.args.pdf):
print('GENERATE_LATEX=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.cfgs):
+ for cfg in list(itertools.chain.from_iterable(self.args.cfgs)):
+ if cfg.find('=') == -1:
+ print("Not a doxygen configuration item, missing '=' sign: '%s'."%cfg)
+ sys.exit(1)
+ print(cfg, file=f)
if 'check' not in self.config or not self.config['check']:
print('Test doesn\'t specify any files to check')
@@ -97,7 +137,7 @@ class Tester:
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));
+ print('Error: failed to run %s on %s/Doxyfile' % (self.args.doxygen,self.test_out))
sys.exit(1)
# update the reference data for this test
@@ -140,6 +180,8 @@ class Tester:
failed_xml=False
failed_html=False
failed_latex=False
+ failed_docbook=False
+ failed_rtf=False
msg = ()
# look for files to check against the reference
if self.args.xml:
@@ -149,8 +191,14 @@ class Tester:
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):
- msg += ('Non-existing file %s after \'check:\' statement' % check_file,)
- break
+ # 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
data = os.popen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file)).read()
if data:
@@ -171,6 +219,34 @@ class Tester:
xml_output='%s/out' % self.test_out
shutil.rmtree(xml_output,ignore_errors=True)
+ if (self.args.rtf):
+ # no tests defined yet
+ pass
+
+ 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 --nonet --postvalid %s %s' % (self.args.xmllint,tests,redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,docbook_output)
+
+ failed_docbook=False
+ xmllint_out = os.popen(exe_string).read()
+ xmllint_out = self.cleanup_xmllint_docbook(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):
html_output='%s/html' % self.test_out
if (sys.platform == 'win32'):
@@ -206,7 +282,7 @@ class Tester:
elif not self.args.keep:
shutil.rmtree(latex_output,ignore_errors=True)
- if failed_xml or failed_html or failed_latex:
+ if failed_xml or failed_html or failed_latex or failed_docbook or failed_rtf:
testmgr.ok(False,self.test_name,msg)
return
@@ -268,14 +344,18 @@ def main():
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")
+ '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 may be specified run test with '
- 'number n only (the option may be specified')
+ '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")
@@ -287,17 +367,26 @@ def main():
'disable redirection of doxygen warnings',action="store_true")
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('--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('--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 = os.getenv('TEST_FLAGS', default='').split()
args = parser.parse_args(test_flags + sys.argv[1:])
# sanity check
- if (not args.xml) and (not args.pdf) and (not args.xhtml):
+ if (not args.xml) and (not args.pdf) and (not args.xhtml) and (not args.docbook and (not args.rtf)):
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')
@@ -305,15 +394,26 @@ def main():
starting_directory = os.getcwd()
os.chdir(args.inputdir)
# find the tests to run
- if args.ids: # test ids are given by user
- tests = []
+ 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))
- tests = list(itertools.chain.from_iterable(tests))
- else: # find all tests
+ if (not args.ids and not args.start_id): # find all tests
tests = 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
diff --git a/testing/sample.png b/testing/sample.png
index 3ff17d8..5c9f51f 100644
--- a/testing/sample.png
+++ b/testing/sample.png
Binary files differ